Initial commit - from Precise source
authorAlex Bligh <alex@alex.org.uk>
Fri, 14 Sep 2012 11:11:27 +0000 (12:11 +0100)
committerAlex Bligh <alex@alex.org.uk>
Fri, 14 Sep 2012 11:11:27 +0000 (12:11 +0100)
524 files changed:
.gitignore [new file with mode: 0644]
.pc/.quilt_patches [new file with mode: 0644]
.pc/.quilt_series [new file with mode: 0644]
.pc/.version [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
LICENSE [new file with mode: 0644]
README [new file with mode: 0644]
channels/CMakeLists.txt [new file with mode: 0644]
channels/cliprdr/CMakeLists.txt [new file with mode: 0644]
channels/cliprdr/cliprdr_constants.h [new file with mode: 0644]
channels/cliprdr/cliprdr_format.c [new file with mode: 0644]
channels/cliprdr/cliprdr_format.h [new file with mode: 0644]
channels/cliprdr/cliprdr_main.c [new file with mode: 0644]
channels/cliprdr/cliprdr_main.h [new file with mode: 0644]
channels/drdynvc/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/audin/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/audin/alsa/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/audin/alsa/audin_alsa.c [new file with mode: 0644]
channels/drdynvc/audin/audin_main.c [new file with mode: 0644]
channels/drdynvc/audin/audin_main.h [new file with mode: 0644]
channels/drdynvc/audin/pulse/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/audin/pulse/audin_pulse.c [new file with mode: 0644]
channels/drdynvc/drdynvc_main.c [new file with mode: 0644]
channels/drdynvc/drdynvc_main.h [new file with mode: 0644]
channels/drdynvc/drdynvc_types.h [new file with mode: 0644]
channels/drdynvc/dvcman.c [new file with mode: 0644]
channels/drdynvc/dvcman.h [new file with mode: 0644]
channels/drdynvc/tsmf/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/tsmf/alsa/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/tsmf/alsa/tsmf_alsa.c [new file with mode: 0644]
channels/drdynvc/tsmf/ffmpeg/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c [new file with mode: 0644]
channels/drdynvc/tsmf/pulse/CMakeLists.txt [new file with mode: 0644]
channels/drdynvc/tsmf/pulse/tsmf_pulse.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_audio.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_audio.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_codec.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_codec.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_constants.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_decoder.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_decoder.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_ifman.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_ifman.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_main.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_main.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_media.c [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_media.h [new file with mode: 0644]
channels/drdynvc/tsmf/tsmf_types.h [new file with mode: 0644]
channels/rail/CMakeLists.txt [new file with mode: 0644]
channels/rail/rail_main.c [new file with mode: 0644]
channels/rail/rail_main.h [new file with mode: 0644]
channels/rail/rail_orders.c [new file with mode: 0644]
channels/rail/rail_orders.h [new file with mode: 0644]
channels/rdpdbg/CMakeLists.txt [new file with mode: 0644]
channels/rdpdbg/rdpdbg_main.c [new file with mode: 0644]
channels/rdpdr/CMakeLists.txt [new file with mode: 0644]
channels/rdpdr/devman.c [new file with mode: 0644]
channels/rdpdr/devman.h [new file with mode: 0644]
channels/rdpdr/disk/CMakeLists.txt [new file with mode: 0644]
channels/rdpdr/disk/disk_file.c [new file with mode: 0644]
channels/rdpdr/disk/disk_file.h [new file with mode: 0644]
channels/rdpdr/disk/disk_main.c [new file with mode: 0644]
channels/rdpdr/irp.c [new file with mode: 0644]
channels/rdpdr/irp.h [new file with mode: 0644]
channels/rdpdr/parallel/CMakeLists.txt [new file with mode: 0644]
channels/rdpdr/parallel/parallel_main.c [new file with mode: 0644]
channels/rdpdr/printer/CMakeLists.txt [new file with mode: 0644]
channels/rdpdr/printer/printer_cups.c [new file with mode: 0644]
channels/rdpdr/printer/printer_cups.h [new file with mode: 0644]
channels/rdpdr/printer/printer_main.c [new file with mode: 0644]
channels/rdpdr/printer/printer_main.h [new file with mode: 0644]
channels/rdpdr/rdpdr_capabilities.c [new file with mode: 0644]
channels/rdpdr/rdpdr_capabilities.h [new file with mode: 0644]
channels/rdpdr/rdpdr_constants.h [new file with mode: 0644]
channels/rdpdr/rdpdr_main.c [new file with mode: 0644]
channels/rdpdr/rdpdr_main.h [new file with mode: 0644]
channels/rdpdr/rdpdr_types.h [new file with mode: 0644]
channels/rdpdr/serial/CMakeLists.txt [new file with mode: 0644]
channels/rdpdr/serial/serial_constants.h [new file with mode: 0644]
channels/rdpdr/serial/serial_main.c [new file with mode: 0644]
channels/rdpdr/serial/serial_tty.c [new file with mode: 0644]
channels/rdpdr/serial/serial_tty.h [new file with mode: 0644]
channels/rdpdr/smartcard/CMakeLists.txt [new file with mode: 0644]
channels/rdpdr/smartcard/scard_main.c [new file with mode: 0644]
channels/rdpdr/smartcard/scard_main.h [new file with mode: 0644]
channels/rdpdr/smartcard/scard_operations.c [new file with mode: 0644]
channels/rdpsnd/CMakeLists.txt [new file with mode: 0644]
channels/rdpsnd/alsa/CMakeLists.txt [new file with mode: 0644]
channels/rdpsnd/alsa/rdpsnd_alsa.c [new file with mode: 0644]
channels/rdpsnd/pulse/CMakeLists.txt [new file with mode: 0644]
channels/rdpsnd/pulse/rdpsnd_pulse.c [new file with mode: 0644]
channels/rdpsnd/rdpsnd_main.c [new file with mode: 0644]
channels/rdpsnd/rdpsnd_main.h [new file with mode: 0644]
client/CMakeLists.txt [new file with mode: 0644]
client/DirectFB/CMakeLists.txt [new file with mode: 0644]
client/DirectFB/df_event.c [new file with mode: 0644]
client/DirectFB/df_event.h [new file with mode: 0644]
client/DirectFB/df_graphics.c [new file with mode: 0644]
client/DirectFB/df_graphics.h [new file with mode: 0644]
client/DirectFB/dfreerdp.c [new file with mode: 0644]
client/DirectFB/dfreerdp.h [new file with mode: 0644]
client/Windows/CMakeLists.txt [new file with mode: 0644]
client/Windows/wf_event.c [new file with mode: 0644]
client/Windows/wf_event.h [new file with mode: 0644]
client/Windows/wf_gdi.c [new file with mode: 0644]
client/Windows/wf_gdi.h [new file with mode: 0644]
client/Windows/wf_graphics.c [new file with mode: 0644]
client/Windows/wf_graphics.h [new file with mode: 0644]
client/Windows/wfreerdp.c [new file with mode: 0644]
client/Windows/wfreerdp.h [new file with mode: 0644]
client/X11/CMakeLists.txt [new file with mode: 0644]
client/X11/xf_cliprdr.c [new file with mode: 0644]
client/X11/xf_cliprdr.h [new file with mode: 0644]
client/X11/xf_event.c [new file with mode: 0644]
client/X11/xf_event.h [new file with mode: 0644]
client/X11/xf_gdi.c [new file with mode: 0644]
client/X11/xf_gdi.h [new file with mode: 0644]
client/X11/xf_graphics.c [new file with mode: 0644]
client/X11/xf_graphics.h [new file with mode: 0644]
client/X11/xf_keyboard.c [new file with mode: 0644]
client/X11/xf_keyboard.h [new file with mode: 0644]
client/X11/xf_monitor.c [new file with mode: 0644]
client/X11/xf_monitor.h [new file with mode: 0644]
client/X11/xf_rail.c [new file with mode: 0644]
client/X11/xf_rail.h [new file with mode: 0644]
client/X11/xf_tsmf.c [new file with mode: 0644]
client/X11/xf_tsmf.h [new file with mode: 0644]
client/X11/xf_window.c [new file with mode: 0644]
client/X11/xf_window.h [new file with mode: 0644]
client/X11/xfreerdp.1.xml [new file with mode: 0644]
client/X11/xfreerdp.c [new file with mode: 0644]
client/X11/xfreerdp.h [new file with mode: 0644]
client/test/CMakeLists.txt [new file with mode: 0644]
client/test/freerdp.c [new file with mode: 0644]
cmake/AutoVersioning.cmake [new file with mode: 0644]
cmake/ConfigOptions.cmake [new file with mode: 0644]
cmake/FindCUnit.cmake [new file with mode: 0644]
cmake/FindDirectFB.cmake [new file with mode: 0644]
cmake/FindFFmpeg.cmake [new file with mode: 0644]
cmake/FindOptionalPackage.cmake [new file with mode: 0644]
cmake/FindPCSC.cmake [new file with mode: 0644]
cmake/FindPulseAudio.cmake [new file with mode: 0644]
cmake/FindX11.cmake [new file with mode: 0644]
cmake/FindXKBFile.cmake [new file with mode: 0644]
cmake/FindXShm.cmake [new file with mode: 0644]
cmake/FindXTest.cmake [new file with mode: 0644]
cmake/FindXcursor.cmake [new file with mode: 0644]
cmake/FindXdamage.cmake [new file with mode: 0644]
cmake/FindXext.cmake [new file with mode: 0644]
cmake/FindXfixes.cmake [new file with mode: 0644]
cmake/FindXinerama.cmake [new file with mode: 0644]
cmake/FindXmlto.cmake [new file with mode: 0644]
cmake/FindXv.cmake [new file with mode: 0644]
cmake/GNUInstallDirsWrapper.cmake [new file with mode: 0644]
config.h.in [new file with mode: 0644]
cunit/CMakeLists.txt [new file with mode: 0644]
cunit/test_ber.c [new file with mode: 0644]
cunit/test_ber.h [new file with mode: 0644]
cunit/test_bitmap.c [new file with mode: 0644]
cunit/test_bitmap.h [new file with mode: 0644]
cunit/test_channels.c [new file with mode: 0644]
cunit/test_channels.h [new file with mode: 0644]
cunit/test_cliprdr.c [new file with mode: 0644]
cunit/test_cliprdr.h [new file with mode: 0644]
cunit/test_color.c [new file with mode: 0644]
cunit/test_color.h [new file with mode: 0644]
cunit/test_drdynvc.c [new file with mode: 0644]
cunit/test_drdynvc.h [new file with mode: 0644]
cunit/test_freerdp.c [new file with mode: 0644]
cunit/test_freerdp.h [new file with mode: 0644]
cunit/test_gcc.c [new file with mode: 0644]
cunit/test_gcc.h [new file with mode: 0644]
cunit/test_libgdi.c [new file with mode: 0644]
cunit/test_libgdi.h [new file with mode: 0644]
cunit/test_librfx.c [new file with mode: 0644]
cunit/test_librfx.h [new file with mode: 0644]
cunit/test_license.c [new file with mode: 0644]
cunit/test_license.h [new file with mode: 0644]
cunit/test_list.c [new file with mode: 0644]
cunit/test_list.h [new file with mode: 0644]
cunit/test_mcs.c [new file with mode: 0644]
cunit/test_mcs.h [new file with mode: 0644]
cunit/test_mppc.c [new file with mode: 0644]
cunit/test_mppc.h [new file with mode: 0644]
cunit/test_orders.c [new file with mode: 0644]
cunit/test_orders.h [new file with mode: 0644]
cunit/test_pcap.c [new file with mode: 0644]
cunit/test_pcap.h [new file with mode: 0644]
cunit/test_per.c [new file with mode: 0644]
cunit/test_per.h [new file with mode: 0644]
cunit/test_rail.c [new file with mode: 0644]
cunit/test_rail.h [new file with mode: 0644]
cunit/test_stream.c [new file with mode: 0644]
cunit/test_stream.h [new file with mode: 0644]
cunit/test_utils.c [new file with mode: 0644]
cunit/test_utils.h [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/freerdp-x11.install [new file with mode: 0644]
debian/libfreerdp-dev.install [new file with mode: 0644]
debian/libfreerdp-plugins-standard.install [new file with mode: 0644]
debian/libfreerdp1.install [new file with mode: 0644]
debian/libfreerdp1.symbols [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/source/format [new file with mode: 0644]
debian/watch [new file with mode: 0644]
docs/Doxyfile [new file with mode: 0644]
docs/FreeRDP.vsd [new file with mode: 0644]
freerdp.pc.in [new file with mode: 0644]
freerdp.spec [new file with mode: 0644]
include/CMakeLists.txt [new file with mode: 0644]
include/freerdp/altsec.h [new file with mode: 0644]
include/freerdp/api.h [new file with mode: 0644]
include/freerdp/cache/bitmap.h [new file with mode: 0644]
include/freerdp/cache/brush.h [new file with mode: 0644]
include/freerdp/cache/cache.h [new file with mode: 0644]
include/freerdp/cache/glyph.h [new file with mode: 0644]
include/freerdp/cache/offscreen.h [new file with mode: 0644]
include/freerdp/cache/palette.h [new file with mode: 0644]
include/freerdp/cache/pointer.h [new file with mode: 0644]
include/freerdp/channels/channels.h [new file with mode: 0644]
include/freerdp/channels/wtsvc.h [new file with mode: 0644]
include/freerdp/codec/bitmap.h [new file with mode: 0644]
include/freerdp/codec/color.h [new file with mode: 0644]
include/freerdp/codec/nsc.h [new file with mode: 0644]
include/freerdp/codec/rfx.h [new file with mode: 0644]
include/freerdp/constants.h [new file with mode: 0644]
include/freerdp/dvc.h [new file with mode: 0644]
include/freerdp/extension.h [new file with mode: 0644]
include/freerdp/freerdp.h [new file with mode: 0644]
include/freerdp/gdi/16bpp.h [new file with mode: 0644]
include/freerdp/gdi/32bpp.h [new file with mode: 0644]
include/freerdp/gdi/8bpp.h [new file with mode: 0644]
include/freerdp/gdi/bitmap.h [new file with mode: 0644]
include/freerdp/gdi/brush.h [new file with mode: 0644]
include/freerdp/gdi/clipping.h [new file with mode: 0644]
include/freerdp/gdi/dc.h [new file with mode: 0644]
include/freerdp/gdi/drawing.h [new file with mode: 0644]
include/freerdp/gdi/gdi.h [new file with mode: 0644]
include/freerdp/gdi/line.h [new file with mode: 0644]
include/freerdp/gdi/palette.h [new file with mode: 0644]
include/freerdp/gdi/pen.h [new file with mode: 0644]
include/freerdp/gdi/region.h [new file with mode: 0644]
include/freerdp/gdi/shape.h [new file with mode: 0644]
include/freerdp/graphics.h [new file with mode: 0644]
include/freerdp/input.h [new file with mode: 0644]
include/freerdp/kbd/kbd.h [new file with mode: 0644]
include/freerdp/kbd/layouts.h [new file with mode: 0644]
include/freerdp/kbd/locales.h [new file with mode: 0644]
include/freerdp/kbd/vkcodes.h [new file with mode: 0644]
include/freerdp/listener.h [new file with mode: 0644]
include/freerdp/peer.h [new file with mode: 0644]
include/freerdp/plugins/cliprdr.h [new file with mode: 0644]
include/freerdp/plugins/tsmf.h [new file with mode: 0644]
include/freerdp/pointer.h [new file with mode: 0644]
include/freerdp/primary.h [new file with mode: 0644]
include/freerdp/rail.h [new file with mode: 0644]
include/freerdp/rail/icon.h [new file with mode: 0644]
include/freerdp/rail/rail.h [new file with mode: 0644]
include/freerdp/rail/window.h [new file with mode: 0644]
include/freerdp/rail/window_list.h [new file with mode: 0644]
include/freerdp/secondary.h [new file with mode: 0644]
include/freerdp/settings.h [new file with mode: 0644]
include/freerdp/svc.h [new file with mode: 0644]
include/freerdp/types.h [new file with mode: 0644]
include/freerdp/update.h [new file with mode: 0644]
include/freerdp/utils/args.h [new file with mode: 0644]
include/freerdp/utils/bitmap.h [new file with mode: 0644]
include/freerdp/utils/blob.h [new file with mode: 0644]
include/freerdp/utils/debug.h [new file with mode: 0644]
include/freerdp/utils/dsp.h [new file with mode: 0644]
include/freerdp/utils/event.h [new file with mode: 0644]
include/freerdp/utils/file.h [new file with mode: 0644]
include/freerdp/utils/hexdump.h [new file with mode: 0644]
include/freerdp/utils/list.h [new file with mode: 0644]
include/freerdp/utils/load_plugin.h [new file with mode: 0644]
include/freerdp/utils/memory.h [new file with mode: 0644]
include/freerdp/utils/mutex.h [new file with mode: 0644]
include/freerdp/utils/passphrase.h [new file with mode: 0644]
include/freerdp/utils/pcap.h [new file with mode: 0644]
include/freerdp/utils/print.h [new file with mode: 0644]
include/freerdp/utils/profiler.h [new file with mode: 0644]
include/freerdp/utils/rail.h [new file with mode: 0644]
include/freerdp/utils/rect.h [new file with mode: 0644]
include/freerdp/utils/registry.h [new file with mode: 0644]
include/freerdp/utils/semaphore.h [new file with mode: 0644]
include/freerdp/utils/signal.h [new file with mode: 0644]
include/freerdp/utils/sleep.h [new file with mode: 0644]
include/freerdp/utils/stopwatch.h [new file with mode: 0644]
include/freerdp/utils/stream.h [new file with mode: 0644]
include/freerdp/utils/string.h [new file with mode: 0644]
include/freerdp/utils/svc_plugin.h [new file with mode: 0644]
include/freerdp/utils/thread.h [new file with mode: 0644]
include/freerdp/utils/unicode.h [new file with mode: 0644]
include/freerdp/utils/wait_obj.h [new file with mode: 0644]
include/freerdp/window.h [new file with mode: 0644]
keymaps/CMakeLists.txt [new file with mode: 0644]
keymaps/aliases [new file with mode: 0644]
keymaps/amiga [new file with mode: 0644]
keymaps/ataritt [new file with mode: 0644]
keymaps/digital_vndr/lk [new file with mode: 0644]
keymaps/digital_vndr/pc [new file with mode: 0644]
keymaps/empty [new file with mode: 0644]
keymaps/evdev [new file with mode: 0644]
keymaps/fujitsu [new file with mode: 0644]
keymaps/hp [new file with mode: 0644]
keymaps/ibm [new file with mode: 0644]
keymaps/macintosh [new file with mode: 0644]
keymaps/macosx [new file with mode: 0644]
keymaps/sgi_vndr/indigo [new file with mode: 0644]
keymaps/sgi_vndr/indy [new file with mode: 0644]
keymaps/sgi_vndr/iris [new file with mode: 0644]
keymaps/sony [new file with mode: 0644]
keymaps/sun [new file with mode: 0644]
keymaps/xfree86 [new file with mode: 0644]
keymaps/xfree98 [new file with mode: 0644]
keymaps/xkb.pl [new file with mode: 0755]
libfreerdp-cache/CMakeLists.txt [new file with mode: 0644]
libfreerdp-cache/bitmap.c [new file with mode: 0644]
libfreerdp-cache/brush.c [new file with mode: 0644]
libfreerdp-cache/cache.c [new file with mode: 0644]
libfreerdp-cache/glyph.c [new file with mode: 0644]
libfreerdp-cache/offscreen.c [new file with mode: 0644]
libfreerdp-cache/palette.c [new file with mode: 0644]
libfreerdp-cache/pointer.c [new file with mode: 0644]
libfreerdp-channels/CMakeLists.txt [new file with mode: 0644]
libfreerdp-channels/libchannels.c [new file with mode: 0644]
libfreerdp-channels/libchannels.h [new file with mode: 0644]
libfreerdp-channels/wtsvc.c [new file with mode: 0644]
libfreerdp-channels/wtsvc.h [new file with mode: 0644]
libfreerdp-codec/CMakeLists.txt [new file with mode: 0644]
libfreerdp-codec/bitmap.c [new file with mode: 0644]
libfreerdp-codec/color.c [new file with mode: 0644]
libfreerdp-codec/include/bitmap.c [new file with mode: 0644]
libfreerdp-codec/nsc.c [new file with mode: 0644]
libfreerdp-codec/rfx.c [new file with mode: 0644]
libfreerdp-codec/rfx_bitstream.h [new file with mode: 0644]
libfreerdp-codec/rfx_constants.h [new file with mode: 0644]
libfreerdp-codec/rfx_decode.c [new file with mode: 0644]
libfreerdp-codec/rfx_decode.h [new file with mode: 0644]
libfreerdp-codec/rfx_differential.c [new file with mode: 0644]
libfreerdp-codec/rfx_differential.h [new file with mode: 0644]
libfreerdp-codec/rfx_dwt.c [new file with mode: 0644]
libfreerdp-codec/rfx_dwt.h [new file with mode: 0644]
libfreerdp-codec/rfx_encode.c [new file with mode: 0644]
libfreerdp-codec/rfx_encode.h [new file with mode: 0644]
libfreerdp-codec/rfx_neon.c [new file with mode: 0644]
libfreerdp-codec/rfx_neon.h [new file with mode: 0644]
libfreerdp-codec/rfx_pool.c [new file with mode: 0644]
libfreerdp-codec/rfx_pool.h [new file with mode: 0644]
libfreerdp-codec/rfx_quantization.c [new file with mode: 0644]
libfreerdp-codec/rfx_quantization.h [new file with mode: 0644]
libfreerdp-codec/rfx_rlgr.c [new file with mode: 0644]
libfreerdp-codec/rfx_rlgr.h [new file with mode: 0644]
libfreerdp-codec/rfx_sse2.c [new file with mode: 0644]
libfreerdp-codec/rfx_sse2.h [new file with mode: 0644]
libfreerdp-codec/rfx_types.h [new file with mode: 0644]
libfreerdp-core/CMakeLists.txt [new file with mode: 0644]
libfreerdp-core/activation.c [new file with mode: 0644]
libfreerdp-core/activation.h [new file with mode: 0644]
libfreerdp-core/ber.c [new file with mode: 0644]
libfreerdp-core/ber.h [new file with mode: 0644]
libfreerdp-core/capabilities.c [new file with mode: 0644]
libfreerdp-core/capabilities.h [new file with mode: 0644]
libfreerdp-core/certificate.c [new file with mode: 0644]
libfreerdp-core/certificate.h [new file with mode: 0644]
libfreerdp-core/channel.c [new file with mode: 0644]
libfreerdp-core/channel.h [new file with mode: 0644]
libfreerdp-core/connection.c [new file with mode: 0644]
libfreerdp-core/connection.h [new file with mode: 0644]
libfreerdp-core/credssp.c [new file with mode: 0644]
libfreerdp-core/credssp.h [new file with mode: 0644]
libfreerdp-core/crypto.c [new file with mode: 0644]
libfreerdp-core/crypto.h [new file with mode: 0644]
libfreerdp-core/errinfo.c [new file with mode: 0644]
libfreerdp-core/errinfo.h [new file with mode: 0644]
libfreerdp-core/extension.c [new file with mode: 0644]
libfreerdp-core/extension.h [new file with mode: 0644]
libfreerdp-core/fastpath.c [new file with mode: 0644]
libfreerdp-core/fastpath.h [new file with mode: 0644]
libfreerdp-core/freerdp.c [new file with mode: 0644]
libfreerdp-core/gcc.c [new file with mode: 0644]
libfreerdp-core/gcc.h [new file with mode: 0644]
libfreerdp-core/graphics.c [new file with mode: 0644]
libfreerdp-core/info.c [new file with mode: 0644]
libfreerdp-core/info.h [new file with mode: 0644]
libfreerdp-core/input.c [new file with mode: 0644]
libfreerdp-core/input.h [new file with mode: 0644]
libfreerdp-core/license.c [new file with mode: 0644]
libfreerdp-core/license.h [new file with mode: 0644]
libfreerdp-core/listener.c [new file with mode: 0644]
libfreerdp-core/listener.h [new file with mode: 0644]
libfreerdp-core/mcs.c [new file with mode: 0644]
libfreerdp-core/mcs.h [new file with mode: 0644]
libfreerdp-core/mppc.c [new file with mode: 0644]
libfreerdp-core/mppc.h [new file with mode: 0644]
libfreerdp-core/nego.c [new file with mode: 0644]
libfreerdp-core/nego.h [new file with mode: 0644]
libfreerdp-core/ntlmssp.c [new file with mode: 0644]
libfreerdp-core/ntlmssp.h [new file with mode: 0644]
libfreerdp-core/orders.c [new file with mode: 0644]
libfreerdp-core/orders.h [new file with mode: 0644]
libfreerdp-core/peer.c [new file with mode: 0644]
libfreerdp-core/peer.h [new file with mode: 0644]
libfreerdp-core/per.c [new file with mode: 0644]
libfreerdp-core/per.h [new file with mode: 0644]
libfreerdp-core/rdp.c [new file with mode: 0644]
libfreerdp-core/rdp.h [new file with mode: 0644]
libfreerdp-core/redirection.c [new file with mode: 0644]
libfreerdp-core/redirection.h [new file with mode: 0644]
libfreerdp-core/security.c [new file with mode: 0644]
libfreerdp-core/security.h [new file with mode: 0644]
libfreerdp-core/settings.c [new file with mode: 0644]
libfreerdp-core/surface.c [new file with mode: 0644]
libfreerdp-core/surface.h [new file with mode: 0644]
libfreerdp-core/tcp.c [new file with mode: 0644]
libfreerdp-core/tcp.h [new file with mode: 0644]
libfreerdp-core/tls.c [new file with mode: 0644]
libfreerdp-core/tls.h [new file with mode: 0644]
libfreerdp-core/tpdu.c [new file with mode: 0644]
libfreerdp-core/tpdu.h [new file with mode: 0644]
libfreerdp-core/tpkt.c [new file with mode: 0644]
libfreerdp-core/tpkt.h [new file with mode: 0644]
libfreerdp-core/transport.c [new file with mode: 0644]
libfreerdp-core/transport.h [new file with mode: 0644]
libfreerdp-core/update.c [new file with mode: 0644]
libfreerdp-core/update.h [new file with mode: 0644]
libfreerdp-core/window.c [new file with mode: 0644]
libfreerdp-core/window.h [new file with mode: 0644]
libfreerdp-gdi/16bpp.c [new file with mode: 0644]
libfreerdp-gdi/32bpp.c [new file with mode: 0644]
libfreerdp-gdi/8bpp.c [new file with mode: 0644]
libfreerdp-gdi/CMakeLists.txt [new file with mode: 0644]
libfreerdp-gdi/bitmap.c [new file with mode: 0644]
libfreerdp-gdi/brush.c [new file with mode: 0644]
libfreerdp-gdi/clipping.c [new file with mode: 0644]
libfreerdp-gdi/dc.c [new file with mode: 0644]
libfreerdp-gdi/drawing.c [new file with mode: 0644]
libfreerdp-gdi/gdi.c [new file with mode: 0644]
libfreerdp-gdi/gdi.h [new file with mode: 0644]
libfreerdp-gdi/graphics.c [new file with mode: 0644]
libfreerdp-gdi/graphics.h [new file with mode: 0644]
libfreerdp-gdi/include/line.c [new file with mode: 0644]
libfreerdp-gdi/line.c [new file with mode: 0644]
libfreerdp-gdi/palette.c [new file with mode: 0644]
libfreerdp-gdi/pen.c [new file with mode: 0644]
libfreerdp-gdi/region.c [new file with mode: 0644]
libfreerdp-gdi/shape.c [new file with mode: 0644]
libfreerdp-kbd/CMakeLists.txt [new file with mode: 0644]
libfreerdp-kbd/layouts.c [new file with mode: 0644]
libfreerdp-kbd/layouts_xkb.c [new file with mode: 0644]
libfreerdp-kbd/layouts_xkb.h [new file with mode: 0644]
libfreerdp-kbd/libkbd.c [new file with mode: 0644]
libfreerdp-kbd/libkbd.h [new file with mode: 0644]
libfreerdp-kbd/locales.c [new file with mode: 0644]
libfreerdp-kbd/x_layout_id_table.c [new file with mode: 0644]
libfreerdp-kbd/x_layout_id_table.h [new file with mode: 0644]
libfreerdp-rail/CMakeLists.txt [new file with mode: 0644]
libfreerdp-rail/icon.c [new file with mode: 0644]
libfreerdp-rail/librail.h [new file with mode: 0644]
libfreerdp-rail/rail.c [new file with mode: 0644]
libfreerdp-rail/window.c [new file with mode: 0644]
libfreerdp-rail/window_list.c [new file with mode: 0644]
libfreerdp-utils/CMakeLists.txt [new file with mode: 0644]
libfreerdp-utils/args.c [new file with mode: 0644]
libfreerdp-utils/bitmap.c [new file with mode: 0644]
libfreerdp-utils/blob.c [new file with mode: 0644]
libfreerdp-utils/dsp.c [new file with mode: 0644]
libfreerdp-utils/event.c [new file with mode: 0644]
libfreerdp-utils/file.c [new file with mode: 0644]
libfreerdp-utils/hexdump.c [new file with mode: 0644]
libfreerdp-utils/list.c [new file with mode: 0644]
libfreerdp-utils/load_plugin.c [new file with mode: 0644]
libfreerdp-utils/memory.c [new file with mode: 0644]
libfreerdp-utils/mutex.c [new file with mode: 0644]
libfreerdp-utils/passphrase.c [new file with mode: 0644]
libfreerdp-utils/pcap.c [new file with mode: 0644]
libfreerdp-utils/profiler.c [new file with mode: 0644]
libfreerdp-utils/rail.c [new file with mode: 0644]
libfreerdp-utils/rect.c [new file with mode: 0644]
libfreerdp-utils/registry.c [new file with mode: 0644]
libfreerdp-utils/semaphore.c [new file with mode: 0644]
libfreerdp-utils/signal.c [new file with mode: 0644]
libfreerdp-utils/sleep.c [new file with mode: 0644]
libfreerdp-utils/stopwatch.c [new file with mode: 0644]
libfreerdp-utils/stream.c [new file with mode: 0644]
libfreerdp-utils/string.c [new file with mode: 0644]
libfreerdp-utils/svc_plugin.c [new file with mode: 0644]
libfreerdp-utils/thread.c [new file with mode: 0644]
libfreerdp-utils/unicode.c [new file with mode: 0644]
libfreerdp-utils/wait_obj.c [new file with mode: 0644]
resources/FreeRDP-fav.ico [new file with mode: 0644]
resources/FreeRDP.ico [new file with mode: 0644]
resources/FreeRDP_Icon_256px.h [new file with mode: 0644]
resources/FreeRDP_Icon_256px.png [new file with mode: 0644]
resources/FreeRDP_Icon_256px.xpm [new file with mode: 0644]
resources/FreeRDP_Logo_Icon.ai [new file with mode: 0644]
resources/FreeRDP_Logo_Icon.svg [new file with mode: 0644]
resources/FreeRDP_OSX.icns [new file with mode: 0644]
resources/conv_to_ewm_prop.py [new file with mode: 0755]
server/CMakeLists.txt [new file with mode: 0644]
server/X11/CMakeLists.txt [new file with mode: 0644]
server/X11/rfx_test.pcap [new file with mode: 0644]
server/X11/server.crt [new file with mode: 0644]
server/X11/server.key [new file with mode: 0644]
server/X11/xf_encode.c [new file with mode: 0644]
server/X11/xf_encode.h [new file with mode: 0644]
server/X11/xf_event.c [new file with mode: 0644]
server/X11/xf_event.h [new file with mode: 0644]
server/X11/xf_input.c [new file with mode: 0644]
server/X11/xf_input.h [new file with mode: 0644]
server/X11/xf_peer.c [new file with mode: 0644]
server/X11/xf_peer.h [new file with mode: 0644]
server/X11/xfreerdp.c [new file with mode: 0644]
server/X11/xfreerdp.h [new file with mode: 0644]
server/test/CMakeLists.txt [new file with mode: 0644]
server/test/rfx_test.pcap [new file with mode: 0644]
server/test/server.crt [new file with mode: 0644]
server/test/server.key [new file with mode: 0644]
server/test/test_icon.ppm [new file with mode: 0644]
server/test/tfreerdp.c [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..00fb8ed
--- /dev/null
@@ -0,0 +1,49 @@
+# CMake
+CMakeFiles/
+CMakeCache.txt
+config.h
+install_manifest.txt
+CTestTestfile.cmake
+freerdp.pc
+Makefile
+cmake_install.cmake
+CPackConfig.cmake
+CPackSourceConfig.cmake
+
+# Eclipse
+*.project
+*.cproject
+*.settings
+
+# Documentation
+docs/api
+client/X11/xfreerdp.1
+
+# Mac OS X
+.DS_Store
+
+# Windows
+*.vcxproj
+*.vcxproj.*
+*.sdf
+*.sln
+*.suo
+*.opensdf
+ipch
+Debug
+
+# Binaries
+*.a
+*.so
+*.so.*
+*.dylib
+cunit/test_freerdp
+client/X11/xfreerdp
+client/test/freerdp-test
+client/DirectFB/dfreerdp
+server/test/tfreerdp-server
+server/X11/xfreerdp-server
+
+# Other
+*~
+
diff --git a/.pc/.quilt_patches b/.pc/.quilt_patches
new file mode 100644 (file)
index 0000000..6857a8d
--- /dev/null
@@ -0,0 +1 @@
+debian/patches
diff --git a/.pc/.quilt_series b/.pc/.quilt_series
new file mode 100644 (file)
index 0000000..c206706
--- /dev/null
@@ -0,0 +1 @@
+series
diff --git a/.pc/.version b/.pc/.version
new file mode 100644 (file)
index 0000000..0cfbf08
--- /dev/null
@@ -0,0 +1 @@
+2
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5399db7
--- /dev/null
@@ -0,0 +1,187 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cmake_minimum_required(VERSION 2.6)
+project(FreeRDP C)
+set(CMAKE_COLOR_MAKEFILE ON)
+
+# Include cmake modules
+include(CheckIncludeFiles)
+include(CheckLibraryExists)
+include(FindPkgConfig)
+include(TestBigEndian)
+
+# Include our extra modules
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/)
+
+include(AutoVersioning)
+include(ConfigOptions)
+include(FindOptionalPackage)
+include(CheckCCompilerFlag)
+include(GNUInstallDirsWrapper)
+
+# Soname versioning
+set(FREERDP_VERSION_MAJOR "1")
+set(FREERDP_VERSION_MINOR "0")
+set(FREERDP_VERSION_REVISION "1")
+set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}")
+set(FREERDP_VERSION_FULL "${FREERDP_VERSION}.${FREERDP_VERSION_REVISION}")
+
+# Default to release build type
+if(NOT CMAKE_BUILD_TYPE)
+   set(CMAKE_BUILD_TYPE "Release")
+endif()
+
+# build shared libs
+if(NOT BUILD_SHARED_LIBS)
+    set(BUILD_SHARED_LIBS ON)
+endif()
+
+# Compiler-specific flags
+if(CMAKE_COMPILER_IS_GNUCC)
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
+       CHECK_C_COMPILER_FLAG (-Wno-unused-result Wno-unused-result)
+       if(Wno-unused-result)
+               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
+       endif()
+       CHECK_C_COMPILER_FLAG (-Wno-unused-but-set-variable Wno-unused-but-set-variable)
+       if(Wno-unused-but-set-variable)
+               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable")
+       endif()
+       if(CMAKE_BUILD_TYPE STREQUAL "Release")
+               set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG")
+               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
+       endif()
+       if(WITH_SSE2_TARGET)
+               set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2")
+       endif()
+endif()
+
+if(MSVC)
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd /MT")
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /O2 /Ob2")
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_X86_")
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_UNICODE")
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_EXPORTS")
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
+       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN")
+       SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
+       SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})
+endif()
+
+# Include files
+check_include_files(sys/param.h HAVE_SYS_PARAM_H)
+check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
+check_include_files(netdb.h HAVE_NETDB_H)
+check_include_files(fcntl.h HAVE_FCNTL_H)
+check_include_files(unistd.h HAVE_UNISTD_H)
+check_include_files(limits.h HAVE_LIMITS_H)
+check_include_files(stdint.h HAVE_STDINT_H)
+check_include_files(stdbool.h HAVE_STDBOOL_H)
+check_include_files(inttypes.h HAVE_INTTYPES_H)
+
+# Libraries that we have a hard dependency on
+find_required_package(OpenSSL)
+
+# Mac OS X
+if(APPLE)
+       include_directories(/opt/local/include)
+       link_directories(/opt/local/lib)
+       set(CMAKE_SHARED_LINKER_FLAGS "-mmacosx-version-min=10.4")
+endif()
+
+if(NOT WIN32)
+       find_required_package(ZLIB)
+       find_optional_package(PulseAudio)
+       find_optional_package(PCSC)
+       find_suggested_package(Cups)
+
+       if(NOT APPLE)
+               find_suggested_package(FFmpeg)
+               find_suggested_package(ALSA)
+       else(NOT APPLE)
+               find_optional_package(FFmpeg)
+       endif()
+endif()
+
+# Endian
+test_big_endian(BIG_ENDIAN)
+
+# Path to put keymaps
+set(FREERDP_KEYMAP_PATH "${CMAKE_INSTALL_PREFIX}/freerdp/keymaps")
+
+# Path to put plugins
+set(FREERDP_PLUGIN_PATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/freerdp")
+
+# Include directories
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/include)
+
+# Configure files
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
+# Generate pkg-config
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/freerdp.pc.in ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc @ONLY)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freerdp.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+
+# Build CUnit
+find_optional_package(CUnit)
+if(WITH_CUNIT)
+   enable_testing()
+   add_subdirectory(cunit)
+endif()
+
+# Sub-directories
+add_subdirectory(include)
+add_subdirectory(libfreerdp-utils)
+
+if(NOT WIN32)
+       add_subdirectory(libfreerdp-kbd)
+endif()
+
+add_subdirectory(libfreerdp-gdi)
+add_subdirectory(libfreerdp-rail)
+add_subdirectory(libfreerdp-cache)
+add_subdirectory(libfreerdp-codec)
+add_subdirectory(libfreerdp-channels)
+add_subdirectory(libfreerdp-core)
+
+if(NOT WIN32)
+       add_subdirectory(channels)
+endif()
+
+option(WITH_CLIENT "Build client binaries" ON)
+if(WITH_CLIENT)
+       add_subdirectory(client)
+endif()
+
+option(WITH_SERVER "Build server binaries" OFF)
+if(WITH_SERVER)
+       add_subdirectory(server)
+endif()
+
+add_subdirectory(keymaps)
+
+# Source package
+set(CPACK_SOURCE_IGNORE_FILES "/\\\\.git/;/\\\\.gitignore;/CMakeCache.txt")
+
+string(TOLOWER ${CMAKE_PROJECT_NAME} CMAKE_PROJECT_NAME_lower)
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME_lower}-${FREERDP_VERSION_FULL}")
+
+include(CPack)
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..6149261
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,118 @@
+2012-02-07     Version 1.0.1
+
+FreeRDP 1.0.1 is a maintenance release to address a certain number of
+issues found in 1.0.0. This release also brings corrective measures
+to certificate validation which were required for inclusion in Ubuntu.
+
+* Certificate Validation
+       * Improved validation logic and robustness
+       * Added validation of certificate name against hostname
+
+* Token-based Server Redirection
+       * Fixed redirection logic
+       * HAProxy load-balancer support
+
+* xfreerdp-server
+       * better event handling
+       * capture performance improvements
+
+* wfreerdp
+       * Fix RemoteFX support
+       * Fix mingw64 compilation
+
+* libfreerdp-core:
+       * Fix severe TCP sending bug
+       * Added server-side Standard RDP security
+
+2012-01-16     Version 1.0.0
+
+License:
+
+FreeRDP 1.0 is the first release of FreeRDP under the Apache License 2.0.
+The FreeRDP 1.x series is a rewrite, meaning there is no continuity with
+the previous FreeRDP 0.x series which were released under GPLv2.
+
+New Features:
+
+* RemoteFX
+       * Both encoder and decoder
+       * SSE2 and NEON optimization
+* NSCodec
+* RemoteApp
+       * Working, minor glitches
+* Multimedia Redirection
+       * ffmpeg support
+* Network Level Authentication (NLA)
+       * NTLMv2
+* Certificate validation
+* FIPS-compliant RDP security
+* new build system (cmake)
+* added official logo and icon
+
+New Architecture:
+
+* libfreerdp-core
+       * core protocol
+       * highly portable
+       * both client and server
+* libfreerdp-cache
+       * caching operations
+* libfreerdp-codec
+       * bitmap decompression
+       * codec encoding/decoding
+* libfreerdp-kbd
+       * keyboard mapping
+* libfreerdp-channels
+       * virtual channel management
+       * client and server side support
+* libfreerdp-gdi
+       * extensively unit tested
+       * portable software GDI implementation
+* libfreerdp-rail
+       * RemoteApp library
+* libfreerdp-utils
+       * shared utility library
+
+FreeRDP Clients:
+
+* client/X11 (xfreerdp)
+       * official client
+       * RemoteApp support
+       * X11 GDI implementation
+* client/DirectFB (dfreerdp)
+       * DirectFB support
+       * software-based GDI (libfreerdp-gdi)
+* client/Windows (wfreerdp)
+       * Native Win32 support
+
+FreeRDP Servers (experimental):
+
+* server/X11 (xfreerdp-server)
+       * RemoteFX-only
+       * no authentication
+       * highly experimental
+       * keyboard and mouse input supported
+
+Virtual Channels:
+
+* cliprdr (Clipboard Redirection)
+* rail (RemoteApp)
+* drdynvc (Dynamic Virtual Channels)
+       * audin (Audio Input Redirection)
+               * alsa support
+               * pulse support
+       * tsmf (Multimedia Redirection)
+               * alsa support
+               * pulse support
+               * ffmpeg support
+* rdpdr (Device Redirection)
+       * disk (Disk Redirection)
+       * parallel (Parallel Port Redirection)
+       * serial (Serial Port Redirection)
+       * printer (Printer Redirection)
+               * CUPS support
+       * smartcard (Smartcard Redirection)
+* rdpsnd (Sound Redirection)
+       * alsa support
+       * pulse support
+
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..6c67f01
--- /dev/null
+++ b/README
@@ -0,0 +1,34 @@
+FreeRDP: A Remote Desktop Protocol Implementation
+=================================================
+
+FreeRDP is a free implementation of the Remote Desktop Protocol (RDP), released under the Apache license.
+Enjoy the freedom of using your software wherever you want, the way you want it, in a world where
+interoperability can finally liberate your computing experience.
+
+Resources
+---------
+
+Website: http://www.freerdp.com/
+Wiki: https://github.com/FreeRDP/FreeRDP/wiki
+Sources: https://github.com/FreeRDP/FreeRDP/
+API doc: http://www.freerdp.com/api/
+
+IRC channel: #freerdp @ irc.freenode.net
+Mailing list: https://lists.sourceforge.net/lists/listinfo/freerdp-devel
+
+Microsoft Open Specifications
+-----------------------------
+
+Information regarding the Microsoft Open Specifications can be found at:
+http://www.microsoft.com/openspecifications/
+
+A list of reference documentation is maintained here:
+https://github.com/FreeRDP/FreeRDP/wiki/Reference-Documentation
+
+Compilation
+-----------
+
+Instructions on how to get started compiling FreeRDP can be found on the wiki:
+https://github.com/FreeRDP/FreeRDP/wiki/Compilation
+
+
diff --git a/channels/CMakeLists.txt b/channels/CMakeLists.txt
new file mode 100644 (file)
index 0000000..648e2a8
--- /dev/null
@@ -0,0 +1,26 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+add_subdirectory(cliprdr)
+add_subdirectory(drdynvc)
+add_subdirectory(rdpdbg)
+add_subdirectory(rdpdr)
+add_subdirectory(rail)
+add_subdirectory(rdpsnd)
+
diff --git a/channels/cliprdr/CMakeLists.txt b/channels/cliprdr/CMakeLists.txt
new file mode 100644 (file)
index 0000000..03fb0ba
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(CLIPRDR_SRCS
+       cliprdr_constants.h
+       cliprdr_format.c
+       cliprdr_format.h
+       cliprdr_main.c
+       cliprdr_main.h
+)
+
+add_library(cliprdr ${CLIPRDR_SRCS})
+set_target_properties(cliprdr PROPERTIES PREFIX "")
+
+target_link_libraries(cliprdr freerdp-utils)
+
+install(TARGETS cliprdr DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/cliprdr/cliprdr_constants.h b/channels/cliprdr/cliprdr_constants.h
new file mode 100644 (file)
index 0000000..d3544ba
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Clipboard Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CLIPRDR_CONSTANTS
+#define __CLIPRDR_CONSTANTS
+
+/* CLIPRDR_HEADER.msgType */
+#define CB_MONITOR_READY               0x0001
+#define CB_FORMAT_LIST                 0x0002
+#define CB_FORMAT_LIST_RESPONSE                0x0003
+#define CB_FORMAT_DATA_REQUEST         0x0004
+#define CB_FORMAT_DATA_RESPONSE                0x0005
+#define CB_TEMP_DIRECTORY              0x0006
+#define CB_CLIP_CAPS                   0x0007
+#define CB_FILECONTENTS_REQUEST                0x0008
+#define CB_FILECONTENTS_RESPONSE       0x0009
+#define CB_LOCK_CLIPDATA               0x000A
+#define CB_UNLOCK_CLIPDATA             0x000B
+
+/* CLIPRDR_HEADER.msgFlags */
+#define CB_RESPONSE_OK                 0x0001
+#define CB_RESPONSE_FAIL               0x0002
+#define CB_ASCII_NAMES                 0x0004
+
+/* CLIPRDR_CAPS_SET.capabilitySetType */
+#define CB_CAPSTYPE_GENERAL            0x0001
+
+/* CLIPRDR_GENERAL_CAPABILITY.lengthCapability */
+#define CB_CAPSTYPE_GENERAL_LEN                12
+
+/* CLIPRDR_GENERAL_CAPABILITY.version */
+#define CB_CAPS_VERSION_1              0x00000001
+#define CB_CAPS_VERSION_2              0x00000002
+
+/* CLIPRDR_GENERAL_CAPABILITY.generalFlags */
+#define CB_USE_LONG_FORMAT_NAMES       0x00000002
+#define CB_STREAM_FILECLIP_ENABLED     0x00000004
+#define CB_FILECLIP_NO_FILE_PATHS      0x00000008
+#define CB_CAN_LOCK_CLIPDATA           0x00000010
+
+#endif /* __CLIPRDR_CONSTANTS */
diff --git a/channels/cliprdr/cliprdr_format.c b/channels/cliprdr/cliprdr_format.c
new file mode 100644 (file)
index 0000000..19099b0
--- /dev/null
@@ -0,0 +1,354 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Clipboard Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/types.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/plugins/cliprdr.h>
+
+#include "cliprdr_constants.h"
+#include "cliprdr_main.h"
+#include "cliprdr_format.h"
+
+#define CFSTR_HTML      "H\0T\0M\0L\0 \0F\0o\0r\0m\0a\0t\0\0"
+#define CFSTR_PNG       "P\0N\0G\0\0"
+#define CFSTR_JPEG      "J\0F\0I\0F\0\0"
+#define CFSTR_GIF       "G\0I\0F\0\0"
+
+void cliprdr_process_format_list_event(cliprdrPlugin* cliprdr, RDP_CB_FORMAT_LIST_EVENT* cb_event)
+{
+       int i;
+       STREAM* s;
+
+       DEBUG_CLIPRDR("Sending Clipboard Format List");
+
+       if (cb_event->raw_format_data)
+       {
+               s = cliprdr_packet_new(CB_FORMAT_LIST, 0, cb_event->raw_format_data_size);
+               stream_write(s, cb_event->raw_format_data, cb_event->raw_format_data_size);
+       }
+       else
+       {
+               STREAM* body = stream_new(0);
+               
+               for (i = 0; i < cb_event->num_formats; i++)
+               {
+                       const char* name;
+                       int name_length;
+
+                       switch (cb_event->formats[i])
+                       {
+                               case CB_FORMAT_HTML:
+                                       name = CFSTR_HTML; name_length = sizeof(CFSTR_HTML);
+                                       break;
+                               case CB_FORMAT_PNG:
+                                       name = CFSTR_PNG; name_length = sizeof(CFSTR_PNG);
+                                       break;
+                               case CB_FORMAT_JPEG:
+                                       name = CFSTR_JPEG; name_length = sizeof(CFSTR_JPEG);
+                                       break;
+                               case CB_FORMAT_GIF:
+                                       name = CFSTR_GIF; name_length = sizeof(CFSTR_GIF);
+                                       break;
+                               default:
+                                       name = "\0\0"; name_length = 2;
+                       }
+                       
+                       if (!cliprdr->use_long_format_names)
+                               name_length = 32;
+                       
+                       stream_extend(body, stream_get_size(body) + 4 + name_length);
+
+                       stream_write_uint32(body, cb_event->formats[i]);
+                       stream_write(body, name, name_length);
+               }
+                               
+               s = cliprdr_packet_new(CB_FORMAT_LIST, 0, stream_get_size(body));
+               stream_write(s, stream_get_head(body), stream_get_size(body));
+               stream_free(body);
+       }
+
+       cliprdr_packet_send(cliprdr, s);
+}
+
+static void cliprdr_send_format_list_response(cliprdrPlugin* cliprdr)
+{
+       STREAM* s;
+       DEBUG_CLIPRDR("Sending Clipboard Format List Response");
+       s = cliprdr_packet_new(CB_FORMAT_LIST_RESPONSE, CB_RESPONSE_OK, 0);
+       cliprdr_packet_send(cliprdr, s);
+}
+
+void cliprdr_process_short_format_names(cliprdrPlugin* cliprdr, STREAM* s, uint32 length, uint16 flags)
+{
+       int i;
+       boolean ascii;
+       int num_formats;
+       CLIPRDR_FORMAT_NAME* format_name;
+
+       num_formats = length / 36;
+
+       if (num_formats <= 0)
+       {
+               cliprdr->format_names = NULL;
+               cliprdr->num_format_names = 0;
+               return;
+       }
+
+       if (num_formats * 36 != length)
+               DEBUG_WARN("dataLen %d not divided by 36!", length);
+
+       ascii = (flags & CB_ASCII_NAMES) ? true : false;
+
+       cliprdr->format_names = (CLIPRDR_FORMAT_NAME*) xmalloc(sizeof(CLIPRDR_FORMAT_NAME) * num_formats);
+       cliprdr->num_format_names = num_formats;
+
+       for (i = 0; i < num_formats; i++)
+       {
+               format_name = &cliprdr->format_names[i];
+
+               stream_read_uint32(s, format_name->id);
+
+               if (ascii)
+               {
+                       format_name->name = xstrdup((char*) s->p);
+                       format_name->length = strlen(format_name->name);
+               }
+               else
+               {
+                       format_name->name = freerdp_uniconv_in(cliprdr->uniconv, s->p, 32);
+                       format_name->length = strlen(format_name->name);
+               }
+
+               stream_seek(s, 32);
+       }
+}
+
+void cliprdr_process_long_format_names(cliprdrPlugin* cliprdr, STREAM* s, uint32 length, uint16 flags)
+{
+       int allocated_formats = 8;
+       uint8* end_mark;
+       CLIPRDR_FORMAT_NAME* format_name;
+       
+       stream_get_mark(s, end_mark);
+       end_mark += length;
+               
+       cliprdr->format_names = (CLIPRDR_FORMAT_NAME*) xmalloc(sizeof(CLIPRDR_FORMAT_NAME) * allocated_formats);
+       cliprdr->num_format_names = 0;
+
+       while (stream_get_left(s) >= 6)
+       {
+               uint8* p;
+               int name_len;
+               
+               if (cliprdr->num_format_names >= allocated_formats)
+               {
+                       allocated_formats *= 2;
+                       cliprdr->format_names = (CLIPRDR_FORMAT_NAME*) xrealloc(cliprdr->format_names,
+                                       sizeof(CLIPRDR_FORMAT_NAME) * allocated_formats);
+               }
+               
+               format_name = &cliprdr->format_names[cliprdr->num_format_names++];
+               stream_read_uint32(s, format_name->id);
+               
+               format_name->name = NULL;
+               format_name->length = 0;
+
+               for (p = stream_get_tail(s), name_len = 0; p + 1 < end_mark; p += 2, name_len += 2)
+               {
+                       if (*((unsigned short*) p) == 0)
+                               break;
+               }
+               
+               format_name->name = freerdp_uniconv_in(cliprdr->uniconv, stream_get_tail(s), name_len);
+               format_name->length = strlen(format_name->name);
+               stream_seek(s, name_len + 2);
+       }
+}
+
+void cliprdr_process_format_list(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags)
+{
+       int i;
+       uint32 format;
+       boolean supported;
+       CLIPRDR_FORMAT_NAME* format_name;
+       RDP_CB_FORMAT_LIST_EVENT* cb_event;
+
+       cb_event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+       if (dataLen > 0)
+       {
+               cb_event->raw_format_data = (uint8*) xmalloc(dataLen);
+               memcpy(cb_event->raw_format_data, stream_get_tail(s), dataLen);
+               cb_event->raw_format_data_size = dataLen;
+       }
+
+       if (cliprdr->use_long_format_names)
+               cliprdr_process_long_format_names(cliprdr, s, dataLen, msgFlags);
+       else
+               cliprdr_process_short_format_names(cliprdr, s, dataLen, msgFlags);
+
+       if (cliprdr->num_format_names > 0)
+               cb_event->formats = (uint32*) xmalloc(sizeof(uint32) * cliprdr->num_format_names);
+
+       cb_event->num_formats = 0;
+
+       for (i = 0; i < cliprdr->num_format_names; i++)
+       {
+               supported = true;
+               format_name = &cliprdr->format_names[i];
+               format = format_name->id;
+
+               switch (format)
+               {
+                       case CB_FORMAT_TEXT:
+                       case CB_FORMAT_DIB:
+                       case CB_FORMAT_UNICODETEXT:
+                               break;
+
+                       default:
+
+                               if (format_name->length > 0)
+                               {
+                                       DEBUG_CLIPRDR("format: %s", format_name->name);
+
+                                       if (strcmp(format_name->name, "HTML Format") == 0)
+                                       {
+                                               format = CB_FORMAT_HTML;
+                                               break;
+                                       }
+                                       if (strcmp(format_name->name, "PNG") == 0)
+                                       {
+                                               format = CB_FORMAT_PNG;
+                                               break;
+                                       }
+                                       if (strcmp(format_name->name, "JFIF") == 0)
+                                       {
+                                               format = CB_FORMAT_JPEG;
+                                               break;
+                                       }
+                                       if (strcmp(format_name->name, "GIF") == 0)
+                                       {
+                                               format = CB_FORMAT_GIF;
+                                               break;
+                                       }
+                               }
+                               else
+                               {
+                                       supported = false;
+                               }
+                               
+                               break;
+               }
+
+               if (supported)
+                       cb_event->formats[cb_event->num_formats++] = format;
+
+               if (format_name->length > 0)
+                       xfree(format_name->name);
+       }
+
+       xfree(cliprdr->format_names);
+       cliprdr->format_names = NULL;
+
+       cliprdr->num_format_names = 0;
+
+       svc_plugin_send_event((rdpSvcPlugin*) cliprdr, (RDP_EVENT*) cb_event);
+       cliprdr_send_format_list_response(cliprdr);
+}
+
+void cliprdr_process_format_list_response(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags)
+{
+       /* where is this documented? */
+#if 0
+       RDP_EVENT* event;
+
+       if ((msgFlags & CB_RESPONSE_FAIL) != 0)
+       {
+               event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_MONITOR_READY, NULL, NULL);
+               svc_plugin_send_event((rdpSvcPlugin*) cliprdr, event);
+       }
+#endif
+}
+
+void cliprdr_process_format_data_request(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags)
+{
+       RDP_CB_DATA_REQUEST_EVENT* cb_event;
+
+       cb_event = (RDP_CB_DATA_REQUEST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_DATA_REQUEST, NULL, NULL);
+
+       stream_read_uint32(s, cb_event->format);
+       svc_plugin_send_event((rdpSvcPlugin*) cliprdr, (RDP_EVENT*) cb_event);
+}
+
+void cliprdr_process_format_data_response_event(cliprdrPlugin* cliprdr, RDP_CB_DATA_RESPONSE_EVENT* cb_event)
+{
+       STREAM* s;
+
+       DEBUG_CLIPRDR("Sending Format Data Response");
+
+       if (cb_event->size > 0)
+       {
+               s = cliprdr_packet_new(CB_FORMAT_DATA_RESPONSE, CB_RESPONSE_OK, cb_event->size);
+               stream_write(s, cb_event->data, cb_event->size);
+       }
+       else
+       {
+               s = cliprdr_packet_new(CB_FORMAT_DATA_RESPONSE, CB_RESPONSE_FAIL, 0);
+       }
+
+       cliprdr_packet_send(cliprdr, s);
+}
+
+void cliprdr_process_format_data_request_event(cliprdrPlugin* cliprdr, RDP_CB_DATA_REQUEST_EVENT* cb_event)
+{
+       STREAM* s;
+
+       DEBUG_CLIPRDR("Sending Format Data Request");
+
+       s = cliprdr_packet_new(CB_FORMAT_DATA_REQUEST, 0, 4);
+       stream_write_uint32(s, cb_event->format);
+       cliprdr_packet_send(cliprdr, s);
+}
+
+void cliprdr_process_format_data_response(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags)
+{
+       RDP_CB_DATA_RESPONSE_EVENT* cb_event;
+
+       cb_event = (RDP_CB_DATA_RESPONSE_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_DATA_RESPONSE, NULL, NULL);
+
+       if (dataLen > 0)
+       {
+               cb_event->size = dataLen;
+               cb_event->data = (uint8*) xmalloc(dataLen);
+               memcpy(cb_event->data, stream_get_tail(s), dataLen);
+       }
+
+       svc_plugin_send_event((rdpSvcPlugin*) cliprdr, (RDP_EVENT*) cb_event);
+}
diff --git a/channels/cliprdr/cliprdr_format.h b/channels/cliprdr/cliprdr_format.h
new file mode 100644 (file)
index 0000000..48040b6
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Clipboard Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CLIPRDR_FORMAT_H
+#define __CLIPRDR_FORMAT_H
+
+void cliprdr_process_format_list_event(cliprdrPlugin* cliprdr, RDP_CB_FORMAT_LIST_EVENT* cb_event);
+void cliprdr_process_format_list(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags);
+void cliprdr_process_format_list_response(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags);
+
+void cliprdr_process_format_data_request(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags);
+void cliprdr_process_format_data_response_event(cliprdrPlugin* cliprdr, RDP_CB_DATA_RESPONSE_EVENT* cb_event);
+
+void cliprdr_process_format_data_request_event(cliprdrPlugin* cliprdr, RDP_CB_DATA_REQUEST_EVENT* cb_event);
+void cliprdr_process_format_data_response(cliprdrPlugin* cliprdr, STREAM* s, uint32 dataLen, uint16 msgFlags);
+
+#endif /* __CLIPRDR_FORMAT_H */
diff --git a/channels/cliprdr/cliprdr_main.c b/channels/cliprdr/cliprdr_main.c
new file mode 100644 (file)
index 0000000..a2f5a79
--- /dev/null
@@ -0,0 +1,276 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Clipboard Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/types.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/plugins/cliprdr.h>
+
+#include "cliprdr_constants.h"
+#include "cliprdr_main.h"
+#include "cliprdr_format.h"
+
+static const char* const CB_MSG_TYPE_STRINGS[] =
+{
+       "",
+       "CB_MONITOR_READY",
+       "CB_FORMAT_LIST",
+       "CB_FORMAT_LIST_RESPONSE",
+       "CB_FORMAT_DATA_REQUEST",
+       "CB_FORMAT_DATA_RESPONSE",
+       "CB_TEMP_DIRECTORY",
+       "CB_CLIP_CAPS",
+       "CB_FILECONTENTS_REQUEST",
+       "CB_FILECONTENTS_RESPONSE",
+       "CB_LOCK_CLIPDATA"
+       "CB_UNLOCK_CLIPDATA"
+};
+
+STREAM* cliprdr_packet_new(uint16 msgType, uint16 msgFlags, uint32 dataLen)
+{
+       STREAM* s;
+
+       s = stream_new(dataLen + 8);
+       stream_write_uint16(s, msgType);
+       stream_write_uint16(s, msgFlags);
+       /* Write actual length after the entire packet has been constructed. */
+       stream_seek(s, 4);
+
+       return s;
+}
+
+void cliprdr_packet_send(cliprdrPlugin* cliprdr, STREAM* s)
+{
+       int pos;
+       uint32 dataLen;
+
+       pos = stream_get_pos(s);
+       dataLen = pos - 8;
+       stream_set_pos(s, 4);
+       stream_write_uint32(s, dataLen);
+       stream_set_pos(s, pos);
+
+       svc_plugin_send((rdpSvcPlugin*) cliprdr, s);
+}
+
+static void cliprdr_process_connect(rdpSvcPlugin* plugin)
+{
+       DEBUG_CLIPRDR("connecting");
+
+       ((cliprdrPlugin*) plugin)->uniconv = freerdp_uniconv_new();
+}
+
+void cliprdr_print_general_capability_flags(uint32 flags)
+{
+       printf("generalFlags (0x%08X) {\n", flags);
+
+       if (flags & CB_USE_LONG_FORMAT_NAMES)
+               printf("\tCB_USE_LONG_FORMAT_NAMES\n");
+       if (flags & CB_STREAM_FILECLIP_ENABLED)
+               printf("\tCB_STREAM_FILECLIP_ENABLED\n");
+       if (flags & CB_FILECLIP_NO_FILE_PATHS)
+               printf("\tCB_FILECLIP_NO_FILE_PATHS\n");
+       if (flags & CB_CAN_LOCK_CLIPDATA)
+               printf("\tCB_CAN_LOCK_CLIPDATA\n");
+
+       printf("}\n");
+}
+
+static void cliprdr_process_general_capability(cliprdrPlugin* cliprdr, STREAM* s)
+{
+       uint32 version;
+       uint32 generalFlags;
+
+       stream_read_uint32(s, version); /* version (4 bytes) */
+       stream_read_uint32(s, generalFlags); /* generalFlags (4 bytes) */
+
+       DEBUG_CLIPRDR("Version: %d", version);
+
+#ifdef WITH_DEBUG_CLIPRDR
+       cliprdr_print_general_capability_flags(generalFlags);
+#endif
+
+       if (generalFlags & CB_USE_LONG_FORMAT_NAMES)
+               cliprdr->use_long_format_names = true;
+
+       if (generalFlags & CB_STREAM_FILECLIP_ENABLED)
+               cliprdr->stream_fileclip_enabled = true;
+
+       if (generalFlags & CB_FILECLIP_NO_FILE_PATHS)
+               cliprdr->fileclip_no_file_paths = true;
+
+       if (generalFlags & CB_CAN_LOCK_CLIPDATA)
+               cliprdr->can_lock_clipdata = true;
+
+       cliprdr->received_caps = true;
+}
+
+static void cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, STREAM* s, uint16 length, uint16 flags)
+{
+       int i;
+       uint16 lengthCapability;
+       uint16 cCapabilitiesSets;
+       uint16 capabilitySetType;
+
+       stream_read_uint16(s, cCapabilitiesSets); /* cCapabilitiesSets (2 bytes) */
+       stream_seek_uint16(s); /* pad1 (2 bytes) */
+
+       DEBUG_CLIPRDR("cCapabilitiesSets %d", cCapabilitiesSets);
+
+       for (i = 0; i < cCapabilitiesSets; i++)
+       {
+               stream_read_uint16(s, capabilitySetType); /* capabilitySetType (2 bytes) */
+               stream_read_uint16(s, lengthCapability); /* lengthCapability (2 bytes) */
+
+               switch (capabilitySetType)
+               {
+                       case CB_CAPSTYPE_GENERAL:
+                               cliprdr_process_general_capability(cliprdr, s);
+                               break;
+
+                       default:
+                               DEBUG_WARN("unknown cliprdr capability set: %d", capabilitySetType);
+                               break;
+               }
+       }
+}
+
+static void cliprdr_send_clip_caps(cliprdrPlugin* cliprdr)
+{
+       STREAM* s;
+       uint32 flags;
+
+       s = cliprdr_packet_new(CB_CLIP_CAPS, 0, 4 + CB_CAPSTYPE_GENERAL_LEN);
+
+       DEBUG_CLIPRDR("Sending Capabilities");
+
+       flags = CB_USE_LONG_FORMAT_NAMES;
+
+       stream_write_uint16(s, 1); /* cCapabilitiesSets */
+       stream_write_uint16(s, 0); /* pad1 */
+       stream_write_uint16(s, CB_CAPSTYPE_GENERAL); /* capabilitySetType */
+       stream_write_uint16(s, CB_CAPSTYPE_GENERAL_LEN); /* lengthCapability */
+       stream_write_uint32(s, CB_CAPS_VERSION_2); /* version */
+       stream_write_uint32(s, flags); /* generalFlags */
+
+       cliprdr_packet_send(cliprdr, s);
+}
+
+static void cliprdr_process_monitor_ready(cliprdrPlugin* cliprdr, STREAM* s, uint16 length, uint16 flags)
+{
+       RDP_EVENT* event;
+
+       if (cliprdr->received_caps)
+               cliprdr_send_clip_caps(cliprdr);
+
+       event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_MONITOR_READY, NULL, NULL);
+       svc_plugin_send_event((rdpSvcPlugin*) cliprdr, event);
+}
+
+static void cliprdr_process_receive(rdpSvcPlugin* plugin, STREAM* s)
+{
+       uint16 msgType;
+       uint16 msgFlags;
+       uint32 dataLen;
+       cliprdrPlugin* cliprdr = (cliprdrPlugin*) plugin;
+
+       stream_read_uint16(s, msgType);
+       stream_read_uint16(s, msgFlags);
+       stream_read_uint32(s, dataLen);
+
+       DEBUG_CLIPRDR("msgType: %s (%d), msgFlags: %d dataLen: %d",
+               CB_MSG_TYPE_STRINGS[msgType], msgType, msgFlags, dataLen);
+
+       switch (msgType)
+       {
+               case CB_CLIP_CAPS:
+                       cliprdr_process_clip_caps(cliprdr, s, dataLen, msgFlags);
+                       break;
+
+               case CB_MONITOR_READY:
+                       cliprdr_process_monitor_ready(cliprdr, s, dataLen, msgFlags);
+                       break;
+
+               case CB_FORMAT_LIST:
+                       cliprdr_process_format_list(cliprdr, s, dataLen, msgFlags);
+                       break;
+
+               case CB_FORMAT_LIST_RESPONSE:
+                       cliprdr_process_format_list_response(cliprdr, s, dataLen, msgFlags);
+                       break;
+
+               case CB_FORMAT_DATA_REQUEST:
+                       cliprdr_process_format_data_request(cliprdr, s, dataLen, msgFlags);
+                       break;
+
+               case CB_FORMAT_DATA_RESPONSE:
+                       cliprdr_process_format_data_response(cliprdr, s, dataLen, msgFlags);
+                       break;
+
+               default:
+                       DEBUG_WARN("unknown msgType %d", msgType);
+                       break;
+       }
+
+       stream_free(s);
+}
+
+static void cliprdr_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_CB_FORMAT_LIST:
+                       cliprdr_process_format_list_event((cliprdrPlugin*) plugin, (RDP_CB_FORMAT_LIST_EVENT*) event);
+                       break;
+
+               case RDP_EVENT_TYPE_CB_DATA_REQUEST:
+                       cliprdr_process_format_data_request_event((cliprdrPlugin*) plugin, (RDP_CB_DATA_REQUEST_EVENT*) event);
+                       break;
+
+               case RDP_EVENT_TYPE_CB_DATA_RESPONSE:
+                       cliprdr_process_format_data_response_event((cliprdrPlugin*) plugin, (RDP_CB_DATA_RESPONSE_EVENT*) event);
+                       break;
+
+               default:
+                       DEBUG_WARN("unknown event type %d", event->event_type);
+                       break;
+       }
+
+       freerdp_event_free(event);
+}
+
+static void cliprdr_process_terminate(rdpSvcPlugin* plugin)
+{
+       cliprdrPlugin* cliprdr_plugin = (cliprdrPlugin*) plugin;
+
+       if (cliprdr_plugin->uniconv != NULL)
+               freerdp_uniconv_free(cliprdr_plugin->uniconv);
+
+       xfree(plugin);
+}
+
+DEFINE_SVC_PLUGIN(cliprdr, "cliprdr",
+       CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP |
+       CHANNEL_OPTION_COMPRESS_RDP | CHANNEL_OPTION_SHOW_PROTOCOL)
diff --git a/channels/cliprdr/cliprdr_main.h b/channels/cliprdr/cliprdr_main.h
new file mode 100644 (file)
index 0000000..e3059a2
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Clipboard Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CLIPRDR_MAIN_H
+#define __CLIPRDR_MAIN_H
+
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+
+struct _CLIPRDR_FORMAT_NAME
+{
+       uint32 id;
+       char* name;
+       int length;
+};
+typedef struct _CLIPRDR_FORMAT_NAME CLIPRDR_FORMAT_NAME;
+
+struct cliprdr_plugin
+{
+       rdpSvcPlugin plugin;
+       UNICONV* uniconv;
+       boolean received_caps;
+       boolean use_long_format_names;
+       boolean stream_fileclip_enabled;
+       boolean fileclip_no_file_paths;
+       boolean can_lock_clipdata;
+       CLIPRDR_FORMAT_NAME* format_names;
+       int num_format_names;
+};
+typedef struct cliprdr_plugin cliprdrPlugin;
+
+STREAM* cliprdr_packet_new(uint16 msgType, uint16 msgFlags, uint32 dataLen);
+void cliprdr_packet_send(cliprdrPlugin* cliprdr, STREAM* data_out);
+
+#ifdef WITH_DEBUG_CLIPRDR
+#define DEBUG_CLIPRDR(fmt, ...) DEBUG_CLASS(CLIPRDR, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_CLIPRDR(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __CLIPRDR_MAIN_H */
diff --git a/channels/drdynvc/CMakeLists.txt b/channels/drdynvc/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1e3cc13
--- /dev/null
@@ -0,0 +1,37 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(DRDYNVC_SRCS
+       drdynvc_main.c
+       drdynvc_main.h
+       drdynvc_types.h
+       dvcman.c
+       dvcman.h
+)
+
+add_library(drdynvc ${DRDYNVC_SRCS})
+set_target_properties(drdynvc PROPERTIES PREFIX "")
+
+target_link_libraries(drdynvc freerdp-utils)
+
+install(TARGETS drdynvc DESTINATION ${FREERDP_PLUGIN_PATH})
+
+add_subdirectory(tsmf)
+add_subdirectory(audin)
+
diff --git a/channels/drdynvc/audin/CMakeLists.txt b/channels/drdynvc/audin/CMakeLists.txt
new file mode 100644 (file)
index 0000000..37fe004
--- /dev/null
@@ -0,0 +1,41 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(AUDIN_SRCS
+       audin_main.c
+       audin_main.h
+)
+
+include_directories(..)
+
+add_library(audin ${AUDIN_SRCS})
+set_target_properties(audin PROPERTIES PREFIX "")
+
+target_link_libraries(audin freerdp-utils)
+
+install(TARGETS audin DESTINATION ${FREERDP_PLUGIN_PATH})
+
+if(WITH_ALSA)
+       add_subdirectory(alsa)
+endif()
+
+if(WITH_PULSEAUDIO)
+       add_subdirectory(pulse)
+endif()
+
diff --git a/channels/drdynvc/audin/alsa/CMakeLists.txt b/channels/drdynvc/audin/alsa/CMakeLists.txt
new file mode 100644 (file)
index 0000000..786f9ce
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(AUDIN_ALSA_SRCS
+       audin_alsa.c
+)
+
+include_directories(..)
+include_directories(${ALSA_INCLUDE_DIRS})
+
+add_library(audin_alsa ${AUDIN_ALSA_SRCS})
+set_target_properties(audin_alsa PROPERTIES PREFIX "")
+
+target_link_libraries(audin_alsa freerdp-utils)
+target_link_libraries(audin_alsa ${ALSA_LIBRARIES})
+
+install(TARGETS audin_alsa DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/drdynvc/audin/alsa/audin_alsa.c b/channels/drdynvc/audin/alsa/audin_alsa.c
new file mode 100644 (file)
index 0000000..540d184
--- /dev/null
@@ -0,0 +1,366 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Input Redirection Virtual Channel - ALSA implementation
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <alsa/asoundlib.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/dsp.h>
+
+#include "audin_main.h"
+
+typedef struct _AudinALSADevice
+{
+       IAudinDevice iface;
+
+       char device_name[32];
+       uint32 frames_per_packet;
+       uint32 target_rate;
+       uint32 actual_rate;
+       snd_pcm_format_t format;
+       uint32 target_channels;
+       uint32 actual_channels;
+       int bytes_per_channel;
+       int wformat;
+       int block_size;
+       ADPCM adpcm;
+
+       freerdp_thread* thread;
+
+       uint8* buffer;
+       int buffer_frames;
+
+       AudinReceive receive;
+       void* user_data;
+} AudinALSADevice;
+
+static boolean audin_alsa_set_params(AudinALSADevice* alsa, snd_pcm_t* capture_handle)
+{
+       int error;
+       snd_pcm_hw_params_t* hw_params;
+
+       if ((error = snd_pcm_hw_params_malloc(&hw_params)) < 0)
+       {
+               DEBUG_WARN("snd_pcm_hw_params_malloc (%s)",
+                        snd_strerror(error));
+               return false;
+       }
+       snd_pcm_hw_params_any(capture_handle, hw_params);
+       snd_pcm_hw_params_set_access(capture_handle, hw_params,
+               SND_PCM_ACCESS_RW_INTERLEAVED);
+       snd_pcm_hw_params_set_format(capture_handle, hw_params,
+               alsa->format);
+       snd_pcm_hw_params_set_rate_near(capture_handle, hw_params,
+               &alsa->actual_rate, NULL);
+       snd_pcm_hw_params_set_channels_near(capture_handle, hw_params,
+               &alsa->actual_channels);
+       snd_pcm_hw_params(capture_handle, hw_params);
+       snd_pcm_hw_params_free(hw_params);
+       snd_pcm_prepare(capture_handle);
+
+       if ((alsa->actual_rate != alsa->target_rate) ||
+               (alsa->actual_channels != alsa->target_channels))
+       {
+               DEBUG_DVC("actual rate %d / channel %d is "
+                       "different from target rate %d / channel %d, resampling required.",
+                       alsa->actual_rate, alsa->actual_channels,
+                       alsa->target_rate, alsa->target_channels);
+       }
+       return true;
+}
+
+static boolean audin_alsa_thread_receive(AudinALSADevice* alsa, uint8* src, int size)
+{
+       int frames;
+       int cframes;
+       int ret = 0;
+       int encoded_size;
+       uint8* encoded_data;
+       int rbytes_per_frame;
+       int tbytes_per_frame;
+       uint8* resampled_data;
+
+       rbytes_per_frame = alsa->actual_channels * alsa->bytes_per_channel;
+       tbytes_per_frame = alsa->target_channels * alsa->bytes_per_channel;
+
+       if ((alsa->target_rate == alsa->actual_rate) &&
+               (alsa->target_channels == alsa->actual_channels))
+       {
+               resampled_data = NULL;
+               frames = size / rbytes_per_frame;
+       }
+       else
+       {
+               resampled_data = dsp_resample(src, alsa->bytes_per_channel,
+                       alsa->actual_channels, alsa->actual_rate, size / rbytes_per_frame,
+                       alsa->target_channels, alsa->target_rate, &frames);
+               DEBUG_DVC("resampled %d frames at %d to %d frames at %d",
+                       size / rbytes_per_frame, alsa->actual_rate, frames, alsa->target_rate);
+               size = frames * tbytes_per_frame;
+               src = resampled_data;
+       }
+
+       while (frames > 0)
+       {
+               if (freerdp_thread_is_stopped(alsa->thread))
+                       break;
+
+               cframes = alsa->frames_per_packet - alsa->buffer_frames;
+               if (cframes > frames)
+                       cframes = frames;
+               memcpy(alsa->buffer + alsa->buffer_frames * tbytes_per_frame,
+                       src, cframes * tbytes_per_frame);
+               alsa->buffer_frames += cframes;
+               if (alsa->buffer_frames >= alsa->frames_per_packet)
+               {
+                       if (alsa->wformat == 0x11)
+                       {
+                               encoded_data = dsp_encode_ima_adpcm(&alsa->adpcm,
+                                       alsa->buffer, alsa->buffer_frames * tbytes_per_frame,
+                                       alsa->target_channels, alsa->block_size, &encoded_size);
+                               DEBUG_DVC("encoded %d to %d",
+                                       alsa->buffer_frames * tbytes_per_frame, encoded_size);
+                       }
+                       else
+                       {
+                               encoded_data = alsa->buffer;
+                               encoded_size = alsa->buffer_frames * tbytes_per_frame;
+                       }
+
+                       if (freerdp_thread_is_stopped(alsa->thread))
+                       {
+                               ret = 0;
+                               frames = 0;
+                       }
+                       else
+                               ret = alsa->receive(encoded_data, encoded_size, alsa->user_data);
+                       alsa->buffer_frames = 0;
+                       if (encoded_data != alsa->buffer)
+                               xfree(encoded_data);
+                       if (!ret)
+                               break;
+               }
+               src += cframes * tbytes_per_frame;
+               frames -= cframes;
+       }
+
+       if (resampled_data)
+               xfree(resampled_data);
+
+       return ret;
+}
+
+static void* audin_alsa_thread_func(void* arg)
+{
+       int error;
+       uint8* buffer;
+       int rbytes_per_frame;
+       int tbytes_per_frame;
+       snd_pcm_t* capture_handle = NULL;
+       AudinALSADevice* alsa = (AudinALSADevice*) arg;
+
+       DEBUG_DVC("in");
+
+       rbytes_per_frame = alsa->actual_channels * alsa->bytes_per_channel;
+       tbytes_per_frame = alsa->target_channels * alsa->bytes_per_channel;
+       alsa->buffer = (uint8*) xzalloc(tbytes_per_frame * alsa->frames_per_packet);
+       alsa->buffer_frames = 0;
+       buffer = (uint8*) xzalloc(rbytes_per_frame * alsa->frames_per_packet);
+       memset(&alsa->adpcm, 0, sizeof(ADPCM));
+       do
+       {
+               if ((error = snd_pcm_open(&capture_handle, alsa->device_name, SND_PCM_STREAM_CAPTURE, 0)) < 0)
+               {
+                       DEBUG_WARN("snd_pcm_open (%s)", snd_strerror(error));
+                       break;
+               }
+               if (!audin_alsa_set_params(alsa, capture_handle))
+               {
+                       break;
+               }
+
+               while (!freerdp_thread_is_stopped(alsa->thread))
+               {
+                       error = snd_pcm_readi(capture_handle, buffer, alsa->frames_per_packet);
+                       if (error == -EPIPE)
+                       {
+                               snd_pcm_recover(capture_handle, error, 0);
+                               continue;
+                       }
+                       else if (error < 0)
+                       {
+                               DEBUG_WARN("snd_pcm_readi (%s)", snd_strerror(error));
+                               break;
+                       }
+                       if (!audin_alsa_thread_receive(alsa, buffer, error * rbytes_per_frame))
+                               break;
+               }
+       } while (0);
+
+       xfree(buffer);
+       xfree(alsa->buffer);
+       alsa->buffer = NULL;
+       if (capture_handle)
+               snd_pcm_close(capture_handle);
+
+       freerdp_thread_quit(alsa->thread);
+
+       DEBUG_DVC("out");
+
+       return NULL;
+}
+
+static void audin_alsa_free(IAudinDevice* device)
+{
+       AudinALSADevice* alsa = (AudinALSADevice*) device;
+
+       freerdp_thread_free(alsa->thread);
+       xfree(alsa);
+}
+
+static boolean audin_alsa_format_supported(IAudinDevice* device, audinFormat* format)
+{
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       if (format->cbSize == 0 &&
+                               (format->nSamplesPerSec <= 48000) &&
+                               (format->wBitsPerSample == 8 || format->wBitsPerSample == 16) &&
+                               (format->nChannels == 1 || format->nChannels == 2))
+                       {
+                               return true;
+                       }
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       if ((format->nSamplesPerSec <= 48000) &&
+                               (format->wBitsPerSample == 4) &&
+                               (format->nChannels == 1 || format->nChannels == 2))
+                       {
+                               return true;
+                       }
+                       break;
+       }
+       return false;
+}
+
+static void audin_alsa_set_format(IAudinDevice* device, audinFormat* format, uint32 FramesPerPacket)
+{
+       int bs;
+       AudinALSADevice* alsa = (AudinALSADevice*) device;
+
+       alsa->target_rate = format->nSamplesPerSec;
+       alsa->actual_rate = format->nSamplesPerSec;
+       alsa->target_channels = format->nChannels;
+       alsa->actual_channels = format->nChannels;
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       switch (format->wBitsPerSample)
+                       {
+                               case 8:
+                                       alsa->format = SND_PCM_FORMAT_S8;
+                                       alsa->bytes_per_channel = 1;
+                                       break;
+                               case 16:
+                                       alsa->format = SND_PCM_FORMAT_S16_LE;
+                                       alsa->bytes_per_channel = 2;
+                                       break;
+                       }
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       alsa->format = SND_PCM_FORMAT_S16_LE;
+                       alsa->bytes_per_channel = 2;
+                       bs = (format->nBlockAlign - 4 * format->nChannels) * 4;
+                       alsa->frames_per_packet = (alsa->frames_per_packet * format->nChannels * 2 /
+                               bs + 1) * bs / (format->nChannels * 2);
+                       DEBUG_DVC("aligned FramesPerPacket=%d",
+                               alsa->frames_per_packet);
+                       break;
+       }
+       alsa->wformat = format->wFormatTag;
+       alsa->block_size = format->nBlockAlign;
+}
+
+static void audin_alsa_open(IAudinDevice* device, AudinReceive receive, void* user_data)
+{
+       AudinALSADevice* alsa = (AudinALSADevice*) device;
+
+       DEBUG_DVC("");
+
+       alsa->receive = receive;
+       alsa->user_data = user_data;
+
+       freerdp_thread_start(alsa->thread, audin_alsa_thread_func, alsa);
+}
+
+static void audin_alsa_close(IAudinDevice* device)
+{
+       AudinALSADevice* alsa = (AudinALSADevice*) device;
+
+       DEBUG_DVC("");
+
+       freerdp_thread_stop(alsa->thread);
+
+       alsa->receive = NULL;
+       alsa->user_data = NULL;
+}
+
+int FreeRDPAudinDeviceEntry(PFREERDP_AUDIN_DEVICE_ENTRY_POINTS pEntryPoints)
+{
+       AudinALSADevice* alsa;
+       RDP_PLUGIN_DATA* data;
+
+       alsa = xnew(AudinALSADevice);
+
+       alsa->iface.Open = audin_alsa_open;
+       alsa->iface.FormatSupported = audin_alsa_format_supported;
+       alsa->iface.SetFormat = audin_alsa_set_format;
+       alsa->iface.Close = audin_alsa_close;
+       alsa->iface.Free = audin_alsa_free;
+
+       data = pEntryPoints->plugin_data;
+       if (data && data->data[0] && strcmp(data->data[0], "audin") == 0 &&
+               data->data[1] && strcmp(data->data[1], "alsa") == 0)
+       {
+               if (data[2].size)
+                       strncpy(alsa->device_name, (char*)data->data[2], sizeof(alsa->device_name));
+       }
+       if (alsa->device_name[0] == '\0')
+       {
+               strcpy(alsa->device_name, "default");
+       }
+
+       alsa->frames_per_packet = 128;
+       alsa->target_rate = 22050;
+       alsa->actual_rate = 22050;
+       alsa->format = SND_PCM_FORMAT_S16_LE;
+       alsa->target_channels = 2;
+       alsa->actual_channels = 2;
+       alsa->bytes_per_channel = 2;
+       alsa->thread = freerdp_thread_new();
+
+       pEntryPoints->pRegisterAudinDevice(pEntryPoints->plugin, (IAudinDevice*) alsa);
+
+       return 0;
+}
+
diff --git a/channels/drdynvc/audin/audin_main.c b/channels/drdynvc/audin/audin_main.c
new file mode 100644 (file)
index 0000000..095c539
--- /dev/null
@@ -0,0 +1,544 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Input Redirection Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/load_plugin.h>
+
+#include "audin_main.h"
+
+#define MSG_SNDIN_VERSION       0x01
+#define MSG_SNDIN_FORMATS       0x02
+#define MSG_SNDIN_OPEN          0x03
+#define MSG_SNDIN_OPEN_REPLY    0x04
+#define MSG_SNDIN_DATA_INCOMING 0x05
+#define MSG_SNDIN_DATA          0x06
+#define MSG_SNDIN_FORMATCHANGE  0x07
+
+typedef struct _AUDIN_LISTENER_CALLBACK AUDIN_LISTENER_CALLBACK;
+struct _AUDIN_LISTENER_CALLBACK
+{
+       IWTSListenerCallback iface;
+
+       IWTSPlugin* plugin;
+       IWTSVirtualChannelManager* channel_mgr;
+};
+
+typedef struct _AUDIN_CHANNEL_CALLBACK AUDIN_CHANNEL_CALLBACK;
+struct _AUDIN_CHANNEL_CALLBACK
+{
+       IWTSVirtualChannelCallback iface;
+
+       IWTSPlugin* plugin;
+       IWTSVirtualChannelManager* channel_mgr;
+       IWTSVirtualChannel* channel;
+
+       /**
+        * The supported format list sent back to the server, which needs to
+        * be stored as reference when the server sends the format index in
+        * Open PDU and Format Change PDU
+        */
+       audinFormat* formats;
+       int formats_count;
+};
+
+typedef struct _AUDIN_PLUGIN AUDIN_PLUGIN;
+struct _AUDIN_PLUGIN
+{
+       IWTSPlugin iface;
+
+       AUDIN_LISTENER_CALLBACK* listener_callback;
+
+       /* Parsed plugin data */
+       uint16 fixed_format;
+       uint16 fixed_channel;   
+       uint32 fixed_rate;
+
+       /* Device interface */
+       IAudinDevice* device;
+};
+
+static int audin_process_version(IWTSVirtualChannelCallback* pChannelCallback, STREAM* s)
+{
+       int error;
+       STREAM* out;
+       uint32 Version;
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+
+       stream_read_uint32(s, Version);
+
+       DEBUG_DVC("Version=%d", Version);
+
+       out = stream_new(5);
+       stream_write_uint8(out, MSG_SNDIN_VERSION);
+       stream_write_uint32(out, Version);
+       error = callback->channel->Write(callback->channel, stream_get_length(s), stream_get_head(s), NULL);
+       stream_free(out);
+
+       return error;
+}
+
+static int audin_send_incoming_data_pdu(IWTSVirtualChannelCallback* pChannelCallback)
+{
+       uint8 out_data[1];
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+
+       out_data[0] = MSG_SNDIN_DATA_INCOMING;
+       return callback->channel->Write(callback->channel, 1, out_data, NULL);
+}
+
+static int audin_process_formats(IWTSVirtualChannelCallback* pChannelCallback, STREAM* s)
+{
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) callback->plugin;
+       uint32 i;
+       uint8* fm;
+       int error;
+       STREAM* out;
+       uint32 NumFormats;
+       audinFormat format;
+       uint32 cbSizeFormatsPacket;
+
+       stream_read_uint32(s, NumFormats);
+       DEBUG_DVC("NumFormats %d", NumFormats);
+       if ((NumFormats < 1) || (NumFormats > 1000))
+       {
+               DEBUG_WARN("bad NumFormats %d", NumFormats);
+               return 1;
+       }
+       stream_seek_uint32(s); /* cbSizeFormatsPacket */
+
+       callback->formats = (audinFormat*) xzalloc(NumFormats * sizeof(audinFormat));
+
+       out = stream_new(9);
+       stream_seek(out, 9);
+
+       /* SoundFormats (variable) */
+       for (i = 0; i < NumFormats; i++)
+       {
+               stream_get_mark(s, fm);
+               stream_read_uint16(s, format.wFormatTag);
+               stream_read_uint16(s, format.nChannels);
+               stream_read_uint32(s, format.nSamplesPerSec);
+               stream_seek_uint32(s); /* nAvgBytesPerSec */
+               stream_read_uint16(s, format.nBlockAlign);
+               stream_read_uint16(s, format.wBitsPerSample);
+               stream_read_uint16(s, format.cbSize);
+               format.data = stream_get_tail(s);
+               stream_seek(s, format.cbSize);
+               
+               DEBUG_DVC("wFormatTag=%d nChannels=%d nSamplesPerSec=%d "
+                       "nBlockAlign=%d wBitsPerSample=%d cbSize=%d",
+                       format.wFormatTag, format.nChannels, format.nSamplesPerSec,
+                       format.nBlockAlign, format.wBitsPerSample, format.cbSize);
+
+               if (audin->fixed_format > 0 && audin->fixed_format != format.wFormatTag)
+                       continue;
+               if (audin->fixed_channel > 0 && audin->fixed_channel != format.nChannels)
+                       continue;
+               if (audin->fixed_rate > 0 && audin->fixed_rate != format.nSamplesPerSec)
+                       continue;
+               if (audin->device && audin->device->FormatSupported(audin->device, &format))
+               {
+                       DEBUG_DVC("format ok");
+
+                       /* Store the agreed format in the corresponding index */
+                       callback->formats[callback->formats_count++] = format;
+                       /* Put the format to output buffer */
+                       stream_check_size(out, 18 + format.cbSize);
+                       stream_write(out, fm, 18 + format.cbSize);
+               }
+       }
+
+       audin_send_incoming_data_pdu(pChannelCallback);
+
+       cbSizeFormatsPacket = stream_get_pos(out);
+       stream_set_pos(out, 0);
+
+       stream_write_uint8(out, MSG_SNDIN_FORMATS); /* Header (1 byte) */
+       stream_write_uint32(out, callback->formats_count); /* NumFormats (4 bytes) */
+       stream_write_uint32(out, cbSizeFormatsPacket); /* cbSizeFormatsPacket (4 bytes) */
+
+       error = callback->channel->Write(callback->channel, cbSizeFormatsPacket, stream_get_head(out), NULL);
+       stream_free(out);
+
+       return error;
+}
+
+static int audin_send_format_change_pdu(IWTSVirtualChannelCallback* pChannelCallback, uint32 NewFormat)
+{
+       int error;
+       STREAM* out;
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+
+       out = stream_new(5);
+       stream_write_uint8(out, MSG_SNDIN_FORMATCHANGE);
+       stream_write_uint32(out, NewFormat);
+       error = callback->channel->Write(callback->channel, 5, stream_get_head(out), NULL);
+       stream_free(out);
+
+       return error;
+}
+
+static int audin_send_open_reply_pdu(IWTSVirtualChannelCallback* pChannelCallback, uint32 Result)
+{
+       int error;
+       STREAM* out;
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+
+       out = stream_new(5);
+       stream_write_uint8(out, MSG_SNDIN_OPEN_REPLY);
+       stream_write_uint32(out, Result);
+       error = callback->channel->Write(callback->channel, 5, stream_get_head(out), NULL);
+       stream_free(out);
+
+       return error;
+}
+
+static boolean audin_receive_wave_data(uint8* data, int size, void* user_data)
+{
+       int error;
+       STREAM* out;
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) user_data;
+
+       error = audin_send_incoming_data_pdu((IWTSVirtualChannelCallback*) callback);
+
+       if (error != 0)
+               return false;
+
+       out = stream_new(size + 1);
+       stream_write_uint8(out, MSG_SNDIN_DATA);
+       stream_write(out, data, size);
+       error = callback->channel->Write(callback->channel, stream_get_length(out), stream_get_head(out), NULL);
+       stream_free(out);
+
+       return (error == 0 ? true : false);
+}
+
+static int audin_process_open(IWTSVirtualChannelCallback* pChannelCallback, STREAM* s)
+{
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) callback->plugin;
+       audinFormat* format;
+       uint32 initialFormat;
+       uint32 FramesPerPacket;
+
+       stream_read_uint32(s, FramesPerPacket);
+       stream_read_uint32(s, initialFormat);
+
+       DEBUG_DVC("FramesPerPacket=%d initialFormat=%d",
+               FramesPerPacket, initialFormat);
+
+       if (initialFormat >= callback->formats_count)
+       {
+               DEBUG_WARN("invalid format index %d (total %d)",
+                       initialFormat, callback->formats_count);
+               return 1;
+       }
+
+       format = &callback->formats[initialFormat];
+       if (audin->device)
+       {
+               IFCALL(audin->device->SetFormat, audin->device, format, FramesPerPacket);
+               IFCALL(audin->device->Open, audin->device, audin_receive_wave_data, callback);
+       }
+
+       audin_send_format_change_pdu(pChannelCallback, initialFormat);
+       audin_send_open_reply_pdu(pChannelCallback, 0);
+
+       return 0;
+}
+
+static int audin_process_format_change(IWTSVirtualChannelCallback* pChannelCallback, STREAM* s)
+{
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+       AUDIN_PLUGIN * audin = (AUDIN_PLUGIN*) callback->plugin;
+       uint32 NewFormat;
+       audinFormat* format;
+
+       stream_read_uint32(s, NewFormat);
+
+       DEBUG_DVC("NewFormat=%d", NewFormat);
+
+       if (NewFormat >= callback->formats_count)
+       {
+               DEBUG_WARN("invalid format index %d (total %d)",
+                       NewFormat, callback->formats_count);
+               return 1;
+       }
+
+       format = &callback->formats[NewFormat];
+
+       if (audin->device)
+       {
+               IFCALL(audin->device->Close, audin->device);
+               IFCALL(audin->device->SetFormat, audin->device, format, 0);
+               IFCALL(audin->device->Open, audin->device, audin_receive_wave_data, callback);
+       }
+
+       audin_send_format_change_pdu(pChannelCallback, NewFormat);
+
+       return 0;
+}
+
+static int audin_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, uint32 cbSize, uint8* pBuffer)
+{
+       int error;
+       STREAM* s;
+       uint8 MessageId;
+
+       s = stream_new(0);
+       stream_attach(s, pBuffer, cbSize);
+
+       stream_read_uint8(s, MessageId);
+
+       DEBUG_DVC("MessageId=0x%x", MessageId);
+
+       switch (MessageId)
+       {
+               case MSG_SNDIN_VERSION:
+                       error = audin_process_version(pChannelCallback, s);
+                       break;
+
+               case MSG_SNDIN_FORMATS:
+                       error = audin_process_formats(pChannelCallback, s);
+                       break;
+
+               case MSG_SNDIN_OPEN:
+                       error = audin_process_open(pChannelCallback, s);
+                       break;
+
+               case MSG_SNDIN_FORMATCHANGE:
+                       error = audin_process_format_change(pChannelCallback, s);
+                       break;
+
+               default:
+                       DEBUG_WARN("unknown MessageId=0x%x", MessageId);
+                       error = 1;
+                       break;
+       }
+
+       stream_detach(s);
+       stream_free(s);
+
+       return error;
+}
+
+static int audin_on_close(IWTSVirtualChannelCallback* pChannelCallback)
+{
+       AUDIN_CHANNEL_CALLBACK* callback = (AUDIN_CHANNEL_CALLBACK*) pChannelCallback;
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) callback->plugin;
+
+       DEBUG_DVC("");
+
+       if (audin->device)
+               IFCALL(audin->device->Close, audin->device);
+
+       xfree(callback->formats);
+       xfree(callback);
+
+       return 0;
+}
+
+static int audin_on_new_channel_connection(IWTSListenerCallback* pListenerCallback,
+       IWTSVirtualChannel* pChannel, uint8* Data, int* pbAccept,
+       IWTSVirtualChannelCallback** ppCallback)
+{
+       AUDIN_CHANNEL_CALLBACK* callback;
+       AUDIN_LISTENER_CALLBACK* listener_callback = (AUDIN_LISTENER_CALLBACK*) pListenerCallback;
+
+       DEBUG_DVC("");
+
+       callback = xnew(AUDIN_CHANNEL_CALLBACK);
+
+       callback->iface.OnDataReceived = audin_on_data_received;
+       callback->iface.OnClose = audin_on_close;
+       callback->plugin = listener_callback->plugin;
+       callback->channel_mgr = listener_callback->channel_mgr;
+       callback->channel = pChannel;
+
+       *ppCallback = (IWTSVirtualChannelCallback*) callback;
+
+       return 0;
+}
+
+static int audin_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager* pChannelMgr)
+{
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) pPlugin;
+
+       DEBUG_DVC("");
+
+       audin->listener_callback = xnew(AUDIN_LISTENER_CALLBACK);
+
+       audin->listener_callback->iface.OnNewChannelConnection = audin_on_new_channel_connection;
+       audin->listener_callback->plugin = pPlugin;
+       audin->listener_callback->channel_mgr = pChannelMgr;
+
+       return pChannelMgr->CreateListener(pChannelMgr, "AUDIO_INPUT", 0,
+               (IWTSListenerCallback*) audin->listener_callback, NULL);
+}
+
+static int audin_plugin_terminated(IWTSPlugin* pPlugin)
+{
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) pPlugin;
+
+       DEBUG_DVC("");
+
+       if (audin->device)
+       {
+               IFCALL(audin->device->Close, audin->device);
+               IFCALL(audin->device->Free, audin->device);
+               audin->device = NULL;
+       }
+
+       xfree(audin->listener_callback);
+       xfree(audin);
+
+       return 0;
+}
+
+static void audin_register_device_plugin(IWTSPlugin* pPlugin, IAudinDevice* device)
+{
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) pPlugin;
+
+       if (audin->device)
+       {
+               DEBUG_WARN("existing device, abort.");
+               return;
+       }
+
+       DEBUG_DVC("device registered.");
+
+       audin->device = device;
+}
+
+static boolean audin_load_device_plugin(IWTSPlugin* pPlugin, const char* name, RDP_PLUGIN_DATA* data)
+{
+       char* fullname;
+       PFREERDP_AUDIN_DEVICE_ENTRY entry;
+       FREERDP_AUDIN_DEVICE_ENTRY_POINTS entryPoints;
+
+       if (strrchr(name, '.') != NULL)
+       {
+               entry = (PFREERDP_AUDIN_DEVICE_ENTRY) freerdp_load_plugin(name, AUDIN_DEVICE_EXPORT_FUNC_NAME);
+       }
+       else
+       {
+               fullname = xzalloc(strlen(name) + 8);
+               strcpy(fullname, "audin_");
+               strcat(fullname, name);
+               entry = (PFREERDP_AUDIN_DEVICE_ENTRY) freerdp_load_plugin(fullname, AUDIN_DEVICE_EXPORT_FUNC_NAME);
+               xfree(fullname);
+       }
+
+       if (entry == NULL)
+               return false;
+
+       entryPoints.plugin = pPlugin;
+       entryPoints.pRegisterAudinDevice = audin_register_device_plugin;
+       entryPoints.plugin_data = data;
+
+       if (entry(&entryPoints) != 0)
+       {
+               DEBUG_WARN("%s entry returns error.", name);
+               return false;
+       }
+
+       return true;
+}
+
+static boolean audin_process_plugin_data(IWTSPlugin* pPlugin, RDP_PLUGIN_DATA* data)
+{
+       boolean ret;
+       AUDIN_PLUGIN* audin = (AUDIN_PLUGIN*) pPlugin;
+       RDP_PLUGIN_DATA default_data[2] = { { 0 }, { 0 } };
+
+       if (data->data[0] && (strcmp((char*)data->data[0], "audin") == 0 || strstr((char*) data->data[0], "/audin.") != NULL))
+       {
+               if (data->data[1] && strcmp((char*)data->data[1], "format") == 0)
+               {
+                       audin->fixed_format = atoi(data->data[2]);
+                       return true;
+               }
+               else if (data->data[1] && strcmp((char*)data->data[1], "rate") == 0)
+               {
+                       audin->fixed_rate = atoi(data->data[2]);
+                       return true;
+               }
+               else if (data->data[1] && strcmp((char*)data->data[1], "channel") == 0)
+               {
+                       audin->fixed_channel = atoi(data->data[2]);
+                       return true;
+               }
+               else if (data->data[1] && ((char*)data->data[1])[0])
+               {
+                       return audin_load_device_plugin(pPlugin, (char*) data->data[1], data);
+               }
+               else
+               {
+                       default_data[0].size = sizeof(RDP_PLUGIN_DATA);
+                       default_data[0].data[0] = "audin";
+                       default_data[0].data[1] = "pulse";
+                       default_data[0].data[2] = "";
+
+                       ret = audin_load_device_plugin(pPlugin, "pulse", default_data);
+
+                       if (!ret)
+                       {
+                               default_data[0].size = sizeof(RDP_PLUGIN_DATA);
+                               default_data[0].data[0] = "audin";
+                               default_data[0].data[1] = "alsa";
+                               default_data[0].data[2] = "default";
+                               ret = audin_load_device_plugin(pPlugin, "alsa", default_data);
+                       }
+
+                       return ret;
+               }
+       }
+
+       return true;
+}
+
+int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
+{
+       int error = 0;
+       AUDIN_PLUGIN* audin;
+
+       audin = (AUDIN_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "audin");
+
+       if (audin == NULL)
+       {
+               audin = xnew(AUDIN_PLUGIN);
+
+               audin->iface.Initialize = audin_plugin_initialize;
+               audin->iface.Connected = NULL;
+               audin->iface.Disconnected = NULL;
+               audin->iface.Terminated = audin_plugin_terminated;
+               error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin);
+       }
+
+       if (error == 0)
+               audin_process_plugin_data((IWTSPlugin*) audin, pEntryPoints->GetPluginData(pEntryPoints));
+
+       return error;
+}
+
diff --git a/channels/drdynvc/audin/audin_main.h b/channels/drdynvc/audin/audin_main.h
new file mode 100644 (file)
index 0000000..6ac45a2
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Input Redirection Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __AUDIN_MAIN_H
+#define __AUDIN_MAIN_H
+
+#include "drdynvc_types.h"
+
+typedef boolean (*AudinReceive) (uint8* data, int size, void* user_data);
+
+typedef struct audin_format audinFormat;
+struct audin_format
+{
+       uint16 wFormatTag;
+       uint16 nChannels;
+       uint32 nSamplesPerSec;
+       uint16 nBlockAlign;
+       uint16 wBitsPerSample;
+       uint16 cbSize;
+       uint8* data;
+};
+
+typedef struct _IAudinDevice IAudinDevice;
+struct _IAudinDevice
+{
+       void (*Open) (IAudinDevice* devplugin, AudinReceive receive, void* user_data);
+       boolean (*FormatSupported) (IAudinDevice* devplugin, audinFormat* format);
+       void (*SetFormat) (IAudinDevice* devplugin, audinFormat* format, uint32 FramesPerPacket);
+       void (*Close) (IAudinDevice* devplugin);
+       void (*Free) (IAudinDevice* devplugin);
+};
+
+#define AUDIN_DEVICE_EXPORT_FUNC_NAME "FreeRDPAudinDeviceEntry"
+
+typedef void (*PREGISTERAUDINDEVICE)(IWTSPlugin* plugin, IAudinDevice* device);
+
+struct _FREERDP_AUDIN_DEVICE_ENTRY_POINTS
+{
+       IWTSPlugin* plugin;
+       PREGISTERAUDINDEVICE pRegisterAudinDevice;
+       RDP_PLUGIN_DATA* plugin_data;
+};
+typedef struct _FREERDP_AUDIN_DEVICE_ENTRY_POINTS FREERDP_AUDIN_DEVICE_ENTRY_POINTS;
+typedef FREERDP_AUDIN_DEVICE_ENTRY_POINTS* PFREERDP_AUDIN_DEVICE_ENTRY_POINTS;
+
+typedef int (*PFREERDP_AUDIN_DEVICE_ENTRY)(PFREERDP_AUDIN_DEVICE_ENTRY_POINTS pEntryPoints);
+
+#endif /* __AUDIN_MAIN_H */
+
diff --git a/channels/drdynvc/audin/pulse/CMakeLists.txt b/channels/drdynvc/audin/pulse/CMakeLists.txt
new file mode 100644 (file)
index 0000000..10d6afe
--- /dev/null
@@ -0,0 +1,34 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(AUDIN_PULSE_SRCS
+       audin_pulse.c
+)
+
+include_directories(..)
+include_directories(${PULSE_INCLUDE_DIRS})
+
+add_library(audin_pulse ${AUDIN_PULSE_SRCS})
+set_target_properties(audin_pulse PROPERTIES PREFIX "")
+
+target_link_libraries(audin_pulse freerdp-utils)
+target_link_libraries(audin_pulse ${PULSE_LIBRARIES})
+
+install(TARGETS audin_pulse DESTINATION ${FREERDP_PLUGIN_PATH})
+
diff --git a/channels/drdynvc/audin/pulse/audin_pulse.c b/channels/drdynvc/audin/pulse/audin_pulse.c
new file mode 100644 (file)
index 0000000..61e1427
--- /dev/null
@@ -0,0 +1,471 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Input Redirection Virtual Channel - PulseAudio implementation
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pulse/pulseaudio.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/dsp.h>
+
+#include "audin_main.h"
+
+typedef struct _AudinPulseDevice
+{
+       IAudinDevice iface;
+
+       char device_name[32];
+       uint32 frames_per_packet;
+       pa_threaded_mainloop* mainloop;
+       pa_context* context;
+       pa_sample_spec sample_spec;
+       pa_stream* stream;
+       int format;
+       int block_size;
+       ADPCM adpcm;
+
+       int bytes_per_frame;
+       uint8* buffer;
+       int buffer_frames;
+
+       AudinReceive receive;
+       void* user_data;
+} AudinPulseDevice;
+
+static void audin_pulse_context_state_callback(pa_context* context, void* userdata)
+{
+       pa_context_state_t state;
+       AudinPulseDevice* pulse = (AudinPulseDevice*) userdata;
+
+       state = pa_context_get_state(context);
+       switch (state)
+       {
+               case PA_CONTEXT_READY:
+                       DEBUG_DVC("PA_CONTEXT_READY");
+                       pa_threaded_mainloop_signal (pulse->mainloop, 0);
+                       break;
+
+               case PA_CONTEXT_FAILED:
+               case PA_CONTEXT_TERMINATED:
+                       DEBUG_DVC("state %d", (int)state);
+                       pa_threaded_mainloop_signal (pulse->mainloop, 0);
+                       break;
+
+               default:
+                       DEBUG_DVC("state %d", (int)state);
+                       break;
+       }
+}
+
+static boolean audin_pulse_connect(IAudinDevice* device)
+{
+       pa_context_state_t state;
+       AudinPulseDevice* pulse = (AudinPulseDevice*) device;
+
+       if (!pulse->context)
+               return false;
+
+       if (pa_context_connect(pulse->context, NULL, 0, NULL))
+       {
+               DEBUG_WARN("pa_context_connect failed (%d)",
+                       pa_context_errno(pulse->context));
+               return false;
+       }
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       if (pa_threaded_mainloop_start(pulse->mainloop) < 0)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_threaded_mainloop_start failed (%d)",
+                       pa_context_errno(pulse->context));
+               return false;
+       }
+       for (;;)
+       {
+               state = pa_context_get_state(pulse->context);
+               if (state == PA_CONTEXT_READY)
+                       break;
+               if (!PA_CONTEXT_IS_GOOD(state))
+               {
+                       DEBUG_WARN("bad context state (%d)",
+                               pa_context_errno(pulse->context));
+                       break;
+               }
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+       if (state == PA_CONTEXT_READY)
+       {
+               DEBUG_DVC("connected");
+               return true;
+       }
+       else
+       {
+               pa_context_disconnect(pulse->context);
+               return false;
+       }
+}
+
+static void audin_pulse_free(IAudinDevice* device)
+{
+       AudinPulseDevice* pulse = (AudinPulseDevice*) device;
+
+       DEBUG_DVC("");
+
+       if (!pulse)
+               return;
+       if (pulse->mainloop)
+       {
+               pa_threaded_mainloop_stop(pulse->mainloop);
+       }
+       if (pulse->context)
+       {
+               pa_context_disconnect(pulse->context);
+               pa_context_unref(pulse->context);
+               pulse->context = NULL;
+       }
+       if (pulse->mainloop)
+       {
+               pa_threaded_mainloop_free(pulse->mainloop);
+               pulse->mainloop = NULL;
+       }
+       xfree(pulse);
+}
+
+static boolean audin_pulse_format_supported(IAudinDevice* device, audinFormat* format)
+{
+       AudinPulseDevice* pulse = (AudinPulseDevice*) device;
+
+       if (!pulse->context)
+               return 0;
+
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       if (format->cbSize == 0 &&
+                               (format->nSamplesPerSec <= PA_RATE_MAX) &&
+                               (format->wBitsPerSample == 8 || format->wBitsPerSample == 16) &&
+                               (format->nChannels >= 1 && format->nChannels <= PA_CHANNELS_MAX))
+                       {
+                               return true;
+                       }
+                       break;
+
+               case 6: /* A-LAW */
+               case 7: /* U-LAW */
+                       if (format->cbSize == 0 &&
+                               (format->nSamplesPerSec <= PA_RATE_MAX) &&
+                               (format->wBitsPerSample == 8) &&
+                               (format->nChannels >= 1 && format->nChannels <= PA_CHANNELS_MAX))
+                       {
+                               return true;
+                       }
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       if ((format->nSamplesPerSec <= PA_RATE_MAX) &&
+                               (format->wBitsPerSample == 4) &&
+                               (format->nChannels == 1 || format->nChannels == 2))
+                       {
+                               return true;
+                       }
+                       break;
+       }
+       return false;
+}
+
+static void audin_pulse_set_format(IAudinDevice* device, audinFormat* format, uint32 FramesPerPacket)
+{
+       int bs;
+       pa_sample_spec sample_spec = { 0 };
+       AudinPulseDevice* pulse = (AudinPulseDevice*) device;
+
+       if (!pulse->context)
+               return;
+
+       if (FramesPerPacket > 0)
+       {
+               pulse->frames_per_packet = FramesPerPacket;
+       }
+
+       sample_spec.rate = format->nSamplesPerSec;
+       sample_spec.channels = format->nChannels;
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       switch (format->wBitsPerSample)
+                       {
+                               case 8:
+                                       sample_spec.format = PA_SAMPLE_U8;
+                                       break;
+                               case 16:
+                                       sample_spec.format = PA_SAMPLE_S16LE;
+                                       break;
+                       }
+                       break;
+
+               case 6: /* A-LAW */
+                       sample_spec.format = PA_SAMPLE_ALAW;
+                       break;
+
+               case 7: /* U-LAW */
+                       sample_spec.format = PA_SAMPLE_ULAW;
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       sample_spec.format = PA_SAMPLE_S16LE;
+                       bs = (format->nBlockAlign - 4 * format->nChannels) * 4;
+                       pulse->frames_per_packet = (pulse->frames_per_packet * format->nChannels * 2 /
+                               bs + 1) * bs / (format->nChannels * 2);
+                       DEBUG_DVC("aligned FramesPerPacket=%d",
+                               pulse->frames_per_packet);
+                       break;
+       }
+
+       pulse->sample_spec = sample_spec;
+       pulse->format = format->wFormatTag;
+       pulse->block_size = format->nBlockAlign;
+}
+
+static void audin_pulse_stream_state_callback(pa_stream* stream, void* userdata)
+{
+       pa_stream_state_t state;
+       AudinPulseDevice* pulse = (AudinPulseDevice*) userdata;
+
+       state = pa_stream_get_state(stream);
+       switch (state)
+       {
+               case PA_STREAM_READY:
+                       DEBUG_DVC("PA_STREAM_READY");
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               case PA_STREAM_FAILED:
+               case PA_STREAM_TERMINATED:
+                       DEBUG_DVC("state %d", (int)state);
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               default:
+                       DEBUG_DVC("state %d", (int)state);
+                       break;
+       }
+}
+
+static void audin_pulse_stream_request_callback(pa_stream* stream, size_t length, void* userdata)
+{
+       int frames;
+       int cframes;
+       boolean ret;
+       const void* data;
+       const uint8* src;
+       int encoded_size;
+       uint8* encoded_data;
+       AudinPulseDevice* pulse = (AudinPulseDevice*) userdata;
+
+       pa_stream_peek(stream, &data, &length);
+       frames = length / pulse->bytes_per_frame;
+
+       DEBUG_DVC("length %d frames %d", (int) length, frames);
+
+       src = (const uint8*) data;
+       while (frames > 0)
+       {
+               cframes = pulse->frames_per_packet - pulse->buffer_frames;
+               if (cframes > frames)
+                       cframes = frames;
+               memcpy(pulse->buffer + pulse->buffer_frames * pulse->bytes_per_frame,
+                       src, cframes * pulse->bytes_per_frame);
+               pulse->buffer_frames += cframes;
+               if (pulse->buffer_frames >= pulse->frames_per_packet)
+               {
+                       if (pulse->format == 0x11)
+                       {
+                               encoded_data = dsp_encode_ima_adpcm(&pulse->adpcm,
+                                       pulse->buffer, pulse->buffer_frames * pulse->bytes_per_frame,
+                                       pulse->sample_spec.channels, pulse->block_size, &encoded_size);
+                               DEBUG_DVC("encoded %d to %d",
+                                       pulse->buffer_frames * pulse->bytes_per_frame, encoded_size);
+                       }
+                       else
+                       {
+                               encoded_data = pulse->buffer;
+                               encoded_size = pulse->buffer_frames * pulse->bytes_per_frame;
+                       }
+
+                       ret = pulse->receive(encoded_data, encoded_size, pulse->user_data);
+                       pulse->buffer_frames = 0;
+                       if (encoded_data != pulse->buffer)
+                               xfree(encoded_data);
+                       if (!ret)
+                               break;
+               }
+               src += cframes * pulse->bytes_per_frame;
+               frames -= cframes;
+       }
+
+       pa_stream_drop(stream);
+}
+
+
+static void audin_pulse_close(IAudinDevice* device)
+{
+       AudinPulseDevice* pulse = (AudinPulseDevice*) device;
+
+       if (!pulse->context || !pulse->stream)
+               return;
+
+       DEBUG_DVC("");
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       pa_stream_disconnect(pulse->stream);
+       pa_stream_unref(pulse->stream);
+       pulse->stream = NULL;
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+
+       pulse->receive = NULL;
+       pulse->user_data = NULL;
+       if (pulse->buffer)
+       {
+               xfree(pulse->buffer);
+               pulse->buffer = NULL;
+               pulse->buffer_frames = 0;
+       }
+}
+
+static void audin_pulse_open(IAudinDevice* device, AudinReceive receive, void* user_data)
+{
+       pa_stream_state_t state;
+       pa_buffer_attr buffer_attr = { 0 };
+       AudinPulseDevice* pulse = (AudinPulseDevice*) device;
+
+       if (!pulse->context)
+               return;
+       if (!pulse->sample_spec.rate || pulse->stream)
+               return;
+
+       DEBUG_DVC("");
+
+       pulse->receive = receive;
+       pulse->user_data = user_data;
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       pulse->stream = pa_stream_new(pulse->context, "freerdp_audin",
+               &pulse->sample_spec, NULL);
+       if (!pulse->stream)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_DVC("pa_stream_new failed (%d)",
+                       pa_context_errno(pulse->context));
+               return;
+       }
+       pulse->bytes_per_frame = pa_frame_size(&pulse->sample_spec);
+       pa_stream_set_state_callback(pulse->stream,
+               audin_pulse_stream_state_callback, pulse);
+       pa_stream_set_read_callback(pulse->stream,
+               audin_pulse_stream_request_callback, pulse);
+       buffer_attr.maxlength = (uint32_t) -1;
+       buffer_attr.tlength = (uint32_t) -1;
+       buffer_attr.prebuf = (uint32_t) -1;
+       buffer_attr.minreq = (uint32_t) -1;
+       /* 500ms latency */
+       buffer_attr.fragsize = pa_usec_to_bytes(500000, &pulse->sample_spec);
+       if (pa_stream_connect_record(pulse->stream,
+               pulse->device_name[0] ? pulse->device_name : NULL,
+               &buffer_attr, PA_STREAM_ADJUST_LATENCY) < 0)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_stream_connect_playback failed (%d)",
+                       pa_context_errno(pulse->context));
+               return;
+       }
+
+       for (;;)
+       {
+               state = pa_stream_get_state(pulse->stream);
+               if (state == PA_STREAM_READY)
+                       break;
+               if (!PA_STREAM_IS_GOOD(state))
+               {
+                       DEBUG_WARN("bad stream state (%d)",
+                               pa_context_errno(pulse->context));
+                       break;
+               }
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+       if (state == PA_STREAM_READY)
+       {
+               memset(&pulse->adpcm, 0, sizeof(ADPCM));
+               pulse->buffer = xzalloc(pulse->bytes_per_frame * pulse->frames_per_packet);
+               pulse->buffer_frames = 0;
+               DEBUG_DVC("connected");
+       }
+       else
+       {
+               audin_pulse_close(device);
+       }
+}
+
+int FreeRDPAudinDeviceEntry(PFREERDP_AUDIN_DEVICE_ENTRY_POINTS pEntryPoints)
+{
+       AudinPulseDevice* pulse;
+       RDP_PLUGIN_DATA * data;
+
+       pulse = xnew(AudinPulseDevice);
+
+       pulse->iface.Open = audin_pulse_open;
+       pulse->iface.FormatSupported = audin_pulse_format_supported;
+       pulse->iface.SetFormat = audin_pulse_set_format;
+       pulse->iface.Close = audin_pulse_close;
+       pulse->iface.Free = audin_pulse_free;
+
+       data = pEntryPoints->plugin_data;
+       if (data && data->data[0] && strcmp(data->data[0], "audin") == 0 &&
+               data->data[1] && strcmp(data->data[1], "pulse") == 0)
+       {
+               strncpy(pulse->device_name, (char*)data->data[2], sizeof(pulse->device_name));
+       }
+
+       pulse->mainloop = pa_threaded_mainloop_new();
+       if (!pulse->mainloop)
+       {
+               DEBUG_WARN("pa_threaded_mainloop_new failed");
+               audin_pulse_free((IAudinDevice*) pulse);
+               return 1;
+       }
+       pulse->context = pa_context_new(pa_threaded_mainloop_get_api(pulse->mainloop), "freerdp");
+       if (!pulse->context)
+       {
+               DEBUG_WARN("pa_context_new failed");
+               audin_pulse_free((IAudinDevice*) pulse);
+               return 1;
+       }
+       pa_context_set_state_callback(pulse->context, audin_pulse_context_state_callback, pulse);
+       if (!audin_pulse_connect((IAudinDevice*) pulse))
+       {
+               audin_pulse_free((IAudinDevice*) pulse);
+               return 1;
+       }
+
+       pEntryPoints->pRegisterAudinDevice(pEntryPoints->plugin, (IAudinDevice*) pulse);
+
+       return 0;
+}
+
diff --git a/channels/drdynvc/drdynvc_main.c b/channels/drdynvc/drdynvc_main.c
new file mode 100644 (file)
index 0000000..27ad531
--- /dev/null
@@ -0,0 +1,346 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Dynamic Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/utils/wait_obj.h>
+
+#include "dvcman.h"
+#include "drdynvc_types.h"
+#include "drdynvc_main.h"
+
+#define CREATE_REQUEST_PDU     0x01
+#define DATA_FIRST_PDU         0x02
+#define DATA_PDU               0x03
+#define CLOSE_REQUEST_PDU      0x04
+#define CAPABILITY_REQUEST_PDU 0x05
+
+struct drdynvc_plugin
+{
+       rdpSvcPlugin plugin;
+
+       int version;
+       int PriorityCharge0;
+       int PriorityCharge1;
+       int PriorityCharge2;
+       int PriorityCharge3;
+
+       IWTSVirtualChannelManager* channel_mgr;
+};
+
+static int drdynvc_write_variable_uint(STREAM* stream, uint32 val)
+{
+       int cb;
+
+       if (val <= 0xFF)
+       {
+               cb = 0;
+               stream_write_uint8(stream, val);
+       }
+       else if (val <= 0xFFFF)
+       {
+               cb = 1;
+               stream_write_uint16(stream, val);
+       }
+       else
+       {
+               cb = 3;
+               stream_write_uint32(stream, val);
+       }
+       return cb;
+}
+
+int drdynvc_write_data(drdynvcPlugin* drdynvc, uint32 ChannelId, uint8* data, uint32 data_size)
+{
+       STREAM* data_out;
+       uint32 pos = 0;
+       uint32 cbChId;
+       uint32 cbLen;
+       uint32 chunk_len;
+       int error;
+
+       DEBUG_DVC("ChannelId=%d size=%d", ChannelId, data_size);
+
+       data_out = stream_new(CHANNEL_CHUNK_LENGTH);
+       stream_set_pos(data_out, 1);
+       cbChId = drdynvc_write_variable_uint(data_out, ChannelId);
+
+       if (data_size <= CHANNEL_CHUNK_LENGTH - pos)
+       {
+               pos = stream_get_pos(data_out);
+               stream_set_pos(data_out, 0);
+               stream_write_uint8(data_out, 0x30 | cbChId);
+               stream_set_pos(data_out, pos);
+               stream_write(data_out, data, data_size);
+               error = svc_plugin_send((rdpSvcPlugin*)drdynvc, data_out);
+       }
+       else
+       {
+               /* Fragment the data */
+               cbLen = drdynvc_write_variable_uint(data_out, data_size);
+               pos = stream_get_pos(data_out);
+               stream_set_pos(data_out, 0);
+               stream_write_uint8(data_out, 0x20 | cbChId | (cbLen << 2));
+               stream_set_pos(data_out, pos);
+               chunk_len = CHANNEL_CHUNK_LENGTH - pos;
+               stream_write(data_out, data, chunk_len);
+               data += chunk_len;
+               data_size -= chunk_len;
+               error = svc_plugin_send((rdpSvcPlugin*)drdynvc, data_out);
+
+               while (error == CHANNEL_RC_OK && data_size > 0)
+               {
+                       data_out = stream_new(CHANNEL_CHUNK_LENGTH);
+                       stream_set_pos(data_out, 1);
+                       cbChId = drdynvc_write_variable_uint(data_out, ChannelId);
+
+                       pos = stream_get_pos(data_out);
+                       stream_set_pos(data_out, 0);
+                       stream_write_uint8(data_out, 0x30 | cbChId);
+                       stream_set_pos(data_out, pos);
+
+                       chunk_len = data_size;
+                       if (chunk_len > CHANNEL_CHUNK_LENGTH - pos)
+                               chunk_len = CHANNEL_CHUNK_LENGTH - pos;
+                       stream_write(data_out, data, chunk_len);
+                       data += chunk_len;
+                       data_size -= chunk_len;
+                       error = svc_plugin_send((rdpSvcPlugin*)drdynvc, data_out);
+               }
+       }
+       if (error != CHANNEL_RC_OK)
+       {
+               DEBUG_WARN("VirtualChannelWrite failed %d", error);
+               return 1;
+       }
+       return 0;
+}
+
+int drdynvc_push_event(drdynvcPlugin* drdynvc, RDP_EVENT* event)
+{
+       int error;
+
+       error = svc_plugin_send_event((rdpSvcPlugin*)drdynvc, event);
+       if (error != CHANNEL_RC_OK)
+       {
+               DEBUG_WARN("pVirtualChannelEventPush failed %d", error);
+               return 1;
+       }
+       return 0;
+}
+
+static int drdynvc_process_capability_request(drdynvcPlugin* drdynvc, int Sp, int cbChId, STREAM* s)
+{
+       STREAM* data_out;
+       int error;
+
+       DEBUG_DVC("Sp=%d cbChId=%d", Sp, cbChId);
+       stream_seek(s, 1); /* pad */
+       stream_read_uint16(s, drdynvc->version);
+       if (drdynvc->version == 2)
+       {
+               stream_read_uint16(s, drdynvc->PriorityCharge0);
+               stream_read_uint16(s, drdynvc->PriorityCharge1);
+               stream_read_uint16(s, drdynvc->PriorityCharge2);
+               stream_read_uint16(s, drdynvc->PriorityCharge3);
+       }
+       data_out = stream_new(4);
+       stream_write_uint16(data_out, 0x0050); /* Cmd+Sp+cbChId+Pad. Note: MSTSC sends 0x005c */
+       stream_write_uint16(data_out, drdynvc->version);
+       error = svc_plugin_send((rdpSvcPlugin*)drdynvc, data_out);
+       if (error != CHANNEL_RC_OK)
+       {
+               DEBUG_WARN("VirtualChannelWrite failed %d", error);
+               return 1;
+       }
+       return 0;
+}
+
+static uint32 drdynvc_read_variable_uint(STREAM* stream, int cbLen)
+{
+       uint32 val;
+
+       switch (cbLen)
+       {
+               case 0:
+                       stream_read_uint8(stream, val);
+                       break;
+               case 1:
+                       stream_read_uint16(stream, val);
+                       break;
+               default:
+                       stream_read_uint32(stream, val);
+                       break;
+       }
+       return val;
+}
+
+static int drdynvc_process_create_request(drdynvcPlugin* drdynvc, int Sp, int cbChId, STREAM* s)
+{
+       STREAM* data_out;
+       int pos;
+       int error;
+       uint32 ChannelId;
+
+       ChannelId = drdynvc_read_variable_uint(s, cbChId);
+       pos = stream_get_pos(s);
+       DEBUG_DVC("ChannelId=%d ChannelName=%s", ChannelId, stream_get_tail(s));
+
+       error = dvcman_create_channel(drdynvc->channel_mgr, ChannelId, (char*)stream_get_tail(s));
+
+       data_out = stream_new(pos + 4);
+       stream_write_uint8(data_out, 0x10 | cbChId);
+       stream_set_pos(s, 1);
+       stream_copy(data_out, s, pos - 1);
+       
+       if (error == 0)
+       {
+               DEBUG_DVC("channel created");
+               stream_write_uint32(data_out, 0);
+       }
+       else
+       {
+               DEBUG_DVC("no listener");
+               stream_write_uint32(data_out, (uint32)(-1));
+       }
+
+       error = svc_plugin_send((rdpSvcPlugin*)drdynvc, data_out);
+       if (error != CHANNEL_RC_OK)
+       {
+               DEBUG_WARN("VirtualChannelWrite failed %d", error);
+               return 1;
+       }
+       return 0;
+}
+
+static int drdynvc_process_data_first(drdynvcPlugin* drdynvc, int Sp, int cbChId, STREAM* s)
+{
+       uint32 ChannelId;
+       uint32 Length;
+       int error;
+
+       ChannelId = drdynvc_read_variable_uint(s, cbChId);
+       Length = drdynvc_read_variable_uint(s, Sp);
+       DEBUG_DVC("ChannelId=%d Length=%d", ChannelId, Length);
+
+       error = dvcman_receive_channel_data_first(drdynvc->channel_mgr, ChannelId, Length);
+       if (error)
+               return error;
+
+       return dvcman_receive_channel_data(drdynvc->channel_mgr, ChannelId,
+               stream_get_tail(s), stream_get_left(s));
+}
+
+static int drdynvc_process_data(drdynvcPlugin* drdynvc, int Sp, int cbChId, STREAM* s)
+{
+       uint32 ChannelId;
+
+       ChannelId = drdynvc_read_variable_uint(s, cbChId);
+       DEBUG_DVC("ChannelId=%d", ChannelId);
+
+       return dvcman_receive_channel_data(drdynvc->channel_mgr, ChannelId,
+               stream_get_tail(s), stream_get_left(s));
+}
+
+static int drdynvc_process_close_request(drdynvcPlugin* drdynvc, int Sp, int cbChId, STREAM* s)
+{
+       uint32 ChannelId;
+
+       ChannelId = drdynvc_read_variable_uint(s, cbChId);
+       DEBUG_DVC("ChannelId=%d", ChannelId);
+       dvcman_close_channel(drdynvc->channel_mgr, ChannelId);
+
+       return 0;
+}
+
+static void drdynvc_process_receive(rdpSvcPlugin* plugin, STREAM* s)
+{
+       drdynvcPlugin* drdynvc = (drdynvcPlugin*)plugin;
+       int value;
+       int Cmd;
+       int Sp;
+       int cbChId;
+
+       stream_read_uint8(s, value);
+       Cmd = (value & 0xf0) >> 4;
+       Sp = (value & 0x0c) >> 2;
+       cbChId = (value & 0x03) >> 0;
+
+       DEBUG_DVC("Cmd=0x%x", Cmd);
+
+       switch (Cmd)
+       {
+               case CAPABILITY_REQUEST_PDU:
+                       drdynvc_process_capability_request(drdynvc, Sp, cbChId, s);
+                       break;
+               case CREATE_REQUEST_PDU:
+                       drdynvc_process_create_request(drdynvc, Sp, cbChId, s);
+                       break;
+               case DATA_FIRST_PDU:
+                       drdynvc_process_data_first(drdynvc, Sp, cbChId, s);
+                       break;
+               case DATA_PDU:
+                       drdynvc_process_data(drdynvc, Sp, cbChId, s);
+                       break;
+               case CLOSE_REQUEST_PDU:
+                       drdynvc_process_close_request(drdynvc, Sp, cbChId, s);
+                       break;
+               default:
+                       DEBUG_WARN("unknown drdynvc cmd 0x%x", Cmd);
+                       break;
+       }
+
+       stream_free(s);
+}
+
+static void drdynvc_process_connect(rdpSvcPlugin* plugin)
+{
+       drdynvcPlugin* drdynvc = (drdynvcPlugin*)plugin;
+
+       DEBUG_DVC("connecting");
+
+       drdynvc->channel_mgr = dvcman_new(drdynvc);
+       dvcman_load_plugin(drdynvc->channel_mgr, svc_plugin_get_data(plugin));
+       dvcman_init(drdynvc->channel_mgr);
+}
+
+static void drdynvc_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       freerdp_event_free(event);
+}
+
+static void drdynvc_process_terminate(rdpSvcPlugin* plugin)
+{
+       drdynvcPlugin* drdynvc = (drdynvcPlugin*)plugin;
+
+       DEBUG_DVC("terminating");
+
+       if (drdynvc->channel_mgr != NULL)
+               dvcman_free(drdynvc->channel_mgr);
+       xfree(drdynvc);
+}
+
+DEFINE_SVC_PLUGIN(drdynvc, "drdynvc",
+       CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP |
+       CHANNEL_OPTION_COMPRESS_RDP)
diff --git a/channels/drdynvc/drdynvc_main.h b/channels/drdynvc/drdynvc_main.h
new file mode 100644 (file)
index 0000000..519c61d
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Dynamic Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DRDYNVC_MAIN_H
+#define __DRDYNVC_MAIN_H
+
+#include <freerdp/types.h>
+
+typedef struct drdynvc_plugin drdynvcPlugin;
+
+int drdynvc_write_data(drdynvcPlugin* plugin, uint32 ChannelId, uint8* data, uint32 data_size);
+int drdynvc_push_event(drdynvcPlugin* plugin, RDP_EVENT* event);
+
+#endif
diff --git a/channels/drdynvc/drdynvc_types.h b/channels/drdynvc/drdynvc_types.h
new file mode 100644 (file)
index 0000000..a08a605
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Dynamic Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DRDYNVC_TYPES_H
+#define __DRDYNVC_TYPES_H
+
+#include "config.h"
+#include <freerdp/dvc.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/debug.h>
+
+#ifdef WITH_DEBUG_DVC
+#define DEBUG_DVC(fmt, ...) DEBUG_CLASS(DVC, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_DVC(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif
diff --git a/channels/drdynvc/dvcman.c b/channels/drdynvc/dvcman.c
new file mode 100644 (file)
index 0000000..d24b114
--- /dev/null
@@ -0,0 +1,441 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Dynamic Virtual Channel Manager
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/load_plugin.h>
+
+#include "drdynvc_types.h"
+#include "dvcman.h"
+
+#define MAX_PLUGINS 10
+
+typedef struct _DVCMAN DVCMAN;
+struct _DVCMAN
+{
+       IWTSVirtualChannelManager iface;
+
+       drdynvcPlugin* drdynvc;
+
+       const char* plugin_names[MAX_PLUGINS];
+       IWTSPlugin* plugins[MAX_PLUGINS];
+       int num_plugins;
+
+       IWTSListener* listeners[MAX_PLUGINS];
+       int num_listeners;
+
+       LIST* channels;
+};
+
+typedef struct _DVCMAN_LISTENER DVCMAN_LISTENER;
+struct _DVCMAN_LISTENER
+{
+       IWTSListener iface;
+
+       DVCMAN* dvcman;
+       char* channel_name;
+       uint32 flags;
+       IWTSListenerCallback* listener_callback;
+};
+
+typedef struct _DVCMAN_ENTRY_POINTS DVCMAN_ENTRY_POINTS;
+struct _DVCMAN_ENTRY_POINTS
+{
+       IDRDYNVC_ENTRY_POINTS iface;
+
+       DVCMAN* dvcman;
+       RDP_PLUGIN_DATA* plugin_data;
+};
+
+typedef struct _DVCMAN_CHANNEL DVCMAN_CHANNEL;
+struct _DVCMAN_CHANNEL
+{
+       IWTSVirtualChannel iface;
+
+       DVCMAN* dvcman;
+       DVCMAN_CHANNEL* next;
+       uint32 channel_id;
+       IWTSVirtualChannelCallback* channel_callback;
+
+       STREAM* dvc_data;
+};
+
+static int dvcman_get_configuration(IWTSListener* pListener, void** ppPropertyBag)
+{
+       *ppPropertyBag = NULL;
+       return 1;
+}
+
+static int dvcman_create_listener(IWTSVirtualChannelManager* pChannelMgr,
+       const char* pszChannelName, uint32 ulFlags,
+       IWTSListenerCallback* pListenerCallback, IWTSListener** ppListener)
+{
+       DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
+       DVCMAN_LISTENER* listener;
+
+       if (dvcman->num_listeners < MAX_PLUGINS)
+       {
+               DEBUG_DVC("%d.%s.", dvcman->num_listeners, pszChannelName);
+               listener = xnew(DVCMAN_LISTENER);
+               listener->iface.GetConfiguration = dvcman_get_configuration;
+               listener->dvcman = dvcman;
+               listener->channel_name = xstrdup(pszChannelName);
+               listener->flags = ulFlags;
+               listener->listener_callback = pListenerCallback;
+
+               if (ppListener)
+                       *ppListener = (IWTSListener*)listener;
+               dvcman->listeners[dvcman->num_listeners++] = (IWTSListener*)listener;
+               return 0;
+       }
+       else
+       {
+               DEBUG_WARN("Maximum DVC listener number reached.");
+               return 1;
+       }
+}
+
+static int dvcman_push_event(IWTSVirtualChannelManager* pChannelMgr, RDP_EVENT* pEvent)
+{
+       int error;
+       DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
+
+       error = drdynvc_push_event(dvcman->drdynvc, pEvent);
+
+       if (error == 0)
+       {
+               DEBUG_DVC("event_type %d pushed.", pEvent->event_type);
+       }
+       else
+       {
+               DEBUG_WARN("event_type %d push failed.", pEvent->event_type);
+       }
+
+       return error;
+}
+
+static int dvcman_register_plugin(IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* name, IWTSPlugin* pPlugin)
+{
+       DVCMAN* dvcman = ((DVCMAN_ENTRY_POINTS*) pEntryPoints)->dvcman;
+
+       if (dvcman->num_plugins < MAX_PLUGINS)
+       {
+               DEBUG_DVC("num_plugins %d", dvcman->num_plugins);
+               dvcman->plugin_names[dvcman->num_plugins] = name;
+               dvcman->plugins[dvcman->num_plugins++] = pPlugin;
+               return 0;
+       }
+       else
+       {
+               DEBUG_WARN("Maximum DVC plugin number reached.");
+               return 1;
+       }
+}
+
+IWTSPlugin* dvcman_get_plugin(IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* name)
+{
+       int i;
+       DVCMAN* dvcman = ((DVCMAN_ENTRY_POINTS*) pEntryPoints)->dvcman;
+
+       for (i = 0; i < dvcman->num_plugins; i++)
+       {
+               if (dvcman->plugin_names[i] == name ||
+                       strcmp(dvcman->plugin_names[i], name) == 0)
+               {
+                       return dvcman->plugins[i];
+               }
+       }
+
+       return NULL;
+}
+
+RDP_PLUGIN_DATA* dvcman_get_plugin_data(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
+{
+       return ((DVCMAN_ENTRY_POINTS*) pEntryPoints)->plugin_data;
+}
+
+IWTSVirtualChannelManager* dvcman_new(drdynvcPlugin* plugin)
+{
+       DVCMAN* dvcman;
+
+       dvcman = xnew(DVCMAN);
+       dvcman->iface.CreateListener = dvcman_create_listener;
+       dvcman->iface.PushEvent = dvcman_push_event;
+       dvcman->drdynvc = plugin;
+       dvcman->channels = list_new();
+
+       return (IWTSVirtualChannelManager*) dvcman;
+}
+
+int dvcman_load_plugin(IWTSVirtualChannelManager* pChannelMgr, RDP_PLUGIN_DATA* data)
+{
+       DVCMAN_ENTRY_POINTS entryPoints;
+       PDVC_PLUGIN_ENTRY pDVCPluginEntry = NULL;
+
+       while (data && data->size > 0)
+       {
+               pDVCPluginEntry = freerdp_load_plugin((char*) data->data[0], "DVCPluginEntry");
+
+               if (pDVCPluginEntry != NULL)
+               {
+                       entryPoints.iface.RegisterPlugin = dvcman_register_plugin;
+                       entryPoints.iface.GetPlugin = dvcman_get_plugin;
+                       entryPoints.iface.GetPluginData = dvcman_get_plugin_data;
+                       entryPoints.dvcman = (DVCMAN*) pChannelMgr;
+                       entryPoints.plugin_data = data;
+                       pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints);
+               }
+               
+               data = (RDP_PLUGIN_DATA*)(((void*) data) + data->size);
+       }
+
+       return 0;
+}
+
+static void dvcman_channel_free(DVCMAN_CHANNEL* channel)
+{
+       if (channel->channel_callback)
+               channel->channel_callback->OnClose(channel->channel_callback);
+
+       xfree(channel);
+}
+
+void dvcman_free(IWTSVirtualChannelManager* pChannelMgr)
+{
+       int i;
+       IWTSPlugin* pPlugin;
+       DVCMAN_LISTENER* listener;
+       DVCMAN_CHANNEL* channel;
+       DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
+
+       while ((channel = (DVCMAN_CHANNEL*) list_dequeue(dvcman->channels)) != NULL)
+               dvcman_channel_free(channel);
+
+       list_free(dvcman->channels);
+
+       for (i = 0; i < dvcman->num_listeners; i++)
+       {
+               listener = (DVCMAN_LISTENER*) dvcman->listeners[i];
+               xfree(listener->channel_name);
+               xfree(listener);
+       }
+
+       for (i = 0; i < dvcman->num_plugins; i++)
+       {
+               pPlugin = dvcman->plugins[i];
+
+               if (pPlugin->Terminated)
+                       pPlugin->Terminated(pPlugin);
+       }
+
+       xfree(dvcman);
+}
+
+int dvcman_init(IWTSVirtualChannelManager* pChannelMgr)
+{
+       int i;
+       IWTSPlugin* pPlugin;
+       DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
+
+       for (i = 0; i < dvcman->num_plugins; i++)
+       {
+               pPlugin = dvcman->plugins[i];
+
+               if (pPlugin->Initialize)
+                       pPlugin->Initialize(pPlugin, pChannelMgr);
+       }
+
+       return 0;
+}
+
+static int dvcman_write_channel(IWTSVirtualChannel* pChannel, uint32 cbSize, uint8* pBuffer, void* pReserved)
+{
+       DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*) pChannel;
+
+       return drdynvc_write_data(channel->dvcman->drdynvc, channel->channel_id, pBuffer, cbSize);
+}
+
+static int dvcman_close_channel_iface(IWTSVirtualChannel* pChannel)
+{
+       DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*) pChannel;
+       DVCMAN* dvcman = channel->dvcman;
+
+       DEBUG_DVC("id=%d", channel->channel_id);
+
+       if (list_remove(dvcman->channels, channel) == NULL)
+               DEBUG_WARN("channel not found");
+
+       dvcman_channel_free(channel);
+
+       return 1;
+}
+
+int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, const char* ChannelName)
+{
+       int i;
+       int bAccept;
+       DVCMAN_LISTENER* listener;
+       DVCMAN_CHANNEL* channel;
+       IWTSVirtualChannelCallback* pCallback;
+       DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
+
+       for (i = 0; i < dvcman->num_listeners; i++)
+       {
+               listener = (DVCMAN_LISTENER*)dvcman->listeners[i];
+
+               if (strcmp(listener->channel_name, ChannelName) == 0)
+               {
+                       channel = xnew(DVCMAN_CHANNEL);
+                       channel->iface.Write = dvcman_write_channel;
+                       channel->iface.Close = dvcman_close_channel_iface;
+                       channel->dvcman = dvcman;
+                       channel->channel_id = ChannelId;
+
+                       bAccept = 1;
+                       pCallback = NULL;
+
+                       if (listener->listener_callback->OnNewChannelConnection(listener->listener_callback,
+                               (IWTSVirtualChannel*) channel, NULL, &bAccept, &pCallback) == 0 && bAccept == 1)
+                       {
+                               DEBUG_DVC("listener %s created new channel %d",
+                                         listener->channel_name, channel->channel_id);
+                               channel->channel_callback = pCallback;
+                               list_add(dvcman->channels, channel);
+
+                               return 0;
+                       }
+                       else
+                       {
+                               DEBUG_WARN("channel rejected by plugin");
+                               dvcman_channel_free(channel);
+                               return 1;
+                       }
+               }
+       }
+
+       return 1;
+}
+
+static DVCMAN_CHANNEL* dvcman_find_channel_by_id(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId)
+{
+       LIST_ITEM* curr;
+       DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
+
+       for (curr = dvcman->channels->head; curr; curr = curr->next)
+       {
+               if (((DVCMAN_CHANNEL*) curr->data)->channel_id == ChannelId)
+               {
+                       return (DVCMAN_CHANNEL*)curr->data;
+               }
+       }
+
+       return NULL;
+}
+
+int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId)
+{
+       DVCMAN_CHANNEL* channel;
+       IWTSVirtualChannel* ichannel;
+
+       channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId);
+
+       if (channel == NULL)
+       {
+               DEBUG_WARN("ChannelId %d not found!", ChannelId);
+               return 1;
+       }
+
+       if (channel->dvc_data)
+       {
+               stream_free(channel->dvc_data);
+               channel->dvc_data = NULL;
+       }
+
+       DEBUG_DVC("dvcman_close_channel: channel %d closed", ChannelId);
+       ichannel = (IWTSVirtualChannel*)channel;
+       ichannel->Close(ichannel);
+
+       return 0;
+}
+
+int dvcman_receive_channel_data_first(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, uint32 length)
+{
+       DVCMAN_CHANNEL* channel;
+
+       channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId);
+
+       if (channel == NULL)
+       {
+               DEBUG_WARN("ChannelId %d not found!", ChannelId);
+               return 1;
+       }
+
+       if (channel->dvc_data)
+               stream_free(channel->dvc_data);
+
+       channel->dvc_data = stream_new(length);
+
+       return 0;
+}
+
+int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, uint8* data, uint32 data_size)
+{
+       int error = 0;
+       DVCMAN_CHANNEL* channel;
+
+       channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId);
+
+       if (channel == NULL)
+       {
+               DEBUG_WARN("ChannelId %d not found!", ChannelId);
+               return 1;
+       }
+
+       if (channel->dvc_data)
+       {
+               /* Fragmented data */
+               if (stream_get_length(channel->dvc_data) + data_size > stream_get_size(channel->dvc_data))
+               {
+                       DEBUG_WARN("data exceeding declared length!");
+                       stream_free(channel->dvc_data);
+                       channel->dvc_data = NULL;
+                       return 1;
+               }
+
+               stream_write(channel->dvc_data, data, data_size);
+
+               if (stream_get_length(channel->dvc_data) >= stream_get_size(channel->dvc_data))
+               {
+                       error = channel->channel_callback->OnDataReceived(channel->channel_callback,
+                               stream_get_size(channel->dvc_data), stream_get_data(channel->dvc_data));
+                       stream_free(channel->dvc_data);
+                       channel->dvc_data = NULL;
+               }
+       }
+       else
+       {
+               error = channel->channel_callback->OnDataReceived(channel->channel_callback, data_size, data);
+       }
+
+       return error;
+}
diff --git a/channels/drdynvc/dvcman.h b/channels/drdynvc/dvcman.h
new file mode 100644 (file)
index 0000000..679243f
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Dynamic Virtual Channel Manager
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DVCMAN_H
+#define __DVCMAN_H
+
+#include <freerdp/dvc.h>
+#include "drdynvc_main.h"
+
+IWTSVirtualChannelManager* dvcman_new(drdynvcPlugin* plugin);
+int dvcman_load_plugin(IWTSVirtualChannelManager* pChannelMgr, RDP_PLUGIN_DATA* data);
+void dvcman_free(IWTSVirtualChannelManager* pChannelMgr);
+int dvcman_init(IWTSVirtualChannelManager* pChannelMgr);
+int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, const char* ChannelName);
+int dvcman_close_channel(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId);
+int dvcman_receive_channel_data_first(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, uint32 length);
+int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, uint8* data, uint32 data_size);
+
+#endif
diff --git a/channels/drdynvc/tsmf/CMakeLists.txt b/channels/drdynvc/tsmf/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e28cac6
--- /dev/null
@@ -0,0 +1,57 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(TSMF_SRCS
+       tsmf_audio.c
+       tsmf_audio.h
+       tsmf_codec.c
+       tsmf_codec.h
+       tsmf_constants.h
+       tsmf_decoder.c
+       tsmf_decoder.h
+       tsmf_ifman.c
+       tsmf_ifman.h
+       tsmf_main.c
+       tsmf_main.h
+       tsmf_media.c
+       tsmf_media.h
+       tsmf_types.h
+)
+
+include_directories(..)
+
+add_library(tsmf ${TSMF_SRCS})
+set_target_properties(tsmf PROPERTIES PREFIX "")
+
+target_link_libraries(tsmf freerdp-utils)
+
+install(TARGETS tsmf DESTINATION ${FREERDP_PLUGIN_PATH})
+
+if(WITH_FFMPEG)
+       add_subdirectory(ffmpeg)
+endif()
+
+if(WITH_ALSA)
+       add_subdirectory(alsa)
+endif()
+
+if(WITH_PULSEAUDIO)
+       add_subdirectory(pulse)
+endif()
+
diff --git a/channels/drdynvc/tsmf/alsa/CMakeLists.txt b/channels/drdynvc/tsmf/alsa/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c769a18
--- /dev/null
@@ -0,0 +1,34 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(TSMF_ALSA_SRCS
+       tsmf_alsa.c
+)
+
+include_directories(..)
+include_directories(${ALSA_INCLUDE_DIRS})
+
+add_library(tsmf_alsa ${TSMF_ALSA_SRCS})
+set_target_properties(tsmf_alsa PROPERTIES PREFIX "")
+
+target_link_libraries(tsmf_alsa freerdp-utils)
+target_link_libraries(tsmf_alsa ${ALSA_LIBRARIES})
+
+install(TARGETS tsmf_alsa DESTINATION ${FREERDP_PLUGIN_PATH})
+
diff --git a/channels/drdynvc/tsmf/alsa/tsmf_alsa.c b/channels/drdynvc/tsmf/alsa/tsmf_alsa.c
new file mode 100644 (file)
index 0000000..3017dac
--- /dev/null
@@ -0,0 +1,263 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - ALSA Audio Device
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <alsa/asoundlib.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/dsp.h>
+
+#include "tsmf_audio.h"
+
+typedef struct _TSMFALSAAudioDevice
+{
+       ITSMFAudioDevice iface;
+
+       char device[32];
+       snd_pcm_t* out_handle;
+       uint32 source_rate;
+       uint32 actual_rate;
+       uint32 source_channels;
+       uint32 actual_channels;
+       uint32 bytes_per_sample;
+} TSMFALSAAudioDevice;
+
+static boolean tsmf_alsa_open_device(TSMFALSAAudioDevice* alsa)
+{
+       int error;
+
+       error = snd_pcm_open(&alsa->out_handle, alsa->device, SND_PCM_STREAM_PLAYBACK, 0);
+       if (error < 0)
+       {
+               DEBUG_WARN("failed to open device %s", alsa->device);
+               return false;
+       }
+
+       DEBUG_DVC("open device %s", alsa->device);
+       return true;
+}
+
+static boolean tsmf_alsa_open(ITSMFAudioDevice* audio, const char* device)
+{
+       TSMFALSAAudioDevice* alsa = (TSMFALSAAudioDevice*) audio;
+
+       if (!device)
+       {
+               if (!alsa->device[0])
+                       strcpy(alsa->device, "default");
+       }
+       else
+       {
+               strcpy(alsa->device, device);
+       }
+
+       return tsmf_alsa_open_device(alsa);
+}
+
+static boolean tsmf_alsa_set_format(ITSMFAudioDevice* audio,
+       uint32 sample_rate, uint32 channels, uint32 bits_per_sample)
+{
+       int error;
+       snd_pcm_uframes_t frames;
+       snd_pcm_hw_params_t* hw_params;
+       snd_pcm_sw_params_t* sw_params;
+       TSMFALSAAudioDevice* alsa = (TSMFALSAAudioDevice*) audio;
+
+       if (!alsa->out_handle)
+               return false;
+
+       snd_pcm_drop(alsa->out_handle);
+
+       alsa->actual_rate = alsa->source_rate = sample_rate;
+       alsa->actual_channels = alsa->source_channels = channels;
+       alsa->bytes_per_sample = bits_per_sample / 8;
+
+       error = snd_pcm_hw_params_malloc(&hw_params);
+       if (error < 0)
+       {
+               DEBUG_WARN("snd_pcm_hw_params_malloc failed");
+               return false;
+       }
+       snd_pcm_hw_params_any(alsa->out_handle, hw_params);
+       snd_pcm_hw_params_set_access(alsa->out_handle, hw_params,
+               SND_PCM_ACCESS_RW_INTERLEAVED);
+       snd_pcm_hw_params_set_format(alsa->out_handle, hw_params,
+               SND_PCM_FORMAT_S16_LE);
+       snd_pcm_hw_params_set_rate_near(alsa->out_handle, hw_params,
+               &alsa->actual_rate, NULL);
+       snd_pcm_hw_params_set_channels_near(alsa->out_handle, hw_params,
+               &alsa->actual_channels);
+       frames = sample_rate;
+       snd_pcm_hw_params_set_buffer_size_near(alsa->out_handle, hw_params,
+               &frames);
+       snd_pcm_hw_params(alsa->out_handle, hw_params);
+       snd_pcm_hw_params_free(hw_params);
+
+       error = snd_pcm_sw_params_malloc(&sw_params);
+       if (error < 0)
+       {
+               DEBUG_WARN("snd_pcm_sw_params_malloc");
+               return false;
+       }
+       snd_pcm_sw_params_current(alsa->out_handle, sw_params);
+       snd_pcm_sw_params_set_start_threshold(alsa->out_handle, sw_params,
+               frames / 2);
+       snd_pcm_sw_params(alsa->out_handle, sw_params);
+       snd_pcm_sw_params_free(sw_params);
+
+       snd_pcm_prepare(alsa->out_handle);
+
+       DEBUG_DVC("sample_rate %d channels %d bits_per_sample %d",
+               sample_rate, channels, bits_per_sample);
+       DEBUG_DVC("hardware buffer %d frames", (int)frames);
+       if ((alsa->actual_rate != alsa->source_rate) ||
+               (alsa->actual_channels != alsa->source_channels))
+       {
+               DEBUG_DVC("actual rate %d / channel %d is different "
+                       "from source rate %d / channel %d, resampling required.",
+                       alsa->actual_rate, alsa->actual_channels,
+                       alsa->source_rate, alsa->source_channels);
+       }
+       return true;
+}
+
+static boolean tsmf_alsa_play(ITSMFAudioDevice* audio, uint8* data, uint32 data_size)
+{
+       int len;
+       int error;
+       int frames;
+       uint8* end;
+       uint8* src;
+       uint8* pindex;
+       int rbytes_per_frame;
+       int sbytes_per_frame;
+       uint8* resampled_data;
+       TSMFALSAAudioDevice* alsa = (TSMFALSAAudioDevice*) audio;
+
+       DEBUG_DVC("data_size %d", data_size);
+
+       if (alsa->out_handle)
+       {
+               sbytes_per_frame = alsa->source_channels * alsa->bytes_per_sample;
+               rbytes_per_frame = alsa->actual_channels * alsa->bytes_per_sample;
+
+               if ((alsa->source_rate == alsa->actual_rate) &&
+                       (alsa->source_channels == alsa->actual_channels))
+               {
+                       resampled_data = NULL;
+                       src = data;
+               }
+               else
+               {
+                       resampled_data = dsp_resample(data, alsa->bytes_per_sample,
+                               alsa->source_channels, alsa->source_rate, data_size / sbytes_per_frame,
+                               alsa->actual_channels, alsa->actual_rate, &frames);
+                       DEBUG_DVC("resampled %d frames at %d to %d frames at %d",
+                               data_size / sbytes_per_frame, alsa->source_rate, frames, alsa->actual_rate);
+                       data_size = frames * rbytes_per_frame;
+                       src = resampled_data;
+               }
+
+               pindex = src;
+               end = pindex + data_size;
+               while (pindex < end)
+               {
+                       len = end - pindex;
+                       frames = len / rbytes_per_frame;
+                       error = snd_pcm_writei(alsa->out_handle, pindex, frames);
+                       if (error == -EPIPE)
+                       {
+                               snd_pcm_recover(alsa->out_handle, error, 0);
+                               error = 0;
+                       }
+                       else if (error < 0)
+                       {
+                               DEBUG_DVC("error len %d", error);
+                               snd_pcm_close(alsa->out_handle);
+                               alsa->out_handle = 0;
+                               tsmf_alsa_open_device(alsa);
+                               break;
+                       }
+                       DEBUG_DVC("%d frames played.", error);
+                       if (error == 0)
+                               break;
+                       pindex += error * rbytes_per_frame;
+               }
+
+               if (resampled_data)
+                       xfree(resampled_data);
+       }
+       xfree(data);
+
+       return true;
+}
+
+static uint64 tsmf_alsa_get_latency(ITSMFAudioDevice* audio)
+{
+       uint64 latency = 0;
+       snd_pcm_sframes_t frames = 0;
+       TSMFALSAAudioDevice* alsa = (TSMFALSAAudioDevice*) audio;
+
+       if (alsa->out_handle && alsa->actual_rate > 0 &&
+               snd_pcm_delay(alsa->out_handle, &frames) == 0 &&
+               frames > 0)
+       {
+               latency = ((uint64)frames) * 10000000LL / (uint64)alsa->actual_rate;
+       }
+       return latency;
+}
+
+static void tsmf_alsa_flush(ITSMFAudioDevice* audio)
+{
+}
+
+static void tsmf_alsa_free(ITSMFAudioDevice* audio)
+{
+       TSMFALSAAudioDevice* alsa = (TSMFALSAAudioDevice*) audio;
+
+       DEBUG_DVC("");
+
+       if (alsa->out_handle)
+       {
+               snd_pcm_drain(alsa->out_handle);
+               snd_pcm_close(alsa->out_handle);
+       }
+       xfree(alsa);
+}
+
+ITSMFAudioDevice* TSMFAudioDeviceEntry(void)
+{
+       TSMFALSAAudioDevice* alsa;
+
+       alsa = xnew(TSMFALSAAudioDevice);
+
+       alsa->iface.Open = tsmf_alsa_open;
+       alsa->iface.SetFormat = tsmf_alsa_set_format;
+       alsa->iface.Play = tsmf_alsa_play;
+       alsa->iface.GetLatency = tsmf_alsa_get_latency;
+       alsa->iface.Flush = tsmf_alsa_flush;
+       alsa->iface.Free = tsmf_alsa_free;
+
+       return (ITSMFAudioDevice*) alsa;
+}
+
diff --git a/channels/drdynvc/tsmf/ffmpeg/CMakeLists.txt b/channels/drdynvc/tsmf/ffmpeg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..ea0b101
--- /dev/null
@@ -0,0 +1,34 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(TSMF_FFMPEG_SRCS
+       tsmf_ffmpeg.c
+)
+
+include_directories(..)
+include_directories(${FFMPEG_INCLUDE_DIRS})
+
+add_library(tsmf_ffmpeg ${TSMF_FFMPEG_SRCS})
+set_target_properties(tsmf_ffmpeg PROPERTIES PREFIX "")
+
+target_link_libraries(tsmf_ffmpeg freerdp-utils)
+target_link_libraries(tsmf_ffmpeg ${FFMPEG_LIBRARIES})
+
+install(TARGETS tsmf_ffmpeg DESTINATION ${FREERDP_PLUGIN_PATH})
+
diff --git a/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c b/channels/drdynvc/tsmf/ffmpeg/tsmf_ffmpeg.c
new file mode 100644 (file)
index 0000000..4210fa0
--- /dev/null
@@ -0,0 +1,518 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - FFmpeg Decoder
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/plugins/tsmf.h>
+#include <libavcodec/avcodec.h>
+
+#include "tsmf_constants.h"
+#include "tsmf_decoder.h"
+
+/* Compatibility with older FFmpeg */
+#if LIBAVUTIL_VERSION_MAJOR < 50
+#define AVMEDIA_TYPE_VIDEO 0
+#define AVMEDIA_TYPE_AUDIO 1
+#endif
+
+typedef struct _TSMFFFmpegDecoder
+{
+       ITSMFDecoder iface;
+
+       int media_type;
+       enum CodecID codec_id;
+       AVCodecContext* codec_context;
+       AVCodec* codec;
+       AVFrame* frame;
+       int prepared;
+
+       uint8* decoded_data;
+       uint32 decoded_size;
+       uint32 decoded_size_max;
+} TSMFFFmpegDecoder;
+
+static boolean tsmf_ffmpeg_init_context(ITSMFDecoder* decoder)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       mdecoder->codec_context = avcodec_alloc_context();
+       if (!mdecoder->codec_context)
+       {
+               DEBUG_WARN("avcodec_alloc_context failed.");
+               return false;
+       }
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_init_video_stream(ITSMFDecoder* decoder, const TS_AM_MEDIA_TYPE* media_type)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       mdecoder->codec_context->width = media_type->Width;
+       mdecoder->codec_context->height = media_type->Height;
+       mdecoder->codec_context->bit_rate = media_type->BitRate;
+       mdecoder->codec_context->time_base.den = media_type->SamplesPerSecond.Numerator;
+       mdecoder->codec_context->time_base.num = media_type->SamplesPerSecond.Denominator;
+
+       mdecoder->frame = avcodec_alloc_frame();
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_init_audio_stream(ITSMFDecoder* decoder, const TS_AM_MEDIA_TYPE* media_type)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       mdecoder->codec_context->sample_rate = media_type->SamplesPerSecond.Numerator;
+       mdecoder->codec_context->bit_rate = media_type->BitRate;
+       mdecoder->codec_context->channels = media_type->Channels;
+       mdecoder->codec_context->block_align = media_type->BlockAlign;
+
+#ifdef AV_CPU_FLAG_SSE2
+       mdecoder->codec_context->dsp_mask = AV_CPU_FLAG_SSE2 | AV_CPU_FLAG_MMX2;
+#else
+#if LIBAVCODEC_VERSION_MAJOR < 53
+       mdecoder->codec_context->dsp_mask = FF_MM_SSE2 | FF_MM_MMXEXT;
+#else
+       mdecoder->codec_context->dsp_mask = FF_MM_SSE2 | FF_MM_MMX2;
+#endif
+#endif
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_init_stream(ITSMFDecoder* decoder, const TS_AM_MEDIA_TYPE* media_type)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+       uint32 size;
+       const uint8* s;
+       uint8* p;
+
+       mdecoder->codec = avcodec_find_decoder(mdecoder->codec_id);
+       if (!mdecoder->codec)
+       {
+               DEBUG_WARN("avcodec_find_decoder failed.");
+               return false;
+       }
+
+       mdecoder->codec_context->codec_id = mdecoder->codec_id;
+       mdecoder->codec_context->codec_type = mdecoder->media_type;
+
+       if (mdecoder->media_type == AVMEDIA_TYPE_VIDEO)
+       {
+               if (!tsmf_ffmpeg_init_video_stream(decoder, media_type))
+                       return false;
+       }
+       else if (mdecoder->media_type == AVMEDIA_TYPE_AUDIO)
+       {
+               if (!tsmf_ffmpeg_init_audio_stream(decoder, media_type))
+                       return false;
+       }
+
+       if (media_type->ExtraData)
+       {
+               if (media_type->SubType == TSMF_SUB_TYPE_AVC1 &&
+                       media_type->FormatType == TSMF_FORMAT_TYPE_MPEG2VIDEOINFO)
+               {
+                       /* The extradata format that FFmpeg uses is following CodecPrivate in Matroska.
+                          See http://haali.su/mkv/codecs.pdf */
+                       mdecoder->codec_context->extradata_size = media_type->ExtraDataSize + 8;
+                       mdecoder->codec_context->extradata = xzalloc(mdecoder->codec_context->extradata_size);
+                       p = mdecoder->codec_context->extradata;
+                       *p++ = 1; /* Reserved? */
+                       *p++ = media_type->ExtraData[8]; /* Profile */
+                       *p++ = 0; /* Profile */
+                       *p++ = media_type->ExtraData[12]; /* Level */
+                       *p++ = 0xff; /* Flag? */
+                       *p++ = 0xe0 | 0x01; /* Reserved | #sps */
+                       s = media_type->ExtraData + 20;
+                       size = ((uint32)(*s)) * 256 + ((uint32)(*(s + 1)));
+                       memcpy(p, s, size + 2);
+                       s += size + 2;
+                       p += size + 2;
+                       *p++ = 1; /* #pps */
+                       size = ((uint32)(*s)) * 256 + ((uint32)(*(s + 1)));
+                       memcpy(p, s, size + 2);
+               }
+               else
+               {
+                       /* Add a padding to avoid invalid memory read in some codec */
+                       mdecoder->codec_context->extradata_size = media_type->ExtraDataSize + 8;
+                       mdecoder->codec_context->extradata = xzalloc(mdecoder->codec_context->extradata_size);
+                       memcpy(mdecoder->codec_context->extradata, media_type->ExtraData, media_type->ExtraDataSize);
+                       memset(mdecoder->codec_context->extradata + media_type->ExtraDataSize, 0, 8);
+               }
+       }
+
+       if (mdecoder->codec->capabilities & CODEC_CAP_TRUNCATED)
+               mdecoder->codec_context->flags |= CODEC_FLAG_TRUNCATED;
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_prepare(ITSMFDecoder* decoder)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       if (avcodec_open(mdecoder->codec_context, mdecoder->codec) < 0)
+       {
+               DEBUG_WARN("avcodec_open failed.");
+               return false;
+       }
+
+       mdecoder->prepared = 1;
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_set_format(ITSMFDecoder* decoder, TS_AM_MEDIA_TYPE* media_type)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       switch (media_type->MajorType)
+       {
+               case TSMF_MAJOR_TYPE_VIDEO:
+                       mdecoder->media_type = AVMEDIA_TYPE_VIDEO;
+                       break;
+               case TSMF_MAJOR_TYPE_AUDIO:
+                       mdecoder->media_type = AVMEDIA_TYPE_AUDIO;
+                       break;
+               default:
+                       return false;
+       }
+       switch (media_type->SubType)
+       {
+               case TSMF_SUB_TYPE_WVC1:
+                       mdecoder->codec_id = CODEC_ID_VC1;
+                       break;
+               case TSMF_SUB_TYPE_WMA2:
+                       mdecoder->codec_id = CODEC_ID_WMAV2;
+                       break;
+               case TSMF_SUB_TYPE_WMA9:
+                       mdecoder->codec_id = CODEC_ID_WMAPRO;
+                       break;
+               case TSMF_SUB_TYPE_MP3:
+                       mdecoder->codec_id = CODEC_ID_MP3;
+                       break;
+               case TSMF_SUB_TYPE_MP2A:
+                       mdecoder->codec_id = CODEC_ID_MP2;
+                       break;
+               case TSMF_SUB_TYPE_MP2V:
+                       mdecoder->codec_id = CODEC_ID_MPEG2VIDEO;
+                       break;
+               case TSMF_SUB_TYPE_WMV3:
+                       mdecoder->codec_id = CODEC_ID_WMV3;
+                       break;
+               case TSMF_SUB_TYPE_AAC:
+                       mdecoder->codec_id = CODEC_ID_AAC;
+                       /* For AAC the pFormat is a HEAACWAVEINFO struct, and the codec data
+                          is at the end of it. See
+                          http://msdn.microsoft.com/en-us/library/dd757806.aspx */
+                       if (media_type->ExtraData)
+                       {
+                               media_type->ExtraData += 12;
+                               media_type->ExtraDataSize -= 12;
+                       }
+                       break;
+               case TSMF_SUB_TYPE_H264:
+               case TSMF_SUB_TYPE_AVC1:
+                       mdecoder->codec_id = CODEC_ID_H264;
+                       break;
+               case TSMF_SUB_TYPE_AC3:
+                       mdecoder->codec_id = CODEC_ID_AC3;
+                       break;
+               default:
+                       return false;
+       }
+
+       if (!tsmf_ffmpeg_init_context(decoder))
+               return false;
+       if (!tsmf_ffmpeg_init_stream(decoder, media_type))
+               return false;
+       if (!tsmf_ffmpeg_prepare(decoder))
+               return false;
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_decode_video(ITSMFDecoder* decoder, const uint8* data, uint32 data_size, uint32 extensions)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+       int decoded;
+       int len;
+       AVFrame* frame;
+       boolean ret = true;
+
+#if LIBAVCODEC_VERSION_MAJOR < 52 || (LIBAVCODEC_VERSION_MAJOR == 52 && LIBAVCODEC_VERSION_MINOR <= 20)
+       len = avcodec_decode_video(mdecoder->codec_context, mdecoder->frame, &decoded, data, data_size);
+#else
+       {
+               AVPacket pkt;
+               av_init_packet(&pkt);
+               pkt.data = (uint8*) data;
+               pkt.size = data_size;
+               if (extensions & TSMM_SAMPLE_EXT_CLEANPOINT)
+                       pkt.flags |= AV_PKT_FLAG_KEY;
+               len = avcodec_decode_video2(mdecoder->codec_context, mdecoder->frame, &decoded, &pkt);
+       }
+#endif
+
+       if (len < 0)
+       {
+               DEBUG_WARN("data_size %d, avcodec_decode_video failed (%d)", data_size, len);
+               ret = false;
+       }
+       else if (!decoded)
+       {
+               DEBUG_WARN("data_size %d, no frame is decoded.", data_size);
+               ret = false;
+       }
+       else
+       {
+               DEBUG_DVC("linesize[0] %d linesize[1] %d linesize[2] %d linesize[3] %d "
+                       "pix_fmt %d width %d height %d",
+                       mdecoder->frame->linesize[0], mdecoder->frame->linesize[1],
+                       mdecoder->frame->linesize[2], mdecoder->frame->linesize[3],
+                       mdecoder->codec_context->pix_fmt,
+                       mdecoder->codec_context->width, mdecoder->codec_context->height);
+
+               mdecoder->decoded_size = avpicture_get_size(mdecoder->codec_context->pix_fmt,
+                       mdecoder->codec_context->width, mdecoder->codec_context->height);
+               mdecoder->decoded_data = xzalloc(mdecoder->decoded_size);
+               frame = avcodec_alloc_frame();
+               avpicture_fill((AVPicture *) frame, mdecoder->decoded_data,
+                       mdecoder->codec_context->pix_fmt,
+                       mdecoder->codec_context->width, mdecoder->codec_context->height);
+
+               av_picture_copy((AVPicture *) frame, (AVPicture *) mdecoder->frame,
+                       mdecoder->codec_context->pix_fmt,
+                       mdecoder->codec_context->width, mdecoder->codec_context->height);
+
+               av_free(frame);
+       }
+
+       return ret;
+}
+
+static boolean tsmf_ffmpeg_decode_audio(ITSMFDecoder* decoder, const uint8* data, uint32 data_size, uint32 extensions)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+       int len;
+       int frame_size;
+       uint32 src_size;
+       const uint8* src;
+       uint8* dst;
+       int dst_offset;
+
+#if 0
+       LLOGLN(0, ("tsmf_ffmpeg_decode_audio: data_size %d", data_size));
+       int i;
+       for (i = 0; i < data_size; i++)
+       {
+               LLOG(0, ("%02X ", data[i]));
+               if (i % 16 == 15)
+                       LLOG(0, ("\n"));
+       }
+       LLOG(0, ("\n"));
+#endif
+
+       if (mdecoder->decoded_size_max == 0)
+               mdecoder->decoded_size_max = AVCODEC_MAX_AUDIO_FRAME_SIZE + 16;
+       mdecoder->decoded_data = xzalloc(mdecoder->decoded_size_max);
+       /* align the memory for SSE2 needs */
+       dst = (uint8*) (((uintptr_t)mdecoder->decoded_data + 15) & ~ 0x0F);
+       dst_offset = dst - mdecoder->decoded_data;
+       src = data;
+       src_size = data_size;
+
+       while (src_size > 0)
+       {
+               /* Ensure enough space for decoding */
+               if (mdecoder->decoded_size_max - mdecoder->decoded_size < AVCODEC_MAX_AUDIO_FRAME_SIZE)
+               {
+                       mdecoder->decoded_size_max = mdecoder->decoded_size_max * 2 + 16;
+                       mdecoder->decoded_data = xrealloc(mdecoder->decoded_data, mdecoder->decoded_size_max);
+                       dst = (uint8*) (((uintptr_t)mdecoder->decoded_data + 15) & ~ 0x0F);
+                       if (dst - mdecoder->decoded_data != dst_offset)
+                       {
+                               /* re-align the memory if the alignment has changed after realloc */
+                               memmove(dst, mdecoder->decoded_data + dst_offset, mdecoder->decoded_size);
+                               dst_offset = dst - mdecoder->decoded_data;
+                       }
+                       dst += mdecoder->decoded_size;
+               }
+               frame_size = mdecoder->decoded_size_max - mdecoder->decoded_size;
+#if LIBAVCODEC_VERSION_MAJOR < 52 || (LIBAVCODEC_VERSION_MAJOR == 52 && LIBAVCODEC_VERSION_MINOR <= 20)
+               len = avcodec_decode_audio2(mdecoder->codec_context,
+                       (int16_t*) dst, &frame_size,
+                       src, src_size);
+#else
+               {
+                       AVPacket pkt;
+                       av_init_packet(&pkt);
+                       pkt.data = (uint8*) src;
+                       pkt.size = src_size;
+                       len = avcodec_decode_audio3(mdecoder->codec_context,
+                               (int16_t*) dst, &frame_size, &pkt);
+               }
+#endif
+               if (len <= 0 || frame_size <= 0)
+               {
+                       DEBUG_WARN("error decoding");
+                       break;
+               }
+               src += len;
+               src_size -= len;
+               mdecoder->decoded_size += frame_size;
+               dst += frame_size;
+       }
+
+       if (mdecoder->decoded_size == 0)
+       {
+               xfree(mdecoder->decoded_data);
+               mdecoder->decoded_data = NULL;
+       }
+       else if (dst_offset)
+       {
+               /* move the aligned decoded data to original place */
+               memmove(mdecoder->decoded_data, mdecoder->decoded_data + dst_offset, mdecoder->decoded_size);
+       }
+
+       DEBUG_DVC("data_size %d decoded_size %d",
+               data_size, mdecoder->decoded_size);
+
+       return true;
+}
+
+static boolean tsmf_ffmpeg_decode(ITSMFDecoder* decoder, const uint8* data, uint32 data_size, uint32 extensions)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       if (mdecoder->decoded_data)
+       {
+               xfree(mdecoder->decoded_data);
+               mdecoder->decoded_data = NULL;
+       }
+       mdecoder->decoded_size = 0;
+
+       switch (mdecoder->media_type)
+       {
+               case AVMEDIA_TYPE_VIDEO:
+                       return tsmf_ffmpeg_decode_video(decoder, data, data_size, extensions);
+               case AVMEDIA_TYPE_AUDIO:
+                       return tsmf_ffmpeg_decode_audio(decoder, data, data_size, extensions);
+               default:
+                       DEBUG_WARN("unknown media type.");
+                       return false;
+       }
+}
+
+static uint8* tsmf_ffmpeg_get_decoded_data(ITSMFDecoder* decoder, uint32* size)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+       uint8* buf;
+
+       *size = mdecoder->decoded_size;
+       buf = mdecoder->decoded_data;
+       mdecoder->decoded_data = NULL;
+       mdecoder->decoded_size = 0;
+       return buf;
+}
+
+static uint32 tsmf_ffmpeg_get_decoded_format(ITSMFDecoder* decoder)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       switch (mdecoder->codec_context->pix_fmt)
+       {
+               case PIX_FMT_YUV420P:
+                       return RDP_PIXFMT_I420;
+
+               default:
+                       DEBUG_WARN("unsupported pixel format %u",
+                               mdecoder->codec_context->pix_fmt);
+                       return (uint32) -1;
+       }
+}
+
+static boolean tsmf_ffmpeg_get_decoded_dimension(ITSMFDecoder* decoder, uint32* width, uint32* height)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       if (mdecoder->codec_context->width > 0 && mdecoder->codec_context->height > 0)
+       {
+               *width = mdecoder->codec_context->width;
+               *height = mdecoder->codec_context->height;
+               return true;
+       }
+       else
+       {
+               return false;
+       }
+}
+
+static void tsmf_ffmpeg_free(ITSMFDecoder* decoder)
+{
+       TSMFFFmpegDecoder* mdecoder = (TSMFFFmpegDecoder*) decoder;
+
+       if (mdecoder->frame)
+               av_free(mdecoder->frame);
+       if (mdecoder->decoded_data)
+               xfree(mdecoder->decoded_data);
+       if (mdecoder->codec_context)
+       {
+               if (mdecoder->prepared)
+                       avcodec_close(mdecoder->codec_context);
+               if (mdecoder->codec_context->extradata)
+                       xfree(mdecoder->codec_context->extradata);
+               av_free(mdecoder->codec_context);
+       }
+       xfree(decoder);
+}
+
+static boolean initialized = false;
+
+ITSMFDecoder*
+TSMFDecoderEntry(void)
+{
+       TSMFFFmpegDecoder * decoder;
+
+       if (!initialized)
+       {
+               avcodec_init();
+               avcodec_register_all();
+               initialized = true;
+       }
+
+       decoder = xnew(TSMFFFmpegDecoder);
+
+       decoder->iface.SetFormat = tsmf_ffmpeg_set_format;
+       decoder->iface.Decode = tsmf_ffmpeg_decode;
+       decoder->iface.GetDecodedData = tsmf_ffmpeg_get_decoded_data;
+       decoder->iface.GetDecodedFormat = tsmf_ffmpeg_get_decoded_format;
+       decoder->iface.GetDecodedDimension = tsmf_ffmpeg_get_decoded_dimension;
+       decoder->iface.Free = tsmf_ffmpeg_free;
+
+       return (ITSMFDecoder*) decoder;
+}
+
diff --git a/channels/drdynvc/tsmf/pulse/CMakeLists.txt b/channels/drdynvc/tsmf/pulse/CMakeLists.txt
new file mode 100644 (file)
index 0000000..373d4d3
--- /dev/null
@@ -0,0 +1,34 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(TSMF_PULSE_SRCS
+       tsmf_pulse.c
+)
+
+include_directories(..)
+include_directories(${PULSE_INCLUDE_DIRS})
+
+add_library(tsmf_pulse ${TSMF_PULSE_SRCS})
+set_target_properties(tsmf_pulse PROPERTIES PREFIX "")
+
+target_link_libraries(tsmf_pulse freerdp-utils)
+target_link_libraries(tsmf_pulse ${PULSE_LIBRARIES})
+
+install(TARGETS tsmf_pulse DESTINATION ${FREERDP_PLUGIN_PATH})
+
diff --git a/channels/drdynvc/tsmf/pulse/tsmf_pulse.c b/channels/drdynvc/tsmf/pulse/tsmf_pulse.c
new file mode 100644 (file)
index 0000000..de3c901
--- /dev/null
@@ -0,0 +1,402 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - PulseAudio Device
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pulse/pulseaudio.h>
+#include <freerdp/utils/memory.h>
+
+#include "tsmf_audio.h"
+
+typedef struct _TSMFPulseAudioDevice
+{
+       ITSMFAudioDevice iface;
+
+       char device[32];
+       pa_threaded_mainloop* mainloop;
+       pa_context* context;
+       pa_sample_spec sample_spec;
+       pa_stream* stream;
+} TSMFPulseAudioDevice;
+
+static void tsmf_pulse_context_state_callback(pa_context* context, void* userdata)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) userdata;
+       pa_context_state_t state;
+
+       state = pa_context_get_state(context);
+       switch (state)
+       {
+               case PA_CONTEXT_READY:
+                       DEBUG_DVC("PA_CONTEXT_READY");
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               case PA_CONTEXT_FAILED:
+               case PA_CONTEXT_TERMINATED:
+                       DEBUG_DVC("state %d", (int)state);
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               default:
+                       DEBUG_DVC("state %d", (int)state);
+                       break;
+       }
+}
+
+static boolean tsmf_pulse_connect(TSMFPulseAudioDevice* pulse)
+{
+       pa_context_state_t state;
+
+       if (!pulse->context)
+               return false;
+
+       if (pa_context_connect(pulse->context, NULL, 0, NULL))
+       {
+               DEBUG_WARN("pa_context_connect failed (%d)",
+                       pa_context_errno(pulse->context));
+               return false;
+       }
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       if (pa_threaded_mainloop_start(pulse->mainloop) < 0)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_threaded_mainloop_start failed (%d)",
+                       pa_context_errno(pulse->context));
+               return false;
+       }
+       for (;;)
+       {
+               state = pa_context_get_state(pulse->context);
+               if (state == PA_CONTEXT_READY)
+                       break;
+               if (!PA_CONTEXT_IS_GOOD(state))
+               {
+                       DEBUG_DVC("bad context state (%d)",
+                               pa_context_errno(pulse->context));
+                       break;
+               }
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+       if (state == PA_CONTEXT_READY)
+       {
+               DEBUG_DVC("connected");
+               return true;
+       }
+       else
+       {
+               pa_context_disconnect(pulse->context);
+               return false;
+       }
+}
+
+static boolean tsmf_pulse_open(ITSMFAudioDevice* audio, const char* device)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) audio;
+
+       if (device)
+       {
+               strcpy(pulse->device, device);
+       }
+
+       pulse->mainloop = pa_threaded_mainloop_new();
+       if (!pulse->mainloop)
+       {
+               DEBUG_WARN("pa_threaded_mainloop_new failed");
+               return false;
+       }
+       pulse->context = pa_context_new(pa_threaded_mainloop_get_api(pulse->mainloop), "freerdp");
+       if (!pulse->context)
+       {
+               DEBUG_WARN("pa_context_new failed");
+               return false;
+       }
+       pa_context_set_state_callback(pulse->context, tsmf_pulse_context_state_callback, pulse);
+       if (tsmf_pulse_connect(pulse))
+       {
+               DEBUG_WARN("tsmf_pulse_connect failed");
+               return false;
+       }
+
+       DEBUG_DVC("open device %s", pulse->device);
+       return true;
+}
+
+static void tsmf_pulse_stream_success_callback(pa_stream* stream, int success, void* userdata)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) userdata;
+
+       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+}
+
+static void tsmf_pulse_wait_for_operation(TSMFPulseAudioDevice* pulse, pa_operation* operation)
+{
+       if (operation == NULL)
+               return;
+       while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING)
+       {
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_operation_unref(operation);
+}
+
+static void tsmf_pulse_stream_state_callback(pa_stream* stream, void* userdata)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) userdata;
+       pa_stream_state_t state;
+
+       state = pa_stream_get_state(stream);
+       switch (state)
+       {
+               case PA_STREAM_READY:
+                       DEBUG_DVC("PA_STREAM_READY");
+                       pa_threaded_mainloop_signal (pulse->mainloop, 0);
+                       break;
+
+               case PA_STREAM_FAILED:
+               case PA_STREAM_TERMINATED:
+                       DEBUG_DVC("state %d", (int)state);
+                       pa_threaded_mainloop_signal (pulse->mainloop, 0);
+                       break;
+
+               default:
+                       DEBUG_DVC("state %d", (int)state);
+                       break;
+       }
+}
+
+static void tsmf_pulse_stream_request_callback(pa_stream* stream, size_t length, void* userdata)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) userdata;
+
+       DEBUG_DVC("%d", (int) length);
+
+       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+}
+
+static boolean tsmf_pulse_close_stream(TSMFPulseAudioDevice* pulse)
+{
+       if (!pulse->context || !pulse->stream)
+               return false;
+
+       DEBUG_DVC("");
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       pa_stream_set_write_callback(pulse->stream, NULL, NULL);
+       tsmf_pulse_wait_for_operation(pulse,
+               pa_stream_drain(pulse->stream, tsmf_pulse_stream_success_callback, pulse));
+       pa_stream_disconnect(pulse->stream);
+       pa_stream_unref(pulse->stream);
+       pulse->stream = NULL;
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+
+       return true;
+}
+
+static boolean tsmf_pulse_open_stream(TSMFPulseAudioDevice* pulse)
+{
+       pa_stream_state_t state;
+       pa_buffer_attr buffer_attr = { 0 };
+
+       if (!pulse->context)
+               return false;
+
+       DEBUG_DVC("");
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       pulse->stream = pa_stream_new(pulse->context, "freerdp",
+               &pulse->sample_spec, NULL);
+       if (!pulse->stream)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_stream_new failed (%d)",
+                       pa_context_errno(pulse->context));
+               return false;
+       }
+       pa_stream_set_state_callback(pulse->stream,
+               tsmf_pulse_stream_state_callback, pulse);
+       pa_stream_set_write_callback(pulse->stream,
+               tsmf_pulse_stream_request_callback, pulse);
+       buffer_attr.maxlength = pa_usec_to_bytes(500000, &pulse->sample_spec);
+       buffer_attr.tlength = pa_usec_to_bytes(250000, &pulse->sample_spec);
+       buffer_attr.prebuf = (uint32_t) -1;
+       buffer_attr.minreq = (uint32_t) -1;
+       buffer_attr.fragsize = (uint32_t) -1;
+       if (pa_stream_connect_playback(pulse->stream,
+               pulse->device[0] ? pulse->device : NULL, &buffer_attr,
+               PA_STREAM_ADJUST_LATENCY | PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE,
+               NULL, NULL) < 0)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_stream_connect_playback failed (%d)",
+                       pa_context_errno(pulse->context));
+               return false;
+       }
+
+       for (;;)
+       {
+               state = pa_stream_get_state(pulse->stream);
+               if (state == PA_STREAM_READY)
+                       break;
+               if (!PA_STREAM_IS_GOOD(state))
+               {
+                       DEBUG_WARN("bad stream state (%d)",
+                               pa_context_errno(pulse->context));
+                       break;
+               }
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+       if (state == PA_STREAM_READY)
+       {
+               DEBUG_DVC("connected");
+               return true;
+       }
+       else
+       {
+               tsmf_pulse_close_stream(pulse);
+               return false;
+       }
+}
+
+static boolean tsmf_pulse_set_format(ITSMFAudioDevice* audio,
+       uint32 sample_rate, uint32 channels, uint32 bits_per_sample)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) audio;
+
+       DEBUG_DVC("sample_rate %d channels %d bits_per_sample %d",
+               sample_rate, channels, bits_per_sample);
+
+       pulse->sample_spec.rate = sample_rate;
+       pulse->sample_spec.channels = channels;
+       pulse->sample_spec.format = PA_SAMPLE_S16LE;
+
+       return tsmf_pulse_open_stream(pulse);
+}
+
+static boolean tsmf_pulse_play(ITSMFAudioDevice* audio, uint8* data, uint32 data_size)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) audio;
+       uint8* src;
+       int len;
+       int ret;
+
+       DEBUG_DVC("data_size %d", data_size);
+
+       if (pulse->stream)
+       {
+               pa_threaded_mainloop_lock(pulse->mainloop);
+
+               src = data;
+               while (data_size > 0)
+               {
+                       while ((len = pa_stream_writable_size(pulse->stream)) == 0)
+                       {
+                               DEBUG_DVC("waiting");
+                               pa_threaded_mainloop_wait(pulse->mainloop);
+                       }
+                       if (len < 0)
+                               break;
+                       if (len > data_size)
+                               len = data_size;
+                       ret = pa_stream_write(pulse->stream, src, len, NULL, 0LL, PA_SEEK_RELATIVE);
+                       if (ret < 0)
+                       {
+                               DEBUG_DVC("pa_stream_write failed (%d)",
+                                       pa_context_errno(pulse->context));
+                               break;
+                       }
+                       src += len;
+                       data_size -= len;
+               }
+
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+       }
+       xfree(data);
+
+       return true;
+}
+
+static uint64 tsmf_pulse_get_latency(ITSMFAudioDevice* audio)
+{
+       pa_usec_t usec;
+       uint64 latency = 0;
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) audio;
+
+       if (pulse->stream && pa_stream_get_latency(pulse->stream, &usec, NULL) == 0)
+       {
+               latency = ((uint64)usec) * 10LL;
+       }
+       return latency;
+}
+
+static void tsmf_pulse_flush(ITSMFAudioDevice* audio)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) audio;
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       tsmf_pulse_wait_for_operation(pulse,
+               pa_stream_flush(pulse->stream, tsmf_pulse_stream_success_callback, pulse));
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+}
+
+static void tsmf_pulse_free(ITSMFAudioDevice* audio)
+{
+       TSMFPulseAudioDevice* pulse = (TSMFPulseAudioDevice*) audio;
+
+       DEBUG_DVC("");
+
+       tsmf_pulse_close_stream(pulse);
+       if (pulse->mainloop)
+       {
+               pa_threaded_mainloop_stop(pulse->mainloop);
+       }
+       if (pulse->context)
+       {
+               pa_context_disconnect(pulse->context);
+               pa_context_unref(pulse->context);
+               pulse->context = NULL;
+       }
+       if (pulse->mainloop)
+       {
+               pa_threaded_mainloop_free(pulse->mainloop);
+               pulse->mainloop = NULL;
+       }
+       xfree(pulse);
+}
+
+ITSMFAudioDevice* TSMFAudioDeviceEntry(void)
+{
+       TSMFPulseAudioDevice* pulse;
+
+       pulse = xnew(TSMFPulseAudioDevice);
+
+       pulse->iface.Open = tsmf_pulse_open;
+       pulse->iface.SetFormat = tsmf_pulse_set_format;
+       pulse->iface.Play = tsmf_pulse_play;
+       pulse->iface.GetLatency = tsmf_pulse_get_latency;
+       pulse->iface.Flush = tsmf_pulse_flush;
+       pulse->iface.Free = tsmf_pulse_free;
+
+       return (ITSMFAudioDevice*) pulse;
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_audio.c b/channels/drdynvc/tsmf/tsmf_audio.c
new file mode 100644 (file)
index 0000000..5a1a145
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Audio Device Manager
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/load_plugin.h>
+
+#include "tsmf_audio.h"
+
+static ITSMFAudioDevice* tsmf_load_audio_device_by_name(const char* name, const char* device)
+{
+       ITSMFAudioDevice* audio;
+       TSMF_AUDIO_DEVICE_ENTRY entry;
+       char* fullname;
+
+       if (strrchr(name, '.') != NULL)
+               entry = (TSMF_AUDIO_DEVICE_ENTRY) freerdp_load_plugin(name, TSMF_AUDIO_DEVICE_EXPORT_FUNC_NAME);
+       else
+       {
+               fullname = xzalloc(strlen(name) + 6);
+               strcpy(fullname, "tsmf_");
+               strcat(fullname, name);
+               entry = (TSMF_AUDIO_DEVICE_ENTRY) freerdp_load_plugin(fullname, TSMF_AUDIO_DEVICE_EXPORT_FUNC_NAME);
+               xfree(fullname);
+       }
+       if (entry == NULL)
+       {
+               return NULL;
+       }
+
+       audio = entry();
+       if (audio == NULL)
+       {
+               DEBUG_WARN("failed to call export function in %s", name);
+               return NULL;
+       }
+       if (!audio->Open(audio, device))
+       {
+               audio->Free(audio);
+               audio = NULL;
+       }
+       return audio;
+}
+
+ITSMFAudioDevice* tsmf_load_audio_device(const char* name, const char* device)
+{
+       ITSMFAudioDevice* audio;
+
+       if (name)
+       {
+               audio = tsmf_load_audio_device_by_name(name, device);
+       }
+       else
+       {
+               audio = tsmf_load_audio_device_by_name("pulse", device);
+               if (!audio)
+                       audio = tsmf_load_audio_device_by_name("alsa", device);
+       }
+
+       return audio;
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_audio.h b/channels/drdynvc/tsmf/tsmf_audio.h
new file mode 100644 (file)
index 0000000..af00759
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Audio Device Manager
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_AUDIO_H
+#define __TSMF_AUDIO_H
+
+#include "drdynvc_types.h"
+
+typedef struct _ITSMFAudioDevice ITSMFAudioDevice;
+
+struct _ITSMFAudioDevice
+{
+       /* Open the audio device. */
+       boolean (*Open) (ITSMFAudioDevice* audio, const char* device);
+       /* Set the audio data format. */
+       boolean (*SetFormat) (ITSMFAudioDevice* audio, uint32 sample_rate, uint32 channels, uint32 bits_per_sample);
+       /* Play audio data. */
+       boolean (*Play) (ITSMFAudioDevice* audio, uint8* data, uint32 data_size);
+       /* Get the latency of the last written sample, in 100ns */
+       uint64 (*GetLatency) (ITSMFAudioDevice* audio);
+       /* Flush queued audio data */
+       void (*Flush) (ITSMFAudioDevice* audio);
+       /* Free the audio device */
+       void (*Free) (ITSMFAudioDevice* audio);
+};
+
+#define TSMF_AUDIO_DEVICE_EXPORT_FUNC_NAME "TSMFAudioDeviceEntry"
+typedef ITSMFAudioDevice* (*TSMF_AUDIO_DEVICE_ENTRY) (void);
+
+ITSMFAudioDevice* tsmf_load_audio_device(const char* name, const char* device);
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_codec.c b/channels/drdynvc/tsmf/tsmf_codec.c
new file mode 100644 (file)
index 0000000..bd5a317
--- /dev/null
@@ -0,0 +1,407 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Codec
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/hexdump.h>
+
+#include "drdynvc_types.h"
+#include "tsmf_constants.h"
+#include "tsmf_types.h"
+
+#include "tsmf_codec.h"
+
+typedef struct _TSMFMediaTypeMap
+{
+       uint8 guid[16];
+       const char* name;
+       int type;
+} TSMFMediaTypeMap;
+
+static const TSMFMediaTypeMap tsmf_major_type_map[] =
+{
+       /* 73646976-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x76, 0x69, 0x64, 0x73, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIATYPE_Video",
+               TSMF_MAJOR_TYPE_VIDEO
+       },
+
+       /* 73647561-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x61, 0x75, 0x64, 0x73, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIATYPE_Audio",
+               TSMF_MAJOR_TYPE_AUDIO
+       },
+
+       {
+               { 0 },
+               "Unknown",
+               TSMF_MAJOR_TYPE_UNKNOWN
+       }
+};
+
+static const TSMFMediaTypeMap tsmf_sub_type_map[] =
+{
+       /* 31435657-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x57, 0x56, 0x43, 0x31, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_WVC1",
+               TSMF_SUB_TYPE_WVC1
+       },
+
+       /* 00000161-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_WMAudioV2", /* V7, V8 has the same GUID */
+               TSMF_SUB_TYPE_WMA2
+       },
+
+       /* 00000162-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_WMAudioV9",
+               TSMF_SUB_TYPE_WMA9
+       },
+
+       /* 00000055-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_MP3",
+               TSMF_SUB_TYPE_MP3
+       },
+
+       /* E06D802B-DB46-11CF-B4D1-00805F6CBBEA */
+       {
+               { 0x2B, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA },
+               "MEDIASUBTYPE_MPEG2_AUDIO",
+               TSMF_SUB_TYPE_MP2A
+       },
+
+       /* E06D8026-DB46-11CF-B4D1-00805F6CBBEA */
+       {
+               { 0x26, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA },
+               "MEDIASUBTYPE_MPEG2_VIDEO",
+               TSMF_SUB_TYPE_MP2V
+       },
+
+       /* 33564D57-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x57, 0x4D, 0x56, 0x33, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_WMV3",
+               TSMF_SUB_TYPE_WMV3
+       },
+
+       /* 00001610-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x10, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_MPEG_HEAAC",
+               TSMF_SUB_TYPE_AAC
+       },
+
+       /* 34363248-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x48, 0x32, 0x36, 0x34, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_H264",
+               TSMF_SUB_TYPE_H264
+       },
+
+       /* 31435641-0000-0010-8000-00AA00389B71 */
+       {
+               { 0x41, 0x56, 0x43, 0x31, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 },
+               "MEDIASUBTYPE_AVC1",
+               TSMF_SUB_TYPE_AVC1
+       },
+
+       /* E06D802C-DB46-11CF-B4D1-00805F6CBBEA */
+       {
+               { 0x2C, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA },
+               "MEDIASUBTYPE_DOLBY_AC3",
+               TSMF_SUB_TYPE_AC3
+       },
+
+       {
+               { 0 },
+               "Unknown",
+               TSMF_SUB_TYPE_UNKNOWN
+       }
+
+};
+
+static const TSMFMediaTypeMap tsmf_format_type_map[] =
+{
+       /* AED4AB2D-7326-43CB-9464-C879CAB9C43D */
+       {
+               { 0x2D, 0xAB, 0xD4, 0xAE, 0x26, 0x73, 0xCB, 0x43, 0x94, 0x64, 0xC8, 0x79, 0xCA, 0xB9, 0xC4, 0x3D },
+               "FORMAT_MFVideoFormat",
+               TSMF_FORMAT_TYPE_MFVIDEOFORMAT
+       },
+
+       /* 05589F81-C356-11CE-BF01-00AA0055595A */
+       {
+               { 0x81, 0x9F, 0x58, 0x05, 0x56, 0xC3, 0xCE, 0x11, 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A },
+               "FORMAT_WaveFormatEx",
+               TSMF_FORMAT_TYPE_WAVEFORMATEX
+       },
+
+       /* E06D80E3-DB46-11CF-B4D1-00805F6CBBEA */
+       {
+               { 0xE3, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA },
+               "FORMAT_MPEG2_VIDEO",
+               TSMF_FORMAT_TYPE_MPEG2VIDEOINFO
+       },
+
+       /* F72A76A0-EB0A-11D0-ACE4-0000C0CC16BA */
+       {
+               { 0xA0, 0x76, 0x2A, 0xF7, 0x0A, 0xEB, 0xD0, 0x11, 0xAC, 0xE4, 0x00, 0x00, 0xC0, 0xCC, 0x16, 0xBA },
+               "FORMAT_VideoInfo2",
+               TSMF_FORMAT_TYPE_VIDEOINFO2
+       },
+
+       {
+               { 0 },
+               "Unknown",
+               TSMF_FORMAT_TYPE_UNKNOWN
+       }
+};
+
+static void tsmf_print_guid(const uint8* guid)
+{
+#ifdef WITH_DEBUG_DVC
+       int i;
+
+       for (i = 3; i >= 0; i--)
+               printf("%02X", guid[i]);
+       printf("-");
+       for (i = 5; i >= 4; i--)
+               printf("%02X", guid[i]);
+       printf("-");
+       for (i = 7; i >= 6; i--)
+               printf("%02X", guid[i]);
+       printf("-");
+       for (i = 8; i < 16; i++)
+       {
+               printf("%02X", guid[i]);
+               if (i == 9)
+                       printf("-");
+       }
+       printf("\n");
+#endif
+}
+
+/* http://msdn.microsoft.com/en-us/library/dd318229.aspx */
+static uint32 tsmf_codec_parse_BITMAPINFOHEADER(TS_AM_MEDIA_TYPE* mediatype, STREAM* s, boolean bypass)
+{
+       uint32 biSize;
+       uint32 biWidth;
+       uint32 biHeight;
+
+       stream_read_uint32(s, biSize);
+       stream_read_uint32(s, biWidth);
+       stream_read_uint32(s, biHeight);
+       stream_seek(s, 28);
+
+       if (mediatype->Width == 0)
+               mediatype->Width = biWidth;
+       if (mediatype->Height == 0)
+               mediatype->Height = biHeight;
+       /* Assume there will be no color table for video? */
+
+       if (bypass && biSize > 40)
+               stream_seek(s, biSize - 40);
+
+       return (bypass ? biSize : 40);
+}
+
+/* http://msdn.microsoft.com/en-us/library/dd407326.aspx */
+static uint32 tsmf_codec_parse_VIDEOINFOHEADER2(TS_AM_MEDIA_TYPE* mediatype, STREAM* s)
+{
+       uint64 AvgTimePerFrame;
+
+       /* VIDEOINFOHEADER2.rcSource, RECT(LONG left, LONG top, LONG right, LONG bottom) */
+       stream_seek_uint32(s);
+       stream_seek_uint32(s);
+       stream_read_uint32(s, mediatype->Width);
+       stream_read_uint32(s, mediatype->Height);
+       /* VIDEOINFOHEADER2.rcTarget */
+       stream_seek(s, 16);
+       /* VIDEOINFOHEADER2.dwBitRate */
+       stream_read_uint32(s, mediatype->BitRate);
+       /* VIDEOINFOHEADER2.dwBitErrorRate */
+       stream_seek_uint32(s);
+       /* VIDEOINFOHEADER2.AvgTimePerFrame */
+       stream_read_uint64(s, AvgTimePerFrame);
+       mediatype->SamplesPerSecond.Numerator = 1000000;
+       mediatype->SamplesPerSecond.Denominator = (int)(AvgTimePerFrame / 10LL);
+       /* Remaining fields before bmiHeader */
+       stream_seek(s, 24);
+
+       return 72;
+}
+
+boolean tsmf_codec_parse_media_type(TS_AM_MEDIA_TYPE* mediatype, STREAM* s)
+{
+       int i;
+       uint32 cbFormat;
+       boolean ret = true;
+
+       memset(mediatype, 0, sizeof(TS_AM_MEDIA_TYPE));
+
+       /* MajorType */
+       DEBUG_DVC("MajorType:");
+       tsmf_print_guid(stream_get_tail(s));
+       for (i = 0; tsmf_major_type_map[i].type != TSMF_MAJOR_TYPE_UNKNOWN; i++)
+       {
+               if (memcmp(tsmf_major_type_map[i].guid, stream_get_tail(s), 16) == 0)
+                       break;
+       }
+       mediatype->MajorType = tsmf_major_type_map[i].type;
+       if (mediatype->MajorType == TSMF_MAJOR_TYPE_UNKNOWN)
+               ret = false;
+       DEBUG_DVC("MajorType %s", tsmf_major_type_map[i].name);
+       stream_seek(s, 16);
+
+       /* SubType */
+       DEBUG_DVC("SubType:");
+       tsmf_print_guid(stream_get_tail(s));
+       for (i = 0; tsmf_sub_type_map[i].type != TSMF_SUB_TYPE_UNKNOWN; i++)
+       {
+               if (memcmp(tsmf_sub_type_map[i].guid, stream_get_tail(s), 16) == 0)
+                       break;
+       }
+       mediatype->SubType = tsmf_sub_type_map[i].type;
+       if (mediatype->SubType == TSMF_SUB_TYPE_UNKNOWN)
+               ret = false;
+       DEBUG_DVC("SubType %s", tsmf_sub_type_map[i].name);
+       stream_seek(s, 16);
+
+       /* bFixedSizeSamples, bTemporalCompression, SampleSize */
+       stream_seek(s, 12);
+
+       /* FormatType */
+       DEBUG_DVC("FormatType:");
+       tsmf_print_guid(stream_get_tail(s));
+       for (i = 0; tsmf_format_type_map[i].type != TSMF_FORMAT_TYPE_UNKNOWN; i++)
+       {
+               if (memcmp(tsmf_format_type_map[i].guid, stream_get_tail(s), 16) == 0)
+                       break;
+       }
+       mediatype->FormatType = tsmf_format_type_map[i].type;
+       if (mediatype->FormatType == TSMF_FORMAT_TYPE_UNKNOWN)
+               ret = false;
+       DEBUG_DVC("FormatType %s", tsmf_format_type_map[i].name);
+       stream_seek(s, 16);
+
+       /* cbFormat */
+       stream_read_uint32(s, cbFormat);
+       DEBUG_DVC("cbFormat %d", cbFormat);
+
+#ifdef WITH_DEBUG_DVC
+       freerdp_hexdump(stream_get_tail(s), cbFormat);
+#endif
+
+       switch (mediatype->FormatType)
+       {
+               case TSMF_FORMAT_TYPE_MFVIDEOFORMAT:
+                       /* http://msdn.microsoft.com/en-us/library/aa473808.aspx */
+
+                       stream_seek(s, 8); /* dwSize and ? */
+                       stream_read_uint32(s, mediatype->Width); /* videoInfo.dwWidth */
+                       stream_read_uint32(s, mediatype->Height); /* videoInfo.dwHeight */
+                       stream_seek(s, 32);
+                       /* videoInfo.FramesPerSecond */
+                       stream_read_uint32(s, mediatype->SamplesPerSecond.Numerator);
+                       stream_read_uint32(s, mediatype->SamplesPerSecond.Denominator);
+                       stream_seek(s, 80);
+                       stream_read_uint32(s, mediatype->BitRate); /* compressedInfo.AvgBitrate */
+                       stream_seek(s, 36);
+
+                       if (cbFormat > 176)
+                       {
+                               mediatype->ExtraDataSize = cbFormat - 176;
+                               mediatype->ExtraData = stream_get_tail(s);
+                       }
+                       break;
+
+               case TSMF_FORMAT_TYPE_WAVEFORMATEX:
+                       /* http://msdn.microsoft.com/en-us/library/dd757720.aspx */
+
+                       stream_seek_uint16(s);
+                       stream_read_uint16(s, mediatype->Channels);
+                       stream_read_uint32(s, mediatype->SamplesPerSecond.Numerator);
+                       mediatype->SamplesPerSecond.Denominator = 1;
+                       stream_read_uint32(s, mediatype->BitRate);
+                       mediatype->BitRate *= 8;
+                       stream_read_uint16(s, mediatype->BlockAlign);
+                       stream_read_uint16(s, mediatype->BitsPerSample);
+                       stream_read_uint16(s, mediatype->ExtraDataSize);
+                       if (mediatype->ExtraDataSize > 0)
+                               mediatype->ExtraData = stream_get_tail(s);
+                       
+                       break;
+
+               case TSMF_FORMAT_TYPE_MPEG2VIDEOINFO:
+                       /* http://msdn.microsoft.com/en-us/library/dd390707.aspx */
+
+                       i = tsmf_codec_parse_VIDEOINFOHEADER2(mediatype, s);
+                       i += tsmf_codec_parse_BITMAPINFOHEADER(mediatype, s, true);
+                       if (cbFormat > i)
+                       {
+                               mediatype->ExtraDataSize = cbFormat - i;
+                               mediatype->ExtraData = stream_get_tail(s);
+                       }
+                       break;
+
+               case TSMF_FORMAT_TYPE_VIDEOINFO2:
+                       i = tsmf_codec_parse_VIDEOINFOHEADER2(mediatype, s);
+                       i += tsmf_codec_parse_BITMAPINFOHEADER(mediatype, s, false);
+                       if (cbFormat > i)
+                       {
+                               mediatype->ExtraDataSize = cbFormat - i;
+                               mediatype->ExtraData = stream_get_tail(s);
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+
+       if (mediatype->SamplesPerSecond.Numerator == 0)
+               mediatype->SamplesPerSecond.Numerator = 1;
+       if (mediatype->SamplesPerSecond.Denominator == 0)
+               mediatype->SamplesPerSecond.Denominator = 1;
+
+       return ret;
+}
+
+boolean tsmf_codec_check_media_type(STREAM* s)
+{
+       uint8* m;
+       boolean ret;
+       TS_AM_MEDIA_TYPE mediatype;
+
+       stream_get_mark(s, m);
+       ret = tsmf_codec_parse_media_type(&mediatype, s);
+       stream_set_mark(s, m);
+
+       return ret;
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_codec.h b/channels/drdynvc/tsmf/tsmf_codec.h
new file mode 100644 (file)
index 0000000..eb6bbea
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Codec
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_CODEC
+#define __TSMF_CODEC
+
+#include "tsmf_types.h"
+
+boolean tsmf_codec_parse_media_type(TS_AM_MEDIA_TYPE* mediatype, STREAM* s);
+boolean tsmf_codec_check_media_type(STREAM* s);
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_constants.h b/channels/drdynvc/tsmf/tsmf_constants.h
new file mode 100644 (file)
index 0000000..e836dd7
--- /dev/null
@@ -0,0 +1,120 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Constants
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_CONSTANTS_H
+#define __TSMF_CONSTANTS_H
+
+#define GUID_SIZE 16
+#define TSMF_BUFFER_PADDING_SIZE 8
+
+/* Interface IDs defined in [MS-RDPEV]. There's no constant names in the MS
+   documentation, so we create them on our own. */
+#define TSMF_INTERFACE_DEFAULT                  0x00000000
+#define TSMF_INTERFACE_CLIENT_NOTIFICATIONS     0x00000001
+#define TSMF_INTERFACE_CAPABILITIES             0x00000002
+
+/* Interface ID Mask */
+#define STREAM_ID_STUB      0x80000000
+#define STREAM_ID_PROXY     0x40000000
+#define STREAM_ID_NONE      0x00000000
+
+/* Functon ID */
+/* Common IDs for all interfaces are as follows. */
+#define RIMCALL_RELEASE                     0x00000001
+#define RIMCALL_QUERYINTERFACE              0x00000002
+/* Capabilities Negotiator Interface IDs are as follows. */
+#define RIM_EXCHANGE_CAPABILITY_REQUEST     0x00000100
+/* The Client Notifications Interface ID is as follows. */
+#define PLAYBACK_ACK                        0x00000100
+#define CLIENT_EVENT_NOTIFICATION           0x00000101
+/* Server Data Interface IDs are as follows. */
+#define EXCHANGE_CAPABILITIES_REQ           0x00000100
+#define SET_CHANNEL_PARAMS                  0x00000101
+#define ADD_STREAM                          0x00000102
+#define ON_SAMPLE                           0x00000103
+#define SET_VIDEO_WINDOW                    0x00000104
+#define ON_NEW_PRESENTATION                 0x00000105
+#define SHUTDOWN_PRESENTATION_REQ           0x00000106
+#define SET_TOPOLOGY_REQ                    0x00000107
+#define CHECK_FORMAT_SUPPORT_REQ            0x00000108
+#define ON_PLAYBACK_STARTED                 0x00000109
+#define ON_PLAYBACK_PAUSED                  0x0000010a
+#define ON_PLAYBACK_STOPPED                 0x0000010b
+#define ON_PLAYBACK_RESTARTED               0x0000010c
+#define ON_PLAYBACK_RATE_CHANGED            0x0000010d
+#define ON_FLUSH                            0x0000010e
+#define ON_STREAM_VOLUME                    0x0000010f
+#define ON_CHANNEL_VOLUME                   0x00000110
+#define ON_END_OF_STREAM                    0x00000111
+#define SET_ALLOCATOR                       0x00000112
+#define NOTIFY_PREROLL                      0x00000113
+#define UPDATE_GEOMETRY_INFO                0x00000114
+#define REMOVE_STREAM                       0x00000115
+
+/* Supported platform */
+#define MMREDIR_CAPABILITY_PLATFORM_MF      0x00000001
+#define MMREDIR_CAPABILITY_PLATFORM_DSHOW   0x00000002
+#define MMREDIR_CAPABILITY_PLATFORM_OTHER   0x00000004
+
+/* TSMM_CLIENT_EVENT Constants */
+#define TSMM_CLIENT_EVENT_ENDOFSTREAM       0x0064
+#define TSMM_CLIENT_EVENT_STOP_COMPLETED    0x00C8
+#define TSMM_CLIENT_EVENT_START_COMPLETED   0x00C9
+#define TSMM_CLIENT_EVENT_MONITORCHANGED    0x012C
+
+/* TS_MM_DATA_SAMPLE.SampleExtensions */
+#define TSMM_SAMPLE_EXT_CLEANPOINT          0x00000001
+#define TSMM_SAMPLE_EXT_DISCONTINUITY       0x00000002
+#define TSMM_SAMPLE_EXT_INTERLACED          0x00000004
+#define TSMM_SAMPLE_EXT_BOTTOMFIELDFIRST    0x00000008
+#define TSMM_SAMPLE_EXT_REPEATFIELDFIRST    0x00000010
+#define TSMM_SAMPLE_EXT_SINGLEFIELD         0x00000020
+#define TSMM_SAMPLE_EXT_DERIVEDFROMTOPFIELD 0x00000040
+#define TSMM_SAMPLE_EXT_HAS_NO_TIMESTAMPS   0x00000080
+#define TSMM_SAMPLE_EXT_RELATIVE_TIMESTAMPS 0x00000100
+#define TSMM_SAMPLE_EXT_ABSOLUTE_TIMESTAMPS 0x00000200
+
+/* MajorType */
+#define TSMF_MAJOR_TYPE_UNKNOWN             0
+#define TSMF_MAJOR_TYPE_VIDEO               1
+#define TSMF_MAJOR_TYPE_AUDIO               2
+
+/* SubType */
+#define TSMF_SUB_TYPE_UNKNOWN               0
+#define TSMF_SUB_TYPE_WVC1                  1
+#define TSMF_SUB_TYPE_WMA2                  2
+#define TSMF_SUB_TYPE_WMA9                  3
+#define TSMF_SUB_TYPE_MP3                   4
+#define TSMF_SUB_TYPE_MP2A                  5
+#define TSMF_SUB_TYPE_MP2V                  6
+#define TSMF_SUB_TYPE_WMV3                  7
+#define TSMF_SUB_TYPE_AAC                   8
+#define TSMF_SUB_TYPE_H264                  9
+#define TSMF_SUB_TYPE_AVC1                 10
+#define TSMF_SUB_TYPE_AC3                  11
+
+/* FormatType */
+#define TSMF_FORMAT_TYPE_UNKNOWN            0
+#define TSMF_FORMAT_TYPE_MFVIDEOFORMAT      1
+#define TSMF_FORMAT_TYPE_WAVEFORMATEX       2
+#define TSMF_FORMAT_TYPE_MPEG2VIDEOINFO     3
+#define TSMF_FORMAT_TYPE_VIDEOINFO2         4
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_decoder.c b/channels/drdynvc/tsmf/tsmf_decoder.c
new file mode 100644 (file)
index 0000000..db31c02
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Decoder
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/load_plugin.h>
+
+#include "drdynvc_types.h"
+#include "tsmf_types.h"
+#include "tsmf_constants.h"
+#include "tsmf_decoder.h"
+
+static ITSMFDecoder* tsmf_load_decoder_by_name(const char* name, TS_AM_MEDIA_TYPE* media_type)
+{
+       ITSMFDecoder* decoder;
+       TSMF_DECODER_ENTRY entry;
+       char* fullname;
+
+       if (strrchr(name, '.') != NULL)
+               entry = (TSMF_DECODER_ENTRY) freerdp_load_plugin(name, TSMF_DECODER_EXPORT_FUNC_NAME);
+       else
+       {
+               fullname = xzalloc(strlen(name) + 6);
+               strcpy(fullname, "tsmf_");
+               strcat(fullname, name);
+               entry = (TSMF_DECODER_ENTRY) freerdp_load_plugin(fullname, TSMF_DECODER_EXPORT_FUNC_NAME);
+               xfree(fullname);
+       }
+       if (entry == NULL)
+       {
+               return NULL;
+       }
+
+       decoder = entry();
+       if (decoder == NULL)
+       {
+               DEBUG_WARN("failed to call export function in %s", name);
+               return NULL;
+       }
+       if (!decoder->SetFormat(decoder, media_type))
+       {
+               decoder->Free(decoder);
+               decoder = NULL;
+       }
+       return decoder;
+}
+
+ITSMFDecoder* tsmf_load_decoder(const char* name, TS_AM_MEDIA_TYPE* media_type)
+{
+       ITSMFDecoder* decoder;
+
+       if (name)
+       {
+               decoder = tsmf_load_decoder_by_name(name, media_type);
+       }
+       else
+       {
+               decoder = tsmf_load_decoder_by_name("ffmpeg", media_type);
+       }
+
+       return decoder;
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_decoder.h b/channels/drdynvc/tsmf/tsmf_decoder.h
new file mode 100644 (file)
index 0000000..2aee84f
--- /dev/null
@@ -0,0 +1,50 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Decoder
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_DECODER_H
+#define __TSMF_DECODER_H
+
+#include "drdynvc_types.h"
+#include "tsmf_types.h"
+
+typedef struct _ITSMFDecoder ITSMFDecoder;
+
+struct _ITSMFDecoder
+{
+       /* Set the decoder format. Return true if supported. */
+       boolean (*SetFormat) (ITSMFDecoder* decoder, TS_AM_MEDIA_TYPE* media_type);
+       /* Decode a sample. */
+       boolean (*Decode) (ITSMFDecoder* decoder, const uint8* data, uint32 data_size, uint32 extensions);
+       /* Get the decoded data */
+       uint8* (*GetDecodedData) (ITSMFDecoder* decoder, uint32* size);
+       /* Get the pixel format of decoded video frame */
+       uint32 (*GetDecodedFormat) (ITSMFDecoder* decoder);
+       /* Get the width and height of decoded video frame */
+       boolean (*GetDecodedDimension) (ITSMFDecoder* decoder, uint32* width, uint32* height);
+       /* Free the decoder */
+       void (*Free) (ITSMFDecoder* decoder);
+};
+
+#define TSMF_DECODER_EXPORT_FUNC_NAME "TSMFDecoderEntry"
+typedef ITSMFDecoder* (*TSMF_DECODER_ENTRY) (void);
+
+ITSMFDecoder* tsmf_load_decoder(const char* name, TS_AM_MEDIA_TYPE* media_type);
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_ifman.c b/channels/drdynvc/tsmf/tsmf_ifman.c
new file mode 100644 (file)
index 0000000..10d351d
--- /dev/null
@@ -0,0 +1,478 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Interface Manipulation
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+
+#include "drdynvc_types.h"
+#include "tsmf_constants.h"
+#include "tsmf_media.h"
+#include "tsmf_codec.h"
+
+#include "tsmf_ifman.h"
+
+int tsmf_ifman_rim_exchange_capability_request(TSMF_IFMAN* ifman)
+{
+       uint32 CapabilityValue;
+
+       stream_read_uint32(ifman->input, CapabilityValue);
+       DEBUG_DVC("server CapabilityValue %d", CapabilityValue);
+
+       stream_check_size(ifman->output, 8);
+       stream_write_uint32(ifman->output, 1); /* CapabilityValue */
+       stream_write_uint32(ifman->output, 0); /* Result */
+
+       return 0;
+}
+
+int tsmf_ifman_exchange_capability_request(TSMF_IFMAN* ifman)
+{
+       uint32 i;
+       uint32 v;
+       uint32 pos;
+       uint32 CapabilityType;
+       uint32 cbCapabilityLength;
+       uint32 numHostCapabilities;
+
+       pos = stream_get_pos(ifman->output);
+       stream_check_size(ifman->output, ifman->input_size + 4);
+       stream_copy(ifman->output, ifman->input, ifman->input_size);
+
+       stream_set_pos(ifman->output, pos);
+       stream_read_uint32(ifman->output, numHostCapabilities);
+       for (i = 0; i < numHostCapabilities; i++)
+       {
+               stream_read_uint32(ifman->output, CapabilityType);
+               stream_read_uint32(ifman->output, cbCapabilityLength);
+               pos = stream_get_pos(ifman->output);
+               switch (CapabilityType)
+               {
+                       case 1: /* Protocol version request */
+                               stream_read_uint32(ifman->output, v);
+                               DEBUG_DVC("server protocol version %d", v);
+                               break;
+                       case 2: /* Supported platform */
+                               stream_peek_uint32(ifman->output, v);
+                               DEBUG_DVC("server supported platform %d", v);
+                               /* Claim that we support both MF and DShow platforms. */
+                               stream_write_uint32(ifman->output,
+                                       MMREDIR_CAPABILITY_PLATFORM_MF | MMREDIR_CAPABILITY_PLATFORM_DSHOW);
+                               break;
+                       default:
+                               DEBUG_WARN("unknown capability type %d", CapabilityType);
+                               break;
+               }
+               stream_set_pos(ifman->output, pos + cbCapabilityLength);
+       }
+       stream_write_uint32(ifman->output, 0); /* Result */
+
+       ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB;
+
+       return 0;
+}
+
+int tsmf_ifman_check_format_support_request(TSMF_IFMAN* ifman)
+{
+       uint32 numMediaType;
+       uint32 PlatformCookie;
+       uint32 FormatSupported = 1;
+
+       stream_read_uint32(ifman->input, PlatformCookie);
+       stream_seek_uint32(ifman->input); /* NoRolloverFlags (4 bytes) */
+       stream_read_uint32(ifman->input, numMediaType);
+
+       DEBUG_DVC("PlatformCookie %d numMediaType %d", PlatformCookie, numMediaType);
+
+       if (!tsmf_codec_check_media_type(ifman->input))
+               FormatSupported = 0;
+
+       if (FormatSupported)
+               DEBUG_DVC("format ok.");
+
+       stream_check_size(ifman->output, 12);
+       stream_write_uint32(ifman->output, FormatSupported);
+       stream_write_uint32(ifman->output, PlatformCookie);
+       stream_write_uint32(ifman->output, 0); /* Result */
+
+       ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB;
+
+       return 0;
+}
+
+int tsmf_ifman_on_new_presentation(TSMF_IFMAN* ifman)
+{
+       int error = 0;
+       TSMF_PRESENTATION* presentation;
+
+       DEBUG_DVC("");
+
+       presentation = tsmf_presentation_new(stream_get_tail(ifman->input), ifman->channel_callback);
+       if (presentation == NULL)
+               error = 1;
+       tsmf_presentation_set_audio_device(presentation, ifman->audio_name, ifman->audio_device);
+       ifman->output_pending = true;
+       return error;
+}
+
+int tsmf_ifman_add_stream(TSMF_IFMAN* ifman)
+{
+       uint32 StreamId;
+       int error = 0;
+       TSMF_STREAM* stream;
+       TSMF_PRESENTATION* presentation;
+
+       DEBUG_DVC("");
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       stream_seek(ifman->input, 16);
+
+       if (presentation == NULL)
+               error = 1;
+       else
+       {
+               stream_read_uint32(ifman->input, StreamId);
+               stream_seek_uint32(ifman->input); /* numMediaType */
+               stream = tsmf_stream_new(presentation, StreamId);
+               if (stream)
+                       tsmf_stream_set_format(stream, ifman->decoder_name, ifman->input);
+       }
+       ifman->output_pending = true;
+       return error;
+}
+
+int tsmf_ifman_set_topology_request(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+
+       stream_check_size(ifman->output, 8);
+       stream_write_uint32(ifman->output, 1); /* TopologyReady */
+       stream_write_uint32(ifman->output, 0); /* Result */
+       ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB;
+       return 0;
+}
+
+int tsmf_ifman_remove_stream(TSMF_IFMAN* ifman)
+{
+       int error = 0;
+       uint32 StreamId;
+       TSMF_STREAM* stream;
+       TSMF_PRESENTATION* presentation;
+
+       DEBUG_DVC("");
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       stream_seek(ifman->input, 16);
+
+       if (presentation == NULL)
+               error = 1;
+       else
+       {
+               stream_read_uint32(ifman->input, StreamId);
+               stream = tsmf_stream_find_by_id(presentation, StreamId);
+               if (stream)
+                       tsmf_stream_free(stream);
+               else
+                       error = 1;
+       }
+       ifman->output_pending = true;
+       return error;
+}
+
+int tsmf_ifman_shutdown_presentation(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+
+       DEBUG_DVC("");
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       if (presentation)
+               tsmf_presentation_free(presentation);
+
+       stream_check_size(ifman->output, 4);
+       stream_write_uint32(ifman->output, 0); /* Result */
+       ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB;
+       return 0;
+}
+
+int tsmf_ifman_on_stream_volume(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_on_channel_volume(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_set_video_window(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_update_geometry_info(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+       uint32 numGeometryInfo;
+       uint32 Left;
+       uint32 Top;
+       uint32 Width;
+       uint32 Height;
+       uint32 cbVisibleRect;
+       RDP_RECT* rects = NULL;
+       int num_rects = 0;
+       int error = 0;
+       int i;
+       int pos;
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       stream_seek(ifman->input, 16);
+
+       stream_read_uint32(ifman->input, numGeometryInfo);
+       pos = stream_get_pos(ifman->input);
+
+       stream_seek(ifman->input, 12); /* VideoWindowId (8 bytes), VideoWindowState (4 bytes) */
+       stream_read_uint32(ifman->input, Width);
+       stream_read_uint32(ifman->input, Height);
+       stream_read_uint32(ifman->input, Left);
+       stream_read_uint32(ifman->input, Top);
+
+       stream_set_pos(ifman->input, pos + numGeometryInfo);
+       stream_read_uint32(ifman->input, cbVisibleRect);
+       num_rects = cbVisibleRect / 16;
+
+       DEBUG_DVC("numGeometryInfo %d Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d",
+               numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects);
+
+       if (presentation == NULL)
+               error = 1;
+       else
+       {
+               if (num_rects > 0)
+               {
+                       rects = (RDP_RECT*) xzalloc(sizeof(RDP_RECT) * num_rects);
+                       for (i = 0; i < num_rects; i++)
+                       {
+                               stream_read_uint16(ifman->input, rects[i].y); /* Top */
+                               stream_seek_uint16(ifman->input);
+                               stream_read_uint16(ifman->input, rects[i].x); /* Left */
+                               stream_seek_uint16(ifman->input);
+                               stream_read_uint16(ifman->input, rects[i].height); /* Bottom */
+                               stream_seek_uint16(ifman->input);
+                               stream_read_uint16(ifman->input, rects[i].width); /* Right */
+                               stream_seek_uint16(ifman->input);
+                               rects[i].width -= rects[i].x;
+                               rects[i].height -= rects[i].y;
+
+                               DEBUG_DVC("rect %d: %d %d %d %d", i,
+                                       rects[i].x, rects[i].y, rects[i].width, rects[i].height);
+                       }
+               }
+               tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects);
+       }
+       ifman->output_pending = true;
+       return error;
+}
+
+int tsmf_ifman_set_allocator(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_notify_preroll(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_on_sample(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+       TSMF_STREAM* stream;
+       uint32 StreamId;
+       uint64 SampleStartTime;
+       uint64 SampleEndTime;
+       uint64 ThrottleDuration;
+       uint32 SampleExtensions;
+       uint32 cbData;
+
+       stream_seek(ifman->input, 16);
+       stream_read_uint32(ifman->input, StreamId);
+       stream_seek_uint32(ifman->input); /* numSample */
+       stream_read_uint64(ifman->input, SampleStartTime);
+       stream_read_uint64(ifman->input, SampleEndTime);
+       stream_read_uint64(ifman->input, ThrottleDuration);
+       stream_seek_uint32(ifman->input); /* SampleFlags */
+       stream_read_uint32(ifman->input, SampleExtensions);
+       stream_read_uint32(ifman->input, cbData);
+       
+       DEBUG_DVC("MessageId %d StreamId %d SampleStartTime %d SampleEndTime %d "
+               "ThrottleDuration %d SampleExtensions %d cbData %d",
+               ifman->message_id, StreamId, (int)SampleStartTime, (int)SampleEndTime,
+               (int)ThrottleDuration, SampleExtensions, cbData);
+
+       presentation = tsmf_presentation_find_by_id(ifman->presentation_id);
+       if (presentation == NULL)
+       {
+               DEBUG_WARN("unknown presentation id");
+               return 1;
+       }
+       stream = tsmf_stream_find_by_id(presentation, StreamId);
+       if (stream == NULL)
+       {
+               DEBUG_WARN("unknown stream id");
+               return 1;
+       }
+       tsmf_stream_push_sample(stream, ifman->channel_callback,
+               ifman->message_id, SampleStartTime, SampleEndTime, ThrottleDuration, SampleExtensions,
+               cbData, stream_get_tail(ifman->input));
+
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_on_flush(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+       uint32 StreamId;
+
+       stream_seek(ifman->input, 16);
+       stream_read_uint32(ifman->input, StreamId);
+       DEBUG_DVC("StreamId %d", StreamId);
+
+       presentation = tsmf_presentation_find_by_id(ifman->presentation_id);
+       if (presentation == NULL)
+       {
+               DEBUG_WARN("unknown presentation id");
+               return 1;
+       }
+
+       tsmf_presentation_flush(presentation);
+
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_on_end_of_stream(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+       TSMF_STREAM* stream;
+       uint32 StreamId;
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       stream_seek(ifman->input, 16);
+       stream_read_uint32(ifman->input, StreamId);
+       stream = tsmf_stream_find_by_id(presentation, StreamId);
+       tsmf_stream_end(stream);
+
+       DEBUG_DVC("StreamId %d", StreamId);
+
+       stream_check_size(ifman->output, 16);
+       stream_write_uint32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
+       stream_write_uint32(ifman->output, StreamId); /* StreamId */
+       stream_write_uint32(ifman->output, TSMM_CLIENT_EVENT_ENDOFSTREAM); /* EventId */
+       stream_write_uint32(ifman->output, 0); /* cbData */
+       ifman->output_interface_id = TSMF_INTERFACE_CLIENT_NOTIFICATIONS | STREAM_ID_PROXY;
+
+       return 0;
+}
+
+int tsmf_ifman_on_playback_started(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+
+       DEBUG_DVC("");
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       if (presentation)
+               tsmf_presentation_start(presentation);
+       else
+               DEBUG_WARN("unknown presentation id");
+
+       stream_check_size(ifman->output, 16);
+       stream_write_uint32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
+       stream_write_uint32(ifman->output, 0); /* StreamId */
+       stream_write_uint32(ifman->output, TSMM_CLIENT_EVENT_START_COMPLETED); /* EventId */
+       stream_write_uint32(ifman->output, 0); /* cbData */
+       ifman->output_interface_id = TSMF_INTERFACE_CLIENT_NOTIFICATIONS | STREAM_ID_PROXY;
+
+       return 0;
+}
+
+int tsmf_ifman_on_playback_paused(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_on_playback_restarted(TSMF_IFMAN* ifman)
+{
+       DEBUG_DVC("");
+       ifman->output_pending = true;
+       return 0;
+}
+
+int tsmf_ifman_on_playback_stopped(TSMF_IFMAN* ifman)
+{
+       TSMF_PRESENTATION* presentation;
+
+       DEBUG_DVC("");
+
+       presentation = tsmf_presentation_find_by_id(stream_get_tail(ifman->input));
+       if (presentation)
+               tsmf_presentation_stop(presentation);
+       else
+               DEBUG_WARN("unknown presentation id");
+
+       stream_check_size(ifman->output, 16);
+       stream_write_uint32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
+       stream_write_uint32(ifman->output, 0); /* StreamId */
+       stream_write_uint32(ifman->output, TSMM_CLIENT_EVENT_STOP_COMPLETED); /* EventId */
+       stream_write_uint32(ifman->output, 0); /* cbData */
+       ifman->output_interface_id = TSMF_INTERFACE_CLIENT_NOTIFICATIONS | STREAM_ID_PROXY;
+
+       return 0;
+}
+
+int tsmf_ifman_on_playback_rate_changed(TSMF_IFMAN * ifman)
+{
+       DEBUG_DVC("");
+
+       stream_check_size(ifman->output, 16);
+       stream_write_uint32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
+       stream_write_uint32(ifman->output, 0); /* StreamId */
+       stream_write_uint32(ifman->output, TSMM_CLIENT_EVENT_MONITORCHANGED); /* EventId */
+       stream_write_uint32(ifman->output, 0); /* cbData */
+       ifman->output_interface_id = TSMF_INTERFACE_CLIENT_NOTIFICATIONS | STREAM_ID_PROXY;
+
+       return 0;
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_ifman.h b/channels/drdynvc/tsmf/tsmf_ifman.h
new file mode 100644 (file)
index 0000000..7a68c06
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Interface Manipulation
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_IFMAN_H
+#define __TSMF_IFMAN_H
+
+typedef struct _TSMF_IFMAN TSMF_IFMAN;
+struct _TSMF_IFMAN
+{
+       IWTSVirtualChannelCallback* channel_callback;
+       const char* decoder_name;
+       const char* audio_name;
+       const char* audio_device;
+       uint8 presentation_id[16];
+       uint32 stream_id;
+       uint32 message_id;
+
+       STREAM* input;
+       uint32 input_size;
+       STREAM* output;
+       boolean output_pending;
+       uint32 output_interface_id;
+};
+
+int tsmf_ifman_rim_exchange_capability_request(TSMF_IFMAN* ifman);
+int tsmf_ifman_exchange_capability_request(TSMF_IFMAN* ifman);
+int tsmf_ifman_check_format_support_request(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_new_presentation(TSMF_IFMAN* ifman);
+int tsmf_ifman_add_stream(TSMF_IFMAN* ifman);
+int tsmf_ifman_set_topology_request(TSMF_IFMAN* ifman);
+int tsmf_ifman_remove_stream(TSMF_IFMAN* ifman);
+int tsmf_ifman_shutdown_presentation(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_stream_volume(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_channel_volume(TSMF_IFMAN* ifman);
+int tsmf_ifman_set_video_window(TSMF_IFMAN* ifman);
+int tsmf_ifman_update_geometry_info(TSMF_IFMAN* ifman);
+int tsmf_ifman_set_allocator(TSMF_IFMAN* ifman);
+int tsmf_ifman_notify_preroll(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_sample(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_flush(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_end_of_stream(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_playback_started(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_playback_paused(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_playback_restarted(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_playback_stopped(TSMF_IFMAN* ifman);
+int tsmf_ifman_on_playback_rate_changed(TSMF_IFMAN* ifman);
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_main.c b/channels/drdynvc/tsmf/tsmf_main.c
new file mode 100644 (file)
index 0000000..e0c944d
--- /dev/null
@@ -0,0 +1,448 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+
+#include "drdynvc_types.h"
+#include "tsmf_constants.h"
+#include "tsmf_ifman.h"
+#include "tsmf_media.h"
+
+#include "tsmf_main.h"
+
+typedef struct _TSMF_LISTENER_CALLBACK TSMF_LISTENER_CALLBACK;
+
+typedef struct _TSMF_CHANNEL_CALLBACK TSMF_CHANNEL_CALLBACK;
+
+typedef struct _TSMF_PLUGIN TSMF_PLUGIN;
+
+struct _TSMF_LISTENER_CALLBACK
+{
+       IWTSListenerCallback iface;
+
+       IWTSPlugin* plugin;
+       IWTSVirtualChannelManager* channel_mgr;
+};
+
+struct _TSMF_CHANNEL_CALLBACK
+{
+       IWTSVirtualChannelCallback iface;
+
+       IWTSPlugin* plugin;
+       IWTSVirtualChannelManager* channel_mgr;
+       IWTSVirtualChannel* channel;
+
+       uint8 presentation_id[16];
+       uint32 stream_id;
+};
+
+struct _TSMF_PLUGIN
+{
+       IWTSPlugin iface;
+
+       TSMF_LISTENER_CALLBACK* listener_callback;
+
+       const char* decoder_name;
+       const char* audio_name;
+       const char* audio_device;
+};
+
+void tsmf_playback_ack(IWTSVirtualChannelCallback* pChannelCallback,
+       uint32 message_id, uint64 duration, uint32 data_size)
+{
+       STREAM* s;
+       int error;
+       TSMF_CHANNEL_CALLBACK* callback = (TSMF_CHANNEL_CALLBACK*) pChannelCallback;
+
+       s = stream_new(32);
+       stream_write_uint32(s, TSMF_INTERFACE_CLIENT_NOTIFICATIONS | STREAM_ID_PROXY);
+       stream_write_uint32(s, message_id);
+       stream_write_uint32(s, PLAYBACK_ACK); /* FunctionId */
+       stream_write_uint32(s, callback->stream_id); /* StreamId */
+       stream_write_uint64(s, duration); /* DataDuration */
+       stream_write_uint64(s, data_size); /* cbData */
+       
+       DEBUG_DVC("response size %d", stream_get_length(s));
+       error = callback->channel->Write(callback->channel, stream_get_length(s), stream_get_head(s), NULL);
+       if (error)
+       {
+               DEBUG_WARN("response error %d", error);
+       }
+       stream_free(s);
+}
+
+boolean tsmf_push_event(IWTSVirtualChannelCallback* pChannelCallback,
+       RDP_EVENT* event)
+{
+       int error;
+       TSMF_CHANNEL_CALLBACK* callback = (TSMF_CHANNEL_CALLBACK*) pChannelCallback;
+
+       error = callback->channel_mgr->PushEvent(callback->channel_mgr, event);
+       if (error)
+       {
+               DEBUG_WARN("response error %d", error);
+               return false;
+       }
+       return true;
+}
+
+static int tsmf_on_data_received(IWTSVirtualChannelCallback* pChannelCallback,
+       uint32 cbSize,
+       uint8* pBuffer)
+{
+       int length;
+       STREAM* input;
+       STREAM* output;
+       int error = -1;
+       TSMF_IFMAN ifman;
+       uint32 MessageId;
+       uint32 FunctionId;
+       uint32 InterfaceId;
+       TSMF_CHANNEL_CALLBACK* callback = (TSMF_CHANNEL_CALLBACK*) pChannelCallback;
+
+       /* 2.2.1 Shared Message Header (SHARED_MSG_HEADER) */
+       if (cbSize < 12)
+       {
+               DEBUG_WARN("invalid size. cbSize=%d", cbSize);
+               return 1;
+       }
+       input = stream_new(0);
+       stream_attach(input, (uint8*) pBuffer, cbSize);
+       output = stream_new(256);
+       stream_seek(output, 8);
+
+       stream_read_uint32(input, InterfaceId);
+       stream_read_uint32(input, MessageId);
+       stream_read_uint32(input, FunctionId);
+       DEBUG_DVC("cbSize=%d InterfaceId=0x%X MessageId=0x%X FunctionId=0x%X",
+               cbSize, InterfaceId, MessageId, FunctionId);
+
+       memset(&ifman, 0, sizeof(TSMF_IFMAN));
+       ifman.channel_callback = pChannelCallback;
+       ifman.decoder_name = ((TSMF_PLUGIN*) callback->plugin)->decoder_name;
+       ifman.audio_name = ((TSMF_PLUGIN*) callback->plugin)->audio_name;
+       ifman.audio_device = ((TSMF_PLUGIN*) callback->plugin)->audio_device;
+       memcpy(ifman.presentation_id, callback->presentation_id, 16);
+       ifman.stream_id = callback->stream_id;
+       ifman.message_id = MessageId;
+       ifman.input = input;
+       ifman.input_size = cbSize - 12;
+       ifman.output = output;
+       ifman.output_pending = false;
+       ifman.output_interface_id = InterfaceId;
+
+       switch (InterfaceId)
+       {
+               case TSMF_INTERFACE_CAPABILITIES | STREAM_ID_NONE:
+
+                       switch (FunctionId)
+                       {
+                               case RIM_EXCHANGE_CAPABILITY_REQUEST:
+                                       error = tsmf_ifman_rim_exchange_capability_request(&ifman);
+                                       break;
+
+                               default:
+                                       break;
+                       }
+                       break;
+
+               case TSMF_INTERFACE_DEFAULT | STREAM_ID_PROXY:
+
+                       switch (FunctionId)
+                       {
+                               case SET_CHANNEL_PARAMS:
+                                       memcpy(callback->presentation_id, stream_get_tail(input), 16);
+                                       stream_seek(input, 16);
+                                       stream_read_uint32(input, callback->stream_id);
+                                       DEBUG_DVC("SET_CHANNEL_PARAMS StreamId=%d", callback->stream_id);
+                                       ifman.output_pending = true;
+                                       error = 0;
+                                       break;
+
+                               case EXCHANGE_CAPABILITIES_REQ:
+                                       error = tsmf_ifman_exchange_capability_request(&ifman);
+                                       break;
+
+                               case CHECK_FORMAT_SUPPORT_REQ:
+                                       error = tsmf_ifman_check_format_support_request(&ifman);
+                                       break;
+
+                               case ON_NEW_PRESENTATION:
+                                       error = tsmf_ifman_on_new_presentation(&ifman);
+                                       break;
+
+                               case ADD_STREAM:
+                                       error = tsmf_ifman_add_stream(&ifman);
+                                       break;
+
+                               case SET_TOPOLOGY_REQ:
+                                       error = tsmf_ifman_set_topology_request(&ifman);
+                                       break;
+
+                               case REMOVE_STREAM:
+                                       error = tsmf_ifman_remove_stream(&ifman);
+                                       break;
+
+                               case SHUTDOWN_PRESENTATION_REQ:
+                                       error = tsmf_ifman_shutdown_presentation(&ifman);
+                                       break;
+
+                               case ON_STREAM_VOLUME:
+                                       error = tsmf_ifman_on_stream_volume(&ifman);
+                                       break;
+
+                               case ON_CHANNEL_VOLUME:
+                                       error = tsmf_ifman_on_channel_volume(&ifman);
+                                       break;
+
+                               case SET_VIDEO_WINDOW:
+                                       error = tsmf_ifman_set_video_window(&ifman);
+                                       break;
+
+                               case UPDATE_GEOMETRY_INFO:
+                                       error = tsmf_ifman_update_geometry_info(&ifman);
+                                       break;
+
+                               case SET_ALLOCATOR:
+                                       error = tsmf_ifman_set_allocator(&ifman);
+                                       break;
+
+                               case NOTIFY_PREROLL:
+                                       error = tsmf_ifman_notify_preroll(&ifman);
+                                       break;
+
+                               case ON_SAMPLE:
+                                       error = tsmf_ifman_on_sample(&ifman);
+                                       break;
+
+                               case ON_FLUSH:
+                                       error = tsmf_ifman_on_flush(&ifman);
+                                       break;
+
+                               case ON_END_OF_STREAM:
+                                       error = tsmf_ifman_on_end_of_stream(&ifman);
+                                       break;
+
+                               case ON_PLAYBACK_STARTED:
+                                       error = tsmf_ifman_on_playback_started(&ifman);
+                                       break;
+
+                               case ON_PLAYBACK_PAUSED:
+                                       error = tsmf_ifman_on_playback_paused(&ifman);
+                                       break;
+
+                               case ON_PLAYBACK_RESTARTED:
+                                       error = tsmf_ifman_on_playback_restarted(&ifman);
+                                       break;
+
+                               case ON_PLAYBACK_STOPPED:
+                                       error = tsmf_ifman_on_playback_stopped(&ifman);
+                                       break;
+
+                               case ON_PLAYBACK_RATE_CHANGED:
+                                       error = tsmf_ifman_on_playback_rate_changed(&ifman);
+                                       break;
+
+                               default:
+                                       break;
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+
+       stream_detach(input);
+       stream_free(input);
+       input = NULL;
+       ifman.input = NULL;
+
+       if (error == -1)
+       {
+               switch (FunctionId)
+               {
+                       case RIMCALL_RELEASE:
+                               /* [MS-RDPEXPS] 2.2.2.2 Interface Release (IFACE_RELEASE)
+                                  This message does not require a reply. */
+                               error = 0;
+                               ifman.output_pending = 1;
+                               break;
+
+                       case RIMCALL_QUERYINTERFACE:
+                               /* [MS-RDPEXPS] 2.2.2.1.2 Query Interface Response (QI_RSP)
+                                  This message is not supported in this channel. */
+                               error = 0;
+                               break;
+               }
+
+               if (error == -1)
+               {
+                       DEBUG_WARN("InterfaceId 0x%X FunctionId 0x%X not processed.",
+                               InterfaceId, FunctionId);
+                       /* When a request is not implemented we return empty response indicating error */
+               }
+               error = 0;
+       }
+
+       if (error == 0 && !ifman.output_pending)
+       {
+               /* Response packet does not have FunctionId */
+               length = stream_get_length(output);
+               stream_set_pos(output, 0);
+               stream_write_uint32(output, ifman.output_interface_id);
+               stream_write_uint32(output, MessageId);
+
+               DEBUG_DVC("response size %d", length);
+               error = callback->channel->Write(callback->channel, length, stream_get_head(output), NULL);
+               if (error)
+               {
+                       DEBUG_WARN("response error %d", error);
+               }
+       }
+
+       stream_free(output);
+
+       return error;
+}
+
+static int tsmf_on_close(IWTSVirtualChannelCallback* pChannelCallback)
+{
+       TSMF_STREAM* stream;
+       TSMF_PRESENTATION* presentation;
+       TSMF_CHANNEL_CALLBACK* callback = (TSMF_CHANNEL_CALLBACK*) pChannelCallback;
+
+       DEBUG_DVC("");
+
+       if (callback->stream_id)
+       {
+               presentation = tsmf_presentation_find_by_id(callback->presentation_id);
+               if (presentation)
+               {
+                       stream = tsmf_stream_find_by_id(presentation, callback->stream_id);
+                       if (stream)
+                               tsmf_stream_free(stream);
+               }
+       }
+       xfree(pChannelCallback);
+
+       return 0;
+}
+
+static int tsmf_on_new_channel_connection(IWTSListenerCallback* pListenerCallback,
+       IWTSVirtualChannel* pChannel,
+       uint8* Data,
+       int* pbAccept,
+       IWTSVirtualChannelCallback** ppCallback)
+{
+       TSMF_CHANNEL_CALLBACK* callback;
+       TSMF_LISTENER_CALLBACK* listener_callback = (TSMF_LISTENER_CALLBACK*) pListenerCallback;
+
+       DEBUG_DVC("");
+
+       callback = xnew(TSMF_CHANNEL_CALLBACK);
+       callback->iface.OnDataReceived = tsmf_on_data_received;
+       callback->iface.OnClose = tsmf_on_close;
+       callback->plugin = listener_callback->plugin;
+       callback->channel_mgr = listener_callback->channel_mgr;
+       callback->channel = pChannel;
+       *ppCallback = (IWTSVirtualChannelCallback*) callback;
+
+       return 0;
+}
+
+static int tsmf_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager* pChannelMgr)
+{
+       TSMF_PLUGIN* tsmf = (TSMF_PLUGIN*) pPlugin;
+
+       DEBUG_DVC("");
+
+       tsmf->listener_callback = xnew(TSMF_LISTENER_CALLBACK);
+       tsmf->listener_callback->iface.OnNewChannelConnection = tsmf_on_new_channel_connection;
+       tsmf->listener_callback->plugin = pPlugin;
+       tsmf->listener_callback->channel_mgr = pChannelMgr;
+       return pChannelMgr->CreateListener(pChannelMgr, "TSMF", 0,
+               (IWTSListenerCallback*) tsmf->listener_callback, NULL);
+}
+
+static int tsmf_plugin_terminated(IWTSPlugin* pPlugin)
+{
+       TSMF_PLUGIN* tsmf = (TSMF_PLUGIN*) pPlugin;
+
+       DEBUG_DVC("");
+
+       if (tsmf->listener_callback)
+               xfree(tsmf->listener_callback);
+       xfree(tsmf);
+
+       return 0;
+}
+
+static void tsmf_process_plugin_data(IWTSPlugin* pPlugin, RDP_PLUGIN_DATA* data)
+{
+       TSMF_PLUGIN* tsmf = (TSMF_PLUGIN*) pPlugin;
+
+       while (data && data->size > 0)
+       {
+               if (data->data[0] && ( strcmp((char*)data->data[0], "tsmf") == 0 || strstr((char*)data->data[0], "/tsmf.") != NULL) )
+               {
+                       if (data->data[1] && strcmp((char*)data->data[1], "decoder") == 0)
+                       {
+                               tsmf->decoder_name = data->data[2];
+                       }
+                       else if (data->data[1] && strcmp((char*)data->data[1], "audio") == 0)
+                       {
+                               tsmf->audio_name = data->data[2];
+                               tsmf->audio_device = data->data[3];
+                       }
+               }
+               
+               data = (RDP_PLUGIN_DATA*)(((void*)data) + data->size);
+       }
+}
+
+int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
+{
+       TSMF_PLUGIN * tsmf;
+       int error = 0;
+
+       tsmf = (TSMF_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "tsmf");
+       if (tsmf == NULL)
+       {
+               tsmf = xnew(TSMF_PLUGIN);
+
+               tsmf->iface.Initialize = tsmf_plugin_initialize;
+               tsmf->iface.Connected = NULL;
+               tsmf->iface.Disconnected = NULL;
+               tsmf->iface.Terminated = tsmf_plugin_terminated;
+               error = pEntryPoints->RegisterPlugin(pEntryPoints, "tsmf", (IWTSPlugin*) tsmf);
+
+               tsmf_media_init();
+       }
+       if (error == 0)
+       {
+               tsmf_process_plugin_data((IWTSPlugin*) tsmf,
+                       pEntryPoints->GetPluginData(pEntryPoints));
+       }
+       return error;
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_main.h b/channels/drdynvc/tsmf/tsmf_main.h
new file mode 100644 (file)
index 0000000..deda1ce
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_MAIN_H
+#define __TSMF_MAIN_H
+
+void tsmf_playback_ack(IWTSVirtualChannelCallback* pChannelCallback,
+       uint32 message_id, uint64 duration, uint32 data_size);
+boolean tsmf_push_event(IWTSVirtualChannelCallback* pChannelCallback,
+       RDP_EVENT* event);
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_media.c b/channels/drdynvc/tsmf/tsmf_media.c
new file mode 100644 (file)
index 0000000..134ac78
--- /dev/null
@@ -0,0 +1,795 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Media Container
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/mutex.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/sleep.h>
+#include <freerdp/plugins/tsmf.h>
+
+#include "drdynvc_types.h"
+#include "tsmf_constants.h"
+#include "tsmf_types.h"
+#include "tsmf_decoder.h"
+#include "tsmf_audio.h"
+#include "tsmf_main.h"
+#include "tsmf_codec.h"
+#include "tsmf_media.h"
+
+#define AUDIO_TOLERANCE 10000000LL
+
+struct _TSMF_PRESENTATION
+{
+       uint8 presentation_id[GUID_SIZE];
+
+       const char* audio_name;
+       const char* audio_device;
+       int eos;
+
+       uint32 last_x;
+       uint32 last_y;
+       uint32 last_width;
+       uint32 last_height;
+       uint16 last_num_rects;
+       RDP_RECT* last_rects;
+
+       uint32 output_x;
+       uint32 output_y;
+       uint32 output_width;
+       uint32 output_height;
+       uint16 output_num_rects;
+       RDP_RECT* output_rects;
+
+       IWTSVirtualChannelCallback* channel_callback;
+
+       uint64 audio_start_time;
+       uint64 audio_end_time;
+
+       /* The stream list could be accessed by differnt threads and need to be protected. */
+       freerdp_mutex mutex;
+
+       LIST* stream_list;
+};
+
+struct _TSMF_STREAM
+{
+       uint32 stream_id;
+
+       TSMF_PRESENTATION* presentation;
+
+       ITSMFDecoder* decoder;
+
+       int major_type;
+       int eos;
+       uint32 width;
+       uint32 height;
+
+       ITSMFAudioDevice* audio;
+       uint32 sample_rate;
+       uint32 channels;
+       uint32 bits_per_sample;
+
+       /* The end_time of last played sample */
+       uint64 last_end_time;
+       /* Next sample should not start before this system time. */
+       uint64 next_start_time;
+
+       freerdp_thread* thread;
+
+       LIST* sample_list;
+
+       /* The sample ack response queue will be accessed only by the stream thread. */
+       LIST* sample_ack_list;
+};
+
+struct _TSMF_SAMPLE
+{
+       uint32 sample_id;
+       uint64 start_time;
+       uint64 end_time;
+       uint64 duration;
+       uint32 extensions;
+       uint32 data_size;
+       uint8* data;
+       uint32 decoded_size;
+       uint32 pixfmt;
+
+       TSMF_STREAM* stream;
+       IWTSVirtualChannelCallback* channel_callback;
+       uint64 ack_time;
+};
+
+static LIST* presentation_list = NULL;
+
+static uint64 get_current_time(void)
+{
+       struct timeval tp;
+
+       gettimeofday(&tp, 0);
+       return ((uint64)tp.tv_sec) * 10000000LL + ((uint64)tp.tv_usec) * 10LL;
+}
+
+static TSMF_SAMPLE* tsmf_stream_pop_sample(TSMF_STREAM* stream, int sync)
+{
+       TSMF_STREAM* s;
+       LIST_ITEM* item;
+       TSMF_SAMPLE* sample;
+       boolean pending = false;
+       TSMF_PRESENTATION* presentation = stream->presentation;
+
+       if (!stream->sample_list->head)
+               return NULL;
+
+       if (sync)
+       {
+               if (stream->major_type == TSMF_MAJOR_TYPE_AUDIO)
+               {
+                       /* Check if some other stream has earlier sample that needs to be played first */
+                       if (stream->last_end_time > AUDIO_TOLERANCE)
+                       {
+                               freerdp_mutex_lock(presentation->mutex);
+                               for (item = presentation->stream_list->head; item; item = item->next)
+                               {
+                                       s = (TSMF_STREAM*) item->data;
+                                       if (s != stream && !s->eos && s->last_end_time &&
+                                               s->last_end_time < stream->last_end_time - AUDIO_TOLERANCE)
+                                       {
+                                                       pending = true;
+                                                       break;
+                                       }
+                               }
+                               freerdp_mutex_unlock(presentation->mutex);
+                       }
+               }
+               else
+               {
+                       if (stream->last_end_time > presentation->audio_end_time)
+                       {
+                               pending = true;
+                       }
+               }
+       }
+       if (pending)
+               return NULL;
+
+       freerdp_thread_lock(stream->thread);
+       sample = (TSMF_SAMPLE*) list_dequeue(stream->sample_list);
+       freerdp_thread_unlock(stream->thread);
+
+       if (sample && sample->end_time > stream->last_end_time)
+               stream->last_end_time = sample->end_time;
+
+       return sample;
+}
+
+static void tsmf_sample_free(TSMF_SAMPLE* sample)
+{
+       if (sample->data)
+               xfree(sample->data);
+       xfree(sample);
+}
+
+static void tsmf_sample_ack(TSMF_SAMPLE* sample)
+{
+       tsmf_playback_ack(sample->channel_callback, sample->sample_id, sample->duration, sample->data_size);
+}
+
+static void tsmf_sample_queue_ack(TSMF_SAMPLE* sample)
+{
+       TSMF_STREAM* stream = sample->stream;
+
+       list_enqueue(stream->sample_ack_list, sample);
+}
+
+static void tsmf_stream_process_ack(TSMF_STREAM* stream)
+{
+       TSMF_SAMPLE* sample;
+       uint64 ack_time;
+
+       ack_time = get_current_time();
+       while (stream->sample_ack_list->head && !freerdp_thread_is_stopped(stream->thread))
+       {
+               sample = (TSMF_SAMPLE*) list_peek(stream->sample_ack_list);
+               if (sample->ack_time > ack_time)
+                       break;
+
+               sample = list_dequeue(stream->sample_ack_list);
+               tsmf_sample_ack(sample);
+               tsmf_sample_free(sample);
+       }
+}
+
+TSMF_PRESENTATION* tsmf_presentation_new(const uint8* guid, IWTSVirtualChannelCallback* pChannelCallback)
+{
+       TSMF_PRESENTATION* presentation;
+
+       presentation = tsmf_presentation_find_by_id(guid);
+       if (presentation)
+       {
+               DEBUG_WARN("duplicated presentation id!");
+               return NULL;
+       }
+
+       presentation = xnew(TSMF_PRESENTATION);
+
+       memcpy(presentation->presentation_id, guid, GUID_SIZE);
+       presentation->channel_callback = pChannelCallback;
+
+       presentation->mutex = freerdp_mutex_new();
+       presentation->stream_list = list_new();
+
+       list_enqueue(presentation_list, presentation);
+
+       return presentation;
+}
+
+TSMF_PRESENTATION* tsmf_presentation_find_by_id(const uint8* guid)
+{
+       LIST_ITEM* item;
+       TSMF_PRESENTATION* presentation;
+
+       for (item = presentation_list->head; item; item = item->next)
+       {
+               presentation = (TSMF_PRESENTATION*) item->data;
+               if (memcmp(presentation->presentation_id, guid, GUID_SIZE) == 0)
+                       return presentation;
+       }
+       return NULL;
+}
+
+static void tsmf_presentation_restore_last_video_frame(TSMF_PRESENTATION* presentation)
+{
+       RDP_REDRAW_EVENT* revent;
+
+       if (presentation->last_width && presentation->last_height)
+       {
+               revent = (RDP_REDRAW_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_TSMF, RDP_EVENT_TYPE_TSMF_REDRAW,
+                       NULL, NULL);
+               revent->x = presentation->last_x;
+               revent->y = presentation->last_y;
+               revent->width = presentation->last_width;
+               revent->height = presentation->last_height;
+               if (!tsmf_push_event(presentation->channel_callback, (RDP_EVENT*) revent))
+               {
+                       freerdp_event_free((RDP_EVENT*) revent);
+               }
+               presentation->last_x = 0;
+               presentation->last_y = 0;
+               presentation->last_width = 0;
+               presentation->last_height = 0;
+       }
+}
+
+static void tsmf_sample_playback_video(TSMF_SAMPLE* sample)
+{
+       uint64 t;
+       RDP_VIDEO_FRAME_EVENT* vevent;
+       TSMF_STREAM* stream = sample->stream;
+       TSMF_PRESENTATION* presentation = stream->presentation;
+
+       DEBUG_DVC("MessageId %d EndTime %d data_size %d consumed.",
+               sample->sample_id, (int)sample->end_time, sample->data_size);
+
+       if (sample->data)
+       {
+               t = get_current_time();
+               if (stream->next_start_time > t &&
+                       (sample->end_time >= presentation->audio_start_time ||
+                       sample->end_time < stream->last_end_time))
+               {
+                       freerdp_usleep((stream->next_start_time - t) / 10);
+               }
+               stream->next_start_time = t + sample->duration - 50000;
+
+               if (presentation->last_x != presentation->output_x ||
+                       presentation->last_y != presentation->output_y ||
+                       presentation->last_width != presentation->output_width ||
+                       presentation->last_height != presentation->output_height ||
+                       presentation->last_num_rects != presentation->output_num_rects ||
+                       (presentation->last_rects && presentation->output_rects &&
+                       memcmp(presentation->last_rects, presentation->output_rects,
+                       presentation->last_num_rects * sizeof(RDP_RECT)) != 0))
+               {
+                       tsmf_presentation_restore_last_video_frame(presentation);
+
+                       presentation->last_x = presentation->output_x;
+                       presentation->last_y = presentation->output_y;
+                       presentation->last_width = presentation->output_width;
+                       presentation->last_height = presentation->output_height;
+
+                       if (presentation->last_rects)
+                       {
+                               xfree(presentation->last_rects);
+                               presentation->last_rects = NULL;
+                       }
+                       presentation->last_num_rects = presentation->output_num_rects;
+                       if (presentation->last_num_rects > 0)
+                       {
+                               presentation->last_rects = xzalloc(presentation->last_num_rects * sizeof(RDP_RECT));
+                               memcpy(presentation->last_rects, presentation->output_rects,
+                                       presentation->last_num_rects * sizeof(RDP_RECT));
+                       }
+               }
+
+               vevent = (RDP_VIDEO_FRAME_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_TSMF, RDP_EVENT_TYPE_TSMF_VIDEO_FRAME,
+                       NULL, NULL);
+               vevent->frame_data = sample->data;
+               vevent->frame_size = sample->decoded_size;
+               vevent->frame_pixfmt = sample->pixfmt;
+               vevent->frame_width = sample->stream->width;
+               vevent->frame_height = sample->stream->height;
+               vevent->x = presentation->output_x;
+               vevent->y = presentation->output_y;
+               vevent->width = presentation->output_width;
+               vevent->height = presentation->output_height;
+               if (presentation->output_num_rects > 0)
+               {
+                       vevent->num_visible_rects = presentation->output_num_rects;
+                       vevent->visible_rects = (RDP_RECT*) xzalloc(presentation->output_num_rects * sizeof(RDP_RECT));
+                       memcpy(vevent->visible_rects, presentation->output_rects,
+                               presentation->output_num_rects * sizeof(RDP_RECT));
+               }
+
+               /* The frame data ownership is passed to the event object, and is freed after the event is processed. */
+               sample->data = NULL;
+               sample->decoded_size = 0;
+
+               if (!tsmf_push_event(sample->channel_callback, (RDP_EVENT*) vevent))
+               {
+                       freerdp_event_free((RDP_EVENT*) vevent);
+               }
+
+#if 0
+               /* Dump a .ppm image for every 30 frames. Assuming the frame is in YUV format, we
+                  extract the Y values to create a grayscale image. */
+               static int frame_id = 0;
+               char buf[100];
+               FILE * fp;
+               if ((frame_id % 30) == 0)
+               {
+                       snprintf(buf, sizeof(buf), "/tmp/FreeRDP_Frame_%d.ppm", frame_id);
+                       fp = fopen(buf, "wb");
+                       fwrite("P5\n", 1, 3, fp);
+                       snprintf(buf, sizeof(buf), "%d %d\n", sample->stream->width, sample->stream->height);
+                       fwrite(buf, 1, strlen(buf), fp);
+                       fwrite("255\n", 1, 4, fp);
+                       fwrite(sample->data, 1, sample->stream->width * sample->stream->height, fp);
+                       fflush(fp);
+                       fclose(fp);
+               }
+               frame_id++;
+#endif
+       }
+}
+
+static void tsmf_sample_playback_audio(TSMF_SAMPLE* sample)
+{
+       uint64 latency = 0;
+       TSMF_STREAM* stream = sample->stream;
+
+       DEBUG_DVC("MessageId %d EndTime %d consumed.",
+               sample->sample_id, (int)sample->end_time);
+
+       if (sample->stream->audio && sample->data)
+       {
+               sample->stream->audio->Play(sample->stream->audio,
+                       sample->data, sample->decoded_size);
+               sample->data = NULL;
+               sample->decoded_size = 0;
+
+               if (stream->audio && stream->audio->GetLatency)
+                       latency = stream->audio->GetLatency(stream->audio);
+       }
+       else
+       {
+               latency = 0;
+       }
+
+       sample->ack_time = latency + get_current_time();
+       stream->last_end_time = sample->end_time + latency;
+       stream->presentation->audio_start_time = sample->start_time + latency;
+       stream->presentation->audio_end_time = sample->end_time + latency;
+}
+
+static void tsmf_sample_playback(TSMF_SAMPLE* sample)
+{
+       boolean ret = false;
+       uint32 width;
+       uint32 height;
+       uint32 pixfmt = 0;
+       TSMF_STREAM* stream = sample->stream;
+
+       if (stream->decoder)
+               ret = stream->decoder->Decode(stream->decoder, sample->data, sample->data_size, sample->extensions);
+       if (!ret)
+       {
+               tsmf_sample_ack(sample);
+               tsmf_sample_free(sample);
+               return;
+       }
+
+       xfree(sample->data);
+       sample->data = NULL;
+
+       if (stream->major_type == TSMF_MAJOR_TYPE_VIDEO)
+       {
+               if (stream->decoder->GetDecodedFormat)
+               {
+                       pixfmt = stream->decoder->GetDecodedFormat(stream->decoder);
+                       if (pixfmt == ((uint32) -1))
+                       {
+                               tsmf_sample_ack(sample);
+                               tsmf_sample_free(sample);
+                               return;
+                       }
+                       sample->pixfmt = pixfmt;
+               }
+
+               if (stream->decoder->GetDecodedDimension)
+                       ret = stream->decoder->GetDecodedDimension(stream->decoder, &width, &height);
+               if (ret && (width != stream->width || height != stream->height))
+               {
+                       DEBUG_DVC("video dimension changed to %d x %d", width, height);
+                       stream->width = width;
+                       stream->height = height;
+               }
+       }
+
+       if (stream->decoder->GetDecodedData)
+       {
+               sample->data = stream->decoder->GetDecodedData(stream->decoder, &sample->decoded_size);
+       }
+
+       switch (sample->stream->major_type)
+       {
+               case TSMF_MAJOR_TYPE_VIDEO:
+                       tsmf_sample_playback_video(sample);
+                       tsmf_sample_ack(sample);
+                       tsmf_sample_free(sample);
+                       break;
+               case TSMF_MAJOR_TYPE_AUDIO:
+                       tsmf_sample_playback_audio(sample);
+                       tsmf_sample_queue_ack(sample);
+                       break;
+       }
+}
+
+static void* tsmf_stream_playback_func(void* arg)
+{
+       TSMF_SAMPLE* sample;
+       TSMF_STREAM* stream = (TSMF_STREAM*) arg;
+       TSMF_PRESENTATION* presentation = stream->presentation;
+
+       DEBUG_DVC("in %d", stream->stream_id);
+
+       if (stream->major_type == TSMF_MAJOR_TYPE_AUDIO &&
+               stream->sample_rate && stream->channels && stream->bits_per_sample)
+       {
+               stream->audio = tsmf_load_audio_device(
+                       presentation->audio_name && presentation->audio_name[0] ? presentation->audio_name : NULL,
+                       presentation->audio_device && presentation->audio_device[0] ? presentation->audio_device : NULL);
+               if (stream->audio)
+               {
+                       stream->audio->SetFormat(stream->audio,
+                               stream->sample_rate, stream->channels, stream->bits_per_sample);
+               }
+       }
+       while (!freerdp_thread_is_stopped(stream->thread))
+       {
+               tsmf_stream_process_ack(stream);
+               sample = tsmf_stream_pop_sample(stream, 1);
+               if (sample)
+                       tsmf_sample_playback(sample);
+               else
+                       freerdp_usleep(5000);
+       }
+       if (stream->eos || presentation->eos)
+       {
+               while ((sample = tsmf_stream_pop_sample(stream, 1)) != NULL)
+                       tsmf_sample_playback(sample);
+       }
+       if (stream->audio)
+       {
+               stream->audio->Free(stream->audio);
+               stream->audio = NULL;
+       }
+
+       freerdp_thread_quit(stream->thread);
+
+       DEBUG_DVC("out %d", stream->stream_id);
+
+       return NULL;
+}
+
+static void tsmf_stream_start(TSMF_STREAM* stream)
+{
+       if (!freerdp_thread_is_running(stream->thread))
+       {
+               freerdp_thread_start(stream->thread, tsmf_stream_playback_func, stream);
+       }
+}
+
+static void tsmf_stream_stop(TSMF_STREAM* stream)
+{
+       if (freerdp_thread_is_running(stream->thread))
+       {
+               freerdp_thread_stop(stream->thread);
+       }
+}
+
+void tsmf_presentation_start(TSMF_PRESENTATION* presentation)
+{
+       LIST_ITEM* item;
+       TSMF_STREAM* stream;
+
+       for (item = presentation->stream_list->head; item; item = item->next)
+       {
+               stream = (TSMF_STREAM*) item->data;
+               tsmf_stream_start(stream);
+       }
+}
+
+void tsmf_presentation_stop(TSMF_PRESENTATION* presentation)
+{
+       LIST_ITEM* item;
+       TSMF_STREAM* stream;
+
+       tsmf_presentation_flush(presentation);
+
+       for (item = presentation->stream_list->head; item; item = item->next)
+       {
+               stream = (TSMF_STREAM*) item->data;
+               tsmf_stream_stop(stream);
+       }
+
+       tsmf_presentation_restore_last_video_frame(presentation);
+       if (presentation->last_rects)
+       {
+               xfree(presentation->last_rects);
+               presentation->last_rects = NULL;
+       }
+       presentation->last_num_rects = 0;
+       if (presentation->output_rects)
+       {
+               xfree(presentation->output_rects);
+               presentation->output_rects = NULL;
+       }
+       presentation->output_num_rects = 0;
+}
+
+void tsmf_presentation_set_geometry_info(TSMF_PRESENTATION* presentation,
+       uint32 x, uint32 y, uint32 width, uint32 height,
+       int num_rects, RDP_RECT* rects)
+{
+       presentation->output_x = x;
+       presentation->output_y = y;
+       presentation->output_width = width;
+       presentation->output_height = height;
+       if (presentation->output_rects)
+               xfree(presentation->output_rects);
+       presentation->output_rects = rects;
+       presentation->output_num_rects = num_rects;
+}
+
+void tsmf_presentation_set_audio_device(TSMF_PRESENTATION* presentation, const char* name, const char* device)
+{
+       presentation->audio_name = name;
+       presentation->audio_device = device;
+}
+
+static void tsmf_stream_flush(TSMF_STREAM* stream)
+{
+       TSMF_SAMPLE* sample;
+
+       while ((sample = tsmf_stream_pop_sample(stream, 0)) != NULL)
+               tsmf_sample_free(sample);
+
+       while ((sample = list_dequeue(stream->sample_ack_list)) != NULL)
+               tsmf_sample_free(sample);
+
+       if (stream->audio)
+               stream->audio->Flush(stream->audio);
+
+       stream->eos = 0;
+       stream->last_end_time = 0;
+       stream->next_start_time = 0;
+       if (stream->major_type == TSMF_MAJOR_TYPE_AUDIO)
+       {
+               stream->presentation->audio_start_time = 0;
+               stream->presentation->audio_end_time = 0;
+       }
+}
+
+void tsmf_presentation_flush(TSMF_PRESENTATION* presentation)
+{
+       LIST_ITEM* item;
+       TSMF_STREAM * stream;
+
+       for (item = presentation->stream_list->head; item; item = item->next)
+       {
+               stream = (TSMF_STREAM*) item->data;
+               tsmf_stream_flush(stream);
+       }
+
+       presentation->eos = 0;
+       presentation->audio_start_time = 0;
+       presentation->audio_end_time = 0;
+}
+
+void tsmf_presentation_free(TSMF_PRESENTATION* presentation)
+{
+       TSMF_STREAM* stream;
+
+       tsmf_presentation_stop(presentation);
+       list_remove(presentation_list, presentation);
+
+       while (presentation->stream_list->head)
+       {
+               stream = (TSMF_STREAM*) list_peek(presentation->stream_list);
+               tsmf_stream_free(stream);
+       }
+       list_free(presentation->stream_list);
+
+       freerdp_mutex_free(presentation->mutex);
+
+       xfree(presentation);
+}
+
+TSMF_STREAM* tsmf_stream_new(TSMF_PRESENTATION* presentation, uint32 stream_id)
+{
+       TSMF_STREAM* stream;
+
+       stream = tsmf_stream_find_by_id(presentation, stream_id);
+       if (stream)
+       {
+               DEBUG_WARN("duplicated stream id %d!", stream_id);
+               return NULL;
+       }
+
+       stream = xnew(TSMF_STREAM);
+
+       stream->stream_id = stream_id;
+       stream->presentation = presentation;
+       stream->thread = freerdp_thread_new();
+       stream->sample_list = list_new();
+       stream->sample_ack_list = list_new();
+
+       freerdp_mutex_lock(presentation->mutex);
+       list_enqueue(presentation->stream_list, stream);
+       freerdp_mutex_unlock(presentation->mutex);
+
+       return stream;
+}
+
+TSMF_STREAM* tsmf_stream_find_by_id(TSMF_PRESENTATION* presentation, uint32 stream_id)
+{
+       LIST_ITEM* item;
+       TSMF_STREAM* stream;
+
+       for (item = presentation->stream_list->head; item; item = item->next)
+       {
+               stream = (TSMF_STREAM*) item->data;
+               if (stream->stream_id == stream_id)
+                       return stream;
+       }
+       return NULL;
+}
+
+void tsmf_stream_set_format(TSMF_STREAM* stream, const char* name, STREAM* s)
+{
+       TS_AM_MEDIA_TYPE mediatype;
+
+       if (stream->decoder)
+       {
+               DEBUG_WARN("duplicated call");
+               return;
+       }
+
+       tsmf_codec_parse_media_type(&mediatype, s);
+
+       if (mediatype.MajorType == TSMF_MAJOR_TYPE_VIDEO)
+       {
+               DEBUG_DVC("video width %d height %d bit_rate %d frame_rate %f codec_data %d",
+                       mediatype.Width, mediatype.Height, mediatype.BitRate,
+                       (double)mediatype.SamplesPerSecond.Numerator / (double)mediatype.SamplesPerSecond.Denominator,
+                       mediatype.ExtraDataSize);
+       }
+       else if (mediatype.MajorType == TSMF_MAJOR_TYPE_AUDIO)
+       {
+               DEBUG_DVC("audio channel %d sample_rate %d bits_per_sample %d codec_data %d",
+                       mediatype.Channels, mediatype.SamplesPerSecond.Numerator, mediatype.BitsPerSample,
+                       mediatype.ExtraDataSize);
+               stream->sample_rate = mediatype.SamplesPerSecond.Numerator;
+               stream->channels = mediatype.Channels;
+               stream->bits_per_sample = mediatype.BitsPerSample;
+               if (stream->bits_per_sample == 0)
+                       stream->bits_per_sample = 16;
+       }
+
+       stream->major_type = mediatype.MajorType;
+       stream->width = mediatype.Width;
+       stream->height = mediatype.Height;
+       stream->decoder = tsmf_load_decoder(name, &mediatype);
+}
+
+void tsmf_stream_end(TSMF_STREAM* stream)
+{
+       stream->eos = 1;
+       stream->presentation->eos = 1;
+}
+
+void tsmf_stream_free(TSMF_STREAM* stream)
+{
+       TSMF_PRESENTATION* presentation = stream->presentation;
+
+       tsmf_stream_stop(stream);
+       tsmf_stream_flush(stream);
+
+       freerdp_mutex_lock(presentation->mutex);
+       list_remove(presentation->stream_list, stream);
+       freerdp_mutex_unlock(presentation->mutex);
+
+       list_free(stream->sample_list);
+       list_free(stream->sample_ack_list);
+
+       if (stream->decoder)
+               stream->decoder->Free(stream->decoder);
+
+       freerdp_thread_free(stream->thread);
+
+       xfree(stream);
+}
+
+void tsmf_stream_push_sample(TSMF_STREAM* stream, IWTSVirtualChannelCallback* pChannelCallback,
+       uint32 sample_id, uint64 start_time, uint64 end_time, uint64 duration, uint32 extensions,
+       uint32 data_size, uint8* data)
+{
+       TSMF_SAMPLE* sample;
+
+       sample = xnew(TSMF_SAMPLE);
+
+       sample->sample_id = sample_id;
+       sample->start_time = start_time;
+       sample->end_time = end_time;
+       sample->duration = duration;
+       sample->extensions = extensions;
+       sample->stream = stream;
+       sample->channel_callback = pChannelCallback;
+       sample->data_size = data_size;
+       sample->data = xzalloc(data_size + TSMF_BUFFER_PADDING_SIZE);
+       memcpy(sample->data, data, data_size);
+
+       freerdp_thread_lock(stream->thread);
+       list_enqueue(stream->sample_list, sample);
+       freerdp_thread_unlock(stream->thread);
+}
+
+void tsmf_media_init(void)
+{
+       if (presentation_list == NULL)
+               presentation_list = list_new();
+}
+
diff --git a/channels/drdynvc/tsmf/tsmf_media.h b/channels/drdynvc/tsmf/tsmf_media.h
new file mode 100644 (file)
index 0000000..eac3e00
--- /dev/null
@@ -0,0 +1,59 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Media Container
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The media container maintains a global list of presentations, and a list of
+ * streams in each presentation.
+ */
+
+#ifndef __TSMF_MEDIA_H
+#define __TSMF_MEDIA_H
+
+typedef struct _TSMF_PRESENTATION TSMF_PRESENTATION;
+
+typedef struct _TSMF_STREAM TSMF_STREAM;
+
+typedef struct _TSMF_SAMPLE TSMF_SAMPLE;
+
+TSMF_PRESENTATION* tsmf_presentation_new(const uint8* guid, IWTSVirtualChannelCallback* pChannelCallback);
+TSMF_PRESENTATION* tsmf_presentation_find_by_id(const uint8* guid);
+void tsmf_presentation_start(TSMF_PRESENTATION* presentation);
+void tsmf_presentation_stop(TSMF_PRESENTATION* presentation);
+void tsmf_presentation_set_geometry_info(TSMF_PRESENTATION* presentation,
+       uint32 x, uint32 y, uint32 width, uint32 height,
+       int num_rects, RDP_RECT* rects);
+void tsmf_presentation_set_audio_device(TSMF_PRESENTATION* presentation,
+       const char* name, const char* device);
+void tsmf_presentation_flush(TSMF_PRESENTATION* presentation);
+void tsmf_presentation_free(TSMF_PRESENTATION* presentation);
+
+TSMF_STREAM* tsmf_stream_new(TSMF_PRESENTATION* presentation, uint32 stream_id);
+TSMF_STREAM* tsmf_stream_find_by_id(TSMF_PRESENTATION* presentation, uint32 stream_id);
+void tsmf_stream_set_format(TSMF_STREAM* stream, const char* name, STREAM* s);
+void tsmf_stream_end(TSMF_STREAM* stream);
+void tsmf_stream_free(TSMF_STREAM* stream);
+
+void tsmf_stream_push_sample(TSMF_STREAM* stream, IWTSVirtualChannelCallback* pChannelCallback,
+       uint32 sample_id, uint64 start_time, uint64 end_time, uint64 duration, uint32 extensions,
+       uint32 data_size, uint8* data);
+
+void tsmf_media_init(void);
+
+#endif
+
diff --git a/channels/drdynvc/tsmf/tsmf_types.h b/channels/drdynvc/tsmf/tsmf_types.h
new file mode 100644 (file)
index 0000000..20745cb
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Video Redirection Virtual Channel - Types
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_TYPES_H
+#define __TSMF_TYPES_H
+
+#include <freerdp/types.h>
+
+typedef struct _TS_AM_MEDIA_TYPE
+{
+       int MajorType;
+       int SubType;
+       int FormatType;
+
+       uint32 Width;
+       uint32 Height;  
+       uint32 BitRate;
+       struct
+       {
+               uint32 Numerator;
+               uint32 Denominator;
+       } SamplesPerSecond;
+       uint32 Channels;
+       uint32 BitsPerSample;
+       uint32 BlockAlign;
+       const uint8* ExtraData;
+       uint32 ExtraDataSize;
+} TS_AM_MEDIA_TYPE;
+
+#endif
+
diff --git a/channels/rail/CMakeLists.txt b/channels/rail/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3164111
--- /dev/null
@@ -0,0 +1,32 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(RAIL_SRCS
+       rail_main.c
+       rail_main.h
+       rail_orders.c
+       rail_orders.h)
+
+add_library(rail ${RAIL_SRCS})
+set_target_properties(rail PROPERTIES PREFIX "")
+
+target_link_libraries(rail freerdp-utils)
+
+install(TARGETS rail DESTINATION ${FREERDP_PLUGIN_PATH})
+
diff --git a/channels/rail/rail_main.c b/channels/rail/rail_main.c
new file mode 100644 (file)
index 0000000..58d1de4
--- /dev/null
@@ -0,0 +1,251 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RAIL Virtual Channel Plugin
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/utils/rail.h>
+#include <freerdp/rail.h>
+
+#include "rail_orders.h"
+#include "rail_main.h"
+
+void rail_send_channel_data(void* rail_object, void* data, size_t length)
+{
+       STREAM* s = NULL;
+       railPlugin* plugin = (railPlugin*) rail_object;
+
+       s = stream_new(length);
+       stream_write(s, data, length);
+
+       svc_plugin_send((rdpSvcPlugin*) plugin, s);
+}
+
+static void on_free_rail_channel_event(RDP_EVENT* event)
+{
+       if (event->event_class == RDP_EVENT_CLASS_RAIL)
+       {
+               rail_free_cloned_order(event->event_type, event->user_data);
+       }
+}
+
+void rail_send_channel_event(void* rail_object, uint16 event_type, void* param)
+{
+       void * payload = NULL;
+       RDP_EVENT* out_event = NULL;
+       railPlugin* plugin = (railPlugin*) rail_object;
+
+       payload = rail_clone_order(event_type, param);
+
+       if (payload != NULL)
+       {
+               out_event = freerdp_event_new(RDP_EVENT_CLASS_RAIL, event_type,
+                       on_free_rail_channel_event, payload);
+
+               svc_plugin_send_event((rdpSvcPlugin*) plugin, out_event);
+       }
+}
+
+static void rail_process_connect(rdpSvcPlugin* plugin)
+{
+       railPlugin* rail = (railPlugin*) plugin;
+
+       rail->rail_order = rail_order_new();
+       rail->rail_order->plugin_data = (RDP_PLUGIN_DATA*)plugin->channel_entry_points.pExtendedData;
+       rail->rail_order->plugin = rail;
+}
+
+static void rail_process_terminate(rdpSvcPlugin* plugin)
+{
+
+}
+
+static void rail_process_receive(rdpSvcPlugin* plugin, STREAM* s)
+{
+       railPlugin* rail = (railPlugin*) plugin;
+       rail_order_recv(rail->rail_order, s);
+       stream_free(s);
+}
+
+static void rail_process_plugin_data(rdpRailOrder* rail_order, RDP_PLUGIN_DATA* data)
+{
+       char* exeOrFile;
+
+       exeOrFile = (char*) data->data[0];
+
+       if (strlen(exeOrFile) >= 2)
+       {
+               if (strncmp(exeOrFile, "||", 2) != 0)
+                       rail_order->exec.flags |= RAIL_EXEC_FLAG_FILE;
+       }
+
+       rail_string_to_unicode_string(rail_order, (char*) data->data[0], &rail_order->exec.exeOrFile);
+       rail_string_to_unicode_string(rail_order, (char*) data->data[1], &rail_order->exec.workingDir);
+       rail_string_to_unicode_string(rail_order, (char*) data->data[2], &rail_order->exec.arguments);
+
+       rail_send_client_exec_order(rail_order);
+}
+
+static void rail_recv_set_sysparams_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RDP_PLUGIN_DATA* data;
+       RAIL_SYSPARAM_ORDER* sysparam;
+
+       /* Send System Parameters */
+
+       sysparam = (RAIL_SYSPARAM_ORDER*)event->user_data;
+       memmove(&rail_order->sysparam, sysparam, sizeof(RAIL_SYSPARAM_ORDER));
+
+       rail_send_client_sysparams_order(rail_order);
+
+       /* execute */
+
+       rail_order->exec.flags = RAIL_EXEC_FLAG_EXPAND_ARGUMENTS;
+
+       data = rail_order->plugin_data;
+       while (data && data->size > 0)
+       {
+               rail_process_plugin_data(rail_order, data);
+               data = (RDP_PLUGIN_DATA*)(((void*) data) + data->size);
+       }
+}
+
+static void rail_recv_exec_remote_app_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RDP_PLUGIN_DATA* data = (RDP_PLUGIN_DATA*) event->user_data;
+
+       rail_process_plugin_data(rail_order, data);
+}
+
+static void rail_recv_activate_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_ACTIVATE_ORDER* activate = (RAIL_ACTIVATE_ORDER*) event->user_data;
+
+       memcpy(&rail_order->activate, activate, sizeof(RAIL_ACTIVATE_ORDER));
+       rail_send_client_activate_order(rail_order);
+}
+
+static void rail_recv_sysmenu_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_SYSMENU_ORDER* sysmenu = (RAIL_SYSMENU_ORDER*) event->user_data;
+
+       memcpy(&rail_order->sysmenu, sysmenu, sizeof(RAIL_SYSMENU_ORDER));
+       rail_send_client_sysmenu_order(rail_order);
+}
+
+static void rail_recv_syscommand_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_SYSCOMMAND_ORDER* syscommand = (RAIL_SYSCOMMAND_ORDER*) event->user_data;
+
+       memcpy(&rail_order->syscommand, syscommand, sizeof(RAIL_SYSCOMMAND_ORDER));
+       rail_send_client_syscommand_order(rail_order);
+}
+
+static void rail_recv_notify_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_NOTIFY_EVENT_ORDER* notify = (RAIL_NOTIFY_EVENT_ORDER*) event->user_data;
+
+       memcpy(&rail_order->notify_event, notify, sizeof(RAIL_NOTIFY_EVENT_ORDER));
+       rail_send_client_notify_event_order(rail_order);
+}
+
+static void rail_recv_window_move_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_WINDOW_MOVE_ORDER* window_move = (RAIL_WINDOW_MOVE_ORDER*) event->user_data;
+
+       memcpy(&rail_order->window_move, window_move, sizeof(RAIL_WINDOW_MOVE_ORDER));
+       rail_send_client_window_move_order(rail_order);
+}
+
+static void rail_recv_app_req_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_GET_APPID_REQ_ORDER* get_appid_req = (RAIL_GET_APPID_REQ_ORDER*) event->user_data;
+
+       memcpy(&rail_order->get_appid_req, get_appid_req, sizeof(RAIL_GET_APPID_REQ_ORDER));
+       rail_send_client_get_appid_req_order(rail_order);
+}
+
+static void rail_recv_langbarinfo_event(rdpRailOrder* rail_order, RDP_EVENT* event)
+{
+       RAIL_LANGBAR_INFO_ORDER* langbar_info = (RAIL_LANGBAR_INFO_ORDER*) event->user_data;
+
+       memcpy(&rail_order->langbar_info, langbar_info, sizeof(RAIL_LANGBAR_INFO_ORDER));
+       rail_send_client_langbar_info_order(rail_order);
+}
+
+static void rail_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       railPlugin* rail = NULL;
+       rail = (railPlugin*) plugin;
+
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS:
+                       rail_recv_set_sysparams_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_EXEC_REMOTE_APP:
+                       rail_recv_exec_remote_app_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE:
+                       rail_recv_activate_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_SYSMENU:
+                       rail_recv_sysmenu_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND:
+                       rail_recv_syscommand_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_NOTIFY_EVENT:
+                       rail_recv_notify_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE:
+                       rail_recv_window_move_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_APPID_REQ:
+                       rail_recv_app_req_event(rail->rail_order, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CLIENT_LANGBARINFO:
+                       rail_recv_langbarinfo_event(rail->rail_order, event);
+                       break;
+
+               default:
+                       break;
+       }
+
+       freerdp_event_free(event);
+}
+
+DEFINE_SVC_PLUGIN(rail, "rail", 
+       CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP |
+       CHANNEL_OPTION_COMPRESS_RDP | CHANNEL_OPTION_SHOW_PROTOCOL)
+
diff --git a/channels/rail/rail_main.h b/channels/rail/rail_main.h
new file mode 100644 (file)
index 0000000..49870a5
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RAIL Virtual Channel Plugin
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_MAIN_H
+#define        __RAIL_MAIN_H
+
+#include <freerdp/rail.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+
+struct rdp_rail_order
+{
+       UNICONV* uniconv;
+       RDP_PLUGIN_DATA* plugin_data;
+       void* plugin;
+       RAIL_HANDSHAKE_ORDER handshake;
+       RAIL_CLIENT_STATUS_ORDER client_status;
+       RAIL_EXEC_ORDER exec;
+       RAIL_EXEC_RESULT_ORDER exec_result;
+       RAIL_SYSPARAM_ORDER sysparam;
+       RAIL_ACTIVATE_ORDER activate;
+       RAIL_SYSMENU_ORDER sysmenu;
+       RAIL_SYSCOMMAND_ORDER syscommand;
+       RAIL_NOTIFY_EVENT_ORDER notify_event;
+       RAIL_MINMAXINFO_ORDER minmaxinfo;
+       RAIL_LOCALMOVESIZE_ORDER localmovesize;
+       RAIL_WINDOW_MOVE_ORDER window_move;
+       RAIL_LANGBAR_INFO_ORDER langbar_info;
+       RAIL_GET_APPID_REQ_ORDER get_appid_req;
+       RAIL_GET_APPID_RESP_ORDER get_appid_resp;
+};
+typedef struct rdp_rail_order rdpRailOrder;
+
+struct rail_plugin
+{
+       rdpSvcPlugin plugin;
+       rdpRailOrder* rail_order;
+};
+typedef struct rail_plugin railPlugin;
+
+void rail_send_channel_event(void* rail_object, uint16 event_type, void* param);
+void rail_send_channel_data(void* rail_object, void* data, size_t length);
+
+#ifdef WITH_DEBUG_RAIL
+#define DEBUG_RAIL(fmt, ...) DEBUG_CLASS(RAIL, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_RAIL(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __RAIL_MAIN_H */
diff --git a/channels/rail/rail_orders.c b/channels/rail/rail_orders.c
new file mode 100644 (file)
index 0000000..0674be0
--- /dev/null
@@ -0,0 +1,633 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Remote Applications Integrated Locally (RAIL) Orders
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/rail.h>
+#include <freerdp/utils/memory.h>
+
+#include "rail_orders.h"
+
+#define RAIL_ORDER_TYPE_EXEC                   0x0001
+#define RAIL_ORDER_TYPE_ACTIVATE               0x0002
+#define RAIL_ORDER_TYPE_SYSPARAM               0x0003
+#define RAIL_ORDER_TYPE_SYSCOMMAND             0x0004
+#define RAIL_ORDER_TYPE_HANDSHAKE              0x0005
+#define RAIL_ORDER_TYPE_NOTIFY_EVENT           0x0006
+#define RAIL_ORDER_TYPE_WINDOW_MOVE            0x0008
+#define RAIL_ORDER_TYPE_LOCALMOVESIZE          0x0009
+#define RAIL_ORDER_TYPE_MINMAXINFO             0x000A
+#define RAIL_ORDER_TYPE_CLIENT_STATUS          0x000B
+#define RAIL_ORDER_TYPE_SYSMENU                        0x000C
+#define RAIL_ORDER_TYPE_LANGBAR_INFO           0x000D
+#define RAIL_ORDER_TYPE_EXEC_RESULT            0x0080
+#define RAIL_ORDER_TYPE_GET_APPID_REQ          0x000E
+#define RAIL_ORDER_TYPE_GET_APPID_RESP         0x000F
+
+static const char* const RAIL_ORDER_TYPE_STRINGS[] =
+{
+       "",
+       "Execute",
+       "Activate",
+       "System Parameters Update",
+       "System Command",
+       "Handshake",
+       "Notify Event",
+       "",
+       "Window Move",
+       "Local Move/Size",
+       "Min Max Info",
+       "Client Status",
+       "System Menu",
+       "Language Bar Info",
+       "Get Application ID Request",
+       "Get Application ID Response",
+       "Execute Result"
+};
+
+void rail_string_to_unicode_string(rdpRailOrder* rail_order, char* string, UNICODE_STRING* unicode_string)
+{
+       char* buffer;
+       size_t length = 0;
+
+       if (unicode_string->string != NULL)
+               xfree(unicode_string->string);
+
+       unicode_string->string = NULL;
+       unicode_string->length = 0;
+
+       if (string == NULL || strlen(string) < 1)
+               return;
+
+       buffer = freerdp_uniconv_out(rail_order->uniconv, string, &length);
+
+       unicode_string->string = (uint8*) buffer;
+       unicode_string->length = (uint16) length;
+}
+
+void rail_read_pdu_header(STREAM* s, uint16* orderType, uint16* orderLength)
+{
+       stream_read_uint16(s, *orderType); /* orderType (2 bytes) */
+       stream_read_uint16(s, *orderLength); /* orderLength (2 bytes) */
+}
+
+void rail_write_pdu_header(STREAM* s, uint16 orderType, uint16 orderLength)
+{
+       stream_write_uint16(s, orderType); /* orderType (2 bytes) */
+       stream_write_uint16(s, orderLength); /* orderLength (2 bytes) */
+}
+
+STREAM* rail_pdu_init(int length)
+{
+       STREAM* s;
+       s = stream_new(length + RAIL_PDU_HEADER_LENGTH);
+       stream_seek(s, RAIL_PDU_HEADER_LENGTH);
+       return s;
+}
+
+void rail_send_pdu(rdpRailOrder* rail_order, STREAM* s, uint16 orderType)
+{
+       uint16 orderLength;
+
+       orderLength = stream_get_length(s);
+       stream_set_pos(s, 0);
+
+       rail_write_pdu_header(s, orderType, orderLength);
+       stream_set_pos(s, orderLength);
+
+       /* send */
+       DEBUG_RAIL("Sending %s PDU, length:%d",
+                       RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)], orderLength);
+
+       rail_send_channel_data(rail_order->plugin, s->data, orderLength);
+}
+
+void rail_write_high_contrast(STREAM* s, HIGH_CONTRAST* high_contrast)
+{
+       high_contrast->colorSchemeLength = high_contrast->colorScheme.length + 2;
+       stream_write_uint32(s, high_contrast->flags); /* flags (4 bytes) */
+       stream_write_uint32(s, high_contrast->colorSchemeLength); /* colorSchemeLength (4 bytes) */
+       rail_write_unicode_string(s, &high_contrast->colorScheme); /* colorScheme */
+}
+
+void rail_read_handshake_order(STREAM* s, RAIL_HANDSHAKE_ORDER* handshake)
+{
+       stream_read_uint32(s, handshake->buildNumber); /* buildNumber (4 bytes) */
+}
+
+void rail_read_server_exec_result_order(STREAM* s, RAIL_EXEC_RESULT_ORDER* exec_result)
+{
+       stream_read_uint16(s, exec_result->flags); /* flags (2 bytes) */
+       stream_read_uint16(s, exec_result->execResult); /* execResult (2 bytes) */
+       stream_read_uint32(s, exec_result->rawResult); /* rawResult (4 bytes) */
+       stream_seek_uint16(s); /* padding (2 bytes) */
+       rail_read_unicode_string(s, &exec_result->exeOrFile); /* exeOrFile */
+}
+
+void rail_read_server_sysparam_order(STREAM* s, RAIL_SYSPARAM_ORDER* sysparam)
+{
+       uint8 body;
+       stream_read_uint32(s, sysparam->param); /* systemParam (4 bytes) */
+       stream_read_uint8(s, body); /* body (1 byte) */
+
+       switch (sysparam->param)
+       {
+               case SPI_SET_SCREEN_SAVE_ACTIVE:
+                       sysparam->setScreenSaveActive = (body != 0) ? true : false;
+                       break;
+
+               case SPI_SET_SCREEN_SAVE_SECURE:
+                       sysparam->setScreenSaveSecure = (body != 0) ? true : false;
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+void rail_read_server_minmaxinfo_order(STREAM* s, RAIL_MINMAXINFO_ORDER* minmaxinfo)
+{
+       stream_read_uint32(s, minmaxinfo->windowId); /* windowId (4 bytes) */
+       stream_read_uint16(s, minmaxinfo->maxWidth); /* maxWidth (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->maxHeight); /* maxHeight (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->maxPosX); /* maxPosX (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->maxPosY); /* maxPosY (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->minTrackWidth); /* minTrackWidth (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->minTrackHeight); /* minTrackHeight (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->maxTrackWidth); /* maxTrackWidth (2 bytes) */
+       stream_read_uint16(s, minmaxinfo->maxTrackHeight); /* maxTrackHeight (2 bytes) */
+}
+
+void rail_read_server_localmovesize_order(STREAM* s, RAIL_LOCALMOVESIZE_ORDER* localmovesize)
+{
+       uint16 isMoveSizeStart;
+       stream_read_uint32(s, localmovesize->windowId); /* windowId (4 bytes) */
+
+       stream_read_uint16(s, isMoveSizeStart); /* isMoveSizeStart (2 bytes) */
+       localmovesize->isMoveSizeStart = (isMoveSizeStart != 0) ? true : false;
+
+       stream_read_uint16(s, localmovesize->moveSizeType); /* moveSizeType (2 bytes) */
+       stream_read_uint16(s, localmovesize->posX); /* posX (2 bytes) */
+       stream_read_uint16(s, localmovesize->posY); /* posY (2 bytes) */
+}
+
+void rail_read_server_get_appid_resp_order(STREAM* s, RAIL_GET_APPID_RESP_ORDER* get_appid_resp)
+{
+       stream_read_uint32(s, get_appid_resp->windowId); /* windowId (4 bytes) */
+       stream_read(s, &get_appid_resp->applicationIdBuffer[0], 512); /* applicationId (256 UNICODE chars) */
+
+       get_appid_resp->applicationId.length = 512;
+       get_appid_resp->applicationId.string = &get_appid_resp->applicationIdBuffer[0];
+}
+
+void rail_read_langbar_info_order(STREAM* s, RAIL_LANGBAR_INFO_ORDER* langbar_info)
+{
+       stream_read_uint32(s, langbar_info->languageBarStatus); /* languageBarStatus (4 bytes) */
+}
+
+void rail_write_handshake_order(STREAM* s, RAIL_HANDSHAKE_ORDER* handshake)
+{
+       stream_write_uint32(s, handshake->buildNumber); /* buildNumber (4 bytes) */
+}
+
+void rail_write_client_status_order(STREAM* s, RAIL_CLIENT_STATUS_ORDER* client_status)
+{
+       stream_write_uint32(s, client_status->flags); /* flags (4 bytes) */
+}
+
+void rail_write_client_exec_order(STREAM* s, RAIL_EXEC_ORDER* exec)
+{
+       stream_write_uint16(s, exec->flags); /* flags (2 bytes) */
+       stream_write_uint16(s, exec->exeOrFile.length); /* exeOrFileLength (2 bytes) */
+       stream_write_uint16(s, exec->workingDir.length); /* workingDirLength (2 bytes) */
+       stream_write_uint16(s, exec->arguments.length); /* argumentsLength (2 bytes) */
+       rail_write_unicode_string_value(s, &exec->exeOrFile); /* exeOrFile */
+       rail_write_unicode_string_value(s, &exec->workingDir); /* workingDir */
+       rail_write_unicode_string_value(s, &exec->arguments); /* arguments */
+}
+
+void rail_write_client_sysparam_order(STREAM* s, RAIL_SYSPARAM_ORDER* sysparam)
+{
+       uint8 body;
+       stream_write_uint32(s, sysparam->param); /* systemParam (4 bytes) */
+
+       switch (sysparam->param)
+       {
+               case SPI_SET_DRAG_FULL_WINDOWS:
+                       body = sysparam->dragFullWindows;
+                       stream_write_uint8(s, body);
+                       break;
+
+               case SPI_SET_KEYBOARD_CUES:
+                       body = sysparam->keyboardCues;
+                       stream_write_uint8(s, body);
+                       break;
+
+               case SPI_SET_KEYBOARD_PREF:
+                       body = sysparam->keyboardPref;
+                       stream_write_uint8(s, body);
+                       break;
+
+               case SPI_SET_MOUSE_BUTTON_SWAP:
+                       body = sysparam->mouseButtonSwap;
+                       stream_write_uint8(s, body);
+                       break;
+
+               case SPI_SET_WORK_AREA:
+                       freerdp_write_rectangle_16(s, &sysparam->workArea);
+                       break;
+
+               case SPI_DISPLAY_CHANGE:
+                       freerdp_write_rectangle_16(s, &sysparam->displayChange);
+                       break;
+
+               case SPI_TASKBAR_POS:
+                       freerdp_write_rectangle_16(s, &sysparam->taskbarPos);
+                       break;
+
+               case SPI_SET_HIGH_CONTRAST:
+                       rail_write_high_contrast(s, &sysparam->highContrast);
+                       break;
+       }
+}
+
+void rail_write_client_activate_order(STREAM* s, RAIL_ACTIVATE_ORDER* activate)
+{
+       uint8 enabled;
+
+       stream_write_uint32(s, activate->windowId); /* windowId (4 bytes) */
+
+       enabled = activate->enabled;
+       stream_write_uint8(s, enabled); /* enabled (1 byte) */
+}
+
+void rail_write_client_sysmenu_order(STREAM* s, RAIL_SYSMENU_ORDER* sysmenu)
+{
+       stream_write_uint32(s, sysmenu->windowId); /* windowId (4 bytes) */
+       stream_write_uint16(s, sysmenu->left); /* left (2 bytes) */
+       stream_write_uint16(s, sysmenu->top); /* top (2 bytes) */
+}
+
+void rail_write_client_syscommand_order(STREAM* s, RAIL_SYSCOMMAND_ORDER* syscommand)
+{
+       stream_write_uint32(s, syscommand->windowId); /* windowId (4 bytes) */
+       stream_write_uint16(s, syscommand->command); /* command (2 bytes) */
+}
+
+void rail_write_client_notify_event_order(STREAM* s, RAIL_NOTIFY_EVENT_ORDER* notify_event)
+{
+       stream_write_uint32(s, notify_event->windowId); /* windowId (4 bytes) */
+       stream_write_uint32(s, notify_event->notifyIconId); /* notifyIconId (4 bytes) */
+       stream_write_uint32(s, notify_event->message); /* notifyIconId (4 bytes) */
+}
+
+void rail_write_client_window_move_order(STREAM* s, RAIL_WINDOW_MOVE_ORDER* window_move)
+{
+       stream_write_uint32(s, window_move->windowId); /* windowId (4 bytes) */
+       stream_write_uint16(s, window_move->left); /* left (2 bytes) */
+       stream_write_uint16(s, window_move->top); /* top (2 bytes) */
+       stream_write_uint16(s, window_move->right); /* right (2 bytes) */
+       stream_write_uint16(s, window_move->bottom); /* bottom (2 bytes) */
+}
+
+void rail_write_client_get_appid_req_order(STREAM* s, RAIL_GET_APPID_REQ_ORDER* get_appid_req)
+{
+       stream_write_uint32(s, get_appid_req->windowId); /* windowId (4 bytes) */
+}
+
+void rail_write_langbar_info_order(STREAM* s, RAIL_LANGBAR_INFO_ORDER* langbar_info)
+{
+       stream_write_uint32(s, langbar_info->languageBarStatus); /* languageBarStatus (4 bytes) */
+}
+
+void rail_recv_handshake_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_handshake_order(s, &rail_order->handshake);
+
+       rail_order->handshake.buildNumber = 0x00001DB0;
+       rail_send_handshake_order(rail_order);
+
+       rail_order->client_status.flags = RAIL_CLIENTSTATUS_ALLOWLOCALMOVESIZE;
+       rail_send_client_status_order(rail_order);
+
+       /* sysparam update */
+
+       rail_order->sysparam.params = 0;
+
+       rail_order->sysparam.params |= SPI_MASK_SET_HIGH_CONTRAST;
+       rail_order->sysparam.highContrast.colorScheme.string = NULL;
+       rail_order->sysparam.highContrast.colorScheme.length = 0;
+       rail_order->sysparam.highContrast.flags = 0x7E;
+
+       rail_order->sysparam.params |= SPI_MASK_SET_MOUSE_BUTTON_SWAP;
+       rail_order->sysparam.mouseButtonSwap = false;
+
+       rail_order->sysparam.params |= SPI_MASK_SET_KEYBOARD_PREF;
+       rail_order->sysparam.keyboardPref = false;
+
+       rail_order->sysparam.params |= SPI_MASK_SET_DRAG_FULL_WINDOWS;
+       rail_order->sysparam.dragFullWindows = false;
+
+       rail_order->sysparam.params |= SPI_MASK_SET_KEYBOARD_CUES;
+       rail_order->sysparam.keyboardCues = false;
+
+       rail_order->sysparam.params |= SPI_MASK_SET_WORK_AREA;
+       rail_order->sysparam.workArea.left = 0;
+       rail_order->sysparam.workArea.top = 0;
+       rail_order->sysparam.workArea.right = 1024;
+       rail_order->sysparam.workArea.bottom = 768;
+
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, &rail_order->sysparam);
+}
+
+void rail_recv_exec_result_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_server_exec_result_order(s, &rail_order->exec_result);
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS, &rail_order->exec_result);
+}
+
+void rail_recv_server_sysparam_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_server_sysparam_order(s, &rail_order->sysparam);
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM, &rail_order->sysparam);
+}
+
+void rail_recv_server_minmaxinfo_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_server_minmaxinfo_order(s, &rail_order->minmaxinfo);
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO, &rail_order->minmaxinfo);
+}
+
+void rail_recv_server_localmovesize_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_server_localmovesize_order(s, &rail_order->localmovesize);
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE, &rail_order->localmovesize);
+}
+
+void rail_recv_server_get_appid_resp_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_server_get_appid_resp_order(s, &rail_order->get_appid_resp);
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP, &rail_order->get_appid_resp);
+}
+
+void rail_recv_langbar_info_order(rdpRailOrder* rail_order, STREAM* s)
+{
+       rail_read_langbar_info_order(s, &rail_order->langbar_info);
+       rail_send_channel_event(rail_order->plugin,
+               RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO, &rail_order->langbar_info);
+}
+
+void rail_order_recv(rdpRailOrder* rail_order, STREAM* s)
+{
+       uint16 orderType;
+       uint16 orderLength;
+
+       rail_read_pdu_header(s, &orderType, &orderLength);
+
+       DEBUG_RAIL("Received %s PDU, length:%d",
+                       RAIL_ORDER_TYPE_STRINGS[((orderType & 0xF0) >> 3) + (orderType & 0x0F)], orderLength);
+
+       switch (orderType)
+       {
+               case RDP_RAIL_ORDER_HANDSHAKE:
+                       rail_recv_handshake_order(rail_order, s);
+                       break;
+
+               case RDP_RAIL_ORDER_EXEC_RESULT:
+                       rail_recv_exec_result_order(rail_order, s);
+                       break;
+
+               case RDP_RAIL_ORDER_SYSPARAM:
+                       rail_recv_server_sysparam_order(rail_order, s);
+                       break;
+
+               case RDP_RAIL_ORDER_MINMAXINFO:
+                       rail_recv_server_minmaxinfo_order(rail_order, s);
+                       break;
+
+               case RDP_RAIL_ORDER_LOCALMOVESIZE:
+                       rail_recv_server_localmovesize_order(rail_order, s);
+                       break;
+
+               case RDP_RAIL_ORDER_GET_APPID_RESP:
+                       rail_recv_server_get_appid_resp_order(rail_order, s);
+                       break;
+
+               case RDP_RAIL_ORDER_LANGBARINFO:
+                       rail_recv_langbar_info_order(rail_order, s);
+                       break;
+
+               default:
+                       printf("Unknown RAIL PDU order reveived.");
+                       break;
+       }
+}
+
+void rail_send_handshake_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_HANDSHAKE_ORDER_LENGTH);
+       rail_write_handshake_order(s, &rail_order->handshake);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_HANDSHAKE);
+}
+
+void rail_send_client_status_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_CLIENT_STATUS_ORDER_LENGTH);
+       rail_write_client_status_order(s, &rail_order->client_status);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_CLIENT_STATUS);
+}
+
+void rail_send_client_exec_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       int length;
+
+       length = RAIL_EXEC_ORDER_LENGTH +
+                       rail_order->exec.exeOrFile.length +
+                       rail_order->exec.workingDir.length +
+                       rail_order->exec.arguments.length;
+
+       s = rail_pdu_init(RAIL_EXEC_ORDER_LENGTH);
+       rail_write_client_exec_order(s, &rail_order->exec);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_EXEC);
+}
+
+void rail_send_client_sysparam_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       int length;
+
+       length = RAIL_SYSPARAM_ORDER_LENGTH;
+
+       switch (rail_order->sysparam.param)
+       {
+               case SPI_SET_DRAG_FULL_WINDOWS:
+               case SPI_SET_KEYBOARD_CUES:
+               case SPI_SET_KEYBOARD_PREF:
+               case SPI_SET_MOUSE_BUTTON_SWAP:
+                       length += 1;
+                       break;
+
+               case SPI_SET_WORK_AREA:
+               case SPI_DISPLAY_CHANGE:
+               case SPI_TASKBAR_POS:
+                       length += 8;
+                       break;
+
+               case SPI_SET_HIGH_CONTRAST:
+                       length += rail_order->sysparam.highContrast.colorSchemeLength + 10;
+                       break;
+       }
+
+       s = rail_pdu_init(RAIL_SYSPARAM_ORDER_LENGTH + 8);
+       rail_write_client_sysparam_order(s, &rail_order->sysparam);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_SYSPARAM);
+}
+
+void rail_send_client_sysparams_order(rdpRailOrder* rail_order)
+{
+       if (rail_order->sysparam.params & SPI_MASK_SET_HIGH_CONTRAST)
+       {
+               rail_order->sysparam.param = SPI_SET_HIGH_CONTRAST;
+               rail_send_client_sysparam_order(rail_order);
+       }
+
+       if (rail_order->sysparam.params & SPI_MASK_TASKBAR_POS)
+       {
+               rail_order->sysparam.param = SPI_TASKBAR_POS;
+               rail_send_client_sysparam_order(rail_order);
+       }
+
+       if (rail_order->sysparam.params & SPI_MASK_SET_MOUSE_BUTTON_SWAP)
+       {
+               rail_order->sysparam.param = SPI_SET_MOUSE_BUTTON_SWAP;
+               rail_send_client_sysparam_order(rail_order);
+       }
+
+       if (rail_order->sysparam.params & SPI_MASK_SET_KEYBOARD_PREF)
+       {
+               rail_order->sysparam.param = SPI_SET_KEYBOARD_PREF;
+               rail_send_client_sysparam_order(rail_order);
+       }
+
+       if (rail_order->sysparam.params & SPI_MASK_SET_DRAG_FULL_WINDOWS)
+       {
+               rail_order->sysparam.param = SPI_SET_DRAG_FULL_WINDOWS;
+               rail_send_client_sysparam_order(rail_order);
+       }
+
+       if (rail_order->sysparam.params & SPI_MASK_SET_KEYBOARD_CUES)
+       {
+               rail_order->sysparam.param = SPI_SET_KEYBOARD_CUES;
+               rail_send_client_sysparam_order(rail_order);
+       }
+
+       if (rail_order->sysparam.params & SPI_MASK_SET_WORK_AREA)
+       {
+               rail_order->sysparam.param = SPI_SET_WORK_AREA;
+               rail_send_client_sysparam_order(rail_order);
+       }
+}
+
+void rail_send_client_activate_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_ACTIVATE_ORDER_LENGTH);
+       rail_write_client_activate_order(s, &rail_order->activate);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_ACTIVATE);
+}
+
+void rail_send_client_sysmenu_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_SYSMENU_ORDER_LENGTH);
+       rail_write_client_sysmenu_order(s, &rail_order->sysmenu);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_SYSMENU);
+}
+
+void rail_send_client_syscommand_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_SYSCOMMAND_ORDER_LENGTH);
+       rail_write_client_syscommand_order(s, &rail_order->syscommand);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_SYSCOMMAND);
+}
+
+void rail_send_client_notify_event_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_NOTIFY_EVENT_ORDER_LENGTH);
+       rail_write_client_notify_event_order(s, &rail_order->notify_event);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_NOTIFY_EVENT);
+}
+
+void rail_send_client_window_move_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_WINDOW_MOVE_ORDER_LENGTH);
+       rail_write_client_window_move_order(s, &rail_order->window_move);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_WINDOW_MOVE);
+}
+
+void rail_send_client_get_appid_req_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_GET_APPID_REQ_ORDER_LENGTH);
+       rail_write_client_get_appid_req_order(s, &rail_order->get_appid_req);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_GET_APPID_REQ);
+}
+
+void rail_send_client_langbar_info_order(rdpRailOrder* rail_order)
+{
+       STREAM* s;
+       s = rail_pdu_init(RAIL_LANGBAR_INFO_ORDER_LENGTH);
+       rail_write_langbar_info_order(s, &rail_order->langbar_info);
+       rail_send_pdu(rail_order, s, RAIL_ORDER_TYPE_LANGBAR_INFO);
+}
+
+rdpRailOrder* rail_order_new()
+{
+       rdpRailOrder* rail_order;
+
+       rail_order = xnew(rdpRailOrder);
+
+       if (rail_order != NULL)
+       {
+               rail_order->uniconv = freerdp_uniconv_new();
+       }
+
+       return rail_order;
+}
+
+void rail_order_free(rdpRailOrder* rail_order)
+{
+       if (rail_order != NULL)
+       {
+               freerdp_uniconv_free(rail_order->uniconv);
+               xfree(rail_order);
+       }
+}
+
diff --git a/channels/rail/rail_orders.h b/channels/rail/rail_orders.h
new file mode 100644 (file)
index 0000000..fbbe20f
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Remote Applications Integrated Locally (RAIL)
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_ORDERS_H
+#define        __RAIL_ORDERS_H
+
+#include "rail_main.h"
+
+#define RAIL_ORDER_TYPE_EXEC                   0x0001
+#define RAIL_ORDER_TYPE_ACTIVATE               0x0002
+#define RAIL_ORDER_TYPE_SYSPARAM               0x0003
+#define RAIL_ORDER_TYPE_SYSCOMMAND             0x0004
+#define RAIL_ORDER_TYPE_HANDSHAKE              0x0005
+#define RAIL_ORDER_TYPE_NOTIFY_EVENT           0x0006
+#define RAIL_ORDER_TYPE_WINDOW_MOVE            0x0008
+#define RAIL_ORDER_TYPE_LOCALMOVESIZE          0x0009
+#define RAIL_ORDER_TYPE_MINMAXINFO             0x000A
+#define RAIL_ORDER_TYPE_CLIENT_STATUS          0x000B
+#define RAIL_ORDER_TYPE_SYSMENU                        0x000C
+#define RAIL_ORDER_TYPE_LANGBAR_INFO           0x000D
+#define RAIL_ORDER_TYPE_EXEC_RESULT            0x0080
+#define RAIL_ORDER_TYPE_GET_APPID_REQ          0x000E
+#define RAIL_ORDER_TYPE_GET_APPID_RESP         0x000F
+
+#define RAIL_PDU_HEADER_LENGTH                 4
+
+/* Fixed length of PDUs, excluding variable lengths */
+#define RAIL_HANDSHAKE_ORDER_LENGTH            4 /* fixed */
+#define RAIL_CLIENT_STATUS_ORDER_LENGTH                4 /* fixed */
+#define RAIL_EXEC_ORDER_LENGTH                 8 /* variable */
+#define RAIL_SYSPARAM_ORDER_LENGTH             4 /* variable */
+#define RAIL_ACTIVATE_ORDER_LENGTH             5 /* fixed */
+#define RAIL_SYSMENU_ORDER_LENGTH              8 /* fixed */
+#define RAIL_SYSCOMMAND_ORDER_LENGTH           6 /* fixed */
+#define RAIL_NOTIFY_EVENT_ORDER_LENGTH         12 /* fixed */
+#define RAIL_WINDOW_MOVE_ORDER_LENGTH          12 /* fixed */
+#define RAIL_GET_APPID_REQ_ORDER_LENGTH                4 /* fixed */
+#define RAIL_LANGBAR_INFO_ORDER_LENGTH         4 /* fixed */
+
+void rail_string_to_unicode_string(rdpRailOrder* rail_order, char* string, UNICODE_STRING* unicode_string);
+
+void rail_read_handshake_order(STREAM* s, RAIL_HANDSHAKE_ORDER* handshake);
+void rail_read_server_exec_result_order(STREAM* s, RAIL_EXEC_RESULT_ORDER* exec_result);
+void rail_read_server_sysparam_order(STREAM* s, RAIL_SYSPARAM_ORDER* sysparam);
+void rail_read_server_minmaxinfo_order(STREAM* s, RAIL_MINMAXINFO_ORDER* minmaxinfo);
+void rail_read_server_localmovesize_order(STREAM* s, RAIL_LOCALMOVESIZE_ORDER* localmovesize);
+void rail_read_server_get_appid_resp_order(STREAM* s, RAIL_GET_APPID_RESP_ORDER* get_appid_resp);
+void rail_read_langbar_info_order(STREAM* s, RAIL_LANGBAR_INFO_ORDER* langbar_info);
+
+void rail_write_handshake_order(STREAM* s, RAIL_HANDSHAKE_ORDER* handshake);
+void rail_write_client_status_order(STREAM* s, RAIL_CLIENT_STATUS_ORDER* client_status);
+void rail_write_client_exec_order(STREAM* s, RAIL_EXEC_ORDER* exec);
+void rail_write_client_sysparam_order(STREAM* s, RAIL_SYSPARAM_ORDER* sysparam);
+void rail_write_client_activate_order(STREAM* s, RAIL_ACTIVATE_ORDER* activate);
+void rail_write_client_sysmenu_order(STREAM* s, RAIL_SYSMENU_ORDER* sysmenu);
+void rail_write_client_syscommand_order(STREAM* s, RAIL_SYSCOMMAND_ORDER* syscommand);
+void rail_write_client_notify_event_order(STREAM* s, RAIL_NOTIFY_EVENT_ORDER* notify_event);
+void rail_write_client_window_move_order(STREAM* s, RAIL_WINDOW_MOVE_ORDER* window_move);
+void rail_write_client_get_appid_req_order(STREAM* s, RAIL_GET_APPID_REQ_ORDER* get_appid_req);
+void rail_write_langbar_info_order(STREAM* s, RAIL_LANGBAR_INFO_ORDER* langbar_info);
+
+void rail_order_recv(rdpRailOrder* rail_order, STREAM* s);
+
+void rail_send_handshake_order(rdpRailOrder* rail_order);
+void rail_send_client_status_order(rdpRailOrder* rail_order);
+void rail_send_client_exec_order(rdpRailOrder* rail_order);
+void rail_send_client_sysparam_order(rdpRailOrder* rail_order);
+void rail_send_client_sysparams_order(rdpRailOrder* rail_order);
+void rail_send_client_activate_order(rdpRailOrder* rail_order);
+void rail_send_client_sysmenu_order(rdpRailOrder* rail_order);
+void rail_send_client_syscommand_order(rdpRailOrder* rail_order);
+void rail_send_client_notify_event_order(rdpRailOrder* rail_order);
+void rail_send_client_window_move_order(rdpRailOrder* rail_order);
+void rail_send_client_get_appid_req_order(rdpRailOrder* rail_order);
+void rail_send_client_langbar_info_order(rdpRailOrder* rail_order);
+
+rdpRailOrder* rail_order_new();
+void rail_order_free(rdpRailOrder* rail_order);
+
+#endif /* __RAIL_ORDERS_H */
diff --git a/channels/rdpdbg/CMakeLists.txt b/channels/rdpdbg/CMakeLists.txt
new file mode 100644 (file)
index 0000000..db562a0
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(RDPDBG_SRCS
+       rdpdbg_main.c
+)
+
+add_library(rdpdbg ${RDPDBG_SRCS})
+set_target_properties(rdpdbg PROPERTIES PREFIX "")
+
+target_link_libraries(rdpdbg freerdp-utils)
+
+install(TARGETS rdpdbg DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpdbg/rdpdbg_main.c b/channels/rdpdbg/rdpdbg_main.c
new file mode 100644 (file)
index 0000000..c4d8217
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Debugging Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/svc_plugin.h>
+
+typedef struct rdpdbg_plugin rdpdbgPlugin;
+struct rdpdbg_plugin
+{
+       rdpSvcPlugin plugin;
+};
+
+static void rdpdbg_process_connect(rdpSvcPlugin* plugin)
+{
+       DEBUG_WARN("connecting");
+}
+
+static void rdpdbg_process_receive(rdpSvcPlugin* plugin, STREAM* data_in)
+{
+       STREAM* data_out;
+
+       DEBUG_WARN("size %d", stream_get_size(data_in));
+       stream_free(data_in);
+
+       data_out = stream_new(8);
+       stream_write(data_out, "senddata", 8);
+       svc_plugin_send(plugin, data_out);
+}
+
+static void rdpdbg_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       DEBUG_WARN("event_type %d", event->event_type);
+       freerdp_event_free(event);
+
+       event = freerdp_event_new(RDP_EVENT_CLASS_DEBUG, 0, NULL, NULL);
+       svc_plugin_send_event(plugin, event);
+}
+
+static void rdpdbg_process_terminate(rdpSvcPlugin* plugin)
+{
+       DEBUG_WARN("terminating");
+       xfree(plugin);
+}
+
+DEFINE_SVC_PLUGIN(rdpdbg, "rdpdbg",
+       CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP |
+       CHANNEL_OPTION_COMPRESS_RDP | CHANNEL_OPTION_SHOW_PROTOCOL)
diff --git a/channels/rdpdr/CMakeLists.txt b/channels/rdpdr/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e43aeff
--- /dev/null
@@ -0,0 +1,47 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(RDPDR_SRCS
+       rdpdr_constants.h
+       rdpdr_types.h
+       rdpdr_capabilities.c
+       rdpdr_capabilities.h
+       devman.c
+       devman.h
+       irp.c
+       irp.h
+       rdpdr_main.c
+       rdpdr_main.h
+)
+
+add_library(rdpdr ${RDPDR_SRCS})
+set_target_properties(rdpdr PROPERTIES PREFIX "")
+
+target_link_libraries(rdpdr freerdp-utils)
+
+install(TARGETS rdpdr DESTINATION ${FREERDP_PLUGIN_PATH})
+
+add_subdirectory(disk)
+add_subdirectory(printer)
+add_subdirectory(parallel)
+add_subdirectory(serial)
+
+if(WITH_PCSC)
+       add_subdirectory(smartcard)
+endif()
diff --git a/channels/rdpdr/devman.c b/channels/rdpdr/devman.c
new file mode 100644 (file)
index 0000000..5c15b1f
--- /dev/null
@@ -0,0 +1,108 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/utils/load_plugin.h>
+
+#include "rdpdr_types.h"
+#include "devman.h"
+
+DEVMAN* devman_new(rdpSvcPlugin* plugin)
+{
+       DEVMAN* devman;
+
+       devman = xnew(DEVMAN);
+       devman->plugin = plugin;
+       devman->id_sequence = 1;
+       devman->devices = list_new();
+
+       return devman;
+}
+
+void devman_free(DEVMAN* devman)
+{
+       DEVICE* device;
+
+       while ((device = (DEVICE*) list_dequeue(devman->devices)) != NULL)
+               IFCALL(device->Free, device);
+
+       list_free(devman->devices);
+
+       xfree(devman);
+}
+
+static void devman_register_device(DEVMAN* devman, DEVICE* device)
+{
+       device->id = devman->id_sequence++;
+       list_add(devman->devices, device);
+
+       DEBUG_SVC("device %d.%s registered", device->id, device->name);
+}
+
+static void devman_unregister_device(DEVMAN* devman, DEVICE* device)
+{
+       list_remove(devman->devices, device);
+
+       DEBUG_SVC("device %d.%s unregistered", device->id, device->name);
+}
+
+boolean devman_load_device_service(DEVMAN* devman, RDP_PLUGIN_DATA* plugin_data)
+{
+       DEVICE_SERVICE_ENTRY_POINTS ep;
+       PDEVICE_SERVICE_ENTRY entry;
+
+       entry = freerdp_load_plugin((char*) plugin_data->data[0], "DeviceServiceEntry");
+
+       if (entry == NULL)
+               return false;
+
+       ep.devman = devman;
+       ep.RegisterDevice = devman_register_device;
+       ep.UnregisterDevice = devman_unregister_device;
+       ep.plugin_data = plugin_data;
+
+       entry(&ep);
+
+       return true;
+}
+
+DEVICE* devman_get_device_by_id(DEVMAN* devman, uint32 id)
+{
+       LIST_ITEM* item;
+       DEVICE* device;
+
+       for (item = devman->devices->head; item; item = item->next)
+       {
+               device = (DEVICE*) item->data;
+
+               if (device->id == id)
+                       return device;
+       }
+
+       return NULL;
+}
diff --git a/channels/rdpdr/devman.h b/channels/rdpdr/devman.h
new file mode 100644 (file)
index 0000000..5860347
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DEVMAN_H
+#define __DEVMAN_H
+
+DEVMAN* devman_new(rdpSvcPlugin* plugin);
+void devman_free(DEVMAN* devman);
+boolean devman_load_device_service(DEVMAN* devman, RDP_PLUGIN_DATA* plugin_data);
+DEVICE* devman_get_device_by_id(DEVMAN* devman, uint32 id);
+
+#endif /* __DEVMAN_H */
diff --git a/channels/rdpdr/disk/CMakeLists.txt b/channels/rdpdr/disk/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c1acd80
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(DISK_SRCS
+       disk_file.c
+       disk_file.h
+       disk_main.c
+)
+
+include_directories(..)
+
+add_library(disk ${DISK_SRCS})
+set_target_properties(disk PROPERTIES PREFIX "")
+
+target_link_libraries(disk freerdp-utils)
+
+install(TARGETS disk DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpdr/disk/disk_file.c b/channels/rdpdr/disk/disk_file.c
new file mode 100644 (file)
index 0000000..3221a25
--- /dev/null
@@ -0,0 +1,655 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
+#include "config.h"
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include "rdpdr_constants.h"
+#include "rdpdr_types.h"
+#include "disk_file.h"
+
+#define FILE_TIME_SYSTEM_TO_RDP(_t) \
+       (((uint64)(_t) + 11644473600LL) * 10000000LL)
+#define FILE_TIME_RDP_TO_SYSTEM(_t) \
+       (((_t) == 0LL || (_t) == (uint64)(-1LL)) ? 0 : (time_t)((_t) / 10000000LL - 11644473600LL))
+
+#define FILE_ATTR_SYSTEM_TO_RDP(_f, _st) ( \
+       (S_ISDIR(_st.st_mode) ? FILE_ATTRIBUTE_DIRECTORY : 0) | \
+       (_f->filename[0] == '.' ? FILE_ATTRIBUTE_HIDDEN : 0) | \
+       (_f->delete_pending ? FILE_ATTRIBUTE_TEMPORARY : 0) | \
+       (st.st_mode & S_IWUSR ? 0 : FILE_ATTRIBUTE_READONLY))
+
+
+static boolean disk_file_wildcard_match(const char* pattern, const char* filename)
+{
+       const char *p = pattern, *f = filename;
+       char c;
+
+       /*
+        * TODO: proper wildcard rules per msft's File System Behavior Overview
+        * Simple cases for now.
+        */
+       f = filename;
+       while ((c = *p++))
+       {
+               if (c == '*')
+               {
+                       c = *p++;
+                       if (!c) /* shortcut */
+                               return true;
+                       /* TODO: skip to tail comparison */
+               }
+               if (c != *f++)
+                       return false;
+       }
+
+       if (!*f)
+               return true;
+
+       return false;
+}
+
+static void disk_file_fix_path(char* path)
+{
+       int len;
+       int i;
+
+       len = strlen(path);
+       for (i = 0; i < len; i++)
+       {
+               if (path[i] == '\\')
+                       path[i] = '/';
+       }
+       if (len > 0 && path[len - 1] == '/')
+               path[len - 1] = '\0';
+}
+
+static char* disk_file_combine_fullpath(const char* base_path, const char* path)
+{
+       char* fullpath;
+
+       fullpath = xmalloc(strlen(base_path) + strlen(path) + 1);
+       strcpy(fullpath, base_path);
+       strcat(fullpath, path);
+       disk_file_fix_path(fullpath);
+
+       return fullpath;
+}
+
+static boolean disk_file_remove_dir(const char* path)
+{
+       DIR* dir;
+       struct dirent* pdirent;
+       struct stat st;
+       char* p;
+       boolean ret = true;
+
+       dir = opendir(path);
+       if (dir == NULL)
+               return false;
+
+       pdirent = readdir(dir);
+       while (pdirent)
+       {
+               if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0)
+               {
+                       pdirent = readdir(dir);
+                       continue;
+               }
+
+               p = xmalloc(strlen(path) + strlen(pdirent->d_name) + 2);
+               sprintf(p, "%s/%s", path, pdirent->d_name);
+               if (stat(p, &st) != 0)
+               {
+                       DEBUG_WARN("stat %s failed.", p);
+                       ret = false;
+               }
+               else if (S_ISDIR(st.st_mode))
+               {
+                       ret = disk_file_remove_dir(p);
+               }
+               else if (unlink(p) < 0)
+               {
+                       DEBUG_WARN("unlink %s failed.", p);
+                       ret = false;
+               }
+               else
+                       ret = true;
+               xfree(p);
+
+               if (!ret)
+                       break;
+
+               pdirent = readdir(dir);
+       }
+
+       closedir(dir);
+       if (ret)
+       {
+               if (rmdir(path) < 0)
+               {
+                       DEBUG_WARN("rmdir %s failed.", path);
+                       ret = false;
+               }
+       }
+
+       return ret;
+}
+
+static void disk_file_set_fullpath(DISK_FILE* file, char* fullpath)
+{
+       xfree(file->fullpath);
+       file->fullpath = fullpath;
+       file->filename = strrchr(file->fullpath, '/');
+       if (file->filename == NULL)
+               file->filename = file->fullpath;
+       else
+               file->filename += 1;
+}
+
+static boolean disk_file_init(DISK_FILE* file, uint32 DesiredAccess, uint32 CreateDisposition, uint32 CreateOptions)
+{
+       const static int mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH;
+       struct stat st;
+       boolean exists;
+       int oflag = 0;
+
+       if (stat(file->fullpath, &st) == 0)
+       {
+               file->is_dir = (S_ISDIR(st.st_mode) ? true : false);
+               exists = true;
+       }
+       else
+       {
+               file->is_dir = ((CreateOptions & FILE_DIRECTORY_FILE) ? true : false);
+               if (file->is_dir)
+               {
+                       if (mkdir(file->fullpath, mode) != 0)
+                       {
+                               file->err = errno;
+                               return true;
+                       }
+               }
+               exists = false;
+       }
+       if (file->is_dir)
+       {
+               file->dir = opendir(file->fullpath);
+               if (file->dir == NULL)
+               {
+                       file->err = errno;
+                       return true;
+               }
+       }
+       else
+       {
+               switch (CreateDisposition)
+               {
+                       case FILE_SUPERSEDE:
+                               oflag = O_TRUNC | O_CREAT;
+                               break;
+                       case FILE_OPEN:
+                               break;
+                       case FILE_CREATE:
+                               oflag = O_CREAT | O_EXCL;
+                               break;
+                       case FILE_OPEN_IF:
+                               oflag = O_CREAT;
+                               break;
+                       case FILE_OVERWRITE:
+                               oflag = O_TRUNC;
+                               break;
+                       case FILE_OVERWRITE_IF:
+                               oflag = O_TRUNC | O_CREAT;
+                               break;
+                       default:
+                               break;
+               }
+
+               if (CreateOptions & FILE_DELETE_ON_CLOSE && DesiredAccess & DELETE)
+               {
+                       file->delete_pending = true;
+               }
+
+               if ((DesiredAccess & GENERIC_ALL)
+                       || (DesiredAccess & GENERIC_WRITE)
+                       || (DesiredAccess & FILE_WRITE_DATA)
+                       || (DesiredAccess & FILE_APPEND_DATA))
+               {
+                       oflag |= O_RDWR;
+               }
+               else
+               {
+                       oflag |= O_RDONLY;
+               }
+
+               file->fd = open(file->fullpath, oflag, mode);
+               if (file->fd == -1)
+               {
+                       file->err = errno;
+                       return true;
+               }
+       }
+
+       return true;
+}
+
+DISK_FILE* disk_file_new(const char* base_path, const char* path, uint32 id,
+       uint32 DesiredAccess, uint32 CreateDisposition, uint32 CreateOptions)
+{
+       DISK_FILE* file;
+
+       file = xnew(DISK_FILE);
+       file->id = id;
+       file->basepath = (char*) base_path;
+       disk_file_set_fullpath(file, disk_file_combine_fullpath(base_path, path));
+       file->fd = -1;
+
+       if (!disk_file_init(file, DesiredAccess, CreateDisposition, CreateOptions))
+       {
+               disk_file_free(file);
+               return NULL;
+       }
+
+       return file;
+}
+
+void disk_file_free(DISK_FILE* file)
+{
+       if (file->fd != -1)
+               close(file->fd);
+       if (file->dir != NULL)
+               closedir(file->dir);
+
+       if (file->delete_pending)
+       {
+               if (file->is_dir)
+                       disk_file_remove_dir(file->fullpath);
+               else
+                       unlink(file->fullpath);
+       }
+
+       xfree(file->pattern);
+       xfree(file->fullpath);
+       xfree(file);
+}
+
+boolean disk_file_seek(DISK_FILE* file, uint64 Offset)
+{
+       if (file->is_dir || file->fd == -1)
+               return false;
+
+       if (lseek(file->fd, Offset, SEEK_SET) == (off_t)-1)
+               return false;
+
+       return true;
+}
+
+boolean disk_file_read(DISK_FILE* file, uint8* buffer, uint32* Length)
+{
+       ssize_t r;
+
+       if (file->is_dir || file->fd == -1)
+               return false;
+
+       r = read(file->fd, buffer, *Length);
+       if (r < 0)
+               return false;
+       *Length = (uint32)r;
+
+       return true;
+}
+
+boolean disk_file_write(DISK_FILE* file, uint8* buffer, uint32 Length)
+{
+       ssize_t r;
+
+       if (file->is_dir || file->fd == -1)
+               return false;
+
+       while (Length > 0)
+       {
+               r = write(file->fd, buffer, Length);
+               if (r == -1)
+                       return false;
+               Length -= r;
+               buffer += r;
+       }
+
+       return true;
+}
+
+boolean disk_file_query_information(DISK_FILE* file, uint32 FsInformationClass, STREAM* output)
+{
+       struct stat st;
+
+       if (stat(file->fullpath, &st) != 0)
+       {
+               stream_write_uint32(output, 0); /* Length */
+               return false;
+       }
+       switch (FsInformationClass)
+       {
+               case FileBasicInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232094.aspx */
+                       stream_write_uint32(output, 36); /* Length */
+                       stream_check_size(output, 36);
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_atime)); /* LastAccessTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* LastWriteTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* ChangeTime */
+                       stream_write_uint32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */
+                       /* Reserved(4), MUST NOT be added! */
+                       break;
+
+               case FileStandardInformation:
+                       /*  http://msdn.microsoft.com/en-us/library/cc232088.aspx */
+                       stream_write_uint32(output, 22); /* Length */
+                       stream_check_size(output, 22);
+                       stream_write_uint64(output, st.st_size); /* AllocationSize */
+                       stream_write_uint64(output, st.st_size); /* EndOfFile */
+                       stream_write_uint32(output, st.st_nlink); /* NumberOfLinks */
+                       stream_write_uint8(output, file->delete_pending ? 1 : 0); /* DeletePending */
+                       stream_write_uint8(output, file->is_dir ? 1 : 0); /* Directory */
+                       /* Reserved(2), MUST NOT be added! */
+                       break;
+
+               case FileAttributeTagInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232093.aspx */
+                       stream_write_uint32(output, 8); /* Length */
+                       stream_check_size(output, 8);
+                       stream_write_uint32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */
+                       stream_write_uint32(output, 0); /* ReparseTag */
+                       break;
+
+               default:
+                       stream_write_uint32(output, 0); /* Length */
+                       DEBUG_WARN("invalid FsInformationClass %d", FsInformationClass);
+                       return false;
+       }
+       return true;
+}
+
+boolean disk_file_set_information(DISK_FILE* file, uint32 FsInformationClass, uint32 Length, STREAM* input)
+{
+       char* s;
+       mode_t m;
+       uint64 size;
+       char* fullpath;
+       struct stat st;
+       UNICONV* uniconv;
+       struct timeval tv[2];
+       uint64 LastWriteTime;
+       uint32 FileAttributes;
+       uint32 FileNameLength;
+
+       switch (FsInformationClass)
+       {
+               case FileBasicInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232094.aspx */
+                       stream_seek_uint64(input); /* CreationTime */
+                       stream_seek_uint64(input); /* LastAccessTime */
+                       stream_read_uint64(input, LastWriteTime);
+                       stream_seek_uint64(input); /* ChangeTime */
+                       stream_read_uint32(input, FileAttributes);
+
+                       if (fstat(file->fd, &st) != 0)
+                               return false;
+
+                       tv[0].tv_sec = st.st_atime;
+                       tv[0].tv_usec = 0;
+                       tv[1].tv_sec = (LastWriteTime > 0 ? FILE_TIME_RDP_TO_SYSTEM(LastWriteTime) : st.st_mtime);
+                       tv[1].tv_usec = 0;
+                       futimes(file->fd, tv);
+
+                       if (FileAttributes > 0)
+                       {
+                               m = st.st_mode;
+                               if ((FileAttributes & FILE_ATTRIBUTE_READONLY) == 0)
+                                       m |= S_IWUSR;
+                               else
+                                       m &= ~S_IWUSR;
+                               if (m != st.st_mode)
+                                       fchmod(file->fd, st.st_mode);
+                       }
+                       break;
+
+               case FileEndOfFileInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232067.aspx */
+               case FileAllocationInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232076.aspx */
+                       stream_read_uint64(input, size);
+                       if (ftruncate(file->fd, size) != 0)
+                               return false;
+                       break;
+
+               case FileDispositionInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232098.aspx */
+                       /* http://msdn.microsoft.com/en-us/library/cc241371.aspx */
+                       if (Length)
+                               stream_read_uint8(input, file->delete_pending);
+                       else
+                               file->delete_pending = 1;
+                       break;
+
+               case FileRenameInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232085.aspx */
+                       stream_seek_uint8(input); /* ReplaceIfExists */
+                       stream_seek_uint8(input); /* RootDirectory */
+                       stream_read_uint32(input, FileNameLength);
+                       uniconv = freerdp_uniconv_new();
+                       s = freerdp_uniconv_in(uniconv, stream_get_tail(input), FileNameLength);
+                       freerdp_uniconv_free(uniconv);
+
+                       fullpath = disk_file_combine_fullpath(file->basepath, s);
+                       xfree(s);
+
+                       if (rename(file->fullpath, fullpath) == 0)
+                       {
+                               DEBUG_SVC("renamed %s to %s", file->fullpath, fullpath);
+                               disk_file_set_fullpath(file, fullpath);
+                       }
+                       else
+                       {
+                               DEBUG_WARN("rename %s to %s failed", file->fullpath, fullpath);
+                               free(fullpath);
+                               return false;
+                       }
+
+                       break;
+
+               default:
+                       DEBUG_WARN("invalid FsInformationClass %d", FsInformationClass);
+                       return false;
+       }
+
+       return true;
+}
+
+boolean disk_file_query_directory(DISK_FILE* file, uint32 FsInformationClass, uint8 InitialQuery,
+       const char* path, STREAM* output)
+{
+       struct dirent* ent;
+       char* ent_path;
+       struct stat st;
+       UNICONV* uniconv;
+       size_t len;
+       boolean ret;
+
+       DEBUG_SVC("path %s FsInformationClass %d InitialQuery %d", path, FsInformationClass, InitialQuery);
+
+       if (!file->dir)
+       {
+               stream_write_uint32(output, 0); /* Length */
+               stream_write_uint8(output, 0); /* Padding */
+               return false;
+       }
+
+       if (InitialQuery != 0)
+       {
+               rewinddir(file->dir);
+               xfree(file->pattern);
+
+               if (path[0])
+                       file->pattern = strdup(strrchr(path, '\\') + 1);
+               else
+                       file->pattern = NULL;
+       }
+
+       if (file->pattern)
+       {
+               do
+               {
+                       ent = readdir(file->dir);
+                       if (ent == NULL)
+                               continue;
+
+                       if (disk_file_wildcard_match(file->pattern, ent->d_name))
+                               break;
+               } while (ent);
+       }
+       else
+       {
+               ent = readdir(file->dir);
+       }
+
+       if (ent == NULL)
+       {
+               DEBUG_SVC("  pattern %s not found.", file->pattern);
+               stream_write_uint32(output, 0); /* Length */
+               stream_write_uint8(output, 0); /* Padding */
+               return false;
+       }
+
+       memset(&st, 0, sizeof(struct stat));
+       ent_path = xmalloc(strlen(file->fullpath) + strlen(ent->d_name) + 2);
+       sprintf(ent_path, "%s/%s", file->fullpath, ent->d_name);
+       if (stat(ent_path, &st) != 0)
+       {
+               DEBUG_WARN("stat %s failed.", ent_path);
+       }
+       xfree(ent_path);
+
+       DEBUG_SVC("  pattern %s matched %s\n", file->pattern, ent_path);
+
+       uniconv = freerdp_uniconv_new();
+       ent_path = freerdp_uniconv_out(uniconv, ent->d_name, &len);
+       freerdp_uniconv_free(uniconv);
+
+       ret = true;
+       switch (FsInformationClass)
+       {
+               case FileDirectoryInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232097.aspx */
+                       stream_write_uint32(output, 64 + len); /* Length */
+                       stream_check_size(output, 64 + len);
+                       stream_write_uint32(output, 0); /* NextEntryOffset */
+                       stream_write_uint32(output, 0); /* FileIndex */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_atime)); /* LastAccessTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* LastWriteTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* ChangeTime */
+                       stream_write_uint64(output, st.st_size); /* EndOfFile */
+                       stream_write_uint64(output, st.st_size); /* AllocationSize */
+                       stream_write_uint32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */
+                       stream_write_uint32(output, len); /* FileNameLength */
+                       stream_write(output, ent_path, len);
+                       break;
+
+               case FileFullDirectoryInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232068.aspx */
+                       stream_write_uint32(output, 68 + len); /* Length */
+                       stream_check_size(output, 68 + len);
+                       stream_write_uint32(output, 0); /* NextEntryOffset */
+                       stream_write_uint32(output, 0); /* FileIndex */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_atime)); /* LastAccessTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* LastWriteTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* ChangeTime */
+                       stream_write_uint64(output, st.st_size); /* EndOfFile */
+                       stream_write_uint64(output, st.st_size); /* AllocationSize */
+                       stream_write_uint32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */
+                       stream_write_uint32(output, len); /* FileNameLength */
+                       stream_write_uint32(output, 0); /* EaSize */
+                       stream_write(output, ent_path, len);
+                       break;
+
+               case FileBothDirectoryInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232095.aspx */
+                       stream_write_uint32(output, 93 + len); /* Length */
+                       stream_check_size(output, 93 + len);
+                       stream_write_uint32(output, 0); /* NextEntryOffset */
+                       stream_write_uint32(output, 0); /* FileIndex */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_atime)); /* LastAccessTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* LastWriteTime */
+                       stream_write_uint64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* ChangeTime */
+                       stream_write_uint64(output, st.st_size); /* EndOfFile */
+                       stream_write_uint64(output, st.st_size); /* AllocationSize */
+                       stream_write_uint32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */
+                       stream_write_uint32(output, len); /* FileNameLength */
+                       stream_write_uint32(output, 0); /* EaSize */
+                       stream_write_uint8(output, 0); /* ShortNameLength */
+                       /* Reserved(1), MUST NOT be added! */
+                       stream_write_zero(output, 24); /* ShortName */
+                       stream_write(output, ent_path, len);
+                       break;
+
+               case FileNamesInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232077.aspx */
+                       stream_write_uint32(output, 12 + len); /* Length */
+                       stream_check_size(output, 12 + len);
+                       stream_write_uint32(output, 0); /* NextEntryOffset */
+                       stream_write_uint32(output, 0); /* FileIndex */
+                       stream_write_uint32(output, len); /* FileNameLength */
+                       stream_write(output, ent_path, len);
+                       break;
+
+               default:
+                       stream_write_uint32(output, 0); /* Length */
+                       stream_write_uint8(output, 0); /* Padding */
+                       DEBUG_WARN("invalid FsInformationClass %d", FsInformationClass);
+                       ret = false;
+                       break;
+       }
+
+       xfree(ent_path);
+
+       return ret;
+}
diff --git a/channels/rdpdr/disk/disk_file.h b/channels/rdpdr/disk/disk_file.h
new file mode 100644 (file)
index 0000000..e833cf6
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DISK_FILE_H
+#define __DISK_FILE_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+
+typedef struct _DISK_FILE DISK_FILE;
+struct _DISK_FILE
+{
+       uint32 id;
+       boolean is_dir;
+       int fd;
+       int err;
+       DIR* dir;
+       char* basepath;
+       char* fullpath;
+       char* filename;
+       char* pattern;
+       boolean delete_pending;
+};
+
+DISK_FILE* disk_file_new(const char* base_path, const char* path, uint32 id,
+       uint32 DesiredAccess, uint32 CreateDisposition, uint32 CreateOptions);
+void disk_file_free(DISK_FILE* file);
+
+boolean disk_file_seek(DISK_FILE* file, uint64 Offset);
+boolean disk_file_read(DISK_FILE* file, uint8* buffer, uint32* Length);
+boolean disk_file_write(DISK_FILE* file, uint8* buffer, uint32 Length);
+boolean disk_file_query_information(DISK_FILE* file, uint32 FsInformationClass, STREAM* output);
+boolean disk_file_set_information(DISK_FILE* file, uint32 FsInformationClass, uint32 Length, STREAM* input);
+boolean disk_file_query_directory(DISK_FILE* file, uint32 FsInformationClass, uint8 InitialQuery,
+       const char* path, STREAM* output);
+
+#endif /* __DISK_FILE_H */
diff --git a/channels/rdpdr/disk/disk_main.c b/channels/rdpdr/disk/disk_main.c
new file mode 100644 (file)
index 0000000..5f820c6
--- /dev/null
@@ -0,0 +1,651 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_constants.h"
+#include "rdpdr_types.h"
+#include "disk_file.h"
+
+typedef struct _DISK_DEVICE DISK_DEVICE;
+struct _DISK_DEVICE
+{
+       DEVICE device;
+
+       char* path;
+       LIST* files;
+
+       LIST* irp_list;
+       freerdp_thread* thread;
+};
+
+
+static uint32
+disk_map_posix_err(int fs_errno)
+{
+       uint32 rc;
+
+       /* try to return NTSTATUS version of error code */
+       switch (fs_errno)
+       {
+               case EPERM:
+               case EACCES:
+                       rc = STATUS_ACCESS_DENIED;
+                       break;
+               case ENOENT:
+                       rc = STATUS_NO_SUCH_FILE;
+                       break;
+               case EBUSY:
+                       rc = STATUS_DEVICE_BUSY;
+                       break;
+               case EEXIST:
+                       rc  = STATUS_OBJECT_NAME_COLLISION;
+                       break;
+               case EISDIR:
+                       rc = STATUS_FILE_IS_A_DIRECTORY;
+                       break;
+
+               default:
+                       rc = STATUS_UNSUCCESSFUL;
+                       break;
+       }
+       DEBUG_SVC("errno 0x%x mapped to 0x%x\n", fs_errno, rc);
+       return rc;
+}
+
+static DISK_FILE* disk_get_file_by_id(DISK_DEVICE* disk, uint32 id)
+{
+       LIST_ITEM* item;
+       DISK_FILE* file;
+
+       for (item = disk->files->head; item; item = item->next)
+       {
+               file = (DISK_FILE*)item->data;
+               if (file->id == id)
+                       return file;
+       }
+       return NULL;
+}
+
+static void disk_process_irp_create(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+       uint32 DesiredAccess;
+       uint32 CreateDisposition;
+       uint32 CreateOptions;
+       uint32 PathLength;
+       UNICONV* uniconv;
+       char* path;
+       uint32 FileId;
+       uint8 Information;
+
+       stream_read_uint32(irp->input, DesiredAccess);
+       stream_seek(irp->input, 16); /* AllocationSize(8), FileAttributes(4), SharedAccess(4) */
+       stream_read_uint32(irp->input, CreateDisposition);
+       stream_read_uint32(irp->input, CreateOptions);
+       stream_read_uint32(irp->input, PathLength);
+
+       uniconv = freerdp_uniconv_new();
+       path = freerdp_uniconv_in(uniconv, stream_get_tail(irp->input), PathLength);
+       freerdp_uniconv_free(uniconv);
+
+       FileId = irp->devman->id_sequence++;
+       file = disk_file_new(disk->path, path, FileId,
+               DesiredAccess, CreateDisposition, CreateOptions);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               FileId = 0;
+               Information = 0;
+
+               DEBUG_WARN("failed to create %s.", path);
+       }
+       else if (file->err)
+       {
+               FileId = 0;
+               Information = 0;
+
+               /* map errno to windows result*/
+               irp->IoStatus = disk_map_posix_err(file->err);
+
+               disk_file_free(file);
+       }
+       else
+       {
+               list_enqueue(disk->files, file);
+
+               switch (CreateDisposition)
+               {
+                       case FILE_SUPERSEDE:
+                       case FILE_OPEN:
+                       case FILE_CREATE:
+                       case FILE_OVERWRITE:
+                               Information = FILE_SUPERSEDED;
+                               break;
+                       case FILE_OPEN_IF:
+                               Information = FILE_OPENED;
+                               break;
+                       case FILE_OVERWRITE_IF:
+                               Information = FILE_OVERWRITTEN;
+                               break;
+                       default:
+                               Information = 0;
+                               break;
+               }
+               DEBUG_SVC("%s(%d) created.", file->fullpath, file->id);
+       }
+
+       stream_write_uint32(irp->output, FileId);
+       stream_write_uint8(irp->output, Information);
+
+       xfree(path);
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_close(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+
+       file = disk_get_file_by_id(disk, irp->FileId);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+
+               DEBUG_WARN("FileId %d not valid.", irp->FileId);
+       }
+       else
+       {
+               DEBUG_SVC("%s(%d) closed.", file->fullpath, file->id);
+
+               list_remove(disk->files, file);
+               disk_file_free(file);
+       }
+
+       stream_write_zero(irp->output, 5); /* Padding(5) */
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_read(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+       uint32 Length;
+       uint64 Offset;
+       uint8* buffer = NULL;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+
+       file = disk_get_file_by_id(disk, irp->FileId);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("FileId %d not valid.", irp->FileId);
+       }
+       else if (!disk_file_seek(file, Offset))
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("seek %s(%d) failed.", file->fullpath, file->id);
+       }
+       else
+       {
+               buffer = (uint8*)xmalloc(Length);
+               if (!disk_file_read(file, buffer, &Length))
+               {
+                       irp->IoStatus = STATUS_UNSUCCESSFUL;
+                       xfree(buffer);
+                       buffer = NULL;
+                       Length = 0;
+
+                       DEBUG_WARN("read %s(%d) failed.", file->fullpath, file->id);
+               }
+               else
+               {
+                       DEBUG_SVC("read %llu-%llu from %s(%d).", Offset, Offset + Length, file->fullpath, file->id);
+               }
+       }
+
+       stream_write_uint32(irp->output, Length);
+       if (Length > 0)
+       {
+               stream_check_size(irp->output, Length);
+               stream_write(irp->output, buffer, Length);
+       }
+       xfree(buffer);
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_write(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+       uint32 Length;
+       uint64 Offset;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+       stream_seek(irp->input, 20); /* Padding */
+
+       file = disk_get_file_by_id(disk, irp->FileId);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("FileId %d not valid.", irp->FileId);
+       }
+       else if (!disk_file_seek(file, Offset))
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("seek %s(%d) failed.", file->fullpath, file->id);
+       }
+       else if (!disk_file_write(file, stream_get_tail(irp->input), Length))
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("write %s(%d) failed.", file->fullpath, file->id);
+       }
+       else
+       {
+               DEBUG_SVC("write %llu-%llu to %s(%d).", Offset, Offset + Length, file->fullpath, file->id);
+       }
+
+       stream_write_uint32(irp->output, Length);
+       stream_write_uint8(irp->output, 0); /* Padding */
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_query_information(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+       uint32 FsInformationClass;
+
+       stream_read_uint32(irp->input, FsInformationClass);
+
+       file = disk_get_file_by_id(disk, irp->FileId);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+
+               DEBUG_WARN("FileId %d not valid.", irp->FileId);
+       }
+       else if (!disk_file_query_information(file, FsInformationClass, irp->output))
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+
+               DEBUG_WARN("FsInformationClass %d on %s(%d) failed.", FsInformationClass, file->fullpath, file->id);
+       }
+       else
+       {
+               DEBUG_SVC("FsInformationClass %d on %s(%d).", FsInformationClass, file->fullpath, file->id);
+       }
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_set_information(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+       uint32 FsInformationClass;
+       uint32 Length;
+
+       stream_read_uint32(irp->input, FsInformationClass);
+       stream_read_uint32(irp->input, Length);
+       stream_seek(irp->input, 24); /* Padding */
+
+       file = disk_get_file_by_id(disk, irp->FileId);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+
+               DEBUG_WARN("FileId %d not valid.", irp->FileId);
+       }
+       else if (!disk_file_set_information(file, FsInformationClass, Length, irp->input))
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+
+               DEBUG_WARN("FsInformationClass %d on %s(%d) failed.", FsInformationClass, file->fullpath, file->id);
+       }
+       else
+       {
+               DEBUG_SVC("FsInformationClass %d on %s(%d) ok.", FsInformationClass, file->fullpath, file->id);
+       }
+
+       stream_write_uint32(irp->output, Length);
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_query_volume_information(DISK_DEVICE* disk, IRP* irp)
+{
+       uint32 FsInformationClass;
+       STREAM* output = irp->output;
+
+       stream_read_uint32(irp->input, FsInformationClass);
+
+       switch (FsInformationClass)
+       {
+               case FileFsVolumeInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232108.aspx */
+                       stream_write_uint32(output, 34); /* Length */
+                       stream_check_size(output, 34);
+                       stream_write_uint64(output, 0); /* VolumeCreationTime */
+                       stream_write_uint32(output, 0); /* VolumeSerialNumber */
+                       stream_write_uint32(output, 16); /* VolumeLabelLength */
+                       stream_write_uint8(output, 0); /* SupportsObjects */
+                       stream_write_uint8(output, 0); /* Reserved */
+                       stream_write(output, "F\0R\0E\0E\0R\0D\0P\0\0\0", 16); /* VolumeLabel (Unicode) */
+                       break;
+
+               case FileFsSizeInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232107.aspx */
+                       stream_write_uint32(output, 24); /* Length */
+                       stream_check_size(output, 24);
+                       stream_write_uint64(output, 0x1000000); /* TotalAllocationUnits */
+                       stream_write_uint64(output, 0x800000); /* AvailableAllocationUnits */
+                       stream_write_uint32(output, 1); /* SectorsPerAllocationUnit */
+                       stream_write_uint32(output, 0x400); /* BytesPerSector */
+                       break;
+
+               case FileFsAttributeInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232101.aspx */
+                       stream_write_uint32(output, 22); /* Length */
+                       stream_check_size(output, 22);
+                       stream_write_uint32(output,
+                               FILE_CASE_SENSITIVE_SEARCH | 
+                               FILE_CASE_PRESERVED_NAMES | 
+                               FILE_UNICODE_ON_DISK); /* FileSystemAttributes */
+                       stream_write_uint32(output, 510); /* MaximumComponentNameLength */
+                       stream_write_uint32(output, 10); /* FileSystemNameLength */
+                       stream_write(output, "F\0A\0T\03\02\0", 10); /* FileSystemName */
+                       break;
+
+               case FileFsFullSizeInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232104.aspx */
+                       stream_write_uint32(output, 32); /* Length */
+                       stream_check_size(output, 32);
+                       stream_write_uint64(output, 0x1000000); /* TotalAllocationUnits */
+                       stream_write_uint64(output, 0x800000); /* CallerAvailableAllocationUnits */
+                       stream_write_uint64(output, 0x800000); /* ActualAvailableAllocationUnits */
+                       stream_write_uint32(output, 1); /* SectorsPerAllocationUnit */
+                       stream_write_uint32(output, 0x400); /* BytesPerSector */
+                       break;
+
+               case FileFsDeviceInformation:
+                       /* http://msdn.microsoft.com/en-us/library/cc232109.aspx */
+                       stream_write_uint32(output, 8); /* Length */
+                       stream_check_size(output, 8);
+                       stream_write_uint32(output, FILE_DEVICE_DISK); /* DeviceType */
+                       stream_write_uint32(output, 0); /* Characteristics */
+                       break;
+
+               default:
+                       irp->IoStatus = STATUS_UNSUCCESSFUL;
+                       stream_write_uint32(output, 0); /* Length */
+                       DEBUG_WARN("invalid FsInformationClass %d", FsInformationClass);
+                       break;
+       }
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_query_directory(DISK_DEVICE* disk, IRP* irp)
+{
+       DISK_FILE* file;
+       uint32 FsInformationClass;
+       uint8 InitialQuery;
+       uint32 PathLength;
+       UNICONV* uniconv;
+       char* path;
+
+       stream_read_uint32(irp->input, FsInformationClass);
+       stream_read_uint8(irp->input, InitialQuery);
+       stream_read_uint32(irp->input, PathLength);
+       stream_seek(irp->input, 23); /* Padding */
+
+       uniconv = freerdp_uniconv_new();
+       path = freerdp_uniconv_in(uniconv, stream_get_tail(irp->input), PathLength);
+       freerdp_uniconv_free(uniconv);
+
+       file = disk_get_file_by_id(disk, irp->FileId);
+
+       if (file == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               stream_write_uint32(irp->output, 0); /* Length */
+               DEBUG_WARN("FileId %d not valid.", irp->FileId);
+       }
+       else if (!disk_file_query_directory(file, FsInformationClass, InitialQuery, path, irp->output))
+       {
+               irp->IoStatus = STATUS_NO_MORE_FILES;
+       }
+
+       xfree(path);
+
+       irp->Complete(irp);
+}
+
+static void disk_process_irp_directory_control(DISK_DEVICE* disk, IRP* irp)
+{
+       switch (irp->MinorFunction)
+       {
+               case IRP_MN_QUERY_DIRECTORY:
+                       disk_process_irp_query_directory(disk, irp);
+                       break;
+
+               case IRP_MN_NOTIFY_CHANGE_DIRECTORY: /* TODO */
+                       irp->Discard(irp);
+                       break;
+
+               default:
+                       DEBUG_WARN("MinorFunction 0x%X not supported", irp->MinorFunction);
+                       irp->IoStatus = STATUS_NOT_SUPPORTED;
+                       stream_write_uint32(irp->output, 0); /* Length */
+                       irp->Complete(irp);
+                       break;
+       }
+}
+
+static void disk_process_irp_device_control(DISK_DEVICE* disk, IRP* irp)
+{
+       stream_write_uint32(irp->output, 0); /* OutputBufferLength */
+       irp->Complete(irp);
+}
+
+static void disk_process_irp(DISK_DEVICE* disk, IRP* irp)
+{
+       switch (irp->MajorFunction)
+       {
+               case IRP_MJ_CREATE:
+                       disk_process_irp_create(disk, irp);
+                       break;
+
+               case IRP_MJ_CLOSE:
+                       disk_process_irp_close(disk, irp);
+                       break;
+
+               case IRP_MJ_READ:
+                       disk_process_irp_read(disk, irp);
+                       break;
+
+               case IRP_MJ_WRITE:
+                       disk_process_irp_write(disk, irp);
+                       break;
+
+               case IRP_MJ_QUERY_INFORMATION:
+                       disk_process_irp_query_information(disk, irp);
+                       break;
+
+               case IRP_MJ_SET_INFORMATION:
+                       disk_process_irp_set_information(disk, irp);
+                       break;
+
+               case IRP_MJ_QUERY_VOLUME_INFORMATION:
+                       disk_process_irp_query_volume_information(disk, irp);
+                       break;
+
+               case IRP_MJ_DIRECTORY_CONTROL:
+                       disk_process_irp_directory_control(disk, irp);
+                       break;
+
+               case IRP_MJ_DEVICE_CONTROL:
+                       disk_process_irp_device_control(disk, irp);
+                       break;
+
+               default:
+                       DEBUG_WARN("MajorFunction 0x%X not supported", irp->MajorFunction);
+                       irp->IoStatus = STATUS_NOT_SUPPORTED;
+                       irp->Complete(irp);
+                       break;
+       }
+}
+
+static void disk_process_irp_list(DISK_DEVICE* disk)
+{
+       IRP* irp;
+
+       while (1)
+       {
+               if (freerdp_thread_is_stopped(disk->thread))
+                       break;
+
+               freerdp_thread_lock(disk->thread);
+               irp = (IRP*)list_dequeue(disk->irp_list);
+               freerdp_thread_unlock(disk->thread);
+
+               if (irp == NULL)
+                       break;
+
+               disk_process_irp(disk, irp);
+       }
+}
+
+static void* disk_thread_func(void* arg)
+{
+       DISK_DEVICE* disk = (DISK_DEVICE*)arg;
+
+       while (1)
+       {
+               freerdp_thread_wait(disk->thread);
+
+               if (freerdp_thread_is_stopped(disk->thread))
+                       break;
+
+               freerdp_thread_reset(disk->thread);
+               disk_process_irp_list(disk);
+       }
+
+       freerdp_thread_quit(disk->thread);
+
+       return NULL;
+}
+
+static void disk_irp_request(DEVICE* device, IRP* irp)
+{
+       DISK_DEVICE* disk = (DISK_DEVICE*)device;
+
+       freerdp_thread_lock(disk->thread);
+       list_enqueue(disk->irp_list, irp);
+       freerdp_thread_unlock(disk->thread);
+
+       freerdp_thread_signal(disk->thread);
+}
+
+static void disk_free(DEVICE* device)
+{
+       DISK_DEVICE* disk = (DISK_DEVICE*)device;
+       IRP* irp;
+       DISK_FILE* file;
+
+       freerdp_thread_stop(disk->thread);
+       freerdp_thread_free(disk->thread);
+       
+       while ((irp = (IRP*)list_dequeue(disk->irp_list)) != NULL)
+               irp->Discard(irp);
+       list_free(disk->irp_list);
+
+       while ((file = (DISK_FILE*)list_dequeue(disk->files)) != NULL)
+               disk_file_free(file);
+       list_free(disk->files);
+       xfree(disk);
+}
+
+int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
+{
+       DISK_DEVICE* disk;
+       char* name;
+       char* path;
+       int i, len;
+
+       name = (char*)pEntryPoints->plugin_data->data[1];
+       path = (char*)pEntryPoints->plugin_data->data[2];
+
+       if (name[0] && path[0])
+       {
+               disk = xnew(DISK_DEVICE);
+
+               disk->device.type = RDPDR_DTYP_FILESYSTEM;
+               disk->device.name = name;
+               disk->device.IRPRequest = disk_irp_request;
+               disk->device.Free = disk_free;
+
+               len = strlen(name);
+               disk->device.data = stream_new(len + 1);
+               for (i = 0; i <= len; i++)
+                       stream_write_uint8(disk->device.data, name[i] < 0 ? '_' : name[i]);
+
+               disk->path = path;
+               disk->files = list_new();
+
+               disk->irp_list = list_new();
+               disk->thread = freerdp_thread_new();
+
+               pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*)disk);
+
+               freerdp_thread_start(disk->thread, disk_thread_func, disk);
+       }
+
+       return 0;
+}
diff --git a/channels/rdpdr/irp.c b/channels/rdpdr/irp.c
new file mode 100644 (file)
index 0000000..3668b1c
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_types.h"
+#include "rdpdr_constants.h"
+#include "devman.h"
+#include "irp.h"
+
+static void irp_free(IRP* irp)
+{
+       DEBUG_SVC("DeviceId %d FileId %d CompletionId %d", irp->device->id, irp->FileId, irp->CompletionId);
+
+       stream_free(irp->input);
+       stream_free(irp->output);
+       xfree(irp);
+}
+
+static void irp_complete(IRP* irp)
+{
+       int pos;
+
+       DEBUG_SVC("DeviceId %d FileId %d CompletionId %d", irp->device->id, irp->FileId, irp->CompletionId);
+
+       pos = stream_get_pos(irp->output);
+       stream_set_pos(irp->output, 12);
+       stream_write_uint32(irp->output, irp->IoStatus);
+       stream_set_pos(irp->output, pos);
+
+       svc_plugin_send(irp->devman->plugin, irp->output);
+       irp->output = NULL;
+
+       irp_free(irp);
+}
+
+IRP* irp_new(DEVMAN* devman, STREAM* data_in)
+{
+       IRP* irp;
+       uint32 DeviceId;
+       DEVICE* device;
+
+       stream_read_uint32(data_in, DeviceId);
+       device = devman_get_device_by_id(devman, DeviceId);
+       if (device == NULL)
+       {
+               DEBUG_WARN("unknown DeviceId %d", DeviceId);
+               return NULL;
+       }
+
+       irp = xnew(IRP);
+       irp->device = device;
+       irp->devman = devman;
+       stream_read_uint32(data_in, irp->FileId);
+       stream_read_uint32(data_in, irp->CompletionId);
+       stream_read_uint32(data_in, irp->MajorFunction);
+       stream_read_uint32(data_in, irp->MinorFunction);
+       irp->input = data_in;
+
+       irp->output = stream_new(256);
+       stream_write_uint16(irp->output, RDPDR_CTYP_CORE);
+       stream_write_uint16(irp->output, PAKID_CORE_DEVICE_IOCOMPLETION);
+       stream_write_uint32(irp->output, DeviceId);
+       stream_write_uint32(irp->output, irp->CompletionId);
+       stream_seek_uint32(irp->output); /* IoStatus */
+
+       irp->Complete = irp_complete;
+       irp->Discard = irp_free;
+
+       DEBUG_SVC("DeviceId %d FileId %d CompletionId %d MajorFunction 0x%X MinorFunction 0x%x",
+               irp->device->id, irp->FileId, irp->CompletionId, irp->MajorFunction, irp->MinorFunction);
+
+       return irp;
+}
diff --git a/channels/rdpdr/irp.h b/channels/rdpdr/irp.h
new file mode 100644 (file)
index 0000000..d33e518
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __IRP_H
+#define __IRP_H
+
+#include "rdpdr_types.h"
+
+IRP* irp_new(DEVMAN* devman, STREAM* data_in);
+
+#endif /* __IRP_H */
diff --git a/channels/rdpdr/parallel/CMakeLists.txt b/channels/rdpdr/parallel/CMakeLists.txt
new file mode 100644 (file)
index 0000000..44387f5
--- /dev/null
@@ -0,0 +1,31 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(PARALLEL_SRCS
+       parallel_main.c
+)
+
+include_directories(..)
+
+add_library(parallel ${PARALLEL_SRCS})
+set_target_properties(parallel PROPERTIES PREFIX "")
+
+target_link_libraries(parallel freerdp-utils)
+
+install(TARGETS parallel DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpdr/parallel/parallel_main.c b/channels/rdpdr/parallel/parallel_main.c
new file mode 100644 (file)
index 0000000..934def0
--- /dev/null
@@ -0,0 +1,335 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Redirected Parallel Port Device Service
+ *
+ * Copyright 2010 O.S. Systems Software Ltda.
+ * Copyright 2010 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <errno.h>
+#include <strings.h>
+#include <sys/ioctl.h>
+#ifdef __LINUX__
+#include <linux/ppdev.h>
+#include <linux/parport.h>
+#endif
+
+#include <freerdp/types.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_constants.h"
+#include "rdpdr_types.h"
+
+struct _PARALLEL_DEVICE
+{
+       DEVICE device;
+
+       int file;
+       char* path;
+       uint32 id;
+
+       LIST* irp_list;
+       freerdp_thread* thread;
+};
+typedef struct _PARALLEL_DEVICE PARALLEL_DEVICE;
+
+static void parallel_process_irp_create(PARALLEL_DEVICE* parallel, IRP* irp)
+{
+       uint32 PathLength;
+       char* path;
+       UNICONV* uniconv;
+
+       stream_seek(irp->input, 28);
+       /* DesiredAccess(4) AllocationSize(8), FileAttributes(4) */
+       /* SharedAccess(4) CreateDisposition(4), CreateOptions(4) */
+       stream_read_uint32(irp->input, PathLength);
+
+       uniconv = freerdp_uniconv_new();
+       path = freerdp_uniconv_in(uniconv, stream_get_tail(irp->input), PathLength);
+       freerdp_uniconv_free(uniconv);
+
+       parallel->id = irp->devman->id_sequence++;
+       parallel->file = open(parallel->path, O_RDWR);
+       if (parallel->file < 0)
+       {
+               irp->IoStatus = STATUS_ACCESS_DENIED;
+               parallel->id = 0;
+
+               DEBUG_WARN("failed to create %s: %s", parallel->path, strerror(errno));
+       }
+       else
+       {
+               /* all read and write operations should be non-blocking */
+               if (fcntl(parallel->file, F_SETFL, O_NONBLOCK) == -1)
+                       DEBUG_WARN("%s fcntl %s", path, strerror(errno));
+
+               DEBUG_SVC("%s(%d) created", parallel->path, parallel->file);
+       }
+
+       stream_write_uint32(irp->output, parallel->id);
+       stream_write_uint8(irp->output, 0);
+
+       xfree(path);
+
+       irp->Complete(irp);
+}
+
+static void parallel_process_irp_close(PARALLEL_DEVICE* parallel, IRP* irp)
+{
+       if (close(parallel->file) < 0)
+               DEBUG_SVC("failed to close %s(%d)", parallel->path, parallel->id);
+       else
+               DEBUG_SVC("%s(%d) closed", parallel->path, parallel->id);
+
+       stream_write_zero(irp->output, 5); /* Padding(5) */
+
+       irp->Complete(irp);
+}
+
+static void parallel_process_irp_read(PARALLEL_DEVICE* parallel, IRP* irp)
+{
+       uint32 Length;
+       uint64 Offset;
+       ssize_t status;
+       uint8* buffer = NULL;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+
+       buffer = (uint8*) xmalloc(Length);
+
+       status = read(parallel->file, irp->output->p, Length);
+
+       if (status < 0)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               xfree(buffer);
+               buffer = NULL;
+               Length = 0;
+
+               DEBUG_WARN("read %s(%d) failed", parallel->path, parallel->id);
+       }
+       else
+       {
+               DEBUG_SVC("read %llu-%llu from %d", Offset, Offset + Length, parallel->id);
+       }
+
+       stream_write_uint32(irp->output, Length);
+       if (Length > 0)
+       {
+               stream_check_size(irp->output, Length);
+               stream_write(irp->output, buffer, Length);
+       }
+       xfree(buffer);
+
+       irp->Complete(irp);
+}
+
+static void parallel_process_irp_write(PARALLEL_DEVICE* parallel, IRP* irp)
+{
+       uint32 Length;
+       uint64 Offset;
+       ssize_t status;
+       uint32 len;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+       stream_seek(irp->input, 20); /* Padding */
+
+       DEBUG_SVC("Length %u Offset %llu", Length, Offset);
+
+       len = Length;
+       while (len > 0)
+       {
+               status = write(parallel->file, stream_get_tail(irp->input), len);
+
+               if (status < 0)
+               {
+                       irp->IoStatus = STATUS_UNSUCCESSFUL;
+                       Length = 0;
+
+                       DEBUG_WARN("write %s(%d) failed.", parallel->path, parallel->id);
+                       break;
+               }
+
+               stream_seek(irp->input, status);
+               len -= status;
+       }
+
+       stream_write_uint32(irp->output, Length);
+       stream_write_uint8(irp->output, 0); /* Padding */
+
+       irp->Complete(irp);
+}
+
+static void parallel_process_irp_device_control(PARALLEL_DEVICE* parallel, IRP* irp)
+{
+       DEBUG_SVC("in");
+       stream_write_uint32(irp->output, 0); /* OutputBufferLength */
+       irp->Complete(irp);
+}
+
+static void parallel_process_irp(PARALLEL_DEVICE* parallel, IRP* irp)
+{
+       DEBUG_SVC("MajorFunction %u", irp->MajorFunction);
+
+       switch (irp->MajorFunction)
+       {
+               case IRP_MJ_CREATE:
+                       parallel_process_irp_create(parallel, irp);
+                       break;
+
+               case IRP_MJ_CLOSE:
+                       parallel_process_irp_close(parallel, irp);
+                       break;
+
+               case IRP_MJ_READ:
+                       parallel_process_irp_read(parallel, irp);
+                       break;
+
+               case IRP_MJ_WRITE:
+                       parallel_process_irp_write(parallel, irp);
+                       break;
+
+               case IRP_MJ_DEVICE_CONTROL:
+                       parallel_process_irp_device_control(parallel, irp);
+                       break;
+
+               default:
+                       DEBUG_WARN("MajorFunction 0x%X not supported", irp->MajorFunction);
+                       irp->IoStatus = STATUS_NOT_SUPPORTED;
+                       irp->Complete(irp);
+                       break;
+       }
+}
+
+static void parallel_process_irp_list(PARALLEL_DEVICE* parallel)
+{
+       IRP* irp;
+
+       while (1)
+       {
+               if (freerdp_thread_is_stopped(parallel->thread))
+                       break;
+
+               freerdp_thread_lock(parallel->thread);
+               irp = (IRP*) list_dequeue(parallel->irp_list);
+               freerdp_thread_unlock(parallel->thread);
+
+               if (irp == NULL)
+                       break;
+
+               parallel_process_irp(parallel, irp);
+       }
+}
+
+static void* parallel_thread_func(void* arg)
+{
+       PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) arg;
+
+       while (1)
+       {
+               freerdp_thread_wait(parallel->thread);
+
+               if (freerdp_thread_is_stopped(parallel->thread))
+                       break;
+
+               freerdp_thread_reset(parallel->thread);
+               parallel_process_irp_list(parallel);
+       }
+
+       freerdp_thread_quit(parallel->thread);
+
+       return NULL;
+}
+
+static void parallel_irp_request(DEVICE* device, IRP* irp)
+{
+       PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) device;
+
+       freerdp_thread_lock(parallel->thread);
+       list_enqueue(parallel->irp_list, irp);
+       freerdp_thread_unlock(parallel->thread);
+
+       freerdp_thread_signal(parallel->thread);
+}
+
+static void parallel_free(DEVICE* device)
+{
+       IRP* irp;
+       PARALLEL_DEVICE* parallel = (PARALLEL_DEVICE*) device;
+
+       DEBUG_SVC("freeing device");
+
+       freerdp_thread_stop(parallel->thread);
+       freerdp_thread_free(parallel->thread);
+
+       while ((irp = (IRP*) list_dequeue(parallel->irp_list)) != NULL)
+               irp->Discard(irp);
+
+       list_free(parallel->irp_list);
+
+       xfree(parallel);
+}
+
+int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
+{
+       char* name;
+       char* path;
+       int i, length;
+       PARALLEL_DEVICE* parallel;
+
+       name = (char*) pEntryPoints->plugin_data->data[1];
+       path = (char*) pEntryPoints->plugin_data->data[2];
+
+       if (name[0] && path[0])
+       {
+               parallel = xnew(PARALLEL_DEVICE);
+
+               parallel->device.type = RDPDR_DTYP_PARALLEL;
+               parallel->device.name = name;
+               parallel->device.IRPRequest = parallel_irp_request;
+               parallel->device.Free = parallel_free;
+
+               length = strlen(name);
+               parallel->device.data = stream_new(length + 1);
+
+               for (i = 0; i <= length; i++)
+                       stream_write_uint8(parallel->device.data, name[i] < 0 ? '_' : name[i]);
+
+               parallel->path = path;
+
+               parallel->irp_list = list_new();
+               parallel->thread = freerdp_thread_new();
+
+               pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) parallel);
+
+               freerdp_thread_start(parallel->thread, parallel_thread_func, parallel);
+       }
+
+       return 0;
+}
diff --git a/channels/rdpdr/printer/CMakeLists.txt b/channels/rdpdr/printer/CMakeLists.txt
new file mode 100644 (file)
index 0000000..d0f184c
--- /dev/null
@@ -0,0 +1,46 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(PRINTER_SRCS
+       printer_main.c
+       printer_main.h
+)
+
+if(WITH_CUPS)
+       set(PRINTER_SRCS
+               ${PRINTER_SRCS}
+               printer_cups.c
+               printer_cups.h
+       )
+       include_directories(${CUPS_INCLUDE_DIR})
+       add_definitions(-DWITH_CUPS)
+endif()
+
+include_directories(..)
+
+add_library(printer ${PRINTER_SRCS})
+set_target_properties(printer PROPERTIES PREFIX "")
+
+target_link_libraries(printer freerdp-utils)
+
+if(WITH_CUPS)
+       target_link_libraries(printer ${CUPS_LIBRARIES})
+endif()
+
+install(TARGETS printer DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpdr/printer/printer_cups.c b/channels/rdpdr/printer/printer_cups.c
new file mode 100644 (file)
index 0000000..846cc31
--- /dev/null
@@ -0,0 +1,283 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Print Virtual Channel - CUPS driver
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <time.h>
+#include <cups/cups.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_constants.h"
+#include "rdpdr_types.h"
+#include "printer_main.h"
+
+#include "printer_cups.h"
+
+typedef struct rdp_cups_printer_driver rdpCupsPrinterDriver;
+typedef struct rdp_cups_printer rdpCupsPrinter;
+typedef struct rdp_cups_print_job rdpCupsPrintJob;
+
+struct rdp_cups_printer_driver
+{
+       rdpPrinterDriver driver;
+
+       int id_sequence;
+};
+
+struct rdp_cups_printer
+{
+       rdpPrinter printer;
+
+       rdpCupsPrintJob* printjob;
+};
+
+struct rdp_cups_print_job
+{
+       rdpPrintJob printjob;
+
+       void* printjob_object;
+       int printjob_id;
+};
+
+static void printer_cups_get_printjob_name(char* buf, int size)
+{
+       time_t tt;
+       struct tm* t;
+
+       tt = time(NULL);
+       t = localtime(&tt);
+       snprintf(buf, size - 1, "FreeRDP Print Job %d%02d%02d%02d%02d%02d",
+               t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
+               t->tm_hour, t->tm_min, t->tm_sec);
+}
+
+static void printer_cups_write_printjob(rdpPrintJob* printjob, uint8* data, int size)
+{
+       rdpCupsPrintJob* cups_printjob = (rdpCupsPrintJob*)printjob;
+
+#ifndef _CUPS_API_1_4
+
+       {
+               FILE* fp;
+
+               fp = fopen((const char*)cups_printjob->printjob_object, "a+b");
+               if (fp == NULL)
+               {
+                       DEBUG_WARN("failed to open file %s", (char*)cups_printjob->printjob_object);
+                       return;
+               }
+               if (fwrite(data, 1, size, fp) < size)
+               {
+                       DEBUG_WARN("failed to write file %s", (char*)cups_printjob->printjob_object);
+               }
+               fclose(fp);
+       }
+
+#else
+
+       cupsWriteRequestData((http_t*)cups_printjob->printjob_object, (const char*)data, size);
+
+#endif
+}
+
+static void printer_cups_close_printjob(rdpPrintJob* printjob)
+{
+       rdpCupsPrintJob* cups_printjob = (rdpCupsPrintJob*)printjob;
+
+#ifndef _CUPS_API_1_4
+
+       {
+               char buf[100];
+
+               printer_cups_get_printjob_name(buf, sizeof(buf));
+               if (cupsPrintFile(printjob->printer->name, (const char *)cups_printjob->printjob_object, buf, 0, NULL) == 0)
+               {
+                       DEBUG_WARN("cupsPrintFile: %s", cupsLastErrorString());
+               }
+               unlink(cups_printjob->printjob_object);
+               xfree(cups_printjob->printjob_object);
+       }
+
+#else
+
+       cupsFinishDocument((http_t*)cups_printjob->printjob_object, printjob->printer->name);
+       cups_printjob->printjob_id = 0;
+       httpClose((http_t*)cups_printjob->printjob_object);
+
+#endif
+
+       xfree(cups_printjob);
+
+       ((rdpCupsPrinter*)printjob->printer)->printjob = NULL;
+}
+
+static rdpPrintJob* printer_cups_create_printjob(rdpPrinter* printer, uint32 id)
+{
+       rdpCupsPrinter* cups_printer = (rdpCupsPrinter*)printer;
+       rdpCupsPrintJob* cups_printjob;
+
+       if (cups_printer->printjob != NULL)
+               return NULL;
+
+       cups_printjob = xnew(rdpCupsPrintJob);
+
+       cups_printjob->printjob.id = id;
+       cups_printjob->printjob.printer = printer;
+
+       cups_printjob->printjob.Write = printer_cups_write_printjob;
+       cups_printjob->printjob.Close = printer_cups_close_printjob;
+
+#ifndef _CUPS_API_1_4
+
+       cups_printjob->printjob_object = xstrdup(tmpnam(NULL));
+
+#else
+       {
+               char buf[100];
+
+               cups_printjob->printjob_object = httpConnectEncrypt(cupsServer(), ippPort(), HTTP_ENCRYPT_IF_REQUESTED);
+               if (cups_printjob->printjob_object == NULL)
+               {
+                       DEBUG_WARN("httpConnectEncrypt: %s", cupsLastErrorString());
+                       xfree(cups_printjob);
+                       return NULL;
+               }
+
+               printer_cups_get_printjob_name(buf, sizeof(buf));
+               cups_printjob->printjob_id = cupsCreateJob((http_t*)cups_printjob->printjob_object,
+                       printer->name, buf, 0, NULL);
+
+               if (cups_printjob->printjob_id == 0)
+               {
+                       DEBUG_WARN("cupsCreateJob: %s", cupsLastErrorString());
+                       httpClose((http_t*)cups_printjob->printjob_object);
+                       xfree(cups_printjob);
+                       return NULL;
+               }
+               cupsStartDocument((http_t*)cups_printjob->printjob_object,
+                       printer->name, cups_printjob->printjob_id, buf,
+                       CUPS_FORMAT_AUTO, 1);
+       }
+
+#endif
+
+       cups_printer->printjob = cups_printjob;
+       
+       return (rdpPrintJob*)cups_printjob;
+}
+
+static rdpPrintJob* printer_cups_find_printjob(rdpPrinter* printer, uint32 id)
+{
+       rdpCupsPrinter* cups_printer = (rdpCupsPrinter*)printer;
+
+       if (cups_printer->printjob == NULL)
+               return NULL;
+       if (cups_printer->printjob->printjob.id != id)
+               return NULL;
+
+       return (rdpPrintJob*)cups_printer->printjob;
+}
+
+static void printer_cups_free_printer(rdpPrinter* printer)
+{
+       rdpCupsPrinter* cups_printer = (rdpCupsPrinter*)printer;
+
+       if (cups_printer->printjob)
+               cups_printer->printjob->printjob.Close((rdpPrintJob*)cups_printer->printjob);
+       xfree(printer->name);
+       xfree(printer);
+}
+
+static rdpPrinter* printer_cups_new_printer(rdpCupsPrinterDriver* cups_driver, const char* name, boolean is_default)
+{
+       rdpCupsPrinter* cups_printer;
+
+       cups_printer = xnew(rdpCupsPrinter);
+
+       cups_printer->printer.id = cups_driver->id_sequence++;
+       cups_printer->printer.name = xstrdup(name);
+       /* This is a generic PostScript printer driver developed by MS, so it should be good in most cases */
+       cups_printer->printer.driver = "MS Publisher Imagesetter";
+       cups_printer->printer.is_default = is_default;
+
+       cups_printer->printer.CreatePrintJob = printer_cups_create_printjob;
+       cups_printer->printer.FindPrintJob = printer_cups_find_printjob;
+       cups_printer->printer.Free = printer_cups_free_printer;
+
+       return (rdpPrinter*)cups_printer;
+}
+
+static rdpPrinter** printer_cups_enum_printers(rdpPrinterDriver* driver)
+{
+       rdpPrinter** printers;
+       int num_printers;
+       cups_dest_t *dests;
+       cups_dest_t *dest;
+       int num_dests;
+       int i;
+
+       num_dests = cupsGetDests(&dests);
+       printers = (rdpPrinter**)xzalloc(sizeof(rdpPrinter*) * (num_dests + 1));
+       num_printers = 0;
+       for (i = 0, dest = dests; i < num_dests; i++, dest++)
+       {
+               if (dest->instance == NULL)
+               {
+                       printers[num_printers++] = printer_cups_new_printer((rdpCupsPrinterDriver*)driver,
+                               dest->name, dest->is_default);
+               }
+       }
+       cupsFreeDests(num_dests, dests);
+
+       return printers;
+}
+
+static rdpPrinter* printer_cups_get_printer(rdpPrinterDriver* driver, const char* name)
+{
+       rdpCupsPrinterDriver* cups_driver = (rdpCupsPrinterDriver*)driver;
+
+       return printer_cups_new_printer(cups_driver, name, cups_driver->id_sequence == 1 ? true : false);
+}
+
+static rdpCupsPrinterDriver* cups_driver = NULL;
+
+rdpPrinterDriver* printer_cups_get_driver(void)
+{
+       if (cups_driver == NULL)
+       {
+               cups_driver = xnew(rdpCupsPrinterDriver);
+
+               cups_driver->driver.EnumPrinters = printer_cups_enum_printers;
+               cups_driver->driver.GetPrinter = printer_cups_get_printer;
+
+               cups_driver->id_sequence = 1;
+
+#ifdef _CUPS_API_1_4
+               DEBUG_SVC("using CUPS API 1.4");
+#else
+               DEBUG_SVC("using CUPS API 1.2");
+#endif
+       }
+
+       return (rdpPrinterDriver*)cups_driver;
+}
+
diff --git a/channels/rdpdr/printer/printer_cups.h b/channels/rdpdr/printer/printer_cups.h
new file mode 100644 (file)
index 0000000..c6e1ff5
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Print Virtual Channel - CUPS driver
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PRINTER_CUPS_H
+#define __PRINTER_CUPS_H
+
+#include "printer_main.h"
+
+rdpPrinterDriver* printer_cups_get_driver(void);
+
+#endif
+
diff --git a/channels/rdpdr/printer/printer_main.c b/channels/rdpdr/printer/printer_main.c
new file mode 100644 (file)
index 0000000..d379102
--- /dev/null
@@ -0,0 +1,340 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Print Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_constants.h"
+#include "rdpdr_types.h"
+
+#ifdef WITH_CUPS
+#include "printer_cups.h"
+#endif
+
+#include "printer_main.h"
+
+typedef struct _PRINTER_DEVICE PRINTER_DEVICE;
+struct _PRINTER_DEVICE
+{
+       DEVICE device;
+
+       rdpPrinter* printer;
+
+       LIST* irp_list;
+       freerdp_thread* thread;
+};
+
+static void printer_process_irp_create(PRINTER_DEVICE* printer_dev, IRP* irp)
+{
+       rdpPrintJob* printjob = NULL;
+
+       if (printer_dev->printer != NULL)
+               printjob = printer_dev->printer->CreatePrintJob(printer_dev->printer, irp->devman->id_sequence++);
+
+       if (printjob != NULL)
+       {
+               stream_write_uint32(irp->output, printjob->id); /* FileId */
+
+               DEBUG_SVC("printjob id: %d", printjob->id);
+       }
+       else
+       {
+               stream_write_uint32(irp->output, 0); /* FileId */
+               irp->IoStatus = STATUS_PRINT_QUEUE_FULL;
+
+               DEBUG_WARN("error creating print job.");
+       }
+
+       irp->Complete(irp);
+}
+
+static void printer_process_irp_close(PRINTER_DEVICE* printer_dev, IRP* irp)
+{
+       rdpPrintJob* printjob = NULL;
+
+       if (printer_dev->printer != NULL)
+               printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId);
+
+       if (printjob == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+
+               DEBUG_WARN("printjob id %d not found.", irp->FileId);
+       }
+       else
+       {
+               printjob->Close(printjob);
+
+               DEBUG_SVC("printjob id %d closed.", irp->FileId);
+       }
+
+       stream_write_zero(irp->output, 4); /* Padding(4) */
+
+       irp->Complete(irp);
+}
+
+static void printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp)
+{
+       rdpPrintJob* printjob = NULL;
+       uint32 Length;
+       uint64 Offset;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+       stream_seek(irp->input, 20); /* Padding */
+
+       if (printer_dev->printer != NULL)
+               printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId);
+
+       if (printjob == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("printjob id %d not found.", irp->FileId);
+       }
+       else
+       {
+               printjob->Write(printjob, stream_get_tail(irp->input), Length);
+
+               DEBUG_SVC("printjob id %d written %d bytes.", irp->FileId, Length);
+       }
+
+       stream_write_uint32(irp->output, Length);
+       stream_write_uint8(irp->output, 0); /* Padding */
+
+       irp->Complete(irp);
+}
+
+static void printer_process_irp(PRINTER_DEVICE* printer_dev, IRP* irp)
+{
+       switch (irp->MajorFunction)
+       {
+               case IRP_MJ_CREATE:
+                       printer_process_irp_create(printer_dev, irp);
+                       break;
+
+               case IRP_MJ_CLOSE:
+                       printer_process_irp_close(printer_dev, irp);
+                       break;
+
+               case IRP_MJ_WRITE:
+                       printer_process_irp_write(printer_dev, irp);
+                       break;
+
+               default:
+                       DEBUG_WARN("MajorFunction 0x%X not supported", irp->MajorFunction);
+                       irp->IoStatus = STATUS_NOT_SUPPORTED;
+                       irp->Complete(irp);
+                       break;
+       }
+}
+
+static void printer_process_irp_list(PRINTER_DEVICE* printer_dev)
+{
+       IRP* irp;
+
+       while (1)
+       {
+               if (freerdp_thread_is_stopped(printer_dev->thread))
+                       break;
+
+               freerdp_thread_lock(printer_dev->thread);
+               irp = (IRP*)list_dequeue(printer_dev->irp_list);
+               freerdp_thread_unlock(printer_dev->thread);
+
+               if (irp == NULL)
+                       break;
+
+               printer_process_irp(printer_dev, irp);
+       }
+}
+
+static void* printer_thread_func(void* arg)
+{
+       PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)arg;
+
+       while (1)
+       {
+               freerdp_thread_wait(printer_dev->thread);
+
+               if (freerdp_thread_is_stopped(printer_dev->thread))
+                       break;
+
+               freerdp_thread_reset(printer_dev->thread);
+               printer_process_irp_list(printer_dev);
+       }
+
+       freerdp_thread_quit(printer_dev->thread);
+
+       return NULL;
+}
+
+static void printer_irp_request(DEVICE* device, IRP* irp)
+{
+       PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)device;
+
+       freerdp_thread_lock(printer_dev->thread);
+       list_enqueue(printer_dev->irp_list, irp);
+       freerdp_thread_unlock(printer_dev->thread);
+
+       freerdp_thread_signal(printer_dev->thread);
+}
+
+static void printer_free(DEVICE* device)
+{
+       PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)device;
+       IRP* irp;
+
+       freerdp_thread_stop(printer_dev->thread);
+       freerdp_thread_free(printer_dev->thread);
+       
+       while ((irp = (IRP*)list_dequeue(printer_dev->irp_list)) != NULL)
+               irp->Discard(irp);
+       list_free(printer_dev->irp_list);
+
+       if (printer_dev->printer)
+               printer_dev->printer->Free(printer_dev->printer);
+
+       xfree(printer_dev->device.name);
+
+       xfree(printer_dev);
+}
+
+void printer_register(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, rdpPrinter* printer)
+{
+       PRINTER_DEVICE* printer_dev;
+       char* port;
+       UNICONV* uniconv;
+       uint32 Flags;
+       size_t DriverNameLen;
+       char* DriverName;
+       size_t PrintNameLen;
+       char* PrintName;
+       uint32 CachedFieldsLen;
+       uint8* CachedPrinterConfigData;
+
+       port = xmalloc(10);
+       snprintf(port, 10, "PRN%d", printer->id);
+
+       printer_dev = xnew(PRINTER_DEVICE);
+
+       printer_dev->device.type = RDPDR_DTYP_PRINT;
+       printer_dev->device.name = port;
+       printer_dev->device.IRPRequest = printer_irp_request;
+       printer_dev->device.Free = printer_free;
+
+       printer_dev->printer = printer;
+
+       CachedFieldsLen = 0;
+       CachedPrinterConfigData = NULL;
+
+       DEBUG_SVC("Printer %s registered", printer->name);
+
+       Flags = 0;
+       if (printer->is_default)
+               Flags |= RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER;
+
+       uniconv = freerdp_uniconv_new();
+       DriverName = freerdp_uniconv_out(uniconv, printer->driver, &DriverNameLen);
+       PrintName = freerdp_uniconv_out(uniconv, printer->name, &PrintNameLen);
+       freerdp_uniconv_free(uniconv);
+
+       printer_dev->device.data = stream_new(28 + DriverNameLen + PrintNameLen + CachedFieldsLen);
+
+       stream_write_uint32(printer_dev->device.data, Flags);
+       stream_write_uint32(printer_dev->device.data, 0); /* CodePage, reserved */
+       stream_write_uint32(printer_dev->device.data, 0); /* PnPNameLen */
+       stream_write_uint32(printer_dev->device.data, DriverNameLen + 2);
+       stream_write_uint32(printer_dev->device.data, PrintNameLen + 2);
+       stream_write_uint32(printer_dev->device.data, CachedFieldsLen);
+       stream_write(printer_dev->device.data, DriverName, DriverNameLen);
+       stream_write_uint16(printer_dev->device.data, 0);
+       stream_write(printer_dev->device.data, PrintName, PrintNameLen);
+       stream_write_uint16(printer_dev->device.data, 0);
+       if (CachedFieldsLen > 0)
+       {
+               stream_write(printer_dev->device.data, CachedPrinterConfigData, CachedFieldsLen);
+       }
+
+       xfree(DriverName);
+       xfree(PrintName);
+
+       printer_dev->irp_list = list_new();
+       printer_dev->thread = freerdp_thread_new();
+
+       pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*)printer_dev);
+
+       freerdp_thread_start(printer_dev->thread, printer_thread_func, printer_dev);
+}
+
+int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
+{
+       rdpPrinterDriver* driver = NULL;
+       rdpPrinter** printers;
+       rdpPrinter* printer;
+       int i;
+       char* name;
+       char* driver_name;
+
+#ifdef WITH_CUPS
+       driver = printer_cups_get_driver();
+#endif
+       if (driver == NULL)
+       {
+               DEBUG_WARN("no driver.");
+               return 1;
+       }
+
+       name = (char*)pEntryPoints->plugin_data->data[1];
+       driver_name = (char*)pEntryPoints->plugin_data->data[2];
+
+       if (name && name[0])
+       {
+               printer = driver->GetPrinter(driver, name);
+               if (printer == NULL)
+               {
+                       DEBUG_WARN("printer %s not found.", name);
+                       return 1;
+               }
+               if (driver_name && driver_name[0])
+                       printer->driver = driver_name;
+
+               printer_register(pEntryPoints, printer);
+       }
+       else
+       {
+               printers = driver->EnumPrinters(driver);
+               for (i = 0; printers[i]; i++)
+               {
+                       printer = printers[i];
+                       printer_register(pEntryPoints, printer);
+               }
+               xfree(printers);
+       }
+
+       return 0;
+}
diff --git a/channels/rdpdr/printer/printer_main.h b/channels/rdpdr/printer/printer_main.h
new file mode 100644 (file)
index 0000000..256c4a7
--- /dev/null
@@ -0,0 +1,79 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Print Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PRINTER_MAIN_H
+#define __PRINTER_MAIN_H
+
+#include "rdpdr_types.h"
+
+/* SERVER_PRINTER_CACHE_EVENT.cachedata */
+#define RDPDR_ADD_PRINTER_EVENT             0x00000001
+#define RDPDR_UPDATE_PRINTER_EVENT          0x00000002
+#define RDPDR_DELETE_PRINTER_EVENT          0x00000003
+#define RDPDR_RENAME_PRINTER_EVENT          0x00000004
+
+/* DR_PRN_DEVICE_ANNOUNCE.Flags */
+#define RDPDR_PRINTER_ANNOUNCE_FLAG_ASCII           0x00000001
+#define RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER  0x00000002
+#define RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER  0x00000004
+#define RDPDR_PRINTER_ANNOUNCE_FLAG_TSPRINTER       0x00000008
+#define RDPDR_PRINTER_ANNOUNCE_FLAG_XPSFORMAT       0x00000010
+
+typedef struct rdp_printer_driver rdpPrinterDriver;
+typedef struct rdp_printer rdpPrinter;
+typedef struct rdp_print_job rdpPrintJob;
+
+typedef rdpPrinter** (*pcEnumPrinters) (rdpPrinterDriver* driver);
+typedef rdpPrinter* (*pcGetPrinter) (rdpPrinterDriver* driver, const char* name);
+
+struct rdp_printer_driver
+{
+       pcEnumPrinters EnumPrinters;
+       pcGetPrinter GetPrinter;
+};
+
+typedef rdpPrintJob* (*pcCreatePrintJob) (rdpPrinter* printer, uint32 id);
+typedef rdpPrintJob* (*pcFindPrintJob) (rdpPrinter* printer, uint32 id);
+typedef void (*pcFreePrinter) (rdpPrinter* printer);
+
+struct rdp_printer
+{
+       int id;
+       char* name;
+       char* driver;
+       boolean is_default;
+
+       pcCreatePrintJob CreatePrintJob;
+       pcFindPrintJob FindPrintJob;
+       pcFreePrinter Free;
+};
+
+typedef void (*pcWritePrintJob) (rdpPrintJob* printjob, uint8* data, int size);
+typedef void (*pcClosePrintJob) (rdpPrintJob* printjob);
+
+struct rdp_print_job
+{
+       uint32 id;
+       rdpPrinter* printer;
+
+       pcWritePrintJob Write;
+       pcClosePrintJob Close;
+};
+
+#endif
diff --git a/channels/rdpdr/rdpdr_capabilities.c b/channels/rdpdr/rdpdr_capabilities.c
new file mode 100644 (file)
index 0000000..c31dbea
--- /dev/null
@@ -0,0 +1,187 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_types.h"
+#include "rdpdr_constants.h"
+#include "rdpdr_capabilities.h"
+
+/* Output device redirection capability set header */
+static void rdpdr_write_capset_header(STREAM* data_out, uint16 capabilityType, uint16 capabilityLength, uint32 version)
+{
+       stream_write_uint16(data_out, capabilityType);
+       stream_write_uint16(data_out, capabilityLength);
+       stream_write_uint32(data_out, version);
+}
+
+/* Output device direction general capability set */
+static void rdpdr_write_general_capset(rdpdrPlugin* rdpdr, STREAM* data_out)
+{
+       rdpdr_write_capset_header(data_out, CAP_GENERAL_TYPE, 44, GENERAL_CAPABILITY_VERSION_02);
+
+       stream_write_uint32(data_out, 0); /* osType, ignored on receipt */
+       stream_write_uint32(data_out, 0); /* osVersion, unused and must be set to zero */
+       stream_write_uint16(data_out, 1); /* protocolMajorVersion, must be set to 1 */
+       stream_write_uint16(data_out, RDPDR_MINOR_RDP_VERSION_5_2); /* protocolMinorVersion */
+       stream_write_uint32(data_out, 0x0000FFFF); /* ioCode1 */
+       stream_write_uint32(data_out, 0); /* ioCode2, must be set to zero, reserved for future use */
+       stream_write_uint32(data_out, RDPDR_DEVICE_REMOVE_PDUS | RDPDR_CLIENT_DISPLAY_NAME_PDU | RDPDR_USER_LOGGEDON_PDU); /* extendedPDU */
+       stream_write_uint32(data_out, ENABLE_ASYNCIO); /* extraFlags1 */
+       stream_write_uint32(data_out, 0); /* extraFlags2, must be set to zero, reserved for future use */
+       stream_write_uint32(data_out, 0); /* SpecialTypeDeviceCap, number of special devices to be redirected before logon */
+}
+
+/* Process device direction general capability set */
+static void rdpdr_process_general_capset(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 capabilityLength;
+
+       stream_read_uint16(data_in, capabilityLength);
+       stream_seek(data_in, capabilityLength - 4);
+}
+
+/* Output printer direction capability set */
+static void rdpdr_write_printer_capset(rdpdrPlugin* rdpdr, STREAM* data_out)
+{
+       rdpdr_write_capset_header(data_out, CAP_PRINTER_TYPE, 8, PRINT_CAPABILITY_VERSION_01);
+}
+
+/* Process printer direction capability set */
+static void rdpdr_process_printer_capset(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 capabilityLength;
+
+       stream_read_uint16(data_in, capabilityLength);
+       stream_seek(data_in, capabilityLength - 4);
+}
+
+/* Output port redirection capability set */
+static void rdpdr_write_port_capset(rdpdrPlugin* rdpdr, STREAM* data_out)
+{
+       rdpdr_write_capset_header(data_out, CAP_PORT_TYPE, 8, PORT_CAPABILITY_VERSION_01);
+}
+
+/* Process port redirection capability set */
+static void rdpdr_process_port_capset(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 capabilityLength;
+
+       stream_read_uint16(data_in, capabilityLength);
+       stream_seek(data_in, capabilityLength - 4);
+}
+
+/* Output drive redirection capability set */
+static void rdpdr_write_drive_capset(rdpdrPlugin* rdpdr, STREAM* data_out)
+{
+       rdpdr_write_capset_header(data_out, CAP_DRIVE_TYPE, 8, DRIVE_CAPABILITY_VERSION_02);
+}
+
+/* Process drive redirection capability set */
+static void rdpdr_process_drive_capset(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 capabilityLength;
+
+       stream_read_uint16(data_in, capabilityLength);
+       stream_seek(data_in, capabilityLength - 4);
+}
+
+/* Output smart card redirection capability set */
+static void rdpdr_write_smartcard_capset(rdpdrPlugin* rdpdr, STREAM* data_out)
+{
+       rdpdr_write_capset_header(data_out, CAP_SMARTCARD_TYPE, 8, SMARTCARD_CAPABILITY_VERSION_01);
+}
+
+/* Process smartcard redirection capability set */
+static void rdpdr_process_smartcard_capset(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 capabilityLength;
+
+       stream_read_uint16(data_in, capabilityLength);
+       stream_seek(data_in, capabilityLength - 4);
+}
+
+void rdpdr_process_capability_request(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 i;
+       uint16 numCapabilities;
+       uint16 capabilityType;
+
+       stream_read_uint16(data_in, numCapabilities);
+       stream_seek(data_in, 2); /* pad (2 bytes) */
+
+       for(i = 0; i < numCapabilities; i++)
+       {
+               stream_read_uint16(data_in, capabilityType);
+
+               switch (capabilityType)
+               {
+                       case CAP_GENERAL_TYPE:
+                               rdpdr_process_general_capset(rdpdr, data_in);
+                               break;
+
+                       case CAP_PRINTER_TYPE:
+                               rdpdr_process_printer_capset(rdpdr, data_in);
+                               break;
+
+                       case CAP_PORT_TYPE:
+                               rdpdr_process_port_capset(rdpdr, data_in);
+                               break;
+
+                       case CAP_DRIVE_TYPE:
+                               rdpdr_process_drive_capset(rdpdr, data_in);
+                               break;
+
+                       case CAP_SMARTCARD_TYPE:
+                               rdpdr_process_smartcard_capset(rdpdr, data_in);
+                               break;
+
+                       default:
+                               DEBUG_WARN("Unknown capabilityType %d", capabilityType);
+                               break;
+               }
+       }
+}
+
+void rdpdr_send_capability_response(rdpdrPlugin* rdpdr)
+{
+       STREAM* data_out;
+
+       data_out = stream_new(256);
+
+       stream_write_uint16(data_out, RDPDR_CTYP_CORE);
+       stream_write_uint16(data_out, PAKID_CORE_CLIENT_CAPABILITY);
+
+       stream_write_uint16(data_out, 5); /* numCapabilities */
+       stream_write_uint16(data_out, 0); /* pad */
+
+       rdpdr_write_general_capset(rdpdr, data_out);
+       rdpdr_write_printer_capset(rdpdr, data_out);
+       rdpdr_write_port_capset(rdpdr, data_out);
+       rdpdr_write_drive_capset(rdpdr, data_out);
+       rdpdr_write_smartcard_capset(rdpdr, data_out);
+
+       svc_plugin_send((rdpSvcPlugin*)rdpdr, data_out);
+}
diff --git a/channels/rdpdr/rdpdr_capabilities.h b/channels/rdpdr/rdpdr_capabilities.h
new file mode 100644 (file)
index 0000000..28b83c7
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDPDR_CAPABILITIES_H
+#define __RDPDR_CAPABILITIES_H
+
+#include "rdpdr_main.h"
+
+void rdpdr_process_capability_request(rdpdrPlugin* rdpdr, STREAM* data_in);
+void rdpdr_send_capability_response(rdpdrPlugin* rdpdr);
+
+#endif /* __RDPDR_CAPABILITIES_H */
diff --git a/channels/rdpdr/rdpdr_constants.h b/channels/rdpdr/rdpdr_constants.h
new file mode 100644 (file)
index 0000000..ce8b7f0
--- /dev/null
@@ -0,0 +1,442 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDPDR_CONSTANTS_H
+#define __RDPDR_CONSTANTS_H
+
+/* RDPDR_HEADER.Component */
+enum RDPDR_CTYP
+{
+       RDPDR_CTYP_CORE = 0x4472,
+       RDPDR_CTYP_PRN = 0x5052
+};
+
+/* RDPDR_HEADER.PacketId */
+enum RDPDR_PAKID
+{
+       PAKID_CORE_SERVER_ANNOUNCE = 0x496E,
+       PAKID_CORE_CLIENTID_CONFIRM = 0x4343,
+       PAKID_CORE_CLIENT_NAME = 0x434E,
+       PAKID_CORE_DEVICELIST_ANNOUNCE = 0x4441,
+       PAKID_CORE_DEVICE_REPLY = 0x6472,
+       PAKID_CORE_DEVICE_IOREQUEST = 0x4952,
+       PAKID_CORE_DEVICE_IOCOMPLETION = 0x4943,
+       PAKID_CORE_SERVER_CAPABILITY = 0x5350,
+       PAKID_CORE_CLIENT_CAPABILITY = 0x4350,
+       PAKID_CORE_DEVICELIST_REMOVE = 0x444D,
+       PAKID_CORE_USER_LOGGEDON = 0x554C,
+       PAKID_PRN_CACHE_DATA = 0x5043,
+       PAKID_PRN_USING_XPS = 0x5543
+};
+
+/* CAPABILITY_HEADER.CapabilityType */
+enum RDPDR_CAP_TYPE
+{
+       CAP_GENERAL_TYPE = 0x0001,
+       CAP_PRINTER_TYPE = 0x0002,
+       CAP_PORT_TYPE = 0x0003,
+       CAP_DRIVE_TYPE = 0x0004,
+       CAP_SMARTCARD_TYPE = 0x0005
+};
+
+/* CAPABILITY_HEADER.Version */
+enum RDPDR_CAP_VERSION
+{
+       GENERAL_CAPABILITY_VERSION_01 = 0x00000001,
+       GENERAL_CAPABILITY_VERSION_02 = 0x00000002,
+       PRINT_CAPABILITY_VERSION_01 = 0x00000001,
+       PORT_CAPABILITY_VERSION_01 = 0x00000001,
+       DRIVE_CAPABILITY_VERSION_01 = 0x00000001,
+       DRIVE_CAPABILITY_VERSION_02 = 0x00000002,
+       SMARTCARD_CAPABILITY_VERSION_01 = 0x00000001
+};
+
+/* DEVICE_ANNOUNCE.DeviceType */
+enum RDPDR_DTYP
+{
+       RDPDR_DTYP_SERIAL = 0x00000001,
+       RDPDR_DTYP_PARALLEL = 0x00000002,
+       RDPDR_DTYP_PRINT = 0x00000004,
+       RDPDR_DTYP_FILESYSTEM = 0x00000008,
+       RDPDR_DTYP_SMARTCARD = 0x00000020
+};
+
+/* DR_DEVICE_IOREQUEST.MajorFunction */
+enum IRP_MJ
+{
+       IRP_MJ_CREATE = 0x00000000,
+       IRP_MJ_CLOSE = 0x00000002,
+       IRP_MJ_READ = 0x00000003,
+       IRP_MJ_WRITE = 0x00000004,
+       IRP_MJ_DEVICE_CONTROL = 0x0000000E,
+       IRP_MJ_QUERY_VOLUME_INFORMATION = 0x0000000A,
+       IRP_MJ_SET_VOLUME_INFORMATION = 0x0000000B,
+       IRP_MJ_QUERY_INFORMATION = 0x00000005,
+       IRP_MJ_SET_INFORMATION = 0x00000006,
+       IRP_MJ_DIRECTORY_CONTROL = 0x0000000C,
+       IRP_MJ_LOCK_CONTROL = 0x00000011
+};
+
+/* DR_DEVICE_IOREQUEST.MinorFunction */
+enum IRP_MN
+{
+       IRP_MN_QUERY_DIRECTORY = 0x00000001,
+       IRP_MN_NOTIFY_CHANGE_DIRECTORY = 0x00000002
+};
+
+/* DR_CREATE_REQ.CreateDisposition */
+enum FILE_CREATE_DISPOSITION
+{
+       FILE_SUPERSEDE = 0x00000000,
+       FILE_OPEN = 0x00000001,
+       FILE_CREATE = 0x00000002,
+       FILE_OPEN_IF = 0x00000003,
+       FILE_OVERWRITE = 0x00000004,
+       FILE_OVERWRITE_IF = 0x00000005
+};
+
+/* DR_CREATE_REQ.CreateOptions [MS-SMB2] */
+enum FILE_CREATE_OPTION
+{
+       FILE_DIRECTORY_FILE = 0x00000001,
+       FILE_NON_DIRECTORY_FILE = 0x00000040,
+       FILE_COMPLETE_IF_OPLOCKED = 0x00000100,
+       FILE_DELETE_ON_CLOSE = 0x00001000,
+       FILE_OPEN_REPARSE_POINT = 0x00200000,
+       FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
+};
+
+/* DR_CREATE_REQ.DesiredAccess [MS-SMB2] */
+enum FILE_ACCESS
+{
+       FILE_READ_DATA = 0x00000001,
+       FILE_WRITE_DATA = 0x00000002,
+       FILE_APPEND_DATA = 0x00000004,
+       FILE_READ_EA = 0x00000008,
+       FILE_WRITE_EA = 0x00000010,
+       FILE_EXECUTE = 0x00000020,
+       FILE_READ_ATTRIBUTES = 0x00000080,
+       FILE_WRITE_ATTRIBUTES = 0x00000100,
+       DELETE = 0x00010000,
+       READ_CONTROL = 0x00020000,
+       WRITE_DAC = 0x00040000,
+       WRITE_OWNER = 0x00080000,
+       SYNCHRONIZE = 0x00100000,
+       ACCESS_SYSTEM_SECURITY = 0x01000000,
+       MAXIMUM_ALLOWED = 0x02000000,
+       GENERIC_ALL = 0x10000000,
+       GENERIC_EXECUTE = 0x20000000,
+       GENERIC_WRITE = 0x40000000,
+       GENERIC_READ = 0x80000000
+};
+
+/* DR_CREATE_RSP.Information */
+/* DR_DRIVE_CREATE_RSP.DeviceCreateResponse */
+enum FILE_RESPONSE
+{
+       FILE_SUPERSEDED = 0x00000000,
+       FILE_OPENED = 0x00000001,
+       FILE_OVERWRITTEN = 0x00000003
+};
+
+/* DR_CORE_CLIENT_ANNOUNCE_RSP.VersionMinor */
+enum RDPDR_MINOR_RDP_VERSION
+{
+       RDPDR_MINOR_RDP_VERSION_5_0 = 0x0002,
+       RDPDR_MINOR_RDP_VERSION_5_1 = 0x0005,
+       RDPDR_MINOR_RDP_VERSION_5_2 = 0x000A,
+       RDPDR_MINOR_RDP_VERSION_6_X = 0x000C
+};
+
+/* DR_CORE_CLIENT_NAME_REQ.UnicodeFlag */
+enum RDPDR_CLIENT_NAME_FLAG
+{
+       RDPDR_CLIENT_NAME_UNICODE = 0x00000001,
+       RDPDR_CLIENT_NAME_ASCII = 0x00000000
+};
+
+/* GENERAL_CAPS_SET.ioCode1 */
+enum RDPDR_CAPS_IRP_MJ
+{
+       RDPDR_IRP_MJ_CREATE = 0x00000001,
+       RDPDR_IRP_MJ_CLEANUP = 0x00000002,
+       RDPDR_IRP_MJ_CLOSE = 0x00000004,
+       RDPDR_IRP_MJ_READ = 0x00000008,
+       RDPDR_IRP_MJ_WRITE = 0x00000010,
+       RDPDR_IRP_MJ_FLUSH_BUFFERS = 0x00000020,
+       RDPDR_IRP_MJ_SHUTDOWN = 0x00000040,
+       RDPDR_IRP_MJ_DEVICE_CONTROL = 0x00000080,
+       RDPDR_IRP_MJ_QUERY_VOLUME_INFORMATION = 0x00000100,
+       RDPDR_IRP_MJ_SET_VOLUME_INFORMATION = 0x00000200,
+       RDPDR_IRP_MJ_QUERY_INFORMATION = 0x00000400,
+       RDPDR_IRP_MJ_SET_INFORMATION = 0x00000800,
+       RDPDR_IRP_MJ_DIRECTORY_CONTROL = 0x00001000,
+       RDPDR_IRP_MJ_LOCK_CONTROL = 0x00002000,
+       RDPDR_IRP_MJ_QUERY_SECURITY = 0x00004000,
+       RDPDR_IRP_MJ_SET_SECURITY = 0x00008000
+};
+
+/* GENERAL_CAPS_SET.extendedPDU */
+enum RDPDR_CAPS_PDU
+{
+       RDPDR_DEVICE_REMOVE_PDUS = 0x00000001,
+       RDPDR_CLIENT_DISPLAY_NAME_PDU = 0x00000002,
+       RDPDR_USER_LOGGEDON_PDU = 0x00000004
+};
+
+/* GENERAL_CAPS_SET.extraFlags1 */
+enum RDPDR_CAPS_FLAG
+{
+       ENABLE_ASYNCIO = 0x00000001
+};
+
+/* DR_DRIVE_LOCK_REQ.Operation */
+enum RDP_LOWIO_OP
+{
+       RDP_LOWIO_OP_SHAREDLOCK = 0x00000002,
+       RDP_LOWIO_OP_EXCLUSIVELOCK = 0x00000003,
+       RDP_LOWIO_OP_UNLOCK = 0x00000004,
+       RDP_LOWIO_OP_UNLOCK_MULTIPLE = 0x00000005
+};
+
+/* NTSTATUS values */
+/* http://msdn.microsoft.com/en-us/library/cc704588.aspx */
+enum NTSTATUS
+{
+       STATUS_SUCCESS = 0x00000000,
+       STATUS_TIMEOUT = 0x00000102,
+       STATUS_PENDING = 0x00000103,
+       STATUS_REPARSE = 0x00000104,
+       STATUS_MORE_ENTRIES = 0x00000105,
+       STATUS_NOT_ALL_ASSIGNED = 0x00000106,
+       STATUS_OPLOCK_BREAK_IN_PROGRESS = 0x00000108,
+       STATUS_VOLUME_MOUNTED = 0x00000109,
+       STATUS_NOTIFY_CLEANUP = 0x0000010B,
+       STATUS_NOTIFY_ENUM_DIR = 0x0000010C,
+       STATUS_NO_QUOTAS_FOR_ACCOUNT = 0x0000010D,
+       STATUS_FILE_LOCKED_WITH_ONLY_READERS = 0x0000012A,
+       STATUS_FILE_LOCKED_WITH_WRITERS = 0x0000012B,
+       STATUS_WAIT_FOR_OPLOCK = 0x00000367,
+       STATUS_OBJECT_NAME_EXISTS = 0x40000000,
+       STATUS_BAD_CURRENT_DIRECTORY = 0x40000007,
+       STATUS_NO_MORE_FILES = 0x80000006,
+       STATUS_DEVICE_PAPER_EMPTY = 0x8000000E,
+       STATUS_DEVICE_POWERED_OFF = 0x8000000F,
+       STATUS_DEVICE_OFF_LINE = 0x80000010,
+       STATUS_DEVICE_BUSY = 0x80000011,
+       STATUS_NO_MORE_ENTRIES = 0x8000001A,
+       STATUS_UNSUCCESSFUL = 0xC0000001,
+       STATUS_NOT_IMPLEMENTED = 0xC0000002,
+       STATUS_INVALID_INFO_CLASS = 0xC0000003,
+       STATUS_INVALID_HANDLE = 0xC0000008,
+       STATUS_INVALID_PARAMETER = 0xC000000D,
+       STATUS_NO_SUCH_DEVICE = 0xC000000E,
+       STATUS_NO_SUCH_FILE = 0xC000000F,
+       STATUS_INVALID_DEVICE_REQUEST = 0xC0000010,
+       STATUS_END_OF_FILE = 0xC0000011,
+       STATUS_NO_MEDIA_IN_DEVICE = 0xC0000013,
+       STATUS_UNRECOGNIZED_MEDIA = 0xC0000014,
+       STATUS_ACCESS_DENIED = 0xc0000022,
+       STATUS_OBJECT_NAME_INVALID = 0xC0000033,
+       STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034,
+       STATUS_OBJECT_NAME_COLLISION = 0xc0000035,
+       STATUS_PORT_DISCONNECTED = 0xC0000037,
+       STATUS_OBJECT_PATH_INVALID = 0xC0000039,
+       STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A,
+       STATUS_INVALID_PORT_HANDLE = 0xC0000042,
+       STATUS_DELETE_PENDING = 0xC0000056,
+       STATUS_DISK_FULL = 0xC000007F,
+       STATUS_DEVICE_NOT_READY = 0xC00000A3,
+       STATUS_IO_TIMEOUT = 0xC00000B5,
+       STATUS_FILE_IS_A_DIRECTORY = 0xC00000BA,
+       STATUS_NOT_SUPPORTED = 0xC00000BB,
+       STATUS_PRINT_QUEUE_FULL = 0xC00000C6,
+       STATUS_PRINT_CANCELLED = 0xC00000C8,
+       STATUS_DIRECTORY_NOT_EMPTY = 0xC0000101,
+       STATUS_FILE_CORRUPT_ERROR = 0xC0000102,
+       STATUS_NOT_A_DIRECTORY = 0xC0000103,
+       STATUS_NAME_TOO_LONG = 0xC0000106,
+       STATUS_CANCELLED = 0xC0000120,
+       STATUS_CANNOT_DELETE = 0xC0000121,
+       STATUS_FILE_DELETED = 0xC0000123,
+       STATUS_FILE_CLOSED = 0xC0000128
+};
+
+enum RDPDR_PRINTER_ANNOUNCE_FLAG
+{
+       RDPDR_PRINTER_ANNOUNCE_FLAG_ASCII = 0x00000001,
+       RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER = 0x00000002,
+       RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER = 0x00000004,
+       RDPDR_PRINTER_ANNOUNCE_FLAG_TSPRINTER = 0x00000008,
+       RDPDR_PRINTER_ANNOUNCE_FLAG_XPSFORMAT = 0x00000010
+};
+
+/* [MS-FSCC] FileAttributes */
+enum FILE_ATTRIBUTE
+{
+       FILE_ATTRIBUTE_ARCHIVE = 0x00000020,
+       FILE_ATTRIBUTE_COMPRESSED = 0x00000800,
+       FILE_ATTRIBUTE_DIRECTORY = 0x00000010,
+       FILE_ATTRIBUTE_ENCRYPTED = 0x00004000,
+       FILE_ATTRIBUTE_HIDDEN = 0x00000002,
+       FILE_ATTRIBUTE_NORMAL = 0x00000080,
+       FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000,
+       FILE_ATTRIBUTE_OFFLINE = 0x00001000,
+       FILE_ATTRIBUTE_READONLY = 0x00000001,
+       FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400,
+       FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200,
+       FILE_ATTRIBUTE_SYSTEM = 0x00000004,
+       FILE_ATTRIBUTE_TEMPORARY = 0x00000100
+};
+
+/* [MS-FSCC] FSCTL Structures */
+enum FSCTL_STRUCTURE
+{
+       FSCTL_CREATE_OR_GET_OBJECT_ID = 0x900c0,
+       FSCTL_GET_REPARSE_POINT = 0x900a8,
+       FSCTL_GET_RETRIEVAL_POINTERS = 0x90073,
+       FSCTL_IS_PATHNAME_VALID = 0x9002c,
+       FSCTL_LMR_SET_LINK_TRACKING_INFORMATION = 0x1400ec,
+       FSCTL_PIPE_PEEK = 0x11400c,
+       FSCTL_PIPE_TRANSCEIVE = 0x11c017,
+       FSCTL_PIPE_WAIT = 0x110018,
+       FSCTL_QUERY_FAT_BPB = 0x90058,
+       FSCTL_QUERY_ALLOCATED_RANGES = 0x940cf,
+       FSCTL_QUERY_ON_DISK_VOLUME_INFO = 0x9013c,
+       FSCTL_QUERY_SPARING_INFO = 0x90138,
+       FSCTL_READ_FILE_USN_DATA = 0x900eb,
+       FSCTL_RECALL_FILE = 0x90117,
+       FSCTL_SET_COMPRESSION = 0x9c040,
+       FSCTL_SET_DEFECT_MANAGEMENT = 0x98134,
+       FSCTL_SET_ENCRYPTION = 0x900D7,
+       FSCTL_SET_OBJECT_ID = 0x90098,
+       FSCTL_SET_OBJECT_ID_EXTENDED = 0x900bc,
+       FSCTL_SET_REPARSE_POINT = 0x900a4,
+       FSCTL_SET_SPARSE = 0x900c4,
+       FSCTL_SET_ZERO_DATA = 0x980c8,
+       FSCTL_SET_ZERO_ON_DEALLOCATION = 0x90194,
+       FSCTL_SIS_COPYFILE = 0x90100,
+       FSCTL_WRITE_USN_CLOSE_RECORD = 0x900ef
+};
+
+/* [MS-FSCC] FileFsAttributeInformation.FileSystemAttributes */
+enum FILE_FS_ATTRIBUTE_INFORMATION
+{
+       FILE_SUPPORTS_USN_JOURNAL = 0x02000000,
+       FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000,
+       FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000,
+       FILE_SUPPORTS_HARD_LINKS = 0x00400000,
+       FILE_SUPPORTS_TRANSACTIONS = 0x00200000,
+       FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000,
+       FILE_READ_ONLY_VOLUME = 0x00080000,
+       FILE_NAMED_STREAMS = 0x00040000,
+       FILE_SUPPORTS_ENCRYPTION = 0x00020000,
+       FILE_SUPPORTS_OBJECT_IDS = 0x00010000,
+       FILE_VOLUME_IS_COMPRESSED = 0x00008000,
+       FILE_SUPPORTS_REMOTE_STORAGE = 0x00000100,
+       FILE_SUPPORTS_REPARSE_POINTS = 0x00000080,
+       FILE_SUPPORTS_SPARSE_FILES = 0x00000040,
+       FILE_VOLUME_QUOTAS = 0x00000020,
+       FILE_FILE_COMPRESSION = 0x00000010,
+       FILE_PERSISTENT_ACLS = 0x00000008,
+       FILE_UNICODE_ON_DISK = 0x00000004,
+       FILE_CASE_PRESERVED_NAMES = 0x00000002,
+       FILE_CASE_SENSITIVE_SEARCH = 0x00000001
+};
+
+/* [MS-FSCC] FileFsDeviceInformation.DeviceType */
+enum FILE_FS_DEVICE_TYPE
+{
+       FILE_DEVICE_CD_ROM = 0x00000002,
+       FILE_DEVICE_DISK = 0x00000007
+};
+
+/* [MS-FSCC] FileFsDeviceInformation.Characteristics */
+enum FILE_FS_DEVICE_FLAG
+{
+       FILE_REMOVABLE_MEDIA = 0x00000001,
+       FILE_READ_ONLY_DEVICE = 0x00000002,
+       FILE_FLOPPY_DISKETTE = 0x00000004,
+       FILE_WRITE_ONCE_MEDIA = 0x00000008,
+       FILE_REMOTE_DEVICE = 0x00000010,
+       FILE_DEVICE_IS_MOUNTED = 0x00000020,
+       FILE_VIRTUAL_VOLUME = 0x00000040,
+       FILE_DEVICE_SECURE_OPEN = 0x00000100
+};
+
+enum FILE_INFORMATION_CLASS
+{
+       FileDirectoryInformation = 1,
+       FileFullDirectoryInformation,
+       FileBothDirectoryInformation,
+       FileBasicInformation,
+       FileStandardInformation,
+       FileInternalInformation,
+       FileEaInformation,
+       FileAccessInformation,
+       FileNameInformation,
+       FileRenameInformation,
+       FileLinkInformation,
+       FileNamesInformation,
+       FileDispositionInformation,
+       FilePositionInformation,
+       FileFullEaInformation,
+       FileModeInformation,
+       FileAlignmentInformation,
+       FileAllInformation,
+       FileAllocationInformation,
+       FileEndOfFileInformation,
+       FileAlternateNameInformation,
+       FileStreamInformation,
+       FilePipeInformation,
+       FilePipeLocalInformation,
+       FilePipeRemoteInformation,
+       FileMailslotQueryInformation,
+       FileMailslotSetInformation,
+       FileCompressionInformation,
+       FileObjectIdInformation,
+       FileUnknownInformation1,
+       FileMoveClusterInformation,
+       FileQuotaInformation,
+       FileReparsePointInformation,
+       FileNetworkOpenInformation,
+       FileAttributeTagInformation,
+       FileTrackingInformation,
+       FileIdBothDirectoryInformation,
+       FileIdFullDirectoryInformation,
+       FileValidDataLengthInformation,
+       FileShortNameInformation
+};
+
+enum FILE_FS_INFORMATION_CLASS
+{
+       FileFsVolumeInformation = 1,
+       FileFsLabelInformation,
+       FileFsSizeInformation,
+       FileFsDeviceInformation,
+       FileFsAttributeInformation,
+       FileFsControlInformation,
+       FileFsFullSizeInformation,
+       FileFsObjectIdInformation,
+       FileFsDriverPathInformation,
+       FileFsMaximumInformation
+};
+
+#endif /* __RDPDR_CONSTANTS_H */
diff --git a/channels/rdpdr/rdpdr_main.c b/channels/rdpdr/rdpdr_main.c
new file mode 100644 (file)
index 0000000..714dd3f
--- /dev/null
@@ -0,0 +1,317 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "rdpdr_types.h"
+#include "rdpdr_constants.h"
+#include "rdpdr_capabilities.h"
+#include "devman.h"
+#include "irp.h"
+#include "rdpdr_main.h"
+
+static void rdpdr_process_connect(rdpSvcPlugin* plugin)
+{
+       rdpdrPlugin* rdpdr = (rdpdrPlugin*) plugin;
+       RDP_PLUGIN_DATA* data;
+
+       rdpdr->devman = devman_new(plugin);
+       data = (RDP_PLUGIN_DATA*) plugin->channel_entry_points.pExtendedData;
+
+       while (data && data->size > 0)
+       {
+               if (strcmp((char*) data->data[0], "clientname") == 0)
+               {
+                       strncpy(rdpdr->computerName, (char*) data->data[1], sizeof(rdpdr->computerName) - 1);
+                       DEBUG_SVC("computerName %s", rdpdr->computerName);
+               }
+               else
+               {
+                       devman_load_device_service(rdpdr->devman, data);
+               }
+               data = (RDP_PLUGIN_DATA*) (((void*) data) + data->size);
+       }
+}
+
+static void rdpdr_process_server_announce_request(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       stream_read_uint16(data_in, rdpdr->versionMajor);
+       stream_read_uint16(data_in, rdpdr->versionMinor);
+       stream_read_uint32(data_in, rdpdr->clientID);
+
+       DEBUG_SVC("version %d.%d clientID %d", rdpdr->versionMajor, rdpdr->versionMinor, rdpdr->clientID);
+}
+
+static void rdpdr_send_client_announce_reply(rdpdrPlugin* rdpdr)
+{
+       STREAM* data_out;
+
+       data_out = stream_new(12);
+
+       stream_write_uint16(data_out, RDPDR_CTYP_CORE);
+       stream_write_uint16(data_out, PAKID_CORE_CLIENTID_CONFIRM);
+
+       stream_write_uint16(data_out, rdpdr->versionMajor);
+       stream_write_uint16(data_out, rdpdr->versionMinor);
+       stream_write_uint32(data_out, rdpdr->clientID);
+
+       svc_plugin_send((rdpSvcPlugin*) rdpdr, data_out);
+}
+
+static void rdpdr_send_client_name_request(rdpdrPlugin* rdpdr)
+{
+       char* s;
+       STREAM* data_out;
+       UNICONV* uniconv;
+       size_t computerNameLenW;
+
+       uniconv = freerdp_uniconv_new();
+
+       if (!rdpdr->computerName[0])
+               gethostname(rdpdr->computerName, sizeof(rdpdr->computerName) - 1);
+
+       s = freerdp_uniconv_out(uniconv, rdpdr->computerName, &computerNameLenW);
+       data_out = stream_new(16 + computerNameLenW + 2);
+
+       stream_write_uint16(data_out, RDPDR_CTYP_CORE);
+       stream_write_uint16(data_out, PAKID_CORE_CLIENT_NAME);
+
+       stream_write_uint32(data_out, 1); /* unicodeFlag, 0 for ASCII and 1 for Unicode */
+       stream_write_uint32(data_out, 0); /* codePage, must be set to zero */
+       stream_write_uint32(data_out, computerNameLenW + 2); /* computerNameLen, including null terminator */
+       stream_write(data_out, s, computerNameLenW);
+       stream_write_uint16(data_out, 0); /* null terminator */
+
+       xfree(s);
+       freerdp_uniconv_free(uniconv);
+
+       svc_plugin_send((rdpSvcPlugin*) rdpdr, data_out);
+}
+
+static void rdpdr_process_server_clientid_confirm(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       uint16 versionMajor;
+       uint16 versionMinor;
+       uint32 clientID;
+
+       stream_read_uint16(data_in, versionMajor);
+       stream_read_uint16(data_in, versionMinor);
+       stream_read_uint32(data_in, clientID);
+
+       if (versionMajor != rdpdr->versionMajor || versionMinor != rdpdr->versionMinor)
+       {
+               DEBUG_WARN("unmatched version %d.%d", versionMajor, versionMinor);
+               rdpdr->versionMajor = versionMajor;
+               rdpdr->versionMinor = versionMinor;
+       }
+
+       if (clientID != rdpdr->clientID)
+       {
+               DEBUG_WARN("unmatched clientID %d", clientID);
+               rdpdr->clientID = clientID;
+       }
+}
+
+static void rdpdr_send_device_list_announce_request(rdpdrPlugin* rdpdr, boolean user_loggedon)
+{
+       int i;
+       int pos;
+       uint8 c;
+       uint32 count;
+       int data_len;
+       int count_pos;
+       STREAM* data_out;
+       DEVICE* device;
+       LIST_ITEM* item;
+
+       data_out = stream_new(256);
+
+       stream_write_uint16(data_out, RDPDR_CTYP_CORE);
+       stream_write_uint16(data_out, PAKID_CORE_DEVICELIST_ANNOUNCE);
+
+       count_pos = stream_get_pos(data_out);
+       count = 0;
+       stream_seek_uint32(data_out); /* deviceCount */
+
+       for (item = rdpdr->devman->devices->head; item; item = item->next)
+       {
+               device = (DEVICE*) item->data;
+
+               /**
+                * 1. versionMinor 0x0005 doesn't send PAKID_CORE_USER_LOGGEDON
+                *    so all devices should be sent regardless of user_loggedon
+                * 2. smartcard devices should be always sent
+                * 3. other devices are sent only after user_loggedon
+                */
+               if (rdpdr->versionMinor == 0x0005 ||
+                       device->type == RDPDR_DTYP_SMARTCARD ||
+                       user_loggedon)
+               {
+                       data_len = (device->data == NULL ? 0 : stream_get_length(device->data));
+                       stream_check_size(data_out, 20 + data_len);
+
+                       stream_write_uint32(data_out, device->type); /* deviceType */
+                       stream_write_uint32(data_out, device->id); /* deviceID */
+                       strncpy((char*) stream_get_tail(data_out), device->name, 8);
+
+                       for (i = 0; i < 8; i++)
+                       {
+                               stream_peek_uint8(data_out, c);
+
+                               if (c > 0x7F)
+                                       stream_write_uint8(data_out, '_');
+                               else
+                                       stream_seek_uint8(data_out);
+                       }
+
+                       stream_write_uint32(data_out, data_len);
+
+                       if (data_len > 0)
+                               stream_write(data_out, stream_get_data(device->data), data_len);
+
+                       count++;
+
+                       printf("registered device #%d: %s (type=%d id=%d)\n",
+                               count, device->name, device->type, device->id);
+               }
+       }
+
+       pos = stream_get_pos(data_out);
+       stream_set_pos(data_out, count_pos);
+       stream_write_uint32(data_out, count);
+       stream_set_pos(data_out, pos);
+       stream_seal(data_out);
+
+       svc_plugin_send((rdpSvcPlugin*) rdpdr, data_out);
+}
+
+static boolean rdpdr_process_irp(rdpdrPlugin* rdpdr, STREAM* data_in)
+{
+       IRP* irp;
+
+       irp = irp_new(rdpdr->devman, data_in);
+
+       if (irp == NULL)
+               return false;
+
+       IFCALL(irp->device->IRPRequest, irp->device, irp);
+
+       return true;
+}
+
+static void rdpdr_process_receive(rdpSvcPlugin* plugin, STREAM* data_in)
+{
+       rdpdrPlugin* rdpdr = (rdpdrPlugin*) plugin;
+       uint16 component;
+       uint16 packetID;
+       uint32 deviceID;
+       uint32 status;
+
+       stream_read_uint16(data_in, component);
+       stream_read_uint16(data_in, packetID);
+
+       if (component == RDPDR_CTYP_CORE)
+       {
+               switch (packetID)
+               {
+                       case PAKID_CORE_SERVER_ANNOUNCE:
+                               DEBUG_SVC("RDPDR_CTYP_CORE / PAKID_CORE_SERVER_ANNOUNCE");
+                               rdpdr_process_server_announce_request(rdpdr, data_in);
+                               rdpdr_send_client_announce_reply(rdpdr);
+                               rdpdr_send_client_name_request(rdpdr);
+                               break;
+
+                       case PAKID_CORE_SERVER_CAPABILITY:
+                               DEBUG_SVC("RDPDR_CTYP_CORE / PAKID_CORE_SERVER_CAPABILITY");
+                               rdpdr_process_capability_request(rdpdr, data_in);
+                               rdpdr_send_capability_response(rdpdr);
+                               break;
+
+                       case PAKID_CORE_CLIENTID_CONFIRM:
+                               DEBUG_SVC("RDPDR_CTYP_CORE / PAKID_CORE_CLIENTID_CONFIRM");
+                               rdpdr_process_server_clientid_confirm(rdpdr, data_in);
+                               rdpdr_send_device_list_announce_request(rdpdr, false);
+                               break;
+
+                       case PAKID_CORE_USER_LOGGEDON:
+                               DEBUG_SVC("RDPDR_CTYP_CORE / PAKID_CORE_USER_LOGGEDON");
+                               rdpdr_send_device_list_announce_request(rdpdr, true);
+                               break;
+
+                       case PAKID_CORE_DEVICE_REPLY:
+                               /* connect to a specific resource */
+                               stream_read_uint32(data_in, deviceID);
+                               stream_read_uint32(data_in, status);
+                               DEBUG_SVC("RDPDR_CTYP_CORE / PAKID_CORE_DEVICE_REPLY (deviceID=%d status=0x%08X)", deviceID, status);
+                               break;
+
+                       case PAKID_CORE_DEVICE_IOREQUEST:
+                               DEBUG_SVC("RDPDR_CTYP_CORE / PAKID_CORE_DEVICE_IOREQUEST");
+                               if (rdpdr_process_irp(rdpdr, data_in))
+                                       data_in = NULL;
+                               break;
+
+                       default:
+                               DEBUG_WARN("RDPDR_CTYP_CORE / unknown packetID: 0x%02X", packetID);
+                               break;
+
+               }
+       }
+       else if (component == RDPDR_CTYP_PRN)
+       {
+               DEBUG_SVC("RDPDR_CTYP_PRN");
+       }
+       else
+       {
+               DEBUG_WARN("RDPDR component: 0x%02X packetID: 0x%02X\n", component, packetID);
+       }
+
+       stream_free(data_in);
+}
+
+static void rdpdr_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       freerdp_event_free(event);
+}
+
+static void rdpdr_process_terminate(rdpSvcPlugin* plugin)
+{
+       rdpdrPlugin* rdpdr = (rdpdrPlugin*) plugin;
+
+       devman_free(rdpdr->devman);
+       xfree(plugin);
+}
+
+DEFINE_SVC_PLUGIN(rdpdr, "rdpdr",
+       CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP |
+       CHANNEL_OPTION_COMPRESS_RDP)
diff --git a/channels/rdpdr/rdpdr_main.h b/channels/rdpdr/rdpdr_main.h
new file mode 100644 (file)
index 0000000..af867fb
--- /dev/null
@@ -0,0 +1,41 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDPDR_MAIN_H
+#define __RDPDR_MAIN_H
+
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_types.h"
+
+typedef struct rdpdr_plugin rdpdrPlugin;
+struct rdpdr_plugin
+{
+       rdpSvcPlugin plugin;
+
+       DEVMAN* devman;
+
+       uint16 versionMajor;
+       uint16 versionMinor;
+       uint16 clientID;
+       char computerName[256];
+};
+
+#endif /* __RDPDR_MAIN_H */
diff --git a/channels/rdpdr/rdpdr_types.h b/channels/rdpdr/rdpdr_types.h
new file mode 100644 (file)
index 0000000..a87dad2
--- /dev/null
@@ -0,0 +1,90 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * File System Virtual Channel
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDPDR_TYPES_H
+#define __RDPDR_TYPES_H
+
+#include "config.h"
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/svc_plugin.h>
+
+typedef struct _DEVICE DEVICE;
+typedef struct _IRP IRP;
+typedef struct _DEVMAN DEVMAN;
+
+
+typedef void (*pcIRPRequest)(DEVICE* device, IRP* irp);
+typedef void (*pcFreeDevice)(DEVICE* device);
+
+struct _DEVICE
+{
+       uint32 id;
+
+       uint32 type;
+       char* name;
+       STREAM* data;
+
+       pcIRPRequest IRPRequest;
+       pcFreeDevice Free;
+};
+
+typedef void (*pcIRPResponse)(IRP* irp);
+
+struct _IRP
+{
+       DEVICE* device;
+       DEVMAN* devman;
+       uint32 FileId;
+       uint32 CompletionId;
+       uint32 MajorFunction;
+       uint32 MinorFunction;
+       STREAM* input;
+
+       uint32 IoStatus;
+       STREAM* output;
+
+       pcIRPResponse Complete;
+       pcIRPResponse Discard;
+};
+
+struct _DEVMAN
+{
+       rdpSvcPlugin* plugin;
+       uint32 id_sequence; /* generate unique device id */
+       LIST* devices;
+};
+
+typedef void (*pcRegisterDevice)(DEVMAN* devman, DEVICE* device);
+
+struct _DEVICE_SERVICE_ENTRY_POINTS
+{
+       DEVMAN* devman;
+
+       pcRegisterDevice RegisterDevice;
+       pcRegisterDevice UnregisterDevice;
+       RDP_PLUGIN_DATA* plugin_data;
+};
+typedef struct _DEVICE_SERVICE_ENTRY_POINTS DEVICE_SERVICE_ENTRY_POINTS;
+typedef DEVICE_SERVICE_ENTRY_POINTS* PDEVICE_SERVICE_ENTRY_POINTS;
+
+typedef int (*PDEVICE_SERVICE_ENTRY)(PDEVICE_SERVICE_ENTRY_POINTS);
+
+#endif /* __RDPDR_TYPES_H */
diff --git a/channels/rdpdr/serial/CMakeLists.txt b/channels/rdpdr/serial/CMakeLists.txt
new file mode 100644 (file)
index 0000000..40c962a
--- /dev/null
@@ -0,0 +1,34 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(serial_SRCS
+       serial_tty.c
+       serial_tty.h
+       serial_constants.h
+       serial_main.c
+)
+
+include_directories(..)
+
+add_library(serial ${serial_SRCS})
+set_target_properties(serial PROPERTIES PREFIX "")
+
+target_link_libraries(serial freerdp-utils)
+
+install(TARGETS serial DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpdr/serial/serial_constants.h b/channels/rdpdr/serial/serial_constants.h
new file mode 100644 (file)
index 0000000..ac16f9a
--- /dev/null
@@ -0,0 +1,154 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Serial Port Device Service Virtual Channel
+ *
+ * Copyright 2011 O.S. Systems Software Ltda.
+ * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SERIAL_CONSTANTS_H
+#define __SERIAL_CONSTANTS_H
+
+/* http://www.codeproject.com/KB/system/chaiyasit_t.aspx */
+#define SERIAL_TIMEOUT_MAX 4294967295u
+
+/* DR_CONTROL_REQ.IoControlCode */
+enum DR_PORT_CONTROL_REQ
+{
+       IOCTL_SERIAL_SET_BAUD_RATE = 0x001B0004,
+       IOCTL_SERIAL_GET_BAUD_RATE = 0x001B0050,
+       IOCTL_SERIAL_SET_LINE_CONTROL = 0x001B000C,
+       IOCTL_SERIAL_GET_LINE_CONTROL = 0x001B0054,
+       IOCTL_SERIAL_SET_TIMEOUTS = 0x001B001C,
+       IOCTL_SERIAL_GET_TIMEOUTS = 0x001B0020,
+
+/* GET_CHARS and SET_CHARS are swapped in the RDP docs [MS-RDPESP] */
+       IOCTL_SERIAL_GET_CHARS = 0x001B0058,
+       IOCTL_SERIAL_SET_CHARS = 0x001B005C,
+
+       IOCTL_SERIAL_SET_DTR = 0x001B0024,
+       IOCTL_SERIAL_CLR_DTR = 0x001B0028,
+       IOCTL_SERIAL_RESET_DEVICE = 0x001B002C,
+       IOCTL_SERIAL_SET_RTS = 0x001B0030,
+       IOCTL_SERIAL_CLR_RTS = 0x001B0034,
+       IOCTL_SERIAL_SET_XOFF = 0x001B0038,
+       IOCTL_SERIAL_SET_XON = 0x001B003C,
+       IOCTL_SERIAL_SET_BREAK_ON = 0x001B0010,
+       IOCTL_SERIAL_SET_BREAK_OFF = 0x001B0014,
+       IOCTL_SERIAL_SET_QUEUE_SIZE = 0x001B0008,
+       IOCTL_SERIAL_GET_WAIT_MASK = 0x001B0040,
+       IOCTL_SERIAL_SET_WAIT_MASK = 0x001B0044,
+       IOCTL_SERIAL_WAIT_ON_MASK = 0x001B0048,
+       IOCTL_SERIAL_IMMEDIATE_CHAR = 0x001B0018,
+       IOCTL_SERIAL_PURGE = 0x001B004C,
+       IOCTL_SERIAL_GET_HANDFLOW = 0x001B0060,
+       IOCTL_SERIAL_SET_HANDFLOW = 0x001B0064,
+       IOCTL_SERIAL_GET_MODEMSTATUS = 0x001B0068,
+       IOCTL_SERIAL_GET_DTRRTS = 0x001B0078,
+
+/* according to [MS-RDPESP] it should be 0x001B0084, but servers send 0x001B006C */
+       IOCTL_SERIAL_GET_COMMSTATUS = 0x001B006C,
+
+       IOCTL_SERIAL_GET_PROPERTIES = 0x001B0074,
+       IOCTL_SERIAL_XOFF_COUNTER = 0x001B0070,
+       IOCTL_SERIAL_LSRMST_INSERT = 0x001B007C,
+       IOCTL_SERIAL_CONFIG_SIZE = 0x001B0080,
+       IOCTL_SERIAL_GET_STATS = 0x001B008C,
+       IOCTL_SERIAL_CLEAR_STATS = 0x001B0090,
+       IOCTL_SERIAL_GET_MODEM_CONTROL = 0x001B0094,
+       IOCTL_SERIAL_SET_MODEM_CONTROL = 0x001B0098,
+       IOCTL_SERIAL_SET_FIFO_CONTROL = 0x001B009C,
+};
+
+enum SERIAL_PURGE_MASK
+{
+       SERIAL_PURGE_TXABORT = 0x00000001,
+       SERIAL_PURGE_RXABORT = 0x00000002,
+       SERIAL_PURGE_TXCLEAR = 0x00000004,
+       SERIAL_PURGE_RXCLEAR = 0x00000008,
+};
+
+enum SERIAL_WAIT_MASK
+{
+       SERIAL_EV_RXCHAR = 0x0001,      /* Any Character received */
+       SERIAL_EV_RXFLAG = 0x0002,      /* Received certain character */
+       SERIAL_EV_TXEMPTY = 0x0004,     /* Transmitt Queue Empty */
+       SERIAL_EV_CTS = 0x0008,         /* CTS changed state */
+       SERIAL_EV_DSR = 0x0010,         /* DSR changed state */
+       SERIAL_EV_RLSD = 0x0020,        /* RLSD changed state */
+       SERIAL_EV_BREAK = 0x0040,       /* BREAK received */
+       SERIAL_EV_ERR = 0x0080,         /* Line status error occurred */
+       SERIAL_EV_RING = 0x0100,        /* Ring signal detected */
+       SERIAL_EV_PERR = 0x0200,        /* Printer error occured */
+       SERIAL_EV_RX80FULL = 0x0400,/* Receive buffer is 80 percent full */
+       SERIAL_EV_EVENT1 = 0x0800,      /* Provider specific event 1 */
+       SERIAL_EV_EVENT2 = 0x1000,      /* Provider specific event 2 */
+};
+
+enum SERIAL_MODEM_STATUS
+{
+       SERIAL_MS_DTR = 0x01,
+       SERIAL_MS_RTS = 0x02,
+       SERIAL_MS_CTS = 0x10,
+       SERIAL_MS_DSR = 0x20,
+       SERIAL_MS_RNG = 0x40,
+       SERIAL_MS_CAR = 0x80,
+};
+
+enum SERIAL_HANDFLOW
+{
+       SERIAL_DTR_CONTROL = 0x01,
+       SERIAL_CTS_HANDSHAKE = 0x08,
+       SERIAL_ERROR_ABORT = 0x80000000,
+};
+
+enum SERIAL_FLOW_CONTROL
+{
+       SERIAL_XON_HANDSHAKE = 0x01,
+       SERIAL_XOFF_HANDSHAKE = 0x02,
+       SERIAL_DSR_SENSITIVITY = 0x40,
+};
+
+enum SERIAL_CHARS
+{
+       SERIAL_CHAR_EOF = 0,
+       SERIAL_CHAR_ERROR = 1,
+       SERIAL_CHAR_BREAK = 2,
+       SERIAL_CHAR_EVENT = 3,
+       SERIAL_CHAR_XON = 4,
+       SERIAL_CHAR_XOFF = 5,
+};
+
+enum SERIAL_ABORT_IO
+{
+       SERIAL_ABORT_IO_NONE = 0,
+       SERIAL_ABORT_IO_WRITE = 1,
+       SERIAL_ABORT_IO_READ = 2,
+};
+
+enum SERIAL_STOP_BITS
+{
+       SERIAL_STOP_BITS_1 = 0,
+       SERIAL_STOP_BITS_2 = 2,
+};
+
+enum SERIAL_PARITY
+{
+       SERIAL_NO_PARITY = 0,
+       SERIAL_ODD_PARITY = 1,
+       SERIAL_EVEN_PARITY = 2,
+};
+
+#endif
diff --git a/channels/rdpdr/serial/serial_main.c b/channels/rdpdr/serial/serial_main.c
new file mode 100644 (file)
index 0000000..3bee5ab
--- /dev/null
@@ -0,0 +1,714 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Serial Port Device Service Virtual Channel
+ *
+ * Copyright 2011 O.S. Systems Software Ltda.
+ * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "config.h"
+
+#ifdef HAVE_SYS_MODEM_H
+#include <sys/modem.h>
+#endif
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+#ifdef HAVE_SYS_STRTIO_H
+#include <sys/strtio.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "rdpdr_types.h"
+#include "rdpdr_constants.h"
+#include "devman.h"
+#include "serial_tty.h"
+#include "serial_constants.h"
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/wait_obj.h>
+
+typedef struct _SERIAL_DEVICE SERIAL_DEVICE;
+struct _SERIAL_DEVICE
+{
+       DEVICE device;
+
+       char* path;
+       SERIAL_TTY* tty;
+
+       LIST* irp_list;
+       LIST* pending_irps;
+       freerdp_thread* thread;
+       struct wait_obj* in_event;
+
+       fd_set read_fds;
+       fd_set write_fds;
+       uint32 nfds;
+       struct timeval tv;
+       uint32 select_timeout;
+       uint32 timeout_id;
+};
+
+static void serial_abort_single_io(SERIAL_DEVICE* serial, uint32 file_id, uint32 abort_io, uint32 io_status);
+static void serial_check_for_events(SERIAL_DEVICE* serial);
+static void serial_handle_async_irp(SERIAL_DEVICE* serial, IRP* irp);
+static boolean serial_check_fds(SERIAL_DEVICE* serial);
+
+static void serial_process_irp_create(SERIAL_DEVICE* serial, IRP* irp)
+{
+       SERIAL_TTY* tty;
+       uint32 PathLength;
+       uint32 FileId;
+       char* path;
+       UNICONV* uniconv;
+
+       stream_seek(irp->input, 28); /* DesiredAccess(4) AllocationSize(8), FileAttributes(4) */
+                                                                /* SharedAccess(4) CreateDisposition(4), CreateOptions(4) */
+       stream_read_uint32(irp->input, PathLength);
+
+       uniconv = freerdp_uniconv_new();
+       path = freerdp_uniconv_in(uniconv, stream_get_tail(irp->input), PathLength);
+       freerdp_uniconv_free(uniconv);
+
+       FileId = irp->devman->id_sequence++;
+
+       tty = serial_tty_new(serial->path, FileId);
+       if (tty == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               FileId = 0;
+
+               DEBUG_WARN("failed to create %s", path);
+       }
+       else
+       {
+               serial->tty = tty;
+               DEBUG_SVC("%s(%d) created.", serial->path, FileId);
+       }
+
+       stream_write_uint32(irp->output, FileId);
+       stream_write_uint8(irp->output, 0);
+
+       xfree(path);
+
+       irp->Complete(irp);
+}
+
+static void serial_process_irp_close(SERIAL_DEVICE* serial, IRP* irp)
+{
+       SERIAL_TTY* tty;
+
+       tty = serial->tty;
+       if (tty == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               DEBUG_WARN("tty not valid.");
+       }
+       else
+       {
+               DEBUG_SVC("%s(%d) closed.", serial->path, tty->id);
+
+               serial_tty_free(tty);
+               serial->tty = NULL;
+       }
+
+       stream_write_zero(irp->output, 5); /* Padding(5) */
+
+       irp->Complete(irp);
+}
+
+static void serial_process_irp_read(SERIAL_DEVICE* serial, IRP* irp)
+{
+       SERIAL_TTY* tty;
+       uint32 Length;
+       uint64 Offset;
+       uint8* buffer = NULL;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+
+       DEBUG_SVC("length %u offset %llu", Length, Offset);
+
+       tty = serial->tty;
+       if (tty == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("tty not valid.");
+       }
+       else
+       {
+               buffer = (uint8*)xmalloc(Length);
+               if (!serial_tty_read(tty, buffer, &Length))
+               {
+                       irp->IoStatus = STATUS_UNSUCCESSFUL;
+                       xfree(buffer);
+                       buffer = NULL;
+                       Length = 0;
+
+                       DEBUG_WARN("read %s(%d) failed.", serial->path, tty->id);
+               }
+               else
+               {
+                       DEBUG_SVC("read %llu-%llu from %d", Offset, Offset + Length, tty->id);
+               }
+       }
+
+       stream_write_uint32(irp->output, Length);
+       if (Length > 0)
+       {
+               stream_check_size(irp->output, Length);
+               stream_write(irp->output, buffer, Length);
+       }
+       xfree(buffer);
+
+       irp->Complete(irp);
+}
+
+static void serial_process_irp_write(SERIAL_DEVICE* serial, IRP* irp)
+{
+       SERIAL_TTY* tty;
+       uint32 Length;
+       uint64 Offset;
+
+       stream_read_uint32(irp->input, Length);
+       stream_read_uint64(irp->input, Offset);
+       stream_seek(irp->input, 20); /* Padding */
+
+       DEBUG_SVC("length %u offset %llu", Length, Offset);
+
+       tty = serial->tty;
+       if (tty == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("tty not valid.");
+       }
+       else if (!serial_tty_write(tty, stream_get_tail(irp->input), Length))
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               Length = 0;
+
+               DEBUG_WARN("write %s(%d) failed.", serial->path, tty->id);
+       }
+       else
+       {
+               DEBUG_SVC("write %llu-%llu to %s(%d).", Offset, Offset + Length, serial->path, tty->id);
+       }
+
+       stream_write_uint32(irp->output, Length);
+       stream_write_uint8(irp->output, 0); /* Padding */
+
+       irp->Complete(irp);
+}
+
+static void serial_process_irp_device_control(SERIAL_DEVICE* serial, IRP* irp)
+{
+       SERIAL_TTY* tty;
+       uint32 IoControlCode;
+       uint32 InputBufferLength;
+       uint32 OutputBufferLength;
+       uint32 abort_io = SERIAL_ABORT_IO_NONE;
+
+       DEBUG_SVC("[in] pending size %d", list_size(serial->pending_irps));
+
+       stream_read_uint32(irp->input, InputBufferLength);
+       stream_read_uint32(irp->input, OutputBufferLength);
+       stream_read_uint32(irp->input, IoControlCode);
+       stream_seek(irp->input, 20); /* Padding */
+
+       tty = serial->tty;
+       if (tty == NULL)
+       {
+               irp->IoStatus = STATUS_UNSUCCESSFUL;
+               OutputBufferLength = 0;
+
+               DEBUG_WARN("tty not valid.");
+       }
+       else
+       {
+               irp->IoStatus = serial_tty_control(tty, IoControlCode, irp->input, irp->output, &abort_io);
+       }
+
+       if (abort_io & SERIAL_ABORT_IO_WRITE)
+               serial_abort_single_io(serial, tty->id, SERIAL_ABORT_IO_WRITE, STATUS_CANCELLED);
+       if (abort_io & SERIAL_ABORT_IO_READ)
+               serial_abort_single_io(serial, tty->id, SERIAL_ABORT_IO_READ, STATUS_CANCELLED);
+
+       if (irp->IoStatus == STATUS_PENDING)
+               list_enqueue(serial->pending_irps, irp);
+       else
+               irp->Complete(irp);
+}
+
+static void serial_process_irp(SERIAL_DEVICE* serial, IRP* irp)
+{
+       DEBUG_SVC("MajorFunction %u", irp->MajorFunction);
+
+       switch (irp->MajorFunction)
+       {
+               case IRP_MJ_CREATE:
+                       serial_process_irp_create(serial, irp);
+                       break;
+
+               case IRP_MJ_CLOSE:
+                       serial_process_irp_close(serial, irp);
+                       break;
+
+               case IRP_MJ_READ:
+                       serial_handle_async_irp(serial, irp);
+                       //serial_process_irp_read(serial, irp);
+                       break;
+
+               case IRP_MJ_WRITE:
+                       serial_handle_async_irp(serial, irp);
+                       //serial_process_irp_write(serial, irp);
+                       break;
+
+               case IRP_MJ_DEVICE_CONTROL:
+                       serial_process_irp_device_control(serial, irp);
+                       break;
+
+               default:
+                       DEBUG_WARN("MajorFunction 0x%X not supported", irp->MajorFunction);
+                       irp->IoStatus = STATUS_NOT_SUPPORTED;
+                       irp->Complete(irp);
+                       break;
+       }
+
+       serial_check_for_events(serial);
+}
+
+static void serial_process_irp_list(SERIAL_DEVICE* serial)
+{
+       IRP* irp;
+
+       while (1)
+       {
+               if (freerdp_thread_is_stopped(serial->thread))
+                       break;
+
+               freerdp_thread_lock(serial->thread);
+               irp = (IRP*)list_dequeue(serial->irp_list);
+               freerdp_thread_unlock(serial->thread);
+
+               if (irp == NULL)
+                       break;
+
+               serial_process_irp(serial, irp);
+       }
+}
+
+static void* serial_thread_func(void* arg)
+{
+       SERIAL_DEVICE* serial = (SERIAL_DEVICE*)arg;
+
+       while (1)
+       {
+               freerdp_thread_wait(serial->thread);
+
+               serial->nfds = 1;
+               FD_ZERO(&serial->read_fds);
+               FD_ZERO(&serial->write_fds);
+
+               serial->tv.tv_sec = 20;
+               serial->tv.tv_usec = 0;
+               serial->select_timeout = 0;
+
+               if (freerdp_thread_is_stopped(serial->thread))
+                       break;
+
+               freerdp_thread_reset(serial->thread);
+               serial_process_irp_list(serial);
+
+               if (wait_obj_is_set(serial->in_event))
+               {
+                       if (serial_check_fds(serial))
+                               wait_obj_clear(serial->in_event);
+               }
+       }
+
+       freerdp_thread_quit(serial->thread);
+
+       return NULL;
+}
+
+static void serial_irp_request(DEVICE* device, IRP* irp)
+{
+       SERIAL_DEVICE* serial = (SERIAL_DEVICE*)device;
+
+       freerdp_thread_lock(serial->thread);
+       list_enqueue(serial->irp_list, irp);
+       freerdp_thread_unlock(serial->thread);
+
+       freerdp_thread_signal(serial->thread);
+}
+
+static void serial_free(DEVICE* device)
+{
+       SERIAL_DEVICE* serial = (SERIAL_DEVICE*)device;
+       IRP* irp;
+
+       DEBUG_SVC("freeing device");
+
+       freerdp_thread_stop(serial->thread);
+       freerdp_thread_free(serial->thread);
+
+       while ((irp = (IRP*)list_dequeue(serial->irp_list)) != NULL)
+               irp->Discard(irp);
+       list_free(serial->irp_list);
+
+       while ((irp = (IRP*)list_dequeue(serial->pending_irps)) != NULL)
+               irp->Discard(irp);
+       list_free(serial->pending_irps);
+
+       xfree(serial);
+}
+
+int DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
+{
+       SERIAL_DEVICE* serial;
+       char* name;
+       char* path;
+       int i, len;
+
+       name = (char*)pEntryPoints->plugin_data->data[1];
+       path = (char*)pEntryPoints->plugin_data->data[2];
+
+       if (name[0] && path[0])
+       {
+               serial = xnew(SERIAL_DEVICE);
+
+               serial->device.type = RDPDR_DTYP_SERIAL;
+               serial->device.name = name;
+               serial->device.IRPRequest = serial_irp_request;
+               serial->device.Free = serial_free;
+
+               len = strlen(name);
+               serial->device.data = stream_new(len + 1);
+               for (i = 0; i <= len; i++)
+                       stream_write_uint8(serial->device.data, name[i] < 0 ? '_' : name[i]);
+
+               serial->path = path;
+               serial->irp_list = list_new();
+               serial->pending_irps = list_new();
+               serial->thread = freerdp_thread_new();
+               serial->in_event = wait_obj_new();
+
+               pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*)serial);
+
+               freerdp_thread_start(serial->thread, serial_thread_func, serial);
+       }
+
+       return 0;
+}
+
+static void serial_abort_single_io(SERIAL_DEVICE* serial, uint32 file_id, uint32 abort_io, uint32 io_status)
+{
+       IRP* irp = NULL;
+       uint32 major;
+       SERIAL_TTY* tty;
+
+       DEBUG_SVC("[in] pending size %d", list_size(serial->pending_irps));
+
+       tty = serial->tty;
+
+       switch (abort_io)
+       {
+               case SERIAL_ABORT_IO_NONE:
+                       major = 0;
+                       break;
+
+               case SERIAL_ABORT_IO_READ:
+                       major = IRP_MJ_READ;
+                       break;
+
+               case SERIAL_ABORT_IO_WRITE:
+                       major = IRP_MJ_WRITE;
+                       break;
+
+               default:
+                       DEBUG_SVC("unexpected abort_io code %d", abort_io);
+                       return;
+       }
+
+       irp = (IRP*)list_peek(serial->pending_irps);
+       while (irp)
+       {
+               if (irp->FileId != file_id || irp->MajorFunction != major)
+               {
+                       irp = (IRP*)list_next(serial->pending_irps, irp);
+                       continue;
+               }
+
+               /* Process a SINGLE FileId and MajorFunction */
+               list_remove(serial->pending_irps, irp);
+               irp->IoStatus = io_status;
+               stream_write_uint32(irp->output, 0);
+               irp->Complete(irp);
+
+               wait_obj_set(serial->in_event);
+               break;
+       }
+
+       DEBUG_SVC("[out] pending size %d", list_size(serial->pending_irps));
+}
+
+static void serial_check_for_events(SERIAL_DEVICE* serial)
+{
+       IRP* irp = NULL;
+       IRP* prev;
+       uint32 result = 0;
+       SERIAL_TTY* tty;
+
+       tty = serial->tty;
+
+       DEBUG_SVC("[in] pending size %d", list_size(serial->pending_irps));
+
+       irp = (IRP*)list_peek(serial->pending_irps);
+       while (irp)
+       {
+               prev = NULL;
+
+               if (irp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
+               {
+                       if (serial_tty_get_event(tty, &result))
+                       {
+                               DEBUG_SVC("got event result %u", result);
+
+                               irp->IoStatus = STATUS_SUCCESS;
+                               stream_write_uint32(irp->output, result);
+                               irp->Complete(irp);
+
+                               prev = irp;
+                               irp = (IRP*)list_next(serial->pending_irps, irp);
+                               list_remove(serial->pending_irps, prev);
+
+                               wait_obj_set(serial->in_event);
+                       }
+               }
+
+               if (!prev)
+                       irp = (IRP*)list_next(serial->pending_irps, irp);
+       }
+
+       DEBUG_SVC("[out] pending size %d", list_size(serial->pending_irps));
+}
+
+void serial_get_timeouts(SERIAL_DEVICE* serial, IRP* irp, uint32* timeout, uint32* interval_timeout)
+{
+       SERIAL_TTY* tty;
+       uint32 Length;
+       uint32 pos;
+
+       pos = stream_get_pos(irp->input);
+       stream_read_uint32(irp->input, Length);
+       stream_set_pos(irp->input, pos);
+
+       DEBUG_SVC("length read %u", Length);
+
+       tty = serial->tty;
+       *timeout = (tty->read_total_timeout_multiplier * Length) +
+               tty->read_total_timeout_constant;
+       *interval_timeout = tty->read_interval_timeout;
+
+       DEBUG_SVC("timeouts %u %u", *timeout, *interval_timeout);
+}
+
+static void serial_handle_async_irp(SERIAL_DEVICE* serial, IRP* irp)
+{
+       uint32 timeout = 0;
+       uint32 itv_timeout = 0;
+       SERIAL_TTY* tty;
+
+       tty = serial->tty;
+
+       switch (irp->MajorFunction)
+       {
+       case IRP_MJ_WRITE:
+               DEBUG_SVC("handling IRP_MJ_WRITE");
+               break;
+
+       case IRP_MJ_READ:
+               DEBUG_SVC("handling IRP_MJ_READ");
+
+               serial_get_timeouts(serial, irp, &timeout, &itv_timeout);
+
+               /* Check if io request timeout is smaller than current (but not 0). */
+               if (timeout && (serial->select_timeout == 0 || timeout < serial->select_timeout))
+               {
+                       serial->select_timeout = timeout;
+                       serial->tv.tv_sec = serial->select_timeout / 1000;
+                       serial->tv.tv_usec = (serial->select_timeout % 1000) * 1000;
+                       serial->timeout_id = tty->id;
+               }
+               if (itv_timeout && (serial->select_timeout == 0 || itv_timeout < serial->select_timeout))
+               {
+                       serial->select_timeout = itv_timeout;
+                       serial->tv.tv_sec = serial->select_timeout / 1000;
+                       serial->tv.tv_usec = (serial->select_timeout % 1000) * 1000;
+                       serial->timeout_id = tty->id;
+               }
+               DEBUG_SVC("select_timeout %u, tv_sec %lu tv_usec %lu, timeout_id %u",
+                       serial->select_timeout, serial->tv.tv_sec, serial->tv.tv_usec, serial->timeout_id);
+               break;
+
+       default:
+               DEBUG_SVC("no need to handle %d", irp->MajorFunction);
+               return;
+       }
+
+       irp->IoStatus = STATUS_PENDING;
+       list_enqueue(serial->pending_irps, irp);
+       wait_obj_set(serial->in_event);
+}
+
+static void __serial_check_fds(SERIAL_DEVICE* serial)
+{
+       IRP* irp;
+       IRP* prev;
+       SERIAL_TTY* tty;
+       uint32 result = 0;
+
+       memset(&serial->tv, 0, sizeof(struct timeval));
+       tty = serial->tty;
+
+       /* scan every pending */
+       irp = list_peek(serial->pending_irps);
+       while (irp)
+       {
+               DEBUG_SVC("MajorFunction %u", irp->MajorFunction);
+
+               switch (irp->MajorFunction)
+               {
+                       case IRP_MJ_READ:
+                               if (FD_ISSET(tty->fd, &serial->read_fds))
+                               {
+                                       irp->IoStatus = STATUS_SUCCESS;
+                                       serial_process_irp_read(serial, irp);
+                               }
+                               break;
+
+                       case IRP_MJ_WRITE:
+                               if (FD_ISSET(tty->fd, &serial->write_fds))
+                               {
+                                       irp->IoStatus = STATUS_SUCCESS;
+                                       serial_process_irp_write(serial, irp);
+                               }
+                               break;
+
+                       case IRP_MJ_DEVICE_CONTROL:
+                               if (serial_tty_get_event(tty, &result))
+                               {
+                                       DEBUG_SVC("got event result %u", result);
+
+                                       irp->IoStatus = STATUS_SUCCESS;
+                                       stream_write_uint32(irp->output, result);
+                                       irp->Complete(irp);
+                               }
+                               break;
+
+                       default:
+                               DEBUG_SVC("no request found");
+                               break;
+               }
+
+               prev = irp;
+               irp = (IRP*)list_next(serial->pending_irps, irp);
+               if (prev->IoStatus == STATUS_SUCCESS)
+               {
+                       list_remove(serial->pending_irps, prev);
+                       wait_obj_set(serial->in_event);
+               }
+       }
+}
+
+static void serial_set_fds(SERIAL_DEVICE* serial)
+{
+       fd_set* fds;
+       IRP* irp;
+       SERIAL_TTY* tty;
+
+       DEBUG_SVC("[in] pending size %d", list_size(serial->pending_irps));
+
+       tty = serial->tty;
+       irp = (IRP*)list_peek(serial->pending_irps);
+       while (irp)
+       {
+               fds = NULL;
+
+               switch (irp->MajorFunction)
+               {
+                       case IRP_MJ_WRITE:
+                               fds = &serial->write_fds;
+                               break;
+
+                       case IRP_MJ_READ:
+                               fds = &serial->read_fds;
+                               break;
+               }
+
+               if (fds && (tty->fd >= 0))
+               {
+                       FD_SET(tty->fd, fds);
+                       serial->nfds = MAX(serial->nfds, tty->fd);
+               }
+               irp = (IRP*)list_next(serial->pending_irps, irp);
+       }
+}
+
+static boolean serial_check_fds(SERIAL_DEVICE* serial)
+{
+       if (list_size(serial->pending_irps) == 0)
+               return 1;
+
+       serial_set_fds(serial);
+       DEBUG_SVC("waiting %lu %lu", serial->tv.tv_sec, serial->tv.tv_usec);
+
+       switch (select(serial->nfds + 1, &serial->read_fds, &serial->write_fds, NULL, &serial->tv))
+       {
+               case -1:
+                       DEBUG_SVC("select has returned -1 with error: %s", strerror(errno));
+                       return 0;
+
+               case 0:
+                       if (serial->select_timeout)
+                       {
+                               serial_abort_single_io(serial, serial->timeout_id, SERIAL_ABORT_IO_NONE, STATUS_TIMEOUT);
+                               serial_abort_single_io(serial, serial->timeout_id, SERIAL_ABORT_IO_READ, STATUS_TIMEOUT);
+                               serial_abort_single_io(serial, serial->timeout_id, SERIAL_ABORT_IO_WRITE, STATUS_TIMEOUT);
+                       }
+                       DEBUG_SVC("select has timed out");
+                       return 0;
+
+               default:
+                       break;
+       }
+
+       __serial_check_fds(serial);
+
+       return 1;
+}
diff --git a/channels/rdpdr/serial/serial_tty.c b/channels/rdpdr/serial/serial_tty.c
new file mode 100644 (file)
index 0000000..a07718d
--- /dev/null
@@ -0,0 +1,980 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Serial Port Device Service Virtual Channel
+ *
+ * Copyright 2011 O.S. Systems Software Ltda.
+ * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/utils/hexdump.h>
+
+#include <unistd.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+#include "rdpdr_constants.h"
+#include "rdpdr_types.h"
+#include "serial_tty.h"
+#include "serial_constants.h"
+
+#ifdef HAVE_SYS_MODEM_H
+#include <sys/modem.h>
+#endif
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+#ifdef HAVE_SYS_STRTIO_H
+#include <sys/strtio.h>
+#endif
+
+#ifndef CRTSCTS
+#define CRTSCTS 0
+#endif
+
+/* FIONREAD should really do the same thing as TIOCINQ, where it is
+ * not available */
+#if !defined(TIOCINQ) && defined(FIONREAD)
+#define TIOCINQ FIONREAD
+#endif
+#if !defined(TIOCOUTQ) && defined(FIONWRITE)
+#define TIOCOUTQ FIONWRITE
+#endif
+
+
+static uint32 tty_write_data(SERIAL_TTY* tty, uint8* data, int len);
+static void tty_set_termios(SERIAL_TTY* tty);
+static boolean tty_get_termios(SERIAL_TTY* tty);
+static int tty_get_error_status();
+
+uint32 serial_tty_control(SERIAL_TTY* tty, uint32 IoControlCode, STREAM* input, STREAM* output, uint32* abort_io)
+{
+       int purge_mask;
+       uint32 result;
+       uint32 modemstate;
+       uint8 immediate;
+       uint32 ret = STATUS_SUCCESS;
+       uint32 length = 0;
+       uint32 pos;
+
+       DEBUG_SVC("in");
+
+       stream_seek(output, sizeof(uint32));
+
+       switch (IoControlCode)
+       {
+               case IOCTL_SERIAL_SET_BAUD_RATE:
+                       stream_read_uint32(input, tty->baud_rate);
+                       tty_set_termios(tty);
+                       DEBUG_SVC("SERIAL_SET_BAUD_RATE %d", tty->baud_rate);
+                       break;
+
+               case IOCTL_SERIAL_GET_BAUD_RATE:
+                       length = 4;
+                       stream_write_uint32(output, tty->baud_rate);
+                       DEBUG_SVC("SERIAL_GET_BAUD_RATE %d", tty->baud_rate);
+                       break;
+
+               case IOCTL_SERIAL_SET_QUEUE_SIZE:
+                       stream_read_uint32(input, tty->queue_in_size);
+                       stream_read_uint32(input, tty->queue_out_size);
+                       DEBUG_SVC("SERIAL_SET_QUEUE_SIZE in %d out %d", tty->queue_in_size, tty->queue_out_size);
+                       break;
+
+               case IOCTL_SERIAL_SET_LINE_CONTROL:
+                       stream_read_uint8(input, tty->stop_bits);
+                       stream_read_uint8(input, tty->parity);
+                       stream_read_uint8(input, tty->word_length);
+                       tty_set_termios(tty);
+                       DEBUG_SVC("SERIAL_SET_LINE_CONTROL stop %d parity %d word %d",
+                               tty->stop_bits, tty->parity, tty->word_length);
+                       break;
+
+               case IOCTL_SERIAL_GET_LINE_CONTROL:
+                       DEBUG_SVC("SERIAL_GET_LINE_CONTROL");
+                       length = 3;
+                       stream_write_uint8(output, tty->stop_bits);
+                       stream_write_uint8(output, tty->parity);
+                       stream_write_uint8(output, tty->word_length);
+                       break;
+
+               case IOCTL_SERIAL_IMMEDIATE_CHAR:
+                       DEBUG_SVC("SERIAL_IMMEDIATE_CHAR");
+                       stream_read_uint8(input, immediate);
+                       tty_write_data(tty, &immediate, 1);
+                       break;
+
+               case IOCTL_SERIAL_CONFIG_SIZE:
+                       DEBUG_SVC("SERIAL_CONFIG_SIZE");
+                       length = 4;
+                       stream_write_uint32(output, 0);
+                       break;
+
+               case IOCTL_SERIAL_GET_CHARS:
+                       DEBUG_SVC("SERIAL_GET_CHARS");
+                       length = 6;
+                       stream_write(output, tty->chars, 6);
+                       break;
+
+               case IOCTL_SERIAL_SET_CHARS:
+                       DEBUG_SVC("SERIAL_SET_CHARS");
+                       stream_read(input, tty->chars, 6);
+                       tty_set_termios(tty);
+                       break;
+
+               case IOCTL_SERIAL_GET_HANDFLOW:
+                       length = 16;
+                       tty_get_termios(tty);
+                       stream_write_uint32(output, tty->control);
+                       stream_write_uint32(output, tty->xonoff);
+                       stream_write_uint32(output, tty->onlimit);
+                       stream_write_uint32(output, tty->offlimit);
+                       DEBUG_SVC("IOCTL_SERIAL_GET_HANDFLOW %X %X %X %X",
+                               tty->control, tty->xonoff, tty->onlimit, tty->offlimit);
+                       break;
+
+               case IOCTL_SERIAL_SET_HANDFLOW:
+                       stream_read_uint32(input, tty->control);
+                       stream_read_uint32(input, tty->xonoff);
+                       stream_read_uint32(input, tty->onlimit);
+                       stream_read_uint32(input, tty->offlimit);
+                       DEBUG_SVC("IOCTL_SERIAL_SET_HANDFLOW %X %X %X %X",
+                               tty->control, tty->xonoff, tty->onlimit, tty->offlimit);
+                       tty_set_termios(tty);
+                       break;
+
+               case IOCTL_SERIAL_SET_TIMEOUTS:
+                       stream_read_uint32(input, tty->read_interval_timeout);
+                       stream_read_uint32(input, tty->read_total_timeout_multiplier);
+                       stream_read_uint32(input, tty->read_total_timeout_constant);
+                       stream_read_uint32(input, tty->write_total_timeout_multiplier);
+                       stream_read_uint32(input, tty->write_total_timeout_constant);
+
+                       /* http://www.codeproject.com/KB/system/chaiyasit_t.aspx, see 'ReadIntervalTimeout' section
+                               http://msdn.microsoft.com/en-us/library/ms885171.aspx */
+                       if (tty->read_interval_timeout == SERIAL_TIMEOUT_MAX)
+                       {
+                               tty->read_interval_timeout = 0;
+                               tty->read_total_timeout_multiplier = 0;
+                       }
+
+                       DEBUG_SVC("SERIAL_SET_TIMEOUTS read timeout %d %d %d",
+                               tty->read_interval_timeout,
+                               tty->read_total_timeout_multiplier,
+                               tty->read_total_timeout_constant);
+                       break;
+
+               case IOCTL_SERIAL_GET_TIMEOUTS:
+                       DEBUG_SVC("SERIAL_GET_TIMEOUTS read timeout %d %d %d",
+                               tty->read_interval_timeout,
+                               tty->read_total_timeout_multiplier,
+                               tty->read_total_timeout_constant);
+                       length = 20;
+                       stream_write_uint32(output, tty->read_interval_timeout);
+                       stream_write_uint32(output, tty->read_total_timeout_multiplier);
+                       stream_write_uint32(output, tty->read_total_timeout_constant);
+                       stream_write_uint32(output, tty->write_total_timeout_multiplier);
+                       stream_write_uint32(output, tty->write_total_timeout_constant);
+                       break;
+
+               case IOCTL_SERIAL_GET_WAIT_MASK:
+                       DEBUG_SVC("SERIAL_GET_WAIT_MASK %X", tty->wait_mask);
+                       length = 4;
+                       stream_write_uint32(output, tty->wait_mask);
+                       break;
+
+               case IOCTL_SERIAL_SET_WAIT_MASK:
+                       stream_read_uint32(input, tty->wait_mask);
+                       DEBUG_SVC("SERIAL_SET_WAIT_MASK %X", tty->wait_mask);
+                       break;
+
+               case IOCTL_SERIAL_SET_DTR:
+                       DEBUG_SVC("SERIAL_SET_DTR");
+                       ioctl(tty->fd, TIOCMGET, &result);
+                       result |= TIOCM_DTR;
+                       ioctl(tty->fd, TIOCMSET, &result);
+                       tty->dtr = 1;
+                       break;
+
+               case IOCTL_SERIAL_CLR_DTR:
+                       DEBUG_SVC("SERIAL_CLR_DTR");
+                       ioctl(tty->fd, TIOCMGET, &result);
+                       result &= ~TIOCM_DTR;
+                       ioctl(tty->fd, TIOCMSET, &result);
+                       tty->dtr = 0;
+                       break;
+
+               case IOCTL_SERIAL_SET_RTS:
+                       DEBUG_SVC("SERIAL_SET_RTS");
+                       ioctl(tty->fd, TIOCMGET, &result);
+                       result |= TIOCM_RTS;
+                       ioctl(tty->fd, TIOCMSET, &result);
+                       tty->rts = 1;
+                       break;
+
+               case IOCTL_SERIAL_CLR_RTS:
+                       DEBUG_SVC("SERIAL_CLR_RTS");
+                       ioctl(tty->fd, TIOCMGET, &result);
+                       result &= ~TIOCM_RTS;
+                       ioctl(tty->fd, TIOCMSET, &result);
+                       tty->rts = 0;
+                       break;
+
+               case IOCTL_SERIAL_GET_MODEMSTATUS:
+                       modemstate = 0;
+#ifdef TIOCMGET
+                       ioctl(tty->fd, TIOCMGET, &result);
+                       if (result & TIOCM_CTS)
+                               modemstate |= SERIAL_MS_CTS;
+                       if (result & TIOCM_DSR)
+                               modemstate |= SERIAL_MS_DSR;
+                       if (result & TIOCM_RNG)
+                               modemstate |= SERIAL_MS_RNG;
+                       if (result & TIOCM_CAR)
+                               modemstate |= SERIAL_MS_CAR;
+                       if (result & TIOCM_DTR)
+                               modemstate |= SERIAL_MS_DTR;
+                       if (result & TIOCM_RTS)
+                               modemstate |= SERIAL_MS_RTS;
+#endif
+                       DEBUG_SVC("SERIAL_GET_MODEMSTATUS %X", modemstate);
+                       length = 4;
+                       stream_write_uint32(output, modemstate);
+                       break;
+
+               case IOCTL_SERIAL_GET_COMMSTATUS:
+                       length = 18;
+                       stream_write_uint32(output, 0); /* Errors */
+                       stream_write_uint32(output, 0); /* Hold reasons */
+
+                       result = 0;
+#ifdef TIOCINQ
+                       ioctl(tty->fd, TIOCINQ, &result);
+#endif
+                       stream_write_uint32(output, result); /* Amount in in queue */
+                       if (result)
+                               DEBUG_SVC("SERIAL_GET_COMMSTATUS in queue %d", result);
+
+                       result = 0;
+#ifdef TIOCOUTQ
+                       ioctl(tty->fd, TIOCOUTQ, &result);
+#endif
+                       stream_write_uint32(output, result);    /* Amount in out queue */
+                       DEBUG_SVC("SERIAL_GET_COMMSTATUS out queue %d", result);
+
+                       stream_write_uint8(output, 0); /* EofReceived */
+                       stream_write_uint8(output, 0); /* WaitForImmediate */
+                       break;
+
+               case IOCTL_SERIAL_PURGE:
+                       stream_read_uint32(input, purge_mask);
+                       DEBUG_SVC("SERIAL_PURGE purge_mask %X", purge_mask);
+
+               /*      See http://msdn.microsoft.com/en-us/library/ms901431.aspx
+                       PURGE_TXCLEAR   Clears the output buffer, if the driver has one.
+                       PURGE_RXCLEAR   Clears the input buffer, if the driver has one.
+
+                       It clearly states to clear the *driver* buffer, not the port buffer
+               */
+
+#ifdef DEBUG_SVC
+                       if (purge_mask & SERIAL_PURGE_TXCLEAR)
+                               DEBUG_SVC("Ignoring SERIAL_PURGE_TXCLEAR");
+                       if (purge_mask & SERIAL_PURGE_RXCLEAR)
+                               DEBUG_SVC("Ignoring SERIAL_PURGE_RXCLEAR");
+#endif
+
+                       if (purge_mask & SERIAL_PURGE_TXABORT)
+                               *abort_io |= SERIAL_ABORT_IO_WRITE;
+                       if (purge_mask & SERIAL_PURGE_RXABORT)
+                               *abort_io |= SERIAL_ABORT_IO_READ;
+                       break;
+               case IOCTL_SERIAL_WAIT_ON_MASK:
+                       DEBUG_SVC("SERIAL_WAIT_ON_MASK %X", tty->wait_mask);
+                       tty->event_pending = 1;
+                       length = 4;
+                       if (serial_tty_get_event(tty, &result))
+                       {
+                               DEBUG_SVC("WAIT end  event = %X", result);
+                               stream_write_uint32(output, result);
+                               break;
+                       }
+                       ret = STATUS_PENDING;
+                       break;
+
+               case IOCTL_SERIAL_SET_BREAK_ON:
+                       DEBUG_SVC("SERIAL_SET_BREAK_ON");
+                       tcsendbreak(tty->fd, 0);
+                       break;
+
+               case IOCTL_SERIAL_RESET_DEVICE:
+                       DEBUG_SVC("SERIAL_RESET_DEVICE");
+                       break;
+
+               case IOCTL_SERIAL_SET_BREAK_OFF:
+                       DEBUG_SVC("SERIAL_SET_BREAK_OFF");
+                       break;
+
+               case IOCTL_SERIAL_SET_XOFF:
+                       DEBUG_SVC("SERIAL_SET_XOFF");
+                       break;
+
+               case IOCTL_SERIAL_SET_XON:
+                       DEBUG_SVC("SERIAL_SET_XON");
+                       tcflow(tty->fd, TCION);
+                       break;
+
+               default:
+                       DEBUG_SVC("NOT FOUND IoControlCode SERIAL IOCTL %d", IoControlCode);
+                       return STATUS_INVALID_PARAMETER;
+       }
+
+       /* Write OutputBufferLength */
+       pos = stream_get_pos(output);
+       stream_set_pos(output, 16);
+       stream_write_uint32(output, length);
+       stream_set_pos(output, pos);
+
+       return ret;
+}
+
+boolean serial_tty_read(SERIAL_TTY* tty, uint8* buffer, uint32* Length)
+{
+       long timeout = 90;
+       struct termios *ptermios;
+       ssize_t r;
+
+       DEBUG_SVC("in");
+       ptermios = tty->ptermios;
+
+       /* Set timeouts kind of like the windows serial timeout parameters. Multiply timeout
+          with requested read size */
+       if (tty->read_total_timeout_multiplier | tty->read_total_timeout_constant)
+       {
+               timeout =
+                       (tty->read_total_timeout_multiplier * (*Length) +
+                        tty->read_total_timeout_constant + 99) / 100;
+       }
+       else if (tty->read_interval_timeout)
+       {
+               timeout = (tty->read_interval_timeout * (*Length) + 99) / 100;
+       }
+
+       /* If a timeout is set, do a blocking read, which times out after some time.
+          It will make FreeRDP less responsive, but it will improve serial performance,
+          by not reading one character at a time. */
+       if (timeout == 0)
+       {
+               ptermios->c_cc[VTIME] = 0;
+               ptermios->c_cc[VMIN] = 0;
+       }
+       else
+       {
+               ptermios->c_cc[VTIME] = timeout;
+               ptermios->c_cc[VMIN] = 1;
+       }
+
+       tcsetattr(tty->fd, TCSANOW, ptermios);
+
+       memset(buffer, 0, *Length);
+       r = read(tty->fd, buffer, *Length);
+       if (r < 0)
+               return false;
+
+       tty->event_txempty = r;
+       *Length = r;
+
+       return true;
+}
+
+boolean serial_tty_write(SERIAL_TTY* tty, uint8* buffer, uint32 Length)
+{
+       ssize_t r;
+       uint32 event_txempty = Length;
+
+       DEBUG_SVC("in");
+
+       while (Length > 0)
+       {
+               r = write(tty->fd, buffer, Length);
+               if (r < 0)
+                       return false;
+
+               Length -= r;
+               buffer += r;
+       }
+       tty->event_txempty = event_txempty;
+
+       return true;
+}
+
+void serial_tty_free(SERIAL_TTY* tty)
+{
+       DEBUG_SVC("in");
+
+       if (tty->fd >= 0)
+       {
+               tcsetattr(tty->fd, TCSANOW, tty->pold_termios);
+               close(tty->fd);
+       }
+
+       xfree(tty->ptermios);
+       xfree(tty->pold_termios);
+       xfree(tty);
+}
+
+SERIAL_TTY* serial_tty_new(const char* path, uint32 id)
+{
+       SERIAL_TTY* tty;
+
+       tty = xnew(SERIAL_TTY);
+       tty->id = id;
+       tty->fd = open(path, O_RDWR | O_NOCTTY | O_NONBLOCK);
+       if (tty->fd < 0)
+       {
+               perror("open");
+               DEBUG_WARN("failed to open device %s", path);
+               return NULL;
+       }
+       else
+               DEBUG_SVC("tty fd %d successfully opened", tty->fd);
+
+       tty->ptermios = (struct termios*) malloc(sizeof(struct termios));
+       memset(tty->ptermios, 0, sizeof(struct termios));
+       tty->pold_termios = (struct termios*) malloc(sizeof(struct termios));
+       memset(tty->pold_termios, 0, sizeof(struct termios));
+       tcgetattr(tty->fd, tty->pold_termios);
+
+       if (!tty_get_termios(tty))
+       {
+               DEBUG_WARN("%s access denied", path);
+               fflush(stdout);
+               return NULL;
+       }
+
+       tty->ptermios->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
+       tty->ptermios->c_iflag = IGNPAR | ICRNL;
+       tty->ptermios->c_oflag &= ~OPOST;
+       tty->ptermios->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+       tty->ptermios->c_cflag &= ~(CSIZE | PARENB);
+       tty->ptermios->c_cflag |= CLOCAL | CREAD | CS8;
+       tcsetattr(tty->fd, TCSANOW, tty->ptermios);
+
+       tty->event_txempty = 0;
+       tty->event_cts = 0;
+       tty->event_dsr = 0;
+       tty->event_rlsd = 0;
+       tty->event_pending = 0;
+
+       /* all read and writes should be non-blocking */
+       if (fcntl(tty->fd, F_SETFL, O_NONBLOCK) == -1)
+       {
+               DEBUG_WARN("%s fcntl", path);
+               perror("fcntl");
+               return NULL;
+       }
+
+       tty->read_total_timeout_constant = 5;
+
+       return tty;
+}
+
+boolean serial_tty_get_event(SERIAL_TTY* tty, uint32* result)
+{
+       int bytes;
+       boolean ret = false;
+
+       DEBUG_SVC("in");
+
+       *result = 0;
+
+#ifdef TIOCINQ
+       /* When wait_mask is set to zero we ought to cancel it all
+          For reference: http://msdn.microsoft.com/en-us/library/aa910487.aspx */
+       if (tty->wait_mask == 0)
+       {
+               tty->event_pending = 0;
+               return true;
+       }
+
+       ioctl(tty->fd, TIOCINQ, &bytes);
+
+       if (bytes > 0)
+       {
+               DEBUG_SVC("bytes %d", bytes);
+
+               if (bytes > tty->event_rlsd)
+               {
+                       tty->event_rlsd = bytes;
+                       if (tty->wait_mask & SERIAL_EV_RLSD)
+                       {
+                               DEBUG_SVC("SERIAL_EV_RLSD");
+                               *result |= SERIAL_EV_RLSD;
+                               ret = true;
+                       }
+
+               }
+
+               if ((bytes > 1) && (tty->wait_mask & SERIAL_EV_RXFLAG))
+               {
+                       DEBUG_SVC("SERIAL_EV_RXFLAG bytes %d", bytes);
+                       *result |= SERIAL_EV_RXFLAG;
+                       ret = true;
+               }
+               if ((tty->wait_mask & SERIAL_EV_RXCHAR))
+               {
+                       DEBUG_SVC("SERIAL_EV_RXCHAR bytes %d", bytes);
+                       *result |= SERIAL_EV_RXCHAR;
+                       ret = true;
+               }
+
+       }
+       else
+       {
+               tty->event_rlsd = 0;
+       }
+#endif
+
+#ifdef TIOCOUTQ
+       ioctl(tty->fd, TIOCOUTQ, &bytes);
+       if ((bytes == 0)
+           && (tty->event_txempty > 0) && (tty->wait_mask & SERIAL_EV_TXEMPTY))
+       {
+               DEBUG_SVC("SERIAL_EV_TXEMPTY");
+               *result |= SERIAL_EV_TXEMPTY;
+               ret = true;
+       }
+       tty->event_txempty = bytes;
+#endif
+
+       ioctl(tty->fd, TIOCMGET, &bytes);
+       if ((bytes & TIOCM_DSR) != tty->event_dsr)
+       {
+               tty->event_dsr = bytes & TIOCM_DSR;
+               if (tty->wait_mask & SERIAL_EV_DSR)
+               {
+                       DEBUG_SVC("SERIAL_EV_DSR %s", (bytes & TIOCM_DSR) ? "ON" : "OFF");
+                       *result |= SERIAL_EV_DSR;
+                       ret = true;
+               }
+       }
+
+       if ((bytes & TIOCM_CTS) != tty->event_cts)
+       {
+               tty->event_cts = bytes & TIOCM_CTS;
+               if (tty->wait_mask & SERIAL_EV_CTS)
+               {
+                       DEBUG_SVC("SERIAL_EV_CTS %s", (bytes & TIOCM_CTS) ? "ON" : "OFF");
+                       *result |= SERIAL_EV_CTS;
+                       ret = true;
+               }
+       }
+
+       if (ret)
+               tty->event_pending = 0;
+
+       return ret;
+}
+
+static boolean tty_get_termios(SERIAL_TTY* tty)
+{
+       speed_t speed;
+       struct termios *ptermios;
+       ptermios = tty->ptermios;
+
+       DEBUG_SVC("tcgetattr? %d", tcgetattr(tty->fd, ptermios) >= 0);
+       if (tcgetattr(tty->fd, ptermios) < 0)
+               return false;
+
+       speed = cfgetispeed(ptermios);
+       switch (speed)
+       {
+#ifdef B75
+               case B75:
+                       tty->baud_rate = 75;
+                       break;
+#endif
+#ifdef B110
+               case B110:
+                       tty->baud_rate = 110;
+                       break;
+#endif
+#ifdef B134
+               case B134:
+                       tty->baud_rate = 134;
+                       break;
+#endif
+#ifdef B150
+               case B150:
+                       tty->baud_rate = 150;
+                       break;
+#endif
+#ifdef B300
+               case B300:
+                       tty->baud_rate = 300;
+                       break;
+#endif
+#ifdef B600
+               case B600:
+                       tty->baud_rate = 600;
+                       break;
+#endif
+#ifdef B1200
+               case B1200:
+                       tty->baud_rate = 1200;
+                       break;
+#endif
+#ifdef B1800
+               case B1800:
+                       tty->baud_rate = 1800;
+                       break;
+#endif
+#ifdef B2400
+               case B2400:
+                       tty->baud_rate = 2400;
+                       break;
+#endif
+#ifdef B4800
+               case B4800:
+                       tty->baud_rate = 4800;
+                       break;
+#endif
+#ifdef B9600
+               case B9600:
+                       tty->baud_rate = 9600;
+                       break;
+#endif
+#ifdef B19200
+               case B19200:
+                       tty->baud_rate = 19200;
+                       break;
+#endif
+#ifdef B38400
+               case B38400:
+                       tty->baud_rate = 38400;
+                       break;
+#endif
+#ifdef B57600
+               case B57600:
+                       tty->baud_rate = 57600;
+                       break;
+#endif
+#ifdef B115200
+               case B115200:
+                       tty->baud_rate = 115200;
+                       break;
+#endif
+#ifdef B230400
+               case B230400:
+                       tty->baud_rate = 230400;
+                       break;
+#endif
+#ifdef B460800
+               case B460800:
+                       tty->baud_rate = 460800;
+                       break;
+#endif
+               default:
+                       tty->baud_rate = 9600;
+                       break;
+       }
+
+       speed = cfgetospeed(ptermios);
+       tty->dtr = (speed == B0) ? 0 : 1;
+
+       tty->stop_bits = (ptermios->c_cflag & CSTOPB) ? SERIAL_STOP_BITS_2 : SERIAL_STOP_BITS_1;
+       tty->parity =
+               (ptermios->c_cflag & PARENB) ? ((ptermios->c_cflag & PARODD) ? SERIAL_ODD_PARITY :
+                                               SERIAL_EVEN_PARITY) : SERIAL_NO_PARITY;
+       switch (ptermios->c_cflag & CSIZE)
+       {
+               case CS5:
+                       tty->word_length = 5;
+                       break;
+               case CS6:
+                       tty->word_length = 6;
+                       break;
+               case CS7:
+                       tty->word_length = 7;
+                       break;
+               default:
+                       tty->word_length = 8;
+                       break;
+       }
+
+       if (ptermios->c_cflag & CRTSCTS)
+       {
+               tty->control = SERIAL_DTR_CONTROL | SERIAL_CTS_HANDSHAKE | SERIAL_ERROR_ABORT;
+       }
+       else
+       {
+               tty->control = SERIAL_DTR_CONTROL | SERIAL_ERROR_ABORT;
+       }
+
+       tty->xonoff = SERIAL_DSR_SENSITIVITY;
+       if (ptermios->c_iflag & IXON)
+               tty->xonoff |= SERIAL_XON_HANDSHAKE;
+
+       if (ptermios->c_iflag & IXOFF)
+               tty->xonoff |= SERIAL_XOFF_HANDSHAKE;
+
+       tty->chars[SERIAL_CHAR_XON] = ptermios->c_cc[VSTART];
+       tty->chars[SERIAL_CHAR_XOFF] = ptermios->c_cc[VSTOP];
+       tty->chars[SERIAL_CHAR_EOF] = ptermios->c_cc[VEOF];
+       tty->chars[SERIAL_CHAR_BREAK] = ptermios->c_cc[VINTR];
+       tty->chars[SERIAL_CHAR_ERROR] = ptermios->c_cc[VKILL];
+
+       return true;
+}
+
+static void tty_set_termios(SERIAL_TTY* tty)
+{
+       speed_t speed;
+       struct termios *ptermios;
+
+       DEBUG_SVC("in");
+       ptermios = tty->ptermios;
+       switch (tty->baud_rate)
+       {
+#ifdef B75
+               case 75:
+                       speed = B75;
+                       break;
+#endif
+#ifdef B110
+               case 110:
+                       speed = B110;
+                       break;
+#endif
+#ifdef B134
+               case 134:
+                       speed = B134;
+                       break;
+#endif
+#ifdef B150
+               case 150:
+                       speed = B150;
+                       break;
+#endif
+#ifdef B300
+               case 300:
+                       speed = B300;
+                       break;
+#endif
+#ifdef B600
+               case 600:
+                       speed = B600;
+                       break;
+#endif
+#ifdef B1200
+               case 1200:
+                       speed = B1200;
+                       break;
+#endif
+#ifdef B1800
+               case 1800:
+                       speed = B1800;
+                       break;
+#endif
+#ifdef B2400
+               case 2400:
+                       speed = B2400;
+                       break;
+#endif
+#ifdef B4800
+               case 4800:
+                       speed = B4800;
+                       break;
+#endif
+#ifdef B9600
+               case 9600:
+                       speed = B9600;
+                       break;
+#endif
+#ifdef B19200
+               case 19200:
+                       speed = B19200;
+                       break;
+#endif
+#ifdef B38400
+               case 38400:
+                       speed = B38400;
+                       break;
+#endif
+#ifdef B57600
+               case 57600:
+                       speed = B57600;
+                       break;
+#endif
+#ifdef B115200
+               case 115200:
+                       speed = B115200;
+                       break;
+#endif
+#ifdef B230400
+               case 230400:
+                       speed = B115200;
+                       break;
+#endif
+#ifdef B460800
+               case 460800:
+                       speed = B115200;
+                       break;
+#endif
+               default:
+                       speed = B9600;
+                       break;
+       }
+
+#ifdef CBAUD
+       ptermios->c_cflag &= ~CBAUD;
+       ptermios->c_cflag |= speed;
+#else
+       /* on systems with separate ispeed and ospeed, we can remember the speed
+          in ispeed while changing DTR with ospeed */
+       cfsetispeed(tty->ptermios, speed);
+       cfsetospeed(tty->ptermios, tty->dtr ? speed : 0);
+#endif
+
+       ptermios->c_cflag &= ~(CSTOPB | PARENB | PARODD | CSIZE | CRTSCTS);
+       switch (tty->stop_bits)
+       {
+               case SERIAL_STOP_BITS_2:
+                       ptermios->c_cflag |= CSTOPB;
+                       break;
+               default:
+                       ptermios->c_cflag &= ~CSTOPB;
+                       break;
+       }
+
+       switch (tty->parity)
+       {
+               case SERIAL_EVEN_PARITY:
+                       ptermios->c_cflag |= PARENB;
+                       break;
+               case SERIAL_ODD_PARITY:
+                       ptermios->c_cflag |= PARENB | PARODD;
+                       break;
+               case SERIAL_NO_PARITY:
+                       ptermios->c_cflag &= ~(PARENB | PARODD);
+                       break;
+       }
+
+       switch (tty->word_length)
+       {
+               case 5:
+                       ptermios->c_cflag |= CS5;
+                       break;
+               case 6:
+                       ptermios->c_cflag |= CS6;
+                       break;
+               case 7:
+                       ptermios->c_cflag |= CS7;
+                       break;
+               default:
+                       ptermios->c_cflag |= CS8;
+                       break;
+       }
+
+#if 0
+       if (tty->rts)
+               ptermios->c_cflag |= CRTSCTS;
+       else
+               ptermios->c_cflag &= ~CRTSCTS;
+#endif
+
+       if (tty->control & SERIAL_CTS_HANDSHAKE)
+       {
+               ptermios->c_cflag |= CRTSCTS;
+       }
+       else
+       {
+               ptermios->c_cflag &= ~CRTSCTS;
+       }
+
+
+       if (tty->xonoff & SERIAL_XON_HANDSHAKE)
+       {
+               ptermios->c_iflag |= IXON | IMAXBEL;
+       }
+       if (tty->xonoff & SERIAL_XOFF_HANDSHAKE)
+       {
+               ptermios->c_iflag |= IXOFF | IMAXBEL;
+       }
+
+       if ((tty->xonoff & (SERIAL_XOFF_HANDSHAKE | SERIAL_XON_HANDSHAKE)) == 0)
+       {
+               ptermios->c_iflag &= ~IXON;
+               ptermios->c_iflag &= ~IXOFF;
+       }
+
+       ptermios->c_cc[VSTART] = tty->chars[SERIAL_CHAR_XON];
+       ptermios->c_cc[VSTOP] = tty->chars[SERIAL_CHAR_XOFF];
+       ptermios->c_cc[VEOF] = tty->chars[SERIAL_CHAR_EOF];
+       ptermios->c_cc[VINTR] = tty->chars[SERIAL_CHAR_BREAK];
+       ptermios->c_cc[VKILL] = tty->chars[SERIAL_CHAR_ERROR];
+
+       tcsetattr(tty->fd, TCSANOW, ptermios);
+}
+
+static uint32 tty_write_data(SERIAL_TTY* tty, uint8* data, int len)
+{
+       ssize_t r;
+
+       DEBUG_SVC("in");
+
+       r = write(tty->fd, data, len);
+       if (r < 0)
+               return tty_get_error_status();
+
+       tty->event_txempty = r;
+
+       return STATUS_SUCCESS;
+}
+
+static int tty_get_error_status()
+{
+       DEBUG_SVC("in errno %d", errno);
+
+       switch (errno)
+       {
+               case EACCES:
+               case ENOTDIR:
+               case ENFILE:
+                       return STATUS_ACCESS_DENIED;
+               case EISDIR:
+                       return STATUS_FILE_IS_A_DIRECTORY;
+               case EEXIST:
+                       return STATUS_OBJECT_NAME_COLLISION;
+               case EBADF:
+                       return STATUS_INVALID_HANDLE;
+               default:
+                       return STATUS_NO_SUCH_FILE;
+       }
+}
diff --git a/channels/rdpdr/serial/serial_tty.h b/channels/rdpdr/serial/serial_tty.h
new file mode 100644 (file)
index 0000000..a4b82f9
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Serial Port Device Service Virtual Channel
+ *
+ * Copyright 2011 O.S. Systems Software Ltda.
+ * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SERIAL_TTY_H
+#define __SERIAL_TTY_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+
+typedef struct _SERIAL_TTY SERIAL_TTY;
+struct _SERIAL_TTY
+{
+       uint32 id;
+       int fd;
+
+       int dtr;
+       int rts;
+       uint32 control;
+       uint32 xonoff;
+       uint32 onlimit;
+       uint32 offlimit;
+       uint32 baud_rate;
+       uint32 queue_in_size;
+       uint32 queue_out_size;
+       uint32 wait_mask;
+       uint32 read_interval_timeout;
+       uint32 read_total_timeout_multiplier;
+       uint32 read_total_timeout_constant;
+       uint32 write_total_timeout_multiplier;
+       uint32 write_total_timeout_constant;
+       uint8 stop_bits;
+       uint8 parity;
+       uint8 word_length;
+       uint8 chars[6];
+       struct termios* ptermios;
+       struct termios* pold_termios;
+       int event_txempty;
+       int event_cts;
+       int event_dsr;
+       int event_rlsd;
+       int event_pending;
+};
+
+
+SERIAL_TTY* serial_tty_new(const char* path, uint32 id);
+void serial_tty_free(SERIAL_TTY* tty);
+
+boolean serial_tty_read(SERIAL_TTY* tty, uint8* buffer, uint32* Length);
+boolean serial_tty_write(SERIAL_TTY* tty, uint8* buffer, uint32 Length);
+uint32 serial_tty_control(SERIAL_TTY* tty, uint32 IoControlCode, STREAM* input, STREAM* output, uint32* abort_io);
+
+boolean serial_tty_get_event(SERIAL_TTY* tty, uint32* result);
+
+#endif /* __SERIAL_TTY_H */
diff --git a/channels/rdpdr/smartcard/CMakeLists.txt b/channels/rdpdr/smartcard/CMakeLists.txt
new file mode 100644 (file)
index 0000000..816fc09
--- /dev/null
@@ -0,0 +1,34 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(SCARD_SRCS
+       scard_main.c
+       scard_operations.c
+)
+
+include_directories(..)
+include_directories(${PCSC_INCLUDE_DIRS})
+
+add_library(scard ${SCARD_SRCS})
+set_target_properties(scard PROPERTIES PREFIX "")
+
+target_link_libraries(scard freerdp-utils)
+target_link_libraries(scard ${PCSC_LIBRARIES})
+
+install(TARGETS scard DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpdr/smartcard/scard_main.c b/channels/rdpdr/smartcard/scard_main.c
new file mode 100644 (file)
index 0000000..5066bf2
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   Redirected Smart Card Device Service
+
+   Copyright 2011 O.S. Systems Software Ltda.
+   Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+   Copyright 2011 Anthony Tong <atong@trustedcs.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpdr_types.h"
+#include "rdpdr_constants.h"
+
+#include "scard_main.h"
+
+
+static void
+scard_free(DEVICE* dev)
+{
+       SCARD_DEVICE* scard = (SCARD_DEVICE*)dev;
+       IRP* irp;
+
+       freerdp_thread_stop(scard->thread);
+       freerdp_thread_free(scard->thread);
+       
+       while ((irp = (IRP*)list_dequeue(scard->irp_list)) != NULL)
+               irp->Discard(irp);
+       list_free(scard->irp_list);
+
+       xfree(dev);
+       return;
+}
+
+
+static void
+scard_process_irp(SCARD_DEVICE* scard, IRP* irp)
+{
+       switch (irp->MajorFunction)
+       {
+               case IRP_MJ_DEVICE_CONTROL:
+                       scard_device_control(scard, irp);
+                       break;
+
+               default:
+                       printf("MajorFunction 0x%X unexpected for smartcards.", irp->MajorFunction);
+                       DEBUG_WARN("Smartcard MajorFunction 0x%X not supported.", irp->MajorFunction);
+                       irp->IoStatus = STATUS_NOT_SUPPORTED;
+                       irp->Complete(irp);
+                       break;
+       }
+}
+
+
+static void
+scard_process_irp_list(SCARD_DEVICE* scard)
+{
+       IRP *irp;
+
+       while (!freerdp_thread_is_stopped(scard->thread))
+       {
+               freerdp_thread_lock(scard->thread);
+               irp = (IRP *) list_dequeue(scard->irp_list);
+               freerdp_thread_unlock(scard->thread);
+
+               if (irp == NULL)
+                       break;
+
+               scard_process_irp(scard, irp);
+       }
+}
+
+
+struct scard_irp_thread_args {
+       SCARD_DEVICE* scard;
+       IRP* irp;
+       freerdp_thread* thread;
+};
+
+static void
+scard_process_irp_thread_func(struct scard_irp_thread_args* args)
+{
+       scard_process_irp(args->scard, args->irp);
+
+       freerdp_thread_free(args->thread);
+       xfree(args);
+}
+
+
+static void *
+scard_thread_func(void* arg)
+{
+       SCARD_DEVICE* scard = (SCARD_DEVICE*) arg;
+
+       while (1)
+       {
+               freerdp_thread_wait(scard->thread);
+
+               if (freerdp_thread_is_stopped(scard->thread))
+                       break;
+
+               freerdp_thread_reset(scard->thread);
+               scard_process_irp_list(scard);
+       }
+
+       freerdp_thread_quit(scard->thread);
+
+       return NULL;
+}
+
+
+static void
+scard_irp_request(DEVICE* device, IRP* irp)
+{
+       SCARD_DEVICE* scard = (SCARD_DEVICE*)device;
+
+       if (irp->MajorFunction == IRP_MJ_DEVICE_CONTROL &&
+                       scard_async_op(irp))
+       {
+               /*
+                * certain potentially long running operations
+                * get their own thread
+                * TODO: revise this mechanism.. maybe worker pool
+                */
+               struct scard_irp_thread_args *args = xmalloc(sizeof(struct scard_irp_thread_args));
+
+
+               args->thread = freerdp_thread_new();
+               args->scard = scard;
+               args->irp = irp;
+               freerdp_thread_start(args->thread, scard_process_irp_thread_func, args);
+
+               return;
+       }
+
+       freerdp_thread_lock(scard->thread);
+       list_enqueue(scard->irp_list, irp);
+       freerdp_thread_unlock(scard->thread);
+
+       freerdp_thread_signal(scard->thread);
+}
+
+
+int
+DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints)
+{
+       SCARD_DEVICE* scard;
+       char* name;
+       char* path;
+       int i, length;
+
+       name = (char *)pEntryPoints->plugin_data->data[1];
+       path = (char *)pEntryPoints->plugin_data->data[2];
+
+       if (name)
+       {
+               /* TODO: check if server supports sc redirect (version 5.1) */
+
+               scard = xnew(SCARD_DEVICE);
+
+               scard->device.type = RDPDR_DTYP_SMARTCARD;
+               scard->device.name = "SCARD";
+               scard->device.IRPRequest = scard_irp_request;
+               scard->device.Free = scard_free;
+
+               length = strlen(scard->device.name);
+               scard->device.data = stream_new(length + 1);
+
+               for (i = 0; i <= length; i++)
+                       stream_write_uint8(scard->device.data, name[i] < 0 ? '_' : name[i]);
+
+               scard->path = path;
+
+               scard->irp_list = list_new();
+               scard->thread = freerdp_thread_new();
+
+               pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE *)scard);
+
+               freerdp_thread_start(scard->thread, scard_thread_func, scard);
+       }
+
+       return 0;
+}
diff --git a/channels/rdpdr/smartcard/scard_main.h b/channels/rdpdr/smartcard/scard_main.h
new file mode 100644 (file)
index 0000000..7813f48
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   Redirected Smart Card Device Service
+
+   Copyright 2011 O.S. Systems Software Ltda.
+   Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#ifndef __SCARD_MAIN_H
+#define __SCARD_MAIN_H
+
+#include <inttypes.h>
+
+#include "devman.h"
+#include "rdpdr_types.h"
+#include <freerdp/utils/debug.h>
+
+struct _SCARD_DEVICE
+{
+       DEVICE device;
+
+       char * name;
+       char * path;
+
+       LIST* irp_list;
+
+       freerdp_thread* thread;
+};
+typedef struct _SCARD_DEVICE SCARD_DEVICE;
+
+#ifdef WITH_DEBUG_SCARD
+#define DEBUG_SCARD(fmt, ...) DEBUG_CLASS(SCARD, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_SCARD(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+boolean scard_async_op(IRP*);
+void scard_device_control(SCARD_DEVICE*, IRP*);
+
+#endif
diff --git a/channels/rdpdr/smartcard/scard_operations.c b/channels/rdpdr/smartcard/scard_operations.c
new file mode 100644 (file)
index 0000000..26c7bc9
--- /dev/null
@@ -0,0 +1,1540 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   Redirected Smart Card Device Service
+
+   Copyright (C) Alexi Volkov <alexi@myrealbox.com> 2006
+   Copyright 2011 O.S. Systems Software Ltda.
+   Copyright 2011 Anthony Tong <atong@trustedcs.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <strings.h>
+#include <semaphore.h>
+#include <pthread.h>
+
+#include <PCSC/pcsclite.h>
+#include <PCSC/reader.h>
+#include <PCSC/winscard.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/svc_plugin.h>
+#include <freerdp/utils/semaphore.h>
+#include <freerdp/utils/thread.h>
+
+#include "rdpdr_types.h"
+#include "rdpdr_constants.h"
+
+#include "scard_main.h"
+
+/* [MS-RDPESC] 3.1.4 */
+#define SCARD_IOCTL_ESTABLISH_CONTEXT        0x00090014        /* EstablishContext */
+#define SCARD_IOCTL_RELEASE_CONTEXT          0x00090018        /* ReleaseContext */
+#define SCARD_IOCTL_IS_VALID_CONTEXT         0x0009001C        /* IsValidContext */
+#define SCARD_IOCTL_LIST_READER_GROUPS       0x00090020        /* ListReaderGroups */
+#define SCARD_IOCTL_LIST_READERS             0x00090028        /* ListReadersA */
+#define SCARD_IOCTL_INTRODUCE_READER_GROUP   0x00090050        /* IntroduceReaderGroup */
+#define SCARD_IOCTL_FORGET_READER_GROUP      0x00090058        /* ForgetReader */
+#define SCARD_IOCTL_INTRODUCE_READER         0x00090060        /* IntroduceReader */
+#define SCARD_IOCTL_FORGET_READER            0x00090068        /* IntroduceReader */
+#define SCARD_IOCTL_ADD_READER_TO_GROUP      0x00090070        /* AddReaderToGroup */
+#define SCARD_IOCTL_REMOVE_READER_FROM_GROUP 0x00090078        /* RemoveReaderFromGroup */
+#define SCARD_IOCTL_GET_STATUS_CHANGE        0x000900A0        /* GetStatusChangeA */
+#define SCARD_IOCTL_CANCEL                   0x000900A8        /* Cancel */
+#define SCARD_IOCTL_CONNECT                  0x000900AC        /* ConnectA */
+#define SCARD_IOCTL_RECONNECT                0x000900B4        /* Reconnect */
+#define SCARD_IOCTL_DISCONNECT               0x000900B8        /* Disconnect */
+#define SCARD_IOCTL_BEGIN_TRANSACTION        0x000900BC        /* BeginTransaction */
+#define SCARD_IOCTL_END_TRANSACTION          0x000900C0        /* EndTransaction */
+#define SCARD_IOCTL_STATE                    0x000900C4        /* State */
+#define SCARD_IOCTL_STATUS                   0x000900C8        /* StatusA */
+#define SCARD_IOCTL_TRANSMIT                 0x000900D0        /* Transmit */
+#define SCARD_IOCTL_CONTROL                  0x000900D4        /* Control */
+#define SCARD_IOCTL_GETATTRIB                0x000900D8        /* GetAttrib */
+#define SCARD_IOCTL_SETATTRIB                0x000900DC        /* SetAttrib */
+#define SCARD_IOCTL_ACCESS_STARTED_EVENT     0x000900E0        /* SCardAccessStartedEvent */
+#define SCARD_IOCTL_LOCATE_CARDS_BY_ATR      0x000900E8        /* LocateCardsByATR */
+
+#define SCARD_INPUT_LINKED                   0xFFFFFFFF
+
+/* Decode Win CTL_CODE values */
+#define WIN_CTL_FUNCTION(ctl_code)     ((ctl_code & 0x3FFC) >> 2)
+#define WIN_CTL_DEVICE_TYPE(ctl_code)  (ctl_code >> 16)
+
+#define WIN_FILE_DEVICE_SMARTCARD      0x00000031
+
+
+static uint32 sc_output_string(IRP* irp, char *src, boolean wide)
+{
+       uint8* p;
+       uint32 len;
+
+       p = stream_get_tail(irp->output);
+       len = strlen(src) + 1;
+
+       if (wide)
+       {
+               int i;
+
+               for (i = 0; i < len; i++ )
+               {
+                       p[2 * i] = src[i] < 0 ? '?' : src[i];
+                       p[2 * i + 1] = '\0';
+               }
+
+               len *= 2;
+       }
+       else
+       {
+               memcpy(p, src, len);
+       }
+
+       stream_seek(irp->output, len);
+       return len;
+}
+
+static void sc_output_alignment(IRP *irp, uint32 seed)
+{
+       uint32 size = stream_get_length(irp->output) - 20;
+       uint32 add = (seed - (size % seed)) % seed;
+
+       if (add > 0)
+               stream_write_zero(irp->output, add);
+}
+
+static void sc_output_repos(IRP* irp, uint32 written)
+{
+       uint32 add = (4 - (written % 4)) % 4;
+
+       if (add > 0)
+               stream_write_zero(irp->output, add);
+}
+
+static uint32 sc_output_return(IRP* irp, uint32 rv)
+{
+       stream_write_zero(irp->output, 256);
+       return rv;
+}
+
+static void sc_output_buffer_limit(IRP* irp, char *buffer, unsigned int length, unsigned int highLimit)
+{
+       int header = (length < 0) ? (0) : ((length > highLimit) ? (highLimit) : (length));
+
+       stream_write_uint32(irp->output, header);
+
+       if (length <= 0)
+       {
+               stream_write_uint32(irp->output, 0);
+       }
+       else
+       {
+               if (header < length)
+                       length = header;
+
+               stream_write(irp->output, buffer, length);
+               sc_output_repos(irp, length);
+       }
+}
+
+static void sc_output_buffer(IRP* irp, char *buffer, unsigned int length)
+{
+       sc_output_buffer_limit(irp, buffer, length, 0x7FFFFFFF);
+}
+
+static void sc_output_buffer_start_limit(IRP *irp, int length, int highLimit)
+{
+       int header = (length < 0) ? (0) : ((length > highLimit) ? (highLimit) : (length));
+
+       stream_write_uint32(irp->output, header);
+       stream_write_uint32(irp->output, 0x00000001);   /* Magic DWORD - any non zero */
+}
+
+static void sc_output_buffer_start(IRP *irp, int length)
+{
+       sc_output_buffer_start_limit(irp, length, 0x7FFFFFFF);
+}
+
+static uint32 sc_input_string(IRP* irp, char **dest, uint32 dataLength, boolean wide)
+{
+       char *buffer;
+       int bufferSize;
+
+       bufferSize = wide ? (2 * dataLength) : dataLength;
+       buffer = xmalloc(bufferSize + 2); /* reserve 2 bytes for the '\0' */
+
+       stream_read(irp->input, buffer, bufferSize);
+       if (wide)
+       {
+               int i;
+               for (i = 0; i < dataLength; i++)
+               {
+                       if ((buffer[2 * i] < 0) || (buffer[2 * i + 1] != 0))
+                               buffer[i] = '?';
+                       else
+                               buffer[i] = buffer[2 * i];
+               }
+       }
+
+       buffer[dataLength] = '\0';
+       *dest = buffer;
+
+       return bufferSize;
+}
+
+static void sc_input_repos(IRP* irp, uint32 read)
+{
+       uint32 add = 4 - (read % 4);
+
+       if (add < 4 && add > 0)
+               stream_seek(irp->input, add);
+}
+
+static void sc_input_reader_name(IRP* irp, char **dest, boolean wide)
+{
+       uint32 dataLength;
+
+       stream_seek(irp->input, 8);
+       stream_read_uint32(irp->input, dataLength);
+
+       DEBUG_SCARD("datalength %d", dataLength);
+       sc_input_repos(irp, sc_input_string(irp, dest, dataLength, wide));
+}
+
+static void sc_input_skip_linked(IRP* irp)
+{
+       uint32 len;
+       stream_read_uint32(irp->input, len);
+
+       if (len > 0)
+       {
+               stream_seek(irp->input, len);
+               sc_input_repos(irp, len);
+       }
+}
+
+static uint32 sc_map_state(uint32 state)
+{
+       /* is this mapping still needed? */
+
+       if (state & SCARD_SPECIFIC)
+               state = 0x00000006;
+       else if (state & SCARD_NEGOTIABLE)
+               state = 0x00000005;
+       else if (state & SCARD_POWERED)
+               state = 0x00000004;
+       else if (state & SCARD_SWALLOWED)
+               state = 0x00000003;
+       else if (state & SCARD_PRESENT)
+               state = 0x00000002;
+       else if (state & SCARD_ABSENT)
+               state = 0x00000001;
+       else
+               state = 0x00000000;
+
+       return state;
+}
+
+static uint32 handle_EstablishContext(IRP* irp)
+{
+       uint32 len, rv;
+       uint32 scope;
+       SCARDCONTEXT hContext = -1;
+
+       stream_seek(irp->input, 8);
+       stream_read_uint32(irp->input, len);
+
+       if (len != 8)
+               return SCARD_F_INTERNAL_ERROR;
+
+       stream_seek_uint32(irp->input);
+       stream_read_uint32(irp->input, scope);
+
+       rv = SCardEstablishContext(scope, NULL, NULL, &hContext);
+
+       stream_write_uint32(irp->output, 4);    // ?
+       stream_write_uint32(irp->output, -1);   // ?
+
+       stream_write_uint32(irp->output, 4);
+       stream_write_uint32(irp->output, hContext);
+
+       /* TODO: store hContext in allowed context list */
+
+       return SCARD_S_SUCCESS;
+}
+
+static uint32 handle_ReleaseContext(IRP* irp)
+{
+       uint32 len, rv;
+       SCARDCONTEXT hContext = -1;
+
+       stream_seek(irp->input, 8);
+       stream_read_uint32(irp->input, len);
+
+       stream_seek(irp->input, 0x10);
+       stream_read_uint32(irp->input, hContext);
+
+       rv = SCardReleaseContext(hContext);
+       if (rv)
+               DEBUG_SCARD("%s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("success 0x%08lx", hContext);
+
+       return rv;
+}
+
+static uint32 handle_IsValidContext(IRP* irp)
+{
+       uint32 rv;
+       SCARDCONTEXT hContext;
+
+       stream_seek(irp->input, 0x1C);
+       stream_read_uint32(irp->input, hContext);
+
+       rv = SCardIsValidContext(hContext);
+
+       if (rv)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success context: 0x%08x", (unsigned) hContext);
+
+       stream_write_uint32(irp->output, rv);
+
+       return rv;
+}
+
+static uint32 handle_ListReaders(IRP* irp, boolean wide)
+{
+       uint32 len, rv;
+       SCARDCONTEXT hContext;
+       DWORD dwReaders;
+       char *readerList = NULL, *walker;
+       int elemLength, dataLength;
+       int pos, poslen1, poslen2;
+
+       stream_seek(irp->input, 8);
+       stream_read_uint32(irp->input, len);
+
+       stream_seek(irp->input, 0x1c);
+       stream_read_uint32(irp->input, len);
+
+       if (len != 4)
+               return SCARD_F_INTERNAL_ERROR;
+
+       stream_read_uint32(irp->input, hContext);
+
+       /* ignore rest of [MS-RDPESC] 2.2.2.4 ListReaders_Call */
+
+       rv = SCARD_S_SUCCESS;
+#ifdef SCARD_AUTOALLOCATE
+       dwReaders = SCARD_AUTOALLOCATE;
+       rv = SCardListReaders(hContext, NULL, (LPSTR) &readerList, &dwReaders);
+#else
+       rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
+
+       readerList = xmalloc(dwReaders);
+       rv = SCardListReaders(hContext, NULL, readerList, &dwReaders);
+#endif
+       if (rv != SCARD_S_SUCCESS)
+       {
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+               return rv;
+       }
+
+/*     DEBUG_SCARD("Success 0x%08x %d %d", (unsigned) hContext, (unsigned) cchReaders, (int) strlen(readerList));*/
+
+       poslen1 = stream_get_pos(irp->output);
+       stream_seek_uint32(irp->output);
+
+       stream_write_uint32(irp->output, 0x01760650);
+
+       poslen2 = stream_get_pos(irp->output);
+       stream_seek_uint32(irp->output);
+
+       walker = readerList;
+       dataLength = 0;
+
+       while (1)
+       {
+               elemLength = strlen(walker);
+               if (elemLength == 0)
+                       break;
+
+               dataLength += sc_output_string(irp, walker, wide);
+               walker += elemLength + 1;
+               elemLength = strlen(walker);
+       }
+
+       dataLength += sc_output_string(irp, "\0", wide);
+
+       pos = stream_get_pos(irp->output);
+
+       stream_set_pos(irp->output, poslen1);
+       stream_write_uint32(irp->output, dataLength);
+       stream_set_pos(irp->output, poslen2);
+       stream_write_uint32(irp->output, dataLength);
+
+       stream_set_pos(irp->output, pos);
+
+       sc_output_repos(irp, dataLength);
+       sc_output_alignment(irp, 8);
+
+#ifdef SCARD_AUTOALLOCATE
+       SCardFreeMemory(hContext, readerList);
+#else
+       xfree(readerList);
+#endif
+
+       return rv;
+}
+
+static uint32 handle_GetStatusChange(IRP* irp, boolean wide)
+{
+       LONG rv;
+       SCARDCONTEXT hContext;
+       DWORD dwTimeout = 0;
+       DWORD readerCount = 0;
+       SCARD_READERSTATE *readerStates, *cur;
+       int i;
+
+       stream_seek(irp->input, 0x18);
+       stream_read_uint32(irp->input, dwTimeout);
+       stream_read_uint32(irp->input, readerCount);
+
+       stream_seek(irp->input, 8);
+
+       stream_read_uint32(irp->input, hContext);
+
+       stream_seek(irp->input, 4);
+
+       DEBUG_SCARD("context: 0x%08x, timeout: 0x%08x, count: %d",
+                    (unsigned) hContext, (unsigned) dwTimeout, (int) readerCount);
+       if (readerCount > 0)
+       {
+               readerStates = xzalloc(readerCount * sizeof(SCARD_READERSTATE));
+               if (!readerStates)
+                       return sc_output_return(irp, SCARD_E_NO_MEMORY);
+
+
+               for (i = 0; i < readerCount; i++)
+               {
+                       cur = &readerStates[i];
+
+                       stream_seek(irp->input, 4);
+
+                       /*
+                        * TODO: on-wire is little endian; need to either
+                        * convert to host endian or fix the headers to
+                        * request the order we want
+                        */
+                       stream_read_uint32(irp->input, cur->dwCurrentState);
+                       stream_read_uint32(irp->input, cur->dwEventState);
+                       stream_read_uint32(irp->input, cur->cbAtr);
+                       stream_read(irp->input, cur->rgbAtr, 32);
+
+                       stream_seek(irp->input, 4);
+
+                       /* reset high bytes? */
+                       cur->dwCurrentState &= 0x0000FFFF;
+                       cur->dwEventState &= 0x0000FFFF;
+                       cur->dwEventState = 0;
+               }
+
+               for (i = 0; i < readerCount; i++)
+               {
+                       cur = &readerStates[i];
+                       uint32 dataLength;
+
+                       stream_seek(irp->input, 8);
+                       stream_read_uint32(irp->input, dataLength);
+                       sc_input_repos(irp, sc_input_string(irp, (char **) &cur->szReader, dataLength, wide));
+
+                       DEBUG_SCARD("   \"%s\"", cur->szReader ? cur->szReader : "NULL");
+                       DEBUG_SCARD("       user: 0x%08x, state: 0x%08x, event: 0x%08x",
+                               (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
+                               (unsigned) cur->dwEventState);
+
+                       if (strcmp(cur->szReader, "\\\\?PnP?\\Notification") == 0)
+                               cur->dwCurrentState |= SCARD_STATE_IGNORE;
+               }
+       }
+       else
+       {
+               readerStates = NULL;
+       }
+
+       rv = SCardGetStatusChange(hContext, (DWORD) dwTimeout, readerStates, (DWORD) readerCount);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success");
+
+       stream_write_uint32(irp->output, readerCount);
+       stream_write_uint32(irp->output, 0x00084dd8);
+       stream_write_uint32(irp->output, readerCount);
+
+       for (i = 0; i < readerCount; i++)
+       {
+               cur = &readerStates[i];
+
+               DEBUG_SCARD("   \"%s\"", cur->szReader ? cur->szReader : "NULL");
+               DEBUG_SCARD("       user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
+                       (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
+                       (unsigned) cur->dwEventState);
+
+               /* TODO: do byte conversions if necessary */
+               stream_write_uint32(irp->output, cur->dwCurrentState);
+               stream_write_uint32(irp->output, cur->dwEventState);
+               stream_write_uint32(irp->output, cur->cbAtr);
+               stream_write(irp->output, cur->rgbAtr, 32);
+
+               stream_write_zero(irp->output, 4);
+
+               xfree((void *)cur->szReader);
+       }
+
+       sc_output_alignment(irp, 8);
+
+       xfree(readerStates);
+       return rv;
+}
+
+static uint32 handle_Cancel(IRP *irp)
+{
+       LONG rv;
+       SCARDCONTEXT hContext;
+
+       stream_seek(irp->input, 0x1C);
+       stream_read_uint32(irp->input, hContext);
+
+       rv = SCardCancel(hContext);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)\n", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success context: 0x%08x %s\n", (unsigned) hContext, pcsc_stringify_error(rv));
+
+       sc_output_alignment(irp, 8);
+
+       return rv;
+}
+
+static uint32 handle_Connect(IRP* irp, boolean wide)
+{
+       LONG rv;
+       SCARDCONTEXT hContext;
+       char *readerName = NULL;
+       DWORD dwShareMode = 0;
+       DWORD dwPreferredProtocol = 0;
+       DWORD dwActiveProtocol = 0;
+       SCARDHANDLE hCard;
+
+       stream_seek(irp->input, 0x1c);
+       stream_read_uint32(irp->input, dwShareMode);
+       stream_read_uint32(irp->input, dwPreferredProtocol);
+
+       sc_input_reader_name(irp, &readerName, wide);
+
+       stream_seek(irp->input, 4);
+       stream_read_uint32(irp->input, hContext);
+
+       DEBUG_SCARD("(context: 0x%08x, share: 0x%08x, proto: 0x%08x, reader: \"%s\")",
+               (unsigned) hContext, (unsigned) dwShareMode,
+               (unsigned) dwPreferredProtocol, readerName ? readerName : "NULL");
+
+       rv = SCardConnect(hContext, readerName, (DWORD) dwShareMode,
+               (DWORD) dwPreferredProtocol, &hCard, (DWORD *) &dwActiveProtocol);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s 0x%08x", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success 0x%08x", (unsigned) hCard);
+
+       stream_write_uint32(irp->output, 0x00000000);
+       stream_write_uint32(irp->output, 0x00000000);
+       stream_write_uint32(irp->output, 0x00000004);
+       stream_write_uint32(irp->output, 0x016Cff34);
+       stream_write_uint32(irp->output, dwActiveProtocol);
+       stream_write_uint32(irp->output, 0x00000004);
+       stream_write_uint32(irp->output, hCard);
+       stream_seek(irp->output, 28);
+
+       sc_output_alignment(irp, 8);
+
+       xfree(readerName);
+       return rv;
+}
+
+static uint32 handle_Reconnect(IRP* irp)
+{
+       LONG rv;
+       SCARDCONTEXT hContext;
+       SCARDHANDLE hCard;
+       DWORD dwShareMode = 0;
+       DWORD dwPreferredProtocol = 0;
+       DWORD dwInitialization = 0;
+       DWORD dwActiveProtocol = 0;
+
+       stream_seek(irp->input, 0x20);
+       stream_read_uint32(irp->input, dwShareMode);
+       stream_read_uint32(irp->input, dwPreferredProtocol);
+       stream_read_uint32(irp->input, dwInitialization);
+
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, hContext);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, hCard);
+
+       DEBUG_SCARD("(context: 0x%08x, hcard: 0x%08x, share: 0x%08x, proto: 0x%08x, init: 0x%08x)",
+               (unsigned) hContext, (unsigned) hCard,
+               (unsigned) dwShareMode, (unsigned) dwPreferredProtocol, (unsigned) dwInitialization);
+
+       rv = SCardReconnect(hCard, (DWORD) dwShareMode, (DWORD) dwPreferredProtocol,
+           (DWORD) dwInitialization, (LPDWORD) &dwActiveProtocol);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success (proto: 0x%08x)", (unsigned) dwActiveProtocol);
+
+       sc_output_alignment(irp, 8);
+       stream_write_uint32(irp->output, dwActiveProtocol); /* reversed? */
+
+       return rv;
+}
+
+static uint32 handle_Disconnect(IRP* irp)
+{
+       LONG rv;
+       SCARDCONTEXT hContext;
+       SCARDHANDLE hCard;
+       DWORD dwDisposition = 0;
+
+       stream_seek(irp->input, 0x20);
+       stream_read_uint32(irp->input, dwDisposition);
+       stream_seek(irp->input, 4);
+       stream_read_uint32(irp->input, hContext);
+       stream_seek(irp->input, 4);
+       stream_read_uint32(irp->input, hCard);
+
+       DEBUG_SCARD("(context: 0x%08x, hcard: 0x%08x, disposition: 0x%08x)",
+               (unsigned) hContext, (unsigned) hCard, (unsigned) dwDisposition);
+
+       rv = SCardDisconnect(hCard, (DWORD) dwDisposition);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success");
+
+       sc_output_alignment(irp, 8);
+
+       return rv;
+}
+
+static uint32 handle_BeginTransaction(IRP* irp)
+{
+       LONG rv;
+       SCARDCONTEXT hCard;
+
+       stream_seek(irp->input, 0x30);
+       stream_read_uint32(irp->input, hCard);
+
+       rv = SCardBeginTransaction(hCard);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success hcard: 0x%08x", (unsigned) hCard);
+
+       sc_output_alignment(irp, 8);
+
+       return rv;
+}
+
+static uint32 handle_EndTransaction(IRP* irp)
+{
+       LONG rv;
+       SCARDCONTEXT hCard;
+       DWORD dwDisposition = 0;
+
+       stream_seek(irp->input, 0x20);
+       stream_read_uint32(irp->input, dwDisposition);
+
+       stream_seek(irp->input, 0x0C);
+       stream_read_uint32(irp->input, hCard);
+
+       rv = SCardEndTransaction(hCard, dwDisposition);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success hcard: 0x%08x", (unsigned) hCard);
+
+       sc_output_alignment(irp, 8);
+
+       return rv;
+}
+
+static uint32 handle_State(IRP* irp)
+{
+       LONG rv;
+       SCARDHANDLE hCard;
+       DWORD state = 0, protocol = 0;
+       DWORD readerLen;
+       DWORD atrLen = MAX_ATR_SIZE;
+       char * readerName;
+       BYTE pbAtr[MAX_ATR_SIZE];
+
+#ifdef WITH_DEBUG_SCARD
+       int i;
+#endif
+
+       stream_seek(irp->input, 0x24);
+       stream_seek_uint32(irp->input); /* atrLen */
+
+       stream_seek(irp->input, 0x0c);
+       stream_read_uint32(irp->input, hCard);
+       stream_seek(irp->input, 0x04);
+
+#ifdef SCARD_AUTOALLOCATE
+       readerLen = SCARD_AUTOALLOCATE;
+
+       rv = SCardStatus(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
+#else
+       readerLen = 256;
+       readerName = xmalloc(readerLen);
+
+       rv = SCardStatus(hCard, (LPSTR) readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
+#endif
+
+       if (rv != SCARD_S_SUCCESS)
+       {
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+               return sc_output_return(irp, rv);
+       }
+
+       DEBUG_SCARD("Success (hcard: 0x%08x len: %d state: 0x%08x, proto: 0x%08x)",
+               (unsigned) hCard, (int) atrLen, (unsigned) state, (unsigned) protocol);
+
+#ifdef WITH_DEBUG_SCARD
+       printf("       ATR: ");
+       for (i = 0; i < atrLen; i++)
+               printf("%02x%c", pbAtr[i], (i == atrLen - 1) ? ' ' : ':');
+       printf("\n");
+#endif
+
+       state = sc_map_state(state);
+
+       stream_write_uint32(irp->output, state);
+       stream_write_uint32(irp->output, protocol);
+       stream_write_uint32(irp->output, atrLen);
+       stream_write_uint32(irp->output, 0x00000001);
+       stream_write_uint32(irp->output, atrLen);
+       stream_write(irp->output, pbAtr, atrLen);
+
+       sc_output_repos(irp, atrLen);
+       sc_output_alignment(irp, 8);
+
+#ifdef SCARD_AUTOALLOCATE
+       xfree(readerName);
+#else
+       xfree(readerName);
+#endif
+
+       return rv;
+}
+
+static DWORD handle_Status(IRP *irp, boolean wide)
+{
+       LONG rv;
+       SCARDHANDLE hCard;
+       DWORD state, protocol;
+       DWORD readerLen = 0;
+       DWORD atrLen = 0;
+       char * readerName;
+       BYTE pbAtr[MAX_ATR_SIZE];
+       uint32 dataLength;
+       int pos, poslen1, poslen2;
+
+#ifdef WITH_DEBUG_SCARD
+       int i;
+#endif
+
+       stream_seek(irp->input, 0x24);
+       stream_read_uint32(irp->input, readerLen);
+       stream_read_uint32(irp->input, atrLen);
+       stream_seek(irp->input, 0x0c);
+       stream_read_uint32(irp->input, hCard);
+       stream_seek(irp->input, 0x4);
+
+       atrLen = MAX_ATR_SIZE;
+
+#ifdef SCARD_AUTOALLOCATE
+       readerLen = SCARD_AUTOALLOCATE;
+
+       rv = SCardStatus(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
+#else
+       readerLen = 256;
+       readerName = xmalloc(readerLen);
+
+       rv = SCardStatus(hCard, (LPSTR) readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
+#endif
+
+       if (rv != SCARD_S_SUCCESS)
+       {
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+               return sc_output_return(irp, rv);
+       }
+
+       DEBUG_SCARD("Success (state: 0x%08x, proto: 0x%08x)", (unsigned) state, (unsigned) protocol);
+       DEBUG_SCARD("       Reader: \"%s\"", readerName ? readerName : "NULL");
+
+#ifdef WITH_DEBUG_SCARD
+       printf("       ATR: ");
+       for (i = 0; i < atrLen; i++)
+               printf("%02x%c", pbAtr[i], (i == atrLen - 1) ? ' ' : ':');
+       printf("\n");
+#endif
+
+       state = sc_map_state(state);
+
+       poslen1 = stream_get_pos(irp->output);
+       stream_write_uint32(irp->output, readerLen);
+       stream_write_uint32(irp->output, 0x00020000);
+       stream_write_uint32(irp->output, state);
+       stream_write_uint32(irp->output, protocol);
+       stream_write(irp->output, pbAtr, atrLen);
+
+       if (atrLen < 32)
+               stream_write_zero(irp->output, 32 - atrLen);
+       stream_write_uint32(irp->output, atrLen);
+
+       poslen2 = stream_get_pos(irp->output);
+       stream_write_uint32(irp->output, readerLen);
+
+       dataLength = sc_output_string(irp, readerName, wide);
+       dataLength += sc_output_string(irp, "\0", wide);
+       sc_output_repos(irp, dataLength);
+
+       pos = stream_get_pos(irp->output);
+       stream_set_pos(irp->output, poslen1);
+       stream_write_uint32(irp->output,dataLength);
+       stream_set_pos(irp->output, poslen2);
+       stream_write_uint32(irp->output,dataLength);
+       stream_set_pos(irp->output, pos);
+
+       sc_output_alignment(irp, 8);
+
+#ifdef SCARD_AUTOALLOCATE
+       /* SCardFreeMemory(NULL, readerName); */
+       free(readerName);
+#else
+       xfree(readerName);
+#endif
+
+       return rv;
+}
+
+static uint32 handle_Transmit(IRP* irp)
+{
+       LONG rv;
+       SCARDCONTEXT hCard;
+       uint32 map[7], linkedLen;
+       SCARD_IO_REQUEST pioSendPci, pioRecvPci, *pPioRecvPci;
+       DWORD cbSendLength = 0, cbRecvLength = 0;
+       BYTE *sendBuf = NULL, *recvBuf = NULL;
+
+       stream_seek(irp->input, 0x14);
+       stream_read_uint32(irp->input, map[0]);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, map[1]);
+
+       stream_read_uint32(irp->input, pioSendPci.dwProtocol);
+       stream_read_uint32(irp->input, pioSendPci.cbPciLength);
+
+       stream_read_uint32(irp->input, map[2]);
+       stream_read_uint32(irp->input, cbSendLength);
+       stream_read_uint32(irp->input, map[3]);
+       stream_read_uint32(irp->input, map[4]);
+       stream_read_uint32(irp->input, map[5]);
+       stream_read_uint32(irp->input, cbRecvLength);
+
+       if (map[0] & SCARD_INPUT_LINKED)
+               sc_input_skip_linked(irp);
+
+       stream_seek(irp->input, 4);
+       stream_read_uint32(irp->input, hCard);
+
+       if (map[2] & SCARD_INPUT_LINKED)
+       {
+               /* sendPci */
+               stream_read_uint32(irp->input, linkedLen);
+
+               stream_read_uint32(irp->input, pioSendPci.dwProtocol);
+               stream_seek(irp->input, linkedLen - 4);
+
+               sc_input_repos(irp, linkedLen);
+       }
+       pioSendPci.cbPciLength = sizeof(SCARD_IO_REQUEST);
+
+       if (map[3] & SCARD_INPUT_LINKED)
+       {
+               /* send buffer */
+               stream_read_uint32(irp->input, linkedLen);
+
+               sendBuf = xmalloc(linkedLen);
+               stream_read(irp->input, sendBuf, linkedLen);
+               sc_input_repos(irp, linkedLen);
+       }
+
+       if (cbRecvLength)
+               recvBuf = xmalloc(cbRecvLength);
+
+       if (map[4] & SCARD_INPUT_LINKED)
+       {
+               /* recvPci */
+               stream_read_uint32(irp->input, linkedLen);
+
+               stream_read_uint32(irp->input, pioRecvPci.dwProtocol);
+               stream_seek(irp->input, linkedLen - 4);
+
+               sc_input_repos(irp, linkedLen);
+
+               stream_read_uint32(irp->input, map[6]);
+               if (map[6] & SCARD_INPUT_LINKED)
+               {
+                       /* not sure what this is */
+                       stream_read_uint32(irp->input, linkedLen);
+                       stream_seek(irp->input, linkedLen);
+
+                       sc_input_repos(irp, linkedLen);
+               }
+               pioRecvPci.cbPciLength = sizeof(SCARD_IO_REQUEST);
+               pPioRecvPci = &pioRecvPci;
+       }
+       else
+       {
+               pPioRecvPci = NULL;
+       }
+       pPioRecvPci = NULL;
+
+       DEBUG_SCARD("SCardTransmit(hcard: 0x%08lx, send: %d bytes, recv: %d bytes)",
+               (long unsigned) hCard, (int) cbSendLength, (int) cbRecvLength);
+
+       rv = SCardTransmit(hCard, &pioSendPci, sendBuf, cbSendLength,
+                          pPioRecvPci, recvBuf, &cbRecvLength);
+
+       if (rv != SCARD_S_SUCCESS)
+       {
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       }
+       else
+       {
+               DEBUG_SCARD("Success (%d bytes)", (int) cbRecvLength);
+
+               stream_write_uint32(irp->output, 0);    /* pioRecvPci 0x00; */
+
+               sc_output_buffer_start(irp, cbRecvLength);      /* start of recvBuf output */
+
+               sc_output_buffer(irp, (char *) recvBuf, cbRecvLength);
+       }
+
+       sc_output_alignment(irp, 8);
+
+       xfree(sendBuf);
+       xfree(recvBuf);
+
+       return rv;
+}
+
+static uint32 handle_Control(IRP* irp)
+{
+       LONG rv;
+       SCARDCONTEXT hContext;
+       SCARDHANDLE hCard;
+       uint32 map[3];
+       uint32 controlCode;
+       uint32 controlFunction;
+       BYTE *recvBuffer = NULL, *sendBuffer = NULL;
+       uint32 recvLength;
+       DWORD nBytesReturned;
+       DWORD outBufferSize;
+
+       stream_seek(irp->input, 0x14);
+       stream_read_uint32(irp->input, map[0]);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, map[1]);
+       stream_read_uint32(irp->input, controlCode);
+       stream_read_uint32(irp->input, recvLength);
+       stream_read_uint32(irp->input, map[2]);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, outBufferSize);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, hContext);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, hCard);
+
+       /* Translate Windows SCARD_CTL_CODE's to corresponding local code */
+       if (WIN_CTL_DEVICE_TYPE(controlCode) == WIN_FILE_DEVICE_SMARTCARD)
+       {
+               controlFunction = WIN_CTL_FUNCTION(controlCode);
+               controlCode = SCARD_CTL_CODE(controlFunction);
+       }
+       DEBUG_SCARD("controlCode: 0x%08x", (unsigned) controlCode);
+
+       if (map[2] & SCARD_INPUT_LINKED)
+       {
+               /* read real input size */
+               stream_read_uint32(irp->input, recvLength);
+
+               recvBuffer = xmalloc(recvLength);
+
+               if (!recvBuffer)
+                       return sc_output_return(irp, SCARD_E_NO_MEMORY);
+
+               stream_read(irp->input, recvBuffer, recvLength);
+       }
+
+       nBytesReturned = outBufferSize;
+       sendBuffer = xmalloc(outBufferSize);
+
+       if (!sendBuffer)
+               return sc_output_return(irp, SCARD_E_NO_MEMORY);
+
+       rv = SCardControl(hCard, (DWORD) controlCode, recvBuffer, (DWORD) recvLength,
+               sendBuffer, (DWORD) outBufferSize, &nBytesReturned);
+
+       if (rv != SCARD_S_SUCCESS)
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned) rv);
+       else
+               DEBUG_SCARD("Success (out: %u bytes)", (unsigned) nBytesReturned);
+
+       stream_write_uint32(irp->output, (uint32) nBytesReturned);
+       stream_write_uint32(irp->output, 0x00000004);
+       stream_write_uint32(irp->output, nBytesReturned);
+
+       if (nBytesReturned > 0)
+       {
+               stream_write(irp->output, sendBuffer, nBytesReturned);
+               sc_output_repos(irp, nBytesReturned);
+       }
+
+       sc_output_alignment(irp, 8);
+
+       xfree(recvBuffer);
+       xfree(sendBuffer);
+
+       return rv;
+}
+
+static uint32 handle_GetAttrib(IRP* irp)
+{
+       LONG rv;
+       SCARDHANDLE hCard;
+       DWORD dwAttrId = 0, dwAttrLen = 0;
+       DWORD attrLen = 0;
+       uint8* pbAttr = NULL;
+
+       stream_seek(irp->input, 0x20);
+       stream_read_uint32(irp->input, dwAttrId);
+       stream_seek(irp->input, 0x4);
+       stream_read_uint32(irp->input, dwAttrLen);
+       stream_seek(irp->input, 0xC);
+       stream_read_uint32(irp->input, hCard);
+
+       DEBUG_SCARD("hcard: 0x%08x, attrib: 0x%08x (%d bytes)\n",
+               (unsigned) hCard, (unsigned) dwAttrId, (int) dwAttrLen);
+
+#ifdef SCARD_AUTOALLOCATE
+       if(dwAttrLen == 0)
+       {
+               attrLen = 0;
+       }
+       else
+       {
+               attrLen = SCARD_AUTOALLOCATE;
+       }
+#endif
+
+       rv = SCardGetAttrib(hCard, dwAttrId, attrLen == 0 ? NULL : (uint8*) &pbAttr, &attrLen);
+       if( rv != SCARD_S_SUCCESS ) {
+#ifdef SCARD_AUTOALLOCATE
+               if(dwAttrLen == 0)
+               {
+                       attrLen = 0;
+               }
+               else
+               {
+                       attrLen = SCARD_AUTOALLOCATE;
+               }
+#endif
+       }
+
+       if(dwAttrId == SCARD_ATTR_DEVICE_FRIENDLY_NAME_A && rv == SCARD_E_UNSUPPORTED_FEATURE)
+       {
+               rv = SCardGetAttrib(hCard, SCARD_ATTR_DEVICE_FRIENDLY_NAME_W,
+                       attrLen == 0 ? NULL : (uint8*) &pbAttr, &attrLen);
+               if( rv != SCARD_S_SUCCESS ) {
+#ifdef SCARD_AUTOALLOCATE
+                       if(dwAttrLen == 0)
+                       {
+                               attrLen = 0;
+                       }
+                       else
+                       {
+                               attrLen = SCARD_AUTOALLOCATE;
+                       }
+#endif
+               }
+       }
+       if(dwAttrId == SCARD_ATTR_DEVICE_FRIENDLY_NAME_W && rv == SCARD_E_UNSUPPORTED_FEATURE)
+       {
+               rv = SCardGetAttrib(hCard, SCARD_ATTR_DEVICE_FRIENDLY_NAME_A,
+                       attrLen == 0 ? NULL : (uint8*) &pbAttr, &attrLen);
+               if( rv != SCARD_S_SUCCESS ) {
+#ifdef SCARD_AUTOALLOCATE
+                       if(dwAttrLen == 0)
+                       {
+                               attrLen = 0;
+                       }
+                       else
+                       {
+                               attrLen = SCARD_AUTOALLOCATE;
+                       }
+#endif
+               }
+       }
+       if(attrLen > dwAttrLen && pbAttr != NULL)
+       {
+               rv = SCARD_E_INSUFFICIENT_BUFFER;
+       }
+       dwAttrLen = attrLen;
+
+       if (rv != SCARD_S_SUCCESS)
+       {
+               DEBUG_SCARD("Failure: %s (0x%08x)", pcsc_stringify_error(rv), (unsigned int) rv);
+               free(pbAttr);
+               return sc_output_return(irp, rv);
+       }
+       else
+       {
+               DEBUG_SCARD("Success (%d bytes)", (int) dwAttrLen);
+
+               stream_write_uint32(irp->output, dwAttrLen);
+               stream_write_uint32(irp->output, 0x00000200);
+               stream_write_uint32(irp->output, dwAttrLen);
+
+               if (!pbAttr)
+               {
+                       stream_write_zero(irp->output, dwAttrLen);
+               }
+               else
+               {
+                       stream_write(irp->output, pbAttr, dwAttrLen);
+               }
+               sc_output_repos(irp, dwAttrLen);
+               /* align to multiple of 4 */
+               stream_write_uint32(irp->output, 0);
+       }
+       sc_output_alignment(irp, 8);
+
+       xfree(pbAttr);
+
+       return rv;
+}
+
+static uint32 handle_AccessStartedEvent(IRP* irp)
+{
+       stream_write_zero(irp->output, 8);
+       return SCARD_S_SUCCESS;
+}
+
+void scard_error(SCARD_DEVICE* scard, IRP* irp, uint32 ntstatus)
+{
+       /* [MS-RDPESC] 3.1.4.4 */
+       printf("scard processing error %x\n", ntstatus);
+
+       stream_set_pos(irp->output, 0); /* CHECKME */
+       irp->IoStatus = ntstatus;
+       irp->Complete(irp);
+}
+
+/* http://msdn.microsoft.com/en-gb/library/ms938473.aspx */
+typedef struct _SERVER_SCARD_ATRMASK
+{
+       uint32 cbAtr;
+       uint8 rgbAtr[36];
+       uint8 rgbMask[36];
+}
+SERVER_SCARD_ATRMASK;
+
+static uint32 handle_LocateCardsByATR(IRP* irp, boolean wide)
+{
+       LONG rv;
+       int i, j, k;
+       SCARDCONTEXT hContext;
+       uint32 atrMaskCount = 0;
+       uint32 readerCount = 0;
+       SCARD_READERSTATE* cur = NULL;
+       SCARD_READERSTATE* rsCur = NULL;
+       SCARD_READERSTATE* readerStates = NULL;
+       SERVER_SCARD_ATRMASK* curAtr = NULL;
+       SERVER_SCARD_ATRMASK* pAtrMasks = NULL;
+
+       stream_seek(irp->input, 0x2C);
+       stream_read_uint32(irp->input, hContext);
+       stream_read_uint32(irp->input, atrMaskCount);
+
+       pAtrMasks = xmalloc(atrMaskCount * sizeof(SERVER_SCARD_ATRMASK));
+
+       if (!pAtrMasks)
+               return sc_output_return(irp, SCARD_E_NO_MEMORY);
+
+       for (i = 0; i < atrMaskCount; i++)
+       {
+               stream_read_uint32(irp->input, pAtrMasks[i].cbAtr);
+               stream_read(irp->input, pAtrMasks[i].rgbAtr, 36);
+               stream_read(irp->input, pAtrMasks[i].rgbMask, 36);
+       }
+
+       stream_read_uint32(irp->input, readerCount);
+
+       readerStates = xzalloc(readerCount * sizeof(SCARD_READERSTATE));
+
+       if (!readerStates)
+               return sc_output_return(irp, SCARD_E_NO_MEMORY);
+
+       for (i = 0; i < readerCount; i++)
+       {
+               cur = &readerStates[i];
+
+               stream_seek(irp->input, 4);
+
+               /*
+                * TODO: on-wire is little endian; need to either
+                * convert to host endian or fix the headers to
+                * request the order we want
+                */
+               stream_read_uint32(irp->input, cur->dwCurrentState);
+               stream_read_uint32(irp->input, cur->dwEventState);
+               stream_read_uint32(irp->input, cur->cbAtr);
+               stream_read(irp->input, cur->rgbAtr, 32);
+
+               stream_seek(irp->input, 4);
+
+               /* reset high bytes? */
+               cur->dwCurrentState &= 0x0000FFFF;
+               cur->dwEventState &= 0x0000FFFF;
+               cur->dwEventState = 0;
+       }
+
+       for (i = 0; i < readerCount; i++)
+       {
+               cur = &readerStates[i];
+               uint32 dataLength;
+
+               stream_seek(irp->input, 8);
+               stream_read_uint32(irp->input, dataLength);
+               sc_input_repos(irp, sc_input_string(irp, (char **) &cur->szReader, dataLength, wide));
+
+               DEBUG_SCARD("   \"%s\"", cur->szReader ? cur->szReader : "NULL");
+               DEBUG_SCARD("       user: 0x%08x, state: 0x%08x, event: 0x%08x",
+                               (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
+                               (unsigned) cur->dwEventState);
+
+               if (strcmp(cur->szReader, "\\\\?PnP?\\Notification") == 0)
+                       cur->dwCurrentState |= SCARD_STATE_IGNORE;
+       }
+
+       rv = SCardGetStatusChange(hContext, 0x00000001, readerStates, readerCount);
+       if (rv != SCARD_S_SUCCESS)
+       {
+               DEBUG_SCARD("Failure: %s (0x%08x)",
+                       pcsc_stringify_error(rv), (unsigned) rv);
+
+               return sc_output_return(irp, rv);
+       }
+
+       DEBUG_SCARD("Success");
+       for (i = 0, curAtr = pAtrMasks; i < atrMaskCount; i++, curAtr++)
+       {
+               for (j = 0, rsCur = readerStates; j < readerCount; j++, rsCur++)
+               {
+                       boolean equal = 1;
+                       for (k = 0; k < cur->cbAtr; k++)
+                       {
+                               if ((curAtr->rgbAtr[k] & curAtr->rgbMask[k]) !=
+                                   (rsCur->rgbAtr[k] & curAtr->rgbMask[k]))
+                               {
+                                       equal = 0;
+                                       break;
+                               }
+                       }
+                       if (equal)
+                       {
+                               rsCur->dwEventState |= 0x00000040;      /* SCARD_STATE_ATRMATCH 0x00000040 */
+                       }
+               }
+       }
+
+       stream_write_uint32(irp->output, readerCount);
+       stream_write_uint32(irp->output, 0x00084dd8);
+       stream_write_uint32(irp->output, readerCount);
+
+       for (i = 0, rsCur = readerStates; i < readerCount; i++, rsCur++)
+       {
+               stream_write_uint32(irp->output, cur->dwCurrentState);
+               stream_write_uint32(irp->output, cur->dwEventState);
+               stream_write_uint32(irp->output, cur->cbAtr);
+               stream_write(irp->output, cur->rgbAtr, 32);
+
+               stream_write_zero(irp->output, 4);
+
+               xfree((void*) cur->szReader);
+       }
+
+       sc_output_alignment(irp, 8);
+
+       free(readerStates);
+
+       return rv;
+}
+
+boolean scard_async_op(IRP* irp)
+{
+       uint32 ioctl_code;
+
+       /* peek ahead */
+       stream_seek(irp->input, 8);
+       stream_read_uint32(irp->input, ioctl_code);
+       stream_rewind(irp->input, 12);
+
+       switch (ioctl_code)
+       {
+               /* non-blocking events */
+               case SCARD_IOCTL_ACCESS_STARTED_EVENT:
+
+               case SCARD_IOCTL_ESTABLISH_CONTEXT:
+               case SCARD_IOCTL_RELEASE_CONTEXT:
+               case SCARD_IOCTL_IS_VALID_CONTEXT:
+
+                       return false;
+                       break;
+
+               /* async events */
+               case SCARD_IOCTL_GET_STATUS_CHANGE:
+               case SCARD_IOCTL_GET_STATUS_CHANGE + 4:
+
+               case SCARD_IOCTL_TRANSMIT:
+
+               case SCARD_IOCTL_STATUS:
+               case SCARD_IOCTL_STATUS + 4:
+                       return true;
+                       break;
+
+               default:
+                       break;
+       }       
+
+       /* default to async */
+       return true;
+}
+
+void scard_device_control(SCARD_DEVICE* scard, IRP* irp)
+{
+       uint32 output_len, input_len, ioctl_code;
+       uint32 stream_len, result;
+       uint32 pos, pad_len;
+       uint32 irp_len;
+       uint32 irp_result_pos, output_len_pos, result_pos;
+
+       stream_read_uint32(irp->input, output_len);
+       stream_read_uint32(irp->input, input_len);
+       stream_read_uint32(irp->input, ioctl_code);
+
+       stream_seek(irp->input, 20);    /* padding */
+
+       // stream_seek(irp->input, 4);  /* TODO: parse len, le, v1 */
+       // stream_seek(irp->input, 4);  /* 0xcccccccc */
+       // stream_seek(irp->input, 4);  /* rpce len */
+
+       /* [MS-RDPESC] 3.2.5.1 Sending Outgoing Messages */
+       stream_extend(irp->output, 2048);
+
+       irp_result_pos = stream_get_pos(irp->output);
+
+       stream_write_uint32(irp->output, 0x00081001); /* len 8, LE, v1 */
+
+       /* [MS-RPCE] 2.2.6.1 */
+       stream_write_uint32(irp->output, 0x00081001); /* len 8, LE, v1 */
+       stream_write_uint32(irp->output, 0xcccccccc); /* filler */
+
+       output_len_pos = stream_get_pos(irp->output);
+       stream_seek(irp->output, 4);            /* size */
+
+       stream_write_uint32(irp->output, 0x0);  /* filler */
+
+       result_pos = stream_get_pos(irp->output);
+       stream_seek(irp->output, 4);            /* result */
+
+       /* body */
+       switch (ioctl_code)
+       {
+               case SCARD_IOCTL_ESTABLISH_CONTEXT:
+                       result = handle_EstablishContext(irp);
+                       break;
+
+               case SCARD_IOCTL_IS_VALID_CONTEXT:
+                       result = handle_IsValidContext(irp);
+                       break;
+
+               case SCARD_IOCTL_RELEASE_CONTEXT:
+                       result = handle_ReleaseContext(irp);
+                       break;
+
+               case SCARD_IOCTL_LIST_READERS:
+                       result = handle_ListReaders(irp, 0);
+                       break;
+               case SCARD_IOCTL_LIST_READERS + 4:
+                       result = handle_ListReaders(irp, 1);
+                       break;
+
+               case SCARD_IOCTL_LIST_READER_GROUPS:
+               case SCARD_IOCTL_LIST_READER_GROUPS + 4:
+                       /* typically not used unless list_readers fail */
+                       result = SCARD_F_INTERNAL_ERROR;
+                       break;
+
+               case SCARD_IOCTL_GET_STATUS_CHANGE:
+                       result = handle_GetStatusChange(irp, 0);
+                       break;
+               case SCARD_IOCTL_GET_STATUS_CHANGE + 4:
+                       result = handle_GetStatusChange(irp, 1);
+                       break;
+
+               case SCARD_IOCTL_CANCEL:
+                       result = handle_Cancel(irp);
+                       break;
+
+               case SCARD_IOCTL_CONNECT:
+                       result = handle_Connect(irp, 0);
+                       break;
+               case SCARD_IOCTL_CONNECT + 4:
+                       result = handle_Connect(irp, 1);
+                       break;
+
+               case SCARD_IOCTL_RECONNECT:
+                       result = handle_Reconnect(irp);
+                       break;
+
+               case SCARD_IOCTL_DISCONNECT:
+                       result = handle_Disconnect(irp);
+                       break;
+
+               case SCARD_IOCTL_BEGIN_TRANSACTION:
+                       result = handle_BeginTransaction(irp);
+                       break;
+
+               case SCARD_IOCTL_END_TRANSACTION:
+                       result = handle_EndTransaction(irp);
+                       break;
+
+               case SCARD_IOCTL_STATE:
+                       result = handle_State(irp);
+                       break;
+
+               case SCARD_IOCTL_STATUS:
+                       result = handle_Status(irp, 0);
+                       break;
+               case SCARD_IOCTL_STATUS + 4:
+                       result = handle_Status(irp, 1);
+                       break;
+
+               case SCARD_IOCTL_TRANSMIT:
+                       result = handle_Transmit(irp);
+                       break;
+
+               case SCARD_IOCTL_CONTROL:
+                       result = handle_Control(irp);
+                       break;
+
+               case SCARD_IOCTL_GETATTRIB:
+                       result = handle_GetAttrib(irp);
+                       break;
+
+               case SCARD_IOCTL_ACCESS_STARTED_EVENT:
+                       result = handle_AccessStartedEvent(irp);
+                       break;
+
+               case SCARD_IOCTL_LOCATE_CARDS_BY_ATR:
+                       result = handle_LocateCardsByATR(irp, 0);
+                       break;
+               case SCARD_IOCTL_LOCATE_CARDS_BY_ATR + 4:
+                       result = handle_LocateCardsByATR(irp, 1);
+                       break;
+
+               default:
+                       result = 0xc0000001;
+                       printf("scard unknown ioctl 0x%x\n", ioctl_code);
+                       break;
+       }
+
+       /* look for NTSTATUS errors */
+       if ((result & 0xc0000000) == 0xc0000000)
+               return scard_error(scard, irp, result);
+
+       /* per Ludovic Rousseau, map different usage of this particular
+        * error code between pcsc-lite & windows */
+       if (result == 0x8010001F)
+               result = 0x80100022;
+
+       /* handle response packet */
+       pos = stream_get_pos(irp->output);
+       stream_len = pos - irp_result_pos - 4;
+
+       stream_set_pos(irp->output, output_len_pos);
+       stream_write_uint32(irp->output, stream_len - 24);
+
+       stream_set_pos(irp->output, result_pos);
+       stream_write_uint32(irp->output, result);
+
+       stream_set_pos(irp->output, pos);
+
+       /* pad stream to 16 byte align */
+       pad_len = stream_len % 16;
+       stream_write_zero(irp->output, pad_len);
+       pos = stream_get_pos(irp->output);
+       irp_len = stream_len + pad_len;
+
+       stream_set_pos(irp->output, irp_result_pos);
+       stream_write_uint32(irp->output, irp_len);
+       stream_set_pos(irp->output, pos);
+
+#ifdef WITH_DEBUG_SCARD
+       freerdp_hexdump(stream_get_data(irp->output), stream_get_length(irp->output));
+#endif
+       irp->IoStatus = 0;
+
+       irp->Complete(irp);
+
+}
diff --git a/channels/rdpsnd/CMakeLists.txt b/channels/rdpsnd/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3065ac6
--- /dev/null
@@ -0,0 +1,39 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(RDPSND_SRCS
+       rdpsnd_main.c
+       rdpsnd_main.h
+)
+
+add_library(rdpsnd ${RDPSND_SRCS})
+set_target_properties(rdpsnd PROPERTIES PREFIX "")
+
+target_link_libraries(rdpsnd freerdp-utils)
+
+install(TARGETS rdpsnd DESTINATION ${FREERDP_PLUGIN_PATH})
+
+if(WITH_ALSA)
+       add_subdirectory(alsa)
+endif()
+
+if(WITH_PULSEAUDIO)
+       add_subdirectory(pulse)
+endif()
+
diff --git a/channels/rdpsnd/alsa/CMakeLists.txt b/channels/rdpsnd/alsa/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4d6deb4
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(RDPSND_ALSA_SRCS
+       rdpsnd_alsa.c
+)
+
+include_directories(..)
+include_directories(${ALSA_INCLUDE_DIRS})
+
+add_library(rdpsnd_alsa ${RDPSND_ALSA_SRCS})
+set_target_properties(rdpsnd_alsa PROPERTIES PREFIX "")
+
+target_link_libraries(rdpsnd_alsa freerdp-utils)
+target_link_libraries(rdpsnd_alsa ${ALSA_LIBRARIES})
+
+install(TARGETS rdpsnd_alsa DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpsnd/alsa/rdpsnd_alsa.c b/channels/rdpsnd/alsa/rdpsnd_alsa.c
new file mode 100644 (file)
index 0000000..e7ae03d
--- /dev/null
@@ -0,0 +1,360 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Output Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <alsa/asoundlib.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/dsp.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpsnd_main.h"
+
+typedef struct rdpsnd_alsa_plugin rdpsndAlsaPlugin;
+struct rdpsnd_alsa_plugin
+{
+       rdpsndDevicePlugin device;
+
+       char* device_name;
+       snd_pcm_t* out_handle;
+       uint32 source_rate;
+       uint32 actual_rate;
+       snd_pcm_format_t format;
+       uint32 source_channels;
+       uint32 actual_channels;
+       int bytes_per_channel;
+       int wformat;
+       int block_size;
+       int latency;
+       ADPCM adpcm;
+};
+
+static void rdpsnd_alsa_set_params(rdpsndAlsaPlugin* alsa)
+{
+       snd_pcm_hw_params_t* hw_params;
+       snd_pcm_sw_params_t* sw_params;
+       int error;
+       snd_pcm_uframes_t frames;
+       snd_pcm_uframes_t start_threshold;
+
+       snd_pcm_drop(alsa->out_handle);
+
+       error = snd_pcm_hw_params_malloc(&hw_params);
+       if (error < 0)
+       {
+               DEBUG_WARN("snd_pcm_hw_params_malloc failed");
+               return;
+       }
+       snd_pcm_hw_params_any(alsa->out_handle, hw_params);
+       snd_pcm_hw_params_set_access(alsa->out_handle, hw_params,
+               SND_PCM_ACCESS_RW_INTERLEAVED);
+       snd_pcm_hw_params_set_format(alsa->out_handle, hw_params,
+               alsa->format);
+       snd_pcm_hw_params_set_rate_near(alsa->out_handle, hw_params,
+               &alsa->actual_rate, NULL);
+       snd_pcm_hw_params_set_channels_near(alsa->out_handle, hw_params,
+               &alsa->actual_channels);
+       if (alsa->latency < 0)
+               frames = alsa->actual_rate * 4; /* Default to 4-second buffer */
+       else
+               frames = alsa->latency * alsa->actual_rate * 2 / 1000; /* Double of the latency */
+       if (frames < alsa->actual_rate / 2)
+               frames = alsa->actual_rate / 2; /* Minimum 0.5-second buffer */
+       snd_pcm_hw_params_set_buffer_size_near(alsa->out_handle, hw_params,
+               &frames);
+       snd_pcm_hw_params(alsa->out_handle, hw_params);
+       snd_pcm_hw_params_free(hw_params);
+
+       error = snd_pcm_sw_params_malloc(&sw_params);
+       if (error < 0)
+       {
+               DEBUG_WARN("snd_pcm_sw_params_malloc failed");
+               return;
+       }
+       snd_pcm_sw_params_current(alsa->out_handle, sw_params);
+       if (alsa->latency == 0)
+               start_threshold = 0;
+       else
+               start_threshold = frames / 2;
+       snd_pcm_sw_params_set_start_threshold(alsa->out_handle, sw_params, start_threshold);
+       snd_pcm_sw_params(alsa->out_handle, sw_params);
+       snd_pcm_sw_params_free(sw_params);
+
+       snd_pcm_prepare(alsa->out_handle);
+
+       DEBUG_SVC("hardware buffer %d frames, playback buffer %.2g seconds",
+               (int)frames, (double)frames / 2.0 / (double)alsa->actual_rate);
+       if ((alsa->actual_rate != alsa->source_rate) ||
+               (alsa->actual_channels != alsa->source_channels))
+       {
+               DEBUG_SVC("actual rate %d / channel %d is different from source rate %d / channel %d, resampling required.",
+                       alsa->actual_rate, alsa->actual_channels, alsa->source_rate, alsa->source_channels);
+       }
+}
+
+static void rdpsnd_alsa_set_format(rdpsndDevicePlugin* device, rdpsndFormat* format, int latency)
+{
+       rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*)device;
+
+       if (format != NULL)
+       {
+               alsa->source_rate = format->nSamplesPerSec;
+               alsa->actual_rate = format->nSamplesPerSec;
+               alsa->source_channels = format->nChannels;
+               alsa->actual_channels = format->nChannels;
+               switch (format->wFormatTag)
+               {
+                       case 1: /* PCM */
+                               switch (format->wBitsPerSample)
+                               {
+                                       case 8:
+                                               alsa->format = SND_PCM_FORMAT_S8;
+                                               alsa->bytes_per_channel = 1;
+                                               break;
+                                       case 16:
+                                               alsa->format = SND_PCM_FORMAT_S16_LE;
+                                               alsa->bytes_per_channel = 2;
+                                               break;
+                               }
+                               break;
+
+                       case 0x11: /* IMA ADPCM */
+                               alsa->format = SND_PCM_FORMAT_S16_LE;
+                               alsa->bytes_per_channel = 2;
+                               break;
+               }
+               alsa->wformat = format->wFormatTag;
+               alsa->block_size = format->nBlockAlign;
+       }
+
+       alsa->latency = latency;
+
+       rdpsnd_alsa_set_params(alsa);
+}
+
+static void rdpsnd_alsa_open(rdpsndDevicePlugin* device, rdpsndFormat* format, int latency)
+{
+       rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*)device;
+       int error;
+
+       if (alsa->out_handle != 0)
+               return;
+
+       DEBUG_SVC("opening");
+
+       error = snd_pcm_open(&alsa->out_handle, alsa->device_name,
+               SND_PCM_STREAM_PLAYBACK, 0);
+       if (error < 0)
+       {
+               DEBUG_WARN("snd_pcm_open failed");
+       }
+       else
+       {
+               memset(&alsa->adpcm, 0, sizeof(ADPCM));
+               rdpsnd_alsa_set_format(device, format, latency);
+       }
+}
+
+static void rdpsnd_alsa_close(rdpsndDevicePlugin* device)
+{
+       rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*)device;
+
+       if (alsa->out_handle != 0)
+       {
+               DEBUG_SVC("close");
+               snd_pcm_drain(alsa->out_handle);
+               snd_pcm_close(alsa->out_handle);
+               alsa->out_handle = 0;
+       }
+}
+
+static void rdpsnd_alsa_free(rdpsndDevicePlugin* device)
+{
+       rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*)device;
+
+       rdpsnd_alsa_close(device);
+       xfree(alsa->device_name);
+       xfree(alsa);
+}
+
+static boolean rdpsnd_alsa_format_supported(rdpsndDevicePlugin* device, rdpsndFormat* format)
+{
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       if (format->cbSize == 0 &&
+                               format->nSamplesPerSec <= 48000 &&
+                               (format->wBitsPerSample == 8 || format->wBitsPerSample == 16) &&
+                               (format->nChannels == 1 || format->nChannels == 2))
+                       {
+                               return true;
+                       }
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       if (format->nSamplesPerSec <= 48000 &&
+                               format->wBitsPerSample == 4 &&
+                               (format->nChannels == 1 || format->nChannels == 2))
+                       {
+                               return true;
+                       }
+                       break;
+       }
+       return false;
+}
+
+static void rdpsnd_alsa_set_volume(rdpsndDevicePlugin* device, uint32 value)
+{
+}
+
+static void rdpsnd_alsa_play(rdpsndDevicePlugin* device, uint8* data, int size)
+{
+       rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*)device;
+       uint8* decoded_data;
+       int decoded_size;
+       uint8* src;
+       uint8* resampled_data;
+       int len;
+       int error;
+       int frames;
+       int rbytes_per_frame;
+       int sbytes_per_frame;
+       uint8* pindex;
+       uint8* end;
+
+       if (alsa->out_handle == 0)
+               return;
+
+       if (alsa->wformat == 0x11)
+       {
+               decoded_data = dsp_decode_ima_adpcm(&alsa->adpcm,
+                       data, size, alsa->source_channels, alsa->block_size, &decoded_size);
+               size = decoded_size;
+               src = decoded_data;
+       }
+       else
+       {
+               decoded_data = NULL;
+               src = data;
+       }
+
+       sbytes_per_frame = alsa->source_channels * alsa->bytes_per_channel;
+       rbytes_per_frame = alsa->actual_channels * alsa->bytes_per_channel;
+       if ((size % sbytes_per_frame) != 0)
+       {
+               DEBUG_WARN("error len mod");
+               return;
+       }
+
+       if ((alsa->source_rate == alsa->actual_rate) &&
+               (alsa->source_channels == alsa->actual_channels))
+       {
+               resampled_data = NULL;
+       }
+       else
+       {
+               resampled_data = dsp_resample(src, alsa->bytes_per_channel,
+                       alsa->source_channels, alsa->source_rate, size / sbytes_per_frame,
+                       alsa->actual_channels, alsa->actual_rate, &frames);
+               DEBUG_SVC("resampled %d frames at %d to %d frames at %d",
+                       size / sbytes_per_frame, alsa->source_rate, frames, alsa->actual_rate);
+               size = frames * rbytes_per_frame;
+               src = resampled_data;
+       }
+
+       pindex = src;
+       end = pindex + size;
+       while (pindex < end)
+       {
+               len = end - pindex;
+               frames = len / rbytes_per_frame;
+               error = snd_pcm_writei(alsa->out_handle, pindex, frames);
+               if (error == -EPIPE)
+               {
+                       snd_pcm_recover(alsa->out_handle, error, 0);
+                       error = 0;
+               }
+               else if (error < 0)
+               {
+                       DEBUG_WARN("error %d", error);
+                       snd_pcm_close(alsa->out_handle);
+                       alsa->out_handle = 0;
+                       rdpsnd_alsa_open(device, NULL, alsa->latency);
+                       break;
+               }
+               pindex += error * rbytes_per_frame;
+       }
+
+       if (resampled_data)
+               xfree(resampled_data);
+       if (decoded_data)
+               xfree(decoded_data);
+}
+
+static void rdpsnd_alsa_start(rdpsndDevicePlugin* device)
+{
+       rdpsndAlsaPlugin* alsa = (rdpsndAlsaPlugin*)device;
+
+       if (alsa->out_handle == 0)
+               return;
+
+       snd_pcm_start(alsa->out_handle);
+}
+
+int FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
+{
+       rdpsndAlsaPlugin* alsa;
+       RDP_PLUGIN_DATA* data;
+
+       alsa = xnew(rdpsndAlsaPlugin);
+
+       alsa->device.Open = rdpsnd_alsa_open;
+       alsa->device.FormatSupported = rdpsnd_alsa_format_supported;
+       alsa->device.SetFormat = rdpsnd_alsa_set_format;
+       alsa->device.SetVolume = rdpsnd_alsa_set_volume;
+       alsa->device.Play = rdpsnd_alsa_play;
+       alsa->device.Start = rdpsnd_alsa_start;
+       alsa->device.Close = rdpsnd_alsa_close;
+       alsa->device.Free = rdpsnd_alsa_free;
+
+       data = pEntryPoints->plugin_data;
+       if (data && strcmp((char*)data->data[0], "alsa") == 0)
+       {
+               alsa->device_name = xstrdup((char*)data->data[1]);
+       }
+       if (alsa->device_name == NULL)
+       {
+               alsa->device_name = xstrdup("default");
+       }
+       alsa->out_handle = 0;
+       alsa->source_rate = 22050;
+       alsa->actual_rate = 22050;
+       alsa->format = SND_PCM_FORMAT_S16_LE;
+       alsa->source_channels = 2;
+       alsa->actual_channels = 2;
+       alsa->bytes_per_channel = 2;
+
+       pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*)alsa);
+
+       return 0;
+}
+
diff --git a/channels/rdpsnd/pulse/CMakeLists.txt b/channels/rdpsnd/pulse/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4460daf
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(RDPSND_PULSE_SRCS
+       rdpsnd_pulse.c
+)
+
+include_directories(..)
+include_directories(${PULSE_INCLUDE_DIRS})
+
+add_library(rdpsnd_pulse ${RDPSND_PULSE_SRCS})
+set_target_properties(rdpsnd_pulse PROPERTIES PREFIX "")
+
+target_link_libraries(rdpsnd_pulse freerdp-utils)
+target_link_libraries(rdpsnd_pulse ${PULSE_LIBRARIES})
+
+install(TARGETS rdpsnd_pulse DESTINATION ${FREERDP_PLUGIN_PATH})
diff --git a/channels/rdpsnd/pulse/rdpsnd_pulse.c b/channels/rdpsnd/pulse/rdpsnd_pulse.c
new file mode 100644 (file)
index 0000000..1a331f0
--- /dev/null
@@ -0,0 +1,509 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Output Virtual Channel
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pulse/pulseaudio.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/dsp.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpsnd_main.h"
+
+typedef struct rdpsnd_pulse_plugin rdpsndPulsePlugin;
+struct rdpsnd_pulse_plugin
+{
+       rdpsndDevicePlugin device;
+
+       char* device_name;
+       pa_threaded_mainloop *mainloop;
+       pa_context *context;
+       pa_sample_spec sample_spec;
+       pa_stream *stream;
+       int format;
+       int block_size;
+       int latency;
+       ADPCM adpcm;
+};
+
+static void rdpsnd_pulse_context_state_callback(pa_context* context, void* userdata)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)userdata;
+       pa_context_state_t state;
+
+       state = pa_context_get_state(context);
+       switch (state)
+       {
+               case PA_CONTEXT_READY:
+                       DEBUG_SVC("PA_CONTEXT_READY");
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               case PA_CONTEXT_FAILED:
+               case PA_CONTEXT_TERMINATED:
+                       DEBUG_SVC("PA_CONTEXT_FAILED/PA_CONTEXT_TERMINATED %d", (int)state);
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               default:
+                       DEBUG_SVC("state %d", (int)state);
+                       break;
+       }
+}
+
+static boolean rdpsnd_pulse_connect(rdpsndDevicePlugin* device)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+       pa_context_state_t state;
+
+       if (!pulse->context)
+               return false;
+
+       if (pa_context_connect(pulse->context, NULL, 0, NULL))
+       {
+               DEBUG_WARN("pa_context_connect failed (%d)", pa_context_errno(pulse->context));
+               return false;
+       }
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       if (pa_threaded_mainloop_start(pulse->mainloop) < 0)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_threaded_mainloop_start failed (%d)", pa_context_errno(pulse->context));
+               return false;
+       }
+       for (;;)
+       {
+               state = pa_context_get_state(pulse->context);
+               if (state == PA_CONTEXT_READY)
+                       break;
+               if (!PA_CONTEXT_IS_GOOD(state))
+               {
+                       DEBUG_WARN("bad context state (%d)", pa_context_errno(pulse->context));
+                       break;
+               }
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+       if (state == PA_CONTEXT_READY)
+       {
+               DEBUG_SVC("connected");
+               return true;
+       }
+       else
+       {
+               pa_context_disconnect(pulse->context);
+               return false;
+       }
+}
+
+static void rdpsnd_pulse_stream_success_callback(pa_stream* stream, int success, void* userdata)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)userdata;
+
+       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+}
+
+static void rdpsnd_pulse_wait_for_operation(rdpsndPulsePlugin* pulse, pa_operation* operation)
+{
+       if (operation == NULL)
+               return;
+       while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING)
+       {
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_operation_unref(operation);
+}
+
+static void rdpsnd_pulse_stream_state_callback(pa_stream* stream, void* userdata)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)userdata;
+       pa_stream_state_t state;
+
+       state = pa_stream_get_state(stream);
+       switch (state)
+       {
+               case PA_STREAM_READY:
+                       DEBUG_SVC("PA_STREAM_READY");
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               case PA_STREAM_FAILED:
+               case PA_STREAM_TERMINATED:
+                       DEBUG_SVC("state %d", (int)state);
+                       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+                       break;
+
+               default:
+                       DEBUG_SVC("state %d", (int)state);
+                       break;
+       }
+}
+
+static void rdpsnd_pulse_stream_request_callback(pa_stream* stream, size_t length, void* userdata)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)userdata;
+
+       pa_threaded_mainloop_signal(pulse->mainloop, 0);
+}
+
+static void rdpsnd_pulse_close(rdpsndDevicePlugin* device)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+
+       if (!pulse->context || !pulse->stream)
+               return;
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       rdpsnd_pulse_wait_for_operation(pulse,
+               pa_stream_drain(pulse->stream, rdpsnd_pulse_stream_success_callback, pulse));
+       pa_stream_disconnect(pulse->stream);
+       pa_stream_unref(pulse->stream);
+       pulse->stream = NULL;
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+}
+
+static void rdpsnd_pulse_set_format_spec(rdpsndPulsePlugin* pulse, rdpsndFormat* format)
+{
+       pa_sample_spec sample_spec = { 0 };
+
+       if (!pulse->context)
+               return;
+
+       sample_spec.rate = format->nSamplesPerSec;
+       sample_spec.channels = format->nChannels;
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       switch (format->wBitsPerSample)
+                       {
+                               case 8:
+                                       sample_spec.format = PA_SAMPLE_U8;
+                                       break;
+                               case 16:
+                                       sample_spec.format = PA_SAMPLE_S16LE;
+                                       break;
+                       }
+                       break;
+
+               case 6: /* A-LAW */
+                       sample_spec.format = PA_SAMPLE_ALAW;
+                       break;
+
+               case 7: /* U-LAW */
+                       sample_spec.format = PA_SAMPLE_ULAW;
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       sample_spec.format = PA_SAMPLE_S16LE;
+                       break;
+       }
+
+       pulse->sample_spec = sample_spec;
+       pulse->format = format->wFormatTag;
+       pulse->block_size = format->nBlockAlign;
+}
+
+static void rdpsnd_pulse_open(rdpsndDevicePlugin* device, rdpsndFormat* format, int latency)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+       pa_stream_state_t state;
+       pa_stream_flags_t flags;
+       pa_buffer_attr buffer_attr = { 0 };
+       char ss[PA_SAMPLE_SPEC_SNPRINT_MAX];
+
+       if (!pulse->context || pulse->stream)
+       {
+               DEBUG_WARN("pulse stream has been created.");
+               return;
+       }
+
+       rdpsnd_pulse_set_format_spec(pulse, format);
+       pulse->latency = latency;
+
+       if (pa_sample_spec_valid(&pulse->sample_spec) == 0)
+       {
+               pa_sample_spec_snprint(ss, sizeof(ss), &pulse->sample_spec);
+               DEBUG_WARN("Invalid sample spec %s", ss);
+               return;
+       }
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       pulse->stream = pa_stream_new(pulse->context, "freerdp",
+               &pulse->sample_spec, NULL);
+       if (!pulse->stream)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_stream_new failed (%d)",
+                       pa_context_errno(pulse->context));
+               return;
+       }
+
+       /* install essential callbacks */
+       pa_stream_set_state_callback(pulse->stream,
+               rdpsnd_pulse_stream_state_callback, pulse);
+       pa_stream_set_write_callback(pulse->stream,
+               rdpsnd_pulse_stream_request_callback, pulse);
+
+       flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE;
+       if (pulse->latency > 0)
+       {
+               buffer_attr.maxlength = pa_usec_to_bytes(pulse->latency * 2 * 1000, &pulse->sample_spec);
+               buffer_attr.tlength = pa_usec_to_bytes(pulse->latency * 1000, &pulse->sample_spec);
+               buffer_attr.prebuf = (uint32_t) -1;
+               buffer_attr.minreq = (uint32_t) -1;
+               buffer_attr.fragsize = (uint32_t) -1;
+               flags |= PA_STREAM_ADJUST_LATENCY;
+       }
+       if (pa_stream_connect_playback(pulse->stream,
+               pulse->device_name, pulse->latency > 0 ? &buffer_attr : NULL, flags, NULL, NULL) < 0)
+       {
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+               DEBUG_WARN("pa_stream_connect_playback failed (%d)",
+                       pa_context_errno(pulse->context));
+               return;
+       }
+
+       for (;;)
+       {
+               state = pa_stream_get_state(pulse->stream);
+               if (state == PA_STREAM_READY)
+                       break;
+               if (!PA_STREAM_IS_GOOD(state))
+               {
+                       DEBUG_WARN("bad stream state (%d)",
+                               pa_context_errno(pulse->context));
+                       break;
+               }
+               pa_threaded_mainloop_wait(pulse->mainloop);
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+       if (state == PA_STREAM_READY)
+       {
+               memset(&pulse->adpcm, 0, sizeof(ADPCM));
+               DEBUG_SVC("connected");
+       }
+       else
+       {
+               rdpsnd_pulse_close(device);
+       }
+}
+
+static void rdpsnd_pulse_free(rdpsndDevicePlugin* device)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+
+       if (!pulse)
+               return;
+       rdpsnd_pulse_close(device);
+       if (pulse->mainloop)
+       {
+               pa_threaded_mainloop_stop(pulse->mainloop);
+       }
+       if (pulse->context)
+       {
+               pa_context_disconnect(pulse->context);
+               pa_context_unref(pulse->context);
+               pulse->context = NULL;
+       }
+       if (pulse->mainloop)
+       {
+               pa_threaded_mainloop_free(pulse->mainloop);
+               pulse->mainloop = NULL;
+       }
+       xfree(pulse->device_name);
+       xfree(pulse);
+}
+
+static boolean rdpsnd_pulse_format_supported(rdpsndDevicePlugin* device, rdpsndFormat* format)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+
+       if (!pulse->context)
+               return false;
+
+       switch (format->wFormatTag)
+       {
+               case 1: /* PCM */
+                       if (format->cbSize == 0 &&
+                               (format->nSamplesPerSec <= PA_RATE_MAX) &&
+                               (format->wBitsPerSample == 8 || format->wBitsPerSample == 16) &&
+                               (format->nChannels >= 1 && format->nChannels <= PA_CHANNELS_MAX))
+                       {
+                               return true;
+                       }
+                       break;
+
+               case 6: /* A-LAW */
+               case 7: /* U-LAW */
+                       if (format->cbSize == 0 &&
+                               (format->nSamplesPerSec <= PA_RATE_MAX) &&
+                               (format->wBitsPerSample == 8) &&
+                               (format->nChannels >= 1 && format->nChannels <= PA_CHANNELS_MAX))
+                       {
+                               return true;
+                       }
+                       break;
+
+               case 0x11: /* IMA ADPCM */
+                       if ((format->nSamplesPerSec <= PA_RATE_MAX) &&
+                               (format->wBitsPerSample == 4) &&
+                               (format->nChannels == 1 || format->nChannels == 2))
+                       {
+                               return true;
+                       }
+                       break;
+       }
+       return false;
+}
+
+static void rdpsnd_pulse_set_format(rdpsndDevicePlugin* device, rdpsndFormat* format, int latency)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+
+       if (pulse->stream)
+       {
+               pa_threaded_mainloop_lock(pulse->mainloop);
+               pa_stream_disconnect(pulse->stream);
+               pa_stream_unref(pulse->stream);
+               pulse->stream = NULL;
+               pa_threaded_mainloop_unlock(pulse->mainloop);
+       }
+       rdpsnd_pulse_open(device, format, latency);
+}
+
+static void rdpsnd_pulse_set_volume(rdpsndDevicePlugin* device, uint32 value)
+{
+}
+
+static void rdpsnd_pulse_play(rdpsndDevicePlugin* device, uint8* data, int size)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+       int len;
+       int ret;
+       uint8* decoded_data;
+       uint8* src;
+       int decoded_size;
+
+       if (!pulse->stream)
+               return;
+
+       if (pulse->format == 0x11)
+       {
+               decoded_data = dsp_decode_ima_adpcm(&pulse->adpcm,
+                       data, size, pulse->sample_spec.channels, pulse->block_size, &decoded_size);
+               size = decoded_size;
+               src = decoded_data;
+       }
+       else
+       {
+               decoded_data = NULL;
+               src = data;
+       }
+
+       pa_threaded_mainloop_lock(pulse->mainloop);
+       while (size > 0)
+       {
+               while ((len = pa_stream_writable_size(pulse->stream)) == 0)
+               {
+                       pa_threaded_mainloop_wait(pulse->mainloop);
+               }
+               if (len < 0)
+                       break;
+               if (len > size)
+                       len = size;
+               ret = pa_stream_write(pulse->stream, src, len, NULL, 0LL, PA_SEEK_RELATIVE);
+               if (ret < 0)
+               {
+                       DEBUG_WARN("pa_stream_write failed (%d)",
+                               pa_context_errno(pulse->context));
+                       break;
+               }
+               src += len;
+               size -= len;
+       }
+       pa_threaded_mainloop_unlock(pulse->mainloop);
+
+       if (decoded_data)
+               xfree(decoded_data);
+}
+
+static void rdpsnd_pulse_start(rdpsndDevicePlugin* device)
+{
+       rdpsndPulsePlugin* pulse = (rdpsndPulsePlugin*)device;
+
+       if (!pulse->stream)
+               return;
+
+       pa_stream_trigger(pulse->stream, NULL, NULL);
+}
+
+int FreeRDPRdpsndDeviceEntry(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints)
+{
+       rdpsndPulsePlugin* pulse;
+       RDP_PLUGIN_DATA* data;
+
+       pulse = xnew(rdpsndPulsePlugin);
+
+       pulse->device.Open = rdpsnd_pulse_open;
+       pulse->device.FormatSupported = rdpsnd_pulse_format_supported;
+       pulse->device.SetFormat = rdpsnd_pulse_set_format;
+       pulse->device.SetVolume = rdpsnd_pulse_set_volume;
+       pulse->device.Play = rdpsnd_pulse_play;
+       pulse->device.Start = rdpsnd_pulse_start;
+       pulse->device.Close = rdpsnd_pulse_close;
+       pulse->device.Free = rdpsnd_pulse_free;
+
+       data = pEntryPoints->plugin_data;
+       if (data && strcmp((char*)data->data[0], "pulse") == 0)
+       {
+               if(strlen((char*)data->data[1]) > 0) 
+                       pulse->device_name = xstrdup((char*)data->data[1]);
+               else
+                       pulse->device_name = NULL;
+       }
+
+       pulse->mainloop = pa_threaded_mainloop_new();
+       if (!pulse->mainloop)
+       {
+               DEBUG_WARN("pa_threaded_mainloop_new failed");
+               rdpsnd_pulse_free((rdpsndDevicePlugin*)pulse);
+               return 1;
+       }
+       pulse->context = pa_context_new(pa_threaded_mainloop_get_api(pulse->mainloop), "freerdp");
+       if (!pulse->context)
+       {
+               DEBUG_WARN("pa_context_new failed");
+               rdpsnd_pulse_free((rdpsndDevicePlugin*)pulse);
+               return 1;
+       }
+       pa_context_set_state_callback(pulse->context, rdpsnd_pulse_context_state_callback, pulse);
+       if (!rdpsnd_pulse_connect((rdpsndDevicePlugin*)pulse))
+       {
+               DEBUG_WARN("rdpsnd_pulse_connect failed");
+               rdpsnd_pulse_free((rdpsndDevicePlugin*)pulse);
+               return 1;
+       }
+
+       pEntryPoints->pRegisterRdpsndDevice(pEntryPoints->rdpsnd, (rdpsndDevicePlugin*)pulse);
+
+       return 0;
+}
+
diff --git a/channels/rdpsnd/rdpsnd_main.c b/channels/rdpsnd/rdpsnd_main.c
new file mode 100644 (file)
index 0000000..48b5455
--- /dev/null
@@ -0,0 +1,561 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Output Virtual Channel
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/load_plugin.h>
+#include <freerdp/utils/svc_plugin.h>
+
+#include "rdpsnd_main.h"
+
+#define SNDC_CLOSE         1
+#define SNDC_WAVE          2
+#define SNDC_SETVOLUME     3
+#define SNDC_SETPITCH      4
+#define SNDC_WAVECONFIRM   5
+#define SNDC_TRAINING      6
+#define SNDC_FORMATS       7
+#define SNDC_CRYPTKEY      8
+#define SNDC_WAVEENCRYPT   9
+#define SNDC_UDPWAVE       10
+#define SNDC_UDPWAVELAST   11
+#define SNDC_QUALITYMODE   12
+
+#define TSSNDCAPS_ALIVE  1
+#define TSSNDCAPS_VOLUME 2
+#define TSSNDCAPS_PITCH  4
+
+#define DYNAMIC_QUALITY  0x0000
+#define MEDIUM_QUALITY   0x0001
+#define HIGH_QUALITY     0x0002
+
+struct rdpsnd_plugin
+{
+       rdpSvcPlugin plugin;
+
+       LIST* data_out_list;
+
+       uint8 cBlockNo;
+       rdpsndFormat* supported_formats;
+       int n_supported_formats;
+       int current_format;
+
+       boolean expectingWave;
+       uint8 waveData[4];
+       uint16 waveDataSize;
+       uint32 wTimeStamp; /* server timestamp */
+       uint32 wave_timestamp; /* client timestamp */
+
+       boolean is_open;
+       uint32 close_timestamp;
+
+       uint16 fixed_format;
+       uint16 fixed_channel;
+       uint32 fixed_rate;
+       int latency;
+
+       /* Device plugin */
+       rdpsndDevicePlugin* device;
+};
+
+struct data_out_item
+{
+       STREAM* data_out;
+       uint32 out_timestamp;
+};
+
+/* get time in milliseconds */
+static uint32 get_mstime(void)
+{
+       struct timeval tp;
+
+       gettimeofday(&tp, 0);
+       return (tp.tv_sec * 1000) + (tp.tv_usec / 1000);
+}
+
+/* process the linked list of data that has queued to be sent */
+static void rdpsnd_process_interval(rdpSvcPlugin* plugin)
+{
+       rdpsndPlugin* rdpsnd = (rdpsndPlugin*)plugin;
+       struct data_out_item* item;
+       uint32 cur_time;
+
+       while (rdpsnd->data_out_list->head)
+       {
+               item = (struct data_out_item*)rdpsnd->data_out_list->head->data;
+               cur_time = get_mstime();
+               if (cur_time <= item->out_timestamp)
+                       break;
+
+               item = (struct data_out_item*)list_dequeue(rdpsnd->data_out_list);
+               svc_plugin_send(plugin, item->data_out);
+               xfree(item);
+
+               DEBUG_SVC("processed data_out");
+       }
+
+       if (rdpsnd->is_open && rdpsnd->close_timestamp > 0)
+       {
+               cur_time = get_mstime();
+               if (cur_time > rdpsnd->close_timestamp)
+               {
+                       if (rdpsnd->device)
+                               IFCALL(rdpsnd->device->Close, rdpsnd->device);
+                       rdpsnd->is_open = false;
+                       rdpsnd->close_timestamp = 0;
+
+                       DEBUG_SVC("processed close");
+               }
+       }
+
+       if (rdpsnd->data_out_list->head == NULL && !rdpsnd->is_open)
+       {
+               rdpsnd->plugin.interval_ms = 0;
+       }
+}
+
+static void rdpsnd_free_supported_formats(rdpsndPlugin* rdpsnd)
+{
+       uint16 i;
+
+       for (i = 0; i < rdpsnd->n_supported_formats; i++)
+               xfree(rdpsnd->supported_formats[i].data);
+       xfree(rdpsnd->supported_formats);
+
+       rdpsnd->supported_formats = NULL;
+       rdpsnd->n_supported_formats = 0;
+}
+
+/* receives a list of server supported formats and returns a list
+   of client supported formats */
+static void rdpsnd_process_message_formats(rdpsndPlugin* rdpsnd, STREAM* data_in)
+{
+       uint16 wNumberOfFormats;
+       uint16 nFormat;
+       uint16 wVersion;
+       STREAM* data_out;
+       rdpsndFormat* out_formats;
+       uint16 n_out_formats;
+       rdpsndFormat* format;
+       uint8* format_mark;
+       uint8* data_mark;
+       int pos;
+
+       rdpsnd_free_supported_formats(rdpsnd);
+
+       stream_seek_uint32(data_in); /* dwFlags */
+       stream_seek_uint32(data_in); /* dwVolume */
+       stream_seek_uint32(data_in); /* dwPitch */
+       stream_seek_uint16(data_in); /* wDGramPort */
+       stream_read_uint16(data_in, wNumberOfFormats);
+       stream_read_uint8(data_in, rdpsnd->cBlockNo); /* cLastBlockConfirmed */
+       stream_read_uint16(data_in, wVersion);
+       stream_seek_uint8(data_in); /* bPad */
+
+       DEBUG_SVC("wNumberOfFormats %d wVersion %d", wNumberOfFormats, wVersion);
+       if (wNumberOfFormats < 1)
+       {
+               DEBUG_WARN("wNumberOfFormats is 0");
+               return;
+       }
+
+       out_formats = (rdpsndFormat*)xzalloc(wNumberOfFormats * sizeof(rdpsndFormat));
+       n_out_formats = 0;
+
+       data_out = stream_new(24);
+       stream_write_uint8(data_out, SNDC_FORMATS); /* msgType */
+       stream_write_uint8(data_out, 0); /* bPad */
+       stream_seek_uint16(data_out); /* BodySize */
+       stream_write_uint32(data_out, TSSNDCAPS_ALIVE); /* dwFlags */
+       stream_write_uint32(data_out, 0); /* dwVolume */
+       stream_write_uint32(data_out, 0); /* dwPitch */
+       stream_write_uint16_be(data_out, 0); /* wDGramPort */
+       stream_seek_uint16(data_out); /* wNumberOfFormats */
+       stream_write_uint8(data_out, 0); /* cLastBlockConfirmed */
+       stream_write_uint16(data_out, 6); /* wVersion */
+       stream_write_uint8(data_out, 0); /* bPad */
+
+       for (nFormat = 0; nFormat < wNumberOfFormats; nFormat++)
+       {
+               stream_get_mark(data_in, format_mark);
+               format = &out_formats[n_out_formats];
+               stream_read_uint16(data_in, format->wFormatTag);
+               stream_read_uint16(data_in, format->nChannels);
+               stream_read_uint32(data_in, format->nSamplesPerSec);
+               stream_seek_uint32(data_in); /* nAvgBytesPerSec */
+               stream_read_uint16(data_in, format->nBlockAlign);
+               stream_read_uint16(data_in, format->wBitsPerSample);
+               stream_read_uint16(data_in, format->cbSize);
+               stream_get_mark(data_in, data_mark);
+               stream_seek(data_in, format->cbSize);
+               format->data = NULL;
+
+               DEBUG_SVC("wFormatTag=%d nChannels=%d nSamplesPerSec=%d nBlockAlign=%d wBitsPerSample=%d",
+                       format->wFormatTag, format->nChannels, format->nSamplesPerSec,
+                       format->nBlockAlign, format->wBitsPerSample);
+
+               if (rdpsnd->fixed_format > 0 && rdpsnd->fixed_format != format->wFormatTag)
+                       continue;
+               if (rdpsnd->fixed_channel > 0 && rdpsnd->fixed_channel != format->nChannels)
+                       continue;
+               if (rdpsnd->fixed_rate > 0 && rdpsnd->fixed_rate != format->nSamplesPerSec)
+                       continue;
+               if (rdpsnd->device && rdpsnd->device->FormatSupported(rdpsnd->device, format))
+               {
+                       DEBUG_SVC("format supported.");
+
+                       stream_check_size(data_out, 18 + format->cbSize);
+                       stream_write(data_out, format_mark, 18 + format->cbSize);
+                       if (format->cbSize > 0)
+                       {
+                               format->data = xmalloc(format->cbSize);
+                               memcpy(format->data, data_mark, format->cbSize);
+                       }
+                       n_out_formats++;
+               }
+       }
+
+       rdpsnd->n_supported_formats = n_out_formats;
+       if (n_out_formats > 0)
+       {
+               rdpsnd->supported_formats = out_formats;
+       }
+       else
+       {
+               xfree(out_formats);
+               DEBUG_WARN("no formats supported");
+       }
+
+       pos = stream_get_pos(data_out);
+       stream_set_pos(data_out, 2);
+       stream_write_uint16(data_out, pos - 4);
+       stream_set_pos(data_out, 18);
+       stream_write_uint16(data_out, n_out_formats);
+       stream_set_pos(data_out, pos);
+
+       svc_plugin_send((rdpSvcPlugin*)rdpsnd, data_out);
+
+       if (wVersion >= 6)
+       {
+               data_out = stream_new(8);
+               stream_write_uint8(data_out, SNDC_QUALITYMODE); /* msgType */
+               stream_write_uint8(data_out, 0); /* bPad */
+               stream_write_uint16(data_out, 4); /* BodySize */
+               stream_write_uint16(data_out, HIGH_QUALITY); /* wQualityMode */
+               stream_write_uint16(data_out, 0); /* Reserved */
+
+               svc_plugin_send((rdpSvcPlugin*)rdpsnd, data_out);
+       }
+}
+
+/* server is getting a feel of the round trip time */
+static void rdpsnd_process_message_training(rdpsndPlugin* rdpsnd, STREAM* data_in)
+{
+       uint16 wTimeStamp;
+       uint16 wPackSize;
+       STREAM* data_out;
+
+       stream_read_uint16(data_in, wTimeStamp);
+       stream_read_uint16(data_in, wPackSize);
+
+       data_out = stream_new(8);
+       stream_write_uint8(data_out, SNDC_TRAINING); /* msgType */
+       stream_write_uint8(data_out, 0); /* bPad */
+       stream_write_uint16(data_out, 4); /* BodySize */
+       stream_write_uint16(data_out, wTimeStamp);
+       stream_write_uint16(data_out, wPackSize);
+
+       svc_plugin_send((rdpSvcPlugin*)rdpsnd, data_out);
+}
+
+static void rdpsnd_process_message_wave_info(rdpsndPlugin* rdpsnd, STREAM* data_in, uint16 BodySize)
+{
+       uint16 wFormatNo;
+
+       stream_read_uint16(data_in, rdpsnd->wTimeStamp);
+       stream_read_uint16(data_in, wFormatNo);
+       stream_read_uint8(data_in, rdpsnd->cBlockNo);
+       stream_seek(data_in, 3); /* bPad */
+       stream_read(data_in, rdpsnd->waveData, 4);
+       rdpsnd->waveDataSize = BodySize - 8;
+       rdpsnd->wave_timestamp = get_mstime();
+       rdpsnd->expectingWave = true;
+
+       DEBUG_SVC("waveDataSize %d wFormatNo %d", rdpsnd->waveDataSize, wFormatNo);
+
+       rdpsnd->close_timestamp = 0;
+       if (!rdpsnd->is_open)
+       {
+               rdpsnd->current_format = wFormatNo;
+               rdpsnd->is_open = true;
+               if (rdpsnd->device)
+                       IFCALL(rdpsnd->device->Open, rdpsnd->device, &rdpsnd->supported_formats[wFormatNo],
+                               rdpsnd->latency);
+       }
+       else if (wFormatNo != rdpsnd->current_format)
+       {
+               rdpsnd->current_format = wFormatNo;
+               if (rdpsnd->device)
+                       IFCALL(rdpsnd->device->SetFormat, rdpsnd->device, &rdpsnd->supported_formats[wFormatNo],
+                               rdpsnd->latency);
+       }
+}
+
+/* header is not removed from data in this function */
+static void rdpsnd_process_message_wave(rdpsndPlugin* rdpsnd, STREAM* data_in)
+{
+       uint16 wTimeStamp;
+       uint32 delay_ms;
+       uint32 process_ms;
+       struct data_out_item* item;
+
+       rdpsnd->expectingWave = 0;
+       memcpy(stream_get_head(data_in), rdpsnd->waveData, 4);
+       if (stream_get_size(data_in) != rdpsnd->waveDataSize)
+       {
+               DEBUG_WARN("size error");
+               return;
+       }
+       if (rdpsnd->device)
+               IFCALL(rdpsnd->device->Play, rdpsnd->device, stream_get_head(data_in), stream_get_size(data_in));
+
+       process_ms = get_mstime() - rdpsnd->wave_timestamp;
+       delay_ms = 250;
+       wTimeStamp = rdpsnd->wTimeStamp + delay_ms;
+
+       DEBUG_SVC("data_size %d delay_ms %u process_ms %u",
+               stream_get_size(data_in), delay_ms, process_ms);
+
+       item = xnew(struct data_out_item);
+       item->data_out = stream_new(8);
+       stream_write_uint8(item->data_out, SNDC_WAVECONFIRM);
+       stream_write_uint8(item->data_out, 0);
+       stream_write_uint16(item->data_out, 4);
+       stream_write_uint16(item->data_out, wTimeStamp);
+       stream_write_uint8(item->data_out, rdpsnd->cBlockNo); /* cConfirmedBlockNo */
+       stream_write_uint8(item->data_out, 0); /* bPad */
+       item->out_timestamp = rdpsnd->wave_timestamp + delay_ms;
+
+       list_enqueue(rdpsnd->data_out_list, item);
+       rdpsnd->plugin.interval_ms = 10;
+}
+
+static void rdpsnd_process_message_close(rdpsndPlugin* rdpsnd)
+{
+       DEBUG_SVC("server closes.");
+       if (rdpsnd->device)
+               IFCALL(rdpsnd->device->Start, rdpsnd->device);
+       rdpsnd->close_timestamp = get_mstime() + 2000;
+       rdpsnd->plugin.interval_ms = 10;
+}
+
+static void rdpsnd_process_message_setvolume(rdpsndPlugin* rdpsnd, STREAM* data_in)
+{
+       uint32 dwVolume;
+
+       stream_read_uint32(data_in, dwVolume);
+       DEBUG_SVC("dwVolume 0x%X", dwVolume);
+       if (rdpsnd->device)
+               IFCALL(rdpsnd->device->SetVolume, rdpsnd->device, dwVolume);
+}
+
+static void rdpsnd_process_receive(rdpSvcPlugin* plugin, STREAM* data_in)
+{
+       rdpsndPlugin* rdpsnd = (rdpsndPlugin*)plugin;
+       uint8 msgType;
+       uint16 BodySize;
+
+       if (rdpsnd->expectingWave)
+       {
+               rdpsnd_process_message_wave(rdpsnd, data_in);
+               return;
+       }
+
+       stream_read_uint8(data_in, msgType); /* msgType */
+       stream_seek_uint8(data_in); /* bPad */
+       stream_read_uint16(data_in, BodySize);
+
+       DEBUG_SVC("msgType %d BodySize %d", msgType, BodySize);
+
+       switch (msgType)
+       {
+               case SNDC_FORMATS:
+                       rdpsnd_process_message_formats(rdpsnd, data_in);
+                       break;
+               case SNDC_TRAINING:
+                       rdpsnd_process_message_training(rdpsnd, data_in);
+                       break;
+               case SNDC_WAVE:
+                       rdpsnd_process_message_wave_info(rdpsnd, data_in, BodySize);
+                       break;
+               case SNDC_CLOSE:
+                       rdpsnd_process_message_close(rdpsnd);
+                       break;
+               case SNDC_SETVOLUME:
+                       rdpsnd_process_message_setvolume(rdpsnd, data_in);
+                       break;
+               default:
+                       DEBUG_WARN("unknown msgType %d", msgType);
+                       break;
+       }
+}
+
+static void rdpsnd_register_device_plugin(rdpsndPlugin* rdpsnd, rdpsndDevicePlugin* device)
+{
+       if (rdpsnd->device)
+       {
+               DEBUG_WARN("existing device, abort.");
+               return;
+       }
+       rdpsnd->device = device;
+}
+
+static boolean rdpsnd_load_device_plugin(rdpsndPlugin* rdpsnd, const char* name, RDP_PLUGIN_DATA* data)
+{
+       FREERDP_RDPSND_DEVICE_ENTRY_POINTS entryPoints;
+       PFREERDP_RDPSND_DEVICE_ENTRY entry;
+       char* fullname;
+
+       if (strrchr(name, '.') != NULL)
+               entry = (PFREERDP_RDPSND_DEVICE_ENTRY)freerdp_load_plugin(name, RDPSND_DEVICE_EXPORT_FUNC_NAME);
+       else
+       {
+               fullname = xzalloc(strlen(name) + 8);
+               strcpy(fullname, "rdpsnd_");
+               strcat(fullname, name);
+               entry = (PFREERDP_RDPSND_DEVICE_ENTRY)freerdp_load_plugin(fullname, RDPSND_DEVICE_EXPORT_FUNC_NAME);
+               xfree(fullname);
+       }
+       if (entry == NULL)
+       {
+               return false;
+       }
+
+       entryPoints.rdpsnd = rdpsnd;
+       entryPoints.pRegisterRdpsndDevice = rdpsnd_register_device_plugin;
+       entryPoints.plugin_data = data;
+       if (entry(&entryPoints) != 0)
+       {
+               DEBUG_WARN("%s entry returns error.", name);
+               return false;
+       }
+       return true;
+}
+
+static void rdpsnd_process_plugin_data(rdpsndPlugin* rdpsnd, RDP_PLUGIN_DATA* data)
+{
+       if (strcmp((char*)data->data[0], "format") == 0)
+       {
+               rdpsnd->fixed_format = atoi(data->data[1]);
+       }
+       else if (strcmp((char*)data->data[0], "rate") == 0)
+       {
+               rdpsnd->fixed_rate = atoi(data->data[1]);
+       }
+       else if (strcmp((char*)data->data[0], "channel") == 0)
+       {
+               rdpsnd->fixed_channel = atoi(data->data[1]);
+       }
+       else if (strcmp((char*)data->data[0], "latency") == 0)
+       {
+               rdpsnd->latency = atoi(data->data[1]);
+       }
+       else
+       {
+               rdpsnd_load_device_plugin(rdpsnd, (char*)data->data[0], data);
+       }
+}
+
+static void rdpsnd_process_connect(rdpSvcPlugin* plugin)
+{
+       rdpsndPlugin* rdpsnd = (rdpsndPlugin*)plugin;
+       RDP_PLUGIN_DATA* data;
+       RDP_PLUGIN_DATA default_data[2] = { { 0 }, { 0 } };
+
+       DEBUG_SVC("connecting");
+
+       plugin->interval_callback = rdpsnd_process_interval;
+
+       rdpsnd->data_out_list = list_new();
+       rdpsnd->latency = -1;
+
+       data = (RDP_PLUGIN_DATA*)plugin->channel_entry_points.pExtendedData;
+       while (data && data->size > 0)
+       {
+               rdpsnd_process_plugin_data(rdpsnd, data);
+               data = (RDP_PLUGIN_DATA*) (((void*) data) + data->size);
+       }
+
+       if (rdpsnd->device == NULL)
+       {
+               default_data[0].size = sizeof(RDP_PLUGIN_DATA);
+               default_data[0].data[0] = "pulse";
+               default_data[0].data[1] = "";
+               if (!rdpsnd_load_device_plugin(rdpsnd, "pulse", default_data))
+               {
+                       default_data[0].data[0] = "alsa";
+                       default_data[0].data[1] = "default";
+                       rdpsnd_load_device_plugin(rdpsnd, "alsa", default_data);
+               }
+       }
+       if (rdpsnd->device == NULL)
+       {
+               DEBUG_WARN("no sound device.");
+       }
+}
+
+static void rdpsnd_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       freerdp_event_free(event);
+}
+
+static void rdpsnd_process_terminate(rdpSvcPlugin* plugin)
+{
+       rdpsndPlugin* rdpsnd = (rdpsndPlugin*)plugin;
+       struct data_out_item* item;
+
+       if (rdpsnd->device)
+               IFCALL(rdpsnd->device->Free, rdpsnd->device);
+
+       while ((item = list_dequeue(rdpsnd->data_out_list)) != NULL)
+       {
+               stream_free(item->data_out);
+               xfree(item);
+       }
+       list_free(rdpsnd->data_out_list);
+
+       rdpsnd_free_supported_formats(rdpsnd);
+
+       xfree(plugin);
+}
+
+DEFINE_SVC_PLUGIN(rdpsnd, "rdpsnd",
+       CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP)
+
diff --git a/channels/rdpsnd/rdpsnd_main.h b/channels/rdpsnd/rdpsnd_main.h
new file mode 100644 (file)
index 0000000..9c12747
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Audio Output Virtual Channel
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDPSND_MAIN_H
+#define __RDPSND_MAIN_H
+
+typedef struct rdpsnd_plugin rdpsndPlugin;
+
+typedef struct rdpsnd_format rdpsndFormat;
+struct rdpsnd_format
+{
+       uint16 wFormatTag;
+       uint16 nChannels;
+       uint32 nSamplesPerSec;
+       uint16 nBlockAlign;
+       uint16 wBitsPerSample;
+       uint16 cbSize;
+       uint8* data;
+};
+
+typedef struct rdpsnd_device_plugin rdpsndDevicePlugin;
+
+typedef boolean (*pcFormatSupported) (rdpsndDevicePlugin* device, rdpsndFormat* format);
+typedef void (*pcOpen) (rdpsndDevicePlugin* device, rdpsndFormat* format, int latency);
+typedef void (*pcSetFormat) (rdpsndDevicePlugin* device, rdpsndFormat* format, int latency);
+typedef void (*pcSetVolume) (rdpsndDevicePlugin* device, uint32 value);
+typedef void (*pcPlay) (rdpsndDevicePlugin* device, uint8* data, int size);
+typedef void (*pcStart) (rdpsndDevicePlugin* device);
+typedef void (*pcClose) (rdpsndDevicePlugin* device);
+typedef void (*pcFree) (rdpsndDevicePlugin* device);
+
+struct rdpsnd_device_plugin
+{
+       pcFormatSupported FormatSupported;
+       pcOpen Open;
+       pcSetFormat SetFormat;
+       pcSetVolume SetVolume;
+       pcPlay Play;
+       pcStart Start;
+       pcClose Close;
+       pcFree Free;
+};
+
+#define RDPSND_DEVICE_EXPORT_FUNC_NAME "FreeRDPRdpsndDeviceEntry"
+
+typedef void (*PREGISTERRDPSNDDEVICE)(rdpsndPlugin* rdpsnd, rdpsndDevicePlugin* device);
+
+struct _FREERDP_RDPSND_DEVICE_ENTRY_POINTS
+{
+       rdpsndPlugin* rdpsnd;
+       PREGISTERRDPSNDDEVICE pRegisterRdpsndDevice;
+       RDP_PLUGIN_DATA* plugin_data;
+};
+typedef struct _FREERDP_RDPSND_DEVICE_ENTRY_POINTS FREERDP_RDPSND_DEVICE_ENTRY_POINTS;
+typedef FREERDP_RDPSND_DEVICE_ENTRY_POINTS* PFREERDP_RDPSND_DEVICE_ENTRY_POINTS;
+
+typedef int (*PFREERDP_RDPSND_DEVICE_ENTRY)(PFREERDP_RDPSND_DEVICE_ENTRY_POINTS pEntryPoints);
+
+#endif /* __RDPSND_MAIN_H */
+
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
new file mode 100644 (file)
index 0000000..00949d2
--- /dev/null
@@ -0,0 +1,40 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP Client User Interfaces
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# User Interfaces
+
+if(NOT WIN32)
+       # Build Test Client
+       add_subdirectory(test)
+
+       # Build X11 Client
+       find_suggested_package(X11)
+       if(WITH_X11)
+               add_subdirectory(X11)
+       endif()
+
+       # Build DirectFB Client
+       find_optional_package(DirectFB)
+       if(WITH_DIRECTFB)
+               add_subdirectory(DirectFB)
+       endif()
+else()
+       # Build Windows Client
+       add_subdirectory(Windows)
+endif()
diff --git a/client/DirectFB/CMakeLists.txt b/client/DirectFB/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e267f6b
--- /dev/null
@@ -0,0 +1,37 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP DirectFB Client
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include_directories(${DIRECTFB_INCLUDE_DIRS})
+
+add_executable(dfreerdp
+       df_event.c
+       df_event.h
+       df_graphics.c
+       df_graphics.c
+       dfreerdp.c
+       dfreerdp.h)
+
+target_link_libraries(dfreerdp freerdp-core)
+target_link_libraries(dfreerdp freerdp-gdi)
+target_link_libraries(dfreerdp freerdp-kbd)
+target_link_libraries(dfreerdp freerdp-channels)
+target_link_libraries(dfreerdp freerdp-utils)
+target_link_libraries(dfreerdp ${DIRECTFB_LIBRARIES})
+
+install(TARGETS dfreerdp DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/client/DirectFB/df_event.c b/client/DirectFB/df_event.c
new file mode 100644 (file)
index 0000000..19af30a
--- /dev/null
@@ -0,0 +1,275 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * DirectFB Event Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/kbd/kbd.h>
+#include <freerdp/kbd/vkcodes.h>
+
+#include "df_event.h"
+
+static uint8 keymap[256];
+static uint8 functionmap[128];
+
+void df_keyboard_init()
+{
+       memset(keymap, 0, sizeof(keymap));
+
+       /* Map DirectFB keycodes to Virtual Key Codes */
+
+       keymap[DIKI_A - DIKI_UNKNOWN] = VK_KEY_A;
+       keymap[DIKI_B - DIKI_UNKNOWN] = VK_KEY_B;
+       keymap[DIKI_C - DIKI_UNKNOWN] = VK_KEY_C;
+       keymap[DIKI_D - DIKI_UNKNOWN] = VK_KEY_D;
+       keymap[DIKI_E - DIKI_UNKNOWN] = VK_KEY_E;
+       keymap[DIKI_F - DIKI_UNKNOWN] = VK_KEY_F;
+       keymap[DIKI_G - DIKI_UNKNOWN] = VK_KEY_G;
+       keymap[DIKI_H - DIKI_UNKNOWN] = VK_KEY_H;
+       keymap[DIKI_I - DIKI_UNKNOWN] = VK_KEY_I;
+       keymap[DIKI_J - DIKI_UNKNOWN] = VK_KEY_J;
+       keymap[DIKI_K - DIKI_UNKNOWN] = VK_KEY_K;
+       keymap[DIKI_L - DIKI_UNKNOWN] = VK_KEY_L;
+       keymap[DIKI_M - DIKI_UNKNOWN] = VK_KEY_M;
+       keymap[DIKI_N - DIKI_UNKNOWN] = VK_KEY_N;
+       keymap[DIKI_O - DIKI_UNKNOWN] = VK_KEY_O;
+       keymap[DIKI_P - DIKI_UNKNOWN] = VK_KEY_P;
+       keymap[DIKI_Q - DIKI_UNKNOWN] = VK_KEY_Q;
+       keymap[DIKI_R - DIKI_UNKNOWN] = VK_KEY_R;
+       keymap[DIKI_S - DIKI_UNKNOWN] = VK_KEY_S;
+       keymap[DIKI_T - DIKI_UNKNOWN] = VK_KEY_T;
+       keymap[DIKI_U - DIKI_UNKNOWN] = VK_KEY_U;
+       keymap[DIKI_V - DIKI_UNKNOWN] = VK_KEY_V;
+       keymap[DIKI_W - DIKI_UNKNOWN] = VK_KEY_W;
+       keymap[DIKI_X - DIKI_UNKNOWN] = VK_KEY_X;
+       keymap[DIKI_Y - DIKI_UNKNOWN] = VK_KEY_Y;
+       keymap[DIKI_Z - DIKI_UNKNOWN] = VK_KEY_Z;
+
+       keymap[DIKI_0 - DIKI_UNKNOWN] = VK_KEY_0;
+       keymap[DIKI_1 - DIKI_UNKNOWN] = VK_KEY_1;
+       keymap[DIKI_2 - DIKI_UNKNOWN] = VK_KEY_2;
+       keymap[DIKI_3 - DIKI_UNKNOWN] = VK_KEY_3;
+       keymap[DIKI_4 - DIKI_UNKNOWN] = VK_KEY_4;
+       keymap[DIKI_5 - DIKI_UNKNOWN] = VK_KEY_5;
+       keymap[DIKI_6 - DIKI_UNKNOWN] = VK_KEY_6;
+       keymap[DIKI_7 - DIKI_UNKNOWN] = VK_KEY_7;
+       keymap[DIKI_8 - DIKI_UNKNOWN] = VK_KEY_8;
+       keymap[DIKI_9 - DIKI_UNKNOWN] = VK_KEY_9;
+
+       keymap[DIKI_F1 - DIKI_UNKNOWN] = VK_F1;
+       keymap[DIKI_F2 - DIKI_UNKNOWN] = VK_F2;
+       keymap[DIKI_F3 - DIKI_UNKNOWN] = VK_F3;
+       keymap[DIKI_F4 - DIKI_UNKNOWN] = VK_F4;
+       keymap[DIKI_F5 - DIKI_UNKNOWN] = VK_F5;
+       keymap[DIKI_F6 - DIKI_UNKNOWN] = VK_F6;
+       keymap[DIKI_F7 - DIKI_UNKNOWN] = VK_F7;
+       keymap[DIKI_F8 - DIKI_UNKNOWN] = VK_F8;
+       keymap[DIKI_F9 - DIKI_UNKNOWN] = VK_F9;
+       keymap[DIKI_F10 - DIKI_UNKNOWN] = VK_F10;
+       keymap[DIKI_F11 - DIKI_UNKNOWN] = VK_F11;
+       keymap[DIKI_F12 - DIKI_UNKNOWN] = VK_F12;
+
+       keymap[DIKI_COMMA - DIKI_UNKNOWN] = VK_OEM_COMMA;
+       keymap[DIKI_PERIOD - DIKI_UNKNOWN] = VK_OEM_PERIOD;
+       keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = VK_OEM_MINUS;
+       keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = VK_OEM_PLUS;
+
+       keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = VK_ESCAPE;
+       keymap[DIKI_LEFT - DIKI_UNKNOWN] = VK_LEFT;
+       keymap[DIKI_RIGHT - DIKI_UNKNOWN] = VK_RIGHT;
+       keymap[DIKI_UP - DIKI_UNKNOWN] = VK_UP;
+       keymap[DIKI_DOWN - DIKI_UNKNOWN] = VK_DOWN;
+       keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = VK_LCONTROL;
+       keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = VK_RCONTROL;
+       keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = VK_LSHIFT;
+       keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = VK_RSHIFT;
+       keymap[DIKI_ALT_L - DIKI_UNKNOWN] = VK_LMENU;
+       keymap[DIKI_ALT_R - DIKI_UNKNOWN] = VK_RMENU;
+       keymap[DIKI_TAB - DIKI_UNKNOWN] = VK_TAB;
+       keymap[DIKI_ENTER - DIKI_UNKNOWN] = VK_RETURN;
+       keymap[DIKI_SPACE - DIKI_UNKNOWN] = VK_SPACE;
+       keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = VK_BACK;
+       keymap[DIKI_INSERT - DIKI_UNKNOWN] = VK_INSERT;
+       keymap[DIKI_DELETE - DIKI_UNKNOWN] = VK_DELETE;
+       keymap[DIKI_HOME - DIKI_UNKNOWN] = VK_HOME;
+       keymap[DIKI_END - DIKI_UNKNOWN] = VK_END;
+       keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = VK_PRIOR;
+       keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = VK_NEXT;
+       keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = VK_CAPITAL;
+       keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = VK_NUMLOCK;
+       keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = VK_SCROLL;
+       keymap[DIKI_PRINT - DIKI_UNKNOWN] = VK_PRINT;
+       keymap[DIKI_PAUSE - DIKI_UNKNOWN] = VK_PAUSE;
+       keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = VK_DIVIDE;
+       keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = VK_MULTIPLY;
+       keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = VK_SUBTRACT;
+       keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = VK_ADD;
+       keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = VK_RETURN;
+       keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = VK_DECIMAL;
+       
+       keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = VK_OEM_3;
+       keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = VK_OEM_4;
+       keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = VK_OEM_6;
+       keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = VK_OEM_5;
+       keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = VK_OEM_1;
+       keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = VK_OEM_7;
+       keymap[DIKI_COMMA - DIKI_UNKNOWN] = VK_OEM_COMMA;
+       keymap[DIKI_PERIOD - DIKI_UNKNOWN] = VK_OEM_PERIOD;
+       keymap[DIKI_SLASH - DIKI_UNKNOWN] = VK_OEM_2;
+
+       keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = 0;
+
+       keymap[DIKI_KP_0 - DIKI_UNKNOWN] = VK_NUMPAD0;
+       keymap[DIKI_KP_1 - DIKI_UNKNOWN] = VK_NUMPAD1;
+       keymap[DIKI_KP_2 - DIKI_UNKNOWN] = VK_NUMPAD2;
+       keymap[DIKI_KP_3 - DIKI_UNKNOWN] = VK_NUMPAD3;
+       keymap[DIKI_KP_4 - DIKI_UNKNOWN] = VK_NUMPAD4;
+       keymap[DIKI_KP_5 - DIKI_UNKNOWN] = VK_NUMPAD5;
+       keymap[DIKI_KP_6 - DIKI_UNKNOWN] = VK_NUMPAD6;
+       keymap[DIKI_KP_7 - DIKI_UNKNOWN] = VK_NUMPAD7;
+       keymap[DIKI_KP_8 - DIKI_UNKNOWN] = VK_NUMPAD8;
+       keymap[DIKI_KP_9 - DIKI_UNKNOWN] = VK_NUMPAD9;
+
+       keymap[DIKI_META_L - DIKI_UNKNOWN] = VK_LWIN;
+       keymap[DIKI_META_R - DIKI_UNKNOWN] = VK_RWIN;
+       keymap[DIKI_SUPER_L - DIKI_UNKNOWN] = VK_APPS;
+       
+       
+       memset(functionmap, 0, sizeof(functionmap));
+       
+       functionmap[DFB_FUNCTION_KEY(23) - DFB_FUNCTION_KEY(0)] = VK_HANGUL;
+       functionmap[DFB_FUNCTION_KEY(24) - DFB_FUNCTION_KEY(0)] = VK_HANJA;
+
+}
+
+void df_send_mouse_button_event(rdpInput* input, boolean down, uint32 button, uint16 x, uint16 y)
+{
+       uint16 flags;
+
+       flags = (down) ? PTR_FLAGS_DOWN : 0;
+
+       if (button == DIBI_LEFT)
+               flags |= PTR_FLAGS_BUTTON1;
+       else if (button == DIBI_RIGHT)
+               flags |= PTR_FLAGS_BUTTON2;
+       else if (button == DIBI_MIDDLE)
+               flags |= PTR_FLAGS_BUTTON3;
+
+       if (flags != 0)
+               input->MouseEvent(input, flags, x, y);
+}
+
+void df_send_mouse_motion_event(rdpInput* input, uint16 x, uint16 y)
+{
+       input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
+}
+
+void df_send_mouse_wheel_event(rdpInput* input, sint16 axisrel, uint16 x, uint16 y)
+{
+       uint16 flags = PTR_FLAGS_WHEEL;
+
+       if (axisrel < 0)
+               flags |= 0x0078;
+       else
+               flags |= PTR_FLAGS_WHEEL_NEGATIVE | 0x0088;
+
+       input->MouseEvent(input, flags, x, y);
+}
+
+void df_send_keyboard_event(rdpInput* input, boolean down, uint8 keycode, uint8 function)
+{
+       uint16 flags;
+       uint8 vkcode;
+       uint8 scancode;
+       boolean extended;
+       
+       if (keycode)
+               vkcode = keymap[keycode];
+       else if (function)
+               vkcode = functionmap[function];
+       else
+               return;
+       
+       scancode = freerdp_kbd_get_scancode_by_virtualkey(vkcode, &extended);
+
+       flags = (extended) ? KBD_FLAGS_EXTENDED : 0;
+       flags |= (down) ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE;
+
+       input->KeyboardEvent(input, flags, scancode);
+}
+
+boolean df_event_process(freerdp* instance, DFBEvent* event)
+{
+       int flags;
+       rdpGdi* gdi;
+       dfInfo* dfi;
+       int pointer_x;
+       int pointer_y;
+       DFBInputEvent* input_event;
+
+       gdi = instance->context->gdi;
+       dfi = ((dfContext*) instance->context)->dfi;
+
+       dfi->layer->GetCursorPosition(dfi->layer, &pointer_x, &pointer_y);
+
+       if (event->clazz == DFEC_INPUT)
+       {
+               flags = 0;
+               input_event = (DFBInputEvent*) event;
+
+               switch (input_event->type)
+               {
+                       case DIET_AXISMOTION:
+
+                               if (pointer_x > (gdi->width - 1))
+                                       pointer_x = gdi->width - 1;
+
+                               if (pointer_y > (gdi->height - 1))
+                                       pointer_y = gdi->height - 1;
+
+                               if (input_event->axis == DIAI_Z)
+                               {
+                                       df_send_mouse_wheel_event(instance->input, input_event->axisrel, pointer_x, pointer_y);
+                               }
+                               else
+                               {
+                                       df_send_mouse_motion_event(instance->input, pointer_x, pointer_y);
+                               }
+                               break;
+
+                       case DIET_BUTTONPRESS:
+                               df_send_mouse_button_event(instance->input, true, input_event->button, pointer_x, pointer_y);
+                               break;
+
+                       case DIET_BUTTONRELEASE:
+                               df_send_mouse_button_event(instance->input, false, input_event->button, pointer_x, pointer_y);
+                               break;
+
+                       case DIET_KEYPRESS:
+                               df_send_keyboard_event(instance->input, true, input_event->key_id - DIKI_UNKNOWN, input_event->key_symbol - DFB_FUNCTION_KEY(0));
+                               break;
+
+                       case DIET_KEYRELEASE:
+                               df_send_keyboard_event(instance->input, false, input_event->key_id - DIKI_UNKNOWN, input_event->key_symbol - DFB_FUNCTION_KEY(0));
+                               break;
+
+                       case DIET_UNKNOWN:
+                               break;
+               }
+       }
+
+       return true;
+}
diff --git a/client/DirectFB/df_event.h b/client/DirectFB/df_event.h
new file mode 100644 (file)
index 0000000..ebe20cd
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * DirectFB Event Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DF_EVENT_H
+#define __DF_EVENT_H
+
+#include "dfreerdp.h"
+
+void df_keyboard_init();
+boolean df_event_process(freerdp* instance, DFBEvent* event);
+
+#endif /* __DF_EVENT_H */
diff --git a/client/DirectFB/df_graphics.c b/client/DirectFB/df_graphics.c
new file mode 100644 (file)
index 0000000..3203a59
--- /dev/null
@@ -0,0 +1,121 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * DirectFB Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+
+#include "df_graphics.h"
+
+/* Pointer Class */
+
+void df_Pointer_New(rdpContext* context, rdpPointer* pointer)
+{
+       dfInfo* dfi;
+       DFBResult result;
+       dfPointer* df_pointer;
+       DFBSurfaceDescription dsc;
+
+       dfi = ((dfContext*) context)->dfi;
+       df_pointer = (dfPointer*) pointer;
+
+       dsc.flags = DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
+       dsc.caps = DSCAPS_SYSTEMONLY;
+       dsc.width = pointer->width;
+       dsc.height = pointer->height;
+       dsc.pixelformat = DSPF_ARGB;
+
+       result = dfi->dfb->CreateSurface(dfi->dfb, &dsc, &(df_pointer->surface));
+
+       if (result == DFB_OK)
+       {
+               int pitch;
+               uint8* point = NULL;
+
+               df_pointer->xhot = pointer->xPos;
+               df_pointer->yhot = pointer->yPos;
+
+               result = df_pointer->surface->Lock(df_pointer->surface,
+                               DSLF_WRITE, (void**) &point, &pitch);
+
+               if (result != DFB_OK)
+               {
+                       DirectFBErrorFatal("Error while creating pointer surface", result);
+                       return;
+               }
+
+               if ((pointer->andMaskData != 0) && (pointer->xorMaskData != 0))
+               {
+                       freerdp_alpha_cursor_convert(point, pointer->xorMaskData, pointer->andMaskData,
+                                       pointer->width, pointer->height, pointer->xorBpp, dfi->clrconv);
+               }
+
+               if (pointer->xorBpp > 24)
+               {
+                       freerdp_image_swap_color_order(point, pointer->width, pointer->height);
+               }
+
+               df_pointer->surface->Unlock(df_pointer->surface);
+       }
+}
+
+void df_Pointer_Free(rdpContext* context, rdpPointer* pointer)
+{
+       dfPointer* df_pointer = (dfPointer*) pointer;
+       df_pointer->surface->Release(df_pointer->surface);
+}
+
+void df_Pointer_Set(rdpContext* context, rdpPointer* pointer)
+{
+       dfInfo* dfi;
+       DFBResult result;
+       dfPointer* df_pointer;
+
+       dfi = ((dfContext*) context)->dfi;
+       df_pointer = (dfPointer*) pointer;
+
+       dfi->layer->SetCooperativeLevel(dfi->layer, DLSCL_ADMINISTRATIVE);
+
+       result = dfi->layer->SetCursorShape(dfi->layer,
+                       df_pointer->surface, df_pointer->xhot, df_pointer->yhot);
+
+       if (result != DFB_OK)
+       {
+               DirectFBErrorFatal("SetCursorShape Error", result);
+               return;
+       }
+
+       dfi->layer->SetCooperativeLevel(dfi->layer, DLSCL_SHARED);
+}
+
+/* Graphics Module */
+
+void df_register_graphics(rdpGraphics* graphics)
+{
+       rdpPointer* pointer;
+
+       pointer = xnew(rdpPointer);
+       pointer->size = sizeof(dfPointer);
+
+       pointer->New = df_Pointer_New;
+       pointer->Free = df_Pointer_Free;
+       pointer->Set = df_Pointer_Set;
+
+       graphics_register_pointer(graphics, pointer);
+       xfree(pointer);
+}
+
diff --git a/client/DirectFB/df_graphics.h b/client/DirectFB/df_graphics.h
new file mode 100644 (file)
index 0000000..fe2d5c8
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * DirectFB Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DF_GRAPHICS_H
+#define __DF_GRAPHICS_H
+
+#include "dfreerdp.h"
+
+void df_register_graphics(rdpGraphics* graphics);
+
+#endif /* __DF_GRAPHICS_H */
diff --git a/client/DirectFB/dfreerdp.c b/client/DirectFB/dfreerdp.c
new file mode 100644 (file)
index 0000000..1af7cc9
--- /dev/null
@@ -0,0 +1,476 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * DirectFB Client
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <pthread.h>
+#include <locale.h>
+#include <freerdp/utils/args.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/semaphore.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/constants.h>
+#include <freerdp/plugins/cliprdr.h>
+
+#include "df_event.h"
+#include "df_graphics.h"
+
+#include "dfreerdp.h"
+
+static freerdp_sem g_sem;
+static int g_thread_count = 0;
+
+struct thread_data
+{
+       freerdp* instance;
+};
+
+void df_context_new(freerdp* instance, rdpContext* context)
+{
+       context->channels = freerdp_channels_new();
+}
+
+void df_context_free(freerdp* instance, rdpContext* context)
+{
+
+}
+
+void df_begin_paint(rdpContext* context)
+{
+       rdpGdi* gdi = context->gdi;
+       gdi->primary->hdc->hwnd->invalid->null = 1;
+}
+
+void df_end_paint(rdpContext* context)
+{
+       rdpGdi* gdi;
+       dfInfo* dfi;
+
+       gdi = context->gdi;
+       dfi = ((dfContext*) context)->dfi;
+
+       if (gdi->primary->hdc->hwnd->invalid->null)
+               return;
+
+#if 1
+       dfi->update_rect.x = gdi->primary->hdc->hwnd->invalid->x;
+       dfi->update_rect.y = gdi->primary->hdc->hwnd->invalid->y;
+       dfi->update_rect.w = gdi->primary->hdc->hwnd->invalid->w;
+       dfi->update_rect.h = gdi->primary->hdc->hwnd->invalid->h;
+#else
+       dfi->update_rect.x = 0;
+       dfi->update_rect.y = 0;
+       dfi->update_rect.w = gdi->width;
+       dfi->update_rect.h = gdi->height;
+#endif
+
+       dfi->primary->Blit(dfi->primary, dfi->surface, &(dfi->update_rect), dfi->update_rect.x, dfi->update_rect.y);
+}
+
+boolean df_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount)
+{
+       dfInfo* dfi;
+
+       dfi = ((dfContext*) instance->context)->dfi;
+
+       rfds[*rcount] = (void*)(long)(dfi->read_fds);
+       (*rcount)++;
+
+       return true;
+}
+
+boolean df_check_fds(freerdp* instance, fd_set* set)
+{
+       dfInfo* dfi;
+
+       dfi = ((dfContext*) instance->context)->dfi;
+
+       if (!FD_ISSET(dfi->read_fds, set))
+               return true;
+
+       if (read(dfi->read_fds, &(dfi->event), sizeof(dfi->event)) > 0)
+               df_event_process(instance, &(dfi->event));
+
+       return true;
+}
+
+boolean df_pre_connect(freerdp* instance)
+{
+       dfInfo* dfi;
+       boolean bitmap_cache;
+       dfContext* context;
+       rdpSettings* settings;
+
+       dfi = (dfInfo*) xzalloc(sizeof(dfInfo));
+       context = ((dfContext*) instance->context);
+       context->dfi = dfi;
+
+       settings = instance->settings;
+       bitmap_cache = settings->bitmap_cache;
+
+       settings->order_support[NEG_DSTBLT_INDEX] = true;
+       settings->order_support[NEG_PATBLT_INDEX] = true;
+       settings->order_support[NEG_SCRBLT_INDEX] = true;
+       settings->order_support[NEG_OPAQUE_RECT_INDEX] = true;
+       settings->order_support[NEG_DRAWNINEGRID_INDEX] = false;
+       settings->order_support[NEG_MULTIDSTBLT_INDEX] = false;
+       settings->order_support[NEG_MULTIPATBLT_INDEX] = false;
+       settings->order_support[NEG_MULTISCRBLT_INDEX] = false;
+       settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = true;
+       settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = false;
+       settings->order_support[NEG_LINETO_INDEX] = true;
+       settings->order_support[NEG_POLYLINE_INDEX] = true;
+       settings->order_support[NEG_MEMBLT_INDEX] = bitmap_cache;
+       settings->order_support[NEG_MEM3BLT_INDEX] = false;
+       settings->order_support[NEG_MEMBLT_V2_INDEX] = bitmap_cache;
+       settings->order_support[NEG_MEM3BLT_V2_INDEX] = false;
+       settings->order_support[NEG_SAVEBITMAP_INDEX] = false;
+       settings->order_support[NEG_GLYPH_INDEX_INDEX] = false;
+       settings->order_support[NEG_FAST_INDEX_INDEX] = false;
+       settings->order_support[NEG_FAST_GLYPH_INDEX] = false;
+       settings->order_support[NEG_POLYGON_SC_INDEX] = false;
+       settings->order_support[NEG_POLYGON_CB_INDEX] = false;
+       settings->order_support[NEG_ELLIPSE_SC_INDEX] = false;
+       settings->order_support[NEG_ELLIPSE_CB_INDEX] = false;
+
+       dfi->clrconv = xnew(CLRCONV);
+       dfi->clrconv->alpha = 1;
+       dfi->clrconv->invert = 0;
+       dfi->clrconv->rgb555 = 0;
+       dfi->clrconv->palette = xnew(rdpPalette);
+
+       freerdp_channels_pre_connect(instance->context->channels, instance);
+
+       return true;
+}
+
+boolean df_post_connect(freerdp* instance)
+{
+       rdpGdi* gdi;
+       dfInfo* dfi;
+       dfContext* context;
+
+       context = ((dfContext*) instance->context);
+       dfi = context->dfi;
+
+       gdi_init(instance, CLRCONV_ALPHA | CLRCONV_INVERT | CLRBUF_16BPP | CLRBUF_32BPP, NULL);
+       gdi = instance->context->gdi;
+
+       dfi->err = DirectFBCreate(&(dfi->dfb));
+
+       dfi->dsc.flags = DSDESC_CAPS;
+       dfi->dsc.caps = DSCAPS_PRIMARY;
+       dfi->err = dfi->dfb->CreateSurface(dfi->dfb, &(dfi->dsc), &(dfi->primary));
+       dfi->err = dfi->primary->GetSize(dfi->primary, &(gdi->width), &(gdi->height));
+       dfi->dfb->SetVideoMode(dfi->dfb, gdi->width, gdi->height, gdi->dstBpp);
+       dfi->dfb->CreateInputEventBuffer(dfi->dfb, DICAPS_ALL, DFB_TRUE, &(dfi->event_buffer));
+       dfi->event_buffer->CreateFileDescriptor(dfi->event_buffer, &(dfi->read_fds));
+
+       dfi->dfb->GetDisplayLayer(dfi->dfb, 0, &(dfi->layer));
+       dfi->layer->EnableCursor(dfi->layer, 1);
+
+       dfi->dsc.flags = DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PREALLOCATED | DSDESC_PIXELFORMAT;
+       dfi->dsc.caps = DSCAPS_SYSTEMONLY;
+       dfi->dsc.width = gdi->width;
+       dfi->dsc.height = gdi->height;
+
+       if (gdi->dstBpp == 32 || gdi->dstBpp == 24)
+               dfi->dsc.pixelformat = DSPF_AiRGB;
+       else if (gdi->dstBpp == 16 || gdi->dstBpp == 15)
+               dfi->dsc.pixelformat = DSPF_RGB16;
+       else if (gdi->dstBpp == 8)
+               dfi->dsc.pixelformat = DSPF_RGB332;
+       else
+               dfi->dsc.pixelformat = DSPF_AiRGB;
+
+       dfi->dsc.preallocated[0].data = gdi->primary_buffer;
+       dfi->dsc.preallocated[0].pitch = gdi->width * gdi->bytesPerPixel;
+       dfi->dfb->CreateSurface(dfi->dfb, &(dfi->dsc), &(dfi->surface));
+
+       instance->update->BeginPaint = df_begin_paint;
+       instance->update->EndPaint = df_end_paint;
+
+       df_keyboard_init();
+
+       pointer_cache_register_callbacks(instance->update);
+       df_register_graphics(instance->context->graphics);
+
+       freerdp_channels_post_connect(instance->context->channels, instance);
+
+       return true;
+}
+
+static int df_process_plugin_args(rdpSettings* settings, const char* name,
+       RDP_PLUGIN_DATA* plugin_data, void* user_data)
+{
+       rdpChannels* channels = (rdpChannels*) user_data;
+
+       printf("loading plugin %s\n", name);
+       freerdp_channels_load_plugin(channels, settings, name, plugin_data);
+
+       return 1;
+}
+
+boolean df_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint)
+{
+       printf("Certificate details:\n");
+       printf("\tSubject: %s\n", subject);
+       printf("\tIssuer: %s\n", issuer);
+       printf("\tThumbprint: %s\n", fingerprint);
+       printf("The above X.509 certificate could not be verified, possibly because you do not have "
+               "the CA certificate in your certificate store, or the certificate has expired. "
+               "Please look at the documentation on how to create local certificate store for a private CA.\n");
+
+       char answer;
+       while (1)
+       {
+               printf("Do you trust the above certificate? (Y/N) ");
+               answer = fgetc(stdin);
+
+               if (answer == 'y' || answer == 'Y')
+               {
+                       return true;
+               }
+               else if (answer == 'n' || answer == 'N')
+               {
+                       break;
+               }
+       }
+
+       return false;
+}
+
+static int
+df_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size)
+{
+       return freerdp_channels_data(instance, channelId, data, size, flags, total_size);
+}
+
+static void
+df_process_cb_monitor_ready_event(rdpChannels* channels, freerdp* instance)
+{
+       RDP_EVENT* event;
+       RDP_CB_FORMAT_LIST_EVENT* format_list_event;
+
+       event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+       format_list_event = (RDP_CB_FORMAT_LIST_EVENT*)event;
+       format_list_event->num_formats = 0;
+
+       freerdp_channels_send_event(channels, event);
+}
+
+static void
+df_process_channel_event(rdpChannels* channels, freerdp* instance)
+{
+       RDP_EVENT* event;
+
+       event = freerdp_channels_pop_event(channels);
+
+       if (event)
+       {
+               switch (event->event_type)
+               {
+                       case RDP_EVENT_TYPE_CB_MONITOR_READY:
+                               df_process_cb_monitor_ready_event(channels, instance);
+                               break;
+                       default:
+                               printf("df_process_channel_event: unknown event type %d\n", event->event_type);
+                               break;
+               }
+
+               freerdp_event_free(event);
+       }
+}
+
+static void df_free(dfInfo* dfi)
+{
+       dfi->dfb->Release(dfi->dfb);
+       xfree(dfi);
+}
+
+int dfreerdp_run(freerdp* instance)
+{
+       int i;
+       int fds;
+       int max_fds;
+       int rcount;
+       int wcount;
+       void* rfds[32];
+       void* wfds[32];
+       fd_set rfds_set;
+       fd_set wfds_set;
+       dfInfo* dfi;
+       dfContext* context;
+       rdpChannels* channels;
+
+       memset(rfds, 0, sizeof(rfds));
+       memset(wfds, 0, sizeof(wfds));
+
+       if (!freerdp_connect(instance))
+               return 0;
+
+       context = (dfContext*) instance->context;
+
+       dfi = context->dfi;
+       channels = instance->context->channels;
+
+       while (1)
+       {
+               rcount = 0;
+               wcount = 0;
+
+               if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get channel manager file descriptor\n");
+                       break;
+               }
+               if (df_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get dfreerdp file descriptor\n");
+                       break;
+               }
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+               FD_ZERO(&wfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               if (select(max_fds + 1, &rfds_set, &wfds_set, NULL, NULL) == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("dfreerdp_run: select failed\n");
+                               break;
+                       }
+               }
+
+               if (freerdp_check_fds(instance) != true)
+               {
+                       printf("Failed to check FreeRDP file descriptor\n");
+                       break;
+               }
+               if (df_check_fds(instance, &rfds_set) != true)
+               {
+                       printf("Failed to check dfreerdp file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_check_fds(channels, instance) != true)
+               {
+                       printf("Failed to check channel manager file descriptor\n");
+                       break;
+               }
+               df_process_channel_event(channels, instance);
+       }
+
+       freerdp_channels_close(channels, instance);
+       freerdp_channels_free(channels);
+       df_free(dfi);
+       gdi_free(instance);
+       freerdp_disconnect(instance);
+       freerdp_free(instance);
+
+       return 0;
+}
+
+void* thread_func(void* param)
+{
+       struct thread_data* data;
+       data = (struct thread_data*) param;
+
+       dfreerdp_run(data->instance);
+
+       xfree(data);
+
+       pthread_detach(pthread_self());
+
+       g_thread_count--;
+
+        if (g_thread_count < 1)
+                freerdp_sem_signal(g_sem);
+
+       return NULL;
+}
+
+int main(int argc, char* argv[])
+{
+       pthread_t thread;
+       freerdp* instance;
+       dfContext* context;
+       rdpChannels* channels;
+       struct thread_data* data;
+
+       setlocale(LC_ALL, "");
+
+       freerdp_channels_global_init();
+
+       g_sem = freerdp_sem_new(1);
+
+       instance = freerdp_new();
+       instance->PreConnect = df_pre_connect;
+       instance->PostConnect = df_post_connect;
+       instance->VerifyCertificate = df_verify_certificate;
+       instance->ReceiveChannelData = df_receive_channel_data;
+
+       instance->context_size = sizeof(dfContext);
+       instance->ContextNew = df_context_new;
+       instance->ContextFree = df_context_free;
+       freerdp_context_new(instance);
+
+       context = (dfContext*) instance->context;
+       channels = instance->context->channels;
+
+       DirectFBInit(&argc, &argv);
+       freerdp_parse_args(instance->settings, argc, argv, df_process_plugin_args, channels, NULL, NULL);
+
+       data = (struct thread_data*) xzalloc(sizeof(struct thread_data));
+       data->instance = instance;
+
+       g_thread_count++;
+       pthread_create(&thread, 0, thread_func, data);
+
+       while (g_thread_count > 0)
+       {
+                freerdp_sem_wait(g_sem);
+       }
+
+       freerdp_channels_global_uninit();
+
+       return 0;
+}
diff --git a/client/DirectFB/dfreerdp.h b/client/DirectFB/dfreerdp.h
new file mode 100644 (file)
index 0000000..622329d
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * DirectFB Client
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DFREERDP_H
+#define __DFREERDP_H
+
+#include <freerdp/freerdp.h>
+#include <freerdp/graphics.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/channels/channels.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <directfb.h>
+
+typedef struct df_info dfInfo;
+
+struct df_context
+{
+       rdpContext _p;
+
+       dfInfo* dfi;
+       rdpSettings* settings;
+};
+typedef struct df_context dfContext;
+
+struct df_pointer
+{
+       rdpPointer pointer;
+       IDirectFBSurface* surface;
+       uint32 xhot;
+       uint32 yhot;
+};
+typedef struct df_pointer dfPointer;
+
+struct df_info
+{
+       int read_fds;
+       DFBResult err;
+       IDirectFB* dfb;
+       DFBEvent event;
+       HCLRCONV clrconv;
+       DFBRectangle update_rect;
+       DFBSurfaceDescription dsc;
+       IDirectFBSurface* primary;
+       IDirectFBSurface* surface;
+       IDirectFBDisplayLayer* layer;
+       IDirectFBEventBuffer* event_buffer;
+};
+
+#endif /* __DFREERDP_H */
diff --git a/client/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt
new file mode 100644 (file)
index 0000000..68b4671
--- /dev/null
@@ -0,0 +1,36 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP Windows cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+add_executable(wfreerdp WIN32
+       wf_gdi.c
+       wf_gdi.h
+       wf_event.c
+       wf_event.h
+       wf_graphics.c
+       wf_graphics.h
+       wfreerdp.c
+       wfreerdp.h)
+
+target_link_libraries(wfreerdp freerdp-core)
+target_link_libraries(wfreerdp freerdp-gdi)
+target_link_libraries(wfreerdp freerdp-utils)
+target_link_libraries(wfreerdp freerdp-codec)
+target_link_libraries(wfreerdp freerdp-channels)
+
+install(TARGETS wfreerdp DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/client/Windows/wf_event.c b/client/Windows/wf_event.c
new file mode 100644 (file)
index 0000000..e2f04d3
--- /dev/null
@@ -0,0 +1,223 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Event Handling
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <freerdp/freerdp.h>
+#include "wfreerdp.h"
+
+#include "wf_event.h"
+
+static HWND g_focus_hWnd;
+extern HCURSOR g_default_cursor;
+
+#define X_POS(lParam) (lParam & 0xffff)
+#define Y_POS(lParam) ((lParam >> 16) & 0xffff)
+
+LRESULT CALLBACK wf_ll_kbd_proc(int nCode, WPARAM wParam, LPARAM lParam)
+{
+       DWORD flags;
+       wfInfo* wfi;
+       uint8 scanCode;
+       rdpInput* input;
+       uint16 kbdFlags;
+       PKBDLLHOOKSTRUCT p;
+
+       DEBUG_KBD("Low-level keyboard hook, hWnd %X nCode %X wParam %X\n", g_focus_hWnd, nCode, wParam);
+
+       if (g_focus_hWnd && (nCode == HC_ACTION))
+       {
+               switch (wParam)
+               {
+                       case WM_KEYDOWN:
+                       case WM_SYSKEYDOWN:
+                       case WM_KEYUP:
+                       case WM_SYSKEYUP:
+                               wfi = (wfInfo*) GetWindowLongPtr(g_focus_hWnd, GWLP_USERDATA);
+                               p = (PKBDLLHOOKSTRUCT) lParam;
+                               scanCode = (uint8) p->scanCode;
+                               input = wfi->instance->input;
+                               flags = p->flags;
+                               kbdFlags = 0;
+
+                               DEBUG_KBD("keydown %d scanCode %04X flags %02X vkCode %02X\n",
+                                       (wParam == WM_KEYDOWN), scanCode, flags, p->vkCode);
+
+                               if (wfi->fs_toggle &&
+                                       ((p->vkCode == VK_RETURN) || (p->vkCode == VK_CANCEL)) &&
+                                       (GetAsyncKeyState(VK_CONTROL) & 0x8000) &&
+                                       (GetAsyncKeyState(VK_MENU) & 0x8000)) /* could also use flags & LLKHF_ALTDOWN */
+                               {
+                                       if (wParam == WM_KEYDOWN)
+                                               //wf_toggle_fullscreen(wfi);
+                                       return 1;
+                               }
+
+                               if (scanCode == 0x45) /* NumLock-ish */
+                               {
+                                       if (flags & LLKHF_EXTENDED)
+                                       {
+                                               /* Windows sends NumLock as extended - rdp doesn't */
+                                               DEBUG_KBD("hack: NumLock (x45) should not be extended\n");
+                                               flags &= ~LLKHF_EXTENDED;
+                                       }
+                                       else
+                                       {
+                                               /* Windows sends Pause as if it was a RDP NumLock (handled above).
+                                                * It must however be sent as a one-shot Ctrl+NumLock */
+                                               if (wParam == WM_KEYDOWN)
+                                               {
+                                                       DEBUG_KBD("Pause, sent as Ctrl+NumLock\n");
+                                                       input->KeyboardEvent(input, KBD_FLAGS_DOWN, 0x1D); /* Ctrl down */
+                                                       input->KeyboardEvent(input, KBD_FLAGS_DOWN, 0x45); /* NumLock down */
+                                                       input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x1D); /* Ctrl up */
+                                                       input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x45); /* NumLock up */
+                                               }
+                                               else
+                                               {
+                                                       DEBUG_KBD("Pause up\n");
+                                               }
+
+                                               return 1;
+                                       }
+                               }
+
+                               if ((scanCode == 0x36) && (flags & LLKHF_EXTENDED))
+                               {
+                                       DEBUG_KBD("hack: right shift (x36) should not be extended\n");
+                                       flags &= ~LLKHF_EXTENDED;
+                               }
+
+                               kbdFlags |= (flags & LLKHF_UP) ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
+                               kbdFlags |= (flags & LLKHF_EXTENDED) ? KBD_FLAGS_EXTENDED : 0;
+                               input->KeyboardEvent(input, kbdFlags, scanCode);
+
+                               if (p->vkCode == VK_CAPITAL)
+                                       DEBUG_KBD("caps lock is processed on client side too to toggle caps lock indicator\n");
+                               else
+                                       return 1;
+
+                               break;
+               }
+       }
+
+       return CallNextHookEx(NULL, nCode, wParam, lParam);
+}
+
+LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+       HDC hdc;
+       LONG ptr;
+       wfInfo* wfi;
+       int x, y, w, h;
+       PAINTSTRUCT ps;
+       rdpInput* input;
+       boolean processed;
+
+       processed = true;
+       ptr = GetWindowLongPtr(hWnd, GWLP_USERDATA);
+       wfi = (wfInfo*) ptr;
+
+       if (wfi != NULL)
+       {
+               input = wfi->instance->input;
+
+               switch (Msg)
+               {
+                       case WM_PAINT:
+                               hdc = BeginPaint(hWnd, &ps);
+                               
+                               x = ps.rcPaint.left;
+                               y = ps.rcPaint.top;
+                               w = ps.rcPaint.right - ps.rcPaint.left + 1;
+                               h = ps.rcPaint.bottom - ps.rcPaint.top + 1;
+
+                               //printf("WM_PAINT: x:%d y:%d w:%d h:%d\n", x, y, w, h);
+
+                               BitBlt(hdc, x, y, w, h, wfi->primary->hdc, x, y, SRCCOPY);
+
+                               EndPaint(hWnd, &ps);
+                               break;
+
+                       case WM_LBUTTONDOWN:
+                               input->MouseEvent(input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1, X_POS(lParam), Y_POS(lParam));
+                               break;
+
+                       case WM_LBUTTONUP:
+                               input->MouseEvent(input, PTR_FLAGS_BUTTON1, X_POS(lParam), Y_POS(lParam));
+                               break;
+
+                       case WM_RBUTTONDOWN:
+                               input->MouseEvent(input, PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2, X_POS(lParam), Y_POS(lParam));
+                               break;
+
+                       case WM_RBUTTONUP:
+                               input->MouseEvent(input, PTR_FLAGS_BUTTON2, X_POS(lParam), Y_POS(lParam));
+                               break;
+
+                       case WM_MOUSEMOVE:
+                               input->MouseEvent(input, PTR_FLAGS_MOVE, X_POS(lParam), Y_POS(lParam));
+                               break;
+
+                       case WM_SETCURSOR:
+                               SetCursor(wfi->cursor);
+                               break;
+
+                       default:
+                               processed = false;
+                               break;
+               }
+       }
+       else
+       {
+               processed = false;
+       }
+
+       if (processed)
+               return 0;
+
+       switch (Msg)
+       {
+               case WM_DESTROY:
+                       PostQuitMessage(WM_QUIT);
+                       break;
+
+               case WM_SETCURSOR:
+                       SetCursor(g_default_cursor);
+                       break;
+
+               case WM_SETFOCUS:
+                       DEBUG_KBD("getting focus %X\n", hWnd);
+                       g_focus_hWnd = hWnd;
+                       break;
+
+               case WM_KILLFOCUS:
+                       DEBUG_KBD("loosing focus %X\n", hWnd);
+                       if (g_focus_hWnd == hWnd)
+                               g_focus_hWnd = NULL;
+                       break;
+
+               default:
+                       return DefWindowProc(hWnd, Msg, wParam, lParam);
+                       break;
+       }
+
+       return 0;
+}
diff --git a/client/Windows/wf_event.h b/client/Windows/wf_event.h
new file mode 100644 (file)
index 0000000..57ada3f
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Event Handling
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WF_EVENT_H
+#define __WF_EVENT_H
+
+#include "wfreerdp.h"
+
+LRESULT CALLBACK wf_ll_kbd_proc(int nCode, WPARAM wParam, LPARAM lParam);
+LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
+
+#ifdef WITH_DEBUG_KBD
+#define DEBUG_KBD(fmt, ...) DEBUG_CLASS(KBD, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_KBD(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __WF_EVENT_H */
diff --git a/client/Windows/wf_gdi.c b/client/Windows/wf_gdi.c
new file mode 100644 (file)
index 0000000..9943c37
--- /dev/null
@@ -0,0 +1,545 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windows GDI
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <conio.h>
+
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/constants.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/codec/bitmap.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/codec/nsc.h>
+
+#include "wfreerdp.h"
+#include "wf_graphics.h"
+
+const uint8 wf_rop2_table[] =
+{
+       R2_BLACK,       /* 0 */
+       R2_NOTMERGEPEN, /* DPon */
+       R2_MASKNOTPEN,  /* DPna */
+       R2_NOTCOPYPEN,  /* Pn */
+       R2_MASKPENNOT,  /* PDna */
+       R2_NOT,         /* Dn */
+       R2_XORPEN,      /* DPx */
+       R2_NOTMASKPEN,  /* DPan */
+       R2_MASKPEN,     /* DPa */
+       R2_NOTXORPEN,   /* DPxn */
+       R2_NOP,         /* D */
+       R2_MERGENOTPEN, /* DPno */
+       R2_COPYPEN,     /* P */
+       R2_MERGEPENNOT, /* PDno */
+       R2_MERGEPEN,    /* PDo */
+       R2_WHITE,       /* 1 */
+};
+
+boolean wf_set_rop2(HDC hdc, int rop2)
+{
+       if ((rop2 < 0x01) || (rop2 > 0x10))
+       {
+               printf("Unsupported ROP2: %d\n", rop2);
+               return false;
+       }
+
+       SetROP2(hdc, wf_rop2_table[rop2 - 1]);
+
+       return true;
+}
+
+wfBitmap* wf_glyph_new(wfInfo* wfi, GLYPH_DATA* glyph)
+{
+       wfBitmap* glyph_bmp;
+       glyph_bmp = wf_image_new(wfi, glyph->cx, glyph->cy, 1, glyph->aj);
+       return glyph_bmp;
+}
+
+void wf_glyph_free(wfBitmap* glyph)
+{
+       wf_image_free(glyph);
+}
+
+uint8* wf_glyph_convert(wfInfo* wfi, int width, int height, uint8* data)
+{
+       int indexx;
+       int indexy;
+       uint8* src;
+       uint8* dst;
+       uint8* cdata;
+       int src_bytes_per_row;
+       int dst_bytes_per_row;
+
+       src_bytes_per_row = (width + 7) / 8;
+       dst_bytes_per_row = src_bytes_per_row + (src_bytes_per_row % 2);
+       cdata = (uint8 *) malloc(dst_bytes_per_row * height);
+
+       src = data;
+       for (indexy = 0; indexy < height; indexy++)
+       {
+               dst = cdata + indexy * dst_bytes_per_row;
+
+               for (indexx = 0; indexx < dst_bytes_per_row; indexx++)
+               {
+                       if (indexx < src_bytes_per_row)
+                               *dst++ = *src++;
+                       else
+                               *dst++ = 0;
+               }
+       }
+
+       return cdata;
+}
+
+HBRUSH wf_create_brush(wfInfo * wfi, rdpBrush* brush, uint32 color, int bpp)
+{
+       int i;
+       HBRUSH br;
+       LOGBRUSH lbr;
+       uint8* cdata;
+       uint8 ipattern[8];
+       HBITMAP pattern = NULL;
+
+       lbr.lbStyle = brush->style;
+
+       if (lbr.lbStyle == BS_DIBPATTERN || lbr.lbStyle == BS_DIBPATTERN8X8 || lbr.lbStyle == BS_DIBPATTERNPT)
+               lbr.lbColor = DIB_RGB_COLORS;
+       else
+               lbr.lbColor = color;
+
+       if (lbr.lbStyle == BS_PATTERN || lbr.lbStyle == BS_PATTERN8X8)
+       {
+               if (brush->bpp > 1)
+               {
+                       pattern = wf_create_dib(wfi, 8, 8, bpp, brush->data, NULL);
+                       lbr.lbHatch = (ULONG_PTR) pattern;
+               }
+               else
+               {
+                       for (i = 0; i != 8; i++)
+                               ipattern[7 - i] = brush->data[i];
+       
+                       cdata = wf_glyph_convert(wfi, 8, 8, ipattern);
+                       pattern = CreateBitmap(8, 8, 1, 1, cdata);
+                       lbr.lbHatch = (ULONG_PTR) pattern;
+                       free(cdata);
+               }
+       }
+       else if (lbr.lbStyle == BS_HATCHED)
+       {
+               lbr.lbHatch = brush->hatch;
+       }
+       else
+       {
+               lbr.lbHatch = 0;
+       }
+
+       br = CreateBrushIndirect(&lbr);
+       SetBrushOrgEx(wfi->drawing->hdc, brush->x, brush->y, NULL);
+
+       if (pattern != NULL)
+               DeleteObject(pattern);
+
+       return br;
+}
+
+void wf_invalidate_region(wfInfo* wfi, int x, int y, int width, int height)
+{
+       wfi->update_rect.left = x;
+       wfi->update_rect.top = y;
+       wfi->update_rect.right = x + width;
+       wfi->update_rect.bottom = y + height;
+       InvalidateRect(wfi->hwnd, &(wfi->update_rect), FALSE);
+       gdi_InvalidateRegion(wfi->hdc, x, y, width, height);
+}
+
+void wf_toggle_fullscreen(wfInfo* wfi)
+{
+       ShowWindow(wfi->hwnd, SW_HIDE);
+       wfi->fullscreen = !wfi->fullscreen;
+       SetForegroundWindow(wfi->hwnd);
+}
+
+void wf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette)
+{
+
+}
+
+void wf_set_null_clip_rgn(wfInfo* wfi)
+{
+       SelectClipRgn(wfi->drawing->hdc, NULL);
+}
+
+void wf_set_clip_rgn(wfInfo* wfi, int x, int y, int width, int height)
+{
+       HRGN clip;
+       clip = CreateRectRgn(x, y, x + width, y + height);
+       SelectClipRgn(wfi->drawing->hdc, clip);
+       DeleteObject(clip);
+}
+
+void wf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds)
+{
+       HRGN hrgn;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       if (bounds != NULL)
+       {
+               hrgn = CreateRectRgn(bounds->left, bounds->top, bounds->right + 1, bounds->bottom + 1);
+               SelectClipRgn(wfi->drawing->hdc, hrgn);
+               DeleteObject(hrgn);
+       }
+       else
+       {
+               SelectClipRgn(wfi->drawing->hdc, NULL);
+       }
+}
+
+void wf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt)
+{
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       BitBlt(wfi->drawing->hdc, dstblt->nLeftRect, dstblt->nTopRect,
+                       dstblt->nWidth, dstblt->nHeight, NULL, 0, 0, gdi_rop3_code(dstblt->bRop));
+
+       wf_invalidate_region(wfi, dstblt->nLeftRect, dstblt->nTopRect,
+                       dstblt->nWidth, dstblt->nHeight);
+}
+
+void wf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt)
+{
+       HBRUSH brush;
+       HBRUSH org_brush;
+       int org_bkmode;
+       uint32 fgcolor;
+       uint32 bgcolor;
+       COLORREF org_bkcolor;
+       COLORREF org_textcolor;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       fgcolor = freerdp_color_convert_bgr(patblt->foreColor, wfi->srcBpp, 32, wfi->clrconv);
+       bgcolor = freerdp_color_convert_bgr(patblt->backColor, wfi->srcBpp, 32, wfi->clrconv);
+
+       brush = wf_create_brush(wfi, &patblt->brush, fgcolor, wfi->srcBpp);
+       org_bkmode = SetBkMode(wfi->drawing->hdc, OPAQUE);
+       org_bkcolor = SetBkColor(wfi->drawing->hdc, bgcolor);
+       org_textcolor = SetTextColor(wfi->drawing->hdc, fgcolor);
+       org_brush = (HBRUSH)SelectObject(wfi->drawing->hdc, brush);
+
+       PatBlt(wfi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect,
+               patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop));
+
+       SelectObject(wfi->drawing->hdc, org_brush);
+       DeleteObject(brush);
+
+       SetBkMode(wfi->drawing->hdc, org_bkmode);
+       SetBkColor(wfi->drawing->hdc, org_bkcolor);
+       SetTextColor(wfi->drawing->hdc, org_textcolor);
+
+       if (wfi->drawing == wfi->primary)
+               wf_invalidate_region(wfi, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight);
+}
+
+void wf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt)
+{
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       BitBlt(wfi->drawing->hdc, scrblt->nLeftRect, scrblt->nTopRect,
+                       scrblt->nWidth, scrblt->nHeight, wfi->primary->hdc,
+                       scrblt->nXSrc, scrblt->nYSrc, gdi_rop3_code(scrblt->bRop));
+
+       wf_invalidate_region(wfi, scrblt->nLeftRect, scrblt->nTopRect,
+                       scrblt->nWidth, scrblt->nHeight);
+}
+
+void wf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect)
+{
+       RECT rect;
+       HBRUSH brush;
+       uint32 brush_color;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       brush_color = freerdp_color_convert_var_bgr(opaque_rect->color, wfi->srcBpp, 24, wfi->clrconv);
+
+       rect.left = opaque_rect->nLeftRect;
+       rect.top = opaque_rect->nTopRect;
+       rect.right = opaque_rect->nLeftRect + opaque_rect->nWidth;
+       rect.bottom = opaque_rect->nTopRect + opaque_rect->nHeight;
+       brush = CreateSolidBrush(brush_color);
+       FillRect(wfi->drawing->hdc, &rect, brush);
+       DeleteObject(brush);
+
+       if (wfi->drawing == wfi->primary)
+               wf_invalidate_region(wfi, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1);
+}
+
+void wf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect)
+{
+       int i;
+       RECT rect;
+       HBRUSH brush;
+       uint32 brush_color;
+       DELTA_RECT* rectangle;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       for (i = 1; i < (int) multi_opaque_rect->numRectangles + 1; i++)
+       {
+               rectangle = &multi_opaque_rect->rectangles[i];
+
+               brush_color = freerdp_color_convert_var_bgr(multi_opaque_rect->color, wfi->srcBpp, 32, wfi->clrconv);
+
+               rect.left = rectangle->left;
+               rect.top = rectangle->top;
+               rect.right = rectangle->left + rectangle->width;
+               rect.bottom = rectangle->top + rectangle->height;
+               brush = CreateSolidBrush(brush_color);
+
+               brush = CreateSolidBrush(brush_color);
+               FillRect(wfi->drawing->hdc, &rect, brush);
+
+               if (wfi->drawing == wfi->primary)
+                       wf_invalidate_region(wfi, rect.left, rect.top, rect.right - rect.left + 1, rect.bottom - rect.top + 1);
+
+               DeleteObject(brush);
+       }
+}
+
+void wf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to)
+{
+       HPEN pen;
+       HPEN org_pen;
+       int x, y, w, h;
+       uint32 pen_color;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       pen_color = freerdp_color_convert_bgr(line_to->penColor, wfi->srcBpp, wfi->dstBpp, wfi->clrconv);
+
+       pen = CreatePen(line_to->penStyle, line_to->penWidth, pen_color);
+
+       wf_set_rop2(wfi->drawing->hdc, line_to->bRop2);
+       org_pen = (HPEN) SelectObject(wfi->drawing->hdc, pen);
+       
+       MoveToEx(wfi->drawing->hdc, line_to->nXStart, line_to->nYStart, NULL);
+       LineTo(wfi->drawing->hdc, line_to->nXEnd, line_to->nYEnd);
+
+       x = (line_to->nXStart < line_to->nXEnd) ? line_to->nXStart : line_to->nXEnd;
+       y = (line_to->nYStart < line_to->nYEnd) ? line_to->nYStart : line_to->nYEnd;
+       w = (line_to->nXStart < line_to->nXEnd) ? (line_to->nXEnd - line_to->nXStart) : (line_to->nXStart - line_to->nXEnd);
+       h = (line_to->nYStart < line_to->nYEnd) ? (line_to->nYEnd - line_to->nYStart) : (line_to->nYStart - line_to->nYEnd);
+
+       if (wfi->drawing == wfi->primary)
+               wf_invalidate_region(wfi, x, y, w, h);
+
+       SelectObject(wfi->drawing->hdc, org_pen);
+       DeleteObject(pen);
+}
+
+void wf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline)
+{
+       int i;
+       POINT* pts;
+       int org_rop2;
+       HPEN hpen;
+       HPEN org_hpen;
+       uint32 pen_color;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       pen_color = freerdp_color_convert_bgr(polyline->penColor, wfi->srcBpp, wfi->dstBpp, wfi->clrconv);
+
+       hpen = CreatePen(0, 1, pen_color);
+       org_rop2 = wf_set_rop2(wfi->drawing->hdc, polyline->bRop2);
+       org_hpen = (HPEN) SelectObject(wfi->drawing->hdc, hpen);
+
+       if (polyline->numPoints > 0)
+       {
+               pts = (POINT*) xmalloc(sizeof(POINT) * polyline->numPoints);
+
+               for (i = 0; i < (int) polyline->numPoints; i++)
+               {
+                       pts[i].x = polyline->points[i].x;
+                       pts[i].y = polyline->points[i].y;
+
+                       if (wfi->drawing == wfi->primary)
+                               wf_invalidate_region(wfi, pts[i].x, pts[i].y, pts[i].x + 1, pts[i].y + 1);
+               }
+
+               Polyline(wfi->drawing->hdc, pts, polyline->numPoints);
+               xfree(pts);
+       }
+
+       SelectObject(wfi->drawing->hdc, org_hpen);
+       wf_set_rop2(wfi->drawing->hdc, org_rop2);
+       DeleteObject(hpen);
+}
+
+void wf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt)
+{
+       wfBitmap* bitmap;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       bitmap = (wfBitmap*) memblt->bitmap;
+
+       BitBlt(wfi->drawing->hdc, memblt->nLeftRect, memblt->nTopRect,
+                       memblt->nWidth, memblt->nHeight, bitmap->hdc,
+                       memblt->nXSrc, memblt->nYSrc, gdi_rop3_code(memblt->bRop));
+
+       if (wfi->drawing == wfi->primary)
+               wf_invalidate_region(wfi, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight);
+}
+
+void wf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command)
+{
+       int i, j;
+       int tx, ty;
+       char* tile_bitmap;
+       RFX_MESSAGE* message;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) wfi->rfx_context;
+       NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) wfi->nsc_context;
+
+       tile_bitmap = (char*) xzalloc(32);
+
+       if (surface_bits_command->codecID == CODEC_ID_REMOTEFX)
+       {
+               message = rfx_process_message(rfx_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+
+               /* blit each tile */
+               for (i = 0; i < message->num_tiles; i++)
+               {
+                       tx = message->tiles[i]->x + surface_bits_command->destLeft;
+                       ty = message->tiles[i]->y + surface_bits_command->destTop;
+
+                       freerdp_image_convert(message->tiles[i]->data, wfi->tile->pdata, 64, 64, 32, 32, wfi->clrconv);
+
+                       for (j = 0; j < message->num_rects; j++)
+                       {
+                               wf_set_clip_rgn(wfi,
+                                       surface_bits_command->destLeft + message->rects[j].x,
+                                       surface_bits_command->destTop + message->rects[j].y,
+                                       message->rects[j].width, message->rects[j].height);
+
+                               BitBlt(wfi->primary->hdc, tx, ty, 64, 64, wfi->tile->hdc, 0, 0, SRCCOPY);
+                       }
+               }
+
+               wf_set_null_clip_rgn(wfi);
+
+               /* invalidate regions */
+               for (i = 0; i < message->num_rects; i++)
+               {
+                       tx = surface_bits_command->destLeft + message->rects[i].x;
+                       ty = surface_bits_command->destTop + message->rects[i].y;
+                       wf_invalidate_region(wfi, tx, ty, message->rects[i].width, message->rects[i].height);
+               }
+
+               rfx_message_free(rfx_context, message);
+       }
+       else if (surface_bits_command->codecID == CODEC_ID_NSCODEC)
+       {
+               nsc_context->width = surface_bits_command->width;
+               nsc_context->height = surface_bits_command->height;
+               nsc_process_message(nsc_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+               wfi->image->_bitmap.width = surface_bits_command->width;
+               wfi->image->_bitmap.height = surface_bits_command->height;
+               wfi->image->_bitmap.bpp = surface_bits_command->bpp;
+               wfi->image->_bitmap.data = (uint8*) xrealloc(wfi->image->_bitmap.data, wfi->image->_bitmap.width * wfi->image->_bitmap.height * 4);
+               freerdp_image_flip(nsc_context->bmpdata, wfi->image->_bitmap.data, wfi->image->_bitmap.width, wfi->image->_bitmap.height, 32);
+               BitBlt(wfi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, wfi->image->hdc, 0, 0, GDI_SRCCOPY);
+               nsc_context_destroy(nsc_context);
+       } 
+       else if (surface_bits_command->codecID == CODEC_ID_NONE)
+       {
+               wfi->image->_bitmap.width = surface_bits_command->width;
+               wfi->image->_bitmap.height = surface_bits_command->height;
+               wfi->image->_bitmap.bpp = surface_bits_command->bpp;
+
+               wfi->image->_bitmap.data = (uint8*) xrealloc(wfi->image->_bitmap.data,
+                               wfi->image->_bitmap.width * wfi->image->_bitmap.height * 4);
+
+               if ((surface_bits_command->bpp != 32) || (wfi->clrconv->alpha == true))
+               {
+                       uint8* temp_image;
+
+                       freerdp_image_convert(surface_bits_command->bitmapData, wfi->image->_bitmap.data,
+                               wfi->image->_bitmap.width, wfi->image->_bitmap.height,
+                               wfi->image->_bitmap.bpp, 32, wfi->clrconv);
+
+                       surface_bits_command->bpp = 32;
+                       surface_bits_command->bitmapData = wfi->image->_bitmap.data;
+
+                       temp_image = (uint8*) xmalloc(wfi->image->_bitmap.width * wfi->image->_bitmap.height * 4);
+                       freerdp_image_flip(wfi->image->_bitmap.data, temp_image, wfi->image->_bitmap.width, wfi->image->_bitmap.height, 32);
+                       xfree(wfi->image->_bitmap.data);
+                       wfi->image->_bitmap.data = temp_image;
+               }
+               else
+               {
+                       freerdp_image_flip(surface_bits_command->bitmapData, wfi->image->_bitmap.data,
+                                       wfi->image->_bitmap.width, wfi->image->_bitmap.height, 32);
+               }
+
+               BitBlt(wfi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height, wfi->image->hdc, 0, 0, SRCCOPY);
+       }
+       else
+       {
+               printf("Unsupported codecID %d\n", surface_bits_command->codecID);
+       }
+
+       if (tile_bitmap != NULL)
+               xfree(tile_bitmap);
+}
+
+void wf_gdi_register_update_callbacks(rdpUpdate* update)
+{
+       rdpPrimaryUpdate* primary = update->primary;
+
+       update->Palette = wf_gdi_palette_update;
+       update->SetBounds = wf_gdi_set_bounds;
+
+       primary->DstBlt = wf_gdi_dstblt;
+       primary->PatBlt = wf_gdi_patblt;
+       primary->ScrBlt = wf_gdi_scrblt;
+       primary->OpaqueRect = wf_gdi_opaque_rect;
+       primary->DrawNineGrid = NULL;
+       primary->MultiDstBlt = NULL;
+       primary->MultiPatBlt = NULL;
+       primary->MultiScrBlt = NULL;
+       primary->MultiOpaqueRect = wf_gdi_multi_opaque_rect;
+       primary->MultiDrawNineGrid = NULL;
+       primary->LineTo = wf_gdi_line_to;
+       primary->Polyline = wf_gdi_polyline;
+       primary->MemBlt = wf_gdi_memblt;
+       primary->Mem3Blt = NULL;
+       primary->SaveBitmap = NULL;
+       primary->GlyphIndex = NULL;
+       primary->FastIndex = NULL;
+       primary->FastGlyph = NULL;
+       primary->PolygonSC = NULL;
+       primary->PolygonCB = NULL;
+       primary->EllipseSC = NULL;
+       primary->EllipseCB = NULL;
+
+       update->SurfaceBits = wf_gdi_surface_bits;
+}
diff --git a/client/Windows/wf_gdi.h b/client/Windows/wf_gdi.h
new file mode 100644 (file)
index 0000000..df35f6d
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windows GDI
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WF_GDI_H
+#define __WF_GDI_H
+
+#include "wfreerdp.h"
+
+void wf_invalidate_region(wfInfo* wfi, int x, int y, int width, int height);
+wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data);
+void wf_image_free(wfBitmap* image);
+void wf_toggle_fullscreen(wfInfo* wfi);
+
+void wf_gdi_register_update_callbacks(rdpUpdate* update);
+
+#endif /* __WF_GDI_H */
diff --git a/client/Windows/wf_graphics.c b/client/Windows/wf_graphics.c
new file mode 100644 (file)
index 0000000..715d3c5
--- /dev/null
@@ -0,0 +1,242 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windows Graphical Objects
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+#include <freerdp/codec/bitmap.h>
+
+#include "wf_gdi.h"
+#include "wf_graphics.h"
+
+HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, uint8* data, uint8** pdata)
+{
+       HDC hdc;
+       int negHeight;
+       HBITMAP bitmap;
+       BITMAPINFO bmi;
+       uint8* cdata = NULL;
+
+       /**
+        * See: http://msdn.microsoft.com/en-us/library/dd183376
+        * if biHeight is positive, the bitmap is bottom-up
+        * if biHeight is negative, the bitmap is top-down
+        * Since we get top-down bitmaps, let's keep it that way
+        */
+
+       negHeight = (height < 0) ? height : height * (-1);
+
+       hdc = GetDC(NULL);
+       bmi.bmiHeader.biSize = sizeof(BITMAPINFO);
+       bmi.bmiHeader.biWidth = width;
+       bmi.bmiHeader.biHeight = negHeight;
+       bmi.bmiHeader.biPlanes = 1;
+       bmi.bmiHeader.biBitCount = bpp;
+       bmi.bmiHeader.biCompression = BI_RGB;
+       bitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**) &cdata, NULL, 0);
+
+       if (data != NULL)
+               freerdp_image_convert(data, cdata, width, height, bpp, bpp, wfi->clrconv);
+
+       if (pdata != NULL)
+               *pdata = cdata;
+
+       ReleaseDC(NULL, hdc);
+       GdiFlush();
+
+       return bitmap;
+}
+
+wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data)
+{
+       HDC hdc;
+       wfBitmap* image;
+
+       hdc = GetDC(NULL);
+       image = (wfBitmap*) malloc(sizeof(wfBitmap));
+       image->hdc = CreateCompatibleDC(hdc);
+
+       if (data == NULL)
+               image->bitmap = CreateCompatibleBitmap(hdc, width, height);
+       else
+               image->bitmap = wf_create_dib(wfi, width, height, bpp, data, &(image->pdata));
+
+       image->org_bitmap = (HBITMAP) SelectObject(image->hdc, image->bitmap);
+       ReleaseDC(NULL, hdc);
+       
+       return image;
+}
+
+wfBitmap* wf_bitmap_new(wfInfo* wfi, int width, int height, int bpp, uint8* data)
+{
+       HDC hdc;
+       wfBitmap* bitmap;
+
+       hdc = GetDC(NULL);
+       bitmap = (wfBitmap*) malloc(sizeof(wfBitmap));
+       bitmap->hdc = CreateCompatibleDC(hdc);
+       bitmap->bitmap = wf_create_dib(wfi, width, height, bpp, data, &(bitmap->pdata));
+       bitmap->org_bitmap = (HBITMAP) SelectObject(bitmap->hdc, bitmap->bitmap);
+       ReleaseDC(NULL, hdc);
+       
+       return bitmap;
+}
+
+void wf_image_free(wfBitmap* image)
+{
+       if (image != 0)
+       {
+               SelectObject(image->hdc, image->org_bitmap);
+               DeleteObject(image->bitmap);
+               DeleteDC(image->hdc);
+               free(image);
+       }
+}
+
+/* Bitmap Class */
+
+void wf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
+{
+       HDC hdc;
+       wfBitmap* wf_bitmap = (wfBitmap*) bitmap;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       wf_bitmap = (wfBitmap*) bitmap;
+
+       hdc = GetDC(NULL);
+       wf_bitmap->hdc = CreateCompatibleDC(hdc);
+
+       if (bitmap->data == NULL)
+               wf_bitmap->bitmap = CreateCompatibleBitmap(hdc, bitmap->width, bitmap->height);
+       else
+               wf_bitmap->bitmap = wf_create_dib(wfi, bitmap->width, bitmap->height, bitmap->bpp, bitmap->data, NULL);
+
+       wf_bitmap->org_bitmap = (HBITMAP) SelectObject(wf_bitmap->hdc, wf_bitmap->bitmap);
+       ReleaseDC(NULL, hdc);
+}
+
+void wf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
+{
+       wfBitmap* wf_bitmap = (wfBitmap*) bitmap;
+       
+       if (wf_bitmap != 0)
+       {
+               SelectObject(wf_bitmap->hdc, wf_bitmap->org_bitmap);
+               DeleteObject(wf_bitmap->bitmap);
+               DeleteDC(wf_bitmap->hdc);
+       }
+}
+
+void wf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap)
+{
+       int width, height;
+       wfBitmap* wf_bitmap = (wfBitmap*) bitmap;
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       width = bitmap->right - bitmap->left + 1;
+       height = bitmap->bottom - bitmap->top + 1;
+
+       BitBlt(wfi->primary->hdc, bitmap->left, bitmap->top,
+               width, height, wf_bitmap->hdc, 0, 0, SRCCOPY);
+
+       wf_invalidate_region(wfi, bitmap->left, bitmap->top, width, height);
+}
+
+void wf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
+               uint8* data, int width, int height, int bpp, int length, boolean compressed)
+{
+       uint16 size;
+
+       size = width * height * (bpp / 8);
+
+       if (bitmap->data == NULL)
+               bitmap->data = (uint8*) xmalloc(size);
+       else
+               bitmap->data = (uint8*) xrealloc(bitmap->data, size);
+
+       if (compressed)
+       {
+               boolean status;
+
+               status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp);
+
+               if (status != true)
+               {
+                       printf("Bitmap Decompression Failed\n");
+               }
+       }
+       else
+       {
+               freerdp_image_flip(data, bitmap->data, width, height, bpp);
+       }
+
+       bitmap->compressed = false;
+       bitmap->length = size;
+       bitmap->bpp = bpp;
+}
+
+void wf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary)
+{
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+
+       if (primary)
+               wfi->drawing = wfi->primary;
+       else
+               wfi->drawing = (wfBitmap*) bitmap;
+}
+
+/* Pointer Class */
+
+void wf_Pointer_New(rdpContext* context, rdpPointer* pointer)
+{
+
+}
+
+void wf_Pointer_Free(rdpContext* context, rdpPointer* pointer)
+{
+
+}
+
+void wf_Pointer_Set(rdpContext* context, rdpPointer* pointer)
+{
+
+}
+
+/* Graphics Module */
+
+void wf_register_graphics(rdpGraphics* graphics)
+{
+       rdpBitmap bitmap;
+       rdpPointer pointer;
+
+       memset(&bitmap, 0, sizeof(rdpBitmap));
+       bitmap.size = sizeof(wfBitmap);
+       bitmap.New = wf_Bitmap_New;
+       bitmap.Free = wf_Bitmap_Free;
+       bitmap.Paint = wf_Bitmap_Paint;
+       bitmap.Decompress = wf_Bitmap_Decompress;
+       bitmap.SetSurface = wf_Bitmap_SetSurface;
+
+       memset(&pointer, 0, sizeof(rdpPointer));
+       pointer.size = sizeof(wfPointer);
+       pointer.New = wf_Pointer_New;
+       pointer.Free = wf_Pointer_Free;
+       pointer.Set = wf_Pointer_Set;
+
+       graphics_register_bitmap(graphics, &bitmap);
+       graphics_register_pointer(graphics, &pointer);
+}
diff --git a/client/Windows/wf_graphics.h b/client/Windows/wf_graphics.h
new file mode 100644 (file)
index 0000000..024d3f7
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windows Graphical Objects
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WF_GRAPHICS_H
+#define __WF_GRAPHICS_H
+
+#include "wfreerdp.h"
+
+HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, uint8* data, uint8** pdata);
+wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data);
+wfBitmap* wf_bitmap_new(wfInfo* wfi, int width, int height, int bpp, uint8* data);
+void wf_image_free(wfBitmap* image);
+
+void wf_register_graphics(rdpGraphics* graphics);
+
+#endif /* WF_GRAPHICS */
diff --git a/client/Windows/wfreerdp.c b/client/Windows/wfreerdp.c
new file mode 100644 (file)
index 0000000..cf27244
--- /dev/null
@@ -0,0 +1,682 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windows Client
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef _MSC_VER
+#include <intrin.h>
+#endif
+
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/args.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/channels/channels.h>
+
+#include "wf_gdi.h"
+#include "wf_graphics.h"
+
+#include "wfreerdp.h"
+
+struct _thread_data
+{
+       freerdp* instance;
+};
+typedef struct _thread_data thread_data;
+
+HANDLE g_done_event;
+HINSTANCE g_hInstance;
+HCURSOR g_default_cursor;
+volatile int g_thread_count = 0;
+LPCTSTR g_wnd_class_name = L"wfreerdp";
+
+void wf_context_new(freerdp* instance, rdpContext* context)
+{
+       context->channels = freerdp_channels_new();
+}
+
+void wf_context_free(freerdp* instance, rdpContext* context)
+{
+
+}
+
+int wf_create_console(void)
+{
+       if (!AllocConsole())
+               return 1;
+
+       freopen("CONOUT$", "w", stdout);
+       printf("Debug console created.\n");
+
+       return 0;
+}
+
+void wf_sw_begin_paint(rdpContext* context)
+{
+       rdpGdi* gdi = context->gdi;
+       gdi->primary->hdc->hwnd->invalid->null = 1;
+       gdi->primary->hdc->hwnd->ninvalid = 0;
+}
+
+void wf_sw_end_paint(rdpContext* context)
+{
+       int i;
+       rdpGdi* gdi;
+       wfInfo* wfi;
+       sint32 x, y;
+       uint32 w, h;
+       int ninvalid;
+       RECT update_rect;
+       HGDI_RGN cinvalid;
+
+       gdi = context->gdi;
+       wfi = ((wfContext*) context)->wfi;
+
+       if (gdi->primary->hdc->hwnd->ninvalid < 1)
+               return;
+
+       ninvalid = gdi->primary->hdc->hwnd->ninvalid;
+       cinvalid = gdi->primary->hdc->hwnd->cinvalid;
+
+       for (i = 0; i < ninvalid; i++)
+       {
+               x = cinvalid[i].x;
+               y = cinvalid[i].y;
+               w = cinvalid[i].w;
+               h = cinvalid[i].h;
+
+               update_rect.left = x;
+               update_rect.top = y;
+               update_rect.right = x + w - 1;
+               update_rect.bottom = y + h - 1;
+
+               InvalidateRect(wfi->hwnd, &update_rect, FALSE);
+       }
+}
+
+void wf_hw_begin_paint(rdpContext* context)
+{
+       wfInfo* wfi = ((wfContext*) context)->wfi;
+       wfi->hdc->hwnd->invalid->null = 1;
+       wfi->hdc->hwnd->ninvalid = 0;
+}
+
+void wf_hw_end_paint(rdpContext* context)
+{
+
+}
+
+boolean wf_pre_connect(freerdp* instance)
+{
+       int i1;
+       wfInfo* wfi;
+       wfContext* context;
+       rdpSettings* settings;
+
+       wfi = (wfInfo*) xzalloc(sizeof(wfInfo));
+       context = (wfContext*) instance->context;
+       wfi->instance = instance;
+       context->wfi = wfi;
+
+       settings = instance->settings;
+
+       settings->os_major_type = OSMAJORTYPE_WINDOWS;
+       settings->os_minor_type = OSMINORTYPE_WINDOWS_NT;
+       settings->order_support[NEG_DSTBLT_INDEX] = true;
+       settings->order_support[NEG_PATBLT_INDEX] = true;
+       settings->order_support[NEG_SCRBLT_INDEX] = true;
+       settings->order_support[NEG_OPAQUE_RECT_INDEX] = true;
+       settings->order_support[NEG_DRAWNINEGRID_INDEX] = false;
+       settings->order_support[NEG_MULTIDSTBLT_INDEX] = false;
+       settings->order_support[NEG_MULTIPATBLT_INDEX] = false;
+       settings->order_support[NEG_MULTISCRBLT_INDEX] = false;
+       settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = true;
+       settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = false;
+       settings->order_support[NEG_LINETO_INDEX] = true;
+       settings->order_support[NEG_POLYLINE_INDEX] = true;
+       settings->order_support[NEG_MEMBLT_INDEX] = true;
+       settings->order_support[NEG_MEM3BLT_INDEX] = false;
+       settings->order_support[NEG_SAVEBITMAP_INDEX] = false;
+       settings->order_support[NEG_GLYPH_INDEX_INDEX] = false;
+       settings->order_support[NEG_FAST_INDEX_INDEX] = false;
+       settings->order_support[NEG_FAST_GLYPH_INDEX] = false;
+       settings->order_support[NEG_POLYGON_SC_INDEX] = false;
+       settings->order_support[NEG_POLYGON_CB_INDEX] = false;
+       settings->order_support[NEG_ELLIPSE_SC_INDEX] = false;
+       settings->order_support[NEG_ELLIPSE_CB_INDEX] = false;
+
+       settings->glyph_cache = false;
+
+       wfi->cursor = g_default_cursor;
+
+       wfi->fullscreen = settings->fullscreen;
+       wfi->fs_toggle = wfi->fullscreen;
+       wfi->sw_gdi = settings->sw_gdi;
+
+       wfi->clrconv = (HCLRCONV) xzalloc(sizeof(CLRCONV));
+       wfi->clrconv->palette = NULL;
+       wfi->clrconv->alpha = 0;
+
+       instance->context->cache = cache_new(settings);
+
+       if (wfi->percentscreen > 0)
+       {
+               i1 = (GetSystemMetrics(SM_CXSCREEN) * wfi->percentscreen) / 100;
+               settings->width = i1;
+
+               i1 = (GetSystemMetrics(SM_CYSCREEN) * wfi->percentscreen) / 100;
+               settings->height = i1;
+       }
+
+       if (wfi->fs_toggle)
+       {
+               settings->width = GetSystemMetrics(SM_CXSCREEN);
+               settings->height = GetSystemMetrics(SM_CYSCREEN);
+       }
+
+       i1 = settings->width;
+       i1 = (i1 + 3) & (~3);
+       settings->width = i1;
+
+       if ((settings->width < 64) || (settings->height < 64) ||
+               (settings->width > 4096) || (settings->height > 4096))
+       {
+               printf("wf_pre_connect: invalid dimensions %d %d\n", settings->width, settings->height);
+               return 1;
+       }
+
+       settings->kbd_layout = (int) GetKeyboardLayout(0) & 0x0000FFFF;
+       freerdp_channels_pre_connect(instance->context->channels, instance);
+
+       return true;
+}
+
+void cpuid(unsigned info, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
+{
+#if defined(__GNUC__)
+#if defined(__i386__) || defined(__x86_64__)
+       *eax = info;
+       __asm volatile
+               ("mov %%ebx, %%edi;" /* 32bit PIC: don't clobber ebx */
+                "cpuid;"
+                "mov %%ebx, %%esi;"
+                "mov %%edi, %%ebx;"
+                :"+a" (*eax), "=S" (*ebx), "=c" (*ecx), "=d" (*edx)
+                : :"edi");
+#endif
+#elif defined(_MSC_VER)
+       int a[4];
+       __cpuid(a, info);
+       *eax = a[0];
+       *ebx = a[1];
+       *ecx = a[2];
+       *edx = a[3];
+#endif
+}
+uint32 wfi_detect_cpu()
+{
+       uint32 cpu_opt = 0;
+       unsigned int eax, ebx, ecx, edx = 0;
+
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+
+       if (edx & (1<<26))
+       {
+               cpu_opt |= CPU_SSE2;
+       }
+
+       return cpu_opt;
+}
+
+boolean wf_post_connect(freerdp* instance)
+{
+       rdpGdi* gdi;
+       wfInfo* wfi;
+       rdpCache* cache;
+       wfContext* context;
+       int width, height;
+       wchar_t win_title[64];
+       rdpSettings* settings;
+
+       settings = instance->settings;
+       context = (wfContext*) instance->context;
+       cache = instance->context->cache;
+       wfi = context->wfi;
+
+       wfi->dstBpp = 32;
+       width = settings->width;
+       height = settings->height;
+
+       if (wfi->sw_gdi)
+       {
+               gdi_init(instance, CLRCONV_ALPHA | CLRCONV_INVERT | CLRBUF_32BPP, NULL);
+               gdi = instance->context->gdi;
+               wfi->hdc = gdi->primary->hdc;
+               wfi->primary = wf_image_new(wfi, width, height, wfi->dstBpp, gdi->primary_buffer);
+
+               rfx_context_set_cpu_opt(gdi->rfx_context, wfi_detect_cpu());
+       }
+       else
+       {
+               wf_gdi_register_update_callbacks(instance->update);
+               wfi->srcBpp = instance->settings->color_depth;
+               wfi->primary = wf_image_new(wfi, width, height, wfi->dstBpp, NULL);
+
+               wfi->hdc = gdi_GetDC();
+               wfi->hdc->bitsPerPixel = wfi->dstBpp;
+               wfi->hdc->bytesPerPixel = wfi->dstBpp / 8;
+
+               wfi->hdc->alpha = wfi->clrconv->alpha;
+               wfi->hdc->invert = wfi->clrconv->invert;
+
+               wfi->hdc->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND));
+               wfi->hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
+               wfi->hdc->hwnd->invalid->null = 1;
+
+               wfi->hdc->hwnd->count = 32;
+               wfi->hdc->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * wfi->hdc->hwnd->count);
+               wfi->hdc->hwnd->ninvalid = 0;
+
+               wfi->image = wf_bitmap_new(wfi, 64, 64, 32, NULL);
+               wfi->image->_bitmap.data = NULL;
+
+               if (settings->rfx_codec)
+               {
+                       wfi->tile = wf_bitmap_new(wfi, 64, 64, 32, NULL);
+                       wfi->rfx_context = rfx_context_new();
+                       rfx_context_set_cpu_opt(wfi->rfx_context, wfi_detect_cpu());
+               }
+
+               if (settings->ns_codec)
+                       wfi->nsc_context = nsc_context_new();
+       }
+
+       if (settings->window_title != NULL)
+               _snwprintf(win_title, sizeof(win_title), L"%S", settings->window_title);
+       else if (settings->port == 3389)
+               _snwprintf(win_title, sizeof(win_title) / sizeof(win_title[0]), L"FreeRDP: %S", settings->hostname);
+       else
+               _snwprintf(win_title, sizeof(win_title) / sizeof(win_title[0]), L"FreeRDP: %S:%d", settings->hostname, settings->port);
+
+       if (wfi->hwnd == 0)
+       {
+               wfi->hwnd = CreateWindowEx((DWORD) NULL, g_wnd_class_name, win_title,
+                               0, 0, 0, 0, 0, NULL, NULL, g_hInstance, NULL);
+
+               SetWindowLongPtr(wfi->hwnd, GWLP_USERDATA, (LONG_PTR) wfi);
+       }
+
+       if (wfi->fullscreen)
+       {
+               SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_POPUP);
+               SetWindowPos(wfi->hwnd, HWND_TOP, 0, 0, width, height, SWP_FRAMECHANGED);
+       }
+       else
+       {
+               POINT diff;
+               RECT rc_client, rc_wnd;
+
+               SetWindowLongPtr(wfi->hwnd, GWL_STYLE, WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX);
+               /* Now resize to get full canvas size and room for caption and borders */
+               SetWindowPos(wfi->hwnd, HWND_TOP, 10, 10, width, height, SWP_FRAMECHANGED);
+               GetClientRect(wfi->hwnd, &rc_client);
+               GetWindowRect(wfi->hwnd, &rc_wnd);
+               diff.x = (rc_wnd.right - rc_wnd.left) - rc_client.right;
+               diff.y = (rc_wnd.bottom - rc_wnd.top) - rc_client.bottom;
+               SetWindowPos(wfi->hwnd, HWND_TOP, -1, -1, width + diff.x, height + diff.y, SWP_NOMOVE | SWP_FRAMECHANGED);
+       }
+
+       BitBlt(wfi->primary->hdc, 0, 0, width, height, NULL, 0, 0, BLACKNESS);
+       wfi->drawing = wfi->primary;
+
+       ShowWindow(wfi->hwnd, SW_SHOWNORMAL);
+       UpdateWindow(wfi->hwnd);
+
+       if (wfi->sw_gdi)
+       {
+               instance->update->BeginPaint = wf_sw_begin_paint;
+               instance->update->EndPaint = wf_sw_end_paint;
+       }
+       else
+       {
+               instance->update->BeginPaint = wf_hw_begin_paint;
+               instance->update->EndPaint = wf_hw_end_paint;
+       }
+
+       pointer_cache_register_callbacks(instance->update);
+
+       if (wfi->sw_gdi != true)
+       {
+               brush_cache_register_callbacks(instance->update);
+               bitmap_cache_register_callbacks(instance->update);
+               offscreen_cache_register_callbacks(instance->update);
+       }
+
+       wf_register_graphics(instance->context->graphics);
+
+       freerdp_channels_post_connect(instance->context->channels, instance);
+
+       return true;
+}
+
+boolean wf_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint)
+{
+       return true;
+}
+
+int wf_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size)
+{
+       return freerdp_channels_data(instance, channelId, data, size, flags, total_size);
+}
+
+void wf_process_channel_event(rdpChannels* channels, freerdp* instance)
+{
+       RDP_EVENT* event;
+
+       event = freerdp_channels_pop_event(channels);
+
+       if (event)
+               freerdp_event_free(event);
+}
+
+boolean wf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount)
+{
+       return true;
+}
+
+boolean wf_check_fds(freerdp* instance)
+{
+       return true;
+}
+
+int wf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data)
+{
+       rdpChannels* channels = (rdpChannels*) user_data;
+
+       printf("loading plugin %s\n", name);
+       freerdp_channels_load_plugin(channels, settings, name, plugin_data);
+
+       return 1;
+}
+
+int wf_process_client_args(rdpSettings* settings, const char* opt, const char* val, void* user_data)
+{
+       return 0;
+}
+
+int wfreerdp_run(freerdp* instance)
+{
+       MSG msg;
+       int index;
+       int rcount;
+       int wcount;
+       BOOL msg_ret;
+       int quit_msg;
+       void* rfds[32];
+       void* wfds[32];
+       int fds_count;
+       HANDLE fds[64];
+       rdpChannels* channels;
+
+       memset(rfds, 0, sizeof(rfds));
+       memset(wfds, 0, sizeof(wfds));
+
+       if (freerdp_connect(instance) != true)
+               return 0;
+
+       channels = instance->context->channels;
+
+       while (1)
+       {
+               rcount = 0;
+               wcount = 0;
+
+               if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+               if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get wfreerdp file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get channel manager file descriptor\n");
+                       break;
+               }
+
+               fds_count = 0;
+               /* setup read fds */
+               for (index = 0; index < rcount; index++)
+               {
+                       fds[fds_count++] = rfds[index];
+               }
+               /* setup write fds */
+               for (index = 0; index < wcount; index++)
+               {
+                       fds[fds_count++] = wfds[index];
+               }
+               /* exit if nothing to do */
+               if (fds_count == 0)
+               {
+                       printf("wfreerdp_run: fds_count is zero\n");
+                       break;
+               }
+
+               /* do the wait */
+               if (MsgWaitForMultipleObjects(fds_count, fds, FALSE, 1, QS_ALLINPUT) == WAIT_FAILED)
+               {
+                       printf("wfreerdp_run: WaitForMultipleObjects failed: 0x%04X\n", GetLastError());
+                       break;
+               }
+
+               if (freerdp_check_fds(instance) != true)
+               {
+                       printf("Failed to check FreeRDP file descriptor\n");
+                       break;
+               }
+               if (wf_check_fds(instance) != true)
+               {
+                       printf("Failed to check wfreerdp file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_check_fds(channels, instance) != true)
+               {
+                       printf("Failed to check channel manager file descriptor\n");
+                       break;
+               }
+               wf_process_channel_event(channels, instance);
+
+               quit_msg = FALSE;
+               while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
+               {
+                       msg_ret = GetMessage(&msg, NULL, 0, 0);
+
+                       if (msg_ret == 0 || msg_ret == -1)
+                       {
+                               quit_msg = TRUE;
+                               break;
+                       }
+
+                       TranslateMessage(&msg);
+                       DispatchMessage(&msg);
+               }
+
+               if (quit_msg)
+                       break;
+       }
+
+       /* cleanup */
+       freerdp_channels_free(channels);
+       freerdp_free(instance);
+       
+       return 0;
+}
+
+static DWORD WINAPI thread_func(LPVOID lpParam)
+{
+       wfInfo* wfi;
+       freerdp* instance;
+       thread_data* data;
+
+       data = (thread_data*) lpParam;
+       instance = data->instance;
+
+       wfi = (wfInfo*) xzalloc(sizeof(wfInfo));
+       ((wfContext*) instance->context)->wfi = wfi;
+       wfi->instance = instance;
+
+       wfreerdp_run(instance);
+
+       g_thread_count--;
+
+       if (g_thread_count < 1)
+               SetEvent(g_done_event);
+
+       return (DWORD) NULL;
+}
+
+static DWORD WINAPI kbd_thread_func(LPVOID lpParam)
+{
+       MSG msg;
+       BOOL status;
+       HHOOK hook_handle;
+
+       hook_handle = SetWindowsHookEx(WH_KEYBOARD_LL, wf_ll_kbd_proc, g_hInstance, 0);
+
+       if (hook_handle)
+       {
+               while ((status = GetMessage( &msg, NULL, 0, 0 )) != 0)
+               {
+                       if (status == -1)
+                       {
+                               printf("keyboard thread error getting message\n");
+                               break;
+                       }
+                       else
+                       {
+                               TranslateMessage(&msg);
+                               DispatchMessage(&msg);
+                       }
+               }
+               UnhookWindowsHookEx(hook_handle);
+       }
+       else
+               printf("failed to install keyboard hook\n");
+
+       return (DWORD) NULL;
+}
+
+INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
+{
+       freerdp* instance;
+       thread_data* data;
+       WSADATA wsa_data;
+       WNDCLASSEX wnd_cls;
+
+       if (NULL == getenv("HOME"))
+       {
+               char home[MAX_PATH * 2] = "HOME=";
+               strcat(home, getenv("HOMEDRIVE"));
+               strcat(home, getenv("HOMEPATH"));
+               _putenv(home);
+       }
+
+       if (WSAStartup(0x101, &wsa_data) != 0)
+               return 1;
+
+       g_done_event = CreateEvent(0, 1, 0, 0);
+
+#if defined(WITH_DEBUG) || defined(_DEBUG)
+       wf_create_console();
+#endif
+
+       g_default_cursor = LoadCursor(NULL, IDC_ARROW);
+
+       wnd_cls.cbSize        = sizeof(WNDCLASSEX);
+       wnd_cls.style         = CS_HREDRAW | CS_VREDRAW;
+       wnd_cls.lpfnWndProc   = wf_event_proc;
+       wnd_cls.cbClsExtra    = 0;
+       wnd_cls.cbWndExtra    = 0;
+       wnd_cls.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
+       wnd_cls.hCursor       = g_default_cursor;
+       wnd_cls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
+       wnd_cls.lpszMenuName  = NULL;
+       wnd_cls.lpszClassName = g_wnd_class_name;
+       wnd_cls.hInstance     = hInstance;
+       wnd_cls.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
+       RegisterClassEx(&wnd_cls);
+
+       g_hInstance = hInstance;
+       freerdp_channels_global_init();
+
+       instance = freerdp_new();
+       instance->PreConnect = wf_pre_connect;
+       instance->PostConnect = wf_post_connect;
+       instance->VerifyCertificate = wf_verify_certificate;
+       instance->ReceiveChannelData = wf_receive_channel_data;
+
+       instance->context_size = sizeof(wfContext);
+       instance->ContextNew = wf_context_new;
+       instance->ContextFree = wf_context_free;
+       freerdp_context_new(instance);
+
+       instance->context->argc = __argc;
+       instance->context->argv = __argv;
+
+       if (!CreateThread(NULL, 0, kbd_thread_func, NULL, 0, NULL))
+               printf("error creating keyboard handler thread");
+
+       //while (1)
+       {
+               data = (thread_data*) xzalloc(sizeof(thread_data)); 
+               data->instance = instance;
+
+               freerdp_parse_args(instance->settings, __argc, __argv,
+                       wf_process_plugin_args, instance->context->channels, wf_process_client_args, NULL);
+
+               if (CreateThread(NULL, 0, thread_func, data, 0, NULL) != 0)
+                       g_thread_count++;
+       }
+
+       if (g_thread_count > 0)
+               WaitForSingleObject(g_done_event, INFINITE);
+       else
+               MessageBox(GetConsoleWindow(),
+                       L"Failed to start wfreerdp.\n\nPlease check the debug output.",
+                       L"FreeRDP Error", MB_ICONSTOP);
+
+       WSACleanup();
+
+#ifdef _DEBUG
+       system("pause");
+#endif
+
+       return 0;
+}
diff --git a/client/Windows/wfreerdp.h b/client/Windows/wfreerdp.h
new file mode 100644 (file)
index 0000000..2841c02
--- /dev/null
@@ -0,0 +1,99 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windows Client
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WFREERDP_H
+#define __WFREERDP_H
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
+#include <winsock2.h>
+#include <windows.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/gdi/dc.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/cache/cache.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/codec/nsc.h>
+
+#include "wf_event.h"
+
+struct wf_bitmap
+{
+       rdpBitmap _bitmap;
+       HDC hdc;
+       HBITMAP bitmap;
+       HBITMAP org_bitmap;
+       uint8* pdata;
+};
+typedef struct wf_bitmap wfBitmap;
+
+struct wf_pointer
+{
+       rdpPointer pointer;
+};
+typedef struct wf_pointer wfPointer;
+
+typedef struct wf_info wfInfo;
+
+struct wf_context
+{
+       rdpContext _p;
+
+       wfInfo* wfi;
+};
+typedef struct wf_context wfContext;
+
+struct wf_info
+{
+       int fs_toggle;
+       int fullscreen;
+       int percentscreen;
+       char window_title[64];
+
+       HWND hwnd;
+       HGDI_DC hdc;
+       uint16 srcBpp;
+       uint16 dstBpp;
+       freerdp* instance;
+       wfBitmap* primary;
+       wfBitmap* drawing;
+       HCLRCONV clrconv;
+       HCURSOR cursor;
+       HBRUSH brush;
+       HBRUSH org_brush;
+       RECT update_rect;
+
+       wfBitmap* tile;
+       wfBitmap* image;
+       RFX_CONTEXT* rfx_context;
+       NSC_CONTEXT* nsc_context;
+
+       boolean sw_gdi;
+};
+
+#endif
diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt
new file mode 100644 (file)
index 0000000..29f9ad8
--- /dev/null
@@ -0,0 +1,98 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP X11 Client
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include(FindXmlto)
+include_directories(${X11_INCLUDE_DIRS})
+
+add_executable(xfreerdp
+       xf_gdi.c
+       xf_gdi.h
+       xf_rail.c
+       xf_rail.h
+       xf_tsmf.c
+       xf_tsmf.h
+       xf_event.c
+       xf_event.h
+       xf_cliprdr.c
+       xf_cliprdr.h
+       xf_monitor.c
+       xf_monitor.h
+       xf_graphics.c
+       xf_graphics.h
+       xf_keyboard.c
+       xf_keyboard.h
+       xf_window.c
+       xf_window.h
+       xfreerdp.c
+       xfreerdp.h)
+
+if(WITH_MANPAGES)
+       if(XMLTO_FOUND)
+               add_custom_command(OUTPUT xfreerdp.1
+                       COMMAND ${XMLTO_EXECUTABLE} man ${CMAKE_CURRENT_SOURCE_DIR}/xfreerdp.1.xml
+                       DEPENDS xfreerdp.1.xml)
+
+               add_custom_target(xfreerdp.manpage ALL
+                       DEPENDS xfreerdp.1)
+
+               install(FILES ${CMAKE_CURRENT_BINARY_DIR}/xfreerdp.1 DESTINATION share/man/man1)
+       else(XMLTO_FOUND)
+               message(WARNING "WITH_MANPAGES was set, but xmlto was not found. man-pages will not be installed")
+       endif(XMLTO_FOUND)
+endif(WITH_MANPAGES)
+
+find_suggested_package(Xinerama)
+if(WITH_XINERAMA)
+       add_definitions(-DWITH_XINERAMA -DWITH_XEXT)
+       include_directories(${XINERAMA_INCLUDE_DIRS})
+       target_link_libraries(xfreerdp ${XINERAMA_LIBRARIES})
+endif()
+
+find_suggested_package(Xext)
+if(WITH_XEXT)
+       add_definitions(-DWITH_XEXT)
+       include_directories(${XEXT_INCLUDE_DIRS})
+       target_link_libraries(xfreerdp ${XEXT_LIBRARIES})
+endif()
+
+find_suggested_package(Xcursor)
+if(WITH_XCURSOR)
+       add_definitions(-DWITH_XCURSOR)
+       include_directories(${XCURSOR_INCLUDE_DIRS})
+       target_link_libraries(xfreerdp ${XCURSOR_LIBRARIES})
+endif()
+
+find_suggested_package(Xv)
+if(WITH_XV)
+       add_definitions(-DWITH_XV)
+       include_directories(${XV_INCLUDE_DIRS})
+       target_link_libraries(xfreerdp ${XV_LIBRARIES})
+endif()
+
+include_directories(${CMAKE_SOURCE_DIR}/resources)
+
+target_link_libraries(xfreerdp freerdp-core)
+target_link_libraries(xfreerdp freerdp-gdi)
+target_link_libraries(xfreerdp freerdp-kbd)
+target_link_libraries(xfreerdp freerdp-rail)
+target_link_libraries(xfreerdp freerdp-channels)
+target_link_libraries(xfreerdp freerdp-utils)
+target_link_libraries(xfreerdp ${X11_LIBRARIES} ${CMAKE_DL_LIBS})
+
+install(TARGETS xfreerdp DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/client/X11/xf_cliprdr.c b/client/X11/xf_cliprdr.c
new file mode 100644 (file)
index 0000000..fb36bea
--- /dev/null
@@ -0,0 +1,1235 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Clipboard Redirection
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/unicode.h>
+#include <freerdp/plugins/cliprdr.h>
+
+#include "xf_cliprdr.h"
+
+typedef struct clipboard_format_mapping clipboardFormatMapping;
+struct clipboard_format_mapping
+{
+       Atom target_format;
+       uint32 format_id;
+};
+
+typedef struct clipboard_context clipboardContext;
+struct clipboard_context
+{
+       rdpChannels* channels;
+       Window root_window;
+       Atom clipboard_atom;
+       Atom property_atom;
+       Atom identity_atom;
+
+       clipboardFormatMapping format_mappings[20];
+       int num_format_mappings;
+
+       /* server->client data */
+       uint32* formats;
+       int num_formats;
+       Atom targets[20];
+       int num_targets;
+       uint8* data;
+       uint32 data_format;
+       uint32 data_alt_format;
+       int data_length;
+       XEvent* respond;
+
+       /* client->server data */
+       Window owner;
+       int request_index;
+       boolean sync;
+
+       /* INCR mechanism */
+       Atom incr_atom;
+       boolean incr_starts;
+       uint8* incr_data;
+       int incr_data_length;
+};
+
+void xf_cliprdr_init(xfInfo* xfi, rdpChannels* chanman)
+{
+       int n;
+       uint32 id;
+       clipboardContext* cb;
+
+       cb = xnew(clipboardContext);
+       xfi->clipboard_context = cb;
+
+       cb->channels = chanman;
+       cb->request_index = -1;
+
+       cb->root_window = DefaultRootWindow(xfi->display);
+       cb->clipboard_atom = XInternAtom(xfi->display, "CLIPBOARD", false);
+
+       if (cb->clipboard_atom == None)
+       {
+               DEBUG_WARN("unable to get CLIPBOARD atom");
+       }
+
+       id = 1;
+       cb->property_atom = XInternAtom(xfi->display, "_FREERDP_CLIPRDR", false);
+       cb->identity_atom = XInternAtom(xfi->display, "_FREERDP_CLIPRDR_ID", false);
+
+       XChangeProperty(xfi->display, xfi->drawable, cb->identity_atom,
+                       XA_INTEGER, 32, PropModeReplace, (uint8*) &id, 1);
+
+       XSelectInput(xfi->display, cb->root_window, PropertyChangeMask);
+
+       n = 0;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "_FREERDP_RAW", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_RAW;
+
+       n++;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "UTF8_STRING", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_UNICODETEXT;
+
+       n++;
+       cb->format_mappings[n].target_format = XA_STRING;
+       cb->format_mappings[n].format_id = CB_FORMAT_TEXT;
+
+       n++;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/png", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_PNG;
+
+       n++;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/jpeg", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_JPEG;
+
+       n++;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/gif", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_GIF;
+
+       n++;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "image/bmp", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_DIB;
+
+       n++;
+       cb->format_mappings[n].target_format = XInternAtom(xfi->display, "text/html", false);
+       cb->format_mappings[n].format_id = CB_FORMAT_HTML;
+
+       cb->num_format_mappings = n + 1;
+       cb->targets[0] = XInternAtom(xfi->display, "TIMESTAMP", false);
+       cb->targets[1] = XInternAtom(xfi->display, "TARGETS", false);
+       cb->num_targets = 2;
+
+       cb->incr_atom = XInternAtom(xfi->display, "INCR", false);
+}
+
+void xf_cliprdr_uninit(xfInfo* xfi)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (cb)
+       {
+               xfree(cb->formats);
+               xfree(cb->data);
+               xfree(cb->respond);
+               xfree(cb->incr_data);
+               xfree(cb);
+               xfi->clipboard_context = NULL;
+       }
+}
+
+static uint8* lf2crlf(uint8* data, int* size)
+{
+       uint8 c;
+       uint8* outbuf;
+       uint8* out;
+       uint8* in_end;
+       uint8* in;
+       int out_size;
+
+       out_size = (*size) * 2 + 1;
+       outbuf = (uint8*) xzalloc(out_size);
+       out = outbuf;
+       in = data;
+       in_end = data + (*size);
+
+       while (in < in_end)
+       {
+               c = *in++;
+               if (c == '\n')
+               {
+                       *out++ = '\r';
+                       *out++ = '\n';
+               }
+               else
+               {
+                       *out++ = c;
+               }
+       }
+
+       *out++ = 0;
+       *size = out - outbuf;
+
+       return outbuf;
+}
+
+static void crlf2lf(uint8* data, int* size)
+{
+       uint8 c;
+       uint8* out;
+       uint8* in;
+       uint8* in_end;
+
+       out = data;
+       in = data;
+       in_end = data + (*size);
+
+       while (in < in_end)
+       {
+               c = *in++;
+
+               if (c != '\r')
+                       *out++ = c;
+       }
+
+       *size = out - data;
+}
+
+static void be2le(uint8* data, int size)
+{
+       uint8 c;
+
+       while (size >= 2)
+       {
+               c = data[0];
+               data[0] = data[1];
+               data[1] = c;
+
+               data += 2;
+               size -= 2;
+       }
+}
+
+static boolean xf_cliprdr_is_self_owned(xfInfo* xfi)
+{
+       Atom type;
+       uint32 id = 0;
+       uint32* pid = NULL;
+       int format, result = 0;
+       unsigned long length, bytes_left;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       cb->owner = XGetSelectionOwner(xfi->display, cb->clipboard_atom);
+
+       if (cb->owner != None)
+       {
+               result = XGetWindowProperty(xfi->display, cb->owner,
+                       cb->identity_atom, 0, 4, 0, XA_INTEGER,
+                       &type, &format, &length, &bytes_left, (uint8**) &pid);
+       }
+
+       if (pid)
+       {
+               id = *pid;
+               XFree(pid);
+       }
+
+       if ((cb->owner == None) || (cb->owner == xfi->drawable))
+               return false;
+
+       if (result != Success)
+               return false;
+
+       return (id ? true : false);
+}
+
+static int xf_cliprdr_select_format_by_id(clipboardContext* cb, uint32 format_id)
+{
+       int i;
+
+       for (i = 0; i < cb->num_format_mappings; i++)
+       {
+               if (cb->format_mappings[i].format_id == format_id)
+                       return i;
+       }
+
+       return -1;
+}
+
+static int xf_cliprdr_select_format_by_atom(clipboardContext* cb, Atom target)
+{
+       int i;
+       int j;
+
+       if (cb->formats == NULL)
+               return -1;
+
+       for (i = 0; i < cb->num_format_mappings; i++)
+       {
+               if (cb->format_mappings[i].target_format != target)
+                       continue;
+
+               if (cb->format_mappings[i].format_id == CB_FORMAT_RAW)
+                       return i;
+
+               for (j = 0; j < cb->num_formats; j++)
+               {
+                       if (cb->format_mappings[i].format_id == cb->formats[j])
+                               return i;
+               }
+       }
+
+       return -1;
+}
+
+static void xf_cliprdr_send_raw_format_list(xfInfo* xfi)
+{
+       Atom type;
+       uint8* format_data;
+       int format, result;
+       unsigned long length, bytes_left;
+       RDP_CB_FORMAT_LIST_EVENT* event;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       result = XGetWindowProperty(xfi->display, cb->root_window,
+               cb->property_atom, 0, 3600, 0, XA_STRING,
+               &type, &format, &length, &bytes_left, (uint8**) &format_data);
+
+       if (result != Success)
+       {
+               DEBUG_WARN("XGetWindowProperty failed");
+               return;
+       }
+       DEBUG_X11_CLIPRDR("format=%d len=%d bytes_left=%d", format, (int) length, (int) bytes_left);
+
+       event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+       event->raw_format_data = (uint8*) xmalloc(length);
+       memcpy(event->raw_format_data, format_data, length);
+       event->raw_format_data_size = length;
+       XFree(format_data);
+
+       freerdp_channels_send_event(cb->channels, (RDP_EVENT*) event);
+}
+
+static void xf_cliprdr_send_null_format_list(xfInfo* xfi)
+{
+       RDP_CB_FORMAT_LIST_EVENT* event;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+       event->num_formats = 0;
+
+       freerdp_channels_send_event(cb->channels, (RDP_EVENT*) event);
+}
+
+static void xf_cliprdr_send_supported_format_list(xfInfo* xfi)
+{
+       int i;
+       RDP_CB_FORMAT_LIST_EVENT* event;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+       event->formats = (uint32*) xmalloc(sizeof(uint32) * cb->num_format_mappings);
+       event->num_formats = cb->num_format_mappings;
+
+       for (i = 0; i < cb->num_format_mappings; i++)
+               event->formats[i] = cb->format_mappings[i].format_id;
+
+       freerdp_channels_send_event(cb->channels, (RDP_EVENT*) event);
+}
+
+static void xf_cliprdr_send_format_list(xfInfo* xfi)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (xf_cliprdr_is_self_owned(xfi))
+       {
+               xf_cliprdr_send_raw_format_list(xfi);
+       }
+       else if (cb->owner == None)
+       {
+               xf_cliprdr_send_null_format_list(xfi);
+       }
+       else if (cb->owner != xfi->drawable)
+       {
+               /* Request the owner for TARGETS, and wait for SelectionNotify event */
+               XConvertSelection(xfi->display, cb->clipboard_atom,
+                       cb->targets[1], cb->property_atom, xfi->drawable, CurrentTime);
+       }
+}
+
+static void xf_cliprdr_send_data_request(xfInfo* xfi, uint32 format)
+{
+       RDP_CB_DATA_REQUEST_EVENT* event;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       event = (RDP_CB_DATA_REQUEST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_DATA_REQUEST, NULL, NULL);
+
+       event->format = format;
+
+       freerdp_channels_send_event(cb->channels, (RDP_EVENT*) event);
+}
+
+static void xf_cliprdr_send_data_response(xfInfo* xfi, uint8* data, int size)
+{
+       RDP_CB_DATA_RESPONSE_EVENT* event;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       event = (RDP_CB_DATA_RESPONSE_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+               RDP_EVENT_TYPE_CB_DATA_RESPONSE, NULL, NULL);
+
+       event->data = data;
+       event->size = size;
+
+       freerdp_channels_send_event(cb->channels, (RDP_EVENT*) event);
+}
+
+static void xf_cliprdr_send_null_data_response(xfInfo* xfi)
+{
+       xf_cliprdr_send_data_response(xfi, NULL, 0);
+}
+
+static void xf_cliprdr_process_cb_monitor_ready_event(xfInfo* xfi)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       xf_cliprdr_send_format_list(xfi);
+       cb->sync = true;
+}
+
+static void xf_cliprdr_process_cb_data_request_event(xfInfo* xfi, RDP_CB_DATA_REQUEST_EVENT* event)
+{
+       int i;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       DEBUG_X11_CLIPRDR("format %d", event->format);
+
+       if (xf_cliprdr_is_self_owned(xfi))
+       {
+               /* CB_FORMAT_RAW */
+               i = 0;
+               XChangeProperty(xfi->display, xfi->drawable, cb->property_atom,
+                       XA_INTEGER, 32, PropModeReplace, (uint8*) &event->format, 1);
+       }
+       else
+       {
+               i = xf_cliprdr_select_format_by_id(cb, event->format);
+       }
+
+       if (i < 0)
+       {
+               DEBUG_X11_CLIPRDR("unsupported format requested");
+               xf_cliprdr_send_null_data_response(xfi);
+       }
+       else
+       {
+               cb->request_index = i;
+
+               DEBUG_X11_CLIPRDR("target=%d", (int) cb->format_mappings[i].target_format);
+
+               XConvertSelection(xfi->display, cb->clipboard_atom,
+                       cb->format_mappings[i].target_format, cb->property_atom,
+                       xfi->drawable, CurrentTime);
+               XFlush(xfi->display);
+               /* After this point, we expect a SelectionNotify event from the clipboard owner. */
+       }
+}
+
+static void xf_cliprdr_get_requested_targets(xfInfo* xfi)
+{
+       int num;
+       int i, j;
+       Atom atom;
+       int format;
+       uint8* data = NULL;
+       unsigned long length, bytes_left;
+       RDP_CB_FORMAT_LIST_EVENT* event;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       XGetWindowProperty(xfi->display, xfi->drawable, cb->property_atom,
+               0, 200, 0, XA_ATOM,
+               &atom, &format, &length, &bytes_left, &data);
+
+       DEBUG_X11_CLIPRDR("type=%d format=%d length=%d bytes_left=%d",
+               (int) atom, format, (int) length, (int) bytes_left);
+
+       if (length > 0)
+       {
+               event = (RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR,
+                       RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+               event->formats = (uint32*) xmalloc(sizeof(uint32) * cb->num_format_mappings);
+               num = 0;
+               for (i = 0; i < length; i++)
+               {
+                       atom = ((Atom*) data)[i];
+                       DEBUG_X11("atom %d", (int) atom);
+                       for (j = 0; j < cb->num_format_mappings; j++)
+                       {
+                               if (cb->format_mappings[j].target_format == atom)
+                               {
+                                       DEBUG_X11("found format %d for atom %d",
+                                               cb->format_mappings[j].format_id, (int)atom);
+                                       event->formats[num++] = cb->format_mappings[j].format_id;
+                                       break;
+                               }
+                       }
+               }
+               event->num_formats = num;
+               XFree(data);
+
+               freerdp_channels_send_event(cb->channels, (RDP_EVENT*) event);
+       }
+       else
+       {
+               if (data)
+                       XFree(data);
+
+               xf_cliprdr_send_null_format_list(xfi);
+       }
+}
+
+static uint8* xf_cliprdr_process_requested_raw(uint8* data, int* size)
+{
+       uint8* outbuf;
+
+       outbuf = (uint8*) xmalloc(*size);
+       memcpy(outbuf, data, *size);
+       return outbuf;
+}
+
+static uint8* xf_cliprdr_process_requested_unicodetext(uint8* data, int* size)
+{
+       uint8* inbuf;
+       uint8* outbuf;
+       size_t out_size;
+       UNICONV* uniconv;
+
+       inbuf = lf2crlf(data, size);
+
+       uniconv = freerdp_uniconv_new();
+       outbuf = (uint8*) freerdp_uniconv_out(uniconv, (char*) inbuf, &out_size);
+       freerdp_uniconv_free(uniconv);
+
+       xfree(inbuf);
+
+       *size = (int) out_size + 2;
+
+       return outbuf;
+}
+
+static uint8* xf_cliprdr_process_requested_text(uint8* data, int* size)
+{
+       uint8* outbuf;
+
+       outbuf = lf2crlf(data, size);
+
+       return outbuf;
+}
+
+static uint8* xf_cliprdr_process_requested_dib(uint8* data, int* size)
+{
+       uint8* outbuf;
+
+       /* length should be at least BMP header (14) + sizeof(BITMAPINFOHEADER) */
+       if (*size < 54)
+       {
+               DEBUG_X11_CLIPRDR("bmp length %d too short", *size);
+               return NULL;
+       }
+
+       *size -= 14;
+       outbuf = (uint8*) xzalloc(*size);
+       memcpy(outbuf, data + 14, *size);
+
+       return outbuf;
+}
+
+static uint8* xf_cliprdr_process_requested_html(uint8* data, int* size)
+{
+       uint8* inbuf;
+       uint8* in;
+       uint8* outbuf;
+       char num[11];
+       UNICONV* uniconv;
+
+       inbuf = NULL;
+       if (*size > 2)
+       {
+               if ((uint8) data[0] == 0xFE && (uint8) data[1] == 0xFF)
+               {
+                       be2le(data, *size);
+               }
+
+               if ((uint8) data[0] == 0xFF && (uint8) data[1] == 0xFE)
+               {
+                       uniconv = freerdp_uniconv_new();
+                       inbuf = (uint8*) freerdp_uniconv_in(uniconv, data + 2, *size - 2);
+                       freerdp_uniconv_free(uniconv);
+               }
+       }
+       if (inbuf == NULL)
+       {
+               inbuf = xzalloc(*size + 1);
+               memcpy(inbuf, data, *size);
+       }
+
+       outbuf = (uint8*) xzalloc(*size + 200);
+       strcpy((char*) outbuf,
+               "Version:0.9\r\n"
+               "StartHTML:0000000000\r\n"
+               "EndHTML:0000000000\r\n"
+               "StartFragment:0000000000\r\n"
+               "EndFragment:0000000000\r\n");
+
+       in = (uint8*) strstr((char*) inbuf, "<body");
+       if (in == NULL)
+       {
+               in = (uint8*) strstr((char*) inbuf, "<BODY");
+       }
+       /* StartHTML */
+       snprintf(num, sizeof(num), "%010lu", (unsigned long) strlen((char*) outbuf));
+       memcpy(outbuf + 23, num, 10);
+       if (in == NULL)
+       {
+               strcat((char*) outbuf, "<HTML><BODY>");
+       }
+       strcat((char*) outbuf, "<!--StartFragment-->");
+       /* StartFragment */
+       snprintf(num, sizeof(num), "%010lu", (unsigned long) strlen((char*) outbuf));
+       memcpy(outbuf + 69, num, 10);
+       strcat((char*) outbuf, (char*) inbuf);
+       /* EndFragment */
+       snprintf(num, sizeof(num), "%010lu", (unsigned long) strlen((char*) outbuf));
+       memcpy(outbuf + 93, num, 10);
+       strcat((char*) outbuf, "<!--EndFragment-->");
+       if (in == NULL)
+       {
+               strcat((char*) outbuf, "</BODY></HTML>");
+       }
+       /* EndHTML */
+       snprintf(num, sizeof(num), "%010lu", (unsigned long) strlen((char*) outbuf));
+       memcpy(outbuf + 43, num, 10);
+
+       *size = strlen((char*) outbuf) + 1;
+       xfree(inbuf);
+
+       return outbuf;
+}
+
+static void xf_cliprdr_process_requested_data(xfInfo* xfi, boolean has_data, uint8* data, int size)
+{
+       uint8* outbuf;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (cb->incr_starts && has_data)
+               return;
+
+       if (!has_data || data == NULL)
+       {
+               xf_cliprdr_send_null_data_response(xfi);
+               return;
+       }
+
+       switch (cb->format_mappings[cb->request_index].format_id)
+       {
+               case CB_FORMAT_RAW:
+               case CB_FORMAT_PNG:
+               case CB_FORMAT_JPEG:
+               case CB_FORMAT_GIF:
+                       outbuf = xf_cliprdr_process_requested_raw(data, &size);
+                       break;
+
+               case CB_FORMAT_UNICODETEXT:
+                       outbuf = xf_cliprdr_process_requested_unicodetext(data, &size);
+                       break;
+
+               case CB_FORMAT_TEXT:
+                       outbuf = xf_cliprdr_process_requested_text(data, &size);
+                       break;
+
+               case CB_FORMAT_DIB:
+                       outbuf = xf_cliprdr_process_requested_dib(data, &size);
+                       break;
+
+               case CB_FORMAT_HTML:
+                       outbuf = xf_cliprdr_process_requested_html(data, &size);
+                       break;
+
+               default:
+                       outbuf = NULL;
+                       break;
+       }
+
+       if (outbuf)
+               xf_cliprdr_send_data_response(xfi, outbuf, size);
+       else
+               xf_cliprdr_send_null_data_response(xfi);
+
+       /* Resend the format list, otherwise the server won't request again for the next paste */
+       xf_cliprdr_send_format_list(xfi);
+}
+
+static boolean xf_cliprdr_get_requested_data(xfInfo* xfi, Atom target)
+{
+       Atom type;
+       int format;
+       uint8* data = NULL;
+       boolean has_data = false;
+       unsigned long length, bytes_left, dummy;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if ((cb->request_index < 0) ||
+               (cb->format_mappings[cb->request_index].target_format != target))
+       {
+               DEBUG_X11_CLIPRDR("invalid target");
+               xf_cliprdr_send_null_data_response(xfi);
+               return false;
+       }
+
+       XGetWindowProperty(xfi->display, xfi->drawable,
+               cb->property_atom, 0, 0, 0, target,
+               &type, &format, &length, &bytes_left, &data);
+
+       DEBUG_X11_CLIPRDR("type=%d format=%d bytes=%d request_index=%d",
+               (int) type, format, (int) bytes_left, cb->request_index);
+
+       if (data)
+       {
+               XFree(data);
+               data = NULL;
+       }
+       if (bytes_left <= 0 && !cb->incr_starts)
+       {
+               DEBUG_X11("no data");
+       }
+       else if (type == cb->incr_atom)
+       {
+               DEBUG_X11("INCR started");
+               cb->incr_starts = true;
+               if (cb->incr_data)
+               {
+                       xfree(cb->incr_data);
+                       cb->incr_data = NULL;
+               }
+               cb->incr_data_length = 0;
+               /* Data will be followed in PropertyNotify event */
+               has_data = true;
+       }
+       else
+       {
+               if (bytes_left <= 0)
+               {
+                       /* INCR finish */
+                       data = cb->incr_data;
+                       cb->incr_data = NULL;
+                       bytes_left = cb->incr_data_length;
+                       cb->incr_data_length = 0;
+                       cb->incr_starts = 0;
+                       DEBUG_X11("INCR finished");
+                       has_data = true;
+               }
+               else if (XGetWindowProperty(xfi->display, xfi->drawable,
+                       cb->property_atom, 0, bytes_left, 0, target,
+                       &type, &format, &length, &dummy, &data) == Success)
+               {
+                       if (cb->incr_starts)
+                       {
+                               bytes_left = length * format / 8;
+                               DEBUG_X11("%d bytes", (int)bytes_left);
+                               cb->incr_data = (uint8*) xrealloc(cb->incr_data, cb->incr_data_length + bytes_left);
+                               memcpy(cb->incr_data + cb->incr_data_length, data, bytes_left);
+                               cb->incr_data_length += bytes_left;
+                               XFree(data);
+                               data = NULL;
+                       }
+                       has_data = true;
+               }
+               else
+               {
+                       DEBUG_X11_CLIPRDR("XGetWindowProperty failed");
+               }
+       }
+       XDeleteProperty(xfi->display, xfi->drawable, cb->property_atom);
+
+       xf_cliprdr_process_requested_data(xfi, has_data, data, (int) bytes_left);
+
+       if (data)
+               XFree(data);
+
+       return true;
+}
+
+static void xf_cliprdr_append_target(clipboardContext* cb, Atom target)
+{
+       int i;
+
+       if (cb->num_targets >= sizeof(cb->targets) / sizeof(Atom))
+               return;
+
+       for (i = 0; i < cb->num_targets; i++)
+       {
+               if (cb->targets[i] == target)
+                       return;
+       }
+
+       cb->targets[cb->num_targets++] = target;
+}
+
+static void xf_cliprdr_provide_targets(xfInfo* xfi, XEvent* respond)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (respond->xselection.property != None)
+       {
+               XChangeProperty(xfi->display,
+                       respond->xselection.requestor,
+                       respond->xselection.property,
+                       XA_ATOM, 32, PropModeReplace,
+                       (uint8*) cb->targets, cb->num_targets);
+       }
+}
+
+static void xf_cliprdr_provide_data(xfInfo* xfi, XEvent* respond)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (respond->xselection.property != None)
+       {
+               XChangeProperty(xfi->display,
+                       respond->xselection.requestor,
+                       respond->xselection.property,
+                       respond->xselection.target, 8, PropModeReplace,
+                       (uint8*) cb->data, cb->data_length);
+       }
+}
+
+static void xf_cliprdr_process_cb_format_list_event(xfInfo* xfi, RDP_CB_FORMAT_LIST_EVENT* event)
+{
+       int i, j;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (cb->data)
+       {
+               xfree(cb->data);
+               cb->data = NULL;
+       }
+
+       if (cb->formats)
+               xfree(cb->formats);
+
+       cb->formats = event->formats;
+       cb->num_formats = event->num_formats;
+       event->formats = NULL;
+       event->num_formats = 0;
+
+       cb->num_targets = 2;
+       for (i = 0; i < cb->num_formats; i++)
+       {
+               for (j = 0; j < cb->num_format_mappings; j++)
+               {
+                       if (cb->formats[i] == cb->format_mappings[j].format_id)
+                       {
+                               DEBUG_X11("announce format#%d : %d", i, cb->formats[i]);
+                               xf_cliprdr_append_target(cb, cb->format_mappings[j].target_format);
+                       }
+               }
+       }
+
+       XSetSelectionOwner(xfi->display, cb->clipboard_atom, xfi->drawable, CurrentTime);
+       if (event->raw_format_data)
+       {
+               XChangeProperty(xfi->display, cb->root_window, cb->property_atom,
+                       XA_STRING, 8, PropModeReplace,
+                       event->raw_format_data, event->raw_format_data_size);
+       }
+
+       XFlush(xfi->display);
+}
+
+static void xf_cliprdr_process_text(clipboardContext* cb, uint8* data, int size)
+{
+       cb->data = (uint8*) xmalloc(size);
+       memcpy(cb->data, data, size);
+       cb->data_length = size;
+       crlf2lf(cb->data, &cb->data_length);
+}
+
+static void xf_cliprdr_process_unicodetext(clipboardContext* cb, uint8* data, int size)
+{
+       UNICONV* uniconv;
+
+       uniconv = freerdp_uniconv_new();
+       cb->data = (uint8*) freerdp_uniconv_in(uniconv, data, size);
+       freerdp_uniconv_free(uniconv);
+       cb->data_length = strlen((char*) cb->data);
+       crlf2lf(cb->data, &cb->data_length);
+}
+
+static void xf_cliprdr_process_dib(clipboardContext* cb, uint8* data, int size)
+{
+       STREAM* s;
+       uint16 bpp;
+       uint32 offset;
+       uint32 ncolors;
+
+       /* size should be at least sizeof(BITMAPINFOHEADER) */
+       if (size < 40)
+       {
+               DEBUG_X11_CLIPRDR("dib size %d too short", size);
+               return;
+       }
+
+       s = stream_new(0);
+       stream_attach(s, data, size);
+       stream_seek(s, 14);
+       stream_read_uint16(s, bpp);
+       stream_read_uint32(s, ncolors);
+       offset = 14 + 40 + (bpp <= 8 ? (ncolors == 0 ? (1 << bpp) : ncolors) * 4 : 0);
+       stream_detach(s);
+       stream_free(s);
+
+       DEBUG_X11_CLIPRDR("offset=%d bpp=%d ncolors=%d", offset, bpp, ncolors);
+
+       s = stream_new(14 + size);
+       stream_write_uint8(s, 'B');
+       stream_write_uint8(s, 'M');
+       stream_write_uint32(s, 14 + size);
+       stream_write_uint32(s, 0);
+       stream_write_uint32(s, offset);
+       stream_write(s, data, size);
+
+       cb->data = stream_get_head(s);
+       cb->data_length = stream_get_length(s);
+       stream_detach(s);
+       stream_free(s);
+}
+
+static void xf_cliprdr_process_html(clipboardContext* cb, uint8* data, int size)
+{
+       char* start_str;
+       char* end_str;
+       int start;
+       int end;
+
+       start_str = strstr((char*) data, "StartHTML:");
+       end_str = strstr((char*) data, "EndHTML:");
+       if (start_str == NULL || end_str == NULL)
+       {
+               DEBUG_X11_CLIPRDR("invalid HTML clipboard format");
+               return;
+       }
+       start = atoi(start_str + 10);
+       end = atoi(end_str + 8);
+       if (start > size || end > size || start >= end)
+       {
+               DEBUG_X11_CLIPRDR("invalid HTML offset");
+               return;
+       }
+
+       cb->data = (uint8*) xmalloc(size - start + 1);
+       memcpy(cb->data, data + start, end - start);
+       cb->data_length = end - start;
+       crlf2lf(cb->data, &cb->data_length);
+}
+
+static void xf_cliprdr_process_cb_data_response_event(xfInfo* xfi, RDP_CB_DATA_RESPONSE_EVENT* event)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       DEBUG_X11_CLIPRDR("size=%d", event->size);
+
+       if (cb->respond == NULL)
+       {
+               DEBUG_X11_CLIPRDR("unexpected data");
+               return;
+       }
+
+       if (event->size == 0)
+       {
+               cb->respond->xselection.property = None;
+       }
+       else
+       {
+               if (cb->data)
+               {
+                       xfree(cb->data);
+                       cb->data = NULL;
+               }
+               switch (cb->data_format)
+               {
+                       case CB_FORMAT_RAW:
+                       case CB_FORMAT_PNG:
+                       case CB_FORMAT_JPEG:
+                       case CB_FORMAT_GIF:
+                               cb->data = event->data;
+                               cb->data_length = event->size;
+                               event->data = NULL;
+                               event->size = 0;
+                               break;
+
+                       case CB_FORMAT_TEXT:
+                               xf_cliprdr_process_text(cb, event->data, event->size);
+                               break;
+
+                       case CB_FORMAT_UNICODETEXT:
+                               xf_cliprdr_process_unicodetext(cb, event->data, event->size);
+                               break;
+
+                       case CB_FORMAT_DIB:
+                               xf_cliprdr_process_dib(cb, event->data, event->size);
+                               break;
+
+                       case CB_FORMAT_HTML:
+                               xf_cliprdr_process_html(cb, event->data, event->size);
+                               break;
+
+                       default:
+                               cb->respond->xselection.property = None;
+                               break;
+               }
+               xf_cliprdr_provide_data(xfi, cb->respond);
+       }
+
+       XSendEvent(xfi->display, cb->respond->xselection.requestor, 0, 0, cb->respond);
+       XFlush(xfi->display);
+       xfree(cb->respond);
+       cb->respond = NULL;
+}
+
+void xf_process_cliprdr_event(xfInfo* xfi, RDP_EVENT* event)
+{
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_CB_MONITOR_READY:
+                       xf_cliprdr_process_cb_monitor_ready_event(xfi);
+                       break;
+
+               case RDP_EVENT_TYPE_CB_FORMAT_LIST:
+                       xf_cliprdr_process_cb_format_list_event(xfi, (RDP_CB_FORMAT_LIST_EVENT*) event);
+                       break;
+
+               case RDP_EVENT_TYPE_CB_DATA_REQUEST:
+                       xf_cliprdr_process_cb_data_request_event(xfi, (RDP_CB_DATA_REQUEST_EVENT*) event);
+                       break;
+
+               case RDP_EVENT_TYPE_CB_DATA_RESPONSE:
+                       xf_cliprdr_process_cb_data_response_event(xfi, (RDP_CB_DATA_RESPONSE_EVENT*) event);
+                       break;
+
+               default:
+                       DEBUG_X11_CLIPRDR("unknown event type %d", event->event_type);
+                       break;
+       }
+}
+
+boolean xf_cliprdr_process_selection_notify(xfInfo* xfi, XEvent* xevent)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (xevent->xselection.target == cb->targets[1])
+       {
+               if (xevent->xselection.property == None)
+               {
+                       DEBUG_X11_CLIPRDR("owner not support TARGETS. sending all format.");
+                       xf_cliprdr_send_supported_format_list(xfi);
+               }
+               else
+               {
+                       xf_cliprdr_get_requested_targets(xfi);
+               }
+
+               return true;
+       }
+       else
+       {
+               return xf_cliprdr_get_requested_data(xfi, xevent->xselection.target);
+       }
+}
+
+boolean xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent)
+{
+       int i;
+       int fmt;
+       Atom type;
+       uint32 format;
+       XEvent* respond;
+       uint32 alt_format;
+       uint8* data = NULL;
+       boolean delay_respond;
+       unsigned long length, bytes_left;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       DEBUG_X11_CLIPRDR("target=%d", (int) xevent->xselectionrequest.target);
+
+       if (xevent->xselectionrequest.owner != xfi->drawable)
+       {
+               DEBUG_X11_CLIPRDR("not owner");
+               return false;
+       }
+
+       delay_respond = false;
+       respond = xnew(XEvent);
+       respond->xselection.property = None;
+       respond->xselection.type = SelectionNotify;
+       respond->xselection.display = xevent->xselectionrequest.display;
+       respond->xselection.requestor = xevent->xselectionrequest.requestor;
+       respond->xselection.selection = xevent->xselectionrequest.selection;
+       respond->xselection.target = xevent->xselectionrequest.target;
+       respond->xselection.time = xevent->xselectionrequest.time;
+
+       if (xevent->xselectionrequest.target == cb->targets[0]) /* TIMESTAMP */
+       {
+               /* TODO */
+               DEBUG_X11_CLIPRDR("target: TIMESTAMP (unimplemented)");
+       }
+       else if (xevent->xselectionrequest.target == cb->targets[1]) /* TARGETS */
+       {
+               /* Someone else requests our available formats */
+               DEBUG_X11_CLIPRDR("target: TARGETS");
+               respond->xselection.property = xevent->xselectionrequest.property;
+               xf_cliprdr_provide_targets(xfi, respond);
+       }
+       else
+       {
+               DEBUG_X11_CLIPRDR("target: other");
+
+               i = xf_cliprdr_select_format_by_atom(cb, xevent->xselectionrequest.target);
+
+               if (i >= 0 && xevent->xselectionrequest.requestor != xfi->drawable)
+               {
+                       format = cb->format_mappings[i].format_id;
+                       alt_format = format;
+                       if (format == CB_FORMAT_RAW)
+                       {
+                               if (XGetWindowProperty(xfi->display, xevent->xselectionrequest.requestor,
+                                       cb->property_atom, 0, 4, 0, XA_INTEGER,
+                                       &type, &fmt, &length, &bytes_left, &data) != Success)
+                               {
+                                       DEBUG_X11_CLIPRDR("XGetWindowProperty failed");
+                               }
+                               if (data)
+                               {
+                                       memcpy(&alt_format, data, 4);
+                                       XFree(data);
+                               }
+                       }
+                       DEBUG_X11_CLIPRDR("provide format 0x%04x alt_format 0x%04x", format, alt_format);
+                       if ((cb->data != 0) && (format == cb->data_format) && (alt_format == cb->data_alt_format))
+                       {
+                               /* Cached clipboard data available. Send it now */
+                               respond->xselection.property = xevent->xselectionrequest.property;
+                               xf_cliprdr_provide_data(xfi, respond);
+                       }
+                       else if (cb->respond)
+                       {
+                               DEBUG_X11_CLIPRDR("duplicated request");
+                       }
+                       else
+                       {
+                               /**
+                                * Send clipboard data request to the server.
+                                * Response will be postponed after receiving the data
+                                */
+                               if (cb->data)
+                               {
+                                       xfree(cb->data);
+                                       cb->data = NULL;
+                               }
+
+                               respond->xselection.property = xevent->xselectionrequest.property;
+                               cb->respond = respond;
+                               cb->data_format = format;
+                               cb->data_alt_format = alt_format;
+                               delay_respond = true;
+
+                               xf_cliprdr_send_data_request(xfi, alt_format);
+                       }
+               }
+       }
+
+       if (delay_respond == false)
+       {
+               XSendEvent(xfi->display, xevent->xselectionrequest.requestor, 0, 0, respond);
+               XFlush(xfi->display);
+               xfree(respond);
+       }
+
+       return true;
+}
+
+boolean xf_cliprdr_process_selection_clear(xfInfo* xfi, XEvent* xevent)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (xf_cliprdr_is_self_owned(xfi))
+               return false;
+
+       XDeleteProperty(xfi->display, cb->root_window, cb->property_atom);
+
+       return true;
+}
+
+boolean xf_cliprdr_process_property_notify(xfInfo* xfi, XEvent* xevent)
+{
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (xevent->xproperty.atom != cb->property_atom)
+               return false; /* Not cliprdr-related */
+
+       if (xevent->xproperty.window == cb->root_window)
+       {
+               DEBUG_X11_CLIPRDR("root window PropertyNotify");
+               xf_cliprdr_send_format_list(xfi);
+       }
+       else if (xevent->xproperty.window == xfi->drawable &&
+               xevent->xproperty.state == PropertyNewValue &&
+               cb->incr_starts && cb->request_index >= 0)
+       {
+               DEBUG_X11_CLIPRDR("cliprdr window PropertyNotify");
+               xf_cliprdr_get_requested_data(xfi,
+                       cb->format_mappings[cb->request_index].target_format);
+       }
+
+       return true;
+}
+
+void xf_cliprdr_check_owner(xfInfo* xfi)
+{
+       Window owner;
+       clipboardContext* cb = (clipboardContext*) xfi->clipboard_context;
+
+       if (cb->sync)
+       {
+               owner = XGetSelectionOwner(xfi->display, cb->clipboard_atom);
+
+               if (cb->owner != owner)
+               {
+                       cb->owner = owner;
+                       xf_cliprdr_send_format_list(xfi);
+               }
+       }
+}
+
diff --git a/client/X11/xf_cliprdr.h b/client/X11/xf_cliprdr.h
new file mode 100644 (file)
index 0000000..2678fc3
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Clipboard Redirection
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_CLIPRDR_H
+#define __XF_CLIPRDR_H
+
+#include "xfreerdp.h"
+
+void xf_cliprdr_init(xfInfo* xfi, rdpChannels* chanman);
+void xf_cliprdr_uninit(xfInfo* xfi);
+void xf_process_cliprdr_event(xfInfo* xfi, RDP_EVENT* event);
+boolean xf_cliprdr_process_selection_notify(xfInfo* xfi, XEvent* xevent);
+boolean xf_cliprdr_process_selection_request(xfInfo* xfi, XEvent* xevent);
+boolean xf_cliprdr_process_selection_clear(xfInfo* xfi, XEvent* xevent);
+boolean xf_cliprdr_process_property_notify(xfInfo* xfi, XEvent* xevent);
+void xf_cliprdr_check_owner(xfInfo* xfi);
+
+#ifdef WITH_DEBUG_X11_CLIPRDR
+#define DEBUG_X11_CLIPRDR(fmt, ...) DEBUG_CLASS(X11_CLIPRDR, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_X11_CLIPRDR(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __XF_CLIPRDR_H */
diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c
new file mode 100644 (file)
index 0000000..ccd293d
--- /dev/null
@@ -0,0 +1,762 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Event Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <freerdp/kbd/kbd.h>
+#include <freerdp/kbd/vkcodes.h>
+
+#include "xf_rail.h"
+#include "xf_window.h"
+#include "xf_cliprdr.h"
+
+#include "xf_event.h"
+
+static const char* const X11_EVENT_STRINGS[] =
+{
+       "", "",
+       "KeyPress",
+       "KeyRelease",
+       "ButtonPress",
+       "ButtonRelease",
+       "MotionNotify",
+       "EnterNotify",
+       "LeaveNotify",
+       "FocusIn",
+       "FocusOut",
+       "KeymapNotify",
+       "Expose",
+       "GraphicsExpose",
+       "NoExpose",
+       "VisibilityNotify",
+       "CreateNotify",
+       "DestroyNotify",
+       "UnmapNotify",
+       "MapNotify",
+       "MapRequest",
+       "ReparentNotify",
+       "ConfigureNotify",
+       "ConfigureRequest",
+       "GravityNotify",
+       "ResizeRequest",
+       "CirculateNotify",
+       "CirculateRequest",
+       "PropertyNotify",
+       "SelectionClear",
+       "SelectionRequest",
+       "SelectionNotify",
+       "ColormapNotify",
+       "ClientMessage",
+       "MappingNotify",
+       "GenericEvent",
+};
+
+void xf_send_mouse_motion_event(rdpInput* input, boolean down, uint32 button, uint16 x, uint16 y)
+{
+       input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
+}
+
+boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app)
+{
+       int x, y;
+       int w, h;
+
+       x = event->xexpose.x;
+       y = event->xexpose.y;
+       w = event->xexpose.width;
+       h = event->xexpose.height;
+
+       if (app != true)
+       {
+               XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, x, y, w, h, x, y);
+       }
+       else
+       {
+               xfWindow* xfw;
+               rdpWindow* window;
+               rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+               window = window_list_get_by_extra_id(rail->list, (void*) event->xexpose.window);
+
+               if (window != NULL)
+               {
+                       xfw = (xfWindow*) window->extra;
+                       xf_UpdateWindowArea(xfi, xfw, x, y, w, h);
+               }
+       }
+
+       return true;
+}
+
+boolean xf_event_VisibilityNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       xfi->unobscured = event->xvisibility.state == VisibilityUnobscured;
+       return true;
+}
+
+boolean xf_event_MotionNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       rdpInput* input;
+
+       input = xfi->instance->input;
+
+       if (app != true)
+       {
+               if (xfi->mouse_motion != true)
+               {
+                       if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0)
+                               return true;
+               }
+
+               input->MouseEvent(input, PTR_FLAGS_MOVE, event->xmotion.x, event->xmotion.y);
+
+               if (xfi->fullscreen)
+                       XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime);
+       }
+       else if (xfi->mouse_motion == true)
+       {
+               rdpWindow* window;
+               int x = event->xmotion.x;
+               int y = event->xmotion.y;
+               rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+               window = window_list_get_by_extra_id(rail->list, (void*) event->xmotion.window);
+
+               if (window != NULL)
+               {
+                       x += window->windowOffsetX;
+                       y += window->windowOffsetY;
+                       input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
+               }
+       }
+
+       return true;
+}
+
+boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app)
+{
+       uint16 x, y;
+       uint16 flags;
+       boolean wheel;
+       rdpInput* input;
+
+       input = xfi->instance->input;
+
+       x = 0;
+       y = 0;
+       flags = 0;
+       wheel = false;
+
+       switch (event->xbutton.button)
+       {
+               case 1:
+                       x = event->xbutton.x;
+                       y = event->xbutton.y;
+                       flags = PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON1;
+                       break;
+
+               case 2:
+                       x = event->xbutton.x;
+                       y = event->xbutton.y;
+                       flags = PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON3;
+                       break;
+
+               case 3:
+                       x = event->xbutton.x;
+                       y = event->xbutton.y;
+                       flags = PTR_FLAGS_DOWN | PTR_FLAGS_BUTTON2;
+                       break;
+
+               case 4:
+                       wheel = true;
+                       flags = PTR_FLAGS_WHEEL | 0x0078;
+                       break;
+
+               case 5:
+                       wheel = true;
+                       flags = PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x0088;
+                       break;
+
+               default:
+                       x = 0;
+                       y = 0;
+                       flags = 0;
+                       break;
+       }
+
+       if (flags != 0)
+       {
+               if (wheel)
+               {
+                       input->MouseEvent(input, flags, 0, 0);
+               }
+               else
+               {
+                       if (app)
+                       {
+                               rdpWindow* window;
+                               rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+                               window = window_list_get_by_extra_id(rail->list, (void*) event->xbutton.window);
+
+                               if (window != NULL)
+                               {
+                                       x += window->windowOffsetX;
+                                       y += window->windowOffsetY;
+                               }
+                       }
+
+                       input->MouseEvent(input, flags, x, y);
+               }
+       }
+
+       return true;
+}
+
+boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app)
+{
+       uint16 x, y;
+       uint16 flags;
+       rdpInput* input;
+
+       input = xfi->instance->input;
+
+       x = 0;
+       y = 0;
+       flags = 0;
+
+       switch (event->xbutton.button)
+       {
+               case 1:
+                       x = event->xbutton.x;
+                       y = event->xbutton.y;
+                       flags = PTR_FLAGS_BUTTON1;
+                       break;
+
+               case 2:
+                       x = event->xbutton.x;
+                       y = event->xbutton.y;
+                       flags = PTR_FLAGS_BUTTON3;
+                       break;
+
+               case 3:
+                       x = event->xbutton.x;
+                       y = event->xbutton.y;
+                       flags = PTR_FLAGS_BUTTON2;
+                       break;
+
+               default:
+                       flags = 0;
+                       break;
+       }
+
+       if (flags != 0)
+       {
+               if (app)
+               {
+                       rdpWindow* window;
+                       rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+                       window = window_list_get_by_extra_id(rail->list, (void*) event->xbutton.window);
+
+                       if (window != NULL)
+                       {
+                               x += window->windowOffsetX;
+                               y += window->windowOffsetY;
+                       }
+               }
+
+               input->MouseEvent(input, flags, x, y);
+       }
+
+       return true;
+}
+
+boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app)
+{
+       KeySym keysym;
+       char str[256];
+
+       XLookupString((XKeyEvent*) event, str, sizeof(str), &keysym, NULL);
+
+       xf_kbd_set_keypress(xfi, event->xkey.keycode, keysym);
+
+       if (xfi->fullscreen_toggle && xf_kbd_handle_special_keys(xfi, keysym))
+               return true;
+
+       xf_kbd_send_key(xfi, true, event->xkey.keycode);
+
+       return true;
+}
+
+boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app)
+{
+       XEvent next_event;
+
+       if (XPending(xfi->display))
+       {
+               memset(&next_event, 0, sizeof(next_event));
+               XPeekEvent(xfi->display, &next_event);
+
+               if (next_event.type == KeyPress)
+               {
+                       if (next_event.xkey.keycode == event->xkey.keycode)
+                               return true;
+               }
+       }
+
+       xf_kbd_unset_keypress(xfi, event->xkey.keycode);
+       xf_kbd_send_key(xfi, false, event->xkey.keycode);
+
+       return true;
+}
+
+boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (event->xfocus.mode == NotifyGrab)
+               return true;
+
+       xfi->focused = true;
+
+       if (xfi->mouse_active && (app != true))
+               XGrabKeyboard(xfi->display, xfi->window->handle, true, GrabModeAsync, GrabModeAsync, CurrentTime);
+
+       if (app)
+               xf_rail_send_activate(xfi, event->xany.window, true);
+
+       xf_kbd_focus_in(xfi);
+
+       if (app != true)
+               xf_cliprdr_check_owner(xfi);
+
+       return true;
+}
+
+boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (event->xfocus.mode == NotifyUngrab)
+               return true;
+
+       xfi->focused = false;
+
+       if (event->xfocus.mode == NotifyWhileGrabbed)
+               XUngrabKeyboard(xfi->display, CurrentTime);
+
+       if (app)
+               xf_rail_send_activate(xfi, event->xany.window, false);
+
+       return true;
+}
+
+boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (event->xmapping.request == MappingModifier)
+       {
+               XFreeModifiermap(xfi->modifier_map);
+               xfi->modifier_map = XGetModifierMapping(xfi->display);
+       }
+
+       return true;
+}
+
+boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if ((event->xclient.message_type == xfi->WM_PROTOCOLS)
+           && ((Atom) event->xclient.data.l[0] == xfi->WM_DELETE_WINDOW))
+       {
+               if (app)
+               {
+                       rdpWindow* window;
+                       rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+                       window = window_list_get_by_extra_id(rail->list, (void*) event->xclient.window);
+
+                       if (window != NULL)
+                       {
+                               xf_rail_send_client_system_command(xfi, window->windowId, SC_CLOSE);
+                       }
+
+                       return true;
+               }
+               else
+               {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (app != true)
+       {
+               xfi->mouse_active = true;
+
+               if (xfi->fullscreen)
+                       XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime);
+
+               if (xfi->focused)
+                       XGrabKeyboard(xfi->display, xfi->window->handle, true, GrabModeAsync, GrabModeAsync, CurrentTime);
+       }
+       else
+       {
+               /* keep track of which window has focus so that we can apply pointer updates */
+
+               xfWindow* xfw;
+               rdpWindow* window;
+               rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+               window = window_list_get_by_extra_id(rail->list, (void*) event->xexpose.window);
+
+               if (window != NULL)
+               {
+                       xfw = (xfWindow*) window->extra;
+                       xfi->window = xfw;
+               }
+       }
+
+       return true;
+}
+
+boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (app != true)
+       {
+               xfi->mouse_active = false;
+               XUngrabKeyboard(xfi->display, CurrentTime);
+       }
+
+       return true;
+}
+
+boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+        rdpWindow* window;
+        rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+        window = window_list_get_by_extra_id(rail->list, (void*) event->xconfigure.window);
+
+        if (window != NULL)
+        {
+                xfWindow* xfw;
+                Window childWindow;
+                xfw = (xfWindow*) window->extra;
+
+                /*
+                 * ConfigureNotify coordinates are expressed relative to the window parent.
+                 * Translate these to root window coordinates.
+                 */
+
+                XTranslateCoordinates(xfi->display, xfw->handle, 
+                       RootWindowOfScreen(xfi->screen),
+                        0, 0, &xfw->left, &xfw->top, &childWindow);
+
+                xfw->width = event->xconfigure.width;
+                xfw->height = event->xconfigure.height;
+                xfw->right = xfw->left + xfw->width - 1;
+                xfw->bottom = xfw->top + xfw->height - 1;
+
+               DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%u h=%u send_event=%d",
+                       (uint32) xfw->handle, xfw->left, xfw->top, xfw->right, xfw->bottom,
+                       xfw->width, xfw->height, event->xconfigure.send_event);
+
+               if (app && ! event->xconfigure.send_event)
+                       xf_rail_adjust_position(xfi, window);
+        }
+
+        return True;
+}
+
+boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       rdpWindow* window;
+       rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+       if (app != true)
+               return true;
+
+       window = window_list_get_by_extra_id(rail->list, (void*) event->xany.window);
+
+       if (window != NULL)
+       {
+               /* local restore event */
+               xf_rail_send_client_system_command(xfi, window->windowId, SC_RESTORE);
+               xfWindow *xfw = (xfWindow*) window->extra;
+               xfw->is_mapped = true;
+       }
+
+       return true;
+}
+
+boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       rdpWindow* window;
+       rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+
+       if (app != true)
+               return true;
+
+       window = window_list_get_by_extra_id(rail->list, (void*) event->xany.window);
+
+       if (window != NULL)
+       {
+               xfWindow *xfw = (xfWindow*) window->extra;
+               xfw->is_mapped = false;
+       }
+
+       return true;
+}
+
+boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (app != true)
+       {
+               if (xf_cliprdr_process_selection_notify(xfi, event))
+                       return true;
+       }
+
+       return true;
+}
+
+boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (app != true)
+       {
+               if (xf_cliprdr_process_selection_request(xfi, event))
+                       return true;
+       }
+
+       return true;
+}
+
+boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (app != true)
+       {
+               if (xf_cliprdr_process_selection_clear(xfi, event))
+                       return true;
+       }
+
+       return true;
+}
+
+boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app)
+{
+       if (app != true)
+       {
+               if (xf_cliprdr_process_property_notify(xfi, event))
+                       return true;
+       }
+
+       return true;
+}
+
+boolean xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*event)
+{
+       if (! xfi->remote_app)
+               return false;
+
+       switch (xfi->window->local_move.state)
+       {
+               case LMS_NOT_ACTIVE:
+                       // No local move in progress, nothing to do
+                       break;
+               case LMS_STARTING:
+                       // Local move initiated by RDP server, but we
+                       // have not yet seen any updates from the X server
+                       switch(event->type)
+                       {
+                               case ConfigureNotify:
+                                       // Starting to see move events 
+                                       // from the X server. Local 
+                                       // move is now in progress.
+                                       xfi->window->local_move.state = LMS_ACTIVE;
+
+                                       // Allow these events to be processed during move to keep
+                                       // our state up to date.
+                                       break;
+                               case ButtonPress:
+                               case ButtonRelease:
+                               case KeyPress:
+                               case KeyRelease:
+                               case UnmapNotify:
+                                       // A button release event means the X 
+                                       // window server did not grab the
+                                       // mouse before the user released it.  
+                                       // In this case we must cancel the 
+                                       // local move. The event will be 
+                                       // processed below as normal, below.
+                                       break;
+                               case VisibilityNotify:
+                               case PropertyNotify:
+                               case Expose:
+                                       // Allow these events to pass
+                                       break;
+                               default:
+                                       // Eat any other events 
+                                       return true;
+                       }
+                       break;
+
+               case LMS_ACTIVE:
+                       // Local move is in progress
+                       switch(event->type)
+                       {
+                               case ConfigureNotify:
+                               case VisibilityNotify:
+                               case PropertyNotify:
+                               case Expose:
+                                       // Keep us up to date on position
+                                       break;
+                               default:
+                                       // Any other event terminates move
+                                       xf_rail_end_local_move(xfi, window);
+                                       break;
+                       }
+                       break;
+
+               case LMS_TERMINATING:
+                       // Already sent RDP end move to sever
+                       // Allow events to pass.
+                       break;
+       }       
+
+       return false;
+}
+
+
+boolean xf_event_process(freerdp* instance, XEvent* event)
+{
+       boolean status = true;
+       xfInfo* xfi = ((xfContext*) instance->context)->xfi;
+       rdpRail* rail = ((rdpContext*) xfi->context)->rail;
+       rdpWindow* window;
+
+       if (xfi->remote_app)
+       {
+               window = window_list_get_by_extra_id(
+                       rail->list, (void*) event->xexpose.window);
+               if (window) 
+               {
+                       // Update "current" window for cursor change orders
+                       xfi->window = (xfWindow *) window->extra;
+
+                       if (xf_event_suppress_events(xfi, window, event))
+                               return true;
+               }
+       }
+
+       if (event->type != MotionNotify)
+               DEBUG_X11("%s Event: wnd=0x%04X", X11_EVENT_STRINGS[event->type], (uint32) event->xany.window);
+
+       switch (event->type)
+       {
+               case Expose:
+                       status = xf_event_Expose(xfi, event, xfi->remote_app);
+                       break;
+
+               case VisibilityNotify:
+                       status = xf_event_VisibilityNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case MotionNotify:
+                       status = xf_event_MotionNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case ButtonPress:
+                       status = xf_event_ButtonPress(xfi, event, xfi->remote_app);
+                       break;
+
+               case ButtonRelease:
+                       status = xf_event_ButtonRelease(xfi, event, xfi->remote_app);
+                       break;
+
+               case KeyPress:
+                       status = xf_event_KeyPress(xfi, event, xfi->remote_app);
+                       break;
+
+               case KeyRelease:
+                       status = xf_event_KeyRelease(xfi, event, xfi->remote_app);
+                       break;
+
+               case FocusIn:
+                       status = xf_event_FocusIn(xfi, event, xfi->remote_app);
+                       break;
+
+               case FocusOut:
+                       status = xf_event_FocusOut(xfi, event, xfi->remote_app);
+                       break;
+
+               case EnterNotify:
+                       status = xf_event_EnterNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case LeaveNotify:
+                       status = xf_event_LeaveNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case NoExpose:
+                       break;
+
+               case GraphicsExpose:
+                       break;
+
+               case ConfigureNotify:
+                       status = xf_event_ConfigureNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case MapNotify:
+                       status = xf_event_MapNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case UnmapNotify:
+                       status = xf_event_UnmapNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case ReparentNotify:
+                       break;
+
+               case MappingNotify:
+                       status = xf_event_MappingNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case ClientMessage:
+                       status = xf_event_ClientMessage(xfi, event, xfi->remote_app);
+                       break;
+
+               case SelectionNotify:
+                       status = xf_event_SelectionNotify(xfi, event, xfi->remote_app);
+                       break;
+
+               case SelectionRequest:
+                       status = xf_event_SelectionRequest(xfi, event, xfi->remote_app);
+                       break;
+
+               case SelectionClear:
+                       status = xf_event_SelectionClear(xfi, event, xfi->remote_app);
+                       break;
+
+               case PropertyNotify:
+                       status = xf_event_PropertyNotify(xfi, event, xfi->remote_app);
+                       break;
+       }
+
+       return status;
+}
diff --git a/client/X11/xf_event.h b/client/X11/xf_event.h
new file mode 100644 (file)
index 0000000..c6938b3
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Event Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_EVENT_H
+#define __XF_EVENT_H
+
+#include "xf_keyboard.h"
+
+#include "xfreerdp.h"
+
+boolean xf_event_process(freerdp* instance, XEvent* event);
+void xf_event_SendClientEvent(xfInfo *xfi, xfWindow* window, Atom atom, unsigned int numArgs, ...);
+
+#endif /* __XF_EVENT_H */
diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c
new file mode 100644 (file)
index 0000000..0b20d0c
--- /dev/null
@@ -0,0 +1,788 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 GDI
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/codec/nsc.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/codec/bitmap.h>
+
+#include "xf_gdi.h"
+
+static const uint8 xf_rop2_table[] =
+{
+       0,
+       GXclear,        /* 0 */
+       GXnor,          /* DPon */
+       GXandInverted,  /* DPna */
+       GXcopyInverted, /* Pn */
+       GXandReverse,   /* PDna */
+       GXinvert,       /* Dn */
+       GXxor,          /* DPx */
+       GXnand,         /* DPan */
+       GXand,          /* DPa */
+       GXequiv,        /* DPxn */
+       GXnoop,         /* D */
+       GXorInverted,   /* DPno */
+       GXcopy,         /* P */
+       GXorReverse,    /* PDno */
+       GXor,           /* DPo */
+       GXset           /* 1 */
+};
+
+boolean xf_set_rop2(xfInfo* xfi, int rop2)
+{
+       if ((rop2 < 0x01) || (rop2 > 0x10))
+       {
+               printf("Unsupported ROP2: %d\n", rop2);
+               return false;
+       }
+
+       XSetFunction(xfi->display, xfi->gc, xf_rop2_table[rop2]);
+       return true;
+}
+
+boolean xf_set_rop3(xfInfo* xfi, int rop3)
+{
+       int function = -1;
+
+       switch (rop3)
+       {
+               case GDI_BLACKNESS:
+                       function = GXclear;
+                       break;
+
+               case 0x000500A9:
+                       function = GXnor;
+                       break;
+
+               case 0x000A0329:
+                       function = GXandInverted;
+                       break;
+
+               case 0x000F0001:
+                       function = GXcopyInverted;
+                       break;
+
+               case GDI_NOTSRCERASE:
+                       function = GXnor;
+                       break;
+
+               case GDI_DSna:
+                       function = GXandInverted;
+                       break;
+
+               case GDI_NOTSRCCOPY:
+                       function = GXcopyInverted;
+                       break;
+
+               case GDI_SRCERASE:
+                       function = GXandReverse;
+                       break;
+
+               case 0x00500325:
+                       function = GXandReverse;
+                       break;
+
+               case GDI_DSTINVERT:
+                       function = GXinvert;
+                       break;
+
+               case GDI_PATINVERT:
+                       function = GXxor;
+                       break;
+
+               case 0x005F00E9:
+                       function = GXnand;
+                       break;
+
+               case GDI_SRCINVERT:
+                       function = GXxor;
+                       break;
+
+               case 0x007700E6:
+                       function = GXnand;
+                       break;
+
+               case GDI_SRCAND:
+                       function = GXand;
+                       break;
+
+               case 0x00990066:
+                       function = GXequiv;
+                       break;
+
+               case 0x00A000C9:
+                       function = GXand;
+                       break;
+
+               case GDI_PDxn:
+                       function = GXequiv;
+                       break;
+
+               case 0x00AA0029:
+                       function = GXnoop;
+                       break;
+
+               case 0x00AF0229:
+                       function = GXorInverted;
+                       break;
+
+               case GDI_MERGEPAINT:
+                       function = GXorInverted;
+                       break;
+
+               case GDI_SRCCOPY:
+                       function = GXcopy;
+                       break;
+
+               case 0x00DD0228:
+                       function = GXorReverse;
+                       break;
+
+               case GDI_SRCPAINT:
+                       function = GXor;
+                       break;
+
+               case GDI_PATCOPY:
+                       function = GXcopy;
+                       break;
+
+               case 0x00F50225:
+                       function = GXorReverse;
+                       break;
+
+               case 0x00FA0089:
+                       function = GXor;
+                       break;
+
+               case GDI_WHITENESS:
+                       function = GXset;
+                       break;
+
+               default:
+                       break;
+       }
+
+       if (function < 0)
+       {
+               printf("Unsupported ROP3: 0x%08X\n", rop3);
+               XSetFunction(xfi->display, xfi->gc, GXclear);
+               return false;
+       }
+
+       XSetFunction(xfi->display, xfi->gc, function);
+
+       return true;
+}
+
+Pixmap xf_brush_new(xfInfo* xfi, int width, int height, int bpp, uint8* data)
+{
+       Pixmap bitmap;
+       uint8* cdata;
+       XImage* image;
+
+       bitmap = XCreatePixmap(xfi->display, xfi->drawable, width, height, xfi->depth);
+
+       if(data != NULL)
+       {
+               GC gc;  // FIXME, should cache
+
+               cdata = freerdp_image_convert(data, NULL, width, height, bpp, xfi->bpp, xfi->clrconv);
+               image = XCreateImage(xfi->display, xfi->visual, xfi->depth,
+                                               ZPixmap, 0, (char*) cdata, width, height, xfi->scanline_pad, 0);
+
+               gc = XCreateGC(xfi->display, xfi->drawable, 0, NULL);
+               XPutImage(xfi->display, bitmap, gc, image, 0, 0, 0, 0, width, height);
+               XFree(image);
+               if (cdata != data)
+                       xfree(cdata);
+
+               XFreeGC(xfi->display, gc);
+       }
+
+       return bitmap;
+}
+
+Pixmap xf_mono_bitmap_new(xfInfo* xfi, int width, int height, uint8* data)
+{
+       int scanline;
+       XImage* image;
+       Pixmap bitmap;
+
+       scanline = (width + 7) / 8;
+
+       bitmap = XCreatePixmap(xfi->display, xfi->drawable, width, height, 1);
+
+       image = XCreateImage(xfi->display, xfi->visual, 1,
+                       ZPixmap, 0, (char*) data, width, height, 8, scanline);
+
+       XPutImage(xfi->display, bitmap, xfi->gc_mono, image, 0, 0, 0, 0, width, height);
+       XFree(image);
+
+       return bitmap;
+}
+
+Pixmap xf_glyph_new(xfInfo* xfi, int width, int height, uint8* data)
+{
+       int scanline;
+       Pixmap bitmap;
+       XImage* image;
+
+       scanline = (width + 7) / 8;
+
+       bitmap = XCreatePixmap(xfi->display, xfi->drawable, width, height, 1);
+
+       image = XCreateImage(xfi->display, xfi->visual, 1,
+                       ZPixmap, 0, (char*) data, width, height, 8, scanline);
+
+       image->byte_order = MSBFirst;
+       image->bitmap_bit_order = MSBFirst;
+
+       XInitImage(image);
+       XPutImage(xfi->display, bitmap, xfi->gc_mono, image, 0, 0, 0, 0, width, height);
+       XFree(image);
+
+       return bitmap;
+}
+
+void xf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+       xfi->clrconv->palette->count = palette->number;
+       xfi->clrconv->palette->entries = palette->entries;
+}
+
+void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds)
+{
+       XRectangle clip;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       if (bounds != NULL)
+       {
+               clip.x = bounds->left;
+               clip.y = bounds->top;
+               clip.width = bounds->right - bounds->left + 1;
+               clip.height = bounds->bottom - bounds->top + 1;
+               XSetClipRectangles(xfi->display, xfi->gc, 0, 0, &clip, 1, YXBanded);
+       }
+       else
+       {
+               XSetClipMask(xfi->display, xfi->gc, None);
+       }
+}
+
+void xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       xf_set_rop3(xfi, gdi_rop3_code(dstblt->bRop));
+
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XFillRectangle(xfi->display, xfi->drawing, xfi->gc,
+                       dstblt->nLeftRect, dstblt->nTopRect,
+                       dstblt->nWidth, dstblt->nHeight);
+
+       if (xfi->drawing == xfi->primary)
+       {
+               if (xfi->remote_app != true)
+               {
+                       XFillRectangle(xfi->display, xfi->drawable, xfi->gc,
+                               dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, dstblt->nLeftRect, dstblt->nTopRect, dstblt->nWidth, dstblt->nHeight);
+       }
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+}
+
+void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt)
+{
+       Pixmap pattern;
+       rdpBrush* brush;
+       uint32 foreColor;
+       uint32 backColor;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       brush = &patblt->brush;
+       xf_set_rop3(xfi, gdi_rop3_code(patblt->bRop));
+
+       foreColor = freerdp_color_convert_rgb(patblt->foreColor, xfi->srcBpp, 32, xfi->clrconv);
+       backColor = freerdp_color_convert_rgb(patblt->backColor, xfi->srcBpp, 32, xfi->clrconv);
+
+       if (brush->style == GDI_BS_SOLID)
+       {
+               XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+               XSetForeground(xfi->display, xfi->gc, foreColor);
+
+               XFillRectangle(xfi->display, xfi->drawing, xfi->gc,
+                               patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight);
+       }
+       else if (brush->style == GDI_BS_PATTERN)
+       {
+               if (brush->bpp > 1)
+               {
+                       pattern = xf_brush_new(xfi, 8, 8, brush->bpp, brush->data);
+
+                       XSetFillStyle(xfi->display, xfi->gc, FillTiled);
+                       XSetTile(xfi->display, xfi->gc, pattern);
+                       XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y);
+
+                       XFillRectangle(xfi->display, xfi->drawing, xfi->gc,
+                                       patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight);
+
+                       XSetTile(xfi->display, xfi->gc, xfi->primary);
+
+                       XFreePixmap(xfi->display, pattern);
+               }
+               else
+               {
+                       pattern = xf_mono_bitmap_new(xfi, 8, 8, brush->data);
+
+                       XSetForeground(xfi->display, xfi->gc, backColor);
+                       XSetBackground(xfi->display, xfi->gc, foreColor);
+                       XSetFillStyle(xfi->display, xfi->gc, FillOpaqueStippled);
+                       XSetStipple(xfi->display, xfi->gc, pattern);
+                       XSetTSOrigin(xfi->display, xfi->gc, brush->x, brush->y);
+
+                       XFillRectangle(xfi->display, xfi->drawing, xfi->gc,
+                                       patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight);
+
+                       XFreePixmap(xfi->display, pattern);
+               }
+       }
+       else
+       {
+               printf("unimplemented brush style:%d\n", brush->style);
+       }
+
+       if (xfi->drawing == xfi->primary)
+       {
+               XSetFunction(xfi->display, xfi->gc, GXcopy);
+
+               if (xfi->remote_app != true)
+               {
+                       XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, patblt->nLeftRect, patblt->nTopRect,
+                               patblt->nWidth, patblt->nHeight, patblt->nLeftRect, patblt->nTopRect);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight);
+       }
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+}
+
+void xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       xf_set_rop3(xfi, gdi_rop3_code(scrblt->bRop));
+
+       XCopyArea(xfi->display, xfi->primary, xfi->drawing, xfi->gc, scrblt->nXSrc, scrblt->nYSrc,
+                       scrblt->nWidth, scrblt->nHeight, scrblt->nLeftRect, scrblt->nTopRect);
+
+       if (xfi->drawing == xfi->primary)
+       {
+               if (xfi->remote_app != true)
+               {
+                       if (xfi->unobscured)
+                       {
+                               XCopyArea(xfi->display, xfi->drawable, xfi->drawable, xfi->gc,
+                                               scrblt->nXSrc, scrblt->nYSrc, scrblt->nWidth, scrblt->nHeight,
+                                               scrblt->nLeftRect, scrblt->nTopRect);
+                       }
+                       else
+                       {
+                               XSetFunction(xfi->display, xfi->gc, GXcopy);
+                               XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc,
+                                               scrblt->nLeftRect, scrblt->nTopRect, scrblt->nWidth, scrblt->nHeight,
+                                               scrblt->nLeftRect, scrblt->nTopRect);
+                       }
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, scrblt->nLeftRect, scrblt->nTopRect, scrblt->nWidth, scrblt->nHeight);
+       }
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+}
+
+void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect)
+{
+       uint32 color;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       color = freerdp_color_convert_var(opaque_rect->color, xfi->srcBpp, 32, xfi->clrconv);
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XSetForeground(xfi->display, xfi->gc, color);
+
+       XFillRectangle(xfi->display, xfi->drawing, xfi->gc,
+                       opaque_rect->nLeftRect, opaque_rect->nTopRect,
+                       opaque_rect->nWidth, opaque_rect->nHeight);
+
+       if (xfi->drawing == xfi->primary)
+       {
+               if (xfi->remote_app != true)
+               {
+                       XFillRectangle(xfi->display, xfi->drawable, xfi->gc,
+                               opaque_rect->nLeftRect, opaque_rect->nTopRect, opaque_rect->nWidth, opaque_rect->nHeight);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, opaque_rect->nLeftRect, opaque_rect->nTopRect,
+                               opaque_rect->nWidth, opaque_rect->nHeight);
+       }
+}
+
+void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect)
+{
+       int i;
+       uint32 color;
+       DELTA_RECT* rectangle;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       color = freerdp_color_convert_var(multi_opaque_rect->color, xfi->srcBpp, 32, xfi->clrconv);
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XSetForeground(xfi->display, xfi->gc, color);
+
+       for (i = 1; i < multi_opaque_rect->numRectangles + 1; i++)
+       {
+               rectangle = &multi_opaque_rect->rectangles[i];
+
+               XFillRectangle(xfi->display, xfi->drawing, xfi->gc,
+                               rectangle->left, rectangle->top,
+                               rectangle->width, rectangle->height);
+
+               if (xfi->drawing == xfi->primary)
+               {
+                       if (xfi->remote_app != true)
+                       {
+                               XFillRectangle(xfi->display, xfi->drawable, xfi->gc,
+                                       rectangle->left, rectangle->top, rectangle->width, rectangle->height);
+                       }
+
+                       gdi_InvalidateRegion(xfi->hdc, rectangle->left, rectangle->top, rectangle->width, rectangle->height);
+               }
+       }
+}
+
+void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to)
+{
+       uint32 color;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       xf_set_rop2(xfi, line_to->bRop2);
+       color = freerdp_color_convert_rgb(line_to->penColor, xfi->srcBpp, 32, xfi->clrconv);
+
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XSetForeground(xfi->display, xfi->gc, color);
+
+       XDrawLine(xfi->display, xfi->drawing, xfi->gc,
+                       line_to->nXStart, line_to->nYStart, line_to->nXEnd, line_to->nYEnd);
+
+       if (xfi->drawing == xfi->primary)
+       {
+               int width, height;
+
+               if (xfi->remote_app != true)
+               {
+                       XDrawLine(xfi->display, xfi->drawable, xfi->gc,
+                               line_to->nXStart, line_to->nYStart, line_to->nXEnd, line_to->nYEnd);
+               }
+
+               width = line_to->nXStart - line_to->nXEnd;
+               height = line_to->nYStart - line_to->nYEnd;
+
+               if (width < 0)
+                       width *= (-1);
+
+               if (height < 0)
+                       height *= (-1);
+
+               gdi_InvalidateRegion(xfi->hdc, line_to->nXStart, line_to->nYStart, width, height);
+
+       }
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+}
+
+void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline)
+{
+       int i;
+       int x, y;
+       int x1, y1;
+       int x2, y2;
+       int npoints;
+       uint32 color;
+       XPoint* points;
+       int width, height;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       xf_set_rop2(xfi, polyline->bRop2);
+       color = freerdp_color_convert_rgb(polyline->penColor, xfi->srcBpp, 32, xfi->clrconv);
+
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XSetForeground(xfi->display, xfi->gc, color);
+
+       npoints = polyline->numPoints + 1;
+       points = xmalloc(sizeof(XPoint) * npoints);
+
+       points[0].x = polyline->xStart;
+       points[0].y = polyline->yStart;
+
+       for (i = 0; i < polyline->numPoints; i++)
+       {
+               points[i + 1].x = polyline->points[i].x;
+               points[i + 1].y = polyline->points[i].y;
+       }
+
+       XDrawLines(xfi->display, xfi->drawing, xfi->gc, points, npoints, CoordModePrevious);
+
+       if (xfi->drawing == xfi->primary)
+       {
+               if (xfi->remote_app != true)
+                       XDrawLines(xfi->display, xfi->drawable, xfi->gc, points, npoints, CoordModePrevious);
+
+               x1 = points[0].x;
+               y1 = points[0].y;
+
+               for (i = 1; i < npoints; i++)
+               {
+                       x2 = points[i].x + x1;
+                       y2 = points[i].y + y1;
+
+                       x = (x2 < x1) ? x2 : x1;
+                       width = (x2 > x1) ? x2 - x1 : x1 - x2;
+
+                       y = (y2 < y1) ? y2 : y1;
+                       height = (y2 > y1) ? y2 - y1 : y1 - y2;
+
+                       x1 = x2;
+                       y1 = y2;
+
+                       gdi_InvalidateRegion(xfi->hdc, x, y, width, height);
+               }
+       }
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+       xfree(points);
+}
+
+void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt)
+{
+       xfBitmap* bitmap;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       bitmap = (xfBitmap*) memblt->bitmap;
+       xf_set_rop3(xfi, gdi_rop3_code(memblt->bRop));
+
+       XCopyArea(xfi->display, bitmap->pixmap, xfi->drawing, xfi->gc,
+                       memblt->nXSrc, memblt->nYSrc, memblt->nWidth, memblt->nHeight,
+                       memblt->nLeftRect, memblt->nTopRect);
+
+       if (xfi->drawing == xfi->primary)
+       {
+               if (xfi->remote_app != true)
+               {
+                       XCopyArea(xfi->display, bitmap->pixmap, xfi->drawable, xfi->gc,
+                               memblt->nXSrc, memblt->nYSrc, memblt->nWidth, memblt->nHeight,
+                               memblt->nLeftRect, memblt->nTopRect);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, memblt->nLeftRect, memblt->nTopRect, memblt->nWidth, memblt->nHeight);
+       }
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+}
+
+void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt)
+{
+
+}
+
+void xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker)
+{
+
+}
+
+void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command)
+{
+       int i, tx, ty;
+       XImage* image;
+       RFX_MESSAGE* message;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+       RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) xfi->rfx_context;
+       NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) xfi->nsc_context;
+
+       if (surface_bits_command->codecID == CODEC_ID_REMOTEFX)
+       {
+               message = rfx_process_message(rfx_context,
+                               surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+
+               XSetFunction(xfi->display, xfi->gc, GXcopy);
+               XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+
+               XSetClipRectangles(xfi->display, xfi->gc,
+                               surface_bits_command->destLeft, surface_bits_command->destTop,
+                               (XRectangle*) message->rects, message->num_rects, YXBanded);
+
+               /* Draw the tiles to primary surface, each is 64x64. */
+               for (i = 0; i < message->num_tiles; i++)
+               {
+                       image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0,
+                               (char*) message->tiles[i]->data, 64, 64, 32, 0);
+
+                       tx = message->tiles[i]->x + surface_bits_command->destLeft;
+                       ty = message->tiles[i]->y + surface_bits_command->destTop;
+
+                       XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0, tx, ty, 64, 64);
+                       XFree(image);
+               }
+
+               /* Copy the updated region from backstore to the window. */
+               for (i = 0; i < message->num_rects; i++)
+               {
+                       tx = message->rects[i].x + surface_bits_command->destLeft;
+                       ty = message->rects[i].y + surface_bits_command->destTop;
+
+                       if (xfi->remote_app != true)
+                       {
+                               XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc,
+                                               tx, ty, message->rects[i].width, message->rects[i].height, tx, ty);
+                       }
+
+                       gdi_InvalidateRegion(xfi->hdc, tx, ty, message->rects[i].width, message->rects[i].height);
+               }
+
+               XSetClipMask(xfi->display, xfi->gc, None);
+               rfx_message_free(rfx_context, message);
+       }
+       else if (surface_bits_command->codecID == CODEC_ID_NSCODEC)
+       {
+               nsc_context->width = surface_bits_command->width;
+               nsc_context->height = surface_bits_command->height;
+               nsc_process_message(nsc_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+               XSetFunction(xfi->display, xfi->gc, GXcopy);
+               XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+
+               xfi->bmp_codec_nsc = (uint8*) xrealloc(xfi->bmp_codec_nsc,
+                               surface_bits_command->width * surface_bits_command->height * 4);
+
+               freerdp_image_flip(nsc_context->bmpdata, xfi->bmp_codec_nsc,
+                               surface_bits_command->width, surface_bits_command->height, 32);
+
+               image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0,
+                       (char*) xfi->bmp_codec_nsc, surface_bits_command->width, surface_bits_command->height, 32, 0);
+
+               XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0,
+                               surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height);
+
+               if (xfi->remote_app != true)
+               {
+                       XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc,
+                               surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height,
+                               surface_bits_command->destLeft, surface_bits_command->destTop);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height);
+
+               XSetClipMask(xfi->display, xfi->gc, None);
+               nsc_context_destroy(nsc_context);
+       }
+       else if (surface_bits_command->codecID == CODEC_ID_NONE)
+       {
+               XSetFunction(xfi->display, xfi->gc, GXcopy);
+               XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+
+               xfi->bmp_codec_none = (uint8*) xrealloc(xfi->bmp_codec_none,
+                               surface_bits_command->width * surface_bits_command->height * 4);
+
+               freerdp_image_flip(surface_bits_command->bitmapData, xfi->bmp_codec_none,
+                               surface_bits_command->width, surface_bits_command->height, 32);
+
+               image = XCreateImage(xfi->display, xfi->visual, 24, ZPixmap, 0,
+                       (char*) xfi->bmp_codec_none, surface_bits_command->width, surface_bits_command->height, 32, 0);
+
+               XPutImage(xfi->display, xfi->primary, xfi->gc, image, 0, 0,
+                               surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height);
+
+               if (xfi->remote_app != true)
+               {
+                       XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc,
+                               surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height,
+                               surface_bits_command->destLeft, surface_bits_command->destTop);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height);
+
+               XSetClipMask(xfi->display, xfi->gc, None);
+       }
+       else
+       {
+               printf("Unsupported codecID %d\n", surface_bits_command->codecID);
+       }
+}
+
+void xf_gdi_register_update_callbacks(rdpUpdate* update)
+{
+       rdpPrimaryUpdate* primary = update->primary;
+
+       update->Palette = xf_gdi_palette_update;
+       update->SetBounds = xf_gdi_set_bounds;
+
+       primary->DstBlt = xf_gdi_dstblt;
+       primary->PatBlt = xf_gdi_patblt;
+       primary->ScrBlt = xf_gdi_scrblt;
+       primary->OpaqueRect = xf_gdi_opaque_rect;
+       primary->DrawNineGrid = NULL;
+       primary->MultiDstBlt = NULL;
+       primary->MultiPatBlt = NULL;
+       primary->MultiScrBlt = NULL;
+       primary->MultiOpaqueRect = xf_gdi_multi_opaque_rect;
+       primary->MultiDrawNineGrid = NULL;
+       primary->LineTo = xf_gdi_line_to;
+       primary->Polyline = xf_gdi_polyline;
+       primary->MemBlt = xf_gdi_memblt;
+       primary->Mem3Blt = xf_gdi_mem3blt;
+       primary->SaveBitmap = NULL;
+       primary->GlyphIndex = NULL;
+       primary->FastIndex = NULL;
+       primary->FastGlyph = NULL;
+       primary->PolygonSC = NULL;
+       primary->PolygonCB = NULL;
+       primary->EllipseSC = NULL;
+       primary->EllipseCB = NULL;
+
+       update->SurfaceBits = xf_gdi_surface_bits;
+       update->SurfaceFrameMarker = xf_gdi_surface_frame_marker;
+}
+
diff --git a/client/X11/xf_gdi.h b/client/X11/xf_gdi.h
new file mode 100644 (file)
index 0000000..635e533
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 GDI
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_GDI_H
+#define __XF_GDI_H
+
+#include <freerdp/gdi/gdi.h>
+
+#include "xfreerdp.h"
+
+void xf_gdi_register_update_callbacks(rdpUpdate* update);
+
+#endif /* __XF_GDI_H */
diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c
new file mode 100644 (file)
index 0000000..0f3ab7c
--- /dev/null
@@ -0,0 +1,320 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef WITH_XCURSOR
+#include <X11/Xcursor/Xcursor.h>
+#endif
+
+#include <freerdp/codec/bitmap.h>
+
+#include "xf_graphics.h"
+
+/* Bitmap Class */
+
+void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
+{
+       uint8* data;
+       Pixmap pixmap;
+       XImage* image;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+       pixmap = XCreatePixmap(xfi->display, xfi->drawable, bitmap->width, bitmap->height, xfi->depth);
+
+       if (bitmap->data != NULL)
+       {
+               data = freerdp_image_convert(bitmap->data, NULL,
+                               bitmap->width, bitmap->height, bitmap->bpp, xfi->bpp, xfi->clrconv);
+
+               if (bitmap->ephemeral != true)
+               {
+                       image = XCreateImage(xfi->display, xfi->visual, xfi->depth,
+                               ZPixmap, 0, (char*) data, bitmap->width, bitmap->height, xfi->scanline_pad, 0);
+
+                       XPutImage(xfi->display, pixmap, xfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height);
+                       XFree(image);
+
+                       if (data != bitmap->data)
+                               xfree(data);
+               }
+               else
+               {
+                       if (data != bitmap->data)
+                               xfree(bitmap->data);
+                       
+                       bitmap->data = data;
+               }
+       }
+
+       ((xfBitmap*) bitmap)->pixmap = pixmap;
+}
+
+void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       if (((xfBitmap*) bitmap)->pixmap != 0)
+               XFreePixmap(xfi->display, ((xfBitmap*) bitmap)->pixmap);
+}
+
+void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap)
+{
+       XImage* image;
+       int width, height;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       width = bitmap->right - bitmap->left + 1;
+       height = bitmap->bottom - bitmap->top + 1;
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+
+       image = XCreateImage(xfi->display, xfi->visual, xfi->depth,
+                       ZPixmap, 0, (char*) bitmap->data, bitmap->width, bitmap->height, xfi->scanline_pad, 0);
+
+       XPutImage(xfi->display, xfi->primary, xfi->gc,
+                       image, 0, 0, bitmap->left, bitmap->top, width, height);
+
+       XFree(image);
+
+       if (xfi->remote_app != true)
+       {
+               XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc,
+                               bitmap->left, bitmap->top, width, height, bitmap->left, bitmap->top);
+       }
+
+       gdi_InvalidateRegion(xfi->hdc, bitmap->left, bitmap->top, width, height);
+}
+
+void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
+               uint8* data, int width, int height, int bpp, int length, boolean compressed)
+{
+       uint16 size;
+
+       size = width * height * (bpp + 7) / 8;
+
+       if (bitmap->data == NULL)
+               bitmap->data = (uint8*) xmalloc(size);
+       else
+               bitmap->data = (uint8*) xrealloc(bitmap->data, size);
+
+       if (compressed)
+       {
+               boolean status;
+
+               status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp);
+
+               if (status != true)
+               {
+                       printf("Bitmap Decompression Failed\n");
+               }
+       }
+       else
+       {
+               freerdp_image_flip(data, bitmap->data, width, height, bpp);
+       }
+
+       bitmap->compressed = false;
+       bitmap->length = size;
+       bitmap->bpp = bpp;
+}
+
+void xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       if (primary)
+               xfi->drawing = xfi->primary;
+       else
+               xfi->drawing = ((xfBitmap*) bitmap)->pixmap;
+}
+
+/* Pointer Class */
+
+void xf_Pointer_New(rdpContext* context, rdpPointer* pointer)
+{
+       XcursorImage ci;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       memset(&ci, 0, sizeof(ci));
+       ci.version = XCURSOR_IMAGE_VERSION;
+       ci.size = sizeof(ci);
+       ci.width = pointer->width;
+       ci.height = pointer->height;
+       ci.xhot = pointer->xPos;
+       ci.yhot = pointer->yPos;
+       ci.pixels = (XcursorPixel*) malloc(ci.width * ci.height * 4);
+       memset(ci.pixels, 0, ci.width * ci.height * 4);
+
+       if ((pointer->andMaskData != 0) && (pointer->xorMaskData != 0))
+       {
+               freerdp_alpha_cursor_convert((uint8*) (ci.pixels), pointer->xorMaskData, pointer->andMaskData,
+                               pointer->width, pointer->height, pointer->xorBpp, xfi->clrconv);
+       }
+
+       ((xfPointer*) pointer)->cursor = XcursorImageLoadCursor(xfi->display, &ci);
+       xfree(ci.pixels);
+}
+
+void xf_Pointer_Free(rdpContext* context, rdpPointer* pointer)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       if (((xfPointer*) pointer)->cursor != 0)
+               XFreeCursor(xfi->display, ((xfPointer*) pointer)->cursor);
+}
+
+void xf_Pointer_Set(rdpContext* context, rdpPointer* pointer)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       /* in RemoteApp mode, window can be null if none has had focus */
+
+       if (xfi->window != NULL)
+               XDefineCursor(xfi->display, xfi->window->handle, ((xfPointer*) pointer)->cursor);
+}
+/* Glyph Class */
+
+void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph)
+{
+       xfInfo* xfi;
+       int scanline;
+       XImage* image;
+       xfGlyph* xf_glyph;
+
+       xf_glyph = (xfGlyph*) glyph;
+       xfi = ((xfContext*) context)->xfi;
+
+       scanline = (glyph->cx + 7) / 8;
+
+       xf_glyph->pixmap = XCreatePixmap(xfi->display, xfi->drawing, glyph->cx, glyph->cy, 1);
+
+       image = XCreateImage(xfi->display, xfi->visual, 1,
+                       ZPixmap, 0, (char*) glyph->aj, glyph->cx, glyph->cy, 8, scanline);
+
+       image->byte_order = MSBFirst;
+       image->bitmap_bit_order = MSBFirst;
+
+       XInitImage(image);
+       XPutImage(xfi->display, xf_glyph->pixmap, xfi->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy);
+       XFree(image);
+}
+
+void xf_Glyph_Free(rdpContext* context, rdpGlyph* glyph)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       if (((xfGlyph*) glyph)->pixmap != 0)
+               XFreePixmap(xfi->display, ((xfGlyph*) glyph)->pixmap);
+}
+
+void xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y)
+{
+       xfGlyph* xf_glyph;
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       xf_glyph = (xfGlyph*) glyph;
+
+       XSetStipple(xfi->display, xfi->gc, xf_glyph->pixmap);
+       XSetTSOrigin(xfi->display, xfi->gc, x, y);
+       XFillRectangle(xfi->display, xfi->drawing, xfi->gc, x, y, glyph->cx, glyph->cy);
+       XSetStipple(xfi->display, xfi->gc, xfi->bitmap_mono);
+}
+
+void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       bgcolor = (xfi->clrconv->invert)?
+               freerdp_color_convert_var_bgr(bgcolor, xfi->srcBpp, 32, xfi->clrconv):
+               freerdp_color_convert_var_rgb(bgcolor, xfi->srcBpp, 32, xfi->clrconv);
+
+       fgcolor = (xfi->clrconv->invert)?
+               freerdp_color_convert_var_bgr(fgcolor, xfi->srcBpp, 32, xfi->clrconv):
+               freerdp_color_convert_var_rgb(fgcolor, xfi->srcBpp, 32, xfi->clrconv);
+
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XSetForeground(xfi->display, xfi->gc, fgcolor);
+       XFillRectangle(xfi->display, xfi->drawing, xfi->gc, x, y, width, height);
+
+       XSetForeground(xfi->display, xfi->gc, bgcolor);
+       XSetBackground(xfi->display, xfi->gc, fgcolor);
+       XSetFillStyle(xfi->display, xfi->gc, FillStippled);
+}
+
+void xf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
+{
+       xfInfo* xfi = ((xfContext*) context)->xfi;
+
+       if (xfi->drawing == xfi->primary)
+       {
+               if (xfi->remote_app != true)
+               {
+                       XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, x, y, width, height, x, y);
+               }
+
+               gdi_InvalidateRegion(xfi->hdc, x, y, width, height);
+       }
+}
+
+/* Graphics Module */
+
+void xf_register_graphics(rdpGraphics* graphics)
+{
+       rdpBitmap* bitmap;
+       rdpPointer* pointer;
+       rdpGlyph* glyph;
+
+       bitmap = xnew(rdpBitmap);
+       bitmap->size = sizeof(xfBitmap);
+
+       bitmap->New = xf_Bitmap_New;
+       bitmap->Free = xf_Bitmap_Free;
+       bitmap->Paint = xf_Bitmap_Paint;
+       bitmap->Decompress = xf_Bitmap_Decompress;
+       bitmap->SetSurface = xf_Bitmap_SetSurface;
+
+       graphics_register_bitmap(graphics, bitmap);
+       xfree(bitmap);
+
+       pointer = xnew(rdpPointer);
+       pointer->size = sizeof(xfPointer);
+
+       pointer->New = xf_Pointer_New;
+       pointer->Free = xf_Pointer_Free;
+       pointer->Set = xf_Pointer_Set;
+
+       graphics_register_pointer(graphics, pointer);
+       xfree(pointer);
+
+       glyph = xnew(rdpGlyph);
+       glyph->size = sizeof(xfGlyph);
+
+       glyph->New = xf_Glyph_New;
+       glyph->Free = xf_Glyph_Free;
+       glyph->Draw = xf_Glyph_Draw;
+       glyph->BeginDraw = xf_Glyph_BeginDraw;
+       glyph->EndDraw = xf_Glyph_EndDraw;
+
+       graphics_register_glyph(graphics, glyph);
+       xfree(glyph);
+}
diff --git a/client/X11/xf_graphics.h b/client/X11/xf_graphics.h
new file mode 100644 (file)
index 0000000..14216f3
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_GRAPHICS_H
+#define __XF_GRAPHICS_H
+
+#include "xfreerdp.h"
+
+void xf_register_graphics(rdpGraphics* graphics);
+
+#endif /* __XF_GRAPHICS_H */
diff --git a/client/X11/xf_keyboard.c b/client/X11/xf_keyboard.c
new file mode 100644 (file)
index 0000000..020b5e4
--- /dev/null
@@ -0,0 +1,188 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Keyboard Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+
+#include "xf_keyboard.h"
+
+void xf_kbd_init(xfInfo* xfi)
+{
+       memset(xfi->pressed_keys, 0, 256 * sizeof(boolean));
+       xfi->keyboard_layout_id = xfi->instance->settings->kbd_layout;
+       xfi->keyboard_layout_id = freerdp_kbd_init(xfi->display, xfi->keyboard_layout_id);
+       xfi->instance->settings->kbd_layout = xfi->keyboard_layout_id;
+}
+
+void xf_kbd_set_keypress(xfInfo* xfi, uint8 keycode, KeySym keysym)
+{
+       if (keycode >= 8)
+               xfi->pressed_keys[keycode] = keysym;
+       else
+               return;
+}
+
+void xf_kbd_unset_keypress(xfInfo* xfi, uint8 keycode)
+{
+       if (keycode >= 8)
+               xfi->pressed_keys[keycode] = NoSymbol;
+       else
+               return;
+}
+
+boolean xf_kbd_key_pressed(xfInfo* xfi, KeySym keysym)
+{
+       KeyCode keycode = XKeysymToKeycode(xfi->display, keysym);
+       return (xfi->pressed_keys[keycode] == keysym);
+}
+
+void xf_kbd_send_key(xfInfo* xfi, boolean down, uint8 keycode)
+{
+       uint16 flags;
+       uint8 scancode;
+       boolean extended;
+       rdpInput* input;
+
+       input = xfi->instance->input;
+       scancode = freerdp_kbd_get_scancode_by_keycode(keycode, &extended);
+
+       if (scancode == 0)
+       {
+               /* unknown key */
+       }
+       else if ((scancode == 0x46) && extended &&
+                       !xf_kbd_key_pressed(xfi, XK_Control_L) && !xf_kbd_key_pressed(xfi, XK_Control_R))
+       {
+               /* Pause without Ctrl has to be sent as Ctrl + NumLock. */
+               if (down)
+               {
+                       input->KeyboardEvent(input, KBD_FLAGS_DOWN, 0x1D); /* Ctrl down */
+                       input->KeyboardEvent(input, KBD_FLAGS_DOWN, 0x45); /* NumLock down */
+                       input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x1D); /* Ctrl up */
+                       input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x45); /* NumLock up */
+               }
+       }
+       else
+       {
+               flags = (extended) ? KBD_FLAGS_EXTENDED : 0;
+               flags |= (down) ? KBD_FLAGS_DOWN : KBD_FLAGS_RELEASE;
+
+               input->KeyboardEvent(input, flags, scancode);
+
+               if ((scancode == 0x3A) && (down == false)) /* caps lock was released */
+               {
+                       uint32 syncFlags;
+                       syncFlags = xf_kbd_get_toggle_keys_state(xfi);
+                       input->SynchronizeEvent(input, syncFlags);
+               }
+       }
+}
+
+int xf_kbd_read_keyboard_state(xfInfo* xfi)
+{
+       int dummy;
+       Window wdummy;
+       uint32 state = 0;
+
+       if (xfi->remote_app != true)
+       {
+               XQueryPointer(xfi->display, xfi->window->handle,
+                       &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state);
+       }
+
+       return state;
+}
+
+boolean xf_kbd_get_key_state(xfInfo* xfi, int state, int keysym)
+{
+       int offset;
+       int modifierpos, key, keysymMask = 0;
+       KeyCode keycode = XKeysymToKeycode(xfi->display, keysym);
+
+       if (keycode == NoSymbol)
+               return false;
+
+       for (modifierpos = 0; modifierpos < 8; modifierpos++)
+       {
+               offset = xfi->modifier_map->max_keypermod * modifierpos;
+               for (key = 0; key < xfi->modifier_map->max_keypermod; key++)
+               {
+                       if (xfi->modifier_map->modifiermap[offset + key] == keycode)
+                       {
+                               keysymMask |= 1 << modifierpos;
+                       }
+               }
+       }
+
+       return (state & keysymMask) ? true : false;
+}
+
+int xf_kbd_get_toggle_keys_state(xfInfo* xfi)
+{
+       int state;
+       int toggle_keys_state = 0;
+
+       state = xf_kbd_read_keyboard_state(xfi);
+       if (xf_kbd_get_key_state(xfi, state, XK_Scroll_Lock))
+               toggle_keys_state |= KBD_SYNC_SCROLL_LOCK;
+       if (xf_kbd_get_key_state(xfi, state, XK_Num_Lock))
+               toggle_keys_state |= KBD_SYNC_NUM_LOCK;
+       if (xf_kbd_get_key_state(xfi, state, XK_Caps_Lock))
+               toggle_keys_state |= KBD_SYNC_CAPS_LOCK;
+       if (xf_kbd_get_key_state(xfi, state, XK_Kana_Lock))
+               toggle_keys_state |= KBD_SYNC_KANA_LOCK;
+
+       return toggle_keys_state;
+}
+
+void xf_kbd_focus_in(xfInfo* xfi)
+{
+       rdpInput* input;
+       uint32 syncFlags;
+
+       input = xfi->instance->input;
+
+       /* on focus in send a tab up like mstsc.exe */
+       input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x0F);
+
+       /* synchronize toggle keys */
+       syncFlags = xf_kbd_get_toggle_keys_state(xfi);
+       input->SynchronizeEvent(input, syncFlags);
+}
+
+boolean xf_kbd_handle_special_keys(xfInfo* xfi, KeySym keysym)
+{
+       if (keysym == XK_Return)
+       {
+               if ((xf_kbd_key_pressed(xfi, XK_Alt_L) || xf_kbd_key_pressed(xfi, XK_Alt_R))
+                   && (xf_kbd_key_pressed(xfi, XK_Control_L) || xf_kbd_key_pressed(xfi, XK_Control_R)))
+               {
+                       /* Ctrl-Alt-Enter: toggle full screen */
+                       xf_toggle_fullscreen(xfi);
+                       return true;
+               }
+       }
+
+       return false;
+}
+
diff --git a/client/X11/xf_keyboard.h b/client/X11/xf_keyboard.h
new file mode 100644 (file)
index 0000000..92e08fc
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Keyboard Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_KEYBOARD_H
+#define __XF_KEYBOARD_H
+
+#include <freerdp/kbd/kbd.h>
+#include <freerdp/kbd/vkcodes.h>
+
+#include "xfreerdp.h"
+
+void xf_kbd_init(xfInfo* xfi);
+void xf_kbd_set_keypress(xfInfo* xfi, uint8 keycode, KeySym keysym);
+void xf_kbd_unset_keypress(xfInfo* xfi, uint8 keycode);
+boolean xf_kbd_key_pressed(xfInfo* xfi, KeySym keysym);
+void xf_kbd_send_key(xfInfo* xfi, boolean down, uint8 keycode);
+int xf_kbd_read_keyboard_state(xfInfo* xfi);
+boolean xf_kbd_get_key_state(xfInfo* xfi, int state, int keysym);
+int xf_kbd_get_toggle_keys_state(xfInfo* xfi);
+void xf_kbd_focus_in(xfInfo* xfi);
+boolean xf_kbd_handle_special_keys(xfInfo* xfi, KeySym keysym);
+
+#endif /* __XF_KEYBOARD_H */
diff --git a/client/X11/xf_monitor.c b/client/X11/xf_monitor.c
new file mode 100644 (file)
index 0000000..eedf715
--- /dev/null
@@ -0,0 +1,127 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Monitor Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef WITH_XINERAMA
+#include <X11/extensions/Xinerama.h>
+#endif
+
+#include "xf_monitor.h"
+
+/* See MSDN Section on Multiple Display Monitors: http://msdn.microsoft.com/en-us/library/dd145071 */
+
+boolean xf_detect_monitors(xfInfo* xfi, rdpSettings* settings)
+{
+       int i;
+       VIRTUAL_SCREEN* vscreen;
+
+#ifdef WITH_XINERAMA
+       int ignored, ignored2;
+       XineramaScreenInfo* screen_info = NULL;
+#endif
+
+       vscreen = &xfi->vscreen;
+
+       if (xf_GetWorkArea(xfi) != true)
+       {
+               xfi->workArea.x = 0;
+               xfi->workArea.y = 0;
+               xfi->workArea.width = WidthOfScreen(xfi->screen);
+               xfi->workArea.height = HeightOfScreen(xfi->screen);
+       }
+
+       if (settings->fullscreen)
+       {
+               settings->width = WidthOfScreen(xfi->screen);
+               settings->height = HeightOfScreen(xfi->screen); 
+       }
+       else if (settings->workarea)
+       {
+               settings->width = xfi->workArea.width;
+               settings->height = xfi->workArea.height;
+       }
+       else if (settings->percent_screen)
+       {
+               settings->width = (xfi->workArea.width * settings->percent_screen) / 100;
+               settings->height = (xfi->workArea.height * settings->percent_screen) / 100;
+       }
+
+       if (settings->fullscreen != true && settings->workarea != true)
+               return true;
+
+#ifdef WITH_XINERAMA
+       if (XineramaQueryExtension(xfi->display, &ignored, &ignored2))
+       {
+               if (XineramaIsActive(xfi->display))
+               {
+                       screen_info = XineramaQueryScreens(xfi->display, &vscreen->nmonitors);
+
+                       if (vscreen->nmonitors > 16)
+                               vscreen->nmonitors = 0;
+
+                       vscreen->monitors = xzalloc(sizeof(MONITOR_INFO) * vscreen->nmonitors);
+
+                       if (vscreen->nmonitors)
+                       {
+                               for (i = 0; i < vscreen->nmonitors; i++)
+                               {
+                                       vscreen->monitors[i].area.left = screen_info[i].x_org;
+                                       vscreen->monitors[i].area.top = screen_info[i].y_org;
+                                       vscreen->monitors[i].area.right = screen_info[i].x_org + screen_info[i].width - 1;
+                                       vscreen->monitors[i].area.bottom = screen_info[i].y_org + screen_info[i].height - 1;
+
+                                       if ((screen_info[i].x_org == 0) && (screen_info[i].y_org == 0))
+                                               vscreen->monitors[i].primary = true;
+                               }
+                       }
+
+                       XFree(screen_info);
+               }
+       }
+#endif
+
+       settings->num_monitors = vscreen->nmonitors;
+
+       for (i = 0; i < vscreen->nmonitors; i++)
+       {
+               settings->monitors[i].x = vscreen->monitors[i].area.left;
+               settings->monitors[i].y = vscreen->monitors[i].area.top;
+               settings->monitors[i].width = vscreen->monitors[i].area.right - vscreen->monitors[i].area.left + 1;
+               settings->monitors[i].height = vscreen->monitors[i].area.bottom - vscreen->monitors[i].area.top + 1;
+               settings->monitors[i].is_primary = vscreen->monitors[i].primary;
+
+               vscreen->area.left = MIN(vscreen->monitors[i].area.left, vscreen->area.left);
+               vscreen->area.right = MAX(vscreen->monitors[i].area.right, vscreen->area.right);
+               vscreen->area.top = MIN(vscreen->monitors[i].area.top, vscreen->area.top);
+               vscreen->area.bottom = MAX(vscreen->monitors[i].area.bottom, vscreen->area.bottom);
+       }
+
+       if (settings->num_monitors)
+       {
+               settings->width = vscreen->area.right - vscreen->area.left + 1;
+               settings->height = vscreen->area.bottom - vscreen->area.top + 1;
+       }
+
+       return true;
+}
diff --git a/client/X11/xf_monitor.h b/client/X11/xf_monitor.h
new file mode 100644 (file)
index 0000000..d6b7d6d
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Monitor Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_MONITOR_H
+#define __XF_MONITOR_H
+
+#include <freerdp/freerdp.h>
+#include <freerdp/rail/rail.h>
+
+struct _MONITOR_INFO
+{
+       RECTANGLE_16 area;
+       RECTANGLE_16 workarea;
+       boolean primary;
+};
+typedef struct _MONITOR_INFO MONITOR_INFO;
+
+struct _VIRTUAL_SCREEN
+{
+       int nmonitors;
+       RECTANGLE_16 area;
+       RECTANGLE_16 workarea;
+       MONITOR_INFO* monitors;
+};
+typedef struct _VIRTUAL_SCREEN VIRTUAL_SCREEN;
+
+#include "xfreerdp.h"
+
+boolean xf_detect_monitors(xfInfo* xfi, rdpSettings* settings);
+
+#endif /* __XF_MONITOR_H */
diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c
new file mode 100644 (file)
index 0000000..f6f9dc3
--- /dev/null
@@ -0,0 +1,607 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 RAIL
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/rail.h>
+#include <freerdp/rail/rail.h>
+
+#include "xf_window.h"
+#include "xf_rail.h"
+
+void xf_rail_enable_remoteapp_mode(xfInfo* xfi)
+{
+       if (xfi->remote_app == false)
+       {
+               xfi->remote_app = true;
+               xfi->drawable = DefaultRootWindow(xfi->display);
+               xf_DestroyWindow(xfi, xfi->window);
+               xfi->window = NULL;
+       }
+}
+
+void xf_rail_paint(xfInfo* xfi, rdpRail* rail, sint32 uleft, sint32 utop, uint32 uright, uint32 ubottom)
+{
+       xfWindow* xfw;
+       rdpWindow* window;
+       boolean intersect;
+       uint32 iwidth, iheight;
+       sint32 ileft, itop;
+       uint32 iright, ibottom;
+       sint32 wleft, wtop; 
+       uint32 wright, wbottom;
+
+       window_list_rewind(rail->list);
+
+       while (window_list_has_next(rail->list))
+       {
+               window = window_list_get_next(rail->list);
+               xfw = (xfWindow*) window->extra;
+
+                // RDP can have zero width or height windows.  X cannot, so we ignore these.
+
+                if (window->windowWidth == 0 || window->windowHeight == 0)
+                {
+                        continue;
+                }
+
+               wleft = window->windowOffsetX;
+               wtop = window->windowOffsetY;
+               wright = window->windowOffsetX + window->windowWidth - 1;
+               wbottom = window->windowOffsetY + window->windowHeight - 1;
+
+               ileft = MAX(uleft, wleft);
+               itop = MAX(utop, wtop);
+               iright = MIN(uright, wright);
+               ibottom = MIN(ubottom, wbottom);
+
+               iwidth = iright - ileft + 1;
+               iheight = ibottom - itop + 1;
+
+               intersect = ((iright > ileft) && (ibottom > itop)) ? true : false;
+
+               if (intersect)
+               {
+                       xf_UpdateWindowArea(xfi, xfw, ileft - wleft, itop - wtop, iwidth, iheight);
+               }
+       }
+}
+
+void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+
+       xf_rail_enable_remoteapp_mode(xfi);
+
+       xfw = xf_CreateWindow((xfInfo*) rail->extra, window,
+                       window->windowOffsetX, window->windowOffsetY,
+                       window->windowWidth, window->windowHeight,
+                       window->windowId);
+
+       xf_SetWindowStyle(xfi, xfw, window->style, window->extendedStyle);
+
+       XStoreName(xfi->display, xfw->handle, window->title);
+
+       window->extra = (void*) xfw;
+       window->extraId = (void*) xfw->handle;
+}
+
+void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+       xfw = (xfWindow*) window->extra;
+
+       // Do nothing if window is already in the correct position
+        if ( xfw->left == window->windowOffsetX && 
+               xfw->top == window->windowOffsetY && 
+                xfw->width == window->windowWidth && 
+                xfw->height == window->windowHeight)
+        {
+               return;
+       }
+
+       xf_MoveWindow((xfInfo*) rail->extra, xfw,
+                       window->windowOffsetX, window->windowOffsetY,
+                       window->windowWidth, window->windowHeight);
+}
+
+void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+       xfw = (xfWindow*) window->extra;
+
+       xf_ShowWindow((xfInfo*) rail->extra, xfw, state);
+}
+
+void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+       xfw = (xfWindow*) window->extra;
+
+       XStoreName(xfi->display, xfw->handle, window->title);
+}
+
+void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+       xfw = (xfWindow*) window->extra;
+
+       icon->extra = freerdp_icon_convert(icon->entry->bitsColor, NULL, icon->entry->bitsMask,
+                       icon->entry->width, icon->entry->height, icon->entry->bpp, rail->clrconv);
+
+       xf_SetWindowIcon(xfi, xfw, icon);
+}
+
+void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+       xfw = (xfWindow*) window->extra;
+
+       xf_SetWindowRects(xfi, xfw, window->windowRects, window->numWindowRects);
+}
+
+void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window)
+{
+       xfInfo* xfi;
+       xfWindow* xfw;
+
+       xfi = (xfInfo*) rail->extra;
+       xfw = (xfWindow*) window->extra;
+
+       xf_SetWindowVisibilityRects(xfi, xfw, window->windowRects, window->numWindowRects);
+}
+
+void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window)
+{
+       xfWindow* xfw;
+       xfw = (xfWindow*) window->extra;
+       xf_DestroyWindow((xfInfo*) rail->extra, xfw);
+}
+
+void xf_rail_register_callbacks(xfInfo* xfi, rdpRail* rail)
+{
+       rail->extra = (void*) xfi;
+       rail->rail_CreateWindow = xf_rail_CreateWindow;
+       rail->rail_MoveWindow = xf_rail_MoveWindow;
+       rail->rail_ShowWindow = xf_rail_ShowWindow;
+       rail->rail_SetWindowText = xf_rail_SetWindowText;
+       rail->rail_SetWindowIcon = xf_rail_SetWindowIcon;
+       rail->rail_SetWindowRects = xf_rail_SetWindowRects;
+       rail->rail_SetWindowVisibilityRects = xf_rail_SetWindowVisibilityRects;
+       rail->rail_DestroyWindow = xf_rail_DestroyWindow;
+}
+
+static void xf_on_free_rail_client_event(RDP_EVENT* event)
+{
+       if (event->event_class == RDP_EVENT_CLASS_RAIL)
+       {
+               rail_free_cloned_order(event->event_type, event->user_data);
+       }
+}
+
+static void xf_send_rail_client_event(rdpChannels* channels, uint16 event_type, void* param)
+{
+       RDP_EVENT* out_event = NULL;
+       void * payload = NULL;
+
+       payload = rail_clone_order(event_type, param);
+       if (payload != NULL)
+       {
+               out_event = freerdp_event_new(RDP_EVENT_CLASS_RAIL, event_type,
+                       xf_on_free_rail_client_event, payload);
+               freerdp_channels_send_event(channels, out_event);
+       }
+}
+
+void xf_rail_send_activate(xfInfo* xfi, Window xwindow, boolean enabled)
+{
+       rdpRail* rail;
+       rdpChannels* channels;
+       rdpWindow* rail_window;
+       RAIL_ACTIVATE_ORDER activate;
+
+       rail = xfi->_context->rail;
+       channels = xfi->_context->channels;
+
+       rail_window = window_list_get_by_extra_id(rail->list, (void*) xwindow);
+
+       if (rail_window == NULL)
+               return;
+
+       activate.windowId = rail_window->windowId;
+       activate.enabled = enabled;
+
+       xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE, &activate);
+}
+
+void xf_rail_send_client_system_command(xfInfo* xfi, uint32 windowId, uint16 command)
+{
+       rdpChannels* channels;
+       RAIL_SYSCOMMAND_ORDER syscommand;
+
+       channels = xfi->_context->channels;
+
+       syscommand.windowId = windowId;
+       syscommand.command = command;
+
+       xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND, &syscommand);
+}
+
+/**
+ * The position of the X window can become out of sync with the RDP window
+ * if the X window is moved locally by the window manager.  In this event
+ * send an update to the RDP server informing it of the new window position
+ * and size.
+ */
+void xf_rail_adjust_position(xfInfo* xfi, rdpWindow *window)
+{
+       xfWindow* xfw;
+       rdpChannels* channels;
+       RAIL_WINDOW_MOVE_ORDER window_move;
+
+       xfw = (xfWindow*) window->extra;
+       channels = xfi->_context->channels;
+
+       if (! xfw->is_mapped || xfw->local_move.state != LMS_NOT_ACTIVE)
+               return;
+
+       // If current window position disagrees with RDP window position, send
+       // update to RDP server
+       if ( xfw->left != window->windowOffsetX ||
+               xfw->top != window->windowOffsetY ||
+                xfw->width != window->windowWidth ||
+                xfw->height != window->windowHeight)
+        {
+               window_move.windowId = window->windowId;
+               window_move.left = xfw->left;
+               window_move.top = xfw->top;
+               window_move.right = xfw->right;
+               window_move.bottom = xfw->bottom;
+
+               DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%u h=%u"
+                       "  RDP=0x%X rc={l=%d t=%d} w=%d h=%d",
+                       (uint32) xfw->handle, xfw->left, xfw->top, 
+                       xfw->right, xfw->bottom, xfw->width, xfw->height,
+                       window->windowId,
+                       window->windowOffsetX, window->windowOffsetY, 
+                       window->windowWidth, window->windowHeight);
+
+               xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &window_move);
+        }
+}
+
+void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window)
+{
+       xfWindow* xfw;
+       rdpChannels* channels;
+       RAIL_WINDOW_MOVE_ORDER window_move;
+       int x,y;
+       rdpInput* input = xfi->instance->input;
+
+       xfw = (xfWindow*) window->extra;
+       channels = xfi->_context->channels;
+
+       // Send RDP client event to inform RDP server
+
+       window_move.windowId = window->windowId;
+       window_move.left = xfw->left;
+       window_move.top = xfw->top;
+       window_move.right = xfw->right + 1;   // In the update to RDP the position is one past the window
+       window_move.bottom = xfw->bottom + 1;
+
+       DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d",
+               (uint32) xfw->handle, 
+               xfw->left, xfw->top, xfw->right, xfw->bottom,
+               xfw->width, xfw->height);
+
+       xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &window_move);
+
+       // Send synthetic button up event to the RDP server.  This is per the RDP spec to
+       // indicate a local move has finished.
+
+       x = xfw->left + xfw->local_move.window_x;
+       y = xfw->top + xfw->local_move.window_y;
+        input->MouseEvent(input, PTR_FLAGS_BUTTON1, x, y);
+
+       // Proactively update the RAIL window dimensions.  There is a race condition where
+       // we can start to receive GDI orders for the new window dimensions before we 
+       // receive the RAIL ORDER for the new window size.  This avoids that race condition.
+
+       window->windowOffsetX = xfw->left;
+       window->windowOffsetY = xfw->top;
+       window->windowWidth = xfw->width;
+       window->windowHeight = xfw->height;
+
+       xfw->local_move.state = LMS_TERMINATING;
+}
+
+void xf_process_rail_get_sysparams_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       RAIL_SYSPARAM_ORDER* sysparam;
+
+       sysparam = (RAIL_SYSPARAM_ORDER*) event->user_data;
+
+       sysparam->workArea.left = xfi->workArea.x;
+       sysparam->workArea.top = xfi->workArea.y;
+       sysparam->workArea.right = xfi->workArea.x + xfi->workArea.width;
+       sysparam->workArea.bottom = xfi->workArea.y + xfi->workArea.height;
+
+       sysparam->taskbarPos.left = 0;
+       sysparam->taskbarPos.top = 0;
+       sysparam->taskbarPos.right = 0;
+       sysparam->taskbarPos.bottom = 0;
+
+       sysparam->dragFullWindows = false;
+
+       xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS, sysparam);
+}
+
+const char* error_code_names[] =
+{
+               "RAIL_EXEC_S_OK",
+               "RAIL_EXEC_E_HOOK_NOT_LOADED",
+               "RAIL_EXEC_E_DECODE_FAILED",
+               "RAIL_EXEC_E_NOT_IN_ALLOWLIST",
+               "RAIL_EXEC_E_FILE_NOT_FOUND",
+               "RAIL_EXEC_E_FAIL",
+               "RAIL_EXEC_E_SESSION_LOCKED"
+};
+
+void xf_process_rail_exec_result_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       RAIL_EXEC_RESULT_ORDER* exec_result;
+
+       exec_result = (RAIL_EXEC_RESULT_ORDER*) event->user_data;
+
+       if (exec_result->execResult != RAIL_EXEC_S_OK)
+       {
+               printf("RAIL exec error: execResult=%s NtError=0x%X\n",
+                       error_code_names[exec_result->execResult], exec_result->rawResult);
+               xfi->disconnect = True;
+       }
+       else
+       {
+               xf_rail_enable_remoteapp_mode(xfi);
+       }
+}
+
+void xf_process_rail_server_sysparam_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       RAIL_SYSPARAM_ORDER* sysparam = (RAIL_SYSPARAM_ORDER*) event->user_data;
+
+       switch (sysparam->param)
+       {
+               case SPI_SET_SCREEN_SAVE_ACTIVE:
+                       break;
+
+               case SPI_SET_SCREEN_SAVE_SECURE:
+                       break;
+       }
+}
+
+void xf_process_rail_server_minmaxinfo_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       rdpRail* rail;
+       rdpWindow* rail_window = NULL;
+       RAIL_MINMAXINFO_ORDER* minmax = (RAIL_MINMAXINFO_ORDER*) event->user_data;
+
+       rail = ((rdpContext*) xfi->context)->rail;
+       rail_window = window_list_get_by_id(rail->list, minmax->windowId);
+
+       if (rail_window != NULL)
+       {
+               xfWindow * window = NULL;
+               window = (xfWindow *) rail_window->extra;
+
+               DEBUG_X11_LMS("windowId=0x%X maxWidth=%d maxHeight=%d maxPosX=%d maxPosY=%d "
+                       "minTrackWidth=%d minTrackHeight=%d maxTrackWidth=%d maxTrackHeight=%d",
+                       minmax->windowId, minmax->maxWidth, minmax->maxHeight,
+                       (sint16)minmax->maxPosX, (sint16)minmax->maxPosY,
+                       minmax->minTrackWidth, minmax->minTrackHeight,
+                       minmax->maxTrackWidth, minmax->maxTrackHeight);
+
+               xf_SetWindowMinMaxInfo(xfi, window, minmax->maxWidth, minmax->maxHeight, minmax->maxPosX, minmax->maxPosY,
+                       minmax->minTrackWidth, minmax->minTrackHeight, minmax->maxTrackWidth, minmax->maxTrackHeight);
+       }
+}
+
+const char* movetype_names[] =
+{
+       "(invalid)",
+       "RAIL_WMSZ_LEFT",
+       "RAIL_WMSZ_RIGHT",
+       "RAIL_WMSZ_TOP",
+       "RAIL_WMSZ_TOPLEFT",
+       "RAIL_WMSZ_TOPRIGHT",
+       "RAIL_WMSZ_BOTTOM",
+       "RAIL_WMSZ_BOTTOMLEFT",
+       "RAIL_WMSZ_BOTTOMRIGHT",
+       "RAIL_WMSZ_MOVE",
+       "RAIL_WMSZ_KEYMOVE",
+       "RAIL_WMSZ_KEYSIZE"
+};
+
+void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       rdpRail* rail;
+       rdpWindow* rail_window = NULL;
+       RAIL_LOCALMOVESIZE_ORDER* movesize = (RAIL_LOCALMOVESIZE_ORDER*) event->user_data;
+       int direction = 0;
+       Window child_window;
+       int x,y;
+
+       rail = ((rdpContext*) xfi->context)->rail;
+       rail_window = window_list_get_by_id(rail->list, movesize->windowId);
+
+       if (rail_window != NULL)
+       {
+               xfWindow* xfw = NULL;
+               xfw = (xfWindow*) rail_window->extra;
+
+               DEBUG_X11_LMS("windowId=0x%X isMoveSizeStart=%d moveSizeType=%s PosX=%d PosY=%d",
+                       movesize->windowId, movesize->isMoveSizeStart,
+                       movetype_names[movesize->moveSizeType], (sint16) movesize->posX, (sint16) movesize->posY);
+
+               switch (movesize->moveSizeType)
+               {
+                       case RAIL_WMSZ_LEFT: //0x1
+                               direction = _NET_WM_MOVERESIZE_SIZE_LEFT;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_RIGHT: //0x2
+                               direction = _NET_WM_MOVERESIZE_SIZE_RIGHT;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_TOP: //0x3
+                               direction = _NET_WM_MOVERESIZE_SIZE_TOP;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_TOPLEFT: //0x4
+                               direction = _NET_WM_MOVERESIZE_SIZE_TOPLEFT;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_TOPRIGHT: //0x5
+                               direction = _NET_WM_MOVERESIZE_SIZE_TOPRIGHT;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_BOTTOM: //0x6
+                               direction = _NET_WM_MOVERESIZE_SIZE_BOTTOM;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_BOTTOMLEFT: //0x7
+                               direction = _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_BOTTOMRIGHT: //0x8
+                               direction = _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_MOVE: //0x9
+                               direction = _NET_WM_MOVERESIZE_MOVE;
+                               XTranslateCoordinates(xfi->display, xfw->handle, 
+                                       RootWindowOfScreen(xfi->screen), 
+                                       movesize->posX, movesize->posY, &x, &y, &child_window);
+                               break;
+                       case RAIL_WMSZ_KEYMOVE: //0xA
+                               direction = _NET_WM_MOVERESIZE_MOVE_KEYBOARD;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+                       case RAIL_WMSZ_KEYSIZE: //0xB
+                               direction = _NET_WM_MOVERESIZE_SIZE_KEYBOARD;
+                               x = movesize->posX;
+                               y = movesize->posY;
+                               break;
+               }
+
+               if (movesize->isMoveSizeStart)
+               {
+                       xf_StartLocalMoveSize(xfi, xfw, direction, x, y);
+               } else {
+                       xf_EndLocalMoveSize(xfi, xfw);
+               }
+       }
+}
+
+void xf_process_rail_appid_resp_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       RAIL_GET_APPID_RESP_ORDER* appid_resp =
+               (RAIL_GET_APPID_RESP_ORDER*)event->user_data;
+
+       printf("Server Application ID Response PDU: windowId=0x%X "
+               "applicationId=(length=%d dump)\n",
+               appid_resp->windowId, appid_resp->applicationId.length);
+
+       freerdp_hexdump(appid_resp->applicationId.string, appid_resp->applicationId.length);
+}
+
+void xf_process_rail_langbarinfo_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       RAIL_LANGBAR_INFO_ORDER* langbar =
+               (RAIL_LANGBAR_INFO_ORDER*) event->user_data;
+
+       printf("Language Bar Information PDU: languageBarStatus=0x%X\n",
+               langbar->languageBarStatus);
+}
+
+void xf_process_rail_event(xfInfo* xfi, rdpChannels* channels, RDP_EVENT* event)
+{
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS:
+                       xf_process_rail_get_sysparams_event(xfi, channels, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS:
+                       xf_process_rail_exec_result_event(xfi, channels, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM:
+                       xf_process_rail_server_sysparam_event(xfi, channels, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO:
+                       xf_process_rail_server_minmaxinfo_event(xfi, channels, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE:
+                       xf_process_rail_server_localmovesize_event(xfi, channels, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP:
+                       xf_process_rail_appid_resp_event(xfi, channels, event);
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO:
+                       xf_process_rail_langbarinfo_event(xfi, channels, event);
+                       break;
+
+               default:
+                       break;
+       }
+}
diff --git a/client/X11/xf_rail.h b/client/X11/xf_rail.h
new file mode 100644 (file)
index 0000000..0c66e1c
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 RAIL
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_RAIL_H
+#define __XF_RAIL_H
+
+#include "xfreerdp.h"
+
+void xf_rail_paint(xfInfo* xfi, rdpRail* rail, sint32 uleft, sint32 utop, uint32 uright, uint32 ubottom);
+void xf_rail_register_callbacks(xfInfo* xfi, rdpRail* rail);
+void xf_rail_send_client_system_command(xfInfo* xfi, uint32 windowId, uint16 command);
+void xf_rail_send_activate(xfInfo* xfi, Window xwindow, boolean enabled);
+void xf_process_rail_event(xfInfo* xfi, rdpChannels* chanman, RDP_EVENT* event);
+void xf_rail_adjust_position(xfInfo* xfi, rdpWindow *window);
+void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window);
+
+#endif /* __XF_RAIL_H */
diff --git a/client/X11/xf_tsmf.c b/client/X11/xf_tsmf.c
new file mode 100644 (file)
index 0000000..8d16d5e
--- /dev/null
@@ -0,0 +1,370 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Video Redirection
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XShm.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/plugins/tsmf.h>
+
+#include "xf_tsmf.h"
+
+#ifdef WITH_XV
+
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/Xvlib.h>
+
+typedef struct xf_xv_context xfXvContext;
+
+struct xf_xv_context
+{
+       long xv_port;
+       Atom xv_colorkey_atom;
+       int xv_image_size;
+       int xv_shmid;
+       char* xv_shmaddr;
+       uint32* xv_pixfmts;
+};
+
+#ifdef WITH_DEBUG_XV
+#define DEBUG_XV(fmt, ...) DEBUG_CLASS(XV, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_XV(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+void xf_tsmf_init(xfInfo* xfi, long xv_port)
+{
+       int ret;
+       unsigned int i;
+       unsigned int version;
+       unsigned int release;
+       unsigned int event_base;
+       unsigned int error_base;
+       unsigned int request_base;
+       unsigned int num_adaptors;
+       xfXvContext* xv;
+       XvAdaptorInfo* ai;
+       XvAttribute* attr;
+       XvImageFormatValues* fo;
+
+       xv = xnew(xfXvContext);
+       xfi->xv_context = xv;
+
+       xv->xv_colorkey_atom = None;
+       xv->xv_image_size = 0;
+       xv->xv_port = xv_port;
+
+       if (!XShmQueryExtension(xfi->display))
+       {
+               DEBUG_XV("no shmem available.");
+               return;
+       }
+
+       ret = XvQueryExtension(xfi->display, &version, &release, &request_base, &event_base, &error_base);
+       if (ret != Success)
+       {
+               DEBUG_XV("XvQueryExtension failed %d.", ret);
+               return;
+       }
+       DEBUG_XV("version %u release %u", version, release);
+
+       ret = XvQueryAdaptors(xfi->display, DefaultRootWindow(xfi->display),
+               &num_adaptors, &ai);
+       if (ret != Success)
+       {
+               DEBUG_XV("XvQueryAdaptors failed %d.", ret);
+               return;
+       }
+
+       for (i = 0; i < num_adaptors; i++)
+       {
+               DEBUG_XV("adapter port %ld-%ld (%s)", ai[i].base_id,
+                       ai[i].base_id + ai[i].num_ports - 1, ai[i].name);
+               if (xv->xv_port == 0 && i == num_adaptors - 1)
+                       xv->xv_port = ai[i].base_id;
+       }
+
+       if (num_adaptors > 0)
+               XvFreeAdaptorInfo(ai);
+
+       if (xv->xv_port == 0)
+       {
+               DEBUG_XV("no adapter selected, video frames will not be processed.");
+               return;
+       }
+       DEBUG_XV("selected %ld", xv->xv_port);
+
+       attr = XvQueryPortAttributes(xfi->display, xv->xv_port, &ret);
+       for (i = 0; i < (unsigned int)ret; i++)
+       {
+               if (strcmp(attr[i].name, "XV_COLORKEY") == 0)
+               {
+                       xv->xv_colorkey_atom = XInternAtom(xfi->display, "XV_COLORKEY", false);
+                       XvSetPortAttribute(xfi->display, xv->xv_port, xv->xv_colorkey_atom, attr[i].min_value + 1);
+                       break;
+               }
+       }
+       XFree(attr);
+
+#ifdef WITH_DEBUG_XV
+       printf("xf_tsmf_init: pixel format ");
+#endif
+       fo = XvListImageFormats(xfi->display, xv->xv_port, &ret);
+       if (ret > 0)
+       {
+               xv->xv_pixfmts = (uint32*) xzalloc((ret + 1) * sizeof(uint32));
+               for (i = 0; i < ret; i++)
+               {
+                       xv->xv_pixfmts[i] = fo[i].id;
+#ifdef WITH_DEBUG_XV
+                       printf("%c%c%c%c ", ((char*)(xv->xv_pixfmts + i))[0], ((char*)(xv->xv_pixfmts + i))[1],
+                               ((char*)(xv->xv_pixfmts + i))[2], ((char*)(xv->xv_pixfmts + i))[3]);
+#endif
+               }
+               xv->xv_pixfmts[i] = 0;
+       }
+       XFree(fo);
+#ifdef WITH_DEBUG_XV
+       printf("\n");
+#endif
+}
+
+void xf_tsmf_uninit(xfInfo* xfi)
+{
+       xfXvContext* xv = (xfXvContext*) xfi->xv_context;
+
+       if (xv)
+       {
+               if (xv->xv_image_size > 0)
+               {
+                       shmdt(xv->xv_shmaddr);
+                       shmctl(xv->xv_shmid, IPC_RMID, NULL);
+               }
+               if (xv->xv_pixfmts)
+               {
+                       xfree(xv->xv_pixfmts);
+                       xv->xv_pixfmts = NULL;
+               }
+               xfree(xv);
+               xfi->xv_context = NULL;
+       }
+}
+
+static boolean
+xf_tsmf_is_format_supported(xfXvContext* xv, uint32 pixfmt)
+{
+       int i;
+
+       if (!xv->xv_pixfmts)
+               return false;
+
+       for (i = 0; xv->xv_pixfmts[i]; i++)
+       {
+               if (xv->xv_pixfmts[i] == pixfmt)
+                       return true;
+       }
+
+       return false;
+}
+
+static void xf_process_tsmf_video_frame_event(xfInfo* xfi, RDP_VIDEO_FRAME_EVENT* vevent)
+{
+       int i;
+       uint8* data1;
+       uint8* data2;
+       uint32 pixfmt;
+       XvImage * image;
+       int colorkey = 0;
+       XShmSegmentInfo shminfo;
+       xfXvContext* xv = (xfXvContext*) xfi->xv_context;
+
+       if (xv->xv_port == 0)
+               return;
+
+       /* In case the player is minimized */
+       if (vevent->x < -2048 || vevent->y < -2048 || vevent->num_visible_rects <= 0)
+               return;
+
+       if (xv->xv_colorkey_atom != None)
+       {
+               XvGetPortAttribute(xfi->display, xv->xv_port, xv->xv_colorkey_atom, &colorkey);
+               XSetFunction(xfi->display, xfi->gc, GXcopy);
+               XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+               XSetForeground(xfi->display, xfi->gc, colorkey);
+               for (i = 0; i < vevent->num_visible_rects; i++)
+               {
+                       XFillRectangle(xfi->display, xfi->window->handle, xfi->gc,
+                               vevent->x + vevent->visible_rects[i].x,
+                               vevent->y + vevent->visible_rects[i].y,
+                               vevent->visible_rects[i].width,
+                               vevent->visible_rects[i].height);
+               }
+       }
+
+       pixfmt = vevent->frame_pixfmt;
+       image = XvShmCreateImage(xfi->display, xv->xv_port,
+               pixfmt, 0, vevent->frame_width, vevent->frame_height, &shminfo);
+       if (xv->xv_image_size != image->data_size)
+       {
+               if (xv->xv_image_size > 0)
+               {
+                       shmdt(xv->xv_shmaddr);
+                       shmctl(xv->xv_shmid, IPC_RMID, NULL);
+               }
+               xv->xv_image_size = image->data_size;
+               xv->xv_shmid = shmget(IPC_PRIVATE, image->data_size, IPC_CREAT | 0777);
+               xv->xv_shmaddr = shmat(xv->xv_shmid, 0, 0);
+       }
+       shminfo.shmid = xv->xv_shmid;
+       shminfo.shmaddr = image->data = xv->xv_shmaddr;
+       shminfo.readOnly = false;
+
+       if (!XShmAttach(xfi->display, &shminfo))
+       {
+               XFree(image);
+               DEBUG_XV("XShmAttach failed.");
+               return;
+       }
+
+       /* The video driver may align each line to a different size
+          and we need to convert our original image data. */
+       switch (pixfmt)
+       {
+               case RDP_PIXFMT_I420:
+               case RDP_PIXFMT_YV12:
+                       if (!xf_tsmf_is_format_supported(xv, RDP_PIXFMT_I420) &&
+                               !xf_tsmf_is_format_supported(xv, RDP_PIXFMT_YV12))
+                       {
+                               DEBUG_XV("pixel format 0x%X not supported by hardware.", pixfmt);
+                               break;
+                       }
+                       /* Y */
+                       if (image->pitches[0] == vevent->frame_width)
+                       {
+                               memcpy(image->data + image->offsets[0],
+                                       vevent->frame_data,
+                                       vevent->frame_width * vevent->frame_height);
+                       }
+                       else
+                       {
+                               for (i = 0; i < vevent->frame_height; i++)
+                               {
+                                       memcpy(image->data + image->offsets[0] + i * image->pitches[0],
+                                               vevent->frame_data + i * vevent->frame_width,
+                                               vevent->frame_width);
+                               }
+                       }
+                       /* UV */
+                       /* Conversion between I420 and YV12 is to simply swap U and V */
+                       if (xf_tsmf_is_format_supported(xv, pixfmt))
+                       {
+                               data1 = vevent->frame_data + vevent->frame_width * vevent->frame_height;
+                               data2 = vevent->frame_data + vevent->frame_width * vevent->frame_height +
+                                       vevent->frame_width * vevent->frame_height / 4;
+                       }
+                       else
+                       {
+                               data2 = vevent->frame_data + vevent->frame_width * vevent->frame_height;
+                               data1 = vevent->frame_data + vevent->frame_width * vevent->frame_height +
+                                       vevent->frame_width * vevent->frame_height / 4;
+                               image->id = pixfmt == RDP_PIXFMT_I420 ? RDP_PIXFMT_YV12 : RDP_PIXFMT_I420;
+                       }
+                       if (image->pitches[1] * 2 == vevent->frame_width)
+                       {
+                               memcpy(image->data + image->offsets[1],
+                                       data1,
+                                       vevent->frame_width * vevent->frame_height / 4);
+                               memcpy(image->data + image->offsets[2],
+                                       data2,
+                                       vevent->frame_width * vevent->frame_height / 4);
+                       }
+                       else
+                       {
+                               for (i = 0; i < vevent->frame_height / 2; i++)
+                               {
+                                       memcpy(image->data + image->offsets[1] + i * image->pitches[1],
+                                               data1 + i * vevent->frame_width / 2,
+                                               vevent->frame_width / 2);
+                                       memcpy(image->data + image->offsets[2] + i * image->pitches[2],
+                                               data2 + i * vevent->frame_width / 2,
+                                               vevent->frame_width / 2);
+                               }
+                       }
+                       break;
+
+               default:
+                       memcpy(image->data, vevent->frame_data, image->data_size <= vevent->frame_size ?
+                               image->data_size : vevent->frame_size);
+                       break;
+       }
+
+       XvShmPutImage(xfi->display, xv->xv_port, xfi->window->handle, xfi->gc, image,
+               0, 0, image->width, image->height,
+               vevent->x, vevent->y, vevent->width, vevent->height, false);
+       XSync(xfi->display, false);
+
+       XShmDetach(xfi->display, &shminfo);
+       XFree(image);
+}
+
+static void xf_process_tsmf_redraw_event(xfInfo* xfi, RDP_REDRAW_EVENT* revent)
+{
+       XSetFunction(xfi->display, xfi->gc, GXcopy);
+       XSetFillStyle(xfi->display, xfi->gc, FillSolid);
+       XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc,
+               revent->x, revent->y, revent->width, revent->height, revent->x, revent->y);
+}
+
+void xf_process_tsmf_event(xfInfo* xfi, RDP_EVENT* event)
+{
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_TSMF_VIDEO_FRAME:
+                       xf_process_tsmf_video_frame_event(xfi, (RDP_VIDEO_FRAME_EVENT*) event);
+                       break;
+
+               case RDP_EVENT_TYPE_TSMF_REDRAW:
+                       xf_process_tsmf_redraw_event(xfi, (RDP_REDRAW_EVENT*) event);
+                       break;
+
+       }
+}
+
+#else /* WITH_XV */
+
+void xf_tsmf_init(xfInfo* xfi, long xv_port)
+{
+}
+
+void xf_tsmf_uninit(xfInfo* xfi)
+{
+}
+
+void xf_process_tsmf_event(xfInfo* xfi, RDP_EVENT* event)
+{
+}
+
+#endif /* WITH_XV */
diff --git a/client/X11/xf_tsmf.h b/client/X11/xf_tsmf.h
new file mode 100644 (file)
index 0000000..09083e2
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Video Redirection
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_TSMF_H
+#define __XF_TSMF_H
+
+#include "xfreerdp.h"
+
+void xf_tsmf_init(xfInfo* xfi, long xv_port);
+void xf_tsmf_uninit(xfInfo* xfi);
+void xf_process_tsmf_event(xfInfo* xfi, RDP_EVENT* event);
+
+#endif /* __XF_TSMF_H */
diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c
new file mode 100644 (file)
index 0000000..a159c6b
--- /dev/null
@@ -0,0 +1,751 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Windows
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdarg.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+
+#include <freerdp/rail.h>
+#include <freerdp/utils/rail.h>
+
+#ifdef WITH_XEXT
+#include <X11/extensions/shape.h>
+#endif
+
+#include "FreeRDP_Icon_256px.h"
+#define xf_icon_prop FreeRDP_Icon_256px_prop
+
+#include "xf_window.h"
+
+/* Extended Window Manager Hints: http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html */
+
+/* bit definitions for MwmHints.flags */
+#define MWM_HINTS_FUNCTIONS     (1L << 0)
+#define MWM_HINTS_DECORATIONS   (1L << 1)
+#define MWM_HINTS_INPUT_MODE    (1L << 2)
+#define MWM_HINTS_STATUS        (1L << 3)
+
+/* bit definitions for MwmHints.functions */
+#define MWM_FUNC_ALL            (1L << 0)
+#define MWM_FUNC_RESIZE         (1L << 1)
+#define MWM_FUNC_MOVE           (1L << 2)
+#define MWM_FUNC_MINIMIZE       (1L << 3)
+#define MWM_FUNC_MAXIMIZE       (1L << 4)
+#define MWM_FUNC_CLOSE          (1L << 5)
+
+/* bit definitions for MwmHints.decorations */
+#define MWM_DECOR_ALL           (1L << 0)
+#define MWM_DECOR_BORDER        (1L << 1)
+#define MWM_DECOR_RESIZEH       (1L << 2)
+#define MWM_DECOR_TITLE         (1L << 3)
+#define MWM_DECOR_MENU          (1L << 4)
+#define MWM_DECOR_MINIMIZE      (1L << 5)
+#define MWM_DECOR_MAXIMIZE      (1L << 6)
+
+#define PROP_MOTIF_WM_HINTS_ELEMENTS   5
+
+struct _PropMotifWmHints
+{
+       unsigned long flags;
+       unsigned long functions;
+       unsigned long decorations;
+       long inputMode;
+       unsigned long status;
+};
+typedef struct _PropMotifWmHints PropMotifWmHints;
+
+/**
+ * Post an event from the client to the X server
+ */
+void xf_SendClientEvent(xfInfo *xfi, xfWindow* window, Atom atom, unsigned int numArgs, ...)
+{
+       XEvent xevent;
+       unsigned int i;
+       va_list argp;
+
+       va_start(argp, numArgs);
+
+       xevent.xclient.type = ClientMessage;
+       xevent.xclient.serial = 0;
+       xevent.xclient.send_event = False;
+       xevent.xclient.display = xfi->display;
+       xevent.xclient.window = window->handle;
+       xevent.xclient.message_type = atom;
+       xevent.xclient.format = 32;
+
+       for (i=0; i<numArgs; i++)
+       {
+               xevent.xclient.data.l[i] = va_arg(argp, int);
+       }
+
+       DEBUG_X11("Send ClientMessage Event: wnd=0x%04X", (unsigned int) xevent.xclient.window);
+       XSendEvent(xfi->display, RootWindowOfScreen(xfi->screen), False, 
+               SubstructureRedirectMask | SubstructureNotifyMask, &xevent);
+       XSync(xfi->display, False);
+
+       va_end(argp);
+}
+
+void xf_SetWindowFullscreen(xfInfo* xfi, xfWindow* window, boolean fullscreen)
+{
+       if (fullscreen)
+       {
+               xf_SetWindowDecorations(xfi, window, false);
+
+                XMoveResizeWindow(xfi->display, window->handle, 0, 0, window->width, window->height);
+                XMapRaised(xfi->display, window->handle);
+
+               window->fullscreen = true;
+       }
+}
+
+/* http://tronche.com/gui/x/xlib/window-information/XGetWindowProperty.html */
+
+boolean xf_GetWindowProperty(xfInfo* xfi, Window window, Atom property, int length,
+               unsigned long* nitems, unsigned long* bytes, uint8** prop)
+{
+       int status;
+       Atom actual_type;
+       int actual_format;
+
+       if (property == None)
+               return false;
+
+       status = XGetWindowProperty(xfi->display, window,
+                       property, 0, length, false, AnyPropertyType,
+                       &actual_type, &actual_format, nitems, bytes, prop);
+
+       if (status != Success)
+               return false;
+
+       if (actual_type == None)
+       {
+               DEBUG_WARN("Property %lu does not exist", property);
+               return false;
+       }
+
+       return true;
+}
+
+boolean xf_GetCurrentDesktop(xfInfo* xfi)
+{
+       boolean status;
+       unsigned long nitems;
+       unsigned long bytes;
+       unsigned char* prop;
+
+       status = xf_GetWindowProperty(xfi, DefaultRootWindow(xfi->display),
+                       xfi->_NET_CURRENT_DESKTOP, 1, &nitems, &bytes, &prop);
+
+       if (status != true) {
+               return false;
+       }
+
+       xfi->current_desktop = (int) *prop;
+       xfree(prop);
+
+       return true;
+}
+
+boolean xf_GetWorkArea(xfInfo* xfi)
+{
+       long* plong;
+       boolean status;
+       unsigned long nitems;
+       unsigned long bytes;
+       unsigned char* prop;
+
+       status = xf_GetCurrentDesktop(xfi);
+
+       if (status != true)
+               return false;
+
+       status = xf_GetWindowProperty(xfi, DefaultRootWindow(xfi->display),
+                       xfi->_NET_WORKAREA, 32 * 4, &nitems, &bytes, &prop);
+
+       if (status != true)
+               return false;
+
+       if ((xfi->current_desktop * 4 + 3) >= nitems) {
+               xfree(prop);
+               return false;
+       }
+
+       plong = (long*) prop;
+
+       xfi->workArea.x = plong[xfi->current_desktop * 4 + 0];
+       xfi->workArea.y = plong[xfi->current_desktop * 4 + 1];
+       xfi->workArea.width = plong[xfi->current_desktop * 4 + 2];
+       xfi->workArea.height = plong[xfi->current_desktop * 4 + 3];
+       xfree(prop);
+
+       return true;
+}
+
+void xf_SetWindowDecorations(xfInfo* xfi, xfWindow* window, boolean show)
+{
+       PropMotifWmHints hints;
+
+       hints.decorations = (show) ? MWM_DECOR_ALL : 0;
+       hints.functions = MWM_FUNC_ALL ; 
+       hints.flags = MWM_HINTS_DECORATIONS | MWM_HINTS_FUNCTIONS;
+
+       XChangeProperty(xfi->display, window->handle, xfi->_MOTIF_WM_HINTS, xfi->_MOTIF_WM_HINTS, 32,
+               PropModeReplace, (uint8*) &hints, PROP_MOTIF_WM_HINTS_ELEMENTS);
+}
+
+void xf_SetWindowUnlisted(xfInfo* xfi, xfWindow* window)
+{
+       Atom window_state[2];
+
+       window_state[0] = xfi->_NET_WM_STATE_SKIP_PAGER;
+       window_state[1] = xfi->_NET_WM_STATE_SKIP_TASKBAR;
+
+       XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_STATE,
+               XA_ATOM, 32, PropModeReplace, (uint8*) &window_state, 2);
+}
+
+void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_style)
+{
+       Atom window_type;
+
+       if ((ex_style & WS_EX_TOPMOST) || (ex_style & WS_EX_TOOLWINDOW))
+       {
+               /*
+                * These include tool tips, dropdown menus, etc.  These won't work
+                * correctly if the local window manager resizes or moves them.
+                * Set override redirect to prevent this from occurring.
+                */
+               XSetWindowAttributes attrs;
+               attrs.override_redirect = True;
+               XChangeWindowAttributes(xfi->display, window->handle, CWOverrideRedirect, &attrs);
+               window->is_transient = true;
+               xf_SetWindowUnlisted(xfi, window);
+
+               window_type = xfi->_NET_WM_WINDOW_TYPE_POPUP;
+       }
+       else if (style & WS_POPUP)
+       {
+               /* this includes dialogs, popups, etc, that need to be full-fledged windows */
+               window_type = xfi->_NET_WM_WINDOW_TYPE_DIALOG;
+               xf_SetWindowUnlisted(xfi, window);
+       }
+       else
+       {
+               window_type = xfi->_NET_WM_WINDOW_TYPE_NORMAL;
+       }
+
+       XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_WINDOW_TYPE,
+               XA_ATOM, 32, PropModeReplace, (uint8*) &window_type, 1);
+
+}
+
+xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, boolean decorations)
+{
+       xfWindow* window;
+
+       window = (xfWindow*) xzalloc(sizeof(xfWindow));
+
+       if (window != NULL)
+       {
+               int input_mask;
+               XClassHint* class_hints;
+
+               window->width = width;
+               window->height = height;
+               window->fullscreen = false;
+               window->decorations = decorations;
+               window->local_move.state = LMS_NOT_ACTIVE;
+               window->is_mapped = false;
+               window->is_transient = false;
+
+               window->handle = XCreateWindow(xfi->display, RootWindowOfScreen(xfi->screen),
+                       xfi->workArea.x, xfi->workArea.y, xfi->width, xfi->height, 0, xfi->depth, InputOutput, xfi->visual,
+                       CWBackPixel | CWBackingStore | CWOverrideRedirect | CWColormap | 
+                       CWBorderPixel | CWWinGravity | CWBitGravity, &xfi->attribs);
+
+               class_hints = XAllocClassHint();
+
+               if (class_hints != NULL)
+               {
+                       class_hints->res_name = "xfreerdp";
+                       class_hints->res_class = "xfreerdp";
+                       XSetClassHint(xfi->display, window->handle, class_hints);
+                       XFree(class_hints);
+               }
+
+               xf_ResizeDesktopWindow(xfi, window, width, height);
+               xf_SetWindowDecorations(xfi, window, decorations);
+
+               input_mask =
+                       KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask |
+                       VisibilityChangeMask | FocusChangeMask | StructureNotifyMask |
+                       PointerMotionMask | ExposureMask | PropertyChangeMask;
+
+               if (xfi->grab_keyboard)
+                       input_mask |= EnterWindowMask | LeaveWindowMask;
+
+               XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_ICON, XA_CARDINAL, 32,
+                               PropModeReplace, (uint8*) xf_icon_prop, sizeof(xf_icon_prop) / sizeof(long));
+
+               XSelectInput(xfi->display, window->handle, input_mask);
+               XMapWindow(xfi->display, window->handle);
+       }
+
+       XStoreName(xfi->display, window->handle, name);
+
+       return window;
+}
+
+void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height)
+{
+       XSizeHints* size_hints;
+
+       size_hints = XAllocSizeHints();
+
+       if (size_hints)
+       {
+               size_hints->flags = PMinSize | PMaxSize;
+               size_hints->min_width = size_hints->max_width = xfi->width;
+               size_hints->min_height = size_hints->max_height = xfi->height;
+               XSetWMNormalHints(xfi->display, window->handle, size_hints);
+               XFree(size_hints);
+       }
+}
+
+void xf_FixWindowCoordinates(xfInfo* xfi, int* x, int* y, int* width, int* height)
+{
+       int vscreen_width;
+       int vscreen_height;
+
+       vscreen_width = xfi->vscreen.area.right - xfi->vscreen.area.left + 1;
+       vscreen_height = xfi->vscreen.area.bottom - xfi->vscreen.area.top + 1;
+
+       if (*width < 1) 
+       {
+               *width = 1;
+       }
+       if (*height < 1)
+       {
+               *height = 1;
+       }
+       if (*x < xfi->vscreen.area.left)
+       {
+               *width += *x;
+               *x = xfi->vscreen.area.left;
+       }
+       if (*y < xfi->vscreen.area.top)
+       {
+               *height += *y;
+               *y = xfi->vscreen.area.top;
+       }
+       if (*width > vscreen_width)
+       {
+               *width = vscreen_width;
+       }
+       if (*height > vscreen_height)
+       {
+               *height = vscreen_height;
+       }
+}
+
+char rail_window_class[] = "RAIL:00000000";
+
+xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, int height, uint32 id)
+{
+       xfWindow* window;
+
+       window = (xfWindow*) xzalloc(sizeof(xfWindow));
+
+       xf_FixWindowCoordinates(xfi, &x, &y, &width, &height);
+
+       window->left = x;
+       window->top = y;
+       window->right = x + width - 1;
+       window->bottom = y + height - 1;
+       window->width = width;
+       window->height = height;
+
+       XGCValues gcv;
+       XClassHint* class_hints;
+       int input_mask;
+
+       window->decorations = false;
+       window->fullscreen = false;
+       window->window = wnd;
+       window->local_move.state = LMS_NOT_ACTIVE;
+       window->is_mapped = false;
+       window->is_transient = false;
+
+       window->handle = XCreateWindow(xfi->display, RootWindowOfScreen(xfi->screen),
+               x, y, window->width, window->height, 0, xfi->depth, InputOutput, xfi->visual,
+               CWBackPixel | CWBackingStore | CWOverrideRedirect | CWColormap | 
+               CWBorderPixel | CWWinGravity | CWBitGravity, &xfi->attribs);
+
+       DEBUG_X11_LMS("Create  window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d  rdp=0x%X",
+                       (uint32) window->handle, window->left, window->top, window->right, window->bottom,
+                       window->width, window->height, wnd->windowId);
+
+       xf_SetWindowDecorations(xfi, window, window->decorations);
+       xf_SetWindowStyle(xfi, window, wnd->style, wnd->extendedStyle);
+
+       class_hints = XAllocClassHint();
+
+       if (class_hints != NULL)
+       {
+               char* class;
+               class = xmalloc(sizeof(rail_window_class));
+               snprintf(class, sizeof(rail_window_class), "RAIL:%08X", id);
+               class_hints->res_name = "RAIL";
+               class_hints->res_class = class;
+               XSetClassHint(xfi->display, window->handle, class_hints);
+               XFree(class_hints);
+               xfree(class);
+       }
+
+       XSetWMProtocols(xfi->display, window->handle, &(xfi->WM_DELETE_WINDOW), 1);
+
+       input_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask |
+               ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | 
+               PointerMotionMask | Button1MotionMask | Button2MotionMask | 
+               Button3MotionMask | Button4MotionMask | Button5MotionMask |
+                ButtonMotionMask | KeymapStateMask | ExposureMask | 
+               VisibilityChangeMask | StructureNotifyMask | SubstructureNotifyMask | 
+               SubstructureRedirectMask | FocusChangeMask | PropertyChangeMask |
+                ColormapChangeMask | OwnerGrabButtonMask;
+
+       XSelectInput(xfi->display, window->handle, input_mask);
+       XMapWindow(xfi->display, window->handle);
+
+       memset(&gcv, 0, sizeof(gcv));
+       window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv);
+
+       xf_MoveWindow(xfi, window, x, y, width, height);
+
+       return window;
+}
+
+void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window,
+               int maxWidth, int maxHeight, int maxPosX, int maxPosY,
+               int minTrackWidth, int minTrackHeight, int maxTrackWidth, int maxTrackHeight)
+{
+       XSizeHints* size_hints;
+
+       size_hints = XAllocSizeHints();
+
+       if (size_hints)
+       {
+               size_hints->flags = PMinSize | PMaxSize | PResizeInc;
+
+               size_hints->min_width  = minTrackWidth;
+               size_hints->min_height = minTrackHeight;
+
+               size_hints->max_width  = maxTrackWidth;
+               size_hints->max_height = maxTrackHeight;
+
+               /* to speedup window drawing we need to select optimal value for sizing step. */
+               size_hints->width_inc = size_hints->height_inc = 1;
+
+               XSetWMNormalHints(xfi->display, window->handle, size_hints);
+               XFree(size_hints);
+       }
+}
+
+void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, int y)
+{
+       Window child_window;
+
+       if (window->local_move.state != LMS_NOT_ACTIVE)
+               return;
+
+       DEBUG_X11_LMS("direction=%d window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d   "
+               "RDP=0x%X rc={l=%d t=%d} w=%d h=%d  mouse_x=%d mouse_y=%d",
+               direction, (uint32) window->handle, 
+               window->left, window->top, window->right, window->bottom,
+               window->width, window->height, window->window->windowId,
+               window->window->windowOffsetX, window->window->windowOffsetY, 
+               window->window->windowWidth, window->window->windowHeight, x, y);
+
+       window->local_move.root_x = x; 
+       window->local_move.root_y = y;
+       window->local_move.state = LMS_STARTING;
+
+       XTranslateCoordinates(xfi->display, RootWindowOfScreen(xfi->screen), window->handle, 
+               window->local_move.root_x, 
+               window->local_move.root_y,
+               &window->local_move.window_x, 
+               &window->local_move.window_y, 
+               &child_window);
+
+       XUngrabPointer(xfi->display, CurrentTime);
+
+       xf_SendClientEvent(xfi, window, 
+                       xfi->_NET_WM_MOVERESIZE, /* request X window manager to initiate a local move */
+                       5, /* 5 arguments to follow */
+                       x, /* x relative to root window */
+                       y, /* y relative to root window */
+                       direction, /* extended ICCM direction flag */
+                       1, /* simulated mouse button 1 */
+                       1); /* 1 == application request per extended ICCM */
+}
+
+void xf_EndLocalMoveSize(xfInfo *xfi, xfWindow *window)
+{
+
+       DEBUG_X11_LMS("state=%d window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d  "
+               "RDP=0x%X rc={l=%d t=%d} w=%d h=%d",
+               window->local_move.state, 
+               (uint32) window->handle, window->left, window->top, window->right, window->bottom,
+               window->width, window->height, window->window->windowId,
+               window->window->windowOffsetX, window->window->windowOffsetY, 
+               window->window->windowWidth, window->window->windowHeight);
+
+       if (window->local_move.state == LMS_NOT_ACTIVE)
+               return;
+
+       if (window->local_move.state == LMS_STARTING)
+       {
+               /*
+                * The move never was property started. This can happen due to race
+                * conditions between the mouse button up and the communications to the
+                * RDP server for local moves. We must cancel the X window manager move.
+                * Per ICCM, the X client can ask to cancel an active move. 
+                */
+               xf_SendClientEvent(xfi, window, 
+                       xfi->_NET_WM_MOVERESIZE, /* request X window manager to abort a local move */
+                       5, /* 5 arguments to follow */
+                       window->local_move.root_x, /* x relative to root window */
+                       window->local_move.root_y, /* y relative to root window */
+                       _NET_WM_MOVERESIZE_CANCEL, /* extended ICCM direction flag */
+                       1, /* simulated mouse button 1 */
+                       1); /* 1 == application request per extended ICCM */
+       }
+
+       window->local_move.state = LMS_NOT_ACTIVE;
+}
+
+void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height)
+{
+       boolean resize = false;
+
+       if ((width * height) < 1)
+               return;
+
+       if ((window->width != width) || (window->height != height))
+               resize = true;
+
+       if (window->local_move.state == LMS_STARTING ||
+               window->local_move.state == LMS_ACTIVE)
+               return;
+
+       DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%u h=%u  "
+               "new rc={l=%d t=%d r=%d b=%d} w=%u h=%u"
+               "  RDP=0x%X rc={l=%d t=%d} w=%d h=%d",
+               (uint32) window->handle, window->left, window->top, 
+               window->right, window->bottom, window->width, window->height,
+               x, y, x + width -1, y + height -1, width, height, 
+               window->window->windowId,
+               window->window->windowOffsetX, window->window->windowOffsetY, 
+               window->window->windowWidth, window->window->windowHeight);
+
+       window->left = x;
+       window->top = y;
+       window->right = x + width - 1;
+       window->bottom = y + height - 1;
+       window->width = width;
+       window->height = height;
+
+       if (resize)
+               XMoveResizeWindow(xfi->display, window->handle, x, y, width, height);
+       else
+               XMoveWindow(xfi->display, window->handle, x, y);
+
+       xf_UpdateWindowArea(xfi, window, 0, 0, width, height);
+}
+
+void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state)
+{
+       switch (state)
+       {
+               case WINDOW_HIDE:
+                       XWithdrawWindow(xfi->display, window->handle, xfi->screen_number);
+                       break;
+
+               case WINDOW_SHOW_MINIMIZED:
+                       XIconifyWindow(xfi->display, window->handle, xfi->screen_number);
+                       break;
+
+               case WINDOW_SHOW_MAXIMIZED:
+                       XRaiseWindow(xfi->display, window->handle);
+                       break;
+
+               case WINDOW_SHOW:
+                       XMapWindow(xfi->display, window->handle);
+                       break;
+       }
+
+       XFlush(xfi->display);
+}
+
+void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon)
+{
+       int x, y;
+       int pixels;
+       int propsize;
+       long* propdata;
+       long* dstp;
+       uint32* srcp;
+
+       if (icon->big != true)
+               return;
+
+       pixels = icon->entry->width * icon->entry->height;
+       propsize = 2 + pixels;
+       propdata = xmalloc(propsize * sizeof(long));
+
+       propdata[0] = icon->entry->width;
+       propdata[1] = icon->entry->height;
+       dstp = &(propdata[2]);
+       srcp = (uint32*) icon->extra;
+
+       for (y = 0; y < icon->entry->height; y++)
+       {
+               for (x = 0; x < icon->entry->width; x++)
+               {
+                       *dstp++ = *srcp++;
+               }
+       }
+
+       XChangeProperty(xfi->display, window->handle, xfi->_NET_WM_ICON, XA_CARDINAL, 32,
+               PropModeReplace, (uint8*) propdata, propsize);
+
+       XFlush(xfi->display);
+}
+
+void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects)
+{
+       int i;
+       XRectangle* xrects;
+
+       xrects = xmalloc(sizeof(XRectangle) * nrects);
+
+       for (i = 0; i < nrects; i++)
+       {
+               xrects[i].x = rects[i].left;
+               xrects[i].y = rects[i].top;
+               xrects[i].width = rects[i].right - rects[i].left;
+               xrects[i].height = rects[i].bottom - rects[i].top;
+       }
+
+#ifdef WITH_XEXT
+       XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0);
+#endif
+
+       xfree(xrects);
+}
+
+void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects)
+{
+       int i;
+       XRectangle* xrects;
+
+       xrects = xmalloc(sizeof(XRectangle) * nrects);
+
+       for (i = 0; i < nrects; i++)
+       {
+               xrects[i].x = rects[i].left;
+               xrects[i].y = rects[i].top;
+               xrects[i].width = rects[i].right - rects[i].left;
+               xrects[i].height = rects[i].bottom - rects[i].top;
+       }
+
+#ifdef WITH_XEXT
+       //XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0);
+#endif
+
+       xfree(xrects);
+}
+
+void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height)
+{
+       int ax, ay;
+       rdpWindow* wnd;
+       wnd = window->window;
+
+       ax = x + wnd->windowOffsetX;
+       ay = y + wnd->windowOffsetY;
+
+       if (ax + width > wnd->windowOffsetX + wnd->windowWidth)
+               width = (wnd->windowOffsetX + wnd->windowWidth - 1) - ax;
+
+       if (ay + height > wnd->windowOffsetY + wnd->windowHeight)
+               height = (wnd->windowOffsetY + wnd->windowHeight - 1) - ay;
+
+       if (xfi->sw_gdi)
+       {
+               XPutImage(xfi->display, xfi->primary, window->gc, xfi->image,
+                       ax, ay, ax, ay, width, height);
+       }
+
+       XCopyArea(xfi->display, xfi->primary, window->handle, window->gc,
+                       ax, ay, width, height, x, y);
+
+       XFlush(xfi->display);
+}
+
+boolean xf_IsWindowBorder(xfInfo* xfi, xfWindow* xfw, int x, int y)
+{
+       rdpWindow* wnd;
+       boolean clientArea = false;
+       boolean windowArea = false;
+
+       wnd = xfw->window;
+
+       if (((x > wnd->clientOffsetX) && (x < wnd->clientOffsetX + wnd->clientAreaWidth)) &&
+               ((y > wnd->clientOffsetY) && (y < wnd->clientOffsetY + wnd->clientAreaHeight)))
+               clientArea = true;
+
+       if (((x > wnd->windowOffsetX) && (x < wnd->windowOffsetX + wnd->windowWidth)) &&
+               ((y > wnd->windowOffsetY) && (y < wnd->windowOffsetY + wnd->windowHeight)))
+               windowArea = true;
+
+       return (windowArea && !(clientArea));
+}
+
+void xf_DestroyWindow(xfInfo* xfi, xfWindow* window)
+{
+       if (window == NULL)
+               return;
+
+       if (xfi->window == window)
+               xfi->window = NULL;
+
+       if (window->gc)
+               XFreeGC(xfi->display, window->gc);
+
+       if (window->handle)
+       {
+               XUnmapWindow(xfi->display, window->handle);
+               XDestroyWindow(xfi->display, window->handle);
+       }
+
+       xfree(window);
+}
diff --git a/client/X11/xf_window.h b/client/X11/xf_window.h
new file mode 100644 (file)
index 0000000..15a2c86
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Windows
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_WINDOW_H
+#define __XF_WINDOW_H
+
+#include <X11/Xlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/memory.h>
+
+typedef struct xf_localmove xfLocalMove;
+typedef struct xf_window xfWindow;
+
+#include "xfreerdp.h"
+
+// Extended ICCM flags http://standards.freedesktop.org/wm-spec/wm-spec-latest.html
+#define _NET_WM_MOVERESIZE_SIZE_TOPLEFT      0
+#define _NET_WM_MOVERESIZE_SIZE_TOP          1
+#define _NET_WM_MOVERESIZE_SIZE_TOPRIGHT     2
+#define _NET_WM_MOVERESIZE_SIZE_RIGHT        3
+#define _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT  4
+#define _NET_WM_MOVERESIZE_SIZE_BOTTOM       5
+#define _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT   6
+#define _NET_WM_MOVERESIZE_SIZE_LEFT         7
+#define _NET_WM_MOVERESIZE_MOVE              8   /* movement only */
+#define _NET_WM_MOVERESIZE_SIZE_KEYBOARD     9   /* size via keyboard */
+#define _NET_WM_MOVERESIZE_MOVE_KEYBOARD    10   /* move via keyboard */
+#define _NET_WM_MOVERESIZE_CANCEL           11   /* cancel operation */
+
+enum xf_localmove_state
+{
+       LMS_NOT_ACTIVE,
+       LMS_STARTING,
+       LMS_ACTIVE,
+       LMS_TERMINATING
+};
+
+struct xf_localmove
+{
+       int root_x;  // relative to root
+       int root_y;
+       int window_x; // relative to window
+       int window_y;
+       enum xf_localmove_state state;
+};
+
+struct xf_window
+{
+       GC gc;
+       int left;
+       int top;
+       int right;
+       int bottom;
+       int width;
+       int height;
+       Window handle;
+       boolean fullscreen;
+       boolean decorations;
+       rdpWindow* window;
+       boolean is_mapped;
+       boolean is_transient;
+       xfLocalMove local_move;
+};
+
+void xf_ewmhints_init(xfInfo* xfi);
+
+boolean xf_GetCurrentDesktop(xfInfo* xfi);
+boolean xf_GetWorkArea(xfInfo* xfi);
+
+void xf_SetWindowFullscreen(xfInfo* xfi, xfWindow* window, boolean fullscreen);
+void xf_SetWindowDecorations(xfInfo* xfi, xfWindow* window, boolean show);
+void xf_SetWindowUnlisted(xfInfo* xfi, xfWindow* window);
+
+xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, boolean decorations);
+void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height);
+
+xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, int height, uint32 id);
+void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height);
+void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state);
+void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon);
+void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects);
+void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int nrects);
+void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_style);
+void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height);
+boolean xf_IsWindowBorder(xfInfo* xfi, xfWindow* xfw, int x, int y);
+void xf_DestroyWindow(xfInfo* xfi, xfWindow* window);
+
+void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window, int maxWidth, int maxHeight,
+               int maxPosX, int maxPosY, int minTrackWidth, int minTrackHeight, int maxTrackWidth, int maxTrackHeight);
+
+
+void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, int y);
+void xf_EndLocalMoveSize(xfInfo *xfi, xfWindow *window);
+void xf_SendClientEvent(xfInfo *xfi, xfWindow* window, Atom atom, unsigned int numArgs, ...);
+
+#endif /* __XF_WINDOW_H */
diff --git a/client/X11/xfreerdp.1.xml b/client/X11/xfreerdp.1.xml
new file mode 100644 (file)
index 0000000..39e89e3
--- /dev/null
@@ -0,0 +1,461 @@
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+                  "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
+<refentry>
+  <refentryinfo>
+    <date>2011-08-27</date>
+    <author>
+      <authorblurb><para>The FreeRDP Team</para></authorblurb>
+    </author>
+  </refentryinfo>
+  <refmeta>
+    <refentrytitle>xfreerdp</refentrytitle>
+    <manvolnum>1</manvolnum>
+    <refmiscinfo class="source">freerdp</refmiscinfo>
+    <refmiscinfo class="manual">xfreerdp</refmiscinfo>
+  </refmeta>
+  <refnamediv>
+    <refname><application>xfreerdp</application></refname>
+    <refpurpose>FreeRDP X11 client</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <refsynopsisdivinfo>
+      <date>2011-08-27</date>
+    </refsynopsisdivinfo>
+    <para>
+      <command>xfreerdp</command> [options] server[:port] [[options] server[:port] …]
+    </para>
+  </refsynopsisdiv>
+  <refsect1>
+    <refsect1info>
+      <date>2011-08-27</date>
+    </refsect1info>
+    <title>DESCRIPTION</title>
+    <para>
+      <command>xfreerdp</command> is an X11 Remote Desktop Protocol (RDP)
+      client which is part of the FreeRDP project. An RDP server is built-in
+      to many editions of Windows. Alternative servers included xrdp and VRDP (VirtualBox).
+    </para>
+  </refsect1>
+  <refsect1>
+    <title>OPTIONS</title>
+    <variablelist>
+      <varlistentry>
+        <term>-0</term>
+        <listitem>
+          <para>
+            Attach to the admin console of the server.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-a <replaceable class="parameter">bpp</replaceable></term>
+        <listitem>
+          <para>
+            Sets the color depth for the connection to <replaceable class="parameter">bpp</replaceable> bits per pixel.
+            Valid values are 8, 15, 16, 24 and 32. The default value is the color depth of the FreeRDP-window.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry id="WorkingDir">
+        <term>-c <replaceable class="parameter">dir</replaceable></term>
+        <listitem>
+          <para>
+            Sets the working-dir to <replaceable class="parameter">dir</replaceable>.
+            This parameter is only used when an AlternateShell (<xref linkend="AlternateShell"/>) is requested.
+            <replaceable class="parameter">dir</replaceable> should contain the executable file specified in the AlternateShell.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-D</term>
+        <listitem>
+          <para>
+            Removes the windows decorations.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-d</term>
+        <listitem>
+          <para>
+            Domain used in authentication.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-f</term>
+        <listitem>
+          <para>
+            start in full screen mode. This mode can always be en- and disabled using Ctrl-Alt-Enter.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-T <replaceable class="parameter">text</replaceable></term>
+        <listitem>
+          <para>
+            Sets the window title to <replaceable class="parameter">text</replaceable>.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-g <replaceable class="parameter">geometry</replaceable></term>
+        <listitem>
+          <para>
+            Sets the size of the FreeRDP window (and of the remote desktop, when establishing a new connection).
+            <replaceable class="parameter">geometry</replaceable> can have one of the following forms:
+            <itemizedlist>
+              <listitem>
+                <para>
+                  <replaceable class="parameter">W</replaceable>x<replaceable class="parameter">H</replaceable> - 
+                  in this case the resulting window will be of
+                  <replaceable class="parameter">W</replaceable>x<replaceable class="parameter">H</replaceable> pixels.
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  <replaceable class="parameter">P</replaceable>% -
+                  in this case the resulting window will be <replaceable class="parameter">P</replaceable>%
+                  of your screen.
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  The special keyword <emphasis>workarea</emphasis> -
+                  in this case the resulting window will be of the same size as your workarea.
+                </para>
+              </listitem>
+            </itemizedlist>
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-k <replaceable class="parameter">id</replaceable></term>
+        <listitem>
+          <para>
+            Sets the keyboard-layout-id to <replaceable class="parameter">id</replaceable>.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-m</term>
+        <listitem>
+          <para>
+            Don't send mouse motion events.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-n <replaceable class="parameter">hostname</replaceable></term>
+        <listitem>
+          <para>
+            Set the reported client hostname to <replaceable class="parameter">hostname</replaceable>.
+            Default is to automatically detect the hostname.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-o</term>
+        <listitem>
+          <para>
+            Play audio on the console instead of redirecting to the client.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-p <replaceable class="parameter">password</replaceable></term>
+        <listitem>
+          <para>
+            Password used in authentication.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry id="AlternateShell">
+        <term>-s <replaceable class="parameter">shell</replaceable></term>
+        <listitem>
+          <para>
+            Sets the startup-shell to <replaceable class="parameter">shell</replaceable>.
+            This parameter should contain a complete path to the alternate shell.
+            If the alternete shell requires a different working directory use <xref linkend="WorkingDir"/>.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-t <replaceable class="parameter">port</replaceable></term>
+        <listitem>
+          <para>
+            Connect to <replaceable class="parameter">port</replaceable>, instead of the default 3389.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-u <replaceable class="parameter">username</replaceable></term>
+        <listitem>
+          <para>
+            Username used in authentication.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-x <replaceable class="parameter">flag</replaceable></term>
+        <listitem>
+          <para>
+            Set the experiance performance flags.
+            <replaceable class="parameter">flag</replaceable> can be one of:
+            <itemizedlist>
+              <listitem>
+                <para>
+                  m - (modem): Equivalent to 15.
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  b - (broadband): Equivalent to 1.
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  l - (lan): Equivalent to 0.
+                </para>
+              </listitem>
+              <listitem>
+                <para>
+                  <replaceable class="parameter">num</replaceable> - A hexadecimal number that
+                  represents a bit-mask, were numbers mean the following
+                  <footnote><para>Taken from <ulink url="http://msdn.microsoft.com/en-us/library/cc240476%28v=prot.10%29.aspx">
+                  MS-RDPBCGR Section 2.2.1.11.1.1.1 - Extended Info Packet</ulink></para></footnote>:
+                  <itemizedlist>
+                    <listitem>
+                      <para>1: Disable desktop wallpaper.</para>
+                    </listitem>
+                    <listitem>
+                      <para>2: Disable full-window drag (only the window outline is displayed when the window is moved).</para>
+                    </listitem>
+                    <listitem>
+                      <para>4: Disable menu animations.</para>
+                    </listitem>
+                    <listitem>
+                      <para>8: Disable user interface themes.</para>
+                    </listitem>
+                    <listitem>
+                      <para>20: Disable mouse cursor shadows.</para>
+                    </listitem>
+                    <listitem>
+                      <para>40: Disable cursor blinking.</para>
+                    </listitem>
+                    <listitem>
+                      <para>80: Enable font smoothing.</para>
+                    </listitem>
+                    <listitem>
+                      <para>100: Enable Desktop Composition.</para>
+                    </listitem>
+                  </itemizedlist>
+                </para>
+              </listitem>
+            </itemizedlist>
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>-z</term>
+        <listitem>
+          <para>
+            Enable compression.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--app</term>
+        <listitem>
+          <para>
+            initialize a RemoteApp connection. This implies -g workarea.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--ext</term>
+        <listitem>
+          <para>
+            load an extension
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-auth</term>
+        <listitem>
+          <para>
+            Skips authentication. This is useful e.g. for the current FreeRDP server that doesn't yet support server-side authentication.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-fastpath</term>
+        <listitem>
+          <para>
+            Disables fast-path. Use slow-path packets instead, which have larger headers.
+            It might be good for debugging certain issues when you suspect it might be
+            linked to the parsing of one of the two header types.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--gdi</term>
+        <listitem>
+          <para>
+            GDI rendering backend. <replaceable class="parameter">backend</replaceable> can be either sw (software) or hw (hardware).
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-osb</term>
+        <listitem>
+          <para>
+            Disable off screen bitmaps.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-bmp-cache</term>
+        <listitem>
+          <para>
+            Disable bitmap cache.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--plugin</term>
+        <listitem>
+          <para>
+            load a plugin
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--rfx</term>
+        <listitem>
+          <para>
+            Enable RemoteFX.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--rfx-mode</term>
+        <listitem>
+          <para>
+            RemoteFX operational flags. <replaceable class="parameter">flags</replaceable> can be either v[ideo], i[mage]), default is video.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--nsc</term>
+        <listitem>
+          <para>
+            Enable NSCodec.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--disable-wallpaper</term>
+        <listitem>
+          <para>
+            Disable wallpaper.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--composition</term>
+        <listitem>
+          <para>
+            Enable composition (RDVH only, not to be confused with remote composition).
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--disable-full-window-drag</term>
+        <listitem>
+          <para>
+            Disable full window drag.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--disable-menu-animations</term>
+        <listitem>
+          <para>
+            Disable menu animations.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--disable-theming</term>
+        <listitem>
+          <para>
+            Disable theming.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-rdp</term>
+        <listitem>
+          <para>
+            Disable Standard RDP encryption.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-tls</term>
+        <listitem>
+          <para>
+            Disable TLS encryption.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--no-nla</term>
+        <listitem>
+          <para>
+            Disable network level authentication.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--sec <replaceable class="parameter">proto</replaceable></term>
+        <listitem>
+          <para>
+            force protocol security. <replaceable class="parameter">proto</replaceable> can be one of rdp, tls or nla.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--ntlm</term>
+        <listitem>
+          <para>
+            force NTLM protocol version. <replaceable class="parameter">version</replaceable> can be one of 1 or 2.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--ignore-certificate</term>
+        <listitem>
+          <para>
+            ignore verification of logon certificate.
+          </para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>--version</term>
+        <listitem>
+          <para>
+            Print version information.
+          </para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsect1>
+  <refsect1>
+    <title>LINKS</title>
+    <para>
+      <ulink url="http://www.freerdp.com/">http://www.freerdp.com/</ulink>
+    </para>
+  </refsect1>
+</refentry>
diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c
new file mode 100644 (file)
index 0000000..de58122
--- /dev/null
@@ -0,0 +1,1131 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Client
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef WITH_XCURSOR
+#include <X11/Xcursor/Xcursor.h>
+#endif
+
+#ifdef WITH_XINERAMA
+#include <X11/extensions/Xinerama.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <unistd.h>
+#include <string.h>
+#include <termios.h>
+#include <pthread.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <freerdp/constants.h>
+#include <freerdp/codec/nsc.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/codec/bitmap.h>
+#include <freerdp/utils/args.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/semaphore.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/signal.h>
+#include <freerdp/utils/passphrase.h>
+#include <freerdp/plugins/cliprdr.h>
+#include <freerdp/rail.h>
+
+#include "xf_gdi.h"
+#include "xf_rail.h"
+#include "xf_tsmf.h"
+#include "xf_event.h"
+#include "xf_cliprdr.h"
+#include "xf_monitor.h"
+#include "xf_graphics.h"
+#include "xf_keyboard.h"
+
+#include "xfreerdp.h"
+
+static freerdp_sem g_sem;
+static int g_thread_count = 0;
+static uint8 g_disconnect_reason = 0;
+
+static long xv_port = 0;
+static const size_t password_size = 512;
+
+struct thread_data
+{
+       freerdp* instance;
+};
+
+int xf_process_client_args(rdpSettings* settings, const char* opt, const char* val, void* user_data);
+int xf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data);
+
+void xf_context_new(freerdp* instance, rdpContext* context)
+{
+       context->channels = freerdp_channels_new();
+}
+
+void xf_context_free(freerdp* instance, rdpContext* context)
+{
+
+}
+
+void xf_sw_begin_paint(rdpContext* context)
+{
+       rdpGdi* gdi = context->gdi;
+       gdi->primary->hdc->hwnd->invalid->null = 1;
+       gdi->primary->hdc->hwnd->ninvalid = 0;
+}
+
+void xf_sw_end_paint(rdpContext* context)
+{
+       rdpGdi* gdi;
+       xfInfo* xfi;
+       sint32 x, y;
+       uint32 w, h;
+
+       xfi = ((xfContext*) context)->xfi;
+       gdi = context->gdi;
+
+       if (xfi->remote_app != true)
+       {
+               if (xfi->complex_regions != true)
+               {
+                       if (gdi->primary->hdc->hwnd->invalid->null)
+                               return;
+
+                       x = gdi->primary->hdc->hwnd->invalid->x;
+                       y = gdi->primary->hdc->hwnd->invalid->y;
+                       w = gdi->primary->hdc->hwnd->invalid->w;
+                       h = gdi->primary->hdc->hwnd->invalid->h;
+
+                       XPutImage(xfi->display, xfi->primary, xfi->gc, xfi->image, x, y, x, y, w, h);
+                       XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, x, y, w, h, x, y);
+               }
+               else
+               {
+                       int i;
+                       int ninvalid;
+                       HGDI_RGN cinvalid;
+
+                       if (gdi->primary->hdc->hwnd->ninvalid < 1)
+                               return;
+
+                       ninvalid = gdi->primary->hdc->hwnd->ninvalid;
+                       cinvalid = gdi->primary->hdc->hwnd->cinvalid;
+
+                       for (i = 0; i < ninvalid; i++)
+                       {
+                               x = cinvalid[i].x;
+                               y = cinvalid[i].y;
+                               w = cinvalid[i].w;
+                               h = cinvalid[i].h;
+
+                               XPutImage(xfi->display, xfi->primary, xfi->gc, xfi->image, x, y, x, y, w, h);
+                               XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, x, y, w, h, x, y);
+                       }
+
+                       XFlush(xfi->display);
+               }
+       }
+       else
+       {
+               if (gdi->primary->hdc->hwnd->invalid->null)
+                       return;
+
+               x = gdi->primary->hdc->hwnd->invalid->x;
+               y = gdi->primary->hdc->hwnd->invalid->y;
+               w = gdi->primary->hdc->hwnd->invalid->w;
+               h = gdi->primary->hdc->hwnd->invalid->h;
+
+               xf_rail_paint(xfi, context->rail, x, y, x + w - 1, y + h - 1);
+       }
+}
+
+void xf_sw_desktop_resize(rdpContext* context)
+{
+       xfInfo* xfi;
+       rdpSettings* settings;
+
+       xfi = ((xfContext*) context)->xfi;
+       settings = xfi->instance->settings;
+
+       if (xfi->fullscreen != true)
+       {
+               rdpGdi* gdi = context->gdi;
+               gdi_resize(gdi, xfi->width, xfi->height);
+
+               if (xfi->image)
+               {
+                       xfi->image->data = NULL;
+                       XDestroyImage(xfi->image);
+                       xfi->image = XCreateImage(xfi->display, xfi->visual, xfi->depth, ZPixmap, 0,
+                                       (char*) gdi->primary_buffer, gdi->width, gdi->height, xfi->scanline_pad, 0);
+               }
+       }
+}
+
+void xf_hw_begin_paint(rdpContext* context)
+{
+       xfInfo* xfi;
+       xfi = ((xfContext*) context)->xfi;
+       xfi->hdc->hwnd->invalid->null = 1;
+       xfi->hdc->hwnd->ninvalid = 0;
+}
+
+void xf_hw_end_paint(rdpContext* context)
+{
+       xfInfo* xfi;
+       sint32 x, y;
+       uint32 w, h;
+
+       xfi = ((xfContext*) context)->xfi;
+
+       if (xfi->remote_app)
+       {
+               if (xfi->hdc->hwnd->invalid->null)
+                       return;
+
+               x = xfi->hdc->hwnd->invalid->x;
+               y = xfi->hdc->hwnd->invalid->y;
+               w = xfi->hdc->hwnd->invalid->w;
+               h = xfi->hdc->hwnd->invalid->h;
+
+               xf_rail_paint(xfi, context->rail, x, y, x + w - 1, y + h - 1);
+       }
+}
+
+void xf_hw_desktop_resize(rdpContext* context)
+{
+       xfInfo* xfi;
+       boolean same;
+       rdpSettings* settings;
+
+       xfi = ((xfContext*) context)->xfi;
+       settings = xfi->instance->settings;
+
+       if (xfi->fullscreen != true)
+       {
+               xfi->width = settings->width;
+               xfi->height = settings->height;
+
+               if (xfi->window)
+                       xf_ResizeDesktopWindow(xfi, xfi->window, settings->width, settings->height);
+
+               if (xfi->primary)
+               {
+                       same = (xfi->primary == xfi->drawing) ? true : false;
+
+                       XFreePixmap(xfi->display, xfi->primary);
+
+                       xfi->primary = XCreatePixmap(xfi->display, xfi->drawable,
+                                       xfi->width, xfi->height, xfi->depth);
+
+                       if (same)
+                               xfi->drawing = xfi->primary;
+               }
+       }
+}
+
+boolean xf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount)
+{
+       xfInfo* xfi = ((xfContext*) instance->context)->xfi;
+
+       rfds[*rcount] = (void*)(long)(xfi->xfds);
+       (*rcount)++;
+
+       return true;
+}
+
+boolean xf_check_fds(freerdp* instance, fd_set* set)
+{
+       XEvent xevent;
+       xfInfo* xfi = ((xfContext*) instance->context)->xfi;
+
+       while (XPending(xfi->display))
+       {
+               memset(&xevent, 0, sizeof(xevent));
+               XNextEvent(xfi->display, &xevent);
+
+               if (xf_event_process(instance, &xevent) != true)
+                       return false;
+       }
+
+       return true;
+}
+
+void xf_create_window(xfInfo* xfi)
+{
+       XEvent xevent;
+       char* win_title;
+       int width, height;
+
+       width = xfi->width;
+       height = xfi->height;
+
+       xfi->attribs.background_pixel = BlackPixelOfScreen(xfi->screen);
+       xfi->attribs.border_pixel = WhitePixelOfScreen(xfi->screen);
+       xfi->attribs.backing_store = xfi->primary ? NotUseful : Always;
+       xfi->attribs.override_redirect = xfi->fullscreen;
+       xfi->attribs.colormap = xfi->colormap;
+       xfi->attribs.bit_gravity = ForgetGravity;
+       xfi->attribs.win_gravity = StaticGravity;
+
+       if (xfi->instance->settings->window_title != NULL)
+       {
+               win_title = xstrdup(xfi->instance->settings->window_title);
+       }
+       else if (xfi->instance->settings->port == 3389)
+       {
+               win_title = xmalloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->hostname));
+               sprintf(win_title, "FreeRDP: %s", xfi->instance->settings->hostname);
+       }
+       else
+       {
+               win_title = xmalloc(1 + sizeof("FreeRDP: ") + strlen(xfi->instance->settings->hostname) + sizeof(":00000"));
+               sprintf(win_title, "FreeRDP: %s:%i", xfi->instance->settings->hostname, xfi->instance->settings->port);
+       }
+
+       xfi->window = xf_CreateDesktopWindow(xfi, win_title, width, height, xfi->decorations);
+       xfree(win_title);
+
+       if (xfi->parent_window)
+               XReparentWindow(xfi->display, xfi->window->handle, xfi->parent_window, 0, 0);
+
+       if (xfi->fullscreen)
+               xf_SetWindowFullscreen(xfi, xfi->window, xfi->fullscreen);
+
+       /* wait for VisibilityNotify */
+       do
+       {
+               XMaskEvent(xfi->display, VisibilityChangeMask, &xevent);
+       }
+       while (xevent.type != VisibilityNotify);
+
+       xfi->unobscured = (xevent.xvisibility.state == VisibilityUnobscured);
+
+       XSetWMProtocols(xfi->display, xfi->window->handle, &(xfi->WM_DELETE_WINDOW), 1);
+       xfi->drawable = xfi->window->handle;
+}
+
+void xf_toggle_fullscreen(xfInfo* xfi)
+{
+       Pixmap contents = 0;
+
+       contents = XCreatePixmap(xfi->display, xfi->window->handle, xfi->width, xfi->height, xfi->depth);
+       XCopyArea(xfi->display, xfi->primary, contents, xfi->gc, 0, 0, xfi->width, xfi->height, 0, 0);
+
+       XDestroyWindow(xfi->display, xfi->window->handle);
+       xfi->fullscreen = (xfi->fullscreen) ? false : true;
+       xf_create_window(xfi);
+
+       XCopyArea(xfi->display, contents, xfi->primary, xfi->gc, 0, 0, xfi->width, xfi->height, 0, 0);
+       XFreePixmap(xfi->display, contents);
+}
+
+boolean xf_get_pixmap_info(xfInfo* xfi)
+{
+       int i;
+       int vi_count;
+       int pf_count;
+       XVisualInfo* vi;
+       XVisualInfo* vis;
+       XVisualInfo template;
+       XPixmapFormatValues* pf;
+       XPixmapFormatValues* pfs;
+
+       pfs = XListPixmapFormats(xfi->display, &pf_count);
+
+       if (pfs == NULL)
+       {
+               printf("xf_get_pixmap_info: XListPixmapFormats failed\n");
+               return 1;
+       }
+
+       for (i = 0; i < pf_count; i++)
+       {
+               pf = pfs + i;
+
+               if (pf->depth == xfi->depth)
+               {
+                       xfi->bpp = pf->bits_per_pixel;
+                       xfi->scanline_pad = pf->scanline_pad;
+                       break;
+               }
+       }
+       XFree(pfs);
+
+       memset(&template, 0, sizeof(template));
+       template.class = TrueColor;
+       template.screen = xfi->screen_number;
+
+       vis = XGetVisualInfo(xfi->display, VisualClassMask | VisualScreenMask, &template, &vi_count);
+
+       if (vis == NULL)
+       {
+               printf("xf_get_pixmap_info: XGetVisualInfo failed\n");
+               return false;
+       }
+
+       vi = NULL;
+       for (i = 0; i < vi_count; i++)
+       {
+               vi = vis + i;
+
+               if (vi->depth == xfi->depth)
+               {
+                       xfi->visual = vi->visual;
+                       break;
+               }
+       }
+
+       if (vi)
+       {
+               /*
+                * Detect if the server visual has an inverted colormap
+                * (BGR vs RGB, or red being the least significant byte)
+                */
+
+               if (vi->red_mask & 0xFF) 
+               {
+                       xfi->clrconv->invert = true;
+               }
+       }
+
+       XFree(vis);
+
+       if ((xfi->visual == NULL) || (xfi->scanline_pad == 0))
+       {
+               return false;
+       }
+
+       return true;
+}
+
+static int (*_def_error_handler)(Display*, XErrorEvent*);
+int xf_error_handler(Display* d, XErrorEvent* ev)
+{
+       char buf[256];
+       int do_abort = true;
+
+       XGetErrorText(d, ev->error_code, buf, sizeof(buf));
+       printf("%s", buf);
+
+       if (do_abort)
+               abort();
+
+       _def_error_handler(d, ev);
+
+       return false;
+}
+
+int _xf_error_handler(Display* d, XErrorEvent* ev)
+{
+       /*
+        * ungrab the keyboard, in case a debugger is running in
+        * another window. This make xf_error_handler() a potential
+        * debugger breakpoint.
+        */
+       XUngrabKeyboard(d, CurrentTime);
+       return xf_error_handler(d, ev);
+}
+
+boolean xf_pre_connect(freerdp* instance)
+{
+       xfInfo* xfi;
+       boolean bitmap_cache;
+       rdpSettings* settings;
+       int arg_parse_result;
+       
+       xfi = (xfInfo*) xzalloc(sizeof(xfInfo));
+       ((xfContext*) instance->context)->xfi = xfi;
+
+       xfi->_context = instance->context;
+       xfi->context = (xfContext*) instance->context;
+       xfi->context->settings = instance->settings;
+       xfi->instance = instance;
+       
+       arg_parse_result = freerdp_parse_args(instance->settings, instance->context->argc,instance->context->argv,
+                               xf_process_plugin_args, instance->context->channels, xf_process_client_args, xfi);
+       
+       if (arg_parse_result < 0)
+       {
+               if (arg_parse_result == FREERDP_ARGS_PARSE_FAILURE)
+                       printf("failed to parse arguments.\n");
+               
+               exit(XF_EXIT_PARSE_ARGUMENTS);
+       }
+
+       settings = instance->settings;
+       bitmap_cache = settings->bitmap_cache;
+
+       settings->os_major_type = OSMAJORTYPE_UNIX;
+       settings->os_minor_type = OSMINORTYPE_NATIVE_XSERVER;
+       settings->order_support[NEG_DSTBLT_INDEX] = true;
+       settings->order_support[NEG_PATBLT_INDEX] = true;
+       settings->order_support[NEG_SCRBLT_INDEX] = true;
+       settings->order_support[NEG_OPAQUE_RECT_INDEX] = true;
+       settings->order_support[NEG_DRAWNINEGRID_INDEX] = false;
+       settings->order_support[NEG_MULTIDSTBLT_INDEX] = false;
+       settings->order_support[NEG_MULTIPATBLT_INDEX] = false;
+       settings->order_support[NEG_MULTISCRBLT_INDEX] = false;
+       settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = true;
+       settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = false;
+       settings->order_support[NEG_LINETO_INDEX] = true;
+       settings->order_support[NEG_POLYLINE_INDEX] = true;
+       settings->order_support[NEG_MEMBLT_INDEX] = bitmap_cache;
+       settings->order_support[NEG_MEM3BLT_INDEX] = false;
+       settings->order_support[NEG_MEMBLT_V2_INDEX] = bitmap_cache;
+       settings->order_support[NEG_MEM3BLT_V2_INDEX] = false;
+       settings->order_support[NEG_SAVEBITMAP_INDEX] = false;
+       settings->order_support[NEG_GLYPH_INDEX_INDEX] = true;
+       settings->order_support[NEG_FAST_INDEX_INDEX] = true;
+       settings->order_support[NEG_FAST_GLYPH_INDEX] = true;
+       settings->order_support[NEG_POLYGON_SC_INDEX] = false;
+       settings->order_support[NEG_POLYGON_CB_INDEX] = false;
+       settings->order_support[NEG_ELLIPSE_SC_INDEX] = false;
+       settings->order_support[NEG_ELLIPSE_CB_INDEX] = false;
+
+       freerdp_channels_pre_connect(xfi->_context->channels, instance);
+
+       xfi->display = XOpenDisplay(NULL);
+
+       if (xfi->display == NULL)
+       {
+               printf("xf_pre_connect: failed to open display: %s\n", XDisplayName(NULL));
+               printf("Please check that the $DISPLAY environment variable is properly set.\n");
+               return false;
+       }
+
+       if (xfi->debug)
+       {
+               printf("Enabling X11 debug mode.\n");
+               XSynchronize(xfi->display, true);
+               _def_error_handler = XSetErrorHandler(_xf_error_handler);
+       }
+
+       xfi->_NET_WM_ICON = XInternAtom(xfi->display, "_NET_WM_ICON", False);
+       xfi->_MOTIF_WM_HINTS = XInternAtom(xfi->display, "_MOTIF_WM_HINTS", False);
+       xfi->_NET_CURRENT_DESKTOP = XInternAtom(xfi->display, "_NET_CURRENT_DESKTOP", False);
+       xfi->_NET_WORKAREA = XInternAtom(xfi->display, "_NET_WORKAREA", False);
+       xfi->_NET_WM_STATE = XInternAtom(xfi->display, "_NET_WM_STATE", False);
+       xfi->_NET_WM_STATE_FULLSCREEN = XInternAtom(xfi->display, "_NET_WM_STATE_FULLSCREEN", False);
+       xfi->_NET_WM_WINDOW_TYPE = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE", False);
+
+       xfi->_NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_NORMAL", False);
+       xfi->_NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_DIALOG", False);
+       xfi->_NET_WM_WINDOW_TYPE_POPUP= XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_POPUP", False);
+       xfi->_NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_UTILITY", False);
+       xfi->_NET_WM_WINDOW_TYPE_DROPDOWN_MENU = XInternAtom(xfi->display, "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", False);
+       xfi->_NET_WM_STATE_SKIP_TASKBAR = XInternAtom(xfi->display, "_NET_WM_STATE_SKIP_TASKBAR", False);
+       xfi->_NET_WM_STATE_SKIP_PAGER = XInternAtom(xfi->display, "_NET_WM_STATE_SKIP_PAGER", False);
+       xfi->_NET_WM_MOVERESIZE = XInternAtom(xfi->display, "_NET_WM_MOVERESIZE", False);
+       xfi->_NET_MOVERESIZE_WINDOW = XInternAtom(xfi->display, "_NET_MOVERESIZE_WINDOW", False);
+
+       xfi->WM_PROTOCOLS = XInternAtom(xfi->display, "WM_PROTOCOLS", False);
+       xfi->WM_DELETE_WINDOW = XInternAtom(xfi->display, "WM_DELETE_WINDOW", False);
+
+       xf_kbd_init(xfi);
+
+       xfi->clrconv = freerdp_clrconv_new(CLRCONV_ALPHA);
+
+       instance->context->cache = cache_new(instance->settings);
+
+       xfi->xfds = ConnectionNumber(xfi->display);
+       xfi->screen_number = DefaultScreen(xfi->display);
+       xfi->screen = ScreenOfDisplay(xfi->display, xfi->screen_number);
+       xfi->depth = DefaultDepthOfScreen(xfi->screen);
+       xfi->big_endian = (ImageByteOrder(xfi->display) == MSBFirst);
+
+       xfi->mouse_motion = settings->mouse_motion;
+       xfi->complex_regions = true;
+       xfi->decorations = settings->decorations;
+       xfi->fullscreen = settings->fullscreen;
+       xfi->grab_keyboard = settings->grab_keyboard;
+       xfi->fullscreen_toggle = true;
+       xfi->sw_gdi = settings->sw_gdi;
+       xfi->parent_window = (Window) settings->parent_window_xid;
+
+       xf_detect_monitors(xfi, settings);
+
+       return true;
+}
+
+void cpuid(unsigned info, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
+{
+#ifdef __GNUC__
+#if defined(__i386__) || defined(__x86_64__)
+       *eax = info;
+       __asm volatile
+               ("mov %%ebx, %%edi;" /* 32bit PIC: don't clobber ebx */
+                "cpuid;"
+                "mov %%ebx, %%esi;"
+                "mov %%edi, %%ebx;"
+                :"+a" (*eax), "=S" (*ebx), "=c" (*ecx), "=d" (*edx)
+                : :"edi");
+#endif
+#endif
+}
+uint32 xf_detect_cpu()
+{
+       unsigned int eax, ebx, ecx, edx = 0;
+       uint32 cpu_opt = 0;
+
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+
+       if (edx & (1<<26)) 
+       {
+               DEBUG("SSE2 detected");
+               cpu_opt |= CPU_SSE2;
+       }
+
+       return cpu_opt;
+}
+
+boolean xf_post_connect(freerdp* instance)
+{
+       xfInfo* xfi;
+       XGCValues gcv;
+       rdpCache* cache;
+       rdpChannels* channels;
+       RFX_CONTEXT* rfx_context = NULL;
+
+       xfi = ((xfContext*) instance->context)->xfi;
+       cache = instance->context->cache;
+       channels = xfi->_context->channels;
+
+       if (xf_get_pixmap_info(xfi) != true)
+               return false;
+
+       xf_register_graphics(instance->context->graphics);
+
+       if (xfi->sw_gdi)
+       {
+               rdpGdi* gdi;
+               uint32 flags;
+
+               flags = CLRCONV_ALPHA;
+
+               if (xfi->bpp > 16)
+                       flags |= CLRBUF_32BPP;
+               else
+                       flags |= CLRBUF_16BPP;
+
+               gdi_init(instance, flags, NULL);
+               gdi = instance->context->gdi;
+               xfi->primary_buffer = gdi->primary_buffer;
+
+               rfx_context = gdi->rfx_context;
+       }
+       else
+       {
+               xfi->srcBpp = instance->settings->color_depth;
+               xf_gdi_register_update_callbacks(instance->update);
+
+               xfi->hdc = gdi_CreateDC(xfi->clrconv, xfi->bpp);
+
+               if (instance->settings->rfx_codec)
+               {
+                       rfx_context = (void*) rfx_context_new();
+                       xfi->rfx_context = rfx_context;
+               }
+
+               if (instance->settings->ns_codec)
+                       xfi->nsc_context = (void*) nsc_context_new();
+       }
+
+       if (rfx_context)
+       {
+#ifdef WITH_SSE2
+               /* detect only if needed */
+               rfx_context_set_cpu_opt(rfx_context, xf_detect_cpu());
+#endif
+       }
+
+       xfi->width = instance->settings->width;
+       xfi->height = instance->settings->height;
+
+       xf_create_window(xfi);
+
+       memset(&gcv, 0, sizeof(gcv));
+       xfi->modifier_map = XGetModifierMapping(xfi->display);
+
+       xfi->gc = XCreateGC(xfi->display, xfi->drawable, GCGraphicsExposures, &gcv);
+       xfi->primary = XCreatePixmap(xfi->display, xfi->drawable, xfi->width, xfi->height, xfi->depth);
+       xfi->drawing = xfi->primary;
+
+       xfi->bitmap_mono = XCreatePixmap(xfi->display, xfi->drawable, 8, 8, 1);
+       xfi->gc_mono = XCreateGC(xfi->display, xfi->bitmap_mono, GCGraphicsExposures, &gcv);
+
+       XSetForeground(xfi->display, xfi->gc, BlackPixelOfScreen(xfi->screen));
+       XFillRectangle(xfi->display, xfi->primary, xfi->gc, 0, 0, xfi->width, xfi->height);
+
+       xfi->image = XCreateImage(xfi->display, xfi->visual, xfi->depth, ZPixmap, 0,
+                       (char*) xfi->primary_buffer, xfi->width, xfi->height, xfi->scanline_pad, 0);
+
+       xfi->bmp_codec_none = (uint8*) xmalloc(64 * 64 * 4);
+
+       if (xfi->sw_gdi)
+       {
+               instance->update->BeginPaint = xf_sw_begin_paint;
+               instance->update->EndPaint = xf_sw_end_paint;
+               instance->update->DesktopResize = xf_sw_desktop_resize;
+       }
+       else
+       {
+               instance->update->BeginPaint = xf_hw_begin_paint;
+               instance->update->EndPaint = xf_hw_end_paint;
+               instance->update->DesktopResize = xf_hw_desktop_resize;
+       }
+
+       pointer_cache_register_callbacks(instance->update);
+
+       if (xfi->sw_gdi != true)
+       {
+               glyph_cache_register_callbacks(instance->update);
+               brush_cache_register_callbacks(instance->update);
+               bitmap_cache_register_callbacks(instance->update);
+               offscreen_cache_register_callbacks(instance->update);
+               palette_cache_register_callbacks(instance->update);
+       }
+
+       instance->context->rail = rail_new(instance->settings);
+       rail_register_update_callbacks(instance->context->rail, instance->update);
+       xf_rail_register_callbacks(xfi, instance->context->rail);
+
+       freerdp_channels_post_connect(channels, instance);
+
+       xf_tsmf_init(xfi, xv_port);
+
+       xf_cliprdr_init(xfi, channels);
+
+       return true;
+}
+
+boolean xf_authenticate(freerdp* instance, char** username, char** password, char** domain)
+{
+       *password = xmalloc(password_size * sizeof(char));
+
+       if (freerdp_passphrase_read("Password: ", *password, password_size) == NULL)
+               return false;
+
+       return true;
+}
+
+boolean xf_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint)
+{
+       char answer;
+
+       printf("Certificate details:\n");
+       printf("\tSubject: %s\n", subject);
+       printf("\tIssuer: %s\n", issuer);
+       printf("\tThumbprint: %s\n", fingerprint);
+       printf("The above X.509 certificate could not be verified, possibly because you do not have "
+               "the CA certificate in your certificate store, or the certificate has expired. "
+               "Please look at the documentation on how to create local certificate store for a private CA.\n");
+
+       while (1)
+       {
+               printf("Do you trust the above certificate? (Y/N) ");
+               answer = fgetc(stdin);
+
+               if (answer == 'y' || answer == 'Y')
+               {
+                       return true;
+               }
+               else if (answer == 'n' || answer == 'N')
+               {
+                       break;
+               }
+               printf("\n");
+       }
+
+       return false;
+}
+
+int xf_process_client_args(rdpSettings* settings, const char* opt, const char* val, void* user_data)
+{
+       int argc = 0;
+       xfInfo* xfi = (xfInfo*) user_data;
+
+       if (strcmp("--kbd-list", opt) == 0)
+       {
+               int i;
+               rdpKeyboardLayout* layouts;
+
+               layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD);
+               printf("\nKeyboard Layouts\n");
+               for (i = 0; layouts[i].code; i++)
+                       printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name);
+               free(layouts);
+
+               layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT);
+               printf("\nKeyboard Layout Variants\n");
+               for (i = 0; layouts[i].code; i++)
+                       printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name);
+               free(layouts);
+
+               layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME);
+               printf("\nKeyboard Input Method Editors (IMEs)\n");
+               for (i = 0; layouts[i].code; i++)
+                       printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name);
+               free(layouts);
+
+               exit(0);
+       }
+       else if (strcmp("--xv-port", opt) == 0)
+       {
+               xv_port = atoi(val);
+               argc = 2;
+       }
+       else if (strcmp("--dbg-x11", opt) == 0)
+       {
+               xfi->debug = true;
+               argc = 1;
+       }
+
+       return argc;
+}
+
+int xf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data)
+{
+       rdpChannels* channels = (rdpChannels*) user_data;
+
+       printf("loading plugin %s\n", name);
+       freerdp_channels_load_plugin(channels, settings, name, plugin_data);
+
+       return 1;
+}
+
+int xf_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size)
+{
+       return freerdp_channels_data(instance, channelId, data, size, flags, total_size);
+}
+
+void xf_process_channel_event(rdpChannels* chanman, freerdp* instance)
+{
+       xfInfo* xfi;
+       RDP_EVENT* event;
+
+       xfi = ((xfContext*) instance->context)->xfi;
+
+       event = freerdp_channels_pop_event(chanman);
+
+       if (event)
+       {
+               switch (event->event_class)
+               {
+                       case RDP_EVENT_CLASS_RAIL:
+                               xf_process_rail_event(xfi, chanman, event);
+                               break;
+
+                       case RDP_EVENT_CLASS_TSMF:
+                               xf_process_tsmf_event(xfi, event);
+                               break;
+
+                       case RDP_EVENT_CLASS_CLIPRDR:
+                               xf_process_cliprdr_event(xfi, event);
+                               break;
+
+                       default:
+                               break;
+               }
+
+               freerdp_event_free(event);
+       }
+}
+
+void xf_window_free(xfInfo* xfi)
+{
+       rdpContext* context = xfi->instance->context;
+
+       XFreeModifiermap(xfi->modifier_map);
+       xfi->modifier_map = 0;
+
+       XFreeGC(xfi->display, xfi->gc);
+       xfi->gc = 0;
+
+       XFreeGC(xfi->display, xfi->gc_mono);
+       xfi->gc_mono = 0;
+
+       if (xfi->window != NULL)
+       {
+               xf_DestroyWindow(xfi, xfi->window);
+               xfi->window = NULL;
+       }
+
+       if (xfi->primary)
+       {
+               XFreePixmap(xfi->display, xfi->primary);
+               xfi->primary = 0;
+       }
+
+       if (xfi->image)
+       {
+               xfi->image->data = NULL;
+               XDestroyImage(xfi->image);
+               xfi->image = NULL;
+       }
+
+       if (context != NULL)
+       {
+                       cache_free(context->cache);
+                       context->cache = NULL;
+
+                       rail_free(context->rail);
+                       context->rail = NULL;
+       }
+
+       if (xfi->rfx_context) 
+       {
+               rfx_context_free(xfi->rfx_context);
+               xfi->rfx_context = NULL;
+       }
+
+       freerdp_clrconv_free(xfi->clrconv);
+
+       if (xfi->hdc)
+               gdi_DeleteDC(xfi->hdc);
+
+       xf_tsmf_uninit(xfi);
+       xf_cliprdr_uninit(xfi);
+}
+
+void xf_free(xfInfo* xfi)
+{
+       xf_window_free(xfi);
+
+       xfree(xfi->bmp_codec_none);
+
+       XCloseDisplay(xfi->display);
+
+       xfree(xfi);
+}
+
+int xfreerdp_run(freerdp* instance)
+{
+       int i;
+       int fds;
+       xfInfo* xfi;
+       int max_fds;
+       int rcount;
+       int wcount;
+       int ret = 0;
+       void* rfds[32];
+       void* wfds[32];
+       fd_set rfds_set;
+       fd_set wfds_set;
+       int select_status;
+       rdpChannels* channels;
+       struct timeval timeout;
+
+       memset(rfds, 0, sizeof(rfds));
+       memset(wfds, 0, sizeof(wfds));
+       memset(&timeout, 0, sizeof(struct timeval));
+
+       if (!freerdp_connect(instance))
+               return XF_EXIT_CONN_FAILED;
+
+       xfi = ((xfContext*) instance->context)->xfi;
+       channels = instance->context->channels;
+
+       while (!xfi->disconnect && !freerdp_shall_disconnect(instance))
+       {
+               rcount = 0;
+               wcount = 0;
+
+               if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       ret = XF_EXIT_CONN_FAILED;
+                       break;
+               }
+               if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get channel manager file descriptor\n");
+                       ret = XF_EXIT_CONN_FAILED;
+                       break;
+               }
+               if (xf_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get xfreerdp file descriptor\n");
+                       ret = XF_EXIT_CONN_FAILED;
+                       break;
+               }
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+               FD_ZERO(&wfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               timeout.tv_sec = 5;
+               select_status = select(max_fds + 1, &rfds_set, &wfds_set, NULL, &timeout);
+
+               if (select_status == 0)
+               {
+                       //freerdp_send_keep_alive(instance);
+                       continue;
+               }
+               else if (select_status == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("xfreerdp_run: select failed\n");
+                               break;
+                       }
+               }
+
+               if (freerdp_check_fds(instance) != true)
+               {
+                       printf("Failed to check FreeRDP file descriptor\n");
+                       break;
+               }
+               if (xf_check_fds(instance, &rfds_set) != true)
+               {
+                       printf("Failed to check xfreerdp file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_check_fds(channels, instance) != true)
+               {
+                       printf("Failed to check channel manager file descriptor\n");
+                       break;
+               }
+               xf_process_channel_event(channels, instance);
+       }
+
+       if (!ret)
+               ret = freerdp_error_info(instance);
+
+       freerdp_channels_close(channels, instance);
+       freerdp_channels_free(channels);
+       freerdp_disconnect(instance);
+       gdi_free(instance);
+       xf_free(xfi);
+
+       freerdp_free(instance);
+
+       return ret;
+}
+
+void* thread_func(void* param)
+{
+       struct thread_data* data;
+       data = (struct thread_data*) param;
+
+       g_disconnect_reason = xfreerdp_run(data->instance);
+
+       xfree(data);
+
+       pthread_detach(pthread_self());
+
+       g_thread_count--;
+
+        if (g_thread_count < 1)
+                freerdp_sem_signal(g_sem);
+
+       pthread_exit(NULL);
+}
+
+static uint8 exit_code_from_disconnect_reason(uint32 reason)
+{
+       if (reason == 0 ||
+          (reason >= XF_EXIT_PARSE_ARGUMENTS && reason <= XF_EXIT_CONN_FAILED))
+                return reason;
+
+       /* Licence error set */
+       else if (reason >= 0x100 && reason <= 0x10A)
+                reason -= 0x100 + XF_EXIT_LICENSE_INTERNAL;
+
+       /* RDP protocol error set */
+       else if (reason >= 0x10c9 && reason <= 0x1193)
+                reason = XF_EXIT_RDP;
+
+       /* There's no need to test protocol-independent codes: they match */
+       else if (!(reason <= 0xB))
+                reason = XF_EXIT_UNKNOWN;
+
+       return reason;
+}
+
+int main(int argc, char* argv[])
+{
+       pthread_t thread;
+       freerdp* instance;
+       struct thread_data* data;
+
+       freerdp_handle_signals();
+
+       setlocale(LC_ALL, "");
+
+       freerdp_channels_global_init();
+
+       g_sem = freerdp_sem_new(1);
+
+       instance = freerdp_new();
+       instance->PreConnect = xf_pre_connect;
+       instance->PostConnect = xf_post_connect;
+       instance->Authenticate = xf_authenticate;
+       instance->VerifyCertificate = xf_verify_certificate;
+       instance->ReceiveChannelData = xf_receive_channel_data;
+
+       instance->context_size = sizeof(xfContext);
+       instance->ContextNew = (pContextNew) xf_context_new;
+       instance->ContextFree = (pContextFree) xf_context_free;
+       freerdp_context_new(instance);
+
+       instance->context->argc = argc;
+       instance->context->argv = argv;
+       instance->settings->sw_gdi = false;
+
+       data = (struct thread_data*) xzalloc(sizeof(struct thread_data));
+       data->instance = instance;
+
+       g_thread_count++;
+       pthread_create(&thread, 0, thread_func, data);
+
+       while (g_thread_count > 0)
+       {
+                freerdp_sem_wait(g_sem);
+       }
+
+       freerdp_channels_global_uninit();
+
+       return exit_code_from_disconnect_reason(g_disconnect_reason);
+}
diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h
new file mode 100644 (file)
index 0000000..88850ca
--- /dev/null
@@ -0,0 +1,215 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Client
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XFREERDP_H
+#define __XFREERDP_H
+
+#include <freerdp/freerdp.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/gdi/dc.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/rail/rail.h>
+#include <freerdp/cache/cache.h>
+
+typedef struct xf_info xfInfo;
+
+#include "xf_window.h"
+#include "xf_monitor.h"
+
+struct xf_WorkArea
+{
+       uint32 x;
+       uint32 y;
+       uint32 width;
+       uint32 height;
+};
+typedef struct xf_WorkArea xfWorkArea;
+
+struct xf_pointer
+{
+       rdpPointer pointer;
+       Cursor cursor;
+};
+typedef struct xf_pointer xfPointer;
+
+struct xf_bitmap
+{
+       rdpBitmap bitmap;
+       Pixmap pixmap;
+};
+typedef struct xf_bitmap xfBitmap;
+
+struct xf_glyph
+{
+       rdpGlyph glyph;
+       Pixmap pixmap;
+};
+typedef struct xf_glyph xfGlyph;
+
+struct xf_context
+{
+       rdpContext _p;
+
+       xfInfo* xfi;
+       rdpSettings* settings;
+};
+typedef struct xf_context xfContext;
+
+struct xf_info
+{
+       freerdp* instance;
+       xfContext* context;
+       rdpContext* _context;
+
+       GC gc;
+       int bpp;
+       int xfds;
+       int depth;
+       int width;
+       int height;
+       int srcBpp;
+       GC gc_mono;
+       Screen* screen;
+       XImage* image;
+       Pixmap primary;
+       Pixmap drawing;
+       Visual* visual;
+       Display* display;
+       Drawable drawable;
+       Pixmap bitmap_mono;
+       Colormap colormap;
+       int screen_number;
+       int scanline_pad;
+       boolean big_endian;
+       boolean fullscreen;
+       boolean grab_keyboard;
+       boolean unobscured;
+       boolean decorations;
+       boolean debug;
+       xfWindow* window;
+       xfWorkArea workArea;
+       int current_desktop;
+       boolean remote_app;
+       boolean disconnect;
+       HCLRCONV clrconv;
+       Window parent_window;
+
+       HGDI_DC hdc;
+       boolean sw_gdi;
+       uint8* primary_buffer;
+
+       boolean focused;
+       boolean mouse_active;
+       boolean mouse_motion;
+       boolean fullscreen_toggle;
+       uint32 keyboard_layout_id;
+       boolean pressed_keys[256];
+       XModifierKeymap* modifier_map;
+       XSetWindowAttributes attribs;
+       boolean complex_regions;
+       VIRTUAL_SCREEN vscreen;
+       uint8* bmp_codec_none;
+       uint8* bmp_codec_nsc;
+       void* rfx_context;
+       void* nsc_context;
+       void* xv_context;
+       void* clipboard_context;
+
+       Atom _NET_WM_ICON;
+       Atom _MOTIF_WM_HINTS;
+       Atom _NET_CURRENT_DESKTOP;
+       Atom _NET_WORKAREA;
+
+       Atom _NET_WM_STATE;
+       Atom _NET_WM_STATE_FULLSCREEN;
+       Atom _NET_WM_STATE_SKIP_TASKBAR;
+       Atom _NET_WM_STATE_SKIP_PAGER;
+
+       Atom _NET_WM_WINDOW_TYPE;
+       Atom _NET_WM_WINDOW_TYPE_NORMAL;
+       Atom _NET_WM_WINDOW_TYPE_DIALOG;
+       Atom _NET_WM_WINDOW_TYPE_UTILITY;
+       Atom _NET_WM_WINDOW_TYPE_POPUP;
+       Atom _NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
+
+       Atom _NET_WM_MOVERESIZE;
+       Atom _NET_MOVERESIZE_WINDOW;
+
+       Atom WM_PROTOCOLS;
+       Atom WM_DELETE_WINDOW;
+};
+
+void xf_toggle_fullscreen(xfInfo* xfi);
+boolean xf_post_connect(freerdp* instance);
+
+enum XF_EXIT_CODE
+{
+       /* section 0-15: protocol-independent codes */
+       XF_EXIT_SUCCESS = 0,
+       XF_EXIT_DISCONNECT = 1,
+       XF_EXIT_LOGOFF = 2,
+       XF_EXIT_IDLE_TIMEOUT = 3,
+       XF_EXIT_LOGON_TIMEOUT = 4,
+       XF_EXIT_CONN_REPLACED = 5,
+       XF_EXIT_OUT_OF_MEMORY = 6,
+       XF_EXIT_CONN_DENIED = 7,
+       XF_EXIT_CONN_DENIED_FIPS = 8,
+       XF_EXIT_USER_PRIVILEGES = 9,
+       XF_EXIT_FRESH_CREDENTIALS_REQUIRED = 10,
+       XF_EXIT_DISCONNECT_BY_USER = 11,
+
+       /* section 16-31: license error set */
+       XF_EXIT_LICENSE_INTERNAL = 16,
+       XF_EXIT_LICENSE_NO_LICENSE_SERVER = 17,
+       XF_EXIT_LICENSE_NO_LICENSE = 18,
+       XF_EXIT_LICENSE_BAD_CLIENT_MSG = 19,
+       XF_EXIT_LICENSE_HWID_DOESNT_MATCH = 20,
+       XF_EXIT_LICENSE_BAD_CLIENT = 21,
+       XF_EXIT_LICENSE_CANT_FINISH_PROTOCOL = 22,
+       XF_EXIT_LICENSE_CLIENT_ENDED_PROTOCOL = 23,
+       XF_EXIT_LICENSE_BAD_CLIENT_ENCRYPTION = 24,
+       XF_EXIT_LICENSE_CANT_UPGRADE = 25,
+       XF_EXIT_LICENSE_NO_REMOTE_CONNECTIONS = 26,
+
+       /* section 32-127: RDP protocol error set */
+       XF_EXIT_RDP = 32,
+
+       /* section 128-254: xfreerdp specific exit codes */
+       XF_EXIT_PARSE_ARGUMENTS = 128,
+       XF_EXIT_MEMORY = 129,
+       XF_EXIT_PROTOCOL = 130,
+       XF_EXIT_CONN_FAILED = 131,
+
+       XF_EXIT_UNKNOWN = 255,
+};
+
+#ifdef WITH_DEBUG_X11
+#define DEBUG_X11(fmt, ...) DEBUG_CLASS(X11, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_X11(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#ifdef WITH_DEBUG_X11_LOCAL_MOVESIZE
+#define DEBUG_X11_LMS(fmt, ...) DEBUG_CLASS(X11_LMS, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_X11_LMS(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __XFREERDP_H */
diff --git a/client/test/CMakeLists.txt b/client/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4a4f6fc
--- /dev/null
@@ -0,0 +1,26 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP Test UI cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+add_executable(freerdp-test
+       freerdp.c)
+
+target_link_libraries(freerdp-test freerdp-core)
+target_link_libraries(freerdp-test freerdp-gdi)
+target_link_libraries(freerdp-test freerdp-utils)
+target_link_libraries(freerdp-test freerdp-channels ${CMAKE_DL_LIBS})
diff --git a/client/test/freerdp.c b/client/test/freerdp.c
new file mode 100644 (file)
index 0000000..6c0a197
--- /dev/null
@@ -0,0 +1,338 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Test UI
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _WIN32
+#include <unistd.h>
+#include <pthread.h>
+#include <sys/select.h>
+#else
+#include <winsock2.h>
+#include <Windows.h>
+#include <ws2tcpip.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/utils/args.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/semaphore.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/constants.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/plugins/cliprdr.h>
+
+struct tf_info
+{
+       void* data;
+};
+typedef struct tf_info tfInfo;
+
+struct tf_context
+{
+       rdpContext _p;
+
+       tfInfo* tfi;
+};
+typedef struct tf_context tfContext;
+
+freerdp_sem g_sem;
+static int g_thread_count = 0;
+
+struct thread_data
+{
+       freerdp* instance;
+};
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/args.h>
+
+void tf_context_new(freerdp* instance, rdpContext* context)
+{
+       context->channels = freerdp_channels_new();
+}
+
+void tf_context_free(freerdp* instance, rdpContext* context)
+{
+
+}
+
+void tf_begin_paint(rdpContext* context)
+{
+       rdpGdi* gdi = context->gdi;
+       gdi->primary->hdc->hwnd->invalid->null = 1;
+}
+
+void tf_end_paint(rdpContext* context)
+{
+       rdpGdi* gdi = context->gdi;
+
+       if (gdi->primary->hdc->hwnd->invalid->null)
+               return;
+}
+
+int tf_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size)
+{
+       return freerdp_channels_data(instance, channelId, data, size, flags, total_size);
+}
+
+int tf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data)
+{
+       rdpChannels* channels = (rdpChannels*) user_data;
+
+       printf("Load plugin %s\n", name);
+       freerdp_channels_load_plugin(channels, settings, name, plugin_data);
+
+       return 1;
+}
+
+void tf_process_cb_monitor_ready_event(rdpChannels* channels, freerdp* instance)
+{
+       RDP_EVENT* event;
+       RDP_CB_FORMAT_LIST_EVENT* format_list_event;
+
+       event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_FORMAT_LIST, NULL, NULL);
+
+       format_list_event = (RDP_CB_FORMAT_LIST_EVENT*) event;
+       format_list_event->num_formats = 0;
+
+       freerdp_channels_send_event(channels, event);
+}
+
+void tf_process_channel_event(rdpChannels* channels, freerdp* instance)
+{
+       RDP_EVENT* event;
+
+       event = freerdp_channels_pop_event(channels);
+
+       if (event)
+       {
+               switch (event->event_type)
+               {
+                       case RDP_EVENT_TYPE_CB_MONITOR_READY:
+                               tf_process_cb_monitor_ready_event(channels, instance);
+                               break;
+                       default:
+                               printf("tf_process_channel_event: unknown event type %d\n", event->event_type);
+                               break;
+               }
+
+               freerdp_event_free(event);
+       }
+}
+
+boolean tf_pre_connect(freerdp* instance)
+{
+       tfInfo* tfi;
+       tfContext* context;
+       rdpSettings* settings;
+
+       context = (tfContext*) instance->context;
+       tfi = (tfInfo*) xzalloc(sizeof(tfInfo));
+       context->tfi = tfi;
+
+       settings = instance->settings;
+
+       settings->order_support[NEG_DSTBLT_INDEX] = true;
+       settings->order_support[NEG_PATBLT_INDEX] = true;
+       settings->order_support[NEG_SCRBLT_INDEX] = true;
+       settings->order_support[NEG_OPAQUE_RECT_INDEX] = true;
+       settings->order_support[NEG_DRAWNINEGRID_INDEX] = true;
+       settings->order_support[NEG_MULTIDSTBLT_INDEX] = true;
+       settings->order_support[NEG_MULTIPATBLT_INDEX] = true;
+       settings->order_support[NEG_MULTISCRBLT_INDEX] = true;
+       settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = true;
+       settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = true;
+       settings->order_support[NEG_LINETO_INDEX] = true;
+       settings->order_support[NEG_POLYLINE_INDEX] = true;
+       settings->order_support[NEG_MEMBLT_INDEX] = true;
+       settings->order_support[NEG_MEM3BLT_INDEX] = true;
+       settings->order_support[NEG_SAVEBITMAP_INDEX] = true;
+       settings->order_support[NEG_GLYPH_INDEX_INDEX] = true;
+       settings->order_support[NEG_FAST_INDEX_INDEX] = true;
+       settings->order_support[NEG_FAST_GLYPH_INDEX] = true;
+       settings->order_support[NEG_POLYGON_SC_INDEX] = true;
+       settings->order_support[NEG_POLYGON_CB_INDEX] = true;
+       settings->order_support[NEG_ELLIPSE_SC_INDEX] = true;
+       settings->order_support[NEG_ELLIPSE_CB_INDEX] = true;
+
+       freerdp_channels_pre_connect(instance->context->channels, instance);
+
+       return true;
+}
+
+boolean tf_post_connect(freerdp* instance)
+{
+       rdpGdi* gdi;
+
+       gdi_init(instance, CLRCONV_ALPHA | CLRCONV_INVERT | CLRBUF_16BPP | CLRBUF_32BPP, NULL);
+       gdi = instance->context->gdi;
+
+       instance->update->BeginPaint = tf_begin_paint;
+       instance->update->EndPaint = tf_end_paint;
+
+       freerdp_channels_post_connect(instance->context->channels, instance);
+
+       return true;
+}
+
+int tfreerdp_run(freerdp* instance)
+{
+       int i;
+       int fds;
+       int max_fds;
+       int rcount;
+       int wcount;
+       void* rfds[32];
+       void* wfds[32];
+       fd_set rfds_set;
+       fd_set wfds_set;
+       rdpChannels* channels;
+
+       memset(rfds, 0, sizeof(rfds));
+       memset(wfds, 0, sizeof(wfds));
+
+       channels = instance->context->channels;
+
+       freerdp_connect(instance);
+
+       while (1)
+       {
+               rcount = 0;
+               wcount = 0;
+
+               if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != true)
+               {
+                       printf("Failed to get channel manager file descriptor\n");
+                       break;
+               }
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               if (select(max_fds + 1, &rfds_set, &wfds_set, NULL, NULL) == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("tfreerdp_run: select failed\n");
+                               break;
+                       }
+               }
+
+               if (freerdp_check_fds(instance) != true)
+               {
+                       printf("Failed to check FreeRDP file descriptor\n");
+                       break;
+               }
+               if (freerdp_channels_check_fds(channels, instance) != true)
+               {
+                       printf("Failed to check channel manager file descriptor\n");
+                       break;
+               }
+               tf_process_channel_event(channels, instance);
+       }
+
+       freerdp_channels_close(channels, instance);
+       freerdp_channels_free(channels);
+       freerdp_free(instance);
+
+       return 0;
+}
+
+void* thread_func(void* param)
+{
+       struct thread_data* data;
+       data = (struct thread_data*) param;
+
+       tfreerdp_run(data->instance);
+
+       xfree(data);
+
+       pthread_detach(pthread_self());
+
+       g_thread_count--;
+
+        if (g_thread_count < 1)
+                freerdp_sem_signal(&g_sem);
+
+       return NULL;
+}
+
+int main(int argc, char* argv[])
+{
+       pthread_t thread;
+       freerdp* instance;
+       struct thread_data* data;
+       rdpChannels* channels;
+
+       freerdp_channels_global_init();
+
+       g_sem = freerdp_sem_new(1);
+
+       instance = freerdp_new();
+       instance->PreConnect = tf_pre_connect;
+       instance->PostConnect = tf_post_connect;
+       instance->ReceiveChannelData = tf_receive_channel_data;
+
+       instance->context_size = sizeof(tfContext);
+       instance->ContextNew = tf_context_new;
+       instance->ContextFree = tf_context_free;
+       freerdp_context_new(instance);
+
+       channels = instance->context->channels;
+       freerdp_parse_args(instance->settings, argc, argv, tf_process_plugin_args, channels, NULL, NULL);
+
+       data = (struct thread_data*) xzalloc(sizeof(struct thread_data));
+       data->instance = instance;
+
+       g_thread_count++;
+       pthread_create(&thread, 0, thread_func, data);
+
+       while (g_thread_count > 0)
+       {
+                freerdp_sem_wait(g_sem);
+       }
+
+       freerdp_channels_global_uninit();
+
+       return 0;
+}
diff --git a/cmake/AutoVersioning.cmake b/cmake/AutoVersioning.cmake
new file mode 100644 (file)
index 0000000..04e6479
--- /dev/null
@@ -0,0 +1,54 @@
+# - AutoVersioning
+# Gather version from tarball or SCM
+#
+#  This module defines the following variables:
+#     PRODUCT_VERSION    - Version of product
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+if(EXISTS "${CMAKE_SOURCE_DIR}/.version" )
+  file(READ ${CMAKE_SOURCE_DIR}/.version PRODUCT_VERSION)
+
+  string(STRIP ${PRODUCT_VERSION} PRODUCT_VERSION)
+else()
+  execute_process(COMMAND git describe --match "v[0-9]*" --abbrev=4
+                  OUTPUT_VARIABLE PRODUCT_VERSION
+                  OUTPUT_STRIP_TRAILING_WHITESPACE
+                  ERROR_QUIET)
+
+  if(PRODUCT_VERSION)
+       string(REGEX REPLACE "^v(.*)" "\\1" PRODUCT_VERSION ${PRODUCT_VERSION})
+  else()
+    # GIT is the default version
+    set(PRODUCT_VERSION GIT)
+  endif()
+
+  # Check if has not commited changes
+  execute_process(COMMAND git update-index -q --refresh)
+  execute_process(COMMAND git diff-index --name-only HEAD --
+                  OUTPUT_VARIABLE CHANGED_SOURCE
+                  OUTPUT_STRIP_TRAILING_WHITESPACE
+                  ERROR_QUIET)
+
+  if(CHANGED_SOURCE)
+    set(PRODUCT_VERSION ${PRODUCT_VERSION}-dirty)
+  endif()
+endif()
+
+message(STATUS "${CMAKE_PROJECT_NAME} ${PRODUCT_VERSION}")
diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake
new file mode 100644 (file)
index 0000000..995d7a8
--- /dev/null
@@ -0,0 +1,26 @@
+option(WITH_DEBUG_TRANSPORT "Print transport debug messages." OFF)
+option(WITH_DEBUG_CHANNELS "Print channel manager debug messages." OFF)
+option(WITH_DEBUG_SVC "Print static virtual channel debug messages." OFF)
+option(WITH_DEBUG_DVC "Print dynamic virtual channel debug messages." OFF)
+option(WITH_DEBUG_KBD "Print keyboard related debug messages." OFF)
+option(WITH_DEBUG_NLA "Print authentication related debug messages." OFF)
+option(WITH_DEBUG_NEGO "Print negotiation related debug messages." OFF)
+option(WITH_DEBUG_CERTIFICATE "Print certificate related debug messages." OFF)
+option(WITH_DEBUG_LICENSE "Print license debug messages." OFF)
+option(WITH_DEBUG_GDI "Print graphics debug messages." OFF)
+option(WITH_DEBUG_RFX "Print RemoteFX debug messages." OFF)
+option(WITH_DEBUG_X11 "Print X11 Client debug messages" OFF)
+option(WITH_DEBUG_X11_CLIPRDR "Print X11 clipboard redirection debug messages" OFF)
+option(WITH_DEBUG_X11_LOCAL_MOVESIZE "Print X11 Client local movesize debug messages" OFF)
+option(WITH_DEBUG_RAIL "Print RemoteApp debug messages" OFF)
+option(WITH_DEBUG_XV "Print XVideo debug messages" OFF)
+option(WITH_DEBUG_SCARD "Print smartcard debug messages" OFF)
+option(WITH_DEBUG_ORDERS "Print drawing orders debug messages" OFF)
+option(WITH_MANPAGES "Generate manpages." ON)
+option(WITH_PROFILER "Compile profiler." OFF)
+option(WITH_SSE2 "Use SSE2 optimization." OFF)
+option(WITH_SSE2_TARGET "Allow compiler to generate SSE2 instructions." OFF)
+option(WITH_DEBUG_REDIR "Redirection debug messages" OFF)
+option(WITH_DEBUG_CLIPRDR "Print clipboard redirection debug messages" OFF)
+option(WITH_DEBUG_WND "Print window order debug messages" OFF)
+option(WITH_NEON "Enable NEON optimization for rfx decoder" OFF)
diff --git a/cmake/FindCUnit.cmake b/cmake/FindCUnit.cmake
new file mode 100644 (file)
index 0000000..3e6b175
--- /dev/null
@@ -0,0 +1,47 @@
+# - Find CUnit
+# Find the CUnit libraries
+#
+#  This module defines the following variables:
+#     CUNIT_FOUND        - true if CUNIT_INCLUDE_DIR & CUNIT_LIBRARY are found
+#     CUNIT_LIBRARIES    - Set when CUNIT_LIBRARY is found
+#     CUNIT_INCLUDE_DIRS - Set when CUNIT_INCLUDE_DIR is found
+#
+#     CUNIT_INCLUDE_DIR  - where to find CUnit.h, etc.
+#     CUNIT_LIBRARY      - the cunit library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(CUNIT_INCLUDE_DIR NAMES CUnit.h
+          PATH_SUFFIXES CUnit
+          DOC "The CUnit include directory"
+)
+
+find_library(CUNIT_LIBRARY NAMES cunit
+          DOC "The CUnit library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(CUnit DEFAULT_MSG CUNIT_LIBRARY CUNIT_INCLUDE_DIR)
+
+if(CUNIT_FOUND)
+  set( CUNIT_LIBRARIES ${CUNIT_LIBRARY} )
+  set( CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(CUNIT_INCLUDE_DIR CUNIT_LIBRARY)
diff --git a/cmake/FindDirectFB.cmake b/cmake/FindDirectFB.cmake
new file mode 100644 (file)
index 0000000..6fe24ca
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find DirectFB
+# Find the DirectFB libraries
+#
+#  This module defines the following variables:
+#     DIRECTFB_FOUND        - true if DIRECTFB_INCLUDE_DIR & DIRECTFB_LIBRARY are found
+#     DIRECTFB_LIBRARIES    - Set when DIRECTFB_LIBRARY is found
+#     DIRECTFB_INCLUDE_DIRS - Set when DIRECTFB_INCLUDE_DIR is found
+#
+#     DIRECTFB_INCLUDE_DIR  - where to find CUnit.h, etc.
+#     DIRECTFB_LIBRARY      - the cunit library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(DIRECTFB_INCLUDE_DIR NAMES directfb.h
+          PATH_SUFFIXES directfb
+          DOC "The directfb include directory"
+)
+
+find_library(DIRECTFB_LIBRARY NAMES directfb
+          DOC "The DirectFB library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(DirectFB DEFAULT_MSG DIRECTFB_LIBRARY DIRECTFB_INCLUDE_DIR)
+
+if(DIRECTFB_FOUND)
+  set( DIRECTFB_LIBRARIES ${DIRECTFB_LIBRARY} )
+  set( DIRECTFB_INCLUDE_DIRS ${DIRECTFB_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(DIRECTFB_INCLUDE_DIR DIRECTFB_LIBRARY)
+
diff --git a/cmake/FindFFmpeg.cmake b/cmake/FindFFmpeg.cmake
new file mode 100644 (file)
index 0000000..9b2464e
--- /dev/null
@@ -0,0 +1,41 @@
+# - Try to find FFmpeg
+# Using Pkg-config if available for path
+#
+#  FFMPEG_FOUND        - all required ffmpeg components found on system
+#  FFMPEG_INCLUDE_DIRS  - combined include directories
+#  FFMPEG_LIBRARIES    - combined libraries to link
+
+include(FindPkgConfig)
+
+if (PKG_CONFIG_FOUND)
+       pkg_check_modules(AVCODEC libavcodec)
+       pkg_check_modules(AVUTIL libavutil)
+endif ( PKG_CONFIG_FOUND )
+
+# avcodec
+find_path(AVCODEC_INCLUDE_DIR avcodec.h PATHS ${AVCODEC_INCLUDE_DIRS}
+          PATH_SUFFIXES libavcodec )
+find_library(AVCODEC_LIBRARY avcodec PATHS ${AVCODEC_LIBRARY_DIRS})
+
+# avutil
+find_path(AVUTIL_INCLUDE_DIR avutil.h PATHS ${AVUTIL_INCLUDE_DIRS}
+          PATH_SUFFIXES libavutil )
+find_library(AVUTIL_LIBRARY avutil PATHS ${AVUTIL_LIBRARY_DIRS})
+
+if(AVCODEC_INCLUDE_DIR AND AVCODEC_LIBRARY)
+       set(AVCODEC_FOUND TRUE)
+endif()
+
+if(AVUTIL_INCLUDE_DIR AND AVUTIL_LIBRARY)
+       set(AVUTIL_FOUND TRUE)
+endif()
+
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFmpeg DEFAULT_MSG AVUTIL_FOUND AVCODEC_FOUND)
+
+if(FFMPEG_FOUND)
+       set(FFMPEG_INCLUDE_DIRS ${AVCODEC_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR})
+       set(FFMPEG_LIBRARIES ${AVCODEC_LIBRARY} ${AVUTIL_LIBRARY})
+endif()
+
+mark_as_advanced(FFMPEG_INCLUDE_DIRS FFMPEG_LIBRARYS)
diff --git a/cmake/FindOptionalPackage.cmake b/cmake/FindOptionalPackage.cmake
new file mode 100644 (file)
index 0000000..3e543bd
--- /dev/null
@@ -0,0 +1,51 @@
+# - FindOptionalPackage
+# Enable or disable optional packages. Also force optional packages.
+#
+#  This module defines the following macros:
+#    find_required_package   : find a required package, can not be disabled
+#    find_suggested_package  : find a suggested package - required but can be disabled
+#    find_optional_package   : find an optional package - required only if enabled
+#
+
+#=============================================================================
+# Copyright 2011 Nils Andresen <nils@nils-andresen.de>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+macro(find_required_package _normal_package)
+       find_package(${_normal_package} REQUIRED)
+endmacro(find_required_package)
+
+macro(find_suggested_package _normal_package)
+       string(TOUPPER ${_normal_package} _upper_package)
+       option(WITH_${_upper_package} "Add dependency to ${_normal_package} - recommended" ON)
+       
+       if(WITH_${_upper_package})
+               message(STATUS "Finding suggested package ${_normal_package}.")
+               message(STATUS "  Disable this using \"-DWITH_${_upper_package}=OFF\".")
+               find_package(${_normal_package} REQUIRED)
+       endif(WITH_${_upper_package})
+endmacro(find_suggested_package)
+
+macro(find_optional_package _normal_package)
+       string(TOUPPER ${_normal_package} _upper_package)
+       option(WITH_${_upper_package} "Add dependency to ${_normal_package}" OFF)
+
+       if(WITH_${_upper_package})
+               find_package(${_normal_package} REQUIRED)
+       else(WITH_${_upper_package})
+               message(STATUS "Skipping optional package ${_normal_package}.")
+               message(STATUS "  Enable this using \"-DWITH_${_upper_package}=ON\".")
+       endif(WITH_${_upper_package})
+endmacro(find_optional_package)
diff --git a/cmake/FindPCSC.cmake b/cmake/FindPCSC.cmake
new file mode 100644 (file)
index 0000000..a94709c
--- /dev/null
@@ -0,0 +1,13 @@
+include(FindPkgConfig)
+
+if (PKG_CONFIG_FOUND)
+       pkg_check_modules(PCSC libpcsclite)
+endif()
+
+find_path(PCSC_INCLUDE_DIR pcsclite.h PATHS ${PCSC_INCLUDE_DIRS} 
+          PATH_SUFFIXES PCSC )
+find_library(PCSC_LIBRARY pcsclite PATHS ${PCSC_LIBRARY_DIRS})
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCSC DEFAULT_MSG PCSC_INCLUDE_DIR PCSC_LIBRARY)
+
+mark_as_advanced(PCSC_INCLUDE_DIR PCSC_LIBRARY)
diff --git a/cmake/FindPulseAudio.cmake b/cmake/FindPulseAudio.cmake
new file mode 100644 (file)
index 0000000..03d1c61
--- /dev/null
@@ -0,0 +1,12 @@
+include(FindPkgConfig)
+
+if (PKG_CONFIG_FOUND)
+       pkg_check_modules(PULSEAUDIO libpulse)
+endif()
+
+find_path(PULSEAUDIO_INCLUDE_DIR pulseaudio.h PATHS ${PULSEAUDIO_INCLUDE_DIRS} PATH_SUFFIXES pulse )
+find_library(PULSEAUDIO_LIBRARY pulse PATHS ${PULSEAUDIO_LIBRARY_DIRS})
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PulseAudio DEFAULT_MSG PULSEAUDIO_INCLUDE_DIR PULSEAUDIO_LIBRARY)
+
+mark_as_advanced(PULSEAUDIO_INCLUDE_DIR PULSEAUDIO_LIBRARY)
diff --git a/cmake/FindX11.cmake b/cmake/FindX11.cmake
new file mode 100644 (file)
index 0000000..594b2c0
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find X11
+# Find the X11 libraries
+#
+#  This module defines the following variables:
+#     X11_FOUND        - true if X11_INCLUDE_DIR & X11_LIBRARY are found
+#     X11_LIBRARIES    - Set when X11_LIBRARY is found
+#     X11_INCLUDE_DIRS - Set when X11_INCLUDE_DIR is found
+#
+#     X11_INCLUDE_DIR  - where to find Xlib.h, etc.
+#     X11_LIBRARY      - the X11 library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(X11_INCLUDE_DIR NAMES X11/Xlib.h
+          PATH_SUFFIXES X11
+          DOC "The X11 include directory"
+)
+
+find_library(X11_LIBRARY NAMES X11
+          DOC "The X11 library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(X11 DEFAULT_MSG X11_LIBRARY X11_INCLUDE_DIR)
+
+if(X11_FOUND)
+  set( X11_LIBRARIES ${X11_LIBRARY} )
+  set( X11_INCLUDE_DIRS ${X11_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(X11_INCLUDE_DIR X11_LIBRARY)
+
diff --git a/cmake/FindXKBFile.cmake b/cmake/FindXKBFile.cmake
new file mode 100644 (file)
index 0000000..e47ff99
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find XKBFILE
+# Find the XKBFILE libraries
+#
+#  This module defines the following variables:
+#     XKBFILE_FOUND        - true if XKBFILE_INCLUDE_DIR & XKBFILE_LIBRARY are found
+#     XKBFILE_LIBRARIES    - Set when XKBFILE_LIBRARY is found
+#     XKBFILE_INCLUDE_DIRS - Set when XKBFILE_INCLUDE_DIR is found
+#
+#     XKBFILE_INCLUDE_DIR  - where to find XKBfile.h, etc.
+#     XKBFILE_LIBRARY      - the xkbfile library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XKBFILE_INCLUDE_DIR NAMES X11/extensions/XKBfile.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The XKBFile include directory"
+)
+
+find_library(XKBFILE_LIBRARY NAMES xkbfile
+          DOC "The XKBFile library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(XKBFile DEFAULT_MSG XKBFILE_LIBRARY XKBFILE_INCLUDE_DIR)
+
+if(XKBFILE_FOUND)
+  set( XKBFILE_LIBRARIES ${XKBFILE_LIBRARY} )
+  set( XKBFILE_INCLUDE_DIRS ${XKBFILE_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XKBFILE_INCLUDE_DIR XKBFILE_LIBRARY)
+
diff --git a/cmake/FindXShm.cmake b/cmake/FindXShm.cmake
new file mode 100644 (file)
index 0000000..cc4b6d5
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find XSHM
+# Find the XSHM libraries
+#
+#  This module defines the following variables:
+#     XSHM_FOUND        - true if XSHM_INCLUDE_DIR & XSHM_LIBRARY are found
+#     XSHM_LIBRARIES    - Set when XSHM_LIBRARY is found
+#     XSHM_INCLUDE_DIRS - Set when XSHM_INCLUDE_DIR is found
+#
+#     XSHM_INCLUDE_DIR  - where to find XShm.h, etc.
+#     XSHM_LIBRARY      - the XSHM library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XSHM_INCLUDE_DIR NAMES X11/extensions/XShm.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The XShm include directory"
+)
+
+find_library(XSHM_LIBRARY NAMES Xext
+          DOC "The XShm library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(XShm DEFAULT_MSG XSHM_LIBRARY XSHM_INCLUDE_DIR)
+
+if(XSHM_FOUND)
+  set( XSHM_LIBRARIES ${XSHM_LIBRARY} )
+  set( XSHM_INCLUDE_DIRS ${XSHM_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XSHM_INCLUDE_DIR XSHM_LIBRARY)
+
diff --git a/cmake/FindXTest.cmake b/cmake/FindXTest.cmake
new file mode 100644 (file)
index 0000000..f4a8561
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find XTEST
+# Find the XTEST libraries
+#
+#  This module defines the following variables:
+#     XTEST_FOUND        - true if XTEST_INCLUDE_DIR & XTEST_LIBRARY are found
+#     XTEST_LIBRARIES    - Set when XTEST_LIBRARY is found
+#     XTEST_INCLUDE_DIRS - Set when XTEST_INCLUDE_DIR is found
+#
+#     XTEST_INCLUDE_DIR  - where to find XTest.h, etc.
+#     XTEST_LIBRARY      - the XTEST library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XTEST_INCLUDE_DIR NAMES X11/extensions/XTest.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The XTest include directory"
+)
+
+find_library(XTEST_LIBRARY NAMES Xtst
+          DOC "The XTest library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(XTest DEFAULT_MSG XTEST_LIBRARY XTEST_INCLUDE_DIR)
+
+if(XTEST_FOUND)
+  set( XTEST_LIBRARIES ${XTEST_LIBRARY} )
+  set( XTEST_INCLUDE_DIRS ${XTEST_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XTEST_INCLUDE_DIR XTEST_LIBRARY)
+
diff --git a/cmake/FindXcursor.cmake b/cmake/FindXcursor.cmake
new file mode 100644 (file)
index 0000000..cc22bbd
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find Xcursor
+# Find the Xcursor libraries
+#
+#  This module defines the following variables:
+#     XCURSOR_FOUND        - true if XCURSOR_INCLUDE_DIR & XCURSOR_LIBRARY are found
+#     XCURSOR_LIBRARIES    - Set when XCURSOR_LIBRARY is found
+#     XCURSOR_INCLUDE_DIRS - Set when XCURSOR_INCLUDE_DIR is found
+#
+#     XCURSOR_INCLUDE_DIR  - where to find Xcursor.h, etc.
+#     XCURSOR_LIBRARY      - the Xcursor library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XCURSOR_INCLUDE_DIR NAMES X11/Xcursor/Xcursor.h
+          PATH_SUFFIXES X11/Xcursor
+          DOC "The Xcursor include directory"
+)
+
+find_library(XCURSOR_LIBRARY NAMES Xcursor
+          DOC "The Xcursor library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xcursor DEFAULT_MSG XCURSOR_LIBRARY XCURSOR_INCLUDE_DIR)
+
+if(XCURSOR_FOUND)
+  set( XCURSOR_LIBRARIES ${XCURSOR_LIBRARY} )
+  set( XCURSOR_INCLUDE_DIRS ${XCURSOR_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XCURSOR_INCLUDE_DIR XCURSOR_LIBRARY)
+
diff --git a/cmake/FindXdamage.cmake b/cmake/FindXdamage.cmake
new file mode 100644 (file)
index 0000000..a3ddf28
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find XDAMAGE
+# Find the XDAMAGE libraries
+#
+#  This module defines the following variables:
+#     XDAMAGE_FOUND        - true if XDAMAGE_INCLUDE_DIR & XDAMAGE_LIBRARY are found
+#     XDAMAGE_LIBRARIES    - Set when XDAMAGE_LIBRARY is found
+#     XDAMAGE_INCLUDE_DIRS - Set when XDAMAGE_INCLUDE_DIR is found
+#
+#     XDAMAGE_INCLUDE_DIR  - where to find Xdamage.h, etc.
+#     XDAMAGE_LIBRARY      - the XDAMAGE library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XDAMAGE_INCLUDE_DIR NAMES X11/extensions/Xdamage.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The Xdamage include directory"
+)
+
+find_library(XDAMAGE_LIBRARY NAMES Xdamage
+          DOC "The Xdamage library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xdamage DEFAULT_MSG XDAMAGE_LIBRARY XDAMAGE_INCLUDE_DIR)
+
+if(XDAMAGE_FOUND)
+  set( XDAMAGE_LIBRARIES ${XDAMAGE_LIBRARY} )
+  set( XDAMAGE_INCLUDE_DIRS ${XDAMAGE_INCLUDE_DIR} )
+endif()
+
+
+mark_as_advanced(XDAMAGE_INCLUDE_DIR XDAMAGE_LIBRARY)
diff --git a/cmake/FindXext.cmake b/cmake/FindXext.cmake
new file mode 100644 (file)
index 0000000..8cfe552
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find Xext
+# Find the Xext libraries
+#
+#  This module defines the following variables:
+#     Xext_FOUND        - true if Xext_INCLUDE_DIR & Xext_LIBRARY are found
+#     Xext_LIBRARIES    - Set when Xext_LIBRARY is found
+#     Xext_INCLUDE_DIRS - Set when Xext_INCLUDE_DIR is found
+#
+#     Xext_INCLUDE_DIR  - where to find Xext.h, etc.
+#     Xext_LIBRARY      - the Xext library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XEXT_INCLUDE_DIR NAMES X11/extensions/Xext.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The Xext include directory"
+)
+
+find_library(XEXT_LIBRARY NAMES Xext
+          DOC "The Xext library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xext DEFAULT_MSG XEXT_LIBRARY XEXT_INCLUDE_DIR)
+
+if(XEXT_FOUND)
+  set( XEXT_LIBRARIES ${XEXT_LIBRARY} )
+  set( XEXT_INCLUDE_DIRS ${XEXT_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XEXT_INCLUDE_DIR XEXT_LIBRARY)
+
diff --git a/cmake/FindXfixes.cmake b/cmake/FindXfixes.cmake
new file mode 100644 (file)
index 0000000..a7e633e
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find XFIXES
+# Find the XFIXES libraries
+#
+#  This module defines the following variables:
+#     XFIXES_FOUND        - true if XFIXES_INCLUDE_DIR & XFIXES_LIBRARY are found
+#     XFIXES_LIBRARIES    - Set when XFIXES_LIBRARY is found
+#     XFIXES_INCLUDE_DIRS - Set when XFIXES_INCLUDE_DIR is found
+#
+#     XFIXES_INCLUDE_DIR  - where to find Xfixes.h, etc.
+#     XFIXES_LIBRARY      - the XFIXES library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XFIXES_INCLUDE_DIR NAMES X11/extensions/Xfixes.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The Xfixes include directory"
+)
+
+find_library(XFIXES_LIBRARY NAMES Xfixes
+          DOC "The Xfixes library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xfixes DEFAULT_MSG XFIXES_LIBRARY XFIXES_INCLUDE_DIR)
+
+if(XFIXES_FOUND)
+  set( XFIXES_LIBRARIES ${XFIXES_LIBRARY} )
+  set( XFIXES_INCLUDE_DIRS ${XFIXES_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XFIXES_INCLUDE_DIR XFIXES_LIBRARY)
+
diff --git a/cmake/FindXinerama.cmake b/cmake/FindXinerama.cmake
new file mode 100644 (file)
index 0000000..ff9f4d1
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find XINERAMA
+# Find the XINERAMA libraries
+#
+#  This module defines the following variables:
+#     XINERAMA_FOUND        - true if XINERAMA_INCLUDE_DIR & XINERAMA_LIBRARY are found
+#     XINERAMA_LIBRARIES    - Set when XINERAMA_LIBRARY is found
+#     XINERAMA_INCLUDE_DIRS - Set when XINERAMA_INCLUDE_DIR is found
+#
+#     XINERAMA_INCLUDE_DIR  - where to find Xinerama.h, etc.
+#     XINERAMA_LIBRARY      - the XINERAMA library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XINERAMA_INCLUDE_DIR NAMES X11/extensions/Xinerama.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The Xinerama include directory"
+)
+
+find_library(XINERAMA_LIBRARY NAMES Xinerama
+          DOC "The Xinerama library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xinerama DEFAULT_MSG XINERAMA_LIBRARY XINERAMA_INCLUDE_DIR)
+
+if(XINERAMA_FOUND)
+  set( XINERAMA_LIBRARIES ${XINERAMA_LIBRARY} )
+  set( XINERAMA_INCLUDE_DIRS ${XINERAMA_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XINERAMA_INCLUDE_DIR XINERAMA_LIBRARY)
+
diff --git a/cmake/FindXmlto.cmake b/cmake/FindXmlto.cmake
new file mode 100644 (file)
index 0000000..167be67
--- /dev/null
@@ -0,0 +1,35 @@
+# - Find xmlto
+# Find the xmlto docbook xslt frontend
+#
+#  This module defines the following variables:
+#     XMLTO_FOUND        - true if xmlto was found
+#     XMLTO_EXECUTABLE   - Path to xmlto, if xmlto was found
+#
+
+#=============================================================================
+# Copyright 2011 Nils Andresen <nils@nils-andresen.de>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+set(XMLTO_FOUND false)
+
+find_program(XMLTO_EXECUTABLE
+       NAMES xmlto
+       DOC   "docbook xslt frontend")
+
+if(XMLTO_EXECUTABLE)
+       set(XMLTO_FOUND true)
+       message(STATUS "Found XMLTO: ${XMLTO_EXECUTABLE}")
+endif()
+
+mark_as_advanced(XMLTO_EXECUTABLE)
diff --git a/cmake/FindXv.cmake b/cmake/FindXv.cmake
new file mode 100644 (file)
index 0000000..346e6c6
--- /dev/null
@@ -0,0 +1,49 @@
+# - Find Xv
+# Find the Xv libraries
+#
+#  This module defines the following variables:
+#     XV_FOUND        - true if XV_INCLUDE_DIR & XV_LIBRARY are found
+#     XV_LIBRARIES    - Set when XV_LIBRARY is found
+#     XV_INCLUDE_DIRS - Set when XV_INCLUDE_DIR is found
+#
+#     XV_INCLUDE_DIR  - where to find Xv.h, etc.
+#     XV_LIBRARY      - the Xv library
+#
+
+#=============================================================================
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+find_path(XV_INCLUDE_DIR NAMES X11/extensions/Xv.h
+          PATH_SUFFIXES X11/extensions
+          DOC "The Xv include directory"
+)
+
+find_library(XV_LIBRARY NAMES Xv
+          DOC "The Xv library"
+)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Xv DEFAULT_MSG XV_LIBRARY XV_INCLUDE_DIR)
+
+if(XV_FOUND)
+  set( XV_LIBRARIES ${XV_LIBRARY} )
+  set( XV_INCLUDE_DIRS ${XV_INCLUDE_DIR} )
+endif()
+
+mark_as_advanced(XV_INCLUDE_DIR XV_LIBRARY)
+
diff --git a/cmake/GNUInstallDirsWrapper.cmake b/cmake/GNUInstallDirsWrapper.cmake
new file mode 100644 (file)
index 0000000..e438a01
--- /dev/null
@@ -0,0 +1,13 @@
+# GNUInstallDirs is a relatively new cmake module, so wrap it to avoid errors
+include(GNUInstallDirs OPTIONAL RESULT_VARIABLE GID_PATH)
+if(GID_PATH STREQUAL "NOTFOUND")
+       if(NOT DEFINED CMAKE_INSTALL_BINDIR)
+               set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)")
+       endif()
+
+       if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
+               set(CMAKE_INSTALL_LIBDIR "lib${LIB_SUFFIX}" CACHE PATH "object code libraries (lib)")
+       endif()
+
+       mark_as_advanced(CMAKE_INSTALL_BINDIR CMAKE_INSTALL_LIBDIR)
+endif()
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..7428764
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define FREERDP_VERSION "${FREERDP_VERSION}"
+#define FREERDP_VERSION_FULL "${FREERDP_VERSION_FULL}"
+#define FREERDP_VERSION_MAJOR ${FREERDP_VERSION_MAJOR}
+#define FREERDP_VERSION_MINOR ${FREERDP_VERSION_MINOR}
+#define FREERDP_VERSION_REVISION ${FREERDP_VERSION_REVISION}
+
+/* Include files */
+#cmakedefine HAVE_SYS_PARAM_H
+#cmakedefine HAVE_SYS_SOCKET_H
+#cmakedefine HAVE_NETDB_H
+#cmakedefine HAVE_FCNTL_H
+#cmakedefine HAVE_UNISTD_H
+#cmakedefine HAVE_LIMITS_H
+#cmakedefine HAVE_STDINT_H
+#cmakedefine HAVE_STDBOOL_H
+#cmakedefine HAVE_INTTYPES_H
+
+/* Endian */
+#cmakedefine BIG_ENDIAN
+
+/* Options */
+#cmakedefine WITH_DEBUG_TRANSPORT
+#cmakedefine WITH_DEBUG_CHANNELS
+#cmakedefine WITH_DEBUG_SVC
+#cmakedefine WITH_DEBUG_DVC
+#cmakedefine WITH_DEBUG_KBD
+#cmakedefine WITH_DEBUG_NLA
+#cmakedefine WITH_DEBUG_NEGO
+#cmakedefine WITH_DEBUG_CERTIFICATE
+#cmakedefine WITH_DEBUG_LICENSE
+#cmakedefine WITH_DEBUG_GDI
+#cmakedefine WITH_DEBUG_ASSERT
+#cmakedefine WITH_DEBUG_RFX
+#cmakedefine WITH_PROFILER
+#cmakedefine WITH_SSE2
+#cmakedefine WITH_SSE2_TARGET
+#cmakedefine WITH_NEON
+#cmakedefine WITH_DEBUG_X11
+#cmakedefine WITH_DEBUG_X11_CLIPRDR
+#cmakedefine WITH_DEBUG_X11_LOCAL_MOVESIZE
+#cmakedefine WITH_DEBUG_RAIL
+#cmakedefine WITH_DEBUG_XV
+#cmakedefine WITH_DEBUG_SCARD
+#cmakedefine WITH_DEBUG_ORDERS
+#cmakedefine WITH_DEBUG_REDIR
+#cmakedefine WITH_DEBUG_CLIPRDR
+#cmakedefine WITH_DEBUG_WND
+#endif
diff --git a/cunit/CMakeLists.txt b/cunit/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7dbb6e9
--- /dev/null
@@ -0,0 +1,77 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# cunit cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include_directories(${CUNIT_INCLUDE_DIRS})
+include_directories(${CMAKE_SOURCE_DIR}) # for some internal tests
+
+include_directories(../libfreerdp-core)
+include_directories(../libfreerdp-gdi)
+include_directories(../libfreerdp-cache)
+include_directories(../libfreerdp-codec)
+
+add_executable(test_freerdp
+       test_per.c
+       test_per.h
+       test_ber.c
+       test_ber.h
+       test_gcc.c
+       test_gcc.h
+       test_mcs.c
+       test_mcs.h
+       test_color.c
+       test_color.h
+       test_bitmap.c
+       test_bitmap.h
+       test_libgdi.c
+       test_libgdi.h
+       test_list.c
+       test_list.h
+       test_orders.c
+       test_orders.h
+       test_pcap.c
+       test_pcap.h
+       test_license.c
+       test_license.h
+       test_stream.c
+       test_stream.h
+       test_utils.c
+       test_utils.h
+       test_channels.c
+       test_channels.h
+       test_cliprdr.c
+       test_cliprdr.h
+       test_drdynvc.c
+       test_drdynvc.h
+       test_librfx.c
+       test_librfx.h
+       test_freerdp.c
+       test_freerdp.h
+       test_rail.c
+       test_rail.h
+       test_mppc)
+
+target_link_libraries(test_freerdp ${CUNIT_LIBRARIES})
+
+target_link_libraries(test_freerdp freerdp-core)
+target_link_libraries(test_freerdp freerdp-gdi)
+target_link_libraries(test_freerdp freerdp-utils)
+target_link_libraries(test_freerdp freerdp-channels)
+target_link_libraries(test_freerdp freerdp-codec)
+
+add_test(CUnitTests ${EXECUTABLE_OUTPUT_PATH}/test_freerdp)
diff --git a/cunit/test_ber.c b/cunit/test_ber.c
new file mode 100644 (file)
index 0000000..2f1825a
--- /dev/null
@@ -0,0 +1,96 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Basic Encoding Rules (BER) Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_ber.h"
+#include "libfreerdp-core/ber.h"
+
+int init_ber_suite(void)
+{
+       return 0;
+}
+
+int clean_ber_suite(void)
+{
+       return 0;
+}
+
+int add_ber_suite(void)
+{
+       add_test_suite(ber);
+
+       add_test_function(ber_write_length);
+       add_test_function(ber_write_universal_tag);
+       add_test_function(ber_write_application_tag);
+
+       return 0;
+}
+
+uint8 ber_length_expected_1[1] = "\x40"; /* 64 */
+uint8 ber_length_expected_2[3] = "\x82\x01\x94"; /* 404 */
+
+void test_ber_write_length(void)
+{
+       STREAM *s1, *s2;
+
+       s1 = stream_new(sizeof(ber_length_expected_1));
+       s2 = stream_new(sizeof(ber_length_expected_2));
+
+       ber_write_length(s1, 64);
+       ASSERT_STREAM(s1, (uint8*) ber_length_expected_1, sizeof(ber_length_expected_1));
+
+       ber_write_length(s2, 404);
+       ASSERT_STREAM(s2, (uint8*) ber_length_expected_2, sizeof(ber_length_expected_2));
+
+       stream_free(s1);
+       stream_free(s2);
+}
+
+/* BOOLEAN, length 1, without value */
+uint8 ber_universal_tag_expected[1] = "\x01";
+
+void test_ber_write_universal_tag(void)
+{
+       STREAM* s;
+
+       s = stream_new(sizeof(ber_universal_tag_expected));
+       ber_write_universal_tag(s, 1, false);
+
+       ASSERT_STREAM(s, (uint8*) ber_universal_tag_expected, sizeof(ber_universal_tag_expected));
+
+       stream_free(s);
+}
+
+/* T.125 MCS Application 101 (Connect-Initial), length 404 */
+uint8 ber_application_tag_expected[5] = "\x7F\x65\x82\x01\x94";
+
+void test_ber_write_application_tag(void)
+{
+       STREAM* s;
+
+       s = stream_new(sizeof(ber_application_tag_expected));
+       ber_write_application_tag(s, 101, 404);
+
+       ASSERT_STREAM(s, (uint8*) ber_application_tag_expected, sizeof(ber_application_tag_expected));
+
+       stream_free(s);
+}
diff --git a/cunit/test_ber.h b/cunit/test_ber.h
new file mode 100644 (file)
index 0000000..0cc9228
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Basic Encoding Rules (BER) Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_ber_suite(void);
+int clean_ber_suite(void);
+int add_ber_suite(void);
+
+void test_ber_write_length(void);
+void test_ber_write_universal_tag(void);
+void test_ber_write_application_tag(void);
diff --git a/cunit/test_bitmap.c b/cunit/test_bitmap.c
new file mode 100644 (file)
index 0000000..b25a065
--- /dev/null
@@ -0,0 +1,1250 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Bitmap Unit Tests
+ *
+ * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/codec/bitmap.h>
+
+#include "test_bitmap.h"
+
+uint8 compressed_16x1x8[] =
+{
+0x10
+};
+
+uint8 decompressed_16x1x8[] =
+{
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 compressed_32x32x8[] =
+{
+0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06,
+0xec, 0x6c, 0x0e, 0x0e, 0x44, 0x0e, 0x0e, 0x0e, 0x13, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06,
+0xed, 0x06, 0x06, 0x06, 0x00, 0x00, 0xe4, 0x04, 0x06, 0x8e, 0x60, 0x0e, 0x60, 0x8c, 0xb4, 0xb5,
+0xdc, 0xdc, 0xbb, 0xb4, 0x8c, 0x66, 0x0b, 0x6c, 0xe4, 0x04, 0x06, 0x02, 0x8b, 0x06, 0x06, 0xed,
+0x06, 0xed, 0x06, 0xf8, 0x0e, 0x66, 0xb4, 0xdc, 0x68, 0xe2, 0x97, 0xdd, 0xb4, 0xa7, 0x16, 0x06,
+0x06, 0x06, 0xed, 0x06, 0xed, 0x06, 0x00, 0x00, 0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x0b, 0xae,
+0xdc, 0xe9, 0x6a, 0xdc, 0x96, 0xe9, 0xe9, 0xb4, 0x0e, 0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x00,
+0x00, 0x06, 0x06, 0xed, 0x06, 0x06, 0x0e, 0xae, 0xdc, 0xdb, 0xdb, 0xd0, 0x09, 0x07, 0xcf, 0x03,
+0x95, 0xdb, 0xdb, 0xdc, 0xb4, 0x66, 0x6c, 0xed, 0x06, 0x06, 0x06, 0x00, 0x00, 0x04, 0x06, 0x04,
+0x06, 0x0b, 0xae, 0xdb, 0xd4, 0xd5, 0x6c, 0xdb, 0x80, 0xaf, 0xd5, 0xd4, 0xdb, 0xb4, 0x66, 0x04,
+0x06, 0x04, 0x06, 0x00, 0x00, 0xed, 0x06, 0xed, 0x66, 0xae, 0xd5, 0xad, 0xd4, 0xd4, 0xd5, 0xd5,
+0xd5, 0xdb, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xad, 0xd5, 0xb4, 0x0e,
+0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x60, 0xa7, 0xb4, 0xad, 0xad, 0xad, 0xb3, 0xb3, 0xd4,
+0xd4, 0xb3, 0x8c, 0xb6, 0x07, 0xb6, 0x8c, 0xb3, 0xd4, 0xb3, 0xb3, 0xad, 0xad, 0xad, 0xb4, 0xad,
+0x66, 0x00, 0x06, 0x00, 0x00, 0x06, 0x06, 0x66, 0xae, 0xad, 0x8b, 0xad, 0xad, 0xad, 0xad, 0xad,
+0xb3, 0xad, 0xb5, 0x07, 0x07, 0x07, 0xf0, 0x8b, 0xad, 0xad, 0xad, 0xad, 0xad, 0x8b, 0xa7, 0xae,
+0xa7, 0x6c, 0x06, 0x00, 0x00, 0x04, 0x6c, 0xa7, 0xad, 0xa7, 0xa7, 0x8b, 0xad, 0xad, 0xad, 0xad,
+0xad, 0xad, 0xb5, 0xbd, 0xbd, 0xbd, 0xbd, 0xf0, 0x8b, 0x8b, 0xad, 0x8b, 0x8b, 0xa7, 0xa7, 0xc8,
+0xc8, 0x60, 0x06, 0x00, 0x00, 0x06, 0x66, 0xc8, 0xa7, 0x66, 0xa7, 0xa7, 0x8b, 0x8b, 0x8b, 0x8b,
+0xad, 0x8b, 0x92, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0x07, 0xa7, 0xa7, 0x8b, 0xa7, 0xa7, 0x66, 0x66,
+0xc8, 0x66, 0x06, 0x00, 0x00, 0x00, 0x60, 0xa7, 0x66, 0x66, 0x66, 0xa7, 0xa7, 0xa7, 0xa7, 0x8b,
+0x8b, 0x8b, 0xa7, 0xb6, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0x07, 0x66, 0xa7, 0xa7, 0x66, 0x66, 0x66,
+0xa7, 0xa7, 0x6c, 0x00, 0x00, 0x6c, 0x04, 0xa7, 0x60, 0x6b, 0x66, 0x99, 0xb6, 0xf5, 0xf5, 0xf5,
+0xf5, 0xf5, 0xef, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xa7, 0x66, 0x00, 0x00, 0x60, 0xa7, 0x66,
+0x60, 0x66, 0x66, 0x8c, 0xf1, 0x6e, 0xff, 0x85, 0xbd, 0x66, 0x66, 0x66, 0x60, 0x05, 0x87, 0x13,
+0x04, 0x66, 0x66, 0x66, 0x66, 0xf4, 0x70, 0xff, 0x84, 0xbd, 0x66, 0x66, 0x66, 0x05, 0x85, 0x0b,
+0xa7, 0xb5, 0xae, 0x8c, 0xd0, 0x13, 0xc1, 0x01, 0x00, 0x08, 0x8e, 0x8c, 0xae, 0xb5, 0xae, 0x66,
+0x00, 0x00, 0x6c, 0xae, 0xbc, 0xb5, 0xb5, 0xae, 0xb5, 0xd0, 0x0e, 0x0c, 0x01, 0x00, 0x90, 0xf2,
+0xae, 0xae, 0xb5, 0xb5, 0xbc, 0xb5, 0x66, 0x00, 0x00, 0x04, 0xae, 0x0a, 0xb5, 0xb5, 0xb5, 0x68,
+0xae, 0x82, 0x8c, 0x0a, 0x05, 0x8c, 0xf2, 0xae, 0xae, 0xb5, 0xb5, 0xb5, 0xbc, 0xb5, 0x6c, 0x00,
+0x00, 0x06, 0x05, 0x81, 0xd0, 0x06, 0x9a, 0x8c, 0x0a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xae,
+0xae, 0xd0, 0xb5, 0xb5, 0xb5, 0x0a, 0xb5, 0x6c, 0x00, 0x00, 0x00, 0x8b, 0x0a, 0xbc, 0xb5, 0xb5,
+0xb5, 0x06, 0x9b, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xae, 0xae, 0xae, 0xb5, 0xb5, 0xb5,
+0xb6, 0x0a, 0x8c, 0x06, 0x00, 0x00, 0x06, 0x6c, 0xb5, 0x0a, 0xb6, 0xb5, 0xb5, 0xb5, 0x05, 0x80,
+0x7d, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xae, 0xae, 0xae, 0xb5, 0xb5, 0xb5, 0xb6, 0x0a, 0x0a,
+0x8b, 0x06, 0x00, 0x00, 0x04, 0x06, 0x87, 0x0a, 0xbc, 0xb6, 0xb5, 0xb5, 0xb5, 0xd0, 0xae, 0xae,
+0xae, 0xb6, 0xff, 0xff, 0xff, 0xf2, 0xd0, 0xae, 0xd0, 0xb5, 0xb5, 0xb5, 0xb6, 0xbc, 0x1a, 0xb5,
+0x04, 0x06, 0x00, 0x00, 0xed, 0x06, 0x6e, 0xb5, 0x0a, 0xbc, 0xb6, 0xb5, 0xb5, 0xb5, 0xd0, 0xd0,
+0xd0, 0xb5, 0xf4, 0xff, 0xf2, 0xd0, 0xd0, 0xd0, 0xb5, 0xb5, 0xb5, 0xb6, 0xbc, 0x0a, 0x0a, 0x8b,
+0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x04, 0x8b, 0xbc, 0x1a, 0x0a, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5,
+0xb5, 0xb5, 0xd0, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0x0a, 0xde, 0x0a, 0xa7, 0x06,
+0x00, 0x06, 0x00, 0x00, 0x06, 0x06, 0xed, 0x06, 0x8b, 0xbc, 0xf2, 0x0a, 0xb6, 0xb6, 0xb6, 0xb6,
+0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0x0a, 0xf2, 0x1a, 0x8c, 0xec, 0x06,
+0x06, 0x06, 0x00, 0x00, 0x04, 0x06, 0x04, 0x06, 0x04, 0xa7, 0xbc, 0x1a, 0x0a, 0x0a, 0x6a, 0xb6,
+0x96, 0x0a, 0x0a, 0xf2, 0x0a, 0x87, 0x06, 0x04, 0x06, 0x04, 0x06, 0x00, 0x00, 0x06, 0x06, 0xed,
+0x06, 0xed, 0x06, 0x8c, 0xb6, 0xf4, 0xf2, 0xd0, 0x09, 0xbc, 0x87, 0x03, 0x80, 0x2c, 0xde, 0xf4,
+0x0a, 0x8b, 0x06, 0x06, 0xed, 0x06, 0xed, 0x06, 0x00, 0x00, 0x00, 0x06, 0x04, 0x06, 0x00, 0x06,
+0x04, 0x6c, 0x87, 0x0a, 0xf4, 0xf4, 0xf2, 0xde, 0xbd, 0xbd, 0xde, 0xf2, 0xf4, 0xf4, 0x0a, 0xd0,
+0x04, 0x06, 0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x00, 0x00, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06,
+0xed, 0x06, 0x06, 0x6c, 0x8c, 0xb5, 0xbc, 0x0a, 0xde, 0xf2, 0xbd, 0x0a, 0xb5, 0x8c, 0x6c, 0x06,
+0xed, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0x00, 0x00, 0xe6, 0x04, 0x06, 0x86, 0x04, 0x6c,
+0x04, 0x8b, 0x04, 0x6c, 0xe6, 0x04, 0x06, 0x82, 0x00, 0x00
+};
+
+uint8 decompressed_32x32x8[] =
+{
+0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x6c, 0x04, 0x8b,
+0x04, 0x6c, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x00, 0x00,
+0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x6c, 0x8c, 0xb5, 0xbc, 0x0a, 0xde, 0xf2,
+0xbd, 0x0a, 0xb5, 0x8c, 0x6c, 0x06, 0xed, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0x00, 0x00,
+0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x04, 0x6c, 0x87, 0x0a, 0xf4, 0xf4, 0xf2, 0xde, 0xbd, 0xbd,
+0xde, 0xf2, 0xf4, 0xf4, 0x0a, 0xd0, 0x04, 0x06, 0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x00, 0x00,
+0x06, 0x06, 0xed, 0x06, 0xed, 0x06, 0x8c, 0xb6, 0xf4, 0xf2, 0x0a, 0x0a, 0x0a, 0xb6, 0xb6, 0xb6,
+0xb6, 0x0a, 0x0a, 0x0a, 0xde, 0xf4, 0x0a, 0x8b, 0x06, 0x06, 0xed, 0x06, 0xed, 0x06, 0x00, 0x00,
+0x04, 0x06, 0x04, 0x06, 0x04, 0xa7, 0xbc, 0x1a, 0x0a, 0x0a, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6,
+0xb6, 0xb6, 0xb6, 0xb6, 0x0a, 0x0a, 0xf2, 0x0a, 0x87, 0x06, 0x04, 0x06, 0x04, 0x06, 0x00, 0x00,
+0x06, 0x06, 0xed, 0x06, 0x8b, 0xbc, 0xf2, 0x0a, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5,
+0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0x0a, 0xf2, 0x1a, 0x8c, 0xec, 0x06, 0x06, 0x06, 0x00, 0x00,
+0x00, 0x06, 0x04, 0x8b, 0xbc, 0x1a, 0x0a, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xd0, 0xb5,
+0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb6, 0xb6, 0x0a, 0xde, 0x0a, 0xa7, 0x06, 0x00, 0x06, 0x00, 0x00,
+0xed, 0x06, 0x6e, 0xb5, 0x0a, 0xbc, 0xb6, 0xb5, 0xb5, 0xb5, 0xd0, 0xd0, 0xd0, 0xb5, 0xf4, 0xff,
+0xf2, 0xd0, 0xd0, 0xd0, 0xb5, 0xb5, 0xb5, 0xb6, 0xbc, 0x0a, 0x0a, 0x8b, 0x06, 0x06, 0x00, 0x00,
+0x04, 0x06, 0x87, 0x0a, 0xbc, 0xb6, 0xb5, 0xb5, 0xb5, 0xd0, 0xae, 0xae, 0xae, 0xb6, 0xff, 0xff,
+0xff, 0xf2, 0xd0, 0xae, 0xd0, 0xb5, 0xb5, 0xb5, 0xb6, 0xbc, 0x1a, 0xb5, 0x04, 0x06, 0x00, 0x00,
+0x06, 0x6c, 0xb5, 0x0a, 0xb6, 0xb5, 0xb5, 0xb5, 0xae, 0xae, 0xae, 0xae, 0xae, 0xbc, 0xff, 0xff,
+0xff, 0xff, 0xf2, 0xae, 0xae, 0xae, 0xb5, 0xb5, 0xb5, 0xb6, 0x0a, 0x0a, 0x8b, 0x06, 0x00, 0x00,
+0x00, 0x8b, 0x0a, 0xbc, 0xb5, 0xb5, 0xb5, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xb6, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xf2, 0xae, 0xae, 0xae, 0xb5, 0xb5, 0xb5, 0xb6, 0x0a, 0x8c, 0x06, 0x00, 0x00,
+0x06, 0xae, 0x0a, 0xb5, 0xb5, 0xb5, 0xd0, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0x8c, 0x0a, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xf2, 0xae, 0xae, 0xd0, 0xb5, 0xb5, 0xb5, 0x0a, 0xb5, 0x6c, 0x00, 0x00,
+0x04, 0xae, 0x0a, 0xb5, 0xb5, 0xb5, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0x8c, 0x0a,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xae, 0xae, 0xb5, 0xb5, 0xb5, 0xbc, 0xb5, 0x6c, 0x00, 0x00,
+0x6c, 0xae, 0xbc, 0xb5, 0xb5, 0xae, 0xb5, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xae, 0xae, 0xb5, 0xb5, 0xbc, 0xb5, 0x66, 0x00, 0x00,
+0x0b, 0xa7, 0xb5, 0xae, 0x8c, 0xa7, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xa7, 0x8c, 0xae, 0xb5, 0xae, 0x66, 0x00, 0x00,
+0x13, 0x04, 0x66, 0x66, 0x66, 0x66, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0x66, 0x66, 0x66, 0x66, 0xa7, 0x66, 0x00, 0x00,
+0x60, 0xa7, 0x66, 0x60, 0x66, 0x66, 0x8c, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0x66, 0x66, 0x66, 0x60, 0x66, 0xa7, 0x66, 0x00, 0x00,
+0x6c, 0x04, 0xa7, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xb6,
+0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xef, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xa7, 0x66, 0x00, 0x00,
+0x00, 0x60, 0xa7, 0x66, 0x66, 0x66, 0xa7, 0xa7, 0xa7, 0xa7, 0x8b, 0x8b, 0x8b, 0xa7, 0xb6, 0xf3,
+0xf3, 0xf3, 0xf3, 0xf3, 0x07, 0x66, 0xa7, 0xa7, 0x66, 0x66, 0x66, 0xa7, 0xa7, 0x6c, 0x00, 0x00,
+0x06, 0x66, 0xc8, 0xa7, 0x66, 0xa7, 0xa7, 0x8b, 0x8b, 0x8b, 0x8b, 0xad, 0x8b, 0x92, 0xf1, 0xf1,
+0xf1, 0xf1, 0xf2, 0x07, 0xa7, 0xa7, 0x8b, 0xa7, 0xa7, 0x66, 0x66, 0xc8, 0x66, 0x06, 0x00, 0x00,
+0x04, 0x6c, 0xa7, 0xad, 0xa7, 0xa7, 0x8b, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xb5, 0xbd, 0xbd,
+0xbd, 0xbd, 0xf0, 0x8b, 0x8b, 0xad, 0x8b, 0x8b, 0xa7, 0xa7, 0xc8, 0xc8, 0x60, 0x06, 0x00, 0x00,
+0x06, 0x06, 0x66, 0xae, 0xad, 0x8b, 0xad, 0xad, 0xad, 0xad, 0xad, 0xb3, 0xad, 0xb5, 0x07, 0x07,
+0x07, 0xf0, 0x8b, 0xad, 0xad, 0xad, 0xad, 0xad, 0x8b, 0xa7, 0xae, 0xa7, 0x6c, 0x06, 0x00, 0x00,
+0x00, 0x06, 0x60, 0xa7, 0xb4, 0xad, 0xad, 0xad, 0xb3, 0xb3, 0xd4, 0xd4, 0xb3, 0x8c, 0xb6, 0x07,
+0xb6, 0x8c, 0xb3, 0xd4, 0xb3, 0xb3, 0xad, 0xad, 0xad, 0xb4, 0xad, 0x66, 0x00, 0x06, 0x00, 0x00,
+0xed, 0x06, 0xed, 0x66, 0xae, 0xd5, 0xad, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xdb, 0xb4, 0xb4, 0xb4,
+0xb4, 0xb4, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xad, 0xd5, 0xb4, 0x0e, 0x06, 0x06, 0x06, 0x00, 0x00,
+0x04, 0x06, 0x04, 0x06, 0x0b, 0xae, 0xdb, 0xd4, 0xd5, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
+0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xd5, 0xd4, 0xdb, 0xb4, 0x66, 0x04, 0x06, 0x04, 0x06, 0x00, 0x00,
+0x06, 0x06, 0xed, 0x06, 0x06, 0x0e, 0xae, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc,
+0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdc, 0xb4, 0x66, 0x6c, 0xed, 0x06, 0x06, 0x06, 0x00, 0x00,
+0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x0b, 0xae, 0xdc, 0xe9, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc,
+0xdc, 0xdc, 0xdc, 0xdc, 0xe9, 0xe9, 0xb4, 0x0e, 0x00, 0x06, 0x04, 0x06, 0x00, 0x06, 0x00, 0x00,
+0x06, 0x06, 0xed, 0x06, 0xed, 0x06, 0xf8, 0x0e, 0x66, 0xb4, 0xdc, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2,
+0xe2, 0xe2, 0xe2, 0xdd, 0xb4, 0xa7, 0x16, 0x06, 0x06, 0x06, 0xed, 0x06, 0xed, 0x06, 0x00, 0x00,
+0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x60, 0x0e, 0x60, 0x8c, 0xb4, 0xb5, 0xdc, 0xdc,
+0xbb, 0xb4, 0x8c, 0x66, 0x0b, 0x6c, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x00, 0x00,
+0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0xec, 0x6c, 0x0e, 0x0e, 0x44, 0x0e,
+0x0e, 0x0e, 0x13, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0xed, 0x06, 0x06, 0x06, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 compressed_16x1x16[] =
+{
+0x0c, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 decompressed_16x1x16[] =
+{
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 compressed_32x32x16[] =
+{
+0x1c, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xef, 0x1a, 0x8a,
+0xcf, 0x12, 0x4e, 0x12, 0xce, 0x09, 0xaf, 0x09, 0x8f, 0x01, 0x8f, 0x01, 0xaf, 0x09, 0xce, 0x09,
+0x2e, 0x12, 0xaf, 0x12, 0x2a, 0x0a, 0x8e, 0x8f, 0x12, 0xae, 0x09, 0xd2, 0x01, 0x9b, 0x23, 0x1d,
+0x5d, 0x1e, 0x86, 0xbf, 0x9e, 0xdf, 0xa6, 0x5f, 0x8e, 0x7e, 0x6d, 0xfc, 0x2b, 0x16, 0x02, 0x8f,
+0x09, 0x4f, 0x12, 0x11, 0x91, 0xce, 0x09, 0x17, 0x02, 0x1e, 0x55, 0x5f, 0xaf, 0xff, 0xcf, 0xff,
+0xc7, 0xff, 0xbf, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xc7, 0xff, 0xcf, 0xbf, 0xb7, 0xbe,
+0x6d, 0xba, 0x02, 0xae, 0x09, 0xcf, 0x12, 0x0d, 0x94, 0xcf, 0x12, 0x6f, 0x01, 0x1d, 0x2c, 0x7f,
+0x9f, 0xff, 0xaf, 0xff, 0x97, 0xdf, 0x87, 0xbf, 0x8f, 0xbf, 0x97, 0xbf, 0x9f, 0xbf, 0x9f, 0xbf,
+0x97, 0xbf, 0x8f, 0xdf, 0x87, 0xff, 0x8f, 0xff, 0xa7, 0xdf, 0xa7, 0xdd, 0x3c, 0x4f, 0x01, 0x8f,
+0x12, 0x0b, 0x96, 0xaf, 0x12, 0x2f, 0x01, 0xbd, 0x34, 0xbf, 0x8f, 0x5f, 0x77, 0x5f, 0x6f, 0x9f,
+0x77, 0x9f, 0x7f, 0xbf, 0x87, 0xbf, 0x87, 0xbf, 0x87, 0xbf, 0x87, 0xbf, 0x87, 0xbf, 0x87, 0x9f,
+0x7f, 0x7f, 0x7f, 0x5f, 0x6f, 0x3f, 0x6f, 0xbf, 0x87, 0xbf, 0x55, 0x72, 0x01, 0x6f, 0x12, 0x09,
+0x98, 0xcf, 0x12, 0x4f, 0x01, 0xde, 0x34, 0xff, 0x6e, 0x5f, 0x4e, 0xbf, 0x5e, 0x1f, 0x67, 0x3f,
+0x6f, 0x5f, 0x6f, 0x5f, 0x6f, 0x5f, 0x77, 0x5f, 0x77, 0x5f, 0x77, 0x5f, 0x77, 0x5f, 0x6f, 0x5f,
+0x6f, 0x3f, 0x6f, 0x1f, 0x67, 0xdf, 0x5e, 0x3f, 0x4e, 0xbf, 0x66, 0xdf, 0x4d, 0x72, 0x01, 0xaf,
+0x12, 0x08, 0x99, 0x8e, 0x09, 0xfc, 0x1b, 0x3f, 0x4e, 0x3e, 0x25, 0xff, 0x3d, 0x5f, 0x4e, 0x9f,
+0x56, 0xbf, 0x5e, 0xdf, 0x66, 0xdf, 0x5e, 0x3c, 0x56, 0x79, 0x4d, 0x17, 0x4d, 0x99, 0x4d, 0x5d,
+0x5e, 0xdf, 0x66, 0xbf, 0x5e, 0x9f, 0x56, 0x5f, 0x4e, 0xff, 0x3d, 0x1e, 0x25, 0xdf, 0x3d, 0xfe,
+0x34, 0x2f, 0x01, 0xcf, 0x12, 0x06, 0x80, 0xa6, 0x0f, 0x0a, 0xba, 0x02, 0x5f, 0x35, 0x5d, 0x0c,
+0xbd, 0x14, 0x5e, 0x2d, 0xbe, 0x3d, 0xff, 0x3d, 0x1f, 0x46, 0x3f, 0x46, 0x1e, 0x4e, 0xd7, 0x44,
+0xb7, 0xa5, 0xf7, 0xbd, 0x97, 0x95, 0xb7, 0x44, 0x9c, 0x45, 0x1f, 0x46, 0xff, 0x3d, 0xbf, 0x3d,
+0x5e, 0x2d, 0xbd, 0x1c, 0x3d, 0x04, 0x1e, 0x25, 0xbc, 0x13, 0xae, 0x09, 0xef, 0x1a, 0xef, 0x1a,
+0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0xaf, 0x12, 0x31, 0x01, 0x7d, 0x24, 0xdc, 0x03, 0xfc, 0x03,
+0x5d, 0x0c, 0xbd, 0x14, 0x1e, 0x25, 0x3e, 0x2d, 0x7e, 0x35, 0x9e, 0x35, 0xfb, 0x34, 0x17, 0x6d,
+0x18, 0xc6, 0x18, 0xc6, 0x18, 0xc6, 0xb8, 0xa5, 0x57, 0x2c, 0xfb, 0x2c, 0x5e, 0x2d, 0x1e, 0x25,
+0xbd, 0x14, 0x5d, 0x0c, 0xfd, 0x03, 0x7a, 0x03, 0x9e, 0x24, 0xd6, 0x01, 0x6f, 0x12, 0xef, 0x1a,
+0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0x2f, 0x0a, 0x79, 0x02, 0xdd, 0x0b, 0xf8, 0x02, 0x9b, 0x03,
+0xfd, 0x03, 0x3d, 0x0c, 0x7d, 0x14, 0xbd, 0x1c, 0xdd, 0x1c, 0xfe, 0x24, 0x7a, 0x1c, 0x18, 0x6d,
+0x79, 0xce, 0x79, 0xce, 0x79, 0xce, 0x79, 0xce, 0xd9, 0xad, 0xd7, 0x23, 0x5b, 0x14, 0x7d, 0x14,
+0x3d, 0x0c, 0xfd, 0x03, 0x9b, 0x03, 0x18, 0x03, 0x7b, 0x03, 0x1b, 0x0b, 0xaf, 0x09, 0xef, 0x1a,
+0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0x6f, 0x01, 0xda, 0x0a, 0x97, 0x02, 0x96, 0x02, 0x19, 0x03,
+0x9b, 0x03, 0xfd, 0x03, 0x1d, 0x0c, 0x3d, 0x0c, 0x3d, 0x0c, 0x5d, 0x14, 0x1a, 0x14, 0xd8, 0x5c,
+0xba, 0xd6, 0xba, 0xd6, 0xba, 0xd6, 0xdb, 0xd6, 0xdb, 0xde, 0x1a, 0xae, 0x77, 0x13, 0xba, 0x03,
+0xfd, 0x03, 0x9b, 0x03, 0x19, 0x03, 0xb7, 0x02, 0x54, 0x02, 0x1b, 0x0b, 0x31, 0x01, 0xcf, 0x12,
+0x00, 0x00, 0x00, 0x00, 0xaf, 0x12, 0x52, 0x01, 0xba, 0x02, 0xf3, 0x01, 0x34, 0x02, 0xb7, 0x02,
+0xf8, 0x02, 0x7b, 0x03, 0xbc, 0x03, 0xdc, 0x03, 0xfd, 0x03, 0xfd, 0x03, 0x1d, 0x0c, 0x99, 0x03,
+0x9a, 0x8d, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x5b, 0xb6, 0x36, 0x0b,
+0x39, 0x03, 0xf8, 0x02, 0xb7, 0x02, 0x34, 0x02, 0xd2, 0x01, 0x99, 0x02, 0x97, 0x01, 0x4f, 0x12,
+0x00, 0x00, 0x00, 0x00, 0x6f, 0x12, 0x95, 0x01, 0x77, 0x02, 0xd2, 0x01, 0x13, 0x02, 0x55, 0x02,
+0x75, 0x02, 0x74, 0x02, 0x94, 0x02, 0xb5, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02,
+0x17, 0x03, 0xbb, 0x8d, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7c, 0xbe,
+0xb4, 0x0a, 0x75, 0x02, 0x55, 0x02, 0xf3, 0x01, 0xd2, 0x01, 0x35, 0x02, 0xf8, 0x01, 0xef, 0x09,
+0x00, 0x00, 0x00, 0x00, 0x0e, 0x0a, 0xf6, 0x01, 0x14, 0x02, 0xd2, 0x01, 0xf3, 0x01, 0xf2, 0x01,
+0x75, 0x43, 0xfd, 0xce, 0x6e, 0xff, 0xff, 0x91, 0xbc, 0xc6, 0x32, 0x12, 0xf2, 0x01, 0xf3, 0x01,
+0xd2, 0x01, 0xd2, 0x01, 0x17, 0x02, 0x8e, 0x09, 0x00, 0x00, 0x00, 0x00, 0xef, 0x09, 0xf5, 0x01,
+0x14, 0x02, 0xd2, 0x01, 0xd2, 0x01, 0xb0, 0x01, 0x5e, 0xe7, 0x70, 0xff, 0xff, 0x90, 0x9c, 0xc6,
+0xf0, 0x09, 0xd2, 0x01, 0xd2, 0x01, 0x13, 0x02, 0x16, 0x02, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x0f, 0x0a, 0x3a, 0x1b, 0x9d, 0x75, 0xdb, 0x54, 0xfa, 0x33, 0xd5, 0x12, 0x7e, 0xe7, 0x10, 0x91,
+0xbd, 0xc6, 0xf6, 0x1a, 0xfa, 0x33, 0xdb, 0x5c, 0xbd, 0x7d, 0x3b, 0x3c, 0x90, 0x01, 0x00, 0x00,
+0x00, 0x00, 0x2f, 0x0a, 0x5b, 0x4c, 0xde, 0xae, 0xdd, 0x85, 0x7c, 0x75, 0xfb, 0x5c, 0x5b, 0x75,
+0x3e, 0xdf, 0x0e, 0x80, 0xc6, 0x1e, 0xd7, 0x9a, 0x54, 0xfb, 0x5c, 0x7c, 0x75, 0xdd, 0x85, 0xbe,
+0xa6, 0xbd, 0x7d, 0xf0, 0x09, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x12, 0x9b, 0x4c, 0x1f, 0xb7, 0xfd,
+0x8d, 0x7c, 0x7d, 0x3c, 0x6d, 0xdc, 0x5c, 0x9c, 0x4c, 0x7c, 0x44, 0x7c, 0x3c, 0x5c, 0x34, 0x3c,
+0x34, 0x3c, 0x2c, 0x3c, 0x2c, 0x1c, 0x24, 0x7e, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0x3f, 0xd7, 0xdc, 0x54, 0xdc, 0x5c, 0x3c, 0x6d, 0x7c, 0x7d, 0xdc, 0x8d, 0xde,
+0xb6, 0xdd, 0x85, 0x71, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x12, 0x5a, 0x44, 0x5f, 0xc7, 0x1d,
+0x96, 0xbc, 0x85, 0x5c, 0x75, 0xfb, 0x64, 0xbc, 0x54, 0x9b, 0x4c, 0x7c, 0x44, 0x5c, 0x3c, 0x5c,
+0x34, 0x3c, 0x34, 0x3c, 0x2c, 0x7e, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0x3f, 0xd7, 0xbc, 0x54, 0xbc, 0x54, 0x1c, 0x65, 0x5c, 0x75, 0xbc, 0x85, 0x1d, 0x96, 0x3f,
+0xc7, 0xbd, 0x7d, 0x90, 0x12, 0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0x57, 0x1b, 0x3f, 0xc7, 0x7d,
+0xa6, 0xdc, 0x8d, 0x7c, 0x7d, 0x3c, 0x6d, 0xdc, 0x5c, 0xbb, 0x54, 0x7b, 0x4c, 0x7b, 0x44, 0x5b,
+0x3c, 0x5c, 0x3c, 0xdd, 0x85, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
+0xd7, 0xbc, 0x54, 0xbb, 0x54, 0xdb, 0x5c, 0x3c, 0x6d, 0x7c, 0x7d, 0xdc, 0x8d, 0x5d, 0xa6, 0x7f,
+0xcf, 0x5a, 0x44, 0xef, 0x12, 0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0xb1, 0x12, 0x3d, 0x96, 0x1e,
+0xc7, 0xfc, 0x9d, 0xbc, 0x8d, 0x5c, 0x7d, 0x1b, 0x6d, 0xdb, 0x5c, 0x9b, 0x54, 0x7b, 0x4c, 0x7b,
+0x44, 0x5b, 0x44, 0x1d, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xd7, 0xbb,
+0x54, 0x9b, 0x54, 0xdb, 0x5c, 0x1c, 0x6d, 0x5c, 0x7d, 0xbc, 0x8d, 0x1d, 0x9e, 0xde, 0xbe, 0x1e,
+0xbf, 0xf5, 0x0a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0xcf, 0x12, 0xb8, 0x33, 0x7f,
+0xd7, 0x7d, 0xae, 0xfc, 0x95, 0x9c, 0x85, 0x3b, 0x75, 0xfb, 0x64, 0xdb, 0x5c, 0x9b, 0x54, 0x9b,
+0x54, 0x7b, 0x4c, 0xfd, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xd7, 0xbb, 0x5c, 0x9b,
+0x54, 0xdb, 0x5c, 0xfb, 0x64, 0x3b, 0x75, 0x9c, 0x85, 0xdc, 0x95, 0x7d, 0xae, 0x9f, 0xdf, 0x1b,
+0x65, 0xd0, 0x12, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0xef, 0x1a, 0xd1, 0x12, 0xbd,
+0x85, 0x5f, 0xd7, 0x5d, 0xae, 0xdc, 0x95, 0x7c, 0x85, 0x3b, 0x7d, 0x1b, 0x6d, 0xdb, 0x64, 0xbb,
+0x5c, 0xbb, 0x5c, 0xfb, 0x64, 0x7f, 0xe7, 0xff, 0xff, 0x1e, 0xd7, 0xdb, 0x64, 0xbb, 0x5c, 0xdb,
+0x64, 0xfb, 0x6c, 0x3b, 0x7d, 0x9c, 0x85, 0xdc, 0x95, 0x3d, 0xae, 0x3e, 0xcf, 0xbe, 0xb6, 0xf4,
+0x0a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xd3,
+0x0a, 0x5d, 0xa6, 0x5e, 0xd7, 0x5d, 0xae, 0xdc, 0x9d, 0x9c, 0x8d, 0x5b, 0x85, 0x3b, 0x7d, 0x1b,
+0x75, 0xfb, 0x6c, 0xdb, 0x6c, 0xdb, 0x6c, 0x3b, 0x7d, 0xdb, 0x6c, 0xfb, 0x6c, 0x1b, 0x75, 0x3b,
+0x7d, 0x5b, 0x85, 0x9c, 0x8d, 0xdc, 0x9d, 0x5d, 0xae, 0x3e, 0xd7, 0x3e, 0xcf, 0x36, 0x13, 0xef,
+0x1a, 0x07, 0x98, 0xef, 0x1a, 0xd5, 0x0a, 0xbe, 0xb6, 0x5e, 0xdf, 0x5d, 0xae, 0xdc, 0x9d, 0xbc,
+0x95, 0x7b, 0x8d, 0x5b, 0x85, 0x3b, 0x85, 0x3b, 0x7d, 0x1b, 0x7d, 0x1b, 0x7d, 0x3b, 0x7d, 0x3b,
+0x85, 0x5b, 0x85, 0x9c, 0x8d, 0xbc, 0x95, 0xdc, 0x9d, 0x5d, 0xb6, 0x3e, 0xd7, 0x7f, 0xd7, 0x78,
+0x23, 0xef, 0x12, 0x09, 0x97, 0xef, 0x1a, 0xd5, 0x0a, 0x7e, 0xae, 0x5e, 0xdf, 0x7d, 0xbe, 0x1c,
+0xae, 0xdc, 0xa5, 0xbc, 0x9d, 0x9c, 0x95, 0x9b, 0x95, 0x9c, 0x8d, 0x9c, 0x8d, 0x9b, 0x95, 0x9c,
+0x95, 0xbc, 0x9d, 0xdc, 0xa5, 0x1c, 0xae, 0x7d, 0xbe, 0x5e, 0xdf, 0x3e, 0xcf, 0x77, 0x23, 0xcf,
+0x12, 0xef, 0x1a, 0x0a, 0x95, 0xef, 0x1a, 0xb3, 0x0a, 0xdd, 0x95, 0x9f, 0xe7, 0x1e, 0xd7, 0x9d,
+0xbe, 0x3d, 0xae, 0x1c, 0xae, 0xfc, 0xa5, 0xdc, 0xa5, 0xdc, 0xa5, 0xfc, 0xa5, 0x1c, 0xae, 0x3d,
+0xae, 0x7d, 0xbe, 0x1e, 0xd7, 0xbf, 0xef, 0x7d, 0xae, 0xf5, 0x12, 0xef, 0x12, 0xef, 0x1a, 0x0c,
+0x93, 0xef, 0x1a, 0x90, 0x12, 0xd8, 0x3b, 0x7d, 0xae, 0x7f, 0xe7, 0x7f, 0xe7, 0x1e, 0xd7, 0xde,
+0xce, 0xbd, 0xc6, 0xbd, 0xc6, 0xde, 0xce, 0x1e, 0xd7, 0x7f, 0xe7, 0x9f, 0xef, 0xde, 0xc6, 0x7a,
+0x54, 0xb2, 0x0a, 0xef, 0x1a, 0xef, 0x1a, 0x0e, 0x8f, 0xef, 0x1a, 0xcf, 0x12, 0xb0, 0x12, 0x56,
+0x1b, 0xda, 0x64, 0x1d, 0xa6, 0xbe, 0xbe, 0xfe, 0xce, 0xfe, 0xce, 0xde, 0xc6, 0x5d, 0xae, 0x3b,
+0x7d, 0x97, 0x2b, 0xb2, 0x0a, 0xcf, 0x12, 0x68, 0xef, 0x1a, 0x0a, 0x8b, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xcf, 0x12, 0xb0, 0x12, 0x91, 0x0a, 0xb3, 0x0a, 0xb3, 0x0a, 0x91, 0x0a, 0xb0, 0x12,
+0xcf, 0x12, 0x69, 0xef, 0x1a, 0x84, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 decompressed_32x32x16[] =
+{
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xcf, 0x12, 0xb0, 0x12, 0x91, 0x0a, 0xb3, 0x0a, 0xb3, 0x0a,
+0x91, 0x0a, 0xb0, 0x12, 0xcf, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a,
+0xcf, 0x12, 0xb0, 0x12, 0x56, 0x1b, 0xda, 0x64, 0x1d, 0xa6, 0xbe, 0xbe, 0xfe, 0xce, 0xfe, 0xce,
+0xde, 0xc6, 0x5d, 0xae, 0x3b, 0x7d, 0x97, 0x2b, 0xb2, 0x0a, 0xcf, 0x12, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x90, 0x12,
+0xd8, 0x3b, 0x7d, 0xae, 0x7f, 0xe7, 0x7f, 0xe7, 0x1e, 0xd7, 0xde, 0xce, 0xbd, 0xc6, 0xbd, 0xc6,
+0xde, 0xce, 0x1e, 0xd7, 0x7f, 0xe7, 0x9f, 0xef, 0xde, 0xc6, 0x7a, 0x54, 0xb2, 0x0a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xb3, 0x0a, 0xdd, 0x95,
+0x9f, 0xe7, 0x1e, 0xd7, 0x9d, 0xbe, 0x3d, 0xae, 0x1c, 0xae, 0xfc, 0xa5, 0xdc, 0xa5, 0xdc, 0xa5,
+0xfc, 0xa5, 0x1c, 0xae, 0x3d, 0xae, 0x7d, 0xbe, 0x1e, 0xd7, 0xbf, 0xef, 0x7d, 0xae, 0xf5, 0x12,
+0xef, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xd5, 0x0a, 0x7e, 0xae, 0x5e, 0xdf,
+0x7d, 0xbe, 0x1c, 0xae, 0xdc, 0xa5, 0xbc, 0x9d, 0x9c, 0x95, 0x9b, 0x95, 0x9c, 0x8d, 0x9c, 0x8d,
+0x9b, 0x95, 0x9c, 0x95, 0xbc, 0x9d, 0xdc, 0xa5, 0x1c, 0xae, 0x7d, 0xbe, 0x5e, 0xdf, 0x3e, 0xcf,
+0x77, 0x23, 0xcf, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xd5, 0x0a, 0xbe, 0xb6, 0x5e, 0xdf, 0x5d, 0xae,
+0xdc, 0x9d, 0xbc, 0x95, 0x7b, 0x8d, 0x5b, 0x85, 0x3b, 0x85, 0x3b, 0x7d, 0x1b, 0x7d, 0x1b, 0x7d,
+0x3b, 0x7d, 0x3b, 0x85, 0x5b, 0x85, 0x9c, 0x8d, 0xbc, 0x95, 0xdc, 0x9d, 0x5d, 0xb6, 0x3e, 0xd7,
+0x7f, 0xd7, 0x78, 0x23, 0xef, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xd3, 0x0a, 0x5d, 0xa6, 0x5e, 0xd7, 0x5d, 0xae, 0xdc, 0x9d,
+0x9c, 0x8d, 0x5b, 0x85, 0x3b, 0x7d, 0x1b, 0x75, 0xfb, 0x6c, 0xdb, 0x6c, 0xdb, 0x6c, 0x3b, 0x7d,
+0xdb, 0x6c, 0xfb, 0x6c, 0x1b, 0x75, 0x3b, 0x7d, 0x5b, 0x85, 0x9c, 0x8d, 0xdc, 0x9d, 0x5d, 0xae,
+0x3e, 0xd7, 0x3e, 0xcf, 0x36, 0x13, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xd1, 0x12, 0xbd, 0x85, 0x5f, 0xd7, 0x5d, 0xae, 0xdc, 0x95, 0x7c, 0x85,
+0x3b, 0x7d, 0x1b, 0x6d, 0xdb, 0x64, 0xbb, 0x5c, 0xbb, 0x5c, 0xfb, 0x64, 0x7f, 0xe7, 0xff, 0xff,
+0x1e, 0xd7, 0xdb, 0x64, 0xbb, 0x5c, 0xdb, 0x64, 0xfb, 0x6c, 0x3b, 0x7d, 0x9c, 0x85, 0xdc, 0x95,
+0x3d, 0xae, 0x3e, 0xcf, 0xbe, 0xb6, 0xf4, 0x0a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xcf, 0x12, 0xb8, 0x33, 0x7f, 0xd7, 0x7d, 0xae, 0xfc, 0x95, 0x9c, 0x85, 0x3b, 0x75,
+0xfb, 0x64, 0xdb, 0x5c, 0x9b, 0x54, 0x9b, 0x54, 0x7b, 0x4c, 0xfd, 0x9d, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0x3e, 0xd7, 0xbb, 0x5c, 0x9b, 0x54, 0xdb, 0x5c, 0xfb, 0x64, 0x3b, 0x75, 0x9c, 0x85,
+0xdc, 0x95, 0x7d, 0xae, 0x9f, 0xdf, 0x1b, 0x65, 0xd0, 0x12, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xb1, 0x12, 0x3d, 0x96, 0x1e, 0xc7, 0xfc, 0x9d, 0xbc, 0x8d, 0x5c, 0x7d, 0x1b, 0x6d,
+0xdb, 0x5c, 0x9b, 0x54, 0x7b, 0x4c, 0x7b, 0x44, 0x5b, 0x44, 0x1d, 0x9e, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0x3e, 0xd7, 0xbb, 0x54, 0x9b, 0x54, 0xdb, 0x5c, 0x1c, 0x6d, 0x5c, 0x7d,
+0xbc, 0x8d, 0x1d, 0x9e, 0xde, 0xbe, 0x1e, 0xbf, 0xf5, 0x0a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0x57, 0x1b, 0x3f, 0xc7, 0x7d, 0xa6, 0xdc, 0x8d, 0x7c, 0x7d, 0x3c, 0x6d, 0xdc, 0x5c,
+0xbb, 0x54, 0x7b, 0x4c, 0x7b, 0x44, 0x5b, 0x3c, 0x5c, 0x3c, 0xdd, 0x85, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xd7, 0xbc, 0x54, 0xbb, 0x54, 0xdb, 0x5c, 0x3c, 0x6d,
+0x7c, 0x7d, 0xdc, 0x8d, 0x5d, 0xa6, 0x7f, 0xcf, 0x5a, 0x44, 0xef, 0x12, 0x00, 0x00, 0x00, 0x00,
+0xcf, 0x12, 0x5a, 0x44, 0x5f, 0xc7, 0x1d, 0x96, 0xbc, 0x85, 0x5c, 0x75, 0xfb, 0x64, 0xbc, 0x54,
+0x9b, 0x4c, 0x7c, 0x44, 0x5c, 0x3c, 0x5c, 0x34, 0x3c, 0x34, 0x3c, 0x2c, 0x7e, 0xae, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xd7, 0xbc, 0x54, 0xbc, 0x54, 0x1c, 0x65,
+0x5c, 0x75, 0xbc, 0x85, 0x1d, 0x96, 0x3f, 0xc7, 0xbd, 0x7d, 0x90, 0x12, 0x00, 0x00, 0x00, 0x00,
+0xb0, 0x12, 0x9b, 0x4c, 0x1f, 0xb7, 0xfd, 0x8d, 0x7c, 0x7d, 0x3c, 0x6d, 0xdc, 0x5c, 0x9c, 0x4c,
+0x7c, 0x44, 0x7c, 0x3c, 0x5c, 0x34, 0x3c, 0x34, 0x3c, 0x2c, 0x3c, 0x2c, 0x1c, 0x24, 0x7e, 0xa6,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xd7, 0xdc, 0x54, 0xdc, 0x5c,
+0x3c, 0x6d, 0x7c, 0x7d, 0xdc, 0x8d, 0xde, 0xb6, 0xdd, 0x85, 0x71, 0x0a, 0x00, 0x00, 0x00, 0x00,
+0x2f, 0x0a, 0x5b, 0x4c, 0xde, 0xae, 0xdd, 0x85, 0x7c, 0x75, 0xfb, 0x5c, 0x5b, 0x75, 0x3e, 0xdf,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0xd7, 0x9a, 0x54,
+0xfb, 0x5c, 0x7c, 0x75, 0xdd, 0x85, 0xbe, 0xa6, 0xbd, 0x7d, 0xf0, 0x09, 0x00, 0x00, 0x00, 0x00,
+0x0f, 0x0a, 0x3a, 0x1b, 0x9d, 0x75, 0xdb, 0x54, 0xfa, 0x33, 0xd5, 0x12, 0x7e, 0xe7, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xc6,
+0xf6, 0x1a, 0xfa, 0x33, 0xdb, 0x5c, 0xbd, 0x7d, 0x3b, 0x3c, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x09, 0xf5, 0x01, 0x14, 0x02, 0xd2, 0x01, 0xd2, 0x01, 0xb0, 0x01, 0x5e, 0xe7, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9c, 0xc6,
+0xf0, 0x09, 0xd2, 0x01, 0xd2, 0x01, 0x13, 0x02, 0x16, 0x02, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x0e, 0x0a, 0xf6, 0x01, 0x14, 0x02, 0xd2, 0x01, 0xf3, 0x01, 0xf2, 0x01, 0x75, 0x43, 0xfd, 0xce,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xc6, 0x32, 0x12,
+0xf2, 0x01, 0xf3, 0x01, 0xd2, 0x01, 0xd2, 0x01, 0x17, 0x02, 0x8e, 0x09, 0x00, 0x00, 0x00, 0x00,
+0x6f, 0x12, 0x95, 0x01, 0x77, 0x02, 0xd2, 0x01, 0x13, 0x02, 0x55, 0x02, 0x75, 0x02, 0x74, 0x02,
+0x94, 0x02, 0xb5, 0x02, 0xd6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0xf6, 0x02, 0x17, 0x03, 0xbb, 0x8d,
+0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x9e, 0xf7, 0x7c, 0xbe, 0xb4, 0x0a, 0x75, 0x02,
+0x55, 0x02, 0xf3, 0x01, 0xd2, 0x01, 0x35, 0x02, 0xf8, 0x01, 0xef, 0x09, 0x00, 0x00, 0x00, 0x00,
+0xaf, 0x12, 0x52, 0x01, 0xba, 0x02, 0xf3, 0x01, 0x34, 0x02, 0xb7, 0x02, 0xf8, 0x02, 0x7b, 0x03,
+0xbc, 0x03, 0xdc, 0x03, 0xfd, 0x03, 0xfd, 0x03, 0x1d, 0x0c, 0x99, 0x03, 0x9a, 0x8d, 0x3c, 0xe7,
+0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x3c, 0xe7, 0x5b, 0xb6, 0x36, 0x0b, 0x39, 0x03, 0xf8, 0x02,
+0xb7, 0x02, 0x34, 0x02, 0xd2, 0x01, 0x99, 0x02, 0x97, 0x01, 0x4f, 0x12, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0x6f, 0x01, 0xda, 0x0a, 0x97, 0x02, 0x96, 0x02, 0x19, 0x03, 0x9b, 0x03, 0xfd, 0x03,
+0x1d, 0x0c, 0x3d, 0x0c, 0x3d, 0x0c, 0x5d, 0x14, 0x1a, 0x14, 0xd8, 0x5c, 0xba, 0xd6, 0xba, 0xd6,
+0xba, 0xd6, 0xdb, 0xd6, 0xdb, 0xde, 0x1a, 0xae, 0x77, 0x13, 0xba, 0x03, 0xfd, 0x03, 0x9b, 0x03,
+0x19, 0x03, 0xb7, 0x02, 0x54, 0x02, 0x1b, 0x0b, 0x31, 0x01, 0xcf, 0x12, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0x2f, 0x0a, 0x79, 0x02, 0xdd, 0x0b, 0xf8, 0x02, 0x9b, 0x03, 0xfd, 0x03, 0x3d, 0x0c,
+0x7d, 0x14, 0xbd, 0x1c, 0xdd, 0x1c, 0xfe, 0x24, 0x7a, 0x1c, 0x18, 0x6d, 0x79, 0xce, 0x79, 0xce,
+0x79, 0xce, 0x79, 0xce, 0xd9, 0xad, 0xd7, 0x23, 0x5b, 0x14, 0x7d, 0x14, 0x3d, 0x0c, 0xfd, 0x03,
+0x9b, 0x03, 0x18, 0x03, 0x7b, 0x03, 0x1b, 0x0b, 0xaf, 0x09, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xaf, 0x12, 0x31, 0x01, 0x7d, 0x24, 0xdc, 0x03, 0xfc, 0x03, 0x5d, 0x0c, 0xbd, 0x14,
+0x1e, 0x25, 0x3e, 0x2d, 0x7e, 0x35, 0x9e, 0x35, 0xfb, 0x34, 0x17, 0x6d, 0x18, 0xc6, 0x18, 0xc6,
+0x18, 0xc6, 0xb8, 0xa5, 0x57, 0x2c, 0xfb, 0x2c, 0x5e, 0x2d, 0x1e, 0x25, 0xbd, 0x14, 0x5d, 0x0c,
+0xfd, 0x03, 0x7a, 0x03, 0x9e, 0x24, 0xd6, 0x01, 0x6f, 0x12, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0x0f, 0x0a, 0xba, 0x02, 0x5f, 0x35, 0x5d, 0x0c, 0xbd, 0x14, 0x5e, 0x2d,
+0xbe, 0x3d, 0xff, 0x3d, 0x1f, 0x46, 0x3f, 0x46, 0x1e, 0x4e, 0xd7, 0x44, 0xb7, 0xa5, 0xf7, 0xbd,
+0x97, 0x95, 0xb7, 0x44, 0x9c, 0x45, 0x1f, 0x46, 0xff, 0x3d, 0xbf, 0x3d, 0x5e, 0x2d, 0xbd, 0x1c,
+0x3d, 0x04, 0x1e, 0x25, 0xbc, 0x13, 0xae, 0x09, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x8e, 0x09, 0xfc, 0x1b, 0x3f, 0x4e, 0x3e, 0x25, 0xff, 0x3d,
+0x5f, 0x4e, 0x9f, 0x56, 0xbf, 0x5e, 0xdf, 0x66, 0xdf, 0x5e, 0x3c, 0x56, 0x79, 0x4d, 0x17, 0x4d,
+0x99, 0x4d, 0x5d, 0x5e, 0xdf, 0x66, 0xbf, 0x5e, 0x9f, 0x56, 0x5f, 0x4e, 0xff, 0x3d, 0x1e, 0x25,
+0xdf, 0x3d, 0xfe, 0x34, 0x2f, 0x01, 0xcf, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xcf, 0x12, 0x4f, 0x01, 0xde, 0x34, 0xff, 0x6e, 0x5f, 0x4e,
+0xbf, 0x5e, 0x1f, 0x67, 0x3f, 0x6f, 0x5f, 0x6f, 0x5f, 0x6f, 0x5f, 0x77, 0x5f, 0x77, 0x5f, 0x77,
+0x5f, 0x77, 0x5f, 0x6f, 0x5f, 0x6f, 0x3f, 0x6f, 0x1f, 0x67, 0xdf, 0x5e, 0x3f, 0x4e, 0xbf, 0x66,
+0xdf, 0x4d, 0x72, 0x01, 0xaf, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xaf, 0x12, 0x2f, 0x01, 0xbd, 0x34, 0xbf, 0x8f,
+0x5f, 0x77, 0x5f, 0x6f, 0x9f, 0x77, 0x9f, 0x7f, 0xbf, 0x87, 0xbf, 0x87, 0xbf, 0x87, 0xbf, 0x87,
+0xbf, 0x87, 0xbf, 0x87, 0x9f, 0x7f, 0x7f, 0x7f, 0x5f, 0x6f, 0x3f, 0x6f, 0xbf, 0x87, 0xbf, 0x55,
+0x72, 0x01, 0x6f, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xcf, 0x12, 0x6f, 0x01, 0x1d, 0x2c,
+0x7f, 0x9f, 0xff, 0xaf, 0xff, 0x97, 0xdf, 0x87, 0xbf, 0x8f, 0xbf, 0x97, 0xbf, 0x9f, 0xbf, 0x9f,
+0xbf, 0x97, 0xbf, 0x8f, 0xdf, 0x87, 0xff, 0x8f, 0xff, 0xa7, 0xdf, 0xa7, 0xdd, 0x3c, 0x4f, 0x01,
+0x8f, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xce, 0x09,
+0x17, 0x02, 0x1e, 0x55, 0x5f, 0xaf, 0xff, 0xcf, 0xff, 0xc7, 0xff, 0xbf, 0xff, 0xb7, 0xff, 0xb7,
+0xff, 0xb7, 0xff, 0xc7, 0xff, 0xcf, 0xbf, 0xb7, 0xbe, 0x6d, 0xba, 0x02, 0xae, 0x09, 0xcf, 0x12,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a,
+0x8f, 0x12, 0xae, 0x09, 0xd2, 0x01, 0x9b, 0x23, 0x1d, 0x5d, 0x1e, 0x86, 0xbf, 0x9e, 0xdf, 0xa6,
+0x5f, 0x8e, 0x7e, 0x6d, 0xfc, 0x2b, 0x16, 0x02, 0x8f, 0x09, 0x4f, 0x12, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xcf, 0x12, 0x4e, 0x12, 0xce, 0x09, 0xaf, 0x09, 0x8f, 0x01, 0x8f, 0x01,
+0xaf, 0x09, 0xce, 0x09, 0x2e, 0x12, 0xaf, 0x12, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a,
+0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0xef, 0x1a, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 compressed_16x1x24[] =
+{
+0x0c, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 decompressed_16x1x24[] =
+{
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 compressed_32x32x24[] =
+{
+0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x38, 0x8a, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x1a, 0x87, 0xc0,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80,
+0x00, 0x80, 0x80, 0x80, 0x1a, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x1d, 0x84, 0xff, 0xff, 0xff,
+0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x18, 0x88, 0xc0, 0xc0, 0xc0, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00,
+0x80, 0x80, 0x80, 0x17, 0x8a, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,
+0xc0, 0xc0, 0xc0, 0x1d, 0x83, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x18, 0x89,
+0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x16, 0x8a, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x17, 0x8a, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x17, 0x97, 0xff, 0xff, 0xff,
+0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
+0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xc0,
+0xc0, 0xc0, 0x6b, 0xff, 0xff, 0xff, 0x01, 0x95, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x6c, 0xff, 0xff, 0xff, 0x86, 0x80, 0x80, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x6d, 0xff,
+0xff, 0xff, 0x01, 0x81, 0xc0, 0xc0, 0xc0, 0x6d, 0xff, 0xff, 0xff, 0x88, 0xc0, 0xc0, 0xc0, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xc0, 0x09, 0x82, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x6f, 0xff, 0xff, 0xff,
+0x02, 0x86, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xc0, 0x07, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x0f, 0x91, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80,
+0x80, 0x0f, 0x81, 0xc0, 0xc0, 0xc0, 0x06, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00,
+0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x0d, 0x85, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x06, 0x87, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80,
+0x80, 0x80, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x6e, 0xff,
+0xff, 0xff, 0x91, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x80,
+0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00,
+0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x6e, 0xff, 0xff, 0xff, 0x85, 0xc0, 0xc0, 0xc0, 0x80, 0x80,
+0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x09, 0x83, 0x80, 0x80, 0x00, 0x80,
+0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x6f, 0xff, 0xff, 0xff, 0x01, 0x84, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x08, 0x83, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0,
+0xc0, 0xc0, 0x70, 0xff, 0xff, 0xff, 0x06, 0x81, 0x80, 0x80, 0x80, 0x06, 0x82, 0x80, 0x80, 0x00,
+0xc0, 0xc0, 0xc0, 0x71, 0xff, 0xff, 0xff, 0x13, 0x83, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0xc0,
+0xc0, 0xc0, 0x0e, 0x83, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x06, 0x8a, 0x80,
+0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0x16, 0x8a, 0xc0,
+0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x6a, 0xff, 0xff,
+0xff, 0x0c, 0x89, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x18, 0x89,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0x0a, 0x86, 0xc0, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x6b,
+0xff, 0xff, 0xff, 0x01, 0x82, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x6d, 0xff, 0xff, 0xff, 0x04,
+0x81, 0xc0, 0xc0, 0xc0, 0x7c, 0xff, 0xff, 0xff, 0x83, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80,
+0x80, 0x80, 0x60, 0x0e, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff
+};
+
+uint8 decompressed_32x32x24[] =
+{
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0,
+0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
+0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
+0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80,
+0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80,
+0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80,
+0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0xc0,
+0xc0, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x80, 0x80,
+0x80, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0,
+0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80,
+0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80,
+0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0,
+0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80,
+0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80,
+0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0,
+0xc0, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80,
+0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
+0xc0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80,
+0x00, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0,
+0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80,
+0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0xc0,
+0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80,
+0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80,
+0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80,
+0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0,
+0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80,
+0x80, 0x80, 0x80, 0x80, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80,
+0x80, 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xc0,
+0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+uint8 compressed_16x1x32[] =
+{
+0x10, 0x01, 0x01, 0x01, 0x01
+};
+
+uint8 decompressed_16x1x32[] =
+{
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+uint8 compressed_32x32x32[] =
+{
+0x10, 0x02, 0x02, 0x0a, 0xbb, 0x22, 0x8e, 0xf6, 0xb9, 0x91, 0x91, 0xa9, 0xf5, 0xaa, 0x3c, 0x00,
+0x08, 0xf9, 0x5e, 0xd1, 0x59, 0x8f, 0xf7, 0xb8, 0x90, 0x90, 0xa8, 0xf4, 0xab, 0x59, 0xa3, 0x8c,
+0x00, 0x06, 0x67, 0x02, 0xe7, 0x6d, 0xd0, 0x36, 0x00, 0x67, 0x1c, 0xa2, 0x8d, 0xb9, 0x20, 0x00,
+0x05, 0x5c, 0x2c, 0x9b, 0xe6, 0x0e, 0x00, 0x46, 0xb8, 0x77, 0x66, 0x00, 0x04, 0x4f, 0x3c, 0x8b,
+0x98, 0x00, 0x45, 0x56, 0x8b, 0x84, 0x00, 0x03, 0x4d, 0x20, 0x9b, 0x5e, 0x00, 0x04, 0x44, 0x24,
+0xa5, 0x62, 0x00, 0x03, 0x3f, 0xd1, 0x5e, 0x00, 0x04, 0x43, 0x20, 0xb5, 0x1c, 0x00, 0x5f, 0x00,
+0x00, 0xdc, 0xb0, 0x00, 0x06, 0x33, 0x52, 0xcf, 0x00, 0x4f, 0x00, 0x30, 0xfd, 0x00, 0x08, 0x50,
+0xb2, 0x86, 0x00, 0x00, 0x00, 0x4f, 0x00, 0xb4, 0x20, 0x00, 0x09, 0x40, 0xd4, 0x00, 0x00, 0x00,
+0x3f, 0x04, 0xae, 0x00, 0x0a, 0x40, 0x8a, 0x32, 0x00, 0x00, 0x3f, 0x3e, 0x5e, 0x00, 0x0a, 0x40,
+0x1a, 0x74, 0x00, 0x00, 0x3f, 0x54, 0x0e, 0x00, 0x0b, 0x30, 0x64, 0x00, 0x00, 0x2f, 0x44, 0x00,
+0x0c, 0x30, 0x44, 0x00, 0x00, 0x2f, 0x1c, 0x00, 0x0c, 0x30, 0x1e, 0x00, 0x00, 0x2f, 0x03, 0x00,
+0x0c, 0x30, 0x03, 0x00, 0x00, 0x2f, 0x27, 0x00, 0x0c, 0x30, 0x29, 0x00, 0x00, 0x2f, 0x49, 0x00,
+0x0c, 0x30, 0x4d, 0x00, 0x00, 0x3f, 0x53, 0x1d, 0x00, 0x0b, 0x30, 0x69, 0x00, 0x00, 0x3f, 0x2b,
+0x79, 0x00, 0x0a, 0x40, 0x35, 0x6b, 0x00, 0x00, 0x3f, 0x00, 0xb9, 0x00, 0x0a, 0x40, 0xa5, 0x19,
+0x00, 0x00, 0x4f, 0x00, 0x9d, 0x4f, 0x00, 0x08, 0x50, 0x0b, 0xd5, 0x00, 0x00, 0x00, 0x5f, 0x00,
+0x0d, 0xf0, 0x01, 0x00, 0x07, 0x50, 0xe9, 0x4b, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x9d, 0xf6,
+0x00, 0x06, 0x33, 0xa1, 0xfa, 0x00, 0x03, 0x3f, 0xf1, 0xbf, 0x00, 0x04, 0x43, 0x67, 0xc6, 0x01,
+0x00, 0x04, 0x3d, 0xca, 0xc1, 0x00, 0x04, 0x44, 0x6f, 0x9c, 0x21, 0x00, 0x04, 0x4f, 0x07, 0xc4,
+0xf4, 0x00, 0x45, 0xbd, 0x8e, 0x31, 0x00, 0x06, 0x4b, 0xf1, 0xaa, 0x5b, 0x00, 0x56, 0x33, 0xd8,
+0xc0, 0x1b, 0x00, 0x07, 0x65, 0xa7, 0x6c, 0xae, 0x9d, 0x29, 0x00, 0x68, 0x15, 0x79, 0xde, 0x60,
+0xd5, 0x00, 0x08, 0xf9, 0x0d, 0xab, 0xa0, 0x54, 0x7a, 0xc2, 0xec, 0xf0, 0xd0, 0x8e, 0x56, 0x7c,
+0xdb, 0x29, 0x00, 0x02, 0x02, 0x19, 0x3a, 0xb9, 0x36, 0x2a, 0x1e, 0x14, 0x10, 0x10, 0x14, 0x1c,
+0x26, 0x34, 0x3a, 0x20, 0x00, 0x00, 0x08, 0xf9, 0x09, 0x21, 0x2f, 0x16, 0x98, 0xf6, 0xd1, 0xcd,
+0xf9, 0xb4, 0x38, 0x2f, 0x27, 0x0f, 0x00, 0x07, 0xf0, 0x1f, 0x2d, 0x8c, 0xb1, 0xaf, 0xd2, 0x6a,
+0x26, 0x20, 0x54, 0xb2, 0xcd, 0x9b, 0xc2, 0x21, 0x37, 0x25, 0x03, 0x00, 0x05, 0xf0, 0x05, 0x27,
+0x3e, 0xcb, 0xae, 0x33, 0x85, 0x6f, 0x4b, 0x33, 0x31, 0x45, 0x65, 0x85, 0x53, 0x66, 0x70, 0xbd,
+0x6a, 0x2b, 0x0b, 0x00, 0x04, 0xf0, 0x05, 0x29, 0x56, 0xba, 0x4b, 0x75, 0x39, 0x13, 0x17, 0x23,
+0x21, 0x21, 0x23, 0x1b, 0x11, 0x85, 0x21, 0x6d, 0x75, 0x8c, 0x98, 0x29, 0x0f, 0x00, 0x03, 0xf0,
+0x03, 0x29, 0x62, 0x6e, 0x79, 0x31, 0x11, 0x11, 0x1b, 0x21, 0x1b, 0x25, 0x29, 0x1b, 0x21, 0xa4,
+0x1d, 0x1d, 0x0b, 0x17, 0x79, 0x20, 0x98, 0x25, 0x0b, 0x00, 0x03, 0xf0, 0x21, 0x2a, 0x30, 0x8b,
+0x19, 0x1b, 0x21, 0x1f, 0x19, 0x1f, 0x39, 0x49, 0x47, 0x49, 0x2d, 0xb3, 0x19, 0x1f, 0x21, 0x1f,
+0x11, 0x7b, 0x1d, 0x60, 0x23, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x19, 0x11, 0x2c, 0x87, 0x1d, 0x25,
+0x2b, 0x29, 0x2b, 0x31, 0x2d, 0x25, 0xa2, 0xe3, 0xdc, 0x8c, 0x2f, 0x3f, 0x2b, 0x29, 0x29, 0x25,
+0x13, 0x71, 0x19, 0x1c, 0x21, 0x00, 0xf0, 0x00, 0x05, 0x1b, 0x42, 0x5d, 0x11, 0x15, 0x29, 0x2b,
+0x2b, 0x27, 0x27, 0x2f, 0x4e, 0x46, 0xf0, 0x0e, 0x5c, 0xc8, 0x21, 0x31, 0x29, 0x2d, 0x29, 0x1b,
+0x09, 0x47, 0x1c, 0x11, 0x0f, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00,
+0x0f, 0x17, 0x1d, 0x1f, 0x25, 0x23, 0x21, 0x08, 0x12, 0xf0, 0x12, 0x12, 0x50, 0xf2, 0x13, 0x25,
+0x1d, 0x17, 0x0f, 0x00, 0x00, 0x3f, 0x16, 0x17, 0x00, 0x20, 0x00, 0x00, 0xf3, 0x00, 0x13, 0x0e,
+0x15, 0x00, 0x00, 0x03, 0x0f, 0x15, 0x1b, 0x1d, 0x1f, 0x1b, 0x1f, 0x16, 0xe0, 0x60, 0xe7, 0x05,
+0x17, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x05, 0x00, 0x00, 0x43, 0x07, 0x09, 0x0b, 0x00,
+0xf0, 0x03, 0x0d, 0x11, 0x13, 0x15, 0x11, 0xaf, 0x9b, 0x1a, 0x1a, 0x1a, 0x18, 0x70, 0xbd, 0x0e,
+0x23, 0x03, 0x00, 0x50, 0x11, 0x00, 0x0b, 0x00, 0x00, 0x45, 0x09, 0x00, 0x03, 0x00, 0x83, 0x01,
+0x05, 0x09, 0x0f, 0x0b, 0xf2, 0xab, 0x18, 0x45, 0x7a, 0xa3, 0x1c, 0x00, 0x30, 0x0b, 0x00, 0x00,
+0x24, 0x05, 0x00, 0xb3, 0x84, 0x63, 0x05, 0x07, 0x09, 0x09, 0x07, 0x09, 0x0b, 0xdc, 0x18, 0x54,
+0x1a, 0x86, 0x91, 0x1e, 0x00, 0x30, 0x07, 0x00, 0x00, 0x24, 0x03, 0x00, 0x58, 0xbd, 0x60, 0x02,
+0x04, 0x06, 0x73, 0x04, 0x00, 0x00, 0x72, 0x93, 0x18, 0x00, 0x30, 0x03, 0x00, 0x00, 0x8f, 0x00,
+0x30, 0xe4, 0xac, 0x66, 0x20, 0x06, 0x00, 0x90, 0x05, 0x1e, 0x64, 0xae, 0xf2, 0x7c, 0x02, 0x00,
+0x00, 0x9d, 0x06, 0x60, 0x6c, 0x56, 0x7e, 0x98, 0xdf, 0x4b, 0x00, 0xa0, 0x5d, 0xe3, 0x84, 0x7e,
+0x54, 0x5a, 0x7c, 0x04, 0x00, 0x00, 0xf0, 0x08, 0x0a, 0x16, 0x12, 0x0a, 0x16, 0x3b, 0xe2, 0x86,
+0x76, 0x6c, 0x62, 0x5a, 0x54, 0x50, 0x24, 0xb1, 0x00, 0xb0, 0x53, 0xf9, 0x10, 0x14, 0x0c, 0x10,
+0x14, 0x0a, 0x08, 0x00, 0x00, 0xf0, 0x08, 0x0d, 0x18, 0x16, 0x16, 0x14, 0x12, 0x14, 0x0c, 0x10,
+0x0c, 0x0e, 0x0a, 0x0c, 0xfb, 0x23, 0xb2, 0x00, 0xc0, 0x53, 0xf8, 0x02, 0x14, 0x14, 0x16, 0x18,
+0x1e, 0x07, 0x0c, 0x00, 0x00, 0xf0, 0x06, 0x59, 0x00, 0x20, 0x12, 0x14, 0x18, 0x14, 0x14, 0x0e,
+0x0e, 0x0c, 0x10, 0xb0, 0xac, 0x13, 0x00, 0xd0, 0x53, 0xfa, 0x00, 0x14, 0x16, 0x16, 0x12, 0x1c,
+0x1c, 0x75, 0x0e, 0x00, 0x00, 0xf3, 0x00, 0x0d, 0x55, 0x34, 0x18, 0x18, 0x16, 0x16, 0x14, 0x12,
+0x12, 0x10, 0x12, 0x26, 0x00, 0xe0, 0x53, 0xfd, 0x02, 0x16, 0x18, 0x16, 0x16, 0x18, 0x2c, 0x23,
+0x67, 0x02, 0x00, 0x00, 0xf0, 0x00, 0x12, 0xc7, 0x22, 0x26, 0x18, 0x1a, 0x16, 0x16, 0x18, 0x16,
+0x16, 0x14, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x4f, 0xf5, 0x00, 0x16, 0x16, 0x16, 0x1a, 0x18, 0x24,
+0x3c, 0xa9, 0x14, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x02, 0x39, 0x99, 0x4a, 0x28, 0x1e, 0x22,
+0x24, 0x20, 0x1c, 0x1c, 0x1a, 0x63, 0x33, 0xf0, 0x00, 0x57, 0xe7, 0x08, 0x1c, 0x1e, 0x24, 0x24,
+0x1e, 0x28, 0x48, 0x4d, 0xb1, 0x08, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x12, 0xe9, 0x59,
+0x58, 0x30, 0x2a, 0x2a, 0x2c, 0x2c, 0x28, 0x26, 0x06, 0xf9, 0xe3, 0xf6, 0xd3, 0x12, 0x28, 0x2c,
+0x2e, 0x2a, 0x28, 0x30, 0x52, 0x07, 0xc8, 0x1e, 0x00, 0x03, 0xf0, 0x1c, 0xd8, 0x43, 0x58, 0x2a,
+0x20, 0x24, 0x26, 0x26, 0x28, 0x26, 0x24, 0x00, 0x26, 0x28, 0xa4, 0x26, 0x28, 0x22, 0x20, 0x2a,
+0x4e, 0x08, 0xb8, 0x0c, 0x00, 0x04, 0xf0, 0x1c, 0xb8, 0x5b, 0x5a, 0x36, 0x24, 0x26, 0x28, 0x26,
+0x28, 0x2a, 0x2a, 0x28, 0x26, 0x28, 0x94, 0x24, 0x26, 0x34, 0x58, 0x0f, 0xa0, 0x17, 0x04, 0x00,
+0x05, 0xf0, 0x1e, 0xc8, 0x91, 0x5a, 0x58, 0x3a, 0x2a, 0x2a, 0x28, 0x24, 0x24, 0x28, 0x2a, 0x2c,
+0x36, 0x75, 0x54, 0x6c, 0x5b, 0x8e, 0x13, 0x06, 0x00, 0x06, 0xf0, 0x1c, 0xff, 0xa8, 0x49, 0x48,
+0x6c, 0x5e, 0x4e, 0x4a, 0x4a, 0x4e, 0x5a, 0x6a, 0x5a, 0x1d, 0x56, 0xd2, 0xc6, 0x14, 0x04, 0x00,
+0x07, 0xf0, 0x14, 0x3b, 0xc8, 0x80, 0xfb, 0x67, 0x17, 0x0e, 0x12, 0x0d, 0x53, 0xd7, 0x90, 0x9a,
+0x77, 0x28, 0x18, 0x00, 0x08, 0xf9, 0x02, 0x14, 0x07, 0x95, 0xe6, 0xa6, 0x86, 0x80, 0x9a, 0xd4,
+0xbd, 0x25, 0x1a, 0x04, 0x00, 0x02, 0x02, 0x19, 0xbe, 0xb9, 0xb6, 0x98, 0x76, 0x6a, 0x62, 0x62,
+0x68, 0x74, 0x8e, 0xb0, 0xbe, 0x20, 0x00, 0x00, 0x08, 0xf9, 0x19, 0x51, 0x45, 0x48, 0xd0, 0xe5,
+0xb5, 0xaf, 0xd7, 0xe6, 0x6c, 0x29, 0x5b, 0x23, 0x00, 0x07, 0xf0, 0x4b, 0x23, 0xd6, 0x9d, 0xe1,
+0xb8, 0x7a, 0x52, 0x4c, 0x6e, 0xa4, 0xfb, 0x9d, 0xf3, 0x12, 0x37, 0x55, 0x07, 0x00, 0x05, 0xf0,
+0x07, 0x5f, 0x92, 0xa3, 0xbc, 0x2c, 0x07, 0x0f, 0x11, 0x13, 0x13, 0x11, 0x0f, 0x09, 0x12, 0x66,
+0x90, 0xb5, 0xc8, 0x65, 0x15, 0x00, 0x04, 0xa3, 0x0b, 0x65, 0xca, 0xea, 0x07, 0x2b, 0x1d, 0x0f,
+0x05, 0x01, 0xa5, 0x05, 0x0d, 0x1b, 0x29, 0x27, 0xba, 0xe7, 0x4b, 0x1f, 0x00, 0x03, 0xf0, 0x03,
+0x5f, 0xe6, 0x96, 0x5b, 0x27, 0x11, 0x15, 0x15, 0x11, 0x13, 0x11, 0x17, 0x13, 0x11, 0xa4, 0x15,
+0x13, 0x13, 0x1d, 0x5d, 0x42, 0xe7, 0x43, 0x11, 0x00, 0x03, 0xf0, 0x53, 0xa6, 0x56, 0x75, 0x19,
+0x17, 0x1f, 0x1d, 0x1d, 0x1f, 0x49, 0x79, 0x89, 0x71, 0x41, 0xb3, 0x1d, 0x1d, 0x1f, 0x1b, 0x11,
+0x65, 0x00, 0xe2, 0x5d, 0x03, 0x00, 0xf0, 0x00, 0x00, 0x35, 0x44, 0x5c, 0x77, 0x1d, 0x23, 0x29,
+0x27, 0x27, 0x27, 0x31, 0x5b, 0x0c, 0xe3, 0x32, 0x03, 0x67, 0x4f, 0x27, 0x27, 0x29, 0x25, 0x15,
+0x65, 0x0a, 0x9a, 0x4f, 0x00, 0xf0, 0x00, 0x0b, 0x39, 0x72, 0x5f, 0x1b, 0x15, 0x27, 0x27, 0x29,
+0x29, 0x29, 0x45, 0x12, 0x1e, 0xf0, 0x0e, 0x26, 0x42, 0x4f, 0x4b, 0x27, 0x27, 0x29, 0x19, 0x0f,
+0x67, 0x3e, 0x06, 0x1f, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x23, 0x4a, 0x2b, 0x35, 0x13, 0x15,
+0x1d, 0x23, 0x23, 0x29, 0x27, 0x21, 0x00, 0x12, 0xf0, 0x12, 0x12, 0x2a, 0x64, 0x45, 0x3f, 0x23,
+0x1b, 0x15, 0x19, 0x1d, 0x4d, 0x54, 0x33, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x01, 0x33, 0x1e, 0x4b,
+0x17, 0x1f, 0x1d, 0x13, 0x1b, 0x1d, 0x21, 0x21, 0x1b, 0x11, 0x16, 0xf0, 0x16, 0x16, 0x18, 0x3a,
+0x8e, 0x31, 0x2f, 0x13, 0x19, 0x1f, 0x17, 0x47, 0x01, 0x1b, 0x07, 0x20, 0x00, 0x00, 0xf0, 0x09,
+0x09, 0x07, 0x29, 0x17, 0x1b, 0x21, 0x21, 0x17, 0x17, 0x15, 0x19, 0x02, 0x4f, 0x4d, 0xf0, 0x1a,
+0x1a, 0x18, 0x18, 0x4a, 0xb2, 0x25, 0x31, 0x25, 0x1b, 0x19, 0x19, 0x1d, 0x18, 0x1f, 0x20, 0x00,
+0x00, 0xf0, 0x13, 0x12, 0x13, 0x07, 0x0d, 0x17, 0x25, 0x3b, 0x45, 0x49, 0x45, 0x43, 0x45, 0x21,
+0x9f, 0x23, 0x5d, 0x18, 0xc0, 0x54, 0xd4, 0x1f, 0x23, 0x17, 0x0f, 0x03, 0x1b, 0x16, 0x15, 0x00,
+0x00, 0xf0, 0x1b, 0x16, 0x15, 0x00, 0x01, 0x13, 0x44, 0xe3, 0xa7, 0xaf, 0xb9, 0xbf, 0xc3, 0xc5,
+0xc7, 0x23, 0x8e, 0x18, 0xc0, 0x1a, 0x62, 0xfd, 0x0b, 0x11, 0x00, 0x00, 0x13, 0x0a, 0x17, 0x00,
+0x00, 0xb8, 0x05, 0x04, 0x02, 0x04, 0x0b, 0x13, 0xf8, 0x46, 0x02, 0x04, 0x06, 0xd0, 0x04, 0x00,
+0x00, 0x54, 0xe7, 0x03, 0x0d, 0x04, 0x0c, 0x01, 0x03, 0x00, 0x00, 0x8f, 0x06, 0x4c, 0xde, 0xbc,
+0x8c, 0x48, 0x08, 0x00, 0x90, 0x04, 0x42, 0x8a, 0xbc, 0xee, 0x88, 0x04, 0x00, 0x00, 0x9d, 0x0e,
+0x4e, 0x50, 0x3e, 0x5e, 0x88, 0x89, 0x2f, 0x00, 0xa0, 0x3b, 0x89, 0x7e, 0x60, 0x3e, 0x40, 0x62,
+0x18, 0x00, 0x00, 0xf0, 0x1a, 0x0c, 0x0c, 0x08, 0x02, 0x12, 0x1b, 0xa7, 0xdf, 0xe5, 0xeb, 0xef,
+0xf1, 0xf5, 0xf7, 0x24, 0x65, 0x00, 0xb0, 0x31, 0x91, 0x16, 0x10, 0x04, 0x06, 0x08, 0x08, 0x1e,
+0x00, 0x00, 0x93, 0x0e, 0x09, 0x10, 0x0c, 0x0c, 0x0a, 0x08, 0x08, 0x04, 0x53, 0x00, 0x02, 0x94,
+0x66, 0x00, 0xc0, 0x31, 0x9f, 0x01, 0x0a, 0x0a, 0x0c, 0x0e, 0x16, 0x07, 0x0a, 0x00, 0x00, 0xf0,
+0x06, 0x45, 0x03, 0x16, 0x08, 0x08, 0x0a, 0x08, 0x06, 0x02, 0x02, 0x02, 0x06, 0x66, 0x64, 0x13,
+0x00, 0x43, 0x33, 0xa3, 0x03, 0x08, 0x60, 0x12, 0x12, 0x59, 0x14, 0x00, 0x00, 0xf3, 0x00, 0x21,
+0x41, 0x28, 0x0c, 0x0c, 0x0c, 0x0a, 0x08, 0x08, 0x06, 0x04, 0x02, 0x12, 0x00, 0xe0, 0x33, 0x9d,
+0x01, 0x08, 0x0c, 0x0c, 0x0c, 0x0e, 0x20, 0x19, 0x55, 0x02, 0x00, 0x00, 0xf0, 0x00, 0x0a, 0x9b,
+0x1c, 0x1e, 0x10, 0x0e, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x0a, 0x05, 0x00, 0xf0, 0x00, 0x00, 0x31,
+0x9b, 0x05, 0x0a, 0x0a, 0x0a, 0x10, 0x0e, 0x1a, 0x2e, 0x7f, 0x09, 0x00, 0x20, 0x00, 0x00, 0xf0,
+0x00, 0x04, 0x39, 0x71, 0x36, 0x18, 0x12, 0x14, 0x14, 0x10, 0x10, 0x0e, 0x0a, 0x41, 0x21, 0xf0,
+0x00, 0x37, 0x97, 0x00, 0x10, 0x0e, 0x14, 0x14, 0x10, 0x18, 0x34, 0x37, 0x89, 0x0a, 0x00, 0x20,
+0x00, 0x00, 0xf0, 0x00, 0x00, 0x0a, 0xb7, 0x3b, 0x42, 0x1c, 0x16, 0x16, 0x16, 0x14, 0x12, 0x10,
+0x03, 0xa7, 0xe3, 0xb1, 0x8f, 0x04, 0x12, 0x14, 0x18, 0x16, 0x16, 0x1c, 0x3c, 0x01, 0xe3, 0x04,
+0x00, 0x03, 0xf0, 0x0a, 0xdd, 0x29, 0x42, 0x1c, 0x12, 0x14, 0x14, 0x14, 0x16, 0x14, 0x12, 0x05,
+0x14, 0x16, 0xa4, 0x14, 0x16, 0x12, 0x12, 0x1c, 0x3a, 0x0e, 0xef, 0x09, 0x00, 0x04, 0xf0, 0x06,
+0xf5, 0x35, 0x44, 0x28, 0x18, 0x18, 0x18, 0x16, 0x16, 0x1a, 0x1a, 0x16, 0x16, 0x18, 0x85, 0x16,
+0x1a, 0x24, 0x40, 0x01, 0xfd, 0x25, 0x00, 0x05, 0xf0, 0x0c, 0xed, 0x5d, 0x44, 0x42, 0x2a, 0x20,
+0x1c, 0x1c, 0x16, 0x16, 0x1c, 0x1c, 0x20, 0x26, 0x75, 0x3e, 0x52, 0x37, 0xf4, 0x1d, 0x08, 0x00,
+0x06, 0xf0, 0x10, 0xcb, 0xef, 0x2b, 0x38, 0x4e, 0x46, 0x38, 0x36, 0x36, 0x38, 0x44, 0x4c, 0x44,
+0x0d, 0x56, 0xcf, 0xed, 0x02, 0x02, 0x00, 0x07, 0xf0, 0x14, 0x37, 0xed, 0xf8, 0xa9, 0x41, 0x0b,
+0x0e, 0x10, 0x03, 0x33, 0x8f, 0xf9, 0xfc, 0x65, 0x28, 0x12, 0x00, 0x08, 0xf9, 0x04, 0x14, 0x11,
+0x77, 0xd5, 0xff, 0xf2, 0xf2, 0xfa, 0xe3, 0x95, 0x27, 0x10, 0x08, 0x00, 0x02, 0x02, 0x19, 0xf4,
+0xb9, 0xf2, 0xec, 0xe0, 0xf0, 0xfc, 0xfc, 0xf6, 0xe8, 0xea, 0xf2, 0xf4, 0x20, 0x00, 0x00, 0x08,
+0xf9, 0x01, 0x07, 0x3c, 0xd0, 0xfe, 0xfe, 0xfa, 0xfa, 0xfc, 0xfe, 0xde, 0x74, 0x03, 0x03, 0x00,
+0x07, 0xf0, 0x09, 0x7e, 0xf6, 0xd0, 0x42, 0x20, 0x10, 0x08, 0x08, 0x0c, 0x18, 0x36, 0x98, 0xfe,
+0xbe, 0x37, 0x09, 0x01, 0x00, 0x05, 0xf0, 0x01, 0x05, 0xe6, 0x8e, 0x1c, 0x00, 0x00, 0x00, 0x01,
+0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x66, 0x10, 0x50, 0xf4, 0x06, 0x01, 0x00, 0x04, 0x54, 0x01,
+0x03, 0xf0, 0x2e, 0x00, 0x54, 0x02, 0x04, 0x04, 0x02, 0x00, 0x55, 0x20, 0xf8, 0x36, 0x05, 0x00,
+0x03, 0x66, 0x02, 0x03, 0xf4, 0x20, 0x01, 0x00, 0x25, 0x05, 0x00, 0x64, 0x03, 0x0e, 0xca, 0x3c,
+0x02, 0x00, 0x03, 0xf0, 0x0b, 0xdc, 0x18, 0x11, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x33, 0x6b,
+0x81, 0x5f, 0x27, 0xa4, 0x00, 0x00, 0x00, 0x03, 0x07, 0x15, 0x02, 0xba, 0x01, 0x00, 0xf0, 0x00,
+0x00, 0x05, 0xb8, 0x26, 0x1d, 0x0f, 0x09, 0x0b, 0x07, 0x07, 0x05, 0x0f, 0x51, 0x19, 0xe3, 0x02,
+0x25, 0x5d, 0x37, 0x07, 0x09, 0x07, 0x07, 0x09, 0x19, 0x0a, 0xcc, 0x05, 0x00, 0xf0, 0x00, 0x01,
+0x22, 0x3c, 0x21, 0x11, 0x01, 0x0b, 0x09, 0x0d, 0x0b, 0x0b, 0x35, 0x02, 0x0e, 0xf0, 0x0e, 0x0e,
+0x0a, 0x51, 0x3b, 0x0d, 0x0d, 0x0b, 0x03, 0x09, 0x41, 0x26, 0x74, 0x03, 0x00, 0x20, 0x00, 0x00,
+0xf0, 0x00, 0x06, 0x8c, 0x0d, 0x43, 0x15, 0x07, 0x05, 0x07, 0x07, 0x0b, 0x09, 0x0b, 0x0a, 0x12,
+0xf0, 0x12, 0x12, 0x16, 0x1c, 0x49, 0x31, 0x07, 0x05, 0x07, 0x1b, 0x23, 0x27, 0x4e, 0x02, 0x00,
+0x20, 0x00, 0x00, 0xf0, 0x00, 0x02, 0x10, 0x59, 0x1f, 0x1f, 0x19, 0x05, 0x07, 0x05, 0x05, 0x07,
+0x02, 0x04, 0x16, 0xf0, 0x16, 0x16, 0x18, 0x20, 0x32, 0x43, 0x2f, 0x05, 0x15, 0x1f, 0x15, 0x71,
+0x02, 0x22, 0x02, 0x20, 0x00, 0x00, 0xf0, 0x02, 0x30, 0x07, 0x43, 0x1d, 0x1d, 0x29, 0x1f, 0x0d,
+0x09, 0x07, 0x07, 0x26, 0x10, 0x09, 0xf0, 0x1a, 0x1a, 0x18, 0x18, 0x28, 0x46, 0x3d, 0x41, 0x31,
+0x1d, 0x23, 0x21, 0x21, 0x5e, 0x05, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x30, 0x2b, 0x0b, 0x13, 0x23,
+0x3b, 0x67, 0x77, 0x77, 0x6d, 0x67, 0x65, 0x29, 0x33, 0x23, 0x15, 0x18, 0xc0, 0x2e, 0x54, 0x49,
+0x35, 0x23, 0x1b, 0x00, 0x3d, 0x10, 0x08, 0x00, 0x00, 0xf0, 0x0b, 0x10, 0x31, 0x01, 0x07, 0x2b,
+0x01, 0x8c, 0xae, 0xa4, 0x96, 0x8e, 0x8a, 0x8a, 0x88, 0x23, 0x46, 0x18, 0xc0, 0x1a, 0x3c, 0x88,
+0x31, 0x25, 0x00, 0x00, 0x27, 0x09, 0x09, 0x00, 0x00, 0xb8, 0x06, 0x11, 0x00, 0x02, 0x05, 0x21,
+0x94, 0x28, 0x02, 0x04, 0x06, 0xd0, 0x04, 0x00, 0x00, 0x30, 0xa6, 0x21, 0x09, 0x03, 0x10, 0x15,
+0x0a, 0x00, 0x00, 0x8f, 0x06, 0x48, 0x8c, 0x94, 0x82, 0x5a, 0x0a, 0x00, 0x90, 0x0e, 0x56, 0x7e,
+0x94, 0x9a, 0x56, 0x0a, 0x00, 0x00, 0x9d, 0x06, 0x18, 0x1c, 0x16, 0x1e, 0x56, 0x33, 0x11, 0x00,
+0xa0, 0x15, 0x31, 0x5a, 0x24, 0x16, 0x16, 0x20, 0x08, 0x00, 0x00, 0xf0, 0x04, 0x04, 0x02, 0x00,
+0x01, 0x10, 0x08, 0x2b, 0x39, 0x39, 0x39, 0x37, 0x33, 0x33, 0x35, 0x24, 0x15, 0x00, 0xb0, 0x0b,
+0x25, 0x1e, 0x0a, 0x01, 0x01, 0x00, 0x02, 0x08, 0x00, 0x00, 0xf0, 0x07, 0x0f, 0x04, 0x04, 0x02,
+0x00, 0x03, 0x00, 0x05, 0x00, 0x01, 0x01, 0x07, 0x05, 0x1e, 0x23, 0x16, 0x00, 0xc0, 0x0b, 0x2f,
+0x01, 0x01, 0x00, 0x02, 0x04, 0x06, 0x05, 0x0f, 0x00, 0x00, 0xf0, 0x03, 0x3b, 0x01, 0x08, 0x00,
+0x00, 0x02, 0x00, 0x01, 0x07, 0x05, 0x05, 0x01, 0x14, 0x18, 0x13, 0x00, 0xd0, 0x0d, 0x31, 0x05,
+0x01, 0x00, 0x00, 0x00, 0x08, 0x08, 0x2f, 0x07, 0x00, 0x00, 0xf3, 0x00, 0x57, 0x15, 0x10, 0x04,
+0x04, 0x02, 0x01, 0x00, 0x01, 0x01, 0x03, 0x05, 0x04, 0x00, 0xe0, 0x0f, 0x31, 0x03, 0x00, 0x02,
+0x02, 0x04, 0x06, 0x0c, 0x09, 0x4d, 0x05, 0x00, 0x00, 0xf0, 0x00, 0x21, 0x51, 0x0a, 0x0c, 0x02,
+0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x2f, 0x05, 0x01,
+0x01, 0x01, 0x02, 0x00, 0x08, 0x12, 0x31, 0x57, 0x00, 0x20, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x73,
+0x25, 0x16, 0x0a, 0x04, 0x02, 0x04, 0x00, 0x00, 0x01, 0x00, 0x17, 0x09, 0xf0, 0x00, 0x11, 0x2f,
+0x05, 0x00, 0x01, 0x04, 0x04, 0x04, 0x0c, 0x16, 0x13, 0x71, 0x09, 0x00, 0x20, 0x00, 0x00, 0xf0,
+0x00, 0x00, 0x21, 0x97, 0x13, 0x1a, 0x0c, 0x08, 0x04, 0x04, 0x02, 0x00, 0x03, 0x07, 0x3d, 0xe3,
+0x3f, 0x35, 0x07, 0x00, 0x02, 0x06, 0x04, 0x08, 0x0a, 0x18, 0x00, 0x79, 0x55, 0x00, 0x03, 0xf0,
+0x43, 0x81, 0x0d, 0x1a, 0x0c, 0x06, 0x06, 0x04, 0x02, 0x04, 0x04, 0x02, 0x05, 0x04, 0x04, 0xa4,
+0x02, 0x08, 0x02, 0x04, 0x0a, 0x18, 0x04, 0x6d, 0x6d, 0x00, 0x04, 0xf0, 0x65, 0x8d, 0x0d, 0x1a,
+0x10, 0x0a, 0x0a, 0x0a, 0x06, 0x04, 0x08, 0x08, 0x04, 0x06, 0x0a, 0x94, 0x06, 0x0c, 0x12, 0x1a,
+0x02, 0x73, 0x85, 0x07, 0x00, 0x05, 0xf0, 0x5d, 0xaf, 0x1d, 0x1a, 0x1a, 0x12, 0x0c, 0x0c, 0x0c,
+0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x10, 0x75, 0x1a, 0x20, 0x0f, 0x91, 0x83, 0x05, 0x00, 0x06, 0xf0,
+0x3b, 0xc3, 0x6d, 0x0b, 0x16, 0x20, 0x1c, 0x16, 0x18, 0x18, 0x16, 0x1a, 0x20, 0x1c, 0x00, 0x56,
+0x57, 0xbb, 0x65, 0x03, 0x00, 0x07, 0xf0, 0x17, 0x8d, 0xcf, 0x87, 0x43, 0x11, 0x02, 0x08, 0x0a,
+0x04, 0x0d, 0x35, 0x79, 0xbf, 0xa7, 0x28, 0x2d, 0x00, 0x08, 0xf9, 0x01, 0x17, 0x73, 0xb5, 0xd5,
+0xcf, 0xb5, 0xb3, 0xc7, 0xd3, 0xc1, 0x85, 0x31, 0x03, 0x00
+};
+
+uint8 decompressed_32x32x32[] =
+{
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7b, 0x5c, 0x1b, 0x14,
+0x80, 0x57, 0x16, 0x3c, 0x89, 0x54, 0x12, 0x60, 0x98, 0x56, 0x10, 0x75, 0x9a, 0x57, 0x0f, 0x77,
+0x8e, 0x55, 0x11, 0x67, 0x82, 0x56, 0x15, 0x46, 0x7c, 0x59, 0x19, 0x1f, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7b, 0x5d, 0x1c, 0x07, 0x86, 0x55, 0x13, 0x56, 0xb4, 0x68, 0x21, 0xb0, 0xd6, 0x98, 0x66, 0xea,
+0xeb, 0xc2, 0xa3, 0xff, 0xf1, 0xd4, 0xbf, 0xff, 0xf3, 0xdd, 0xcd, 0xff, 0xf4, 0xde, 0xcf, 0xff,
+0xf2, 0xd8, 0xc4, 0xff, 0xec, 0xc8, 0xab, 0xff, 0xdd, 0xa4, 0x78, 0xf4, 0xbd, 0x73, 0x30, 0xc2,
+0x93, 0x57, 0x10, 0x6e, 0x7c, 0x5b, 0x1b, 0x15, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x86, 0x55, 0x13, 0x54,
+0xc2, 0x79, 0x3a, 0xd1, 0xee, 0xcc, 0xaf, 0xff, 0xf8, 0xec, 0xe1, 0xff, 0xf8, 0xed, 0xe4, 0xff,
+0xf4, 0xe3, 0xd7, 0xff, 0xf0, 0xda, 0xcb, 0xff, 0xef, 0xd6, 0xc6, 0xff, 0xef, 0xd6, 0xc6, 0xff,
+0xf0, 0xda, 0xcb, 0xff, 0xf3, 0xe2, 0xd5, 0xff, 0xf8, 0xec, 0xe4, 0xff, 0xfa, 0xf0, 0xe8, 0xff,
+0xf3, 0xd9, 0xc3, 0xff, 0xd0, 0x8e, 0x57, 0xe5, 0x91, 0x56, 0x11, 0x6b, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x98, 0x57, 0x0f, 0x79, 0xe8, 0xbb, 0x93, 0xff,
+0xf9, 0xf1, 0xe6, 0xff, 0xf4, 0xe2, 0xd4, 0xff, 0xed, 0xd0, 0xbd, 0xff, 0xe8, 0xc6, 0xae, 0xff,
+0xe6, 0xc0, 0xa8, 0xff, 0xe5, 0xbe, 0xa4, 0xff, 0xe3, 0xbb, 0xa1, 0xff, 0xe3, 0xbb, 0xa1, 0xff,
+0xe5, 0xbe, 0xa4, 0xff, 0xe6, 0xc0, 0xa8, 0xff, 0xe8, 0xc6, 0xaf, 0xff, 0xec, 0xce, 0xbb, 0xff,
+0xf3, 0xe0, 0xd2, 0xff, 0xfc, 0xf6, 0xee, 0xff, 0xef, 0xcd, 0xae, 0xff, 0xad, 0x5e, 0x13, 0xa0,
+0x7c, 0x5e, 0x1b, 0x0e, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x04, 0xa9, 0x59, 0x0e, 0x9e, 0xf0, 0xce, 0xab, 0xff, 0xf7, 0xea, 0xdc, 0xff,
+0xec, 0xcf, 0xb9, 0xff, 0xe7, 0xc1, 0xa8, 0xff, 0xe4, 0xbb, 0xa0, 0xff, 0xe2, 0xb6, 0x99, 0xff,
+0xe0, 0xb2, 0x93, 0xff, 0xdf, 0xb0, 0x90, 0xff, 0xe0, 0xb0, 0x8f, 0xff, 0xe0, 0xb0, 0x8f, 0xff,
+0xdf, 0xb0, 0x90, 0xff, 0xe0, 0xb2, 0x93, 0xff, 0xe2, 0xb6, 0x99, 0xff, 0xe4, 0xbb, 0xa0, 0xff,
+0xe6, 0xc1, 0xa8, 0xff, 0xec, 0xcd, 0xb8, 0xff, 0xf7, 0xe9, 0xdc, 0xff, 0xf6, 0xe4, 0xcc, 0xff,
+0xbe, 0x6d, 0x25, 0xc7, 0x7d, 0x5b, 0x1a, 0x19, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0xad, 0x5c, 0x0f, 0x9f, 0xf0, 0xd4, 0xb2, 0xff, 0xf7, 0xe9, 0xd9, 0xff, 0xea, 0xc8, 0xaf, 0xff,
+0xe4, 0xbb, 0x9e, 0xff, 0xe2, 0xb5, 0x96, 0xff, 0xdf, 0xaf, 0x8d, 0xff, 0xdd, 0xaa, 0x85, 0xff,
+0xdd, 0xa7, 0x80, 0xff, 0xdd, 0xa5, 0x7c, 0xff, 0xdc, 0xa3, 0x7a, 0xff, 0xdc, 0xa3, 0x7a, 0xff,
+0xdd, 0xa5, 0x7c, 0xff, 0xdd, 0xa7, 0x80, 0xff, 0xdd, 0xaa, 0x85, 0xff, 0xe1, 0xb0, 0x8e, 0xff,
+0xe0, 0xb4, 0x95, 0xff, 0xe3, 0xbb, 0x9e, 0xff, 0xea, 0xc9, 0xb0, 0xff, 0xf5, 0xe5, 0xd4, 0xff,
+0xf8, 0xec, 0xd5, 0xff, 0xc0, 0x6e, 0x26, 0xcb, 0x7e, 0x5f, 0x1b, 0x11, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x9c, 0x5a, 0x0f, 0x79,
+0xee, 0xcb, 0xa3, 0xff, 0xf7, 0xe9, 0xd4, 0xff, 0xea, 0xc8, 0xad, 0xff, 0xe4, 0xba, 0x9a, 0xff,
+0xe1, 0xb2, 0x8e, 0xff, 0xdf, 0xab, 0x84, 0xff, 0xdd, 0xa5, 0x7a, 0xff, 0xdc, 0xa0, 0x72, 0xff,
+0xdb, 0x9c, 0x6c, 0xff, 0xdb, 0x9b, 0x69, 0xff, 0xdb, 0x9a, 0x68, 0xff, 0xdf, 0xa6, 0x7a, 0xff,
+0xdb, 0x9b, 0x69, 0xff, 0xdb, 0x9c, 0x6c, 0xff, 0xdc, 0xa0, 0x72, 0xff, 0xdd, 0xa5, 0x7a, 0xff,
+0xdf, 0xab, 0x84, 0xff, 0xe1, 0xb2, 0x8e, 0xff, 0xe5, 0xbb, 0x9b, 0xff, 0xe9, 0xc8, 0xad, 0xff,
+0xf6, 0xe5, 0xd1, 0xff, 0xf7, 0xe6, 0xca, 0xff, 0xb5, 0x64, 0x15, 0xae, 0x7a, 0x5f, 0x1d, 0x01,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x8b, 0x5a, 0x14, 0x4f, 0xe8, 0xb6, 0x84, 0xfe,
+0xf8, 0xe9, 0xd0, 0xff, 0xea, 0xc8, 0xa8, 0xff, 0xe4, 0xba, 0x95, 0xff, 0xe0, 0xaf, 0x85, 0xff,
+0xdf, 0xa7, 0x79, 0xff, 0xdd, 0xa0, 0x6e, 0xff, 0xdc, 0x9b, 0x64, 0xff, 0xdc, 0x97, 0x5e, 0xff,
+0xdd, 0x94, 0x59, 0xff, 0xdf, 0x9d, 0x66, 0xff, 0xfa, 0xee, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xf6, 0xe3, 0xd3, 0xff, 0xdf, 0x9a, 0x63, 0xff, 0xdc, 0x97, 0x5e, 0xff, 0xdc, 0x9b, 0x64, 0xff,
+0xdc, 0x9f, 0x6d, 0xff, 0xdf, 0xa7, 0x79, 0xff, 0xe1, 0xb0, 0x87, 0xff, 0xe4, 0xba, 0x95, 0xff,
+0xea, 0xc7, 0xa8, 0xff, 0xf7, 0xe7, 0xce, 0xff, 0xf2, 0xd6, 0xb1, 0xff, 0xa5, 0x5d, 0x0e, 0x84,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7b, 0x5d, 0x1c, 0x07, 0xc5, 0x77, 0x31, 0xd7, 0xfb, 0xef, 0xd1, 0xff,
+0xed, 0xce, 0xab, 0xff, 0xe5, 0xbc, 0x94, 0xff, 0xe2, 0xb1, 0x86, 0xff, 0xdf, 0xa5, 0x74, 0xff,
+0xdd, 0x9d, 0x67, 0xff, 0xdd, 0x98, 0x5e, 0xff, 0xdc, 0x93, 0x56, 0xff, 0xdd, 0x90, 0x50, 0xff,
+0xdd, 0x8f, 0x4c, 0xff, 0xeb, 0xbe, 0x98, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xf7, 0xe6, 0xd7, 0xff, 0xdf, 0x97, 0x5a, 0xff, 0xdc, 0x93, 0x56, 0xff,
+0xdd, 0x98, 0x5e, 0xff, 0xdd, 0x9d, 0x67, 0xff, 0xdf, 0xa6, 0x75, 0xff, 0xe2, 0xb2, 0x86, 0xff,
+0xe4, 0xbb, 0x94, 0xff, 0xec, 0xcd, 0xaa, 0xff, 0xfc, 0xf2, 0xd8, 0xff, 0xde, 0xa2, 0x67, 0xf9,
+0x7f, 0x5a, 0x19, 0x26, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x8c, 0x58, 0x13, 0x56, 0xee, 0xc5, 0x95, 0xff, 0xf6, 0xe1, 0xc0, 0xff,
+0xe7, 0xbf, 0x98, 0xff, 0xe4, 0xb4, 0x88, 0xff, 0xe1, 0xaa, 0x79, 0xff, 0xdf, 0xa0, 0x69, 0xff,
+0xde, 0x98, 0x5c, 0xff, 0xdd, 0x93, 0x52, 0xff, 0xdd, 0x8f, 0x4b, 0xff, 0xdd, 0x8c, 0x45, 0xff,
+0xdd, 0x8a, 0x42, 0xff, 0xee, 0xc1, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe5, 0xd5, 0xff, 0xdf, 0x96, 0x56, 0xff,
+0xde, 0x93, 0x53, 0xff, 0xde, 0x98, 0x5c, 0xff, 0xe0, 0xa1, 0x6a, 0xff, 0xe1, 0xaa, 0x79, 0xff,
+0xe4, 0xb4, 0x88, 0xff, 0xe8, 0xc0, 0x98, 0xff, 0xf3, 0xdb, 0xba, 0xff, 0xf7, 0xe2, 0xbc, 0xff,
+0xab, 0x5f, 0x0f, 0x91, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0xb8, 0x69, 0x1a, 0xb3, 0xf9, 0xe6, 0xc0, 0xff, 0xee, 0xcd, 0xa6, 0xff,
+0xe5, 0xb9, 0x8c, 0xff, 0xe2, 0xae, 0x7c, 0xff, 0xe0, 0xa4, 0x6e, 0xff, 0xe0, 0x9b, 0x5e, 0xff,
+0xde, 0x94, 0x52, 0xff, 0xde, 0x8f, 0x49, 0xff, 0xde, 0x8c, 0x42, 0xff, 0xdf, 0x8a, 0x3d, 0xff,
+0xe0, 0x89, 0x39, 0xff, 0xec, 0xb8, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe5, 0xd5, 0xff,
+0xe0, 0x94, 0x52, 0xff, 0xde, 0x94, 0x51, 0xff, 0xdf, 0x9b, 0x5e, 0xff, 0xe0, 0xa4, 0x6e, 0xff,
+0xe2, 0xae, 0x7d, 0xff, 0xe5, 0xb9, 0x8c, 0xff, 0xed, 0xcb, 0xa4, 0xff, 0xfc, 0xef, 0xce, 0xff,
+0xd2, 0x8a, 0x43, 0xe4, 0x7d, 0x5e, 0x1c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7c, 0x5c, 0x1a, 0x16, 0xd6, 0x8c, 0x47, 0xf0, 0xfa, 0xe8, 0xc0, 0xff, 0xea, 0xc2, 0x96, 0xff,
+0xe5, 0xb5, 0x83, 0xff, 0xe2, 0xaa, 0x72, 0xff, 0xdf, 0x9f, 0x62, 0xff, 0xe0, 0x97, 0x54, 0xff,
+0xdf, 0x91, 0x48, 0xff, 0xe2, 0x8e, 0x42, 0xff, 0xe1, 0x8b, 0x3b, 0xff, 0xe2, 0x89, 0x37, 0xff,
+0xe1, 0x86, 0x31, 0xff, 0xe2, 0x85, 0x2f, 0xff, 0xf3, 0xcd, 0xa9, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xf9, 0xe6, 0xd5, 0xff, 0xe1, 0x96, 0x51, 0xff, 0xe0, 0x97, 0x54, 0xff, 0xe0, 0xa0, 0x63, 0xff,
+0xe2, 0xaa, 0x72, 0xff, 0xe5, 0xb5, 0x83, 0xff, 0xe9, 0xc2, 0x96, 0xff, 0xf8, 0xe6, 0xc0, 0xff,
+0xea, 0xb7, 0x7e, 0xff, 0x81, 0x54, 0x15, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x80, 0x55, 0x16, 0x40, 0xde, 0x91, 0x4e, 0xff, 0xf8, 0xe0, 0xb4, 0xff, 0xe8, 0xbc, 0x8b, 0xff,
+0xe4, 0xaf, 0x78, 0xff, 0xe2, 0xa5, 0x68, 0xff, 0xe1, 0x9b, 0x59, 0xff, 0xe0, 0x93, 0x4a, 0xff,
+0xe2, 0x8f, 0x42, 0xff, 0xe2, 0x8c, 0x3a, 0xff, 0xe2, 0x89, 0x35, 0xff, 0xe3, 0x87, 0x30, 0xff,
+0xe5, 0x86, 0x2c, 0xff, 0xe5, 0x84, 0x29, 0xff, 0xe4, 0x83, 0x27, 0xff, 0xf4, 0xcc, 0xa6, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xf9, 0xe6, 0xd5, 0xff, 0xe1, 0x98, 0x53, 0xff, 0xe1, 0x9b, 0x59, 0xff,
+0xe2, 0xa5, 0x68, 0xff, 0xe4, 0xaf, 0x78, 0xff, 0xe7, 0xbb, 0x8a, 0xff, 0xf5, 0xdb, 0xb1, 0xff,
+0xed, 0xbb, 0x82, 0xff, 0x89, 0x4f, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7e, 0x48, 0x12, 0x65, 0xdc, 0x8b, 0x49, 0xff, 0xf7, 0xda, 0xa9, 0xff, 0xe8, 0xb8, 0x82, 0xff,
+0xe5, 0xae, 0x73, 0xff, 0xda, 0x9c, 0x5d, 0xff, 0xdd, 0xa9, 0x77, 0xff, 0xf6, 0xe7, 0xd9, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe1, 0xd0, 0xff, 0xd2, 0x90, 0x51, 0xff,
+0xdd, 0x9d, 0x5e, 0xff, 0xe5, 0xad, 0x72, 0xff, 0xe8, 0xb8, 0x82, 0xff, 0xf5, 0xd7, 0xa7, 0xff,
+0xec, 0xb7, 0x7d, 0xff, 0x85, 0x40, 0x0b, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7b, 0x41, 0x0f, 0x79, 0xd0, 0x64, 0x19, 0xff, 0xe9, 0xb2, 0x73, 0xff, 0xdd, 0x99, 0x57, 0xff,
+0xd6, 0x7f, 0x34, 0xff, 0xaf, 0x58, 0x11, 0xff, 0xf7, 0xee, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0xd5, 0xc3, 0xff,
+0xb0, 0x5e, 0x1c, 0xff, 0xd3, 0x7d, 0x33, 0xff, 0xdd, 0x99, 0x58, 0xff, 0xea, 0xb7, 0x7a, 0xff,
+0xdc, 0x86, 0x3f, 0xff, 0x81, 0x34, 0x09, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x78, 0x3e, 0x0f, 0x7b, 0xac, 0x3e, 0x01, 0xff, 0xa3, 0x43, 0x01, 0xff, 0x93, 0x3b, 0x01, 0xff,
+0x95, 0x39, 0x01, 0xff, 0x82, 0x34, 0x01, 0xff, 0xf2, 0xea, 0xe4, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xd3, 0xc6, 0xff,
+0x85, 0x3d, 0x0d, 0xff, 0x94, 0x38, 0x01, 0xff, 0x93, 0x3b, 0x01, 0xff, 0x9d, 0x40, 0x01, 0xff,
+0xb1, 0x42, 0x01, 0xff, 0x7c, 0x32, 0x08, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x75, 0x41, 0x11, 0x6d, 0xb5, 0x3c, 0x01, 0xff, 0xa3, 0x42, 0x01, 0xff, 0x92, 0x39, 0x01, 0xff,
+0x98, 0x3f, 0x01, 0xff, 0x93, 0x3e, 0x01, 0xff, 0xa8, 0x6e, 0x43, 0xff, 0xeb, 0xdc, 0xcf, 0xff,
+0xfe, 0xfe, 0xfe, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff,
+0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff,
+0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfd, 0xfd, 0xfd, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xd5, 0xc6, 0xff, 0x91, 0x47, 0x10, 0xff,
+0x96, 0x3f, 0x01, 0xff, 0x99, 0x3f, 0x01, 0xff, 0x95, 0x39, 0x01, 0xff, 0x95, 0x3a, 0x01, 0xff,
+0xbc, 0x43, 0x01, 0xff, 0x77, 0x34, 0x0a, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7b, 0x4f, 0x14, 0x4b, 0xad, 0x31, 0x01, 0xff, 0xbc, 0x4d, 0x01, 0xff, 0x93, 0x39, 0x01, 0xff,
+0x9c, 0x40, 0x01, 0xff, 0xa9, 0x48, 0x01, 0xff, 0xa9, 0x4c, 0x01, 0xff, 0xa5, 0x4e, 0x01, 0xff,
+0xa7, 0x52, 0x01, 0xff, 0xab, 0x55, 0x01, 0xff, 0xb1, 0x59, 0x01, 0xff, 0xb5, 0x5c, 0x01, 0xff,
+0xb7, 0x5e, 0x00, 0xff, 0xb7, 0x5f, 0x01, 0xff, 0xb8, 0x60, 0x02, 0xff, 0xd9, 0xb5, 0x8e, 0xff,
+0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xf1, 0xf1, 0xf1, 0xff,
+0xf2, 0xf2, 0xf2, 0xff, 0xe1, 0xce, 0xbc, 0xff, 0xa3, 0x54, 0x0f, 0xff, 0xaa, 0x4d, 0x01, 0xff,
+0xa9, 0x48, 0x01, 0xff, 0x99, 0x3f, 0x01, 0xff, 0x95, 0x39, 0x01, 0xff, 0xa9, 0x44, 0x01, 0xff,
+0xc1, 0x3e, 0x01, 0xff, 0x7c, 0x40, 0x0e, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7b, 0x59, 0x19, 0x21, 0x95, 0x28, 0x01, 0xf8, 0xd2, 0x57, 0x03, 0xff, 0x99, 0x3d, 0x01, 0xff,
+0xa6, 0x47, 0x01, 0xff, 0xbb, 0x54, 0x01, 0xff, 0xc7, 0x5f, 0x01, 0xff, 0xd9, 0x6c, 0x01, 0xff,
+0xe3, 0x75, 0x01, 0xff, 0xe7, 0x7a, 0x02, 0xff, 0xe8, 0x7c, 0x04, 0xff, 0xe9, 0x7e, 0x06, 0xff,
+0xea, 0x81, 0x08, 0xff, 0xcc, 0x70, 0x07, 0xff, 0xd2, 0xb0, 0x89, 0xff, 0xe4, 0xe4, 0xe4, 0xff,
+0xe4, 0xe4, 0xe4, 0xff, 0xe4, 0xe4, 0xe4, 0xff, 0xe4, 0xe4, 0xe4, 0xff, 0xe5, 0xe5, 0xe5, 0xff,
+0xdb, 0xc8, 0xb5, 0xff, 0xb7, 0x64, 0x0e, 0xff, 0xc8, 0x64, 0x01, 0xff, 0xc5, 0x5f, 0x01, 0xff,
+0xbb, 0x54, 0x01, 0xff, 0xa7, 0x47, 0x01, 0xff, 0x95, 0x3b, 0x01, 0xff, 0xc8, 0x52, 0x01, 0xff,
+0xb9, 0x33, 0x01, 0xff, 0x78, 0x4b, 0x14, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5e, 0x1d, 0x02, 0x7d, 0x2d, 0x06, 0xc9, 0xd6, 0x5b, 0x09, 0xff, 0xbb, 0x52, 0x01, 0xff,
+0xb5, 0x53, 0x01, 0xff, 0xca, 0x62, 0x01, 0xff, 0xdc, 0x70, 0x01, 0xff, 0xe9, 0x7d, 0x03, 0xff,
+0xea, 0x81, 0x08, 0xff, 0xec, 0x86, 0x0b, 0xff, 0xec, 0x87, 0x0e, 0xff, 0xed, 0x8b, 0x11, 0xff,
+0xd7, 0x80, 0x11, 0xff, 0xc4, 0x98, 0x5f, 0xff, 0xd7, 0xd7, 0xd7, 0xff, 0xd7, 0xd7, 0xd7, 0xff,
+0xd7, 0xd7, 0xd7, 0xff, 0xd8, 0xd8, 0xd7, 0xff, 0xd8, 0xd8, 0xd8, 0xff, 0xd1, 0xc0, 0xad, 0xff,
+0xb8, 0x6f, 0x14, 0xff, 0xd6, 0x77, 0x07, 0xff, 0xe9, 0x7d, 0x03, 0xff, 0xde, 0x72, 0x01, 0xff,
+0xca, 0x62, 0x01, 0xff, 0xb9, 0x54, 0x01, 0xff, 0xa6, 0x48, 0x01, 0xff, 0xd9, 0x61, 0x0a, 0xff,
+0x8a, 0x27, 0x01, 0xf2, 0x7b, 0x5b, 0x1a, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7c, 0x47, 0x10, 0x72, 0xce, 0x4c, 0x02, 0xff, 0xe8, 0x78, 0x0c, 0xff,
+0xc5, 0x5f, 0x01, 0xff, 0xda, 0x72, 0x01, 0xff, 0xe9, 0x7f, 0x03, 0xff, 0xec, 0x87, 0x0b, 0xff,
+0xee, 0x8f, 0x13, 0xff, 0xef, 0x95, 0x19, 0xff, 0xef, 0x98, 0x1d, 0xff, 0xf1, 0x9c, 0x21, 0xff,
+0xd6, 0x8e, 0x1f, 0xff, 0xc2, 0xa1, 0x6f, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff,
+0xcc, 0xcc, 0xcc, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xc8, 0xbb, 0xa8, 0xff, 0xb8, 0x79, 0x21, 0xff,
+0xda, 0x88, 0x17, 0xff, 0xee, 0x8f, 0x13, 0xff, 0xec, 0x87, 0x0b, 0xff, 0xe9, 0x7f, 0x03, 0xff,
+0xda, 0x72, 0x01, 0xff, 0xc4, 0x60, 0x01, 0xff, 0xdf, 0x6c, 0x01, 0xff, 0xd8, 0x62, 0x0c, 0xff,
+0x79, 0x35, 0x09, 0xad, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x79, 0x59, 0x1a, 0x18, 0x88, 0x27, 0x02, 0xef, 0xef, 0x8e, 0x22, 0xff,
+0xe7, 0x7a, 0x01, 0xff, 0xe5, 0x7c, 0x01, 0xff, 0xed, 0x8a, 0x0b, 0xff, 0xef, 0x96, 0x17, 0xff,
+0xf2, 0xa1, 0x22, 0xff, 0xf3, 0xa7, 0x29, 0xff, 0xf5, 0xad, 0x30, 0xff, 0xf6, 0xb0, 0x33, 0xff,
+0xdc, 0x9f, 0x30, 0xff, 0xbd, 0xa1, 0x6b, 0xff, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xff,
+0xc3, 0xc3, 0xc3, 0xff, 0xc1, 0xb7, 0xa4, 0xff, 0xba, 0x89, 0x2f, 0xff, 0xdd, 0x9c, 0x2b, 0xff,
+0xf3, 0xa8, 0x2a, 0xff, 0xf2, 0xa1, 0x22, 0xff, 0xef, 0x95, 0x17, 0xff, 0xed, 0x8a, 0x0b, 0xff,
+0xe8, 0x7f, 0x01, 0xff, 0xd6, 0x6f, 0x01, 0xff, 0xf3, 0x93, 0x21, 0xff, 0xb1, 0x38, 0x01, 0xff,
+0x78, 0x4f, 0x15, 0x43, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x77, 0x44, 0x10, 0x6e, 0xd1, 0x55, 0x01, 0xff,
+0xf8, 0xaa, 0x30, 0xff, 0xee, 0x8a, 0x0a, 0xff, 0xee, 0x95, 0x16, 0xff, 0xf5, 0xaa, 0x2c, 0xff,
+0xf7, 0xb5, 0x38, 0xff, 0xfa, 0xbc, 0x3f, 0xff, 0xfb, 0xc2, 0x44, 0xff, 0xfc, 0xc5, 0x47, 0xff,
+0xf7, 0xc2, 0x48, 0xff, 0xbc, 0x98, 0x44, 0xff, 0xbc, 0xb4, 0xa0, 0xff, 0xbc, 0xbc, 0xbc, 0xff,
+0xbc, 0xb0, 0x95, 0xff, 0xbc, 0x96, 0x40, 0xff, 0xe3, 0xb1, 0x40, 0xff, 0xfb, 0xc2, 0x44, 0xff,
+0xfa, 0xbc, 0x3f, 0xff, 0xf9, 0xb5, 0x39, 0xff, 0xf5, 0xaa, 0x2c, 0xff, 0xef, 0x97, 0x19, 0xff,
+0xed, 0x87, 0x06, 0xff, 0xf7, 0xa3, 0x25, 0xff, 0xe0, 0x74, 0x13, 0xff, 0x77, 0x35, 0x0a, 0xa6,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x75, 0x33, 0x0a, 0xa7,
+0xe5, 0x7c, 0x1a, 0xff, 0xfd, 0xc6, 0x4e, 0xff, 0xf6, 0xa4, 0x25, 0xff, 0xfa, 0xbc, 0x3f, 0xff,
+0xfd, 0xca, 0x4e, 0xff, 0xfe, 0xd0, 0x54, 0xff, 0xff, 0xd6, 0x5a, 0xff, 0xff, 0xd9, 0x60, 0xff,
+0xff, 0xdb, 0x5f, 0xff, 0xe5, 0xc6, 0x57, 0xff, 0xc9, 0xae, 0x4f, 0xff, 0xbb, 0xa3, 0x4e, 0xff,
+0xcf, 0xb2, 0x4f, 0xff, 0xeb, 0xca, 0x58, 0xff, 0xff, 0xd9, 0x60, 0xff, 0xff, 0xd6, 0x5a, 0xff,
+0xff, 0xd0, 0x54, 0xff, 0xfd, 0xca, 0x4e, 0xff, 0xf9, 0xbd, 0x3f, 0xff, 0xf4, 0xa2, 0x23, 0xff,
+0xfa, 0xba, 0x3f, 0xff, 0xf2, 0x9e, 0x32, 0xff, 0x7a, 0x27, 0x05, 0xd6, 0x7a, 0x5d, 0x1b, 0x0e,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7b, 0x5d, 0x1b, 0x10,
+0x77, 0x29, 0x05, 0xd0, 0xf1, 0x9b, 0x36, 0xff, 0xff, 0xdf, 0x6b, 0xff, 0xfe, 0xc9, 0x4c, 0xff,
+0xff, 0xd6, 0x5c, 0xff, 0xff, 0xe0, 0x65, 0xff, 0xff, 0xe5, 0x6a, 0xff, 0xff, 0xe8, 0x6d, 0xff,
+0xff, 0xeb, 0x6f, 0xff, 0xff, 0xeb, 0x74, 0xff, 0xff, 0xeb, 0x74, 0xff, 0xfc, 0xe8, 0x72, 0xff,
+0xff, 0xeb, 0x74, 0xff, 0xff, 0xeb, 0x6f, 0xff, 0xff, 0xe8, 0x6d, 0xff, 0xff, 0xe5, 0x6a, 0xff,
+0xff, 0xe0, 0x65, 0xff, 0xff, 0xd8, 0x5e, 0xff, 0xfd, 0xc6, 0x48, 0xff, 0xff, 0xd5, 0x61, 0xff,
+0xf9, 0xba, 0x4e, 0xff, 0x95, 0x2d, 0x02, 0xef, 0x7b, 0x56, 0x17, 0x31, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x79, 0x59, 0x1a, 0x1e, 0x77, 0x28, 0x05, 0xd0, 0xef, 0x94, 0x34, 0xff, 0xff, 0xf7, 0x89, 0xff,
+0xff, 0xea, 0x75, 0xff, 0xff, 0xe9, 0x6e, 0xff, 0xff, 0xf0, 0x73, 0xff, 0xff, 0xf3, 0x7b, 0xff,
+0xff, 0xf4, 0x80, 0xff, 0xff, 0xf5, 0x82, 0xff, 0xff, 0xf4, 0x87, 0xff, 0xff, 0xf4, 0x87, 0xff,
+0xff, 0xf5, 0x82, 0xff, 0xff, 0xf4, 0x80, 0xff, 0xff, 0xf3, 0x7c, 0xff, 0xff, 0xef, 0x79, 0xff,
+0xff, 0xea, 0x6b, 0xff, 0xff, 0xe7, 0x6a, 0xff, 0xff, 0xf5, 0x85, 0xff, 0xf8, 0xb4, 0x51, 0xff,
+0x94, 0x2e, 0x02, 0xed, 0x77, 0x4f, 0x15, 0x42, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x79, 0x5b, 0x1a, 0x16, 0x77, 0x2f, 0x09, 0xb3, 0xe8, 0x82, 0x2c, 0xff,
+0xff, 0xee, 0x9b, 0xff, 0xff, 0xff, 0xa9, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, 0xfb, 0x85, 0xff,
+0xff, 0xf7, 0x8c, 0xff, 0xfe, 0xf6, 0x94, 0xff, 0xfd, 0xf5, 0x98, 0xff, 0xfd, 0xf5, 0x98, 0xff,
+0xfe, 0xf6, 0x94, 0xff, 0xff, 0xf7, 0x8e, 0xff, 0xff, 0xfa, 0x85, 0xff, 0xff, 0xfd, 0x8a, 0xff,
+0xff, 0xff, 0xa2, 0xff, 0xff, 0xfb, 0xa5, 0xff, 0xef, 0x98, 0x3f, 0xff, 0x7c, 0x28, 0x05, 0xd4,
+0x79, 0x54, 0x17, 0x33, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x01, 0x75, 0x39, 0x0d, 0x8c,
+0xb8, 0x40, 0x01, 0xf8, 0xf1, 0xa1, 0x52, 0xff, 0xff, 0xe9, 0xaa, 0xff, 0xff, 0xff, 0xc8, 0xff,
+0xff, 0xff, 0xc4, 0xff, 0xff, 0xff, 0xba, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, 0xb1, 0xff,
+0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, 0xf4, 0xb4, 0xff,
+0xf7, 0xb7, 0x6a, 0xff, 0xd7, 0x56, 0x04, 0xff, 0x75, 0x34, 0x0a, 0xa3, 0x79, 0x5b, 0x1b, 0x10,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x79, 0x52, 0x18, 0x2f, 0x76, 0x36, 0x0c, 0x97, 0x97, 0x38, 0x03, 0xe4, 0xde, 0x70, 0x20, 0xff,
+0xef, 0xa3, 0x5b, 0xff, 0xf7, 0xc2, 0x85, 0xff, 0xfb, 0xd6, 0x9f, 0xff, 0xfb, 0xd9, 0xa1, 0xff,
+0xf9, 0xc8, 0x8d, 0xff, 0xf3, 0xad, 0x68, 0xff, 0xe4, 0x7d, 0x2f, 0xff, 0xb3, 0x43, 0x02, 0xf1,
+0x78, 0x31, 0x09, 0xae, 0x78, 0x4d, 0x15, 0x46, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x79, 0x5b, 0x1b, 0x11, 0x76, 0x4c, 0x15, 0x47,
+0x70, 0x3b, 0x0f, 0x7b, 0x78, 0x35, 0x0a, 0xa3, 0x7e, 0x31, 0x08, 0xb7, 0x7e, 0x31, 0x08, 0xb7,
+0x7b, 0x34, 0x0a, 0xab, 0x74, 0x3a, 0x0e, 0x85, 0x75, 0x47, 0x13, 0x55, 0x79, 0x58, 0x1a, 0x1e,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00,
+0x7a, 0x5f, 0x1d, 0x00, 0x7a, 0x5f, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+int init_bitmap_suite(void)
+{
+       return 0;
+}
+
+int clean_bitmap_suite(void)
+{
+       return 0;
+}
+
+int add_bitmap_suite(void)
+{
+       add_test_suite(bitmap);
+
+       add_test_function(bitmap);
+
+       return 0;
+}
+
+void test_bitmap(void)
+{
+       struct btest
+       {
+               uint8 decompressed_16x1x8[16 * 1 * 1];
+               uint8 decompressed_32x32x8[32 * 32 * 1];
+               uint8 decompressed_16x1x16[16 * 1 * 2];
+               uint8 decompressed_32x32x16[32 * 32 * 2];
+               uint8 decompressed_16x1x24[16 * 1 * 3];
+               uint8 decompressed_32x32x24[32 * 32 * 3];
+               uint8 decompressed_16x1x32[16 * 1 * 4];
+               uint8 decompressed_32x32x32[32 * 32 * 4];
+       };
+       struct btest* t;
+       int width;
+       int height;
+       int comp_size;
+       int decomp_size;
+       int bpp;
+
+       t = (struct btest*)malloc(sizeof(struct btest));
+       width = 16;
+       height = 1;
+       bpp = 8;
+       comp_size = sizeof(compressed_16x1x8);
+       decomp_size = sizeof(decompressed_16x1x8);
+       CU_ASSERT(bitmap_decompress(compressed_16x1x8, t->decompressed_16x1x8,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_16x1x8, decompressed_16x1x8,
+               decomp_size) == 0);
+
+       width = 32;
+       height = 32;
+       bpp = 8;
+       comp_size = sizeof(compressed_32x32x8);
+       decomp_size = sizeof(decompressed_32x32x8);
+       CU_ASSERT(bitmap_decompress(compressed_32x32x8, t->decompressed_32x32x8,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_32x32x8, decompressed_32x32x8,
+               decomp_size) == 0);
+
+       width = 16;
+       height = 1;
+       bpp = 16;
+       comp_size = sizeof(compressed_16x1x16);
+       decomp_size = sizeof(decompressed_16x1x16);
+       CU_ASSERT(bitmap_decompress(compressed_16x1x16, t->decompressed_16x1x16,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_16x1x16, decompressed_16x1x16,
+               decomp_size) == 0);
+
+       width = 32;
+       height = 32;
+       bpp = 16;
+       comp_size = sizeof(compressed_32x32x16);
+       decomp_size = sizeof(decompressed_32x32x16);
+       CU_ASSERT(bitmap_decompress(compressed_32x32x16, t->decompressed_32x32x16,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_32x32x16, decompressed_32x32x16,
+               decomp_size) == 0);
+
+       width = 16;
+       height = 1;
+       bpp = 24;
+       comp_size = sizeof(compressed_16x1x24);
+       decomp_size = sizeof(decompressed_16x1x24);
+       CU_ASSERT(bitmap_decompress(compressed_16x1x24, t->decompressed_16x1x24,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_16x1x24, decompressed_16x1x24,
+               decomp_size) == 0);
+
+       width = 32;
+       height = 32;
+       bpp = 24;
+       comp_size = sizeof(compressed_32x32x24);
+       decomp_size = sizeof(decompressed_32x32x24);
+       CU_ASSERT(bitmap_decompress(compressed_32x32x24, t->decompressed_32x32x24,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_32x32x24, decompressed_32x32x24,
+               decomp_size) == 0);
+
+       width = 16;
+       height = 1;
+       bpp = 32;
+       comp_size = sizeof(compressed_16x1x32);
+       decomp_size = sizeof(decompressed_16x1x32);
+       CU_ASSERT(bitmap_decompress(compressed_16x1x32, t->decompressed_16x1x32,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_16x1x32, decompressed_16x1x32,
+               decomp_size) == 0);
+
+       width = 32;
+       height = 32;
+       bpp = 32;
+       comp_size = sizeof(compressed_32x32x32);
+       decomp_size = sizeof(decompressed_32x32x32);
+       CU_ASSERT(bitmap_decompress(compressed_32x32x32, t->decompressed_32x32x32,
+                       width, height, comp_size, bpp, bpp) == true);
+       CU_ASSERT(memcmp(t->decompressed_32x32x32, decompressed_32x32x32,
+               decomp_size) == 0);
+
+       free(t);
+}
diff --git a/cunit/test_bitmap.h b/cunit/test_bitmap.h
new file mode 100644 (file)
index 0000000..3705e09
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Bitmap Unit Tests
+ *
+ * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_bitmap_suite(void);
+int clean_bitmap_suite(void);
+int add_bitmap_suite(void);
+
+void test_bitmap(void);
diff --git a/cunit/test_channels.c b/cunit/test_channels.c
new file mode 100644 (file)
index 0000000..da2cd63
--- /dev/null
@@ -0,0 +1,91 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Channel Manager Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/utils/event.h>
+
+#include "test_channels.h"
+
+int init_chanman_suite(void)
+{
+       freerdp_channels_global_init();
+       return 0;
+}
+
+int clean_chanman_suite(void)
+{
+       freerdp_channels_global_uninit();
+       return 0;
+}
+
+int add_chanman_suite(void)
+{
+       add_test_suite(chanman);
+
+       add_test_function(chanman);
+
+       return 0;
+}
+
+static int test_rdp_channel_data(freerdp* instance, int chan_id, uint8* data, int data_size)
+{
+       printf("chan_id %d data_size %d\n", chan_id, data_size);
+       return 0;
+}
+
+void test_chanman(void)
+{
+       rdpChannels* chan_man;
+       rdpSettings settings = { 0 };
+       freerdp instance = { 0 };
+       RDP_EVENT* event;
+
+       settings.hostname = "testhost";
+       instance.settings = &settings;
+       instance.SendChannelData = test_rdp_channel_data;
+
+       chan_man = freerdp_channels_new();
+
+       freerdp_channels_load_plugin(chan_man, &settings, "../channels/rdpdbg/rdpdbg.so", NULL);
+       freerdp_channels_pre_connect(chan_man, &instance);
+       freerdp_channels_post_connect(chan_man, &instance);
+
+       freerdp_channels_data(&instance, 0, "testdata", 8, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, 8);
+       freerdp_channels_data(&instance, 0, "testdata1", 9, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, 9);
+       freerdp_channels_data(&instance, 0, "testdata11", 10, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, 10);
+       freerdp_channels_data(&instance, 0, "testdata111", 11, CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, 11);
+
+       event = freerdp_event_new(RDP_EVENT_CLASS_DEBUG, 0, NULL, NULL);
+       freerdp_channels_send_event(chan_man, event);
+
+       while ((event = freerdp_channels_pop_event(chan_man)) == NULL)
+       {
+               freerdp_channels_check_fds(chan_man, &instance);
+       }
+       printf("responded event_type %d\n", event->event_type);
+       freerdp_event_free(event);
+
+       freerdp_channels_close(chan_man, &instance);
+       freerdp_channels_free(chan_man);
+}
diff --git a/cunit/test_channels.h b/cunit/test_channels.h
new file mode 100644 (file)
index 0000000..0022d30
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Channel Manager Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_chanman_suite(void);
+int clean_chanman_suite(void);
+int add_chanman_suite(void);
+
+void test_chanman(void);
diff --git a/cunit/test_cliprdr.c b/cunit/test_cliprdr.c
new file mode 100644 (file)
index 0000000..26cf6f0
--- /dev/null
@@ -0,0 +1,248 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Clipboard Virtual Channel Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/plugins/cliprdr.h>
+
+#include "test_cliprdr.h"
+
+int init_cliprdr_suite(void)
+{
+       freerdp_channels_global_init();
+       return 0;
+}
+
+int clean_cliprdr_suite(void)
+{
+       freerdp_channels_global_uninit();
+       return 0;
+}
+
+int add_cliprdr_suite(void)
+{
+       add_test_suite(cliprdr);
+
+       add_test_function(cliprdr);
+
+       return 0;
+}
+
+static const uint8 test_clip_caps_data[] =
+{
+       "\x07\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x01\x00\x0C\x00"
+       "\x02\x00\x00\x00\x0E\x00\x00\x00"
+};
+
+static const uint8 test_monitor_ready_data[] =
+{
+       "\x01\x00\x00\x00\x00\x00\x00\x00"
+};
+
+static const uint8 test_format_list_data[] =
+{
+       "\x02\x00\x00\x00\x48\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\xd0\x00\x00"
+       "\x48\x00\x54\x00\x4D\x00\x4C\x00\x20\x00\x46\x00\x6F\x00\x72\x00"
+       "\x6D\x00\x61\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+static const uint8 test_format_list_response_data[] =
+{
+       "\x03\x00\x01\x00\x00\x00\x00\x00"
+};
+
+static const uint8 test_data_request_data[] =
+{
+       "\x04\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00"
+};
+
+static const uint8 test_data_response_data[] =
+{
+       "\x05\x00\x01\x00\x18\x00\x00\x00\x68\x00\x65\x00\x6C\x00\x6C\x00"
+       "\x6F\x00\x20\x00\x77\x00\x6F\x00\x72\x00\x6c\x00\x64\x00\x00\x00"
+};
+
+static int test_rdp_channel_data(freerdp* instance, int chan_id, uint8* data, int data_size)
+{
+       printf("chan_id %d data_size %d\n", chan_id, data_size);
+       freerdp_hexdump(data, data_size);
+       return 0;
+}
+
+static int event_processed;
+
+static void event_process_callback(RDP_EVENT* event)
+{
+       printf("Event %d processed.\n", event->event_type);
+       event_processed = 1;
+}
+
+void test_cliprdr(void)
+{
+       int i;
+       rdpChannels* channels;
+       rdpSettings settings = { 0 };
+       freerdp instance = { 0 };
+       RDP_EVENT* event;
+       RDP_CB_FORMAT_LIST_EVENT* format_list_event;
+       RDP_CB_DATA_REQUEST_EVENT* data_request_event;
+       RDP_CB_DATA_RESPONSE_EVENT* data_response_event;
+
+       settings.hostname = "testhost";
+       instance.settings = &settings;
+       instance.SendChannelData = test_rdp_channel_data;
+
+       channels = freerdp_channels_new();
+
+       freerdp_channels_load_plugin(channels, &settings, "../channels/cliprdr/cliprdr.so", NULL);
+       freerdp_channels_pre_connect(channels, &instance);
+       freerdp_channels_post_connect(channels, &instance);
+
+       /* server sends cliprdr capabilities and monitor ready PDU */
+       freerdp_channels_data(&instance, 0, (char*)test_clip_caps_data, sizeof(test_clip_caps_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_clip_caps_data) - 1);
+
+       freerdp_channels_data(&instance, 0, (char*)test_monitor_ready_data, sizeof(test_monitor_ready_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_monitor_ready_data) - 1);
+
+       /* cliprdr sends clipboard_sync event to UI */
+       while ((event = freerdp_channels_pop_event(channels)) == NULL)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+       printf("Got event %d\n", event->event_type);
+       CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_MONITOR_READY);
+       freerdp_event_free(event);
+
+       /* UI sends format_list event to cliprdr */
+       event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_FORMAT_LIST, event_process_callback, NULL);
+       format_list_event = (RDP_CB_FORMAT_LIST_EVENT*) event;
+       format_list_event->num_formats = 2;
+       format_list_event->formats = (uint32*) xmalloc(sizeof(uint32) * 2);
+       format_list_event->formats[0] = CB_FORMAT_TEXT;
+       format_list_event->formats[1] = CB_FORMAT_HTML;
+       event_processed = 0;
+       freerdp_channels_send_event(channels, event);
+
+       /* cliprdr sends format list PDU to server */
+       while (!event_processed)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+
+       /* server sends format list response PDU to cliprdr */
+       freerdp_channels_data(&instance, 0, (char*)test_format_list_response_data, sizeof(test_format_list_response_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_response_data) - 1);
+
+       /* server sends format list PDU to cliprdr */
+       freerdp_channels_data(&instance, 0, (char*)test_format_list_data, sizeof(test_format_list_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_format_list_data) - 1);
+
+       /* cliprdr sends format_list event to UI */
+       while ((event = freerdp_channels_pop_event(channels)) == NULL)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+       printf("Got event %d\n", event->event_type);
+       CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_FORMAT_LIST);
+       if (event->event_type == RDP_EVENT_TYPE_CB_FORMAT_LIST)
+       {
+               format_list_event = (RDP_CB_FORMAT_LIST_EVENT*)event;
+               for (i = 0; i < format_list_event->num_formats; i++)
+                       printf("Format: 0x%X\n", format_list_event->formats[i]);
+       }
+       freerdp_event_free(event);
+
+       /* server sends data request PDU to cliprdr */
+       freerdp_channels_data(&instance, 0, (char*)test_data_request_data, sizeof(test_data_request_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_request_data) - 1);
+
+       /* cliprdr sends data request event to UI */
+       while ((event = freerdp_channels_pop_event(channels)) == NULL)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+       printf("Got event %d\n", event->event_type);
+       CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_DATA_REQUEST);
+       if (event->event_type == RDP_EVENT_TYPE_CB_DATA_REQUEST)
+       {
+               data_request_event = (RDP_CB_DATA_REQUEST_EVENT*)event;
+               printf("Requested format: 0x%X\n", data_request_event->format);
+       }
+       freerdp_event_free(event);
+
+       /* UI sends data response event to cliprdr */
+       event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_DATA_RESPONSE, event_process_callback, NULL);
+       data_response_event = (RDP_CB_DATA_RESPONSE_EVENT*)event;
+       data_response_event->data = (uint8*)xmalloc(6);
+       strcpy((char*)data_response_event->data, "hello");
+       data_response_event->size = 6;
+       event_processed = 0;
+       freerdp_channels_send_event(channels, event);
+
+       /* cliprdr sends data response PDU to server */
+       while (!event_processed)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+
+       /* UI sends data request event to cliprdr */
+       event = freerdp_event_new(RDP_EVENT_CLASS_CLIPRDR, RDP_EVENT_TYPE_CB_DATA_REQUEST, event_process_callback, NULL);
+       data_request_event = (RDP_CB_DATA_REQUEST_EVENT*)event;
+       data_request_event->format = CB_FORMAT_UNICODETEXT;
+       event_processed = 0;
+       freerdp_channels_send_event(channels, event);
+
+       /* cliprdr sends data request PDU to server */
+       while (!event_processed)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+
+       /* server sends data response PDU to cliprdr */
+       freerdp_channels_data(&instance, 0, (char*)test_data_response_data, sizeof(test_data_response_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_data_response_data) - 1);
+
+       /* cliprdr sends data response event to UI */
+       while ((event = freerdp_channels_pop_event(channels)) == NULL)
+       {
+               freerdp_channels_check_fds(channels, &instance);
+       }
+       printf("Got event %d\n", event->event_type);
+       CU_ASSERT(event->event_type == RDP_EVENT_TYPE_CB_DATA_RESPONSE);
+       if (event->event_type == RDP_EVENT_TYPE_CB_DATA_RESPONSE)
+       {
+               data_response_event = (RDP_CB_DATA_RESPONSE_EVENT*)event;
+               printf("Data response size: %d\n", data_response_event->size);
+               freerdp_hexdump(data_response_event->data, data_response_event->size);
+       }
+       freerdp_event_free(event);
+
+       freerdp_channels_close(channels, &instance);
+       freerdp_channels_free(channels);
+}
diff --git a/cunit/test_cliprdr.h b/cunit/test_cliprdr.h
new file mode 100644 (file)
index 0000000..f1a5509
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Clipboard Virtual Channel Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_cliprdr_suite(void);
+int clean_cliprdr_suite(void);
+int add_cliprdr_suite(void);
+
+void test_cliprdr(void);
diff --git a/cunit/test_color.c b/cunit/test_color.c
new file mode 100644 (file)
index 0000000..d353b6b
--- /dev/null
@@ -0,0 +1,152 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Color Conversion Unit Tests
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+#include "test_color.h"
+
+int init_color_suite(void)
+{
+       return 0;
+}
+
+int clean_color_suite(void)
+{
+       return 0;
+}
+
+int add_color_suite(void)
+{
+       add_test_suite(color);
+
+       add_test_function(color_GetRGB32);
+       add_test_function(color_GetBGR32);
+       add_test_function(color_GetRGB_565);
+       add_test_function(color_GetRGB16);
+       add_test_function(color_GetBGR_565);
+       add_test_function(color_GetBGR16);
+
+       return 0;
+}
+
+/* GDI Color Space Conversions: http://msdn.microsoft.com/en-us/library/ff566496(VS.85).aspx */
+
+void test_color_GetRGB32(void)
+{
+       int r, g, b;
+       uint32 rgb32 = 0x00AABBCC;
+       GetRGB32(r, g, b, rgb32);
+
+       CU_ASSERT(r == 0xAA);
+       CU_ASSERT(g == 0xBB);
+       CU_ASSERT(b == 0xCC);
+}
+
+void test_color_GetBGR32(void)
+{
+       int r, g, b;
+       uint32 bgr32 = 0x00CCBBAA;
+       GetBGR32(r, g, b, bgr32);
+
+       CU_ASSERT(r == 0xAA);
+       CU_ASSERT(g == 0xBB);
+       CU_ASSERT(b == 0xCC);
+}
+
+void test_color_GetRGB_565(void)
+{
+       /*
+               R: 0x15, 10101
+               G: 0x33, 110011
+               B: 0x1D, 11101
+
+               0xAE7D, 10101110 01111101
+       */
+       
+       int r, g, b;
+       uint16 rgb16 = 0xAE7D;
+       GetRGB_565(r, g, b, rgb16);
+       
+       CU_ASSERT(r == 0x15);
+       CU_ASSERT(g == 0x33);
+       CU_ASSERT(b == 0x1D);
+}
+
+void test_color_GetRGB16(void)
+{
+       /*
+               R: 0x15 -> 0xAD, 10101 -> 10101101
+               G: 0x33 -> 0xCF, 110011 -> 11001111
+               B: 0x1D -> 0xEF, 11101 -> 11101101
+
+               0xAE7D -> 0xADCFEF
+               10101110 01111101 -> 10101101 11001111 11101101
+       */
+       
+       int r, g, b;
+       uint16 rgb16 = 0xAE7D;
+       GetRGB16(r, g, b, rgb16);
+       
+       CU_ASSERT(r == 0xAD);
+       CU_ASSERT(g == 0xCF);
+       CU_ASSERT(b == 0xEF);
+}
+
+void test_color_GetBGR_565(void)
+{
+       /*
+               B: 0x1D, 11101
+               G: 0x33, 110011
+               R: 0x15, 10101
+
+               0xEE75, 11101110 01110101
+       */
+               
+       int r, g, b;
+       uint16 bgr16 = 0xEE75;
+       GetBGR_565(r, g, b, bgr16);
+       
+       CU_ASSERT(r == 0x15);
+       CU_ASSERT(g == 0x33);
+       CU_ASSERT(b == 0x1D);
+}
+
+void test_color_GetBGR16(void)
+{
+       /*
+               B: 0x1D -> 0xEF, 11101 -> 11101101
+               G: 0x33 -> 0xCF, 110011 -> 11001111
+               R: 0x15 -> 0xAD, 10101 -> 10101101
+
+               0xEE75 -> 0xADCFEF
+               11101110 01110101 -> 10101101 11001111 11101101
+       */
+               
+       int r, g, b;
+       uint16 bgr16 = 0xEE75;
+       GetBGR16(r, g, b, bgr16);
+       
+       CU_ASSERT(r == 0xAD);
+       CU_ASSERT(g == 0xCF);
+       CU_ASSERT(b == 0xEF);
+}
+
diff --git a/cunit/test_color.h b/cunit/test_color.h
new file mode 100644 (file)
index 0000000..227146e
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Color Conversion Unit Tests
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_color_suite(void);
+int clean_color_suite(void);
+int add_color_suite(void);
+
+void test_color_GetRGB32(void);
+void test_color_GetBGR32(void);
+void test_color_GetRGB_565(void);
+void test_color_GetRGB16(void);
+void test_color_GetBGR_565(void);
+void test_color_GetBGR16(void);
diff --git a/cunit/test_drdynvc.c b/cunit/test_drdynvc.c
new file mode 100644 (file)
index 0000000..f46a7ac
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Dynamic Virtual Channel Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/memory.h>
+
+#include "test_drdynvc.h"
+
+int init_drdynvc_suite(void)
+{
+       freerdp_channels_global_init();
+       return 0;
+}
+
+int clean_drdynvc_suite(void)
+{
+       freerdp_channels_global_uninit();
+       return 0;
+}
+
+int add_drdynvc_suite(void)
+{
+       add_test_suite(drdynvc);
+
+       add_test_function(drdynvc);
+
+       return 0;
+}
+
+static const uint8 test_capability_request_data[] =
+{
+       "\x58\x00\x02\x00\x33\x33\x11\x11\x3D\x0A\xA7\x04"
+};
+
+static int data_received = 0;
+
+static int test_rdp_channel_data(freerdp* instance, int chan_id, uint8* data, int data_size)
+{
+       printf("chan_id %d data_size %d\n", chan_id, data_size);
+       freerdp_hexdump(data, data_size);
+       data_received = 1;
+       return 0;
+}
+
+void test_drdynvc(void)
+{
+       rdpChannels* chan_man;
+       rdpSettings settings = { 0 };
+       freerdp instance = { 0 };
+
+       settings.hostname = "testhost";
+       instance.settings = &settings;
+       instance.SendChannelData = test_rdp_channel_data;
+
+       chan_man = freerdp_channels_new();
+
+       freerdp_channels_load_plugin(chan_man, &settings, "../channels/drdynvc/drdynvc.so", NULL);
+       freerdp_channels_pre_connect(chan_man, &instance);
+       freerdp_channels_post_connect(chan_man, &instance);
+
+       /* server sends capability request PDU */
+       freerdp_channels_data(&instance, 0, (char*)test_capability_request_data, sizeof(test_capability_request_data) - 1,
+               CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, sizeof(test_capability_request_data) - 1);
+
+       /* drdynvc sends capability response PDU to server */
+       data_received = 0;
+       while (!data_received)
+       {
+               freerdp_channels_check_fds(chan_man, &instance);
+       }
+
+       freerdp_channels_close(chan_man, &instance);
+       freerdp_channels_free(chan_man);
+}
diff --git a/cunit/test_drdynvc.h b/cunit/test_drdynvc.h
new file mode 100644 (file)
index 0000000..67e0754
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Dynamic Virtual Channel Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_drdynvc_suite(void);
+int clean_drdynvc_suite(void);
+int add_drdynvc_suite(void);
+
+void test_drdynvc(void);
diff --git a/cunit/test_freerdp.c b/cunit/test_freerdp.c
new file mode 100644 (file)
index 0000000..33c4539
--- /dev/null
@@ -0,0 +1,226 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Unit Tests
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <CUnit/Basic.h>
+
+#include "test_per.h"
+#include "test_ber.h"
+#include "test_gcc.h"
+#include "test_mcs.h"
+#include "test_color.h"
+#include "test_bitmap.h"
+#include "test_libgdi.h"
+#include "test_list.h"
+#include "test_stream.h"
+#include "test_utils.h"
+#include "test_orders.h"
+#include "test_license.h"
+#include "test_channels.h"
+#include "test_cliprdr.h"
+#include "test_drdynvc.h"
+#include "test_librfx.h"
+#include "test_freerdp.h"
+#include "test_rail.h"
+#include "test_pcap.h"
+#include "test_mppc.h"
+
+void dump_data(unsigned char * p, int len, int width, char* name)
+{
+       unsigned char *line = p;
+       int i, thisline, offset = 0;
+
+       printf("\n%s[%d][%d]:\n", name, len / width, width);
+       while (offset < len)
+       {
+               printf("%04x ", offset);
+               thisline = len - offset;
+               if (thisline > width)
+                       thisline = width;
+
+               for (i = 0; i < thisline; i++)
+                       printf("%02x ", line[i]);
+
+               for (; i < width; i++)
+                       printf("   ");
+
+               printf("\n");
+               offset += thisline;
+               line += thisline;
+       }
+       printf("\n");
+}
+
+void assert_stream(STREAM* s, uint8* data, int length, const char* func, int line)
+{
+       int i;
+       int actual_length;
+       uint8* actual_data;
+
+       actual_data = s->data;
+       actual_length = stream_get_length(s);
+
+       if (actual_length != length)
+       {
+               printf("\n %s (%d): length mismatch, actual:%d, expected:%d\n", func, line, actual_length, length);
+
+               printf("\nActual:\n");
+               freerdp_hexdump(actual_data, actual_length);
+
+               printf("Expected:\n");
+               freerdp_hexdump(data, length);
+
+               CU_FAIL("assert_stream, length mismatch");
+               return;
+       }
+
+       for (i = 0; i < length; i++)
+       {
+               if (actual_data[i] != data[i])
+               {
+                       printf("\n %s (%d): buffer mismatch:\n", func, line);
+
+                       printf("\nActual:\n");
+                       freerdp_hexdump(actual_data, length);
+
+                       printf("Expected:\n");
+                       freerdp_hexdump(data, length);
+
+                       CU_FAIL("assert_stream, buffer mismatch");
+                       return;
+               }
+       }
+}
+
+int main(int argc, char* argv[])
+{
+       int index = 1;
+       int *pindex = &index;
+       int ret = 0;
+
+       if (CU_initialize_registry() != CUE_SUCCESS)
+               return CU_get_error();
+
+       if (argc < *pindex + 1)
+       {
+               add_per_suite();
+               add_ber_suite();
+               add_gcc_suite();
+               add_mcs_suite();
+               add_color_suite();
+               add_bitmap_suite();
+               add_libgdi_suite();
+               add_list_suite();
+               add_orders_suite();
+               add_license_suite();
+               add_stream_suite();
+               add_mppc_suite();
+       }
+       else
+       {
+               while (*pindex < argc)
+               {
+                       if (strcmp("rail", argv[*pindex]) == 0)
+                       {
+                               add_rail_suite();
+                       }
+                       if (strcmp("color", argv[*pindex]) == 0)
+                       {
+                               add_color_suite();
+                       }
+                       if (strcmp("bitmap", argv[*pindex]) == 0)
+                       {
+                               add_bitmap_suite();
+                       }
+                       else if (strcmp("libgdi", argv[*pindex]) == 0)
+                       {
+                               add_libgdi_suite();
+                       }
+                       else if (strcmp("list", argv[*pindex]) == 0)
+                       {
+                               add_list_suite();
+                       }
+                       else if (strcmp("orders", argv[*pindex]) == 0)
+                       {
+                               add_orders_suite();
+                       }
+                       else if (strcmp("license", argv[*pindex]) == 0)
+                       {
+                               add_license_suite();
+                       }
+                       else if (strcmp("stream", argv[*pindex]) == 0)
+                       {
+                               add_stream_suite();
+                       }
+                       else if (strcmp("utils", argv[*pindex]) == 0)
+                       {
+                               add_utils_suite();
+                       }
+                       else if (strcmp("chanman", argv[*pindex]) == 0)
+                       {
+                               add_chanman_suite();
+                       }
+                       else if (strcmp("cliprdr", argv[*pindex]) == 0)
+                       {
+                               add_cliprdr_suite();
+                       }
+                       else if (strcmp("drdynvc", argv[*pindex]) == 0)
+                       {
+                               add_drdynvc_suite();
+                       }
+                       else if (strcmp("librfx", argv[*pindex]) == 0)
+                       {
+                               add_librfx_suite();
+                       }
+                       else if (strcmp("per", argv[*pindex]) == 0)
+                       {
+                               add_per_suite();
+                       }
+                       else if (strcmp("pcap", argv[*pindex]) == 0)
+                       {
+                               add_pcap_suite();
+                       }
+                       else if (strcmp("ber", argv[*pindex]) == 0)
+                       {
+                               add_ber_suite();
+                       }
+                       else if (strcmp("gcc", argv[*pindex]) == 0)
+                       {
+                               add_gcc_suite();
+                       }
+                       else if (strcmp("mcs", argv[*pindex]) == 0)
+                       {
+                               add_mcs_suite();
+                       }
+                       else if (strcmp("mppc", argv[*pindex]) == 0)
+                       {
+                               add_mppc_suite();
+                       }
+
+                       *pindex = *pindex + 1;
+               }
+       }
+
+       CU_basic_set_mode(CU_BRM_VERBOSE);
+       CU_basic_run_tests();
+       ret = CU_get_number_of_failure_records();
+       CU_cleanup_registry();
+
+       return ret;
+}
+
diff --git a/cunit/test_freerdp.h b/cunit/test_freerdp.h
new file mode 100644 (file)
index 0000000..d9d2230
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Unit Tests
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <CUnit/CUnit.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/hexdump.h>
+
+#define add_test_suite(name) \
+       CU_pSuite pSuite; \
+       pSuite = CU_add_suite(#name, init_##name##_suite, clean_##name##_suite); \
+       if (pSuite == NULL) { \
+               CU_cleanup_registry(); return CU_get_error(); \
+       }
+
+#define add_test_function(name) \
+       if (CU_add_test(pSuite, #name, test_##name) == NULL) { \
+               CU_cleanup_registry(); return CU_get_error(); \
+       }
+
+void dump_data(unsigned char * p, int len, int width, char* name);
+void assert_stream(STREAM* s, uint8* data, int length, const char* func, int line);
+
+#define ASSERT_STREAM(_s, _data, _length) assert_stream(_s, _data, _length, __FUNCTION__, __LINE__)
diff --git a/cunit/test_gcc.c b/cunit/test_gcc.c
new file mode 100644 (file)
index 0000000..1b86d4b
--- /dev/null
@@ -0,0 +1,215 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.124 Generic Conference Control (GCC) Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gcc.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_gcc.h"
+
+int init_gcc_suite(void)
+{
+       return 0;
+}
+
+int clean_gcc_suite(void)
+{
+       return 0;
+}
+
+int add_gcc_suite(void)
+{
+       add_test_suite(gcc);
+
+       add_test_function(gcc_write_conference_create_request);
+       add_test_function(gcc_write_client_core_data);
+       add_test_function(gcc_write_client_security_data);
+       add_test_function(gcc_write_client_cluster_data);
+       add_test_function(gcc_write_client_network_data);
+
+       return 0;
+}
+
+uint8 gcc_user_data[284] =
+       "\x01\xc0\xd8\x00\x04\x00\x08\x00\x00\x05\x00\x04\x01\xCA\x03\xAA"
+       "\x09\x04\x00\x00\xCE\x0E\x00\x00\x45\x00\x4c\x00\x54\x00\x4f\x00"
+       "\x4e\x00\x53\x00\x2d\x00\x44\x00\x45\x00\x56\x00\x32\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00"
+       "\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x01\xCA\x01\x00\x00\x00\x00\x00\x18\x00\x07\x00"
+       "\x01\x00\x36\x00\x39\x00\x37\x00\x31\x00\x32\x00\x2d\x00\x37\x00"
+       "\x38\x00\x33\x00\x2d\x00\x30\x00\x33\x00\x35\x00\x37\x00\x39\x00"
+       "\x37\x00\x34\x00\x2d\x00\x34\x00\x32\x00\x37\x00\x31\x00\x34\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x04\xC0\x0C\x00\x0D\x00\x00\x00"
+       "\x00\x00\x00\x00\x02\xC0\x0C\x00\x1B\x00\x00\x00\x00\x00\x00\x00"
+       "\x03\xC0\x2C\x00\x03\x00\x00\x00\x72\x64\x70\x64\x72\x00\x00\x00"
+       "\x00\x00\x80\x80\x63\x6c\x69\x70\x72\x64\x72\x00\x00\x00\xA0\xC0"
+       "\x72\x64\x70\x73\x6e\x64\x00\x00\x00\x00\x00\xc0";
+
+uint8 gcc_conference_create_request_expected[307] =
+       "\x00\x05\x00\x14\x7C\x00\x01\x81\x2A\x00\x08\x00\x10\x00\x01\xC0"
+       "\x00\x44\x75\x63\x61\x81\x1c\x01\xc0\xd8\x00\x04\x00\x08\x00\x00"
+       "\x05\x00\x04\x01\xCA\x03\xAA\x09\x04\x00\x00\xCE\x0E\x00\x00\x45"
+       "\x00\x4c\x00\x54\x00\x4f\x00\x4e\x00\x53\x00\x2d\x00\x44\x00\x45"
+       "\x00\x56\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"
+       "\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xCA\x01\x00\x00"
+       "\x00\x00\x00\x18\x00\x07\x00\x01\x00\x36\x00\x39\x00\x37\x00\x31"
+       "\x00\x32\x00\x2d\x00\x37\x00\x38\x00\x33\x00\x2d\x00\x30\x00\x33"
+       "\x00\x35\x00\x37\x00\x39\x00\x37\x00\x34\x00\x2d\x00\x34\x00\x32"
+       "\x00\x37\x00\x31\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"
+       "\xC0\x0C\x00\x0D\x00\x00\x00\x00\x00\x00\x00\x02\xC0\x0C\x00\x1B"
+       "\x00\x00\x00\x00\x00\x00\x00\x03\xC0\x2C\x00\x03\x00\x00\x00\x72"
+       "\x64\x70\x64\x72\x00\x00\x00\x00\x00\x80\x80\x63\x6c\x69\x70\x72"
+       "\x64\x72\x00\x00\x00\xA0\xC0\x72\x64\x70\x73\x6e\x64\x00\x00\x00"
+       "\x00\x00\xc0";
+
+void test_gcc_write_conference_create_request(void)
+{
+       STREAM* s;
+       STREAM user_data;
+
+       user_data.data = gcc_user_data;
+       user_data.size = sizeof(gcc_user_data);
+       user_data.p = user_data.data + user_data.size;
+
+       s = stream_new(sizeof(gcc_conference_create_request_expected));
+
+       gcc_write_conference_create_request(s, &user_data);
+       ASSERT_STREAM(s, (uint8*) gcc_conference_create_request_expected, sizeof(gcc_conference_create_request_expected));
+}
+
+uint8 gcc_client_core_data_expected[216] =
+       "\x01\xc0\xd8\x00\x04\x00\x08\x00\x00\x05\x00\x04\x01\xCA\x03\xAA"
+       "\x09\x04\x00\x00\xCE\x0E\x00\x00\x45\x00\x4c\x00\x54\x00\x4f\x00"
+       "\x4e\x00\x53\x00\x2d\x00\x44\x00\x45\x00\x56\x00\x32\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00"
+       "\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x01\xCA\x01\x00\x00\x00\x00\x00\x18\x00\x07\x00"
+       "\x01\x00\x36\x00\x39\x00\x37\x00\x31\x00\x32\x00\x2d\x00\x37\x00"
+       "\x38\x00\x33\x00\x2d\x00\x30\x00\x33\x00\x35\x00\x37\x00\x39\x00"
+       "\x37\x00\x34\x00\x2d\x00\x34\x00\x32\x00\x37\x00\x31\x00\x34\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00";
+
+void test_gcc_write_client_core_data(void)
+{
+       STREAM* s;
+       rdpSettings* settings;
+
+       s = stream_new(512);
+       settings = settings_new(NULL);
+
+       settings->width = 1280;
+       settings->height = 1024;
+       settings->rdp_version = 5;
+       settings->color_depth = 24;
+       settings->kbd_layout = 0x409;
+       settings->kbd_type = 0x04;
+       settings->kbd_fn_keys = 12;
+       settings->client_build = 3790;
+       strcpy(settings->client_hostname, "ELTONS-DEV2");
+       strcpy(settings->client_product_id, "69712-783-0357974-42714");
+
+       gcc_write_client_core_data(s, settings);
+
+       ASSERT_STREAM(s, (uint8*) gcc_client_core_data_expected, sizeof(gcc_client_core_data_expected));
+}
+
+uint8 gcc_client_security_data_expected[12] =
+               "\x02\xC0\x0C\x00\x1B\x00\x00\x00\x00\x00\x00\x00";
+
+void test_gcc_write_client_security_data(void)
+{
+       STREAM* s;
+       rdpSettings* settings;
+
+       s = stream_new(12);
+       settings = settings_new(NULL);
+
+       settings->encryption = 1; /* turn on encryption */
+       settings->encryption_method =
+                       ENCRYPTION_METHOD_40BIT |
+                       ENCRYPTION_METHOD_56BIT |
+                       ENCRYPTION_METHOD_128BIT |
+                       ENCRYPTION_METHOD_FIPS;
+
+       gcc_write_client_security_data(s, settings);
+
+       ASSERT_STREAM(s, (uint8*) gcc_client_security_data_expected, sizeof(gcc_client_security_data_expected));
+}
+
+uint8 gcc_client_cluster_data_expected[12] =
+               "\x04\xC0\x0C\x00\x0D\x00\x00\x00\x00\x00\x00\x00";
+
+void test_gcc_write_client_cluster_data(void)
+{
+       STREAM* s;
+       rdpSettings* settings;
+
+       s = stream_new(12);
+       settings = settings_new(NULL);
+
+       gcc_write_client_cluster_data(s, settings);
+
+       ASSERT_STREAM(s, (uint8*) gcc_client_cluster_data_expected, sizeof(gcc_client_cluster_data_expected));
+}
+
+uint8 gcc_client_network_data_expected[44] =
+               "\x03\xC0\x2C\x00\x03\x00\x00\x00\x72\x64\x70\x64\x72\x00\x00\x00"
+               "\x00\x00\x80\x80\x63\x6c\x69\x70\x72\x64\x72\x00\x00\x00\xA0\xC0"
+               "\x72\x64\x70\x73\x6e\x64\x00\x00\x00\x00\x00\xc0";
+
+void test_gcc_write_client_network_data(void)
+{
+       STREAM* s;
+       rdpSettings* settings;
+
+       s = stream_new(44);
+       settings = settings_new(NULL);
+
+       settings->num_channels = 3;
+       memset(settings->channels, 0, sizeof(rdpChannel) * settings->num_channels);
+
+       strcpy(settings->channels[0].name, "rdpdr");
+       settings->channels[0].options = 0x80800000;
+
+       strcpy(settings->channels[1].name, "cliprdr");
+       settings->channels[1].options = 0xc0A00000;
+
+       strcpy(settings->channels[2].name, "rdpsnd");
+       settings->channels[2].options = 0xc0000000;
+
+       gcc_write_client_network_data(s, settings);
+
+       ASSERT_STREAM(s, (uint8*) gcc_client_network_data_expected, sizeof(gcc_client_network_data_expected));
+}
diff --git a/cunit/test_gcc.h b/cunit/test_gcc.h
new file mode 100644 (file)
index 0000000..2ddce03
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.124 Generic Conference Control (GCC) Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_gcc_suite(void);
+int clean_gcc_suite(void);
+int add_gcc_suite(void);
+
+void test_gcc_write_conference_create_request(void);
+void test_gcc_write_client_core_data(void);
+void test_gcc_write_client_security_data(void);
+void test_gcc_write_client_cluster_data(void);
+void test_gcc_write_client_network_data(void);
diff --git a/cunit/test_libgdi.c b/cunit/test_libgdi.c
new file mode 100644 (file)
index 0000000..df352df
--- /dev/null
@@ -0,0 +1,2991 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Unit Tests
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/dc.h>
+#include <freerdp/gdi/pen.h>
+#include <freerdp/gdi/line.h>
+#include <freerdp/gdi/shape.h>
+#include <freerdp/gdi/brush.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/gdi/bitmap.h>
+#include <freerdp/gdi/palette.h>
+#include <freerdp/gdi/drawing.h>
+#include <freerdp/gdi/clipping.h>
+#include <freerdp/gdi/32bpp.h>
+
+#include "test_libgdi.h"
+
+int init_libgdi_suite(void)
+{
+       return 0;
+}
+
+int clean_libgdi_suite(void)
+{
+       return 0;
+}
+
+int add_libgdi_suite(void)
+{
+       add_test_suite(libgdi);
+
+       add_test_function(gdi_GetDC);
+       add_test_function(gdi_CreateCompatibleDC);
+       add_test_function(gdi_CreateBitmap);
+       add_test_function(gdi_CreateCompatibleBitmap);
+       add_test_function(gdi_CreatePen);
+       add_test_function(gdi_CreateSolidBrush);
+       add_test_function(gdi_CreatePatternBrush);
+       add_test_function(gdi_CreateRectRgn);
+       add_test_function(gdi_CreateRect);
+       add_test_function(gdi_GetPixel);
+       add_test_function(gdi_SetPixel);
+       add_test_function(gdi_SetROP2);
+       add_test_function(gdi_MoveToEx);
+       add_test_function(gdi_LineTo);
+       add_test_function(gdi_Ellipse);
+       add_test_function(gdi_PtInRect);
+       add_test_function(gdi_FillRect);
+       add_test_function(gdi_BitBlt_32bpp);
+       add_test_function(gdi_BitBlt_16bpp);
+       add_test_function(gdi_BitBlt_8bpp);
+       add_test_function(gdi_ClipCoords);
+       add_test_function(gdi_InvalidateRegion);
+
+       return 0;
+}
+
+/* BitBlt() Test Data */
+
+/* source bitmap (16x16) */
+unsigned char bmp_SRC[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* destination bitmap (16x16) */
+unsigned char bmp_DST[256] =
+{
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+/* pattern bitmap (8x8) */
+unsigned char bmp_PAT[64] =
+{
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+};
+
+/* SRCCOPY (0x00CC0020) */
+unsigned char bmp_SRCCOPY[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* BLACKNESS (0x00000042) */
+unsigned char bmp_BLACKNESS[256] =
+{
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+/* WHITENESS (0x00FF0062) */
+unsigned char bmp_WHITENESS[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* SRCAND (0x008800C6) */
+unsigned char bmp_SRCAND[256] =
+{
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+/* SRCPAINT (0x00EE0086) */
+unsigned char bmp_SRCPAINT[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* SRCINVERT (0x00660046) */
+unsigned char bmp_SRCINVERT[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* SRCERASE (0x00440328) */
+unsigned char bmp_SRCERASE[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* NOTSRCCOPY (0x00330008) */
+unsigned char bmp_NOTSRCCOPY[256] =
+{
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+/* NOTSRCERASE (0x001100A6) */
+unsigned char bmp_NOTSRCERASE[256] =
+{
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+/* DSTINVERT (0x00550009) */
+unsigned char bmp_DSTINVERT[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* SPna (0x000C0324) */
+unsigned char bmp_SPna[256] =
+{
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+};
+
+/* MERGEPAINT (0x00BB0226) */
+unsigned char bmp_MERGEPAINT[256] =
+{
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+/* MERGECOPY (0x00C000CA) */
+unsigned char bmp_MERGECOPY[256] =
+{
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+};
+
+/* PATPAINT (0x00FB0A09) */
+unsigned char bmp_PATPAINT[256] =
+{
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+};
+
+/* PATCOPY (0x00F00021) */
+unsigned char bmp_PATCOPY[256] =
+{
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+};
+
+/* PATINVERT (0x005A0049) */
+unsigned char bmp_PATINVERT[256] =
+{
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\x00\x00\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\x00\x00"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\xFF\xFF\x00\x00\x00\x00\xFF\xFF\x00\x00\xFF\xFF"
+};
+
+/* LineTo() Test Data */
+
+unsigned char line_to_case_1[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_2[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_case_3[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_4[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_5[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_6[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_7[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_8[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_9[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_10[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_case_11[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_BLACK[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_NOTMERGEPEN[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_MASKNOTPEN[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_NOTCOPYPEN[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_MASKPENNOT[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_NOT[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_XORPEN[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_NOTMASKPEN[256] =
+{
+       "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+};
+
+unsigned char line_to_R2_MASKPEN[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_NOTXORPEN[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_NOP[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_MERGENOTPEN[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_COPYPEN[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_MERGEPENNOT[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_MERGEPEN[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char line_to_R2_WHITE[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* PolylineTo() Test Data */
+
+unsigned char polyline_to_case_1[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF"
+       "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+unsigned char polyline_to_case_2[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* Ellipse() Test Data */
+
+unsigned char ellipse_case_1[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char ellipse_case_2[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+unsigned char ellipse_case_3[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+/* Polygon() Test Data */
+
+unsigned char polygon_case_1[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF"
+       "\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+};
+
+unsigned char polygon_case_2[256] =
+{
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+       "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+};
+
+int CompareBitmaps(HGDI_BITMAP hBmp1, HGDI_BITMAP hBmp2)
+{
+       int x, y;
+       uint8 *p1, *p2;
+
+       int minw = (hBmp1->width < hBmp2->width) ? hBmp1->width : hBmp2->width;
+       int minh = (hBmp1->height < hBmp2->height) ? hBmp1->height : hBmp2->height;
+
+       if (hBmp1->bitsPerPixel == hBmp2->bitsPerPixel)
+       {
+               p1 = hBmp1->data;
+               p2 = hBmp2->data;
+               int bpp = hBmp1->bitsPerPixel;
+
+               if (bpp == 32)
+               {
+                       for (y = 0; y < minh; y++)
+                       {
+                               for (x = 0; x < minw; x++)
+                               {
+                                       if (*p1 != *p2)
+                                               return 0;
+                                       p1++;
+                                       p2++;
+
+                                       if (*p1 != *p2)
+                                               return 0;
+                                       p1++;
+                                       p2++;
+
+                                       if (*p1 != *p2)
+                                               return 0;
+                                       p1 += 2;
+                                       p2 += 2;
+                               }
+                       }
+               }
+               else if (bpp == 16)
+               {
+                       for (y = 0; y < minh; y++)
+                       {
+                               for (x = 0; x < minw; x++)
+                               {
+                                       if (*p1 != *p2)
+                                               return 0;
+                                       p1++;
+                                       p2++;
+
+                                       if (*p1 != *p2)
+                                               return 0;
+                                       p1++;
+                                       p2++;
+                               }
+                       }
+               }
+               else if (bpp == 8)
+               {
+                       for (y = 0; y < minh; y++)
+                       {
+                               for (x = 0; x < minw; x++)
+                               {
+                                       if (*p1 != *p2)
+                                               return 0;
+                                       p1++;
+                                       p2++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               return 0;
+       }
+
+       return 1;
+}
+
+void dump_bitmap(HGDI_BITMAP hBmp, char* name)
+{
+       dump_data(hBmp->data, hBmp->width * hBmp->height * hBmp->bytesPerPixel, hBmp->width * hBmp->bytesPerPixel, name);
+}
+
+void assertBitmapsEqual(HGDI_BITMAP hBmpActual, HGDI_BITMAP hBmpExpected, char *name)
+{
+       int bitmapsEqual = CompareBitmaps(hBmpActual, hBmpExpected);
+
+       if (bitmapsEqual != 1)
+       {
+               printf("\n%s\n", name);
+               dump_bitmap(hBmpActual, "Actual");
+               dump_bitmap(hBmpExpected, "Expected");
+       }
+
+       CU_ASSERT(bitmapsEqual == 1);
+}
+
+void test_gdi_GetDC(void)
+{
+       HGDI_DC hdc = gdi_GetDC();
+       CU_ASSERT(hdc->bytesPerPixel == 4);
+       CU_ASSERT(hdc->bitsPerPixel == 32);
+       CU_ASSERT(hdc->drawMode == GDI_R2_BLACK);
+}
+
+void test_gdi_CreateCompatibleDC(void)
+{
+       HGDI_DC hdc;
+       HGDI_DC chdc;
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 2;
+       hdc->bitsPerPixel = 16;
+       hdc->drawMode = GDI_R2_XORPEN;
+
+       chdc = gdi_CreateCompatibleDC(hdc);
+
+       CU_ASSERT(chdc->bytesPerPixel == hdc->bytesPerPixel);
+       CU_ASSERT(chdc->bitsPerPixel == hdc->bitsPerPixel);
+       CU_ASSERT(chdc->drawMode == hdc->drawMode);
+}
+
+void test_gdi_CreateBitmap(void)
+{
+       int bpp;
+       int width;
+       int height;
+       uint8* data;
+       HGDI_BITMAP hBitmap;
+       
+       bpp = 32;
+       width = 32;
+       height = 16;
+       data = (uint8*) malloc(width * height * 4);
+       hBitmap = gdi_CreateBitmap(width, height, bpp, data);
+
+       CU_ASSERT(hBitmap->objectType == GDIOBJECT_BITMAP);
+       CU_ASSERT(hBitmap->bitsPerPixel == bpp);
+       CU_ASSERT(hBitmap->width == width);
+       CU_ASSERT(hBitmap->height == height);
+       CU_ASSERT(hBitmap->data == data);
+
+       gdi_DeleteObject((HGDIOBJECT) hBitmap);
+}
+
+void test_gdi_CreateCompatibleBitmap(void)
+{
+       HGDI_DC hdc;
+       int width;
+       int height;
+       HGDI_BITMAP hBitmap;
+       
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 4;
+       hdc->bitsPerPixel = 32;
+
+       width = 32;
+       height = 16;
+       hBitmap = gdi_CreateCompatibleBitmap(hdc, width, height);
+
+       CU_ASSERT(hBitmap->objectType == GDIOBJECT_BITMAP);
+       CU_ASSERT(hBitmap->bytesPerPixel == hdc->bytesPerPixel);
+       CU_ASSERT(hBitmap->bitsPerPixel == hdc->bitsPerPixel);
+       CU_ASSERT(hBitmap->width == width);
+       CU_ASSERT(hBitmap->height == height);
+       CU_ASSERT(hBitmap->data != NULL);
+
+       gdi_DeleteObject((HGDIOBJECT) hBitmap);
+}
+
+void test_gdi_CreatePen(void)
+{
+       HGDI_PEN hPen = gdi_CreatePen(GDI_PS_SOLID, 8, 0xAABBCCDD);
+       CU_ASSERT(hPen->style == GDI_PS_SOLID);
+       CU_ASSERT(hPen->width == 8);
+       CU_ASSERT(hPen->color == 0xAABBCCDD);
+       gdi_DeleteObject((HGDIOBJECT) hPen);
+}
+
+void test_gdi_CreateSolidBrush(void)
+{
+       HGDI_BRUSH hBrush = gdi_CreateSolidBrush(0xAABBCCDD);
+       CU_ASSERT(hBrush->objectType == GDIOBJECT_BRUSH);
+       CU_ASSERT(hBrush->style == GDI_BS_SOLID);
+       CU_ASSERT(hBrush->color == 0xAABBCCDD);
+       gdi_DeleteObject((HGDIOBJECT) hBrush);
+}
+
+void test_gdi_CreatePatternBrush(void)
+{
+       HGDI_BRUSH hBrush;
+       HGDI_BITMAP hBitmap;
+
+       hBitmap = gdi_CreateBitmap(64, 64, 32, NULL);
+       hBrush = gdi_CreatePatternBrush(hBitmap);
+
+       CU_ASSERT(hBrush->objectType == GDIOBJECT_BRUSH);
+       CU_ASSERT(hBrush->style == GDI_BS_PATTERN);
+       CU_ASSERT(hBrush->pattern == hBitmap);
+
+       gdi_DeleteObject((HGDIOBJECT) hBitmap);
+}
+
+void test_gdi_CreateRectRgn(void)
+{
+       int x1 = 32;
+       int y1 = 64;
+       int x2 = 128;
+       int y2 = 256;
+
+       HGDI_RGN hRegion = gdi_CreateRectRgn(x1, y1, x2, y2);
+
+       CU_ASSERT(hRegion->objectType == GDIOBJECT_REGION);
+       CU_ASSERT(hRegion->x == x1);
+       CU_ASSERT(hRegion->y == y1);
+       CU_ASSERT(hRegion->w == x2 - x1 + 1);
+       CU_ASSERT(hRegion->h == y2 - y1 + 1);
+       CU_ASSERT(hRegion->null == 0);
+
+       gdi_DeleteObject((HGDIOBJECT) hRegion);
+}
+
+void test_gdi_CreateRect(void)
+{
+       int x1 = 32;
+       int y1 = 64;
+       int x2 = 128;
+       int y2 = 256;
+
+       HGDI_RECT hRect = gdi_CreateRect(x1, y1, x2, y2);
+
+       CU_ASSERT(hRect->objectType == GDIOBJECT_RECT);
+       CU_ASSERT(hRect->left == x1);
+       CU_ASSERT(hRect->top == y1);
+       CU_ASSERT(hRect->right == x2);
+       CU_ASSERT(hRect->bottom == y2);
+
+       gdi_DeleteObject((HGDIOBJECT) hRect);
+}
+
+void test_gdi_GetPixel(void)
+{
+       HGDI_DC hdc;
+       int width = 128;
+       int height = 64;
+       HGDI_BITMAP hBitmap;
+
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 4;
+       hdc->bitsPerPixel = 32;
+       
+       hBitmap = gdi_CreateCompatibleBitmap(hdc, width, height);
+       gdi_SelectObject(hdc, (HGDIOBJECT) hBitmap);
+
+       hBitmap->data[(64 * width * 4) + 32 * 4 + 0] = 0xDD;
+       hBitmap->data[(64 * width * 4) + 32 * 4 + 1] = 0xCC;
+       hBitmap->data[(64 * width * 4) + 32 * 4 + 2] = 0xBB;
+       hBitmap->data[(64 * width * 4) + 32 * 4 + 3] = 0xAA;
+
+       CU_ASSERT(gdi_GetPixel(hdc, 32, 64) == 0xAABBCCDD);
+
+       gdi_DeleteObject((HGDIOBJECT) hBitmap);
+}
+
+void test_gdi_SetPixel(void)
+{
+       HGDI_DC hdc;
+       int width = 128;
+       int height = 64;
+       HGDI_BITMAP hBitmap;
+
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 4;
+       hdc->bitsPerPixel = 32;
+       
+       hBitmap = gdi_CreateCompatibleBitmap(hdc, width, height);
+       gdi_SelectObject(hdc, (HGDIOBJECT) hBitmap);
+
+       gdi_SetPixel(hdc, 32, 64, 0xAABBCCDD);
+       CU_ASSERT(gdi_GetPixel(hdc, 32, 64) == 0xAABBCCDD);
+
+       gdi_SetPixel(hdc, width - 1, height - 1, 0xAABBCCDD);
+       CU_ASSERT(gdi_GetPixel(hdc, width - 1, height - 1) == 0xAABBCCDD);
+
+       gdi_DeleteObject((HGDIOBJECT) hBitmap);
+}
+
+void test_gdi_SetROP2(void)
+{
+       HGDI_DC hdc = gdi_GetDC();
+       gdi_SetROP2(hdc, GDI_R2_BLACK);
+       CU_ASSERT(hdc->drawMode == GDI_R2_BLACK);
+}
+
+void test_gdi_MoveToEx(void)
+{
+       HGDI_DC hdc;
+       HGDI_PEN hPen;
+       HGDI_POINT prevPoint;
+
+       hdc = gdi_GetDC();
+       hPen = gdi_CreatePen(GDI_PS_SOLID, 8, 0xAABBCCDD);
+       gdi_SelectObject(hdc, (HGDIOBJECT) hPen);
+       gdi_MoveToEx(hdc, 128, 256, NULL);
+
+       CU_ASSERT(hdc->pen->posX == 128);
+       CU_ASSERT(hdc->pen->posY == 256);
+
+       prevPoint = (HGDI_POINT) malloc(sizeof(GDI_POINT));
+       memset(prevPoint, '\0', sizeof(GDI_POINT));
+
+       gdi_MoveToEx(hdc, 64, 128, prevPoint);
+
+       CU_ASSERT(prevPoint->x == 128);
+       CU_ASSERT(prevPoint->y == 256);
+       CU_ASSERT(hdc->pen->posX == 64);
+       CU_ASSERT(hdc->pen->posY == 128);
+}
+
+void test_gdi_LineTo(void)
+{
+       HGDI_DC hdc;
+       HGDI_PEN pen;
+       uint8* data;
+       HGDI_BITMAP hBmp;
+       HGDI_BITMAP hBmp_LineTo_1;
+       HGDI_BITMAP hBmp_LineTo_2;
+       HGDI_BITMAP hBmp_LineTo_3;
+       HGDI_BITMAP hBmp_LineTo_4;
+       HGDI_BITMAP hBmp_LineTo_5;
+       HGDI_BITMAP hBmp_LineTo_6;
+       HGDI_BITMAP hBmp_LineTo_7;
+       HGDI_BITMAP hBmp_LineTo_8;
+       HGDI_BITMAP hBmp_LineTo_9;
+       HGDI_BITMAP hBmp_LineTo_10;
+       HGDI_BITMAP hBmp_LineTo_11;
+       HGDI_BITMAP hBmp_LineTo_R2_BLACK;
+       HGDI_BITMAP hBmp_LineTo_R2_NOTMERGEPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_MASKNOTPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_NOTCOPYPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_MASKPENNOT;
+       HGDI_BITMAP hBmp_LineTo_R2_NOT;
+       HGDI_BITMAP hBmp_LineTo_R2_XORPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_NOTMASKPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_MASKPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_NOTXORPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_NOP;
+       HGDI_BITMAP hBmp_LineTo_R2_MERGENOTPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_COPYPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_MERGEPENNOT;
+       HGDI_BITMAP hBmp_LineTo_R2_MERGEPEN;
+       HGDI_BITMAP hBmp_LineTo_R2_WHITE;
+       rdpPalette* hPalette;
+       HCLRCONV clrconv;
+       int bitsPerPixel = 8;
+       int bytesPerPixel = 1;
+
+       hdc = gdi_GetDC();
+       hdc->bitsPerPixel = bitsPerPixel;
+       hdc->bytesPerPixel = bytesPerPixel;
+       gdi_SetNullClipRgn(hdc);
+
+       pen = gdi_CreatePen(1, 1, 0);
+       gdi_SelectObject(hdc, (HGDIOBJECT) pen);
+
+       hBmp = gdi_CreateCompatibleBitmap(hdc, 16, 16);
+       gdi_SelectObject(hdc, (HGDIOBJECT) hBmp);
+
+       hPalette = (rdpPalette*) gdi_GetSystemPalette();
+
+       clrconv = (HCLRCONV) malloc(sizeof(CLRCONV));
+       clrconv->alpha = 1;
+       clrconv->invert = 0;
+       clrconv->palette = hPalette;
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_1, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_1 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_2, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_2 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_3, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_3 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_4, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_4 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_5, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_5 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_5, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_5 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_6, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_6 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_7, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_7 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_8, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_8 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_9, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_9 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_10, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_10 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_case_11, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_11 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_BLACK, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_BLACK = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_NOTMERGEPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_NOTMERGEPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_MASKNOTPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_MASKNOTPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_NOTCOPYPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_NOTCOPYPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_MASKPENNOT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_MASKPENNOT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_NOT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_NOT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_XORPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_XORPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_NOTMASKPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_NOTMASKPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_MASKPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_MASKPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_NOTXORPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_NOTXORPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_NOP, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_NOP = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_MERGENOTPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_MERGENOTPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_COPYPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_COPYPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_MERGEPENNOT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_MERGEPENNOT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_MERGEPEN, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_MERGEPEN = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) line_to_R2_WHITE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_LineTo_R2_WHITE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       /* Test Case 1: (0,0) -> (15, 15) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_LineTo(hdc, 15, 15);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_1, "Case 1");
+
+       /* Test Case 2: (15,15) -> (0,0) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 15, 15, NULL);
+       gdi_LineTo(hdc, 0, 0);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_2, "Case 2");
+
+       /* Test Case 3: (15,0) -> (0,15) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 15, 0, NULL);
+       gdi_LineTo(hdc, 0, 15);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_3, "Case 3");
+
+       /* Test Case 4: (0,15) -> (15,0) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 0, 15, NULL);
+       gdi_LineTo(hdc, 15, 0);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_4, "Case 4");
+
+       /* Test Case 4: (0,15) -> (15,0) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 0, 15, NULL);
+       gdi_LineTo(hdc, 15, 0);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_4, "Case 4");
+
+       /* Test Case 5: (0,8) -> (15,8) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 0, 8, NULL);
+       gdi_LineTo(hdc, 15, 8);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_5, "Case 5");
+
+       /* Test Case 6: (15,8) -> (0,8) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 15, 8, NULL);
+       gdi_LineTo(hdc, 0, 8);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_6, "Case 6");
+
+       /* Test Case 7: (8,0) -> (8,15) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 8, 0, NULL);
+       gdi_LineTo(hdc, 8, 15);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_7, "Case 7");
+
+       /* Test Case 8: (8,15) -> (8,0) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 8, 15, NULL);
+       gdi_LineTo(hdc, 8, 0);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_8, "Case 8");
+
+       /* Test Case 9: (4,4) -> (12,12) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 4, 4, NULL);
+       gdi_LineTo(hdc, 12, 12);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_9, "Case 9");
+
+       /* Test Case 10: (12,12) -> (4,4) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_MoveToEx(hdc, 12, 12, NULL);
+       gdi_LineTo(hdc, 4, 4);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_10, "Case 10");
+
+       /* Test Case 11: (0,0) -> (+10,+10) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_LineTo(hdc, 16 + 10, 16 + 10);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_11, "Case 11");
+
+       /* Test Case 12: (0,0) -> (16,16), R2_BLACK */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_BLACK);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_BLACK, "Case 12");
+
+       /* Test Case 13: (0,0) -> (16,16), R2_NOTMERGEPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_NOTMERGEPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_NOTMERGEPEN, "Case 13");
+
+       /* Test Case 14: (0,0) -> (16,16), R2_MASKNOTPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_MASKNOTPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_MASKNOTPEN, "Case 14");
+
+       /* Test Case 15: (0,0) -> (16,16), R2_NOTCOPYPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_NOTCOPYPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_NOTCOPYPEN, "Case 15");
+
+       /* Test Case 16: (0,0) -> (16,16), R2_MASKPENNOT */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_MASKPENNOT);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_MASKPENNOT, "Case 16");
+
+       /* Test Case 17: (0,0) -> (16,16), R2_NOT */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_NOT);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_NOT, "Case 17");
+
+       /* Test Case 18: (0,0) -> (16,16), R2_XORPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_XORPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_XORPEN, "Case 18");
+
+       /* Test Case 19: (0,0) -> (16,16), R2_NOTMASKPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_NOTMASKPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_NOTMASKPEN, "Case 19");
+
+       /* Test Case 20: (0,0) -> (16,16), R2_MASKPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_MASKPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_MASKPEN, "Case 20");
+
+       /* Test Case 21: (0,0) -> (16,16), R2_NOTXORPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_NOTXORPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_NOTXORPEN, "Case 21");
+
+       /* Test Case 22: (0,0) -> (16,16), R2_NOP */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_NOP);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_NOP, "Case 22");
+
+       /* Test Case 23: (0,0) -> (16,16), R2_MERGENOTPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_MERGENOTPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_MERGENOTPEN, "Case 23");
+
+       /* Test Case 24: (0,0) -> (16,16), R2_COPYPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_COPYPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_COPYPEN, "Case 24");
+
+       /* Test Case 25: (0,0) -> (16,16), R2_MERGEPENNOT */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_MERGEPENNOT);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_MERGEPENNOT, "Case 25");
+
+       /* Test Case 26: (0,0) -> (16,16), R2_MERGEPEN */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_MERGEPEN);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_MERGEPEN, "Case 26");
+
+       /* Test Case 27: (0,0) -> (16,16), R2_WHITE */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_SetClipRgn(hdc, 0, 0, 16, 16);
+       gdi_MoveToEx(hdc, 0, 0, NULL);
+       gdi_SetROP2(hdc, GDI_R2_WHITE);
+       gdi_LineTo(hdc, 16, 16);
+       assertBitmapsEqual(hBmp, hBmp_LineTo_R2_WHITE, "Case 27");
+}
+
+void test_gdi_Ellipse(void)
+{
+       HGDI_DC hdc;
+       HGDI_PEN pen;
+       uint8* data;
+       HGDI_BITMAP hBmp;
+       HGDI_BITMAP hBmp_Ellipse_1;
+       HGDI_BITMAP hBmp_Ellipse_2;
+       HGDI_BITMAP hBmp_Ellipse_3;
+       rdpPalette* hPalette;
+       HCLRCONV clrconv;
+       int bitsPerPixel = 8;
+       int bytesPerPixel = 1;
+
+       hdc = gdi_GetDC();
+       hdc->bitsPerPixel = bitsPerPixel;
+       hdc->bytesPerPixel = bytesPerPixel;
+       gdi_SetNullClipRgn(hdc);
+
+       pen = gdi_CreatePen(1, 1, 0);
+       gdi_SelectObject(hdc, (HGDIOBJECT) pen);
+
+       hBmp = gdi_CreateCompatibleBitmap(hdc, 16, 16);
+       gdi_SelectObject(hdc, (HGDIOBJECT) hBmp);
+
+       hPalette = (rdpPalette*) gdi_GetSystemPalette();
+
+       clrconv = (HCLRCONV) malloc(sizeof(CLRCONV));
+       clrconv->alpha = 1;
+       clrconv->invert = 0;
+       clrconv->palette = hPalette;
+
+       data = (uint8*) freerdp_image_convert((uint8*) ellipse_case_1, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_Ellipse_1 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) ellipse_case_2, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_Ellipse_2 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) ellipse_case_3, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_Ellipse_3 = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       /* Test Case 1: (0,0) -> (16, 16) */
+       gdi_BitBlt(hdc, 0, 0, 16, 16, hdc, 0, 0, GDI_WHITENESS);
+       gdi_Ellipse(hdc, 0, 0, 16, 16);
+       //assertBitmapsEqual(hBmp, hBmp_Ellipse_1, "Case 1");
+}
+
+void test_gdi_PtInRect(void)
+{
+       HGDI_RECT hRect;
+       int left = 20;
+       int top = 40;
+       int right = 60;
+       int bottom = 80;
+
+       hRect = gdi_CreateRect(left, top, right, bottom);
+
+       CU_ASSERT(gdi_PtInRect(hRect, 0, 0) == 0);
+       CU_ASSERT(gdi_PtInRect(hRect, 500, 500) == 0);
+       CU_ASSERT(gdi_PtInRect(hRect, 40, 100) == 0);
+       CU_ASSERT(gdi_PtInRect(hRect, 10, 40) == 0);
+       CU_ASSERT(gdi_PtInRect(hRect, 30, 50) == 1);
+       CU_ASSERT(gdi_PtInRect(hRect, left, top) == 1);
+       CU_ASSERT(gdi_PtInRect(hRect, right, bottom) == 1);
+       CU_ASSERT(gdi_PtInRect(hRect, right, 60) == 1);
+       CU_ASSERT(gdi_PtInRect(hRect, 40, bottom) == 1);
+}
+
+void test_gdi_FillRect(void)
+{
+       HGDI_DC hdc;
+       HGDI_RECT hRect;
+       HGDI_BRUSH hBrush;
+       HGDI_BITMAP hBitmap;
+       GDI_COLOR color;
+       GDI_COLOR pixel;
+       GDI_COLOR rawPixel;
+
+       int x, y;
+       int badPixels;
+       int goodPixels;
+       int width = 200;
+       int height = 300;
+
+       int left = 20;
+       int top = 40;
+       int right = 60;
+       int bottom = 80;
+
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 4;
+       hdc->bitsPerPixel = 32;
+
+       hRect = gdi_CreateRect(left, top, right, bottom);
+
+       hBitmap = gdi_CreateCompatibleBitmap(hdc, width, height);
+       memset(hBitmap->data, 0, width * height * hdc->bytesPerPixel);
+       gdi_SelectObject(hdc, (HGDIOBJECT) hBitmap);
+
+       color = (GDI_COLOR) ARGB32(0xFF, 0xAA, 0xBB, 0xCC);
+       hBrush = gdi_CreateSolidBrush(color);
+
+       gdi_FillRect(hdc, hRect, hBrush);
+
+       badPixels = 0;
+       goodPixels = 0;
+
+       for (x = 0; x < width; x++)
+       {
+               for (y = 0; y < height; y++)
+               {
+                       rawPixel = gdi_GetPixel(hdc, x, y);
+                       pixel = gdi_get_color_32bpp(hdc, rawPixel);
+
+                       if (gdi_PtInRect(hRect, x, y))
+                       {
+                               if (pixel == color) {
+                                       goodPixels++;
+                               }
+                               else {
+                                       printf("actual:%04X expected:%04X\n", gdi_GetPixel(hdc, x, y), color);
+                                       badPixels++;
+                               }
+                       }
+                       else
+                       {
+                               if (pixel == color) {
+                                       badPixels++;
+                               }
+                               else {
+                                       goodPixels++;
+                               }
+                       }
+               }
+       }
+
+       CU_ASSERT(goodPixels == width * height);
+       CU_ASSERT(badPixels == 0);
+
+       gdi_DeleteObject((HGDIOBJECT) hBrush);
+       gdi_DeleteObject((HGDIOBJECT) hBitmap);
+}
+
+void test_gdi_BitBlt_32bpp(void)
+{
+       uint8* data;
+       HGDI_DC hdcSrc;
+       HGDI_DC hdcDst;
+       HGDI_BRUSH hBrush;
+       HGDI_BITMAP hBmpSrc;
+       HGDI_BITMAP hBmpDst;
+       HGDI_BITMAP hBmpPat;
+       HGDI_BITMAP hBmp_SPna;
+       HGDI_BITMAP hBmp_BLACKNESS;
+       HGDI_BITMAP hBmp_WHITENESS;
+       HGDI_BITMAP hBmp_SRCCOPY;
+       HGDI_BITMAP hBmp_SRCAND;
+       HGDI_BITMAP hBmp_SRCPAINT;
+       HGDI_BITMAP hBmp_SRCINVERT;
+       HGDI_BITMAP hBmp_SRCERASE;
+       HGDI_BITMAP hBmp_NOTSRCCOPY;
+       HGDI_BITMAP hBmp_NOTSRCERASE;
+       HGDI_BITMAP hBmp_DSTINVERT;
+       HGDI_BITMAP hBmp_MERGECOPY;
+       HGDI_BITMAP hBmp_MERGEPAINT;
+       HGDI_BITMAP hBmp_PATCOPY;
+       HGDI_BITMAP hBmp_PATPAINT;
+       HGDI_BITMAP hBmp_PATINVERT;
+       HGDI_BITMAP hBmpDstOriginal;
+       rdpPalette* hPalette;
+       HCLRCONV clrconv;
+
+       int bytesPerPixel = 4;
+       int bitsPerPixel = 32;
+       
+       hdcSrc = gdi_GetDC();
+       hdcSrc->bytesPerPixel = bytesPerPixel;
+       hdcSrc->bitsPerPixel = bitsPerPixel;
+
+       hdcDst = gdi_GetDC();
+       hdcDst->bytesPerPixel = bytesPerPixel;
+       hdcDst->bitsPerPixel = bitsPerPixel;
+
+       hPalette = (rdpPalette*) gdi_GetSystemPalette();
+
+       clrconv = (HCLRCONV) malloc(sizeof(CLRCONV));
+       clrconv->alpha = 1;
+       clrconv->invert = 0;
+       clrconv->palette = hPalette;
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRC, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpSrc = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DST, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpDst = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DST, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpDstOriginal = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PAT, NULL, 8, 8, 8, bitsPerPixel, clrconv);
+       hBmpPat = gdi_CreateBitmap(8, 8, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SPna, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SPna = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_BLACKNESS, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_BLACKNESS = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_WHITENESS, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_WHITENESS = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCAND, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCAND = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCERASE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCERASE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_NOTSRCCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_NOTSRCCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_NOTSRCERASE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_NOTSRCERASE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DSTINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_DSTINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_MERGECOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_MERGECOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_MERGEPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_MERGEPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+       
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       gdi_SelectObject(hdcDst, (HGDIOBJECT) hBmpDst);
+
+       /* SRCCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCCOPY) == 1)
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+               
+       /* BLACKNESS */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_BLACKNESS);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_BLACKNESS) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* WHITENESS */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_WHITENESS);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_WHITENESS) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SRCAND */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCAND);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCAND) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SRCPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCPAINT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SRCINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCINVERT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SRCERASE */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCERASE);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCERASE) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* NOTSRCCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_NOTSRCCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_NOTSRCCOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* NOTSRCERASE */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_NOTSRCERASE);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_NOTSRCERASE) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* DSTINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_DSTINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_DSTINVERT) == 1);
+
+       /* select a brush for operations using a pattern */
+       hBrush = gdi_CreatePatternBrush(hBmpPat);
+       gdi_SelectObject(hdcDst, (HGDIOBJECT) hBrush);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* MERGECOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_MERGECOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_MERGECOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* MERGEPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_MERGEPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_MERGEPAINT) == 1);
+       
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* PATCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATCOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* PATINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATINVERT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* PATPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATPAINT) == 1);
+       
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SPna */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SPna);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SPna) == 1)
+}
+
+void test_gdi_BitBlt_16bpp(void)
+{
+       uint8* data;
+       HGDI_DC hdcSrc;
+       HGDI_DC hdcDst;
+       HGDI_BRUSH hBrush;
+       HGDI_BITMAP hBmpSrc;
+       HGDI_BITMAP hBmpDst;
+       HGDI_BITMAP hBmpPat;
+       HGDI_BITMAP hBmp_SPna;
+       HGDI_BITMAP hBmp_BLACKNESS;
+       HGDI_BITMAP hBmp_WHITENESS;
+       HGDI_BITMAP hBmp_SRCCOPY;
+       HGDI_BITMAP hBmp_SRCAND;
+       HGDI_BITMAP hBmp_SRCPAINT;
+       HGDI_BITMAP hBmp_SRCINVERT;
+       HGDI_BITMAP hBmp_SRCERASE;
+       HGDI_BITMAP hBmp_NOTSRCCOPY;
+       HGDI_BITMAP hBmp_NOTSRCERASE;
+       HGDI_BITMAP hBmp_DSTINVERT;
+       HGDI_BITMAP hBmp_MERGECOPY;
+       HGDI_BITMAP hBmp_MERGEPAINT;
+       HGDI_BITMAP hBmp_PATCOPY;
+       HGDI_BITMAP hBmp_PATPAINT;
+       HGDI_BITMAP hBmp_PATINVERT;
+       HGDI_BITMAP hBmpDstOriginal;
+       rdpPalette* hPalette;
+       HCLRCONV clrconv;
+
+       int bytesPerPixel = 2;
+       int bitsPerPixel = 16;
+       
+       hdcSrc = gdi_GetDC();
+       hdcSrc->bytesPerPixel = bytesPerPixel;
+       hdcSrc->bitsPerPixel = bitsPerPixel;
+
+       hdcDst = gdi_GetDC();
+       hdcDst->bytesPerPixel = bytesPerPixel;
+       hdcDst->bitsPerPixel = bitsPerPixel;
+
+       hPalette = (rdpPalette*) gdi_GetSystemPalette();
+
+       clrconv = (HCLRCONV) malloc(sizeof(CLRCONV));
+       clrconv->alpha = 1;
+       clrconv->invert = 0;
+       clrconv->palette = hPalette;
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRC, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpSrc = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DST, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpDst = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DST, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpDstOriginal = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PAT, NULL, 8, 8, 8, bitsPerPixel, clrconv);
+       hBmpPat = gdi_CreateBitmap(8, 8, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SPna, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SPna = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+       
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_BLACKNESS, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_BLACKNESS = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_WHITENESS, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_WHITENESS = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCAND, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCAND = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCERASE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCERASE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_NOTSRCCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_NOTSRCCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_NOTSRCERASE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_NOTSRCERASE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DSTINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_DSTINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_MERGECOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_MERGECOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_MERGEPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_MERGEPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+       
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       gdi_SelectObject(hdcDst, (HGDIOBJECT) hBmpDst);
+
+       /* SRCCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCCOPY) == 1)
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+               
+       /* BLACKNESS */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_BLACKNESS);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_BLACKNESS) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* WHITENESS */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_WHITENESS);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_WHITENESS) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SRCAND */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCAND);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCAND) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SRCPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCPAINT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SRCINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCINVERT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SRCERASE */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCERASE);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCERASE) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* NOTSRCCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_NOTSRCCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_NOTSRCCOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* NOTSRCERASE */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_NOTSRCERASE);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_NOTSRCERASE) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* DSTINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_DSTINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_DSTINVERT) == 1);
+
+       /* select a brush for operations using a pattern */
+       hBrush = gdi_CreatePatternBrush(hBmpPat);
+       gdi_SelectObject(hdcDst, (HGDIOBJECT) hBrush);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* MERGECOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_MERGECOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_MERGECOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* MERGEPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_MERGEPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_MERGEPAINT) == 1);
+       
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* PATCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATCOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* PATINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATINVERT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* PATPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATPAINT) == 1);
+       
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       
+       /* SPna */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SPna);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SPna) == 1)
+}
+
+void test_gdi_BitBlt_8bpp(void)
+{
+       uint8* data;
+       HGDI_DC hdcSrc;
+       HGDI_DC hdcDst;
+       HGDI_BRUSH hBrush;
+       HGDI_BITMAP hBmpSrc;
+       HGDI_BITMAP hBmpDst;
+       HGDI_BITMAP hBmpPat;
+       HGDI_BITMAP hBmp_SPna;
+       HGDI_BITMAP hBmp_BLACKNESS;
+       HGDI_BITMAP hBmp_WHITENESS;
+       HGDI_BITMAP hBmp_SRCCOPY;
+       HGDI_BITMAP hBmp_SRCAND;
+       HGDI_BITMAP hBmp_SRCPAINT;
+       HGDI_BITMAP hBmp_SRCINVERT;
+       HGDI_BITMAP hBmp_SRCERASE;
+       HGDI_BITMAP hBmp_NOTSRCCOPY;
+       HGDI_BITMAP hBmp_NOTSRCERASE;
+       HGDI_BITMAP hBmp_DSTINVERT;
+       HGDI_BITMAP hBmp_MERGECOPY;
+       HGDI_BITMAP hBmp_MERGEPAINT;
+       HGDI_BITMAP hBmp_PATCOPY;
+       HGDI_BITMAP hBmp_PATPAINT;
+       HGDI_BITMAP hBmp_PATINVERT;
+       HGDI_BITMAP hBmpDstOriginal;
+       rdpPalette* hPalette;
+       HCLRCONV clrconv;
+
+       int bytesPerPixel = 1;
+       int bitsPerPixel = 8;
+
+       hdcSrc = gdi_GetDC();
+       hdcSrc->bytesPerPixel = bytesPerPixel;
+       hdcSrc->bitsPerPixel = bitsPerPixel;
+
+       hdcDst = gdi_GetDC();
+       hdcDst->bytesPerPixel = bytesPerPixel;
+       hdcDst->bitsPerPixel = bitsPerPixel;
+
+       hPalette = (rdpPalette*) gdi_GetSystemPalette();
+
+       clrconv = (HCLRCONV) malloc(sizeof(CLRCONV));
+       clrconv->alpha = 1;
+       clrconv->invert = 0;
+       clrconv->palette = hPalette;
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRC, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpSrc = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DST, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpDst = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DST, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmpDstOriginal = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PAT, NULL, 8, 8, 8, bitsPerPixel, clrconv);
+       hBmpPat = gdi_CreateBitmap(8, 8, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SPna, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SPna = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_BLACKNESS, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_BLACKNESS = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_WHITENESS, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_WHITENESS = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCAND, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCAND = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_SRCERASE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_SRCERASE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_NOTSRCCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_NOTSRCCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_NOTSRCERASE, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_NOTSRCERASE = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_DSTINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_DSTINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_MERGECOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_MERGECOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_MERGEPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_MERGEPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATCOPY, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATCOPY = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATPAINT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATPAINT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       data = (uint8*) freerdp_image_convert((uint8*) bmp_PATINVERT, NULL, 16, 16, 8, bitsPerPixel, clrconv);
+       hBmp_PATINVERT = gdi_CreateBitmap(16, 16, bitsPerPixel, data);
+
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+       gdi_SelectObject(hdcDst, (HGDIOBJECT) hBmpDst);
+
+       /* SRCCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCCOPY) == 1)
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* BLACKNESS */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_BLACKNESS);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_BLACKNESS) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* WHITENESS */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_WHITENESS);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_WHITENESS) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SRCAND */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCAND);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCAND) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SRCPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCPAINT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SRCINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCINVERT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SRCERASE */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCERASE);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SRCERASE) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* NOTSRCCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_NOTSRCCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_NOTSRCCOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* NOTSRCERASE */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_NOTSRCERASE);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_NOTSRCERASE) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* DSTINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_DSTINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_DSTINVERT) == 1);
+
+       /* select a brush for operations using a pattern */
+       hBrush = gdi_CreatePatternBrush(hBmpPat);
+       gdi_SelectObject(hdcDst, (HGDIOBJECT) hBrush);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* MERGECOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_MERGECOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_MERGECOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* MERGEPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_MERGEPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_MERGEPAINT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* PATCOPY */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATCOPY);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATCOPY) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* PATINVERT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATINVERT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATINVERT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* PATPAINT */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_PATPAINT);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_PATPAINT) == 1);
+
+       /* restore original destination bitmap */
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpDstOriginal);
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SRCCOPY);
+       gdi_SelectObject(hdcSrc, (HGDIOBJECT) hBmpSrc);
+
+       /* SPna */
+       gdi_BitBlt(hdcDst, 0, 0, 16, 16, hdcSrc, 0, 0, GDI_SPna);
+       CU_ASSERT(CompareBitmaps(hBmpDst, hBmp_SPna) == 1)
+}
+
+void test_gdi_ClipCoords(void)
+{
+       HGDI_DC hdc;
+       HGDI_RGN rgn1;
+       HGDI_RGN rgn2;
+       HGDI_BITMAP bmp;
+       int draw;
+       
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 4;
+       hdc->bitsPerPixel = 32;
+       bmp = gdi_CreateBitmap(1024, 768, 4, NULL);
+       gdi_SelectObject(hdc, (HGDIOBJECT) bmp);
+       gdi_SetNullClipRgn(hdc);
+
+       rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
+       rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
+       rgn1->null = 1;
+       rgn2->null = 1;
+
+       /* null clipping region */
+       gdi_SetNullClipRgn(hdc);
+       gdi_SetRgn(rgn1, 20, 20, 100, 100);
+       gdi_SetRgn(rgn2, 20, 20, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+
+       /* region all inside clipping region */
+       gdi_SetClipRgn(hdc, 0, 0, 1024, 768);
+       gdi_SetRgn(rgn1, 20, 20, 100, 100);
+       gdi_SetRgn(rgn2, 20, 20, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+
+       /* region all outside clipping region, on the left */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 20, 20, 100, 100);
+       gdi_SetRgn(rgn2, 0, 0, 0, 0);
+
+       draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(draw == 0);
+
+       /* region all outside clipping region, on the right */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 420, 420, 100, 100);
+       gdi_SetRgn(rgn2, 0, 0, 0, 0);
+
+       draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(draw == 0);
+
+       /* region all outside clipping region, on top */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 20, 100, 100);
+       gdi_SetRgn(rgn2, 0, 0, 0, 0);
+
+       draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(draw == 0);
+
+       /* region all outside clipping region, at the bottom */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 420, 100, 100);
+       gdi_SetRgn(rgn2, 0, 0, 0, 0);
+
+       draw = gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(draw == 0);
+
+       /* left outside, right = clip, top = clip, bottom = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 100, 300, 300, 100);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+
+       /* left outside, right inside, top = clip, bottom = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 100, 300, 250, 100);
+       gdi_SetRgn(rgn2, 300, 300, 50, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);       
+       
+       /* left = clip, right outside, top = clip, bottom = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 300, 300, 100);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+
+       /* left inside, right outside, top = clip, bottom = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 350, 300, 200, 100);
+       gdi_SetRgn(rgn2, 350, 300, 50, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+
+       /* top outside, bottom = clip, left = clip, right = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 100, 300, 300);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+
+       /* top = clip, bottom outside, left = clip, right = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 300, 100, 200);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+       
+       /* top = clip, bottom = clip, top = clip, bottom = clip */
+       gdi_SetClipRgn(hdc, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 300, 100, 100);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_ClipCoords(hdc, &(rgn1->x), &(rgn1->y), &(rgn1->w), &(rgn1->h), NULL, NULL);
+       CU_ASSERT(gdi_EqualRgn(rgn1, rgn2) == 1);
+}
+
+void test_gdi_InvalidateRegion(void)
+{
+       HGDI_DC hdc;
+       HGDI_RGN rgn1;
+       HGDI_RGN rgn2;
+       HGDI_RGN invalid;
+       HGDI_BITMAP bmp;
+       
+       hdc = gdi_GetDC();
+       hdc->bytesPerPixel = 4;
+       hdc->bitsPerPixel = 32;
+       bmp = gdi_CreateBitmap(1024, 768, 4, NULL);
+       gdi_SelectObject(hdc, (HGDIOBJECT) bmp);
+       gdi_SetNullClipRgn(hdc);
+
+       hdc->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND));
+       hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
+       hdc->hwnd->invalid->null = 1;
+       invalid = hdc->hwnd->invalid;
+       
+       hdc->hwnd->count = 16;
+       hdc->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * hdc->hwnd->count);
+
+       rgn1 = gdi_CreateRectRgn(0, 0, 0, 0);
+       rgn2 = gdi_CreateRectRgn(0, 0, 0, 0);
+       rgn1->null = 1;
+       rgn2->null = 1;
+
+       /* no previous invalid region */
+       invalid->null = 1;
+       gdi_SetRgn(rgn1, 300, 300, 100, 100);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* region same as invalid region */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 300, 100, 100);
+       gdi_SetRgn(rgn2, 300, 300, 100, 100);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* left outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 100, 300, 300, 100);
+       gdi_SetRgn(rgn2, 100, 300, 300, 100);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* right outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 300, 300, 100);
+       gdi_SetRgn(rgn2, 300, 300, 300, 100);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* top outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 100, 100, 300);
+       gdi_SetRgn(rgn2, 300, 100, 100, 300);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* bottom outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 300, 100, 300);
+       gdi_SetRgn(rgn2, 300, 300, 100, 300);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* left outside, right outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 100, 300, 600, 300);
+       gdi_SetRgn(rgn2, 100, 300, 600, 300);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* top outside, bottom outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 100, 100, 500);
+       gdi_SetRgn(rgn2, 300, 100, 100, 500);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* all outside, left */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 100, 300, 100, 100);
+       gdi_SetRgn(rgn2, 100, 300, 300, 100);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* all outside, right */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 700, 300, 100, 100);
+       gdi_SetRgn(rgn2, 300, 300, 500, 100);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* all outside, top */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 100, 100, 100);
+       gdi_SetRgn(rgn2, 300, 100, 100, 300);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* all outside, bottom */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 300, 500, 100, 100);
+       gdi_SetRgn(rgn2, 300, 300, 100, 300);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* all outside */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 100, 100, 600, 600);
+       gdi_SetRgn(rgn2, 100, 100, 600, 600);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+
+       /* everything */
+       gdi_SetRgn(invalid, 300, 300, 100, 100);
+       gdi_SetRgn(rgn1, 0, 0, 1024, 768);
+       gdi_SetRgn(rgn2, 0, 0, 1024, 768);
+
+       gdi_InvalidateRegion(hdc, rgn1->x, rgn1->y, rgn1->w, rgn1->h);
+       CU_ASSERT(gdi_EqualRgn(invalid, rgn2) == 1);
+}
diff --git a/cunit/test_libgdi.h b/cunit/test_libgdi.h
new file mode 100644 (file)
index 0000000..7b181b1
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Unit Tests
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_libgdi_suite(void);
+int clean_libgdi_suite(void);
+int add_libgdi_suite(void);
+
+void test_gdi_GetDC(void);
+void test_gdi_CreateCompatibleDC(void);
+void test_gdi_CreateBitmap(void);
+void test_gdi_CreateCompatibleBitmap(void);
+void test_gdi_CreatePen(void);
+void test_gdi_CreateSolidBrush(void);
+void test_gdi_CreatePatternBrush(void);
+void test_gdi_CreateRectRgn(void);
+void test_gdi_CreateRect(void);
+void test_gdi_GetPixel(void);
+void test_gdi_SetPixel(void);
+void test_gdi_SetROP2(void);
+void test_gdi_MoveToEx(void);
+void test_gdi_LineTo(void);
+void test_gdi_Ellipse(void);
+void test_gdi_PtInRect(void);
+void test_gdi_FillRect(void);
+void test_gdi_BitBlt_32bpp(void);
+void test_gdi_BitBlt_16bpp(void);
+void test_gdi_BitBlt_8bpp(void);
+void test_gdi_ClipCoords(void);
+void test_gdi_InvalidateRegion(void);
diff --git a/cunit/test_librfx.c b/cunit/test_librfx.c
new file mode 100644 (file)
index 0000000..8799959
--- /dev/null
@@ -0,0 +1,410 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RemoteFX Codec Library Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The sample data comes from [MS-RDPRFX] 4.2.3, which is decoded into three
+ * vertical bands in red (21x64), green (23x64) and blue(20x64) color.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/print.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/codec/rfx.h>
+#include "rfx_types.h"
+#include "rfx_bitstream.h"
+#include "rfx_rlgr.h"
+#include "rfx_differential.h"
+#include "rfx_quantization.h"
+#include "rfx_dwt.h"
+#include "rfx_decode.h"
+#include "rfx_encode.h"
+
+#include "test_librfx.h"
+
+static const uint8 y_data[] =
+{
+                         0x19, 0x82, 0x1d, 0x10, 0x62, 0x9d, 0x28, 0x85, 0x2c, 0xa2, 0x14, 0xb2, 0x88,
+       0x52, 0xca, 0x21, 0x4b, 0x28, 0x85, 0x2c, 0xa2, 0x14, 0xb2, 0x88, 0x52, 0xca, 0x21, 0x4b, 0x28,
+       0x85, 0x2c, 0xa2, 0x14, 0xb2, 0x88, 0x52, 0xca, 0x21, 0x4b, 0x28, 0x85, 0x2c, 0xa2, 0x14, 0xb2,
+       0x88, 0x52, 0xca, 0x21, 0x4b, 0x28, 0x85, 0x2c, 0xa2, 0x14, 0xb2, 0x88, 0x52, 0xca, 0x21, 0x4b,
+       0x28, 0x85, 0x2c, 0xa2, 0x14, 0xb2, 0x88, 0x52, 0xca, 0x21, 0x4b, 0x28, 0x85, 0x2c, 0xa2, 0x14,
+       0xb2, 0x88, 0x52, 0xca, 0x21, 0x4b, 0x28, 0x85, 0x2c, 0xa2, 0x14, 0xb0, 0x00, 0x20, 0xf4, 0x40,
+       0x0c, 0xc1, 0x1e, 0x20, 0x26, 0x22, 0x20, 0x33, 0x23, 0xc4, 0x23, 0x88, 0x86, 0x50, 0xf1, 0x22,
+       0x68, 0x4c, 0x91, 0x85, 0x10, 0x34, 0x4c, 0x84, 0x78, 0xa2, 0x0d, 0x13, 0x21, 0x1e, 0x29, 0x06,
+       0x89, 0x90, 0x8f, 0x14, 0x83, 0x44, 0xf4, 0x23, 0xc5, 0x20, 0xd1, 0x3d, 0x08, 0xf1, 0x48, 0x34,
+       0x4f, 0x42, 0x3c, 0x52, 0x0d, 0x13, 0xd0, 0x8f, 0x14, 0x83, 0x44, 0xf4, 0x23, 0xc5, 0x20, 0xd1,
+       0x3d, 0x08, 0xf1, 0x48, 0x34, 0x4f, 0x42, 0x3c, 0x52, 0x0d, 0x13, 0xd0, 0x8f, 0x14, 0x83, 0x44,
+       0xf4, 0x23, 0xc5, 0x20, 0x00, 0x08, 0x47, 0x70, 0x15, 0x02, 0xe0, 0x7f, 0xe4, 0x9d, 0xc2, 0x51,
+       0x71, 0xf4, 0x99, 0xc9, 0x57, 0xff, 0x32, 0x87, 0x9d, 0x17, 0xd6, 0x50, 0x6e, 0x06, 0x2f, 0xac,
+       0xa0, 0x9c, 0x0c, 0x5f, 0x59, 0x41, 0x38, 0x18, 0xbe, 0xb2, 0x82, 0x70, 0x31, 0x7d, 0x65, 0x00,
+       0x00, 0x10, 0xff, 0x9c, 0x33, 0x41, 0xf1, 0xc4, 0xb0, 0x3c, 0xff, 0xa2, 0x15, 0xbd, 0x7b, 0xea,
+       0x86, 0x9b, 0x5f, 0xfc, 0x78, 0x8c, 0xf5, 0xed, 0xa8, 0x68, 0xda, 0xfd, 0x3c, 0x45, 0x7a, 0xf4,
+       0xd4, 0x34, 0x6d, 0x7e, 0x9e, 0x22, 0xbd, 0x7a, 0x6a, 0x1a, 0x36, 0xbf, 0x4f, 0x11, 0x5e, 0xbd,
+       0x35, 0x0d, 0x1b, 0x5f, 0xa7, 0x88, 0xaf, 0x5e, 0x9a, 0x86, 0x8d, 0xaf, 0xd3, 0xc4, 0x57, 0xaf,
+       0x4d, 0x43, 0x46, 0xd7, 0xe9, 0xe2, 0x20, 0x30, 0x00
+};
+
+static const uint8 cb_data[] =
+{
+                                                             0x1b, 0x04, 0x7f, 0x04, 0x31, 0x5f, 0xc2,
+       0x94, 0xaf, 0x05, 0x29, 0x5e, 0x0a, 0x52, 0xbc, 0x14, 0xa5, 0x78, 0x29, 0x25, 0x78, 0x29, 0x25,
+       0x78, 0x29, 0x25, 0x68, 0x52, 0x4a, 0xf0, 0x52, 0x4a, 0xf0, 0x52, 0x4a, 0xd0, 0xa4, 0x95, 0xe0,
+       0xa4, 0x95, 0xe0, 0xa4, 0x95, 0xa1, 0x49, 0x2b, 0xc1, 0x49, 0x2b, 0xc1, 0x49, 0x2b, 0x42, 0x92,
+       0x57, 0x82, 0x92, 0x57, 0x82, 0x92, 0x56, 0x85, 0x24, 0xaf, 0x05, 0x24, 0xaf, 0x05, 0x24, 0xad,
+       0x0a, 0x49, 0x5e, 0x0a, 0x49, 0x5e, 0x0a, 0x49, 0x5a, 0x14, 0x92, 0xbc, 0x14, 0x92, 0xbc, 0x14,
+       0x92, 0xb4, 0x29, 0x25, 0x78, 0x29, 0x25, 0x78, 0x00, 0x02, 0x0f, 0x02, 0x00, 0xac, 0x13, 0xfc,
+       0xc0, 0x0a, 0x20, 0x10, 0x2b, 0x27, 0xf9, 0x80, 0xb0, 0x08, 0xaa, 0x3d, 0x60, 0x8c, 0x0b, 0x24,
+       0xff, 0x30, 0x80, 0xc0, 0xaa, 0x13, 0xfc, 0xc2, 0x03, 0x05, 0x90, 0x9f, 0xe6, 0x10, 0x18, 0x2c,
+       0x84, 0xff, 0x30, 0x81, 0x82, 0xc8, 0x4f, 0xf3, 0x08, 0x18, 0x2c, 0x84, 0xff, 0x31, 0x03, 0x05,
+       0x90, 0x9f, 0xff, 0xd8, 0x40, 0x60, 0x59, 0x09, 0xfe, 0x61, 0x01, 0x81, 0x64, 0x27, 0xf9, 0x84,
+       0x06, 0x0b, 0x21, 0x3f, 0xcc, 0x20, 0x30, 0x59, 0x09, 0xfe, 0x61, 0x03, 0x05, 0x90, 0x9f, 0xe6,
+       0x10, 0x30, 0x59, 0x09, 0xfe, 0x62, 0x00, 0x00, 0x42, 0x15, 0x00, 0x10, 0x15, 0x01, 0xfe, 0x20,
+       0x84, 0xd5, 0x01, 0x0a, 0x8f, 0xf1, 0x40, 0x33, 0x78, 0x17, 0xf9, 0xc2, 0x03, 0x83, 0x01, 0x78,
+       0xe1, 0x01, 0xc1, 0x00, 0xbc, 0x70, 0x80, 0xe0, 0x80, 0x5e, 0x38, 0x40, 0x70, 0x40, 0x2f, 0x1c,
+       0x20, 0x38, 0x20, 0x17, 0x8e, 0x10, 0x00, 0x00, 0x87, 0xd5, 0x08, 0x70, 0xef, 0x81, 0xa2, 0xd8,
+       0xff, 0xff, 0xff, 0xfb, 0xd1, 0x2d, 0x4e, 0xa6, 0xce, 0x20, 0xa4, 0xef, 0x05, 0x78, 0x35, 0x3a,
+       0x9b, 0x38, 0x82, 0x93, 0xbc, 0x15, 0xe0, 0xd4, 0xea, 0x66, 0x71, 0x05, 0x27, 0x78, 0x2b, 0xc1,
+       0x29, 0xd4, 0xcc, 0xe2, 0x0a, 0x4e, 0xf0, 0x57, 0x82, 0x53, 0xa9, 0x99, 0xc4, 0x14, 0x9d, 0xe0,
+       0xaf, 0x04, 0xa7, 0x53, 0x33, 0x88, 0x29, 0x3b, 0xc1, 0x5e, 0x09, 0x4e, 0xa6, 0x67, 0x10, 0x52,
+       0x77, 0x82, 0xbc, 0x00, 0x18, 0x00
+};
+
+static const uint8 cr_data[] =
+{
+                                           0x1b, 0xfc, 0x11, 0xc1, 0x0f, 0x4a, 0xc1, 0x4f, 0x4a, 0xc1,
+       0x4f, 0x4a, 0xa1, 0x4d, 0x95, 0x42, 0x9e, 0x95, 0x42, 0x9e, 0x95, 0x42, 0x9b, 0x2a, 0x85, 0x3d,
+       0x2a, 0x85, 0x3d, 0x2a, 0x85, 0x36, 0x55, 0x0a, 0x7a, 0x55, 0x0a, 0x7a, 0x55, 0x0a, 0x6c, 0xaa,
+       0x14, 0xf4, 0xaa, 0x14, 0xf4, 0xaa, 0x14, 0xd9, 0x54, 0x29, 0xe9, 0x54, 0x29, 0xe9, 0x54, 0x29,
+       0xb2, 0xa8, 0x53, 0xd2, 0xa8, 0x53, 0xd2, 0xa8, 0x53, 0x65, 0x50, 0xa7, 0xa5, 0x50, 0xa7, 0xa5,
+       0x50, 0xa6, 0xca, 0xa1, 0x4f, 0x4a, 0xa1, 0x4f, 0x4a, 0xa1, 0x4d, 0x95, 0x42, 0x9e, 0x95, 0x42,
+       0x9e, 0x95, 0x42, 0x9b, 0x2a, 0x80, 0x00, 0x41, 0xe3, 0x80, 0x3f, 0xe2, 0x09, 0x9c, 0x00, 0x22,
+       0x07, 0x03, 0xe1, 0x26, 0x70, 0x06, 0x07, 0x1f, 0x04, 0x67, 0x00, 0x61, 0xdf, 0x02, 0x67, 0x00,
+       0x0c, 0x3b, 0xfe, 0x01, 0x33, 0x80, 0x06, 0x1d, 0xff, 0x00, 0x99, 0xc0, 0x03, 0x0e, 0xff, 0x80,
+       0x4c, 0xe0, 0x01, 0x87, 0x7f, 0xc0, 0x26, 0x70, 0x00, 0xc3, 0xbf, 0xe0, 0x13, 0x38, 0x00, 0x61,
+       0xdf, 0xf0, 0x09, 0x9c, 0x00, 0x30, 0xef, 0xf8, 0x04, 0xce, 0x00, 0x18, 0x77, 0xfc, 0x02, 0x67,
+       0x00, 0x0c, 0x3b, 0xfe, 0x01, 0x33, 0x80, 0x06, 0x1d, 0xff, 0x00, 0x99, 0xc0, 0x03, 0x0e, 0xff,
+       0x80, 0x4c, 0xe0, 0x01, 0x87, 0x7f, 0xc0, 0x26, 0x70, 0x00, 0x00, 0x08, 0x3c, 0x20, 0x1f, 0xf1,
+       0x00, 0xf0, 0x05, 0x02, 0x93, 0x84, 0x3d, 0x20, 0xf0, 0x52, 0x81, 0xc7, 0xff, 0xff, 0xea, 0x54,
+       0x01, 0x80, 0x05, 0xf5, 0x4a, 0x80, 0x30, 0x00, 0xb6, 0xa5, 0x40, 0x18, 0x00, 0x5f, 0x54, 0xa8,
+       0x03, 0x00, 0x0b, 0xea, 0x95, 0x00, 0x60, 0x01, 0x6d, 0x4a, 0x80, 0x30, 0x00, 0x00, 0x22, 0x3f,
+       0xba, 0x08, 0x10, 0x2b, 0x1f, 0xf2, 0x20, 0x3e, 0x49, 0x9c, 0x1f, 0x6e, 0x0f, 0x5a, 0x0f, 0xfb,
+       0x18, 0x46, 0xae, 0x27, 0x9b, 0x83, 0xcb, 0x41, 0xf3, 0x18, 0x46, 0xae, 0x27, 0x9b, 0x83, 0xc5,
+       0xa0, 0xf9, 0x8c, 0x22, 0xd7, 0x13, 0x8d, 0xc1, 0xe2, 0xd0, 0x7c, 0xc6, 0x11, 0x6b, 0x89, 0xc6,
+       0xe0, 0xf1, 0x68, 0x3e, 0x63, 0x08, 0xb5, 0xc4, 0xe3, 0x70, 0x78, 0xb4, 0x1f, 0x31, 0x84, 0x5a,
+       0xe2, 0x71, 0xb8, 0x3c, 0x5a, 0x0f, 0x98, 0xc2, 0x2d, 0x71, 0x30, 0x83, 0xc0, 0x00
+};
+
+/* HL1, LH1, HH1, HL2, LH2, HH2, HL3, LH3, HH3, LL3 */
+static const unsigned int test_quantization_values[] =
+{
+       6, 6, 6, 6, 7, 7, 8, 8, 8, 9
+};
+
+static const uint8 rgb_scanline_data[] =
+{
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
+       0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
+       0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF
+};
+
+static uint8* rgb_data;
+
+int init_librfx_suite(void)
+{
+       return 0;
+}
+
+int clean_librfx_suite(void)
+{
+       return 0;
+}
+
+int add_librfx_suite(void)
+{
+       add_test_suite(librfx);
+
+       add_test_function(bitstream);
+       add_test_function(bitstream_enc);
+       add_test_function(rlgr);
+       add_test_function(differential);
+       add_test_function(quantization);
+       add_test_function(dwt);
+       add_test_function(decode);
+       add_test_function(encode);
+       add_test_function(message);
+
+       return 0;
+}
+
+void test_bitstream(void)
+{
+       uint16 b;
+       RFX_BITSTREAM* bs;
+
+       bs = xnew(RFX_BITSTREAM);
+       rfx_bitstream_attach(bs, (uint8*) y_data, sizeof(y_data));
+       while (!rfx_bitstream_eos(bs))
+       {
+               rfx_bitstream_get_bits(bs, 3, b);
+               (void) b;
+               //printf("%u ", b);
+       }
+       xfree(bs);
+
+       //printf("\n");
+}
+
+void test_bitstream_enc(void)
+{
+       uint8 buffer[10];
+       RFX_BITSTREAM* bs;
+       int i;
+
+       bs = xnew(RFX_BITSTREAM);
+       memset(buffer, 0, sizeof(buffer));
+       rfx_bitstream_attach(bs, buffer, sizeof(buffer));
+       for (i = 0; i < 16; i++)
+       {
+               rfx_bitstream_put_bits(bs, i, 5);
+       }
+       /*for (i = 0; i < sizeof(buffer); i++)
+       {
+               printf("%X ", buffer[i]);
+       }*/
+       xfree(bs);
+
+       //printf("\n");
+}
+
+static sint16 buffer[4096];
+
+void dump_buffer(sint16* buf, int n)
+{
+       int i;
+
+       for (i = 0; i < n; i++)
+       {
+               if (i % 16 == 0)
+                       printf("\n%04d ", i);
+               printf("% 4d ", buf[i]);
+       }
+       printf("\n");
+}
+
+void test_rlgr(void)
+{
+       int n;
+
+       n = rfx_rlgr_decode(RLGR3, y_data, sizeof(y_data), buffer, sizeof(buffer) / sizeof(unsigned int));
+
+       //printf("RLGR decode %d bytes to %d values.", sizeof(y_data), n);
+       //dump_buffer(buffer, n);
+}
+
+void test_differential(void)
+{
+       rfx_differential_decode(buffer + 4032, 64);
+       //dump_buffer(buffer + 4032, 64);
+}
+
+void test_quantization(void)
+{
+       rfx_quantization_decode(buffer, test_quantization_values);
+       //dump_buffer(buffer, 4096);
+}
+
+void test_dwt(void)
+{
+       RFX_CONTEXT* context;
+
+       context = rfx_context_new();
+       rfx_dwt_2d_decode(buffer, context->priv->dwt_buffer);
+       //dump_buffer(buffer, 4096);
+       rfx_context_free(context);
+}
+
+/* Dump a .ppm image. */
+static void dump_ppm_image(uint8* image_buf)
+{
+       static int frame_id = 0;
+       char buf[100];
+       FILE* fp;
+
+       snprintf(buf, sizeof(buf), "/tmp/FreeRDP_Frame_%d.ppm", frame_id);
+       fp = fopen(buf, "wb");
+       fwrite("P6\n", 1, 3, fp);
+       fwrite("# Created by FreeRDP\n", 1, 21, fp);
+       fwrite("64 64\n", 1, 6, fp);
+       fwrite("255\n", 1, 4, fp);
+       fwrite(image_buf, 1, 4096 * 3, fp);
+       fflush(fp);
+       fclose(fp);
+       frame_id++;
+}
+
+void test_decode(void)
+{
+       RFX_CONTEXT* context;
+       uint8 decode_buffer[4096 * 3];
+       STREAM* s;
+
+       s = stream_new(sizeof(y_data) + sizeof(cb_data) + sizeof(cr_data));
+       stream_write(s, y_data, sizeof(y_data));
+       stream_write(s, cb_data, sizeof(cb_data));
+       stream_write(s, cr_data, sizeof(cr_data));
+       stream_set_pos(s, 0);
+
+       context = rfx_context_new();
+       context->mode = RLGR3;
+       rfx_context_set_pixel_format(context, RFX_PIXEL_FORMAT_RGB);
+       rfx_decode_rgb(context, s,
+               sizeof(y_data), test_quantization_values,
+               sizeof(cb_data), test_quantization_values,
+               sizeof(cr_data), test_quantization_values,
+               decode_buffer);
+       rfx_context_free(context);
+       stream_free(s);
+
+       dump_ppm_image(decode_buffer);
+}
+
+void test_encode(void)
+{
+       RFX_CONTEXT* context;
+       STREAM* enc_stream;
+       int y_size, cb_size, cr_size;
+       int i;
+       uint8 decode_buffer[4096 * 3];
+
+       rgb_data = (uint8 *) malloc(64 * 64 * 3);
+       for (i = 0; i < 64; i++)
+               memcpy(rgb_data + i * 64 * 3, rgb_scanline_data, 64 * 3);
+       //freerdp_hexdump(rgb_data, 64 * 64 * 3);
+
+       enc_stream = stream_new(65536);
+       stream_clear(enc_stream);
+
+       context = rfx_context_new();
+       context->mode = RLGR3;
+       rfx_context_set_pixel_format(context, RFX_PIXEL_FORMAT_RGB);
+
+       rfx_encode_rgb(context, rgb_data, 64, 64, 64 * 3,
+               test_quantization_values, test_quantization_values, test_quantization_values,
+               enc_stream, &y_size, &cb_size, &cr_size);
+       //dump_buffer(context->priv->cb_g_buffer, 4096);
+
+       /*printf("*** Y ***\n");
+       freerdp_hexdump(stream_get_head(enc_stream), y_size);
+       printf("*** Cb ***\n");
+       freerdp_hexdump(stream_get_head(enc_stream) + y_size, cb_size);
+       printf("*** Cr ***\n");
+       freerdp_hexdump(stream_get_head(enc_stream) + y_size + cb_size, cr_size);*/
+
+       stream_set_pos(enc_stream, 0);
+       rfx_decode_rgb(context, enc_stream,
+               y_size, test_quantization_values,
+               cb_size, test_quantization_values,
+               cr_size, test_quantization_values,
+               decode_buffer);
+       dump_ppm_image(decode_buffer);
+
+       rfx_context_free(context);
+       stream_free(enc_stream);
+       free(rgb_data);
+}
+
+void test_message(void)
+{
+       RFX_CONTEXT* context;
+       STREAM* s;
+       int i, j;
+       RFX_RECT rect = {0, 0, 100, 80};
+       RFX_MESSAGE * message;
+
+       rgb_data = (uint8 *) malloc(100 * 80 * 3);
+       for (i = 0; i < 80; i++)
+               memcpy(rgb_data + i * 100 * 3, rgb_scanline_data, 100 * 3);
+
+       s = stream_new(65536);
+       stream_clear(s);
+
+       context = rfx_context_new();
+       context->mode = RLGR3;
+       context->width = 800;
+       context->height = 600;
+       rfx_context_set_pixel_format(context, RFX_PIXEL_FORMAT_RGB);
+
+       for (i = 0; i < 1000; i++)
+       {
+               s = stream_new(65536);
+               stream_clear(s);
+               rfx_compose_message(context, s,
+                       &rect, 1, rgb_data, 100, 80, 100 * 3);
+               stream_seal(s);
+               /*hexdump(buffer, size);*/
+               stream_set_pos(s, 0);
+               message = rfx_process_message(context, s->p, s->size);
+               if (i == 0)
+               {
+                       for (j = 0; j < message->num_tiles; j++)
+                       {
+                               dump_ppm_image(message->tiles[j]->data);
+                       }
+               }
+               rfx_message_free(context, message);
+               stream_free(s);
+       }
+
+       rfx_context_free(context);
+       free(rgb_data);
+}
diff --git a/cunit/test_librfx.h b/cunit/test_librfx.h
new file mode 100644 (file)
index 0000000..f007816
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RemoteFX Codec Library Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_librfx_suite(void);
+int clean_librfx_suite(void);
+int add_librfx_suite(void);
+
+void test_bitstream(void);
+void test_bitstream_enc(void);
+void test_rlgr(void);
+void test_differential(void);
+void test_quantization(void);
+void test_dwt(void);
+void test_decode(void);
+void test_encode(void);
+void test_message(void);
diff --git a/cunit/test_license.c b/cunit/test_license.c
new file mode 100644 (file)
index 0000000..49e7e04
--- /dev/null
@@ -0,0 +1,499 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Licensing Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "license.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_license.h"
+
+rdpRdp* rdp;
+rdpLicense* license;
+
+int init_license_suite(void)
+{
+       rdp = rdp_new(NULL);
+       license = rdp->license;
+       return 0;
+}
+
+int clean_license_suite(void)
+{
+       rdp_free(rdp);
+       return 0;
+}
+
+int add_license_suite(void)
+{
+       add_test_suite(license);
+
+       add_test_function(license);
+       //add_test_function(license_generate_keys);
+       //add_test_function(license_encrypt_premaster_secret);
+       add_test_function(license_decrypt_platform_challenge);
+
+       return 0;
+}
+
+/* Server License Request (2200 bytes) */
+
+uint8 server_license_request[2200] =
+       "\x01\x03\x98\x08\x84\xef\xae\x20\xb1\xd5\x9e\x36\x49\x1a\xe8\x2e"
+       "\x0a\x99\x89\xac\x49\xa6\x47\x4f\x33\x9b\x5a\xb9\x95\x03\xa6\xc6"
+       "\xc2\x3c\x3f\x61\x00\x00\x06\x00\x2c\x00\x00\x00\x4d\x00\x69\x00"
+       "\x63\x00\x72\x00\x6f\x00\x73\x00\x6f\x00\x66\x00\x74\x00\x20\x00"
+       "\x43\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61\x00\x74\x00"
+       "\x69\x00\x6f\x00\x6e\x00\x00\x00\x08\x00\x00\x00\x41\x00\x30\x00"
+       "\x32\x00\x00\x00\x0d\x00\x04\x00\x01\x00\x00\x00\x03\x00\x12\x08"
+       "\x02\x00\x00\x80\x02\x00\x00\x00\xf5\x02\x00\x00\x30\x82\x02\xf1"
+       "\x30\x82\x01\xdd\xa0\x03\x02\x01\x02\x02\x08\x01\x9e\x24\xa2\xf2"
+       "\xae\x90\x80\x30\x09\x06\x05\x2b\x0e\x03\x02\x1d\x05\x00\x30\x32"
+       "\x31\x30\x30\x13\x06\x03\x55\x04\x03\x1e\x0c\x00\x52\x00\x4f\x00"
+       "\x44\x00\x45\x00\x4e\x00\x54\x30\x19\x06\x03\x55\x04\x07\x1e\x12"
+       "\x00\x57\x00\x4f\x00\x52\x00\x4b\x00\x47\x00\x52\x00\x4f\x00\x55"
+       "\x00\x50\x30\x1e\x17\x0d\x37\x30\x30\x35\x32\x37\x30\x31\x31\x31"
+       "\x30\x33\x5a\x17\x0d\x34\x39\x30\x35\x32\x37\x30\x31\x31\x31\x30"
+       "\x33\x5a\x30\x32\x31\x30\x30\x13\x06\x03\x55\x04\x03\x1e\x0c\x00"
+       "\x52\x00\x4f\x00\x44\x00\x45\x00\x4e\x00\x54\x30\x19\x06\x03\x55"
+       "\x04\x07\x1e\x12\x00\x57\x00\x4f\x00\x52\x00\x4b\x00\x47\x00\x52"
+       "\x00\x4f\x00\x55\x00\x50\x30\x82\x01\x22\x30\x0d\x06\x09\x2a\x86"
+       "\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x00\x30\x82"
+       "\x01\x0a\x02\x82\x01\x01\x00\x88\xad\x7c\x8f\x8b\x82\x76\x5a\xbd"
+       "\x8f\x6f\x62\x18\xe1\xd9\xaa\x41\xfd\xed\x68\x01\xc6\x34\x35\xb0"
+       "\x29\x04\xca\x4a\x4a\x1c\x7e\x80\x14\xf7\x8e\x77\xb8\x25\xff\x16"
+       "\x47\x6f\xbd\xe2\x34\x3d\x2e\x02\xb9\x53\xe4\x33\x75\xad\x73\x28"
+       "\x80\xa0\x4d\xfc\x6c\xc0\x22\x53\x1b\x2c\xf8\xf5\x01\x60\x19\x7e"
+       "\x79\x19\x39\x8d\xb5\xce\x39\x58\xdd\x55\x24\x3b\x55\x7b\x43\xc1"
+       "\x7f\x14\x2f\xb0\x64\x3a\x54\x95\x2b\x88\x49\x0c\x61\x2d\xac\xf8"
+       "\x45\xf5\xda\x88\x18\x5f\xae\x42\xf8\x75\xc7\x26\x6d\xb5\xbb\x39"
+       "\x6f\xcc\x55\x1b\x32\x11\x38\x8d\xe4\xe9\x44\x84\x11\x36\xa2\x61"
+       "\x76\xaa\x4c\xb4\xe3\x55\x0f\xe4\x77\x8e\xde\xe3\xa9\xea\xb7\x41"
+       "\x94\x00\x58\xaa\xc9\x34\xa2\x98\xc6\x01\x1a\x76\x14\x01\xa8\xdc"
+       "\x30\x7c\x77\x5a\x20\x71\x5a\xa2\x3f\xaf\x13\x7e\xe8\xfd\x84\xa2"
+       "\x5b\xcf\x25\xe9\xc7\x8f\xa8\xf2\x8b\x84\xc7\x04\x5e\x53\x73\x4e"
+       "\x0e\x89\xa3\x3c\xe7\x68\x5c\x24\xb7\x80\x53\x3c\x54\xc8\xc1\x53"
+       "\xaa\x71\x71\x3d\x36\x15\xd6\x6a\x9d\x7d\xde\xae\xf9\xe6\xaf\x57"
+       "\xae\xb9\x01\x96\x5d\xe0\x4d\xcd\xed\xc8\xd7\xf3\x01\x03\x38\x10"
+       "\xbe\x7c\x42\x67\x01\xa7\x23\x02\x03\x01\x00\x01\xa3\x13\x30\x11"
+       "\x30\x0f\x06\x03\x55\x1d\x13\x04\x08\x30\x06\x01\x01\xff\x02\x01"
+       "\x00\x30\x09\x06\x05\x2b\x0e\x03\x02\x1d\x05\x00\x03\x82\x01\x01"
+       "\x00\x81\xdd\xd2\xd3\x33\xd4\xa3\xb6\x8e\x6e\x7d\x9f\xfd\x73\x9f"
+       "\x31\x0b\xdd\x42\x82\x3f\x7e\x21\xdf\x28\xcc\x59\xca\x6a\xc0\xa9"
+       "\x3d\x30\x7d\xe1\x91\xdb\x77\x6b\x8b\x10\xe6\xfd\xbc\x3c\xa3\x58"
+       "\x48\xc2\x36\xdd\xa0\x0b\xf5\x8e\x13\xda\x7b\x04\x08\x44\xb4\xf2"
+       "\xa8\x0d\x1e\x0b\x1d\x1a\x3f\xf9\x9b\x4b\x5a\x54\xc5\xb3\xb4\x03"
+       "\x93\x75\xb3\x72\x5c\x3d\xcf\x63\x0f\x15\xe1\x64\x58\xde\x52\x8d"
+       "\x97\x79\x0e\xa4\x34\xd5\x66\x05\x58\xb8\x6e\x79\xb2\x09\x86\xd5"
+       "\xf0\xed\xc4\x6b\x4c\xab\x02\xb8\x16\x5f\x3b\xed\x88\x5f\xd1\xde"
+       "\x44\xe3\x73\x47\x21\xf7\x03\xce\xe1\x6d\x10\x0f\x95\xcf\x7c\xa2"
+       "\x7a\xa6\xbf\x20\xdb\xe1\x93\x04\xc8\x5e\x6a\xbe\xc8\x01\x5d\x27"
+       "\xb2\x03\x0f\x66\x75\xe7\xcb\xea\x8d\x4e\x98\x9d\x22\xed\x28\x40"
+       "\xd2\x7d\xa4\x4b\xef\xcc\xbf\x01\x2a\x6d\x3a\x3e\xbe\x47\x38\xf8"
+       "\xea\xa4\xc6\x30\x1d\x5e\x25\xcf\xfb\xe8\x3d\x42\xdd\x29\xe8\x99"
+       "\x89\x9e\xbf\x39\xee\x77\x09\xd9\x3e\x8b\x52\x36\xb6\xbb\x8b\xbd"
+       "\x0d\xb2\x52\xaa\x2c\xcf\x38\x4e\x4d\xcf\x1d\x6d\x5d\x25\x17\xac"
+       "\x2c\xf6\xf0\x65\x5a\xc9\xfe\x31\x53\xb4\xf0\x0c\x94\x4e\x0d\x54"
+       "\x8e\xfd\x04\x00\x00\x30\x82\x04\xf9\x30\x82\x03\xe5\xa0\x03\x02"
+       "\x01\x02\x02\x05\x01\x00\x00\x00\x02\x30\x09\x06\x05\x2b\x0e\x03"
+       "\x02\x1d\x05\x00\x30\x32\x31\x30\x30\x13\x06\x03\x55\x04\x03\x1e"
+       "\x0c\x00\x52\x00\x4f\x00\x44\x00\x45\x00\x4e\x00\x54\x30\x19\x06"
+       "\x03\x55\x04\x07\x1e\x12\x00\x57\x00\x4f\x00\x52\x00\x4b\x00\x47"
+       "\x00\x52\x00\x4f\x00\x55\x00\x50\x30\x1e\x17\x0d\x30\x37\x30\x35"
+       "\x32\x36\x31\x32\x34\x35\x35\x33\x5a\x17\x0d\x33\x38\x30\x31\x31"
+       "\x39\x30\x33\x31\x34\x30\x37\x5a\x30\x81\x92\x31\x81\x8f\x30\x23"
+       "\x06\x03\x55\x04\x03\x1e\x1c\x00\x6e\x00\x63\x00\x61\x00\x6c\x00"
+       "\x72\x00\x70\x00\x63\x00\x3a\x00\x52\x00\x4f\x00\x44\x00\x45\x00"
+       "\x4e\x00\x54\x30\x23\x06\x03\x55\x04\x07\x1e\x1c\x00\x6e\x00\x63"
+       "\x00\x61\x00\x6c\x00\x72\x00\x70\x00\x63\x00\x3a\x00\x52\x00\x4f"
+       "\x00\x44\x00\x45\x00\x4e\x00\x54\x30\x43\x06\x03\x55\x04\x05\x1e"
+       "\x3c\x00\x31\x00\x42\x00\x63\x00\x4b\x00\x65\x00\x62\x00\x68\x00"
+       "\x70\x00\x58\x00\x5a\x00\x74\x00\x4c\x00\x71\x00\x4f\x00\x37\x00"
+       "\x53\x00\x51\x00\x6e\x00\x42\x00\x70\x00\x52\x00\x66\x00\x75\x00"
+       "\x64\x00\x64\x00\x64\x00\x59\x00\x3d\x00\x0d\x00\x0a\x30\x82\x01"
+       "\x1e\x30\x09\x06\x05\x2b\x0e\x03\x02\x0f\x05\x00\x03\x82\x01\x0f"
+       "\x00\x30\x82\x01\x0a\x02\x82\x01\x01\x00\xc8\x90\x6b\xf0\xc6\x58"
+       "\x81\xa6\x89\x1c\x0e\xf2\xf6\xd9\x82\x12\x71\xa5\x6e\x51\xdb\xe0"
+       "\x32\x66\xaa\x91\x77\x0e\x88\xab\x44\xb7\xd3\x97\xda\x78\x8f\x0e"
+       "\x44\x26\x46\x7f\x16\xd4\xc6\x63\xeb\xca\x55\xe5\x4e\x8b\x2d\xa6"
+       "\x6d\x83\x95\xa7\xa8\x6a\xfa\xd0\xbe\x26\x80\xae\xab\x0a\x64\x90"
+       "\x32\x8c\xdf\x5c\xf8\xf9\xd0\x7e\xd1\x6b\x3a\x29\x7e\x7d\xbd\x02"
+       "\xa3\x86\x6c\xfd\xa5\x35\x71\xda\x21\xb4\xee\xa4\x97\xf3\xa8\xb2"
+       "\x12\xdb\xa4\x27\x57\x36\xc9\x08\x22\x5c\x54\xf7\x99\x7b\xa3\x2f"
+       "\xb8\x5c\xd5\x16\xb8\x19\x27\x6b\x71\x97\x14\x5b\xe8\x1f\x23\xe8"
+       "\x5c\xb8\x1b\x73\x4b\x6e\x7a\x03\x13\xff\x97\xe9\x62\xb9\x4a\xa0"
+       "\x51\x23\xc3\x6c\x32\x3e\x02\xf2\x63\x97\x23\x1c\xc5\x78\xd8\xfc"
+       "\xb7\x07\x4b\xb0\x56\x0f\x74\xdf\xc5\x56\x28\xe4\x96\xfd\x20\x8e"
+       "\x65\x5a\xe6\x45\xed\xc1\x05\x3e\xab\x58\x55\x40\xaf\xe2\x47\xa0"
+       "\x4c\x49\xa3\x8d\x39\xe3\x66\x5f\x93\x33\x6d\xf8\x5f\xc5\x54\xe5"
+       "\xfb\x57\x3a\xde\x45\x12\xb5\xc7\x05\x4b\x88\x1f\xb4\x35\x0f\x7c"
+       "\xc0\x75\x17\xc6\x67\xdd\x48\x80\xcb\x0a\xbe\x9d\xf6\x93\x60\x65"
+       "\x34\xeb\x97\xaf\x65\x6d\xdf\xbf\x6f\x5b\x02\x03\x01\x00\x01\xa3"
+       "\x82\x01\xbf\x30\x82\x01\xbb\x30\x14\x06\x09\x2b\x06\x01\x04\x01"
+       "\x82\x37\x12\x04\x01\x01\xff\x04\x04\x01\x00\x05\x00\x30\x3c\x06"
+       "\x09\x2b\x06\x01\x04\x01\x82\x37\x12\x02\x01\x01\xff\x04\x2c\x4d"
+       "\x00\x69\x00\x63\x00\x72\x00\x6f\x00\x73\x00\x6f\x00\x66\x00\x74"
+       "\x00\x20\x00\x43\x00\x6f\x00\x72\x00\x70\x00\x6f\x00\x72\x00\x61"
+       "\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x00\x00\x30\x81\xcd\x06\x09"
+       "\x2b\x06\x01\x04\x01\x82\x37\x12\x05\x01\x01\xff\x04\x81\xbc\x00"
+       "\x30\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x09\x04\x00\x00\x1c"
+       "\x00\x4a\x00\x66\x00\x4a\x00\xb0\x00\x01\x00\x33\x00\x64\x00\x32"
+       "\x00\x36\x00\x37\x00\x39\x00\x35\x00\x34\x00\x2d\x00\x65\x00\x65"
+       "\x00\x62\x00\x37\x00\x2d\x00\x31\x00\x31\x00\x64\x00\x31\x00\x2d"
+       "\x00\x62\x00\x39\x00\x34\x00\x65\x00\x2d\x00\x30\x00\x30\x00\x63"
+       "\x00\x30\x00\x34\x00\x66\x00\x61\x00\x33\x00\x30\x00\x38\x00\x30"
+       "\x00\x64\x00\x00\x00\x33\x00\x64\x00\x32\x00\x36\x00\x37\x00\x39"
+       "\x00\x35\x00\x34\x00\x2d\x00\x65\x00\x65\x00\x62\x00\x37\x00\x2d"
+       "\x00\x31\x00\x31\x00\x64\x00\x31\x00\x2d\x00\x62\x00\x39\x00\x34"
+       "\x00\x65\x00\x2d\x00\x30\x00\x30\x00\x63\x00\x30\x00\x34\x00\x66"
+       "\x00\x61\x00\x33\x00\x30\x00\x38\x00\x30\x00\x64\x00\x00\x00\x00"
+       "\x00\x00\x10\x00\x80\x64\x00\x00\x00\x00\x00\x30\x6e\x06\x09\x2b"
+       "\x06\x01\x04\x01\x82\x37\x12\x06\x01\x01\xff\x04\x5e\x00\x30\x00"
+       "\x00\x00\x00\x0e\x00\x3e\x00\x52\x00\x4f\x00\x44\x00\x45\x00\x4e"
+       "\x00\x54\x00\x00\x00\x37\x00\x38\x00\x34\x00\x34\x00\x30\x00\x2d"
+       "\x00\x30\x00\x30\x00\x36\x00\x2d\x00\x35\x00\x38\x00\x36\x00\x37"
+       "\x00\x30\x00\x34\x00\x35\x00\x2d\x00\x37\x00\x30\x00\x33\x00\x34"
+       "\x00\x37\x00\x00\x00\x57\x00\x4f\x00\x52\x00\x4b\x00\x47\x00\x52"
+       "\x00\x4f\x00\x55\x00\x50\x00\x00\x00\x00\x00\x30\x25\x06\x03\x55"
+       "\x1d\x23\x01\x01\xff\x04\x1b\x30\x19\xa1\x10\xa4\x0e\x52\x00\x4f"
+       "\x00\x44\x00\x45\x00\x4e\x00\x54\x00\x00\x00\x82\x05\x01\x00\x00"
+       "\x00\x02\x30\x09\x06\x05\x2b\x0e\x03\x02\x1d\x05\x00\x03\x82\x01"
+       "\x01\x00\x2e\xeb\xc7\x0d\xb8\x1d\x47\x11\x9d\x09\x88\x9b\x51\xdc"
+       "\x45\xdd\x56\x51\xe2\xd1\x23\x11\x39\x9b\x2d\xda\xc7\xfe\x7a\xd7"
+       "\x84\xe3\x3d\x54\x77\x97\x4d\x19\x92\x30\x64\xa0\x47\xc6\x2f\x6d"
+       "\x93\xd2\x64\x7c\x76\xc8\x26\x45\xad\x5a\x44\x54\xea\xf6\x4b\x28"
+       "\x77\x1f\x77\xea\xec\x74\x02\x38\x68\x9e\x79\x14\x72\x83\x34\x74"
+       "\x62\xd2\xc1\x0c\xa4\x0b\xf2\xa9\xb0\x38\xbb\x7c\xd0\xae\xbe\xbf"
+       "\x74\x47\x16\xa0\xa2\xd3\xfc\x1d\xb9\xba\x26\x10\x06\xef\xba\x1d"
+       "\x43\x01\x4e\x4e\x6f\x56\xca\xe0\xee\xd0\xf9\x4e\xa6\x62\x63\xff"
+       "\xda\x0b\xc9\x15\x61\x6c\xed\x6b\x0b\xc4\x58\x53\x86\x0f\x8c\x0c"
+       "\x1a\x2e\xdf\xc1\xf2\x43\x48\xd4\xaf\x0a\x78\x36\xb2\x51\x32\x28"
+       "\x6c\xc2\x75\x79\x3f\x6e\x99\x66\x88\x3e\x34\xd3\x7f\x6d\x9d\x07"
+       "\xe4\x6b\xeb\x84\xe2\x0a\xbb\xca\x7d\x3a\x40\x71\xb0\xbe\x47\x9f"
+       "\x12\x58\x31\x61\x2b\x9b\x4a\x9a\x49\x8f\xe5\xb4\x0c\xf5\x04\x4d"
+       "\x3c\xce\xbc\xd2\x79\x15\xd9\x28\xf4\x23\x56\x77\x9f\x38\x64\x3e"
+       "\x03\x88\x92\x04\x26\x76\xb9\xb5\xdf\x19\xd0\x78\x4b\x7a\x60\x40"
+       "\x23\x91\xf1\x15\x22\x2b\xb4\xe7\x02\x54\xa9\x16\x21\x5b\x60\x96"
+       "\xa9\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x01\x00\x00\x00\x0e\x00\x0e\x00\x6d\x69\x63\x72\x6f\x73"
+       "\x6f\x66\x74\x2e\x63\x6f\x6d\x00";
+
+/* Client New License Request (341 bytes) */
+
+uint8 client_new_license_request[341] =
+       "\x13\x83\x55\x01\x01\x00\x00\x00\x00\x00\x01\x04\xdc\x73\xa0\xc8"
+       "\x69\x25\x6b\x18\xaf\x0b\x94\x7a\xa9\xa5\x20\xaf\x8b\xbc\x0d\xcc"
+       "\xa3\x95\xb7\xb9\xeb\x81\x5d\xbe\x0a\x10\x9c\xd8\x02\x00\x08\x01"
+       "\xda\x9c\x5d\xa6\x68\x9d\xa3\x90\x67\x24\xf3\x3a\xea\xa1\xe2\x68"
+       "\xad\x12\xf5\xf6\x0b\x7a\xac\x92\xb1\x69\x6f\x42\x55\x8a\xa0\xe2"
+       "\x9b\x2c\xd0\xc7\xee\x33\x6c\x47\x79\xc3\x1e\xbf\x03\x8b\x95\x70"
+       "\x07\xa2\xbe\xee\x54\x02\x68\xf8\x90\xd7\xfe\x2c\x08\xe1\x6b\x2d"
+       "\xff\x94\x76\x72\x5f\x7a\x76\x75\x32\x55\xcc\x58\x61\x63\xa5\x64"
+       "\xf1\x6e\xc3\x07\x81\x82\x6f\x88\x73\x62\xfc\x28\x65\x91\xc2\xc8"
+       "\x9f\x05\xb0\xd3\x93\x12\xbf\x6a\x50\x18\x99\x2d\x4d\xc4\x7f\x74"
+       "\xd3\x30\x9f\x16\x78\xa5\xdf\xaa\x83\x65\x4f\x77\x30\x42\xe0\xd7"
+       "\x69\xc8\x4d\xa5\x73\x11\x59\x35\xb9\xa7\xe2\xb0\xf6\xe3\xb9\x39"
+       "\xc3\xd4\xe4\x6b\xca\x40\x9a\xac\x66\xe6\x1a\xa4\x1b\x39\x7e\x09"
+       "\xe3\x72\x99\xdd\x90\x62\x55\x97\xa9\x04\xc7\x51\xaa\xa2\x01\xcb"
+       "\x5a\x63\x4d\x1a\xe5\x99\xc3\xb1\x2a\x73\xe8\x9a\x00\x46\x92\x59"
+       "\x39\xa3\x80\xa1\xac\x90\x52\xea\x63\x81\x49\x7d\xf3\x2d\x5c\xc3"
+       "\x19\x9f\xed\xfe\x81\x1d\x8c\x04\x1c\xd9\x23\xd2\x6d\x80\x84\xf3"
+       "\x00\xf2\xb1\x69\x2f\xcd\xb3\x9f\x69\xee\x60\x3e\x4b\xb5\xbe\x5a"
+       "\x09\x83\x0b\xbc\x3d\x3e\x05\x47\x65\x96\x31\x8c\x6b\xc5\xe6\xa0"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x0e\x00\x41\x64\x6d\x69"
+       "\x6e\x69\x73\x74\x72\x61\x74\x6f\x72\x00\x10\x00\x07\x00\x52\x4f"
+       "\x44\x45\x4e\x54\x00";
+
+/* Server Platform Challenge (38 bytes) */
+
+uint8 server_platform_challenge[38] =
+       "\x02\x03\x26\x00\xff\xff\xff\xff\x50\xf7\x0a\x00\x46\x37\x85\x54"
+       "\x8e\xc5\x91\x34\x97\x5d\x78\x94\xad\x3b\x81\xda\x88\x18\x56\x0f"
+       "\x3a\xd1\xf1\x03\xef\x35";
+
+/* Client Platform Challenge Response (66 bytes) */
+
+uint8 client_platform_challenge_response[66] =
+       "\x15\x83\x42\x00\x01\x00\x12\x00\xfa\xb4\xe8\x24\xcf\x56\xb2\x4e"
+       "\x80\x02\xbd\xb6\x61\xfc\xdf\xe9\x6c\x44\x01\x00\x14\x00\xf8\xb5"
+       "\xe8\x25\x3d\x0f\x3f\x70\x1d\xda\x60\x19\x16\xfe\x73\x1a\x45\x7e"
+       "\x02\x71\x38\x23\x62\x5d\x10\x8b\x93\xc3\xf1\xe4\x67\x1f\x4a\xb6"
+       "\x00\x0a";
+
+uint8 license_server_modulus[256] =
+       "\x88\xad\x7c\x8f\x8b\x82\x76\x5a\xbd\x8f\x6f\x62\x18\xe1\xd9\xaa"
+       "\x41\xfd\xed\x68\x01\xc6\x34\x35\xb0\x29\x04\xca\x4a\x4a\x1c\x7e"
+       "\x80\x14\xf7\x8e\x77\xb8\x25\xff\x16\x47\x6f\xbd\xe2\x34\x3d\x2e"
+       "\x02\xb9\x53\xe4\x33\x75\xad\x73\x28\x80\xa0\x4d\xfc\x6c\xc0\x22"
+       "\x53\x1b\x2c\xf8\xf5\x01\x60\x19\x7e\x79\x19\x39\x8d\xb5\xce\x39"
+       "\x58\xdd\x55\x24\x3b\x55\x7b\x43\xc1\x7f\x14\x2f\xb0\x64\x3a\x54"
+       "\x95\x2b\x88\x49\x0c\x61\x2d\xac\xf8\x45\xf5\xda\x88\x18\x5f\xae"
+       "\x42\xf8\x75\xc7\x26\x6d\xb5\xbb\x39\x6f\xcc\x55\x1b\x32\x11\x38"
+       "\x8d\xe4\xe9\x44\x84\x11\x36\xa2\x61\x76\xaa\x4c\xb4\xe3\x55\x0f"
+       "\xe4\x77\x8e\xde\xe3\xa9\xea\xb7\x41\x94\x00\x58\xaa\xc9\x34\xa2"
+       "\x98\xc6\x01\x1a\x76\x14\x01\xa8\xdc\x30\x7c\x77\x5a\x20\x71\x5a"
+       "\xa2\x3f\xaf\x13\x7e\xe8\xfd\x84\xa2\x5b\xcf\x25\xe9\xc7\x8f\xa8"
+       "\xf2\x8b\x84\xc7\x04\x5e\x53\x73\x4e\x0e\x89\xa3\x3c\xe7\x68\x5c"
+       "\x24\xb7\x80\x53\x3c\x54\xc8\xc1\x53\xaa\x71\x71\x3d\x36\x15\xd6"
+       "\x6a\x9d\x7d\xde\xae\xf9\xe6\xaf\x57\xae\xb9\x01\x96\x5d\xe0\x4d"
+       "\xcd\xed\xc8\xd7\xf3\x01\x03\x38\x10\xbe\x7c\x42\x67\x01\xa7\x23";
+
+uint8 license_server_exponent[4] = "\x00\x01\x00\x01";
+
+uint8 terminal_server_modulus[256] =
+       "\xc8\x90\x6b\xf0\xc6\x58\x81\xa6\x89\x1c\x0e\xf2\xf6\xd9\x82\x12"
+       "\x71\xa5\x6e\x51\xdb\xe0\x32\x66\xaa\x91\x77\x0e\x88\xab\x44\xb7"
+       "\xd3\x97\xda\x78\x8f\x0e\x44\x26\x46\x7f\x16\xd4\xc6\x63\xeb\xca"
+       "\x55\xe5\x4e\x8b\x2d\xa6\x6d\x83\x95\xa7\xa8\x6a\xfa\xd0\xbe\x26"
+       "\x80\xae\xab\x0a\x64\x90\x32\x8c\xdf\x5c\xf8\xf9\xd0\x7e\xd1\x6b"
+       "\x3a\x29\x7e\x7d\xbd\x02\xa3\x86\x6c\xfd\xa5\x35\x71\xda\x21\xb4"
+       "\xee\xa4\x97\xf3\xa8\xb2\x12\xdb\xa4\x27\x57\x36\xc9\x08\x22\x5c"
+       "\x54\xf7\x99\x7b\xa3\x2f\xb8\x5c\xd5\x16\xb8\x19\x27\x6b\x71\x97"
+       "\x14\x5b\xe8\x1f\x23\xe8\x5c\xb8\x1b\x73\x4b\x6e\x7a\x03\x13\xff"
+       "\x97\xe9\x62\xb9\x4a\xa0\x51\x23\xc3\x6c\x32\x3e\x02\xf2\x63\x97"
+       "\x23\x1c\xc5\x78\xd8\xfc\xb7\x07\x4b\xb0\x56\x0f\x74\xdf\xc5\x56"
+       "\x28\xe4\x96\xfd\x20\x8e\x65\x5a\xe6\x45\xed\xc1\x05\x3e\xab\x58"
+       "\x55\x40\xaf\xe2\x47\xa0\x4c\x49\xa3\x8d\x39\xe3\x66\x5f\x93\x33"
+       "\x6d\xf8\x5f\xc5\x54\xe5\xfb\x57\x3a\xde\x45\x12\xb5\xc7\x05\x4b"
+       "\x88\x1f\xb4\x35\x0f\x7c\xc0\x75\x17\xc6\x67\xdd\x48\x80\xcb\x0a"
+       "\xbe\x9d\xf6\x93\x60\x65\x34\xeb\x97\xaf\x65\x6d\xdf\xbf\x6f\x5b";
+
+uint8 terminal_server_exponent[4] = "\x00\x01\x00\x01";
+
+uint8 client_random[32] =
+       "\xdc\x73\xa0\xc8\x69\x25\x6b\x18\xaf\x0b\x94\x7a\xa9\xa5\x20\xaf"
+       "\x8b\xbc\x0d\xcc\xa3\x95\xb7\xb9\xeb\x81\x5d\xbe\x0a\x10\x9c\xd8";
+
+uint8 server_random[32] =
+       "\x84\xef\xae\x20\xb1\xd5\x9e\x36\x49\x1a\xe8\x2e\x0a\x99\x89\xac"
+       "\x49\xa6\x47\x4f\x33\x9b\x5a\xb9\x95\x03\xa6\xc6\xc2\x3c\x3f\x61";
+
+uint8 premaster_secret[48] =
+       "\xcf\x7a\xdb\xcb\xfb\x0e\x15\x23\x87\x1c\x84\x81\xba\x9d\x4e\x15"
+       "\xbb\xd2\x56\xbd\xd8\xf7\xf3\x16\xcc\x35\x3b\xe1\x93\x42\x78\xdd"
+       "\x92\x9a\xe4\x7a\xe2\x99\xd4\x73\xb1\xaa\x6f\x55\x94\x3b\xc9\xbc";
+
+uint8 encrypted_premaster_secret[264] =
+       "\xda\x9c\x5d\xa6\x68\x9d\xa3\x90\x67\x24\xf3\x3a\xea\xa1\xe2\x68"
+       "\xad\x12\xf5\xf6\x0b\x7a\xac\x92\xb1\x69\x6f\x42\x55\x8a\xa0\xe2"
+       "\x9b\x2c\xd0\xc7\xee\x33\x6c\x47\x79\xc3\x1e\xbf\x03\x8b\x95\x70"
+       "\x07\xa2\xbe\xee\x54\x02\x68\xf8\x90\xd7\xfe\x2c\x08\xe1\x6b\x2d"
+       "\xff\x94\x76\x72\x5f\x7a\x76\x75\x32\x55\xcc\x58\x61\x63\xa5\x64"
+       "\xf1\x6e\xc3\x07\x81\x82\x6f\x88\x73\x62\xfc\x28\x65\x91\xc2\xc8"
+       "\x9f\x05\xb0\xd3\x93\x12\xbf\x6a\x50\x18\x99\x2d\x4d\xc4\x7f\x74"
+       "\xd3\x30\x9f\x16\x78\xa5\xdf\xaa\x83\x65\x4f\x77\x30\x42\xe0\xd7"
+       "\x69\xc8\x4d\xa5\x73\x11\x59\x35\xb9\xa7\xe2\xb0\xf6\xe3\xb9\x39"
+       "\xc3\xd4\xe4\x6b\xca\x40\x9a\xac\x66\xe6\x1a\xa4\x1b\x39\x7e\x09"
+       "\xe3\x72\x99\xdd\x90\x62\x55\x97\xa9\x04\xc7\x51\xaa\xa2\x01\xcb"
+       "\x5a\x63\x4d\x1a\xe5\x99\xc3\xb1\x2a\x73\xe8\x9a\x00\x46\x92\x59"
+       "\x39\xa3\x80\xa1\xac\x90\x52\xea\x63\x81\x49\x7d\xf3\x2d\x5c\xc3"
+       "\x19\x9f\xed\xfe\x81\x1d\x8c\x04\x1c\xd9\x23\xd2\x6d\x80\x84\xf3"
+       "\x00\xf2\xb1\x69\x2f\xcd\xb3\x9f\x69\xee\x60\x3e\x4b\xb5\xbe\x5a"
+       "\x09\x83\x0b\xbc\x3d\x3e\x05\x47\x65\x96\x31\x8c\x6b\xc5\xe6\xa0"
+       "\x00\x00\x00\x00\x00\x00\x00\x00";
+
+uint8 platform_challenge[10] = "\x54\x00\x45\x00\x53\x00\x54\x00\x00\x00";
+
+void test_license(void)
+{
+       STREAM _s, *s;
+
+       s = &_s;
+       memcpy(license->client_random, client_random, sizeof(client_random));
+       memcpy(license->premaster_secret, premaster_secret, sizeof(premaster_secret));
+
+       s->data = server_license_request;
+       s->p = s->data + LICENSE_PREAMBLE_LENGTH;
+       license_read_license_request_packet(license, s);
+
+#if 0
+       printf("\n");
+
+       printf("client random:\n");
+       freerdp_hexdump(license->client_random, 32);
+       printf("\n");
+
+       printf("server random:\n");
+       freerdp_hexdump(license->server_random, 32);
+       printf("\n");
+
+       printf("premaster secret:\n");
+       freerdp_hexdump(license->premaster_secret, 48);
+       printf("\n");
+
+       printf("master secret:\n");
+       freerdp_hexdump(license->master_secret, 48);
+       printf("\n");
+
+       printf("session key blob:\n");
+       freerdp_hexdump(license->session_key_blob, 48);
+       printf("\n");
+
+       printf("licensing encryption key:\n");
+       freerdp_hexdump(license->licensing_encryption_key, 16);
+       printf("\n");
+
+       printf("mac salt key:\n");
+       freerdp_hexdump(license->mac_salt_key, 16);
+       printf("\n");
+
+       printf("modulus:\n");
+       freerdp_hexdump(license->certificate->cert_info.modulus.data,
+                       license->certificate->cert_info.modulus.length);
+       printf("\n");
+
+       printf("exponent:\n");
+       freerdp_hexdump(license->certificate->cert_info.exponent, 4);
+       printf("\n");
+
+       printf("encrypted premaster secret:\n");
+       freerdp_hexdump(license->encrypted_premaster_secret->data,
+                       license->encrypted_premaster_secret->length);
+       printf("\n");
+#endif
+
+       s->data = server_platform_challenge;
+       s->p = s->data + LICENSE_PREAMBLE_LENGTH;
+       license_read_platform_challenge_packet(license, s);
+}
+
+uint8 test_client_random[32] =
+       "\xdc\x73\xa0\xc8\x69\x25\x6b\x18\xaf\x0b\x94\x7a\xa9\xa5\x20\xaf"
+       "\x8b\xbc\x0d\xcc\xa3\x95\xb7\xb9\xeb\x81\x5d\xbe\x0a\x10\x9c\xd8";
+
+uint8 test_server_random[32] =
+       "\x16\x7e\xf8\x71\x48\x16\x1a\x4f\xa5\x2c\xcd\x73\x63\x60\xa6\xc3"
+       "\xb9\x19\x1b\x4b\x6b\xb2\x0a\xb8\xec\xf1\x8d\x95\x4e\xa8\x21\xc5";
+
+uint8 test_premaster_secret[48] =
+       "\xcf\x7a\xdb\xcb\xfb\x0e\x15\x23\x87\x1c\x84\x81\xba\x9d\x4e\x15"
+       "\xbb\xd2\x56\xbd\xd8\xf7\xf3\x16\xcc\x35\x3b\xe1\x93\x42\x78\xdd"
+       "\x92\x9a\xe4\x7a\xe2\x99\xd4\x73\xb1\xaa\x6f\x55\x94\x3b\xc9\xbc";
+
+uint8 test_modulus[64] =
+       "\x23\xc9\xec\x0e\x9f\x1e\x0e\x1a\x78\xaf\xa5\x14\xd4\xf5\x45\xe4"
+       "\x04\x6e\xf4\x01\xe9\xdf\x45\xd1\xc2\xae\xf4\x7f\xd3\xb9\xcb\xf3"
+       "\x1a\x23\xa1\x0d\x4b\xd4\xd1\x4a\xd2\xd1\xc9\x7c\xab\x24\x8b\xb1"
+       "\x5a\x93\xca\x34\x44\x17\xb5\xe4\xfe\xf7\x9a\xaa\x72\x0d\x41\x95";
+
+uint8 test_exponent[4] = "\x01\x00\x01\x00";
+
+uint8 test_master_secret[48] =
+       "\xbe\x51\xee\x63\x23\x90\xd0\xf4\x3a\xce\x3a\x37\x65\xc3\xdd\xcf"
+       "\xed\xf0\xc8\x19\xed\x77\x33\x4e\xfd\x2b\x7d\x5a\xe2\xca\xf3\x0a"
+       "\xf1\x16\xe5\x0c\x78\x59\x7e\xd4\x4b\x57\xce\x17\x60\x3a\x5a\xb3";
+
+uint8 test_session_key_blob[48] =
+       "\x07\x4f\xa0\x2e\xee\xc4\x5a\x46\x21\x8c\xae\x01\x45\x02\x26\xe4"
+       "\x54\x6b\x59\x10\xcc\x5b\xd1\x96\xd0\x5c\xeb\xc2\x96\x9b\x44\x7b"
+       "\x1c\xd9\x66\xb1\x9e\x24\xaa\x60\x4f\x89\xd1\x4e\xf8\xb9\x55\x3b";
+
+uint8 test_mac_salt_key[16] =
+       "\x07\x4f\xa0\x2e\xee\xc4\x5a\x46\x21\x8c\xae\x01\x45\x02\x26\xe4";
+
+uint8 test_licensing_encryption_key[16] =
+       "\xf3\xb1\xe0\x3b\xfe\xb4\xf2\xc5\x28\xa9\x48\xcd\x90\xf1\x93\xe5";
+
+uint8 test_encrypted_premaster_secret[64] =
+       "\x6b\xbc\x77\x9f\x20\x0c\x98\x39\xc1\x85\x77\xc8\x19\x87\xd8\x82"
+       "\x93\xbd\x21\x69\x5f\x87\xe0\xd6\x4e\xad\x5e\x23\x13\x80\x8c\x63"
+       "\x3e\xd6\x6e\x60\xc9\x40\xe9\x86\x08\x8c\xd5\xaa\xa9\x54\xfe\x27"
+       "\x4c\x1f\x87\x57\xde\xca\xd4\xc7\x1e\x46\x9e\x00\x7a\xdb\x47\x23";
+
+void test_license_generate_keys(void)
+{
+       STREAM _s, *s;
+
+       s = &_s;
+       memcpy(license->client_random, client_random, sizeof(client_random));
+       memcpy(license->server_random, test_server_random, sizeof(test_server_random));
+       memcpy(license->premaster_secret, premaster_secret, sizeof(premaster_secret));
+       memcpy(license->certificate->cert_info.exponent, test_exponent, sizeof(test_exponent));
+       memcpy(license->certificate->cert_info.modulus.data, test_modulus, sizeof(test_modulus));
+       license->certificate->cert_info.modulus.length = sizeof(test_modulus);
+
+       license_generate_keys(license);
+       license_encrypt_premaster_secret(license);
+
+       s->data = license->master_secret;
+       s->p = s->data + sizeof(test_master_secret);
+       ASSERT_STREAM(s, test_master_secret, sizeof(test_master_secret));
+
+       s->data = license->session_key_blob;
+       s->p = s->data + sizeof(test_session_key_blob);
+       ASSERT_STREAM(s, test_session_key_blob, sizeof(test_session_key_blob));
+
+       s->data = license->mac_salt_key;
+       s->p = s->data + sizeof(test_mac_salt_key);
+       ASSERT_STREAM(s, test_mac_salt_key, sizeof(test_mac_salt_key));
+
+       s->data = license->licensing_encryption_key;
+       s->p = s->data + sizeof(test_licensing_encryption_key);
+       ASSERT_STREAM(s, test_licensing_encryption_key, sizeof(test_licensing_encryption_key));
+
+       s->data = license->encrypted_premaster_secret->data;
+       s->p = s->data + sizeof(test_encrypted_premaster_secret);
+       ASSERT_STREAM(s, test_encrypted_premaster_secret, sizeof(test_encrypted_premaster_secret));
+}
+
+void test_license_encrypt_premaster_secret(void)
+{
+       STREAM _s, *s;
+
+       s = &_s;
+       memcpy(license->premaster_secret, premaster_secret, sizeof(premaster_secret));
+       memcpy(license->certificate->cert_info.exponent, test_exponent, sizeof(test_exponent));
+       memcpy(license->certificate->cert_info.modulus.data, test_modulus, sizeof(test_modulus));
+       license->certificate->cert_info.modulus.length = sizeof(test_modulus);
+
+       s->data = license->encrypted_premaster_secret->data;
+       s->p = s->data + sizeof(test_encrypted_premaster_secret);
+       ASSERT_STREAM(s, test_encrypted_premaster_secret, sizeof(test_encrypted_premaster_secret));
+}
+
+uint8 test_encrypted_platform_challenge[10] =
+       "\x84\x0a\x42\x50\xad\x5e\xc1\x29\x30\xbd";
+
+uint8 test_platform_challenge[10] =
+       "\x54\x00\x45\x00\x53\x00\x54\x00\x00\x00";
+
+void test_license_decrypt_platform_challenge(void)
+{
+       STREAM _s, *s;
+
+       s = &_s;
+       memcpy(license->licensing_encryption_key, test_licensing_encryption_key,
+                       sizeof(test_licensing_encryption_key));
+
+       license->encrypted_platform_challenge->data =
+                       (uint8*) xmalloc(sizeof(test_encrypted_platform_challenge));
+       license->encrypted_platform_challenge->length =
+                       sizeof(test_encrypted_platform_challenge);
+
+       memcpy(license->encrypted_platform_challenge->data, test_encrypted_platform_challenge,
+                       sizeof(test_encrypted_platform_challenge));
+
+       license_decrypt_platform_challenge(license);
+
+       s->data = license->platform_challenge->data;
+       s->p = s->data + sizeof(test_platform_challenge);
+
+       ASSERT_STREAM(s, test_platform_challenge, sizeof(test_platform_challenge));
+}
diff --git a/cunit/test_license.h b/cunit/test_license.h
new file mode 100644 (file)
index 0000000..83e6f12
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Licensing Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_license_suite(void);
+int clean_license_suite(void);
+int add_license_suite(void);
+
+void test_license(void);
+void test_license_generate_keys(void);
+void test_license_encrypt_premaster_secret(void);
+void test_license_decrypt_platform_challenge(void);
diff --git a/cunit/test_list.c b/cunit/test_list.c
new file mode 100644 (file)
index 0000000..c5ef963
--- /dev/null
@@ -0,0 +1,94 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * List Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/list.h>
+
+#include "test_list.h"
+
+int init_list_suite(void)
+{
+       return 0;
+}
+
+int clean_list_suite(void)
+{
+       return 0;
+}
+
+int add_list_suite(void)
+{
+       add_test_suite(list);
+
+       add_test_function(list);
+
+       return 0;
+}
+
+struct _my_list_item
+{
+       uint32 a;
+       uint32 b;
+};
+typedef struct _my_list_item my_list_item;
+
+void test_list(void)
+{
+       LIST* list;
+       LIST_ITEM* list_item;
+       my_list_item* item;
+       my_list_item* item1;
+       my_list_item* item2;
+       int i;
+
+       list = list_new();
+
+       for (i = 0; i < 10; i++)
+       {
+               item = xnew(my_list_item);
+               item->a = i;
+               item->b = i * i;
+               list_enqueue(list, item);
+       }
+
+       for (i = 0, list_item = list->head; list_item; i++, list_item = list_item->next)
+       {
+               CU_ASSERT(((my_list_item*)list_item->data)->a == i);
+               CU_ASSERT(((my_list_item*)list_item->data)->b == i * i);
+               /*printf("%d %d\n", item->a, item->b);*/
+       }
+
+       item1 = xnew(my_list_item);
+       list_add(list, item1);
+       item2 = xnew(my_list_item);
+       list_add(list, item2);
+
+       CU_ASSERT(list_remove(list, item1) == item1);
+       xfree(item1);
+       CU_ASSERT(list_remove(list, item2) == item2);
+       CU_ASSERT(list_remove(list, item2) == NULL);
+       xfree(item2);
+
+       while ((item = list_dequeue(list)) != NULL)
+               xfree(item);
+       list_free(list);
+}
diff --git a/cunit/test_list.h b/cunit/test_list.h
new file mode 100644 (file)
index 0000000..01afbb0
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * List Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_list_suite(void);
+int clean_list_suite(void);
+int add_list_suite(void);
+
+void test_list(void);
diff --git a/cunit/test_mcs.c b/cunit/test_mcs.c
new file mode 100644 (file)
index 0000000..eac0d05
--- /dev/null
@@ -0,0 +1,115 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.125 Multipoint Communication Service (MCS) Protocol Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mcs.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_mcs.h"
+
+int init_mcs_suite(void)
+{
+       return 0;
+}
+
+int clean_mcs_suite(void)
+{
+       return 0;
+}
+
+int add_mcs_suite(void)
+{
+       add_test_suite(mcs);
+
+       add_test_function(mcs_write_connect_initial);
+
+       return 0;
+}
+
+uint8 gcc_CCrq[307] =
+       "\x00\x05\x00\x14\x7C\x00\x01\x81\x2A\x00\x08\x00\x10\x00\x01\xC0"
+       "\x00\x44\x75\x63\x61\x81\x1c\x01\xc0\xd8\x00\x04\x00\x08\x00\x00"
+       "\x05\x00\x04\x01\xCA\x03\xAA\x09\x04\x00\x00\xCE\x0E\x00\x00\x45"
+       "\x00\x4c\x00\x54\x00\x4f\x00\x4e\x00\x53\x00\x2d\x00\x44\x00\x45"
+       "\x00\x56\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"
+       "\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xCA\x01\x00\x00"
+       "\x00\x00\x00\x18\x00\x07\x00\x01\x00\x36\x00\x39\x00\x37\x00\x31"
+       "\x00\x32\x00\x2d\x00\x37\x00\x38\x00\x33\x00\x2d\x00\x30\x00\x33"
+       "\x00\x35\x00\x37\x00\x39\x00\x37\x00\x34\x00\x2d\x00\x34\x00\x32"
+       "\x00\x37\x00\x31\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04"
+       "\xC0\x0C\x00\x0D\x00\x00\x00\x00\x00\x00\x00\x02\xC0\x0C\x00\x1B"
+       "\x00\x00\x00\x00\x00\x00\x00\x03\xC0\x2C\x00\x03\x00\x00\x00\x72"
+       "\x64\x70\x64\x72\x00\x00\x00\x00\x00\x80\x80\x63\x6c\x69\x70\x72"
+       "\x64\x72\x00\x00\x00\xA0\xC0\x72\x64\x70\x73\x6e\x64\x00\x00\x00"
+       "\x00\x00\xc0";
+
+uint8 mcs_connect_initial_expected[409] =
+       "\x7F\x65\x82\x01\x94\x04\x01\x01\x04\x01\x01\x01\x01\xFF\x30\x19"
+       "\x02\x01\x22\x02\x01\x02\x02\x01\x00\x02\x01\x01\x02\x01\x00\x02"
+       "\x01\x01\x02\x02\xFF\xFF\x02\x01\x02\x30\x19\x02\x01\x01\x02\x01"
+       "\x01\x02\x01\x01\x02\x01\x01\x02\x01\x00\x02\x01\x01\x02\x02\x04"
+       "\x20\x02\x01\x02\x30\x1C\x02\x02\xFF\xFF\x02\x02\xFC\x17\x02\x02"
+       "\xFF\xFF\x02\x01\x01\x02\x01\x00\x02\x01\x01\x02\x02\xFF\xFF\x02"
+       "\x01\x02\x04\x82\x01\x33\x00\x05\x00\x14\x7C\x00\x01\x81\x2A\x00"
+       "\x08\x00\x10\x00\x01\xC0\x00\x44\x75\x63\x61\x81\x1c\x01\xc0\xd8"
+       "\x00\x04\x00\x08\x00\x00\x05\x00\x04\x01\xCA\x03\xAA\x09\x04\x00"
+       "\x00\xCE\x0E\x00\x00\x45\x00\x4c\x00\x54\x00\x4f\x00\x4e\x00\x53"
+       "\x00\x2d\x00\x44\x00\x45\x00\x56\x00\x32\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x01\xCA\x01\x00\x00\x00\x00\x00\x18\x00\x07\x00\x01\x00\x36"
+       "\x00\x39\x00\x37\x00\x31\x00\x32\x00\x2d\x00\x37\x00\x38\x00\x33"
+       "\x00\x2d\x00\x30\x00\x33\x00\x35\x00\x37\x00\x39\x00\x37\x00\x34"
+       "\x00\x2d\x00\x34\x00\x32\x00\x37\x00\x31\x00\x34\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+       "\x00\x00\x00\x00\x00\x04\xC0\x0C\x00\x0D\x00\x00\x00\x00\x00\x00"
+       "\x00\x02\xC0\x0C\x00\x1B\x00\x00\x00\x00\x00\x00\x00\x03\xC0\x2C"
+       "\x00\x03\x00\x00\x00\x72\x64\x70\x64\x72\x00\x00\x00\x00\x00\x80"
+       "\x80\x63\x6c\x69\x70\x72\x64\x72\x00\x00\x00\xA0\xC0\x72\x64\x70"
+       "\x73\x6e\x64\x00\x00\x00\x00\x00\xc0";
+
+void test_mcs_write_connect_initial(void)
+{
+       STREAM* s;
+       rdpMcs* mcs;
+       STREAM _user_data, *user_data;
+
+       mcs = mcs_new((rdpTransport*) NULL);
+
+       user_data = &_user_data;
+       user_data->data = gcc_CCrq;
+       user_data->p = user_data->data + sizeof(gcc_CCrq);
+
+       s = stream_new(512);
+       mcs_write_connect_initial(s, mcs, user_data);
+
+       ASSERT_STREAM(s, (uint8*) mcs_connect_initial_expected, sizeof(mcs_connect_initial_expected));
+
+       stream_free(s);
+}
diff --git a/cunit/test_mcs.h b/cunit/test_mcs.h
new file mode 100644 (file)
index 0000000..60d4295
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.125 Multipoint Communication Service (MCS) Protocol Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_mcs_suite(void);
+int clean_mcs_suite(void);
+int add_mcs_suite(void);
+
+void test_mcs_write_connect_initial(void);
diff --git a/cunit/test_mppc.c b/cunit/test_mppc.c
new file mode 100644 (file)
index 0000000..435fbd9
--- /dev/null
@@ -0,0 +1,670 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Microsoft Point to Point Compression (MPPC)  Unit Tests
+ *
+ * Copyright 2011 Laxmikant Rashinkar <LK.Rashinkar@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <stdint.h>
+#include <sys/time.h>
+
+#include "rdp.h"
+#include "test_mppc.h"
+
+uint8_t compressed_rd5[] =
+{
+    0x24, 0x02, 0x03, 0x09, 0x00, 0x20, 0x0c, 0x05, 0x10, 0x01, 0x40, 0x0a, 0xbf, 0xdf, 0xc3, 0x20,
+    0x80, 0x00, 0x1f, 0x0a, 0x00, 0x00, 0x07, 0x43, 0x4e, 0x00, 0x68, 0x02, 0x00, 0x22, 0x00, 0x34,
+    0xcb, 0xfb, 0xf8, 0x18, 0x40, 0x01, 0x00, 0x27, 0xe2, 0x90, 0x0f, 0xc3, 0x91, 0xa8, 0x00, 0x08,
+    0x00, 0x00, 0x68, 0x50, 0x60, 0x65, 0xfc, 0x0e, 0xfe, 0x04, 0x00, 0x08, 0x00, 0x06, 0x0c, 0x00,
+    0x01, 0x00, 0xf8, 0x40, 0x20, 0x00, 0x00, 0x90, 0x00, 0xcf, 0x95, 0x1f, 0x44, 0x90, 0x00, 0x6e,
+    0x03, 0xf4, 0x40, 0x21, 0x9f, 0x26, 0x01, 0xbf, 0x88, 0x10, 0x90, 0x00, 0x08, 0x04, 0x00, 0x04,
+    0x30, 0x03, 0xe4, 0xc7, 0xea, 0x05, 0x1e, 0x87, 0xf8, 0x20, 0x1c, 0x00, 0x10, 0x84, 0x22, 0x1f,
+    0x71, 0x0d, 0x0e, 0xb9, 0x88, 0x9f, 0x5c, 0xee, 0x41, 0x97, 0xfb, 0xf8, 0x88, 0x68, 0x08, 0x6d,
+    0xd0, 0x44, 0xfc, 0x34, 0x06, 0xe6, 0x16, 0x21, 0x04, 0x11, 0x0f, 0xb9, 0x85, 0x86, 0x5d, 0x44,
+    0x4f, 0xae, 0xb7, 0x40, 0xa8, 0xcd, 0x5b, 0xed, 0x02, 0xee, 0xc2, 0x21, 0x40, 0x21, 0x21, 0x23,
+    0x17, 0xb7, 0x00, 0x60, 0x00, 0x3b, 0xfd, 0xfc, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x34, 0x00, 0x33,
+    0xc7, 0xe0, 0xc0, 0x0f, 0x07, 0x12, 0x42, 0x01, 0xe8, 0x6c, 0xc7, 0x83, 0x07, 0x8c, 0xd4, 0x30,
+    0x07, 0x20, 0x01, 0x90, 0xa3, 0xf1, 0xdb, 0xf5, 0xd4, 0x13, 0xc2, 0x4f, 0x0f, 0xe5, 0xe2, 0xc7,
+    0x87, 0xf2, 0xf0, 0x93, 0xc3, 0xf9, 0x78, 0xb0, 0x1a, 0x03, 0xe1, 0xf1, 0xd0, 0x08, 0x4c, 0x66,
+    0xac, 0x32, 0x31, 0x70, 0x60, 0x11, 0x01, 0x11, 0x01, 0x01, 0x01, 0xf0, 0x36, 0x1f, 0xe5, 0xe0,
+    0x6c, 0xbc, 0x26, 0xf0, 0x36, 0x5f, 0xe5, 0xe0, 0x6c, 0xbc, 0x26, 0xf0, 0x34, 0xf9, 0x94, 0x32,
+    0x31, 0x74, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xbf, 0x87, 0xdf, 0xef, 0xfe, 0x4b, 0xbf, 0x02, 0xfa,
+    0xde, 0xa7, 0x79, 0x32, 0x44, 0x7c, 0x20, 0x82, 0x00, 0x5f, 0xef, 0xff, 0x09, 0xe1, 0x05, 0x74,
+    0x32, 0xea, 0x09, 0xe1, 0x0f, 0x55, 0x83, 0x85, 0x2a, 0xa0, 0x1d, 0x50, 0x0e, 0x0e, 0x0b, 0x01,
+    0x01, 0x43, 0x06, 0x02, 0xbe, 0x5f, 0x00, 0x00, 0x0c, 0x3d, 0x4d, 0x87, 0xa6, 0x5e, 0xa6, 0xcb,
+    0xc3, 0xcf, 0x53, 0x65, 0xe9, 0x97, 0xa9, 0xb2, 0xf5, 0x9b, 0xd4, 0xd3, 0xee, 0xcd, 0xc0, 0x7c,
+    0xae, 0xe0, 0x65, 0x1f, 0xe5, 0xe0, 0x6c, 0xbc, 0x26, 0xf0, 0x36, 0x5f, 0xe5, 0xe0, 0x6c, 0xbc,
+    0x26, 0xf0, 0x34, 0xfb, 0xb3, 0xf2, 0x41, 0x30, 0x20, 0x04, 0xa0, 0x80, 0x93, 0xf3, 0xf2, 0x1b,
+    0xed, 0xf6, 0x0f, 0x04, 0x82, 0x7b, 0xcc, 0x00, 0x65, 0xef, 0x4f, 0x86, 0x02, 0xf7, 0xa7, 0xe0,
+    0x0a, 0x88, 0x1c, 0x34, 0x02, 0x02, 0x02, 0x60, 0x60, 0x49, 0x40, 0xc1, 0x2f, 0x14, 0xca, 0x60,
+    0xc1, 0x81, 0x80, 0x07, 0xc3, 0x00, 0x00, 0x39, 0xfa, 0x86, 0x38, 0x93, 0x47, 0x08, 0x27, 0x08,
+    0xfc, 0xb8, 0x4e, 0x38, 0x47, 0xe5, 0xc2, 0x09, 0xc2, 0x3f, 0x2e, 0x13, 0x8e, 0x11, 0xf3, 0xc3,
+    0x57, 0x1a, 0x88, 0x7d, 0x44, 0x3c, 0x3c, 0x04, 0x0f, 0xd4, 0x3f, 0x83, 0x8d, 0x82, 0x00, 0x25,
+    0x04, 0x84, 0xdf, 0xe0, 0x17, 0xf8, 0x04, 0x03, 0xe1, 0x47, 0xc4, 0xaf, 0x9c, 0x00, 0x00, 0x31,
+    0xf5, 0x4c, 0x71, 0x78, 0x8f, 0x54, 0xfb, 0x1c, 0x97, 0xa4, 0x04, 0x13, 0xd5, 0x2f, 0x77, 0xc7,
+    0xb8, 0x9e, 0xef, 0xcb, 0xc2, 0x6f, 0x77, 0xe5, 0xee, 0x27, 0xbb, 0xf2, 0xf7, 0xe3, 0xdd, 0xf3,
+    0xc6, 0xfb, 0x2a, 0x78, 0x6d, 0x3c, 0x34, 0x37, 0xc0, 0xaf, 0x25, 0xc7, 0x81, 0x7d, 0x6e, 0x5d,
+    0x5c, 0xd6, 0xe3, 0x43, 0xc0, 0x82, 0xd0, 0x95, 0x90, 0xd8, 0xbd, 0xfc, 0x00, 0x09, 0xc0, 0x34,
+    0x39, 0x46, 0x84, 0x20, 0x40, 0x38, 0xa3, 0x42, 0x12, 0xb0, 0x55, 0xbe, 0x28, 0xc0, 0x70, 0x64,
+    0x28, 0xc8, 0x48, 0x42, 0x08, 0xb2, 0x1b, 0x46, 0xa6, 0x09, 0x54, 0x2e, 0x5f, 0x73, 0x84, 0xfc,
+    0x28, 0x4a, 0x73, 0x79, 0xf2, 0x6c, 0x5d, 0x82, 0x82, 0x6e, 0xc2, 0x27, 0xd7, 0x6b, 0xb8, 0x4f,
+    0xa4, 0xa4, 0x22, 0xee, 0x22, 0x7e, 0x10, 0x03, 0x78, 0x08, 0xf4, 0x94, 0x5e, 0x02, 0x01, 0xef,
+    0x02, 0x27, 0xd7, 0x8b, 0xc8, 0x3f, 0xa4, 0xa4, 0x1a, 0xf3, 0xd1, 0x84, 0x0c, 0x32, 0x31, 0x75,
+    0x60, 0x05, 0xe2, 0x30, 0xb7, 0xad, 0x5b, 0x15, 0xd5, 0xc3, 0xc0, 0x00, 0x11, 0x81, 0x81, 0x69,
+    0x8f, 0x06, 0x0f, 0x14, 0xcf, 0xa6, 0xe8, 0xb1, 0x22, 0x77, 0xeb, 0xd7, 0x45, 0x89, 0xf0, 0xb6,
+    0x3e, 0x23, 0x06, 0x80, 0xf8, 0x5b, 0x0f, 0x04, 0x83, 0xfc, 0x2d, 0x8f, 0x88, 0xc1, 0xa0, 0x3e,
+    0x16, 0x1d, 0x00, 0x83, 0x74, 0x58, 0xa0, 0xc0, 0x10, 0xce, 0x8b, 0x17, 0xe0, 0x68, 0xff, 0x20,
+    0xff, 0x03, 0x63, 0xe5, 0xcf, 0x1f, 0xa0, 0x40, 0x00, 0x00, 0x2a, 0xff, 0xd6, 0xd1, 0xc0, 0xb9,
+    0xe0, 0x5f, 0x6b, 0x81, 0x73, 0xc9, 0x93, 0xd1, 0x63, 0x50, 0xf0, 0x9b, 0xf0, 0x48, 0x4f, 0xaf,
+    0xe0, 0x1b, 0xef, 0x82, 0x6f, 0xc2, 0x40, 0xe0, 0xe4, 0x60, 0xa0, 0x69, 0xa1, 0xa1, 0xbe, 0xba,
+    0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x42, 0x00, 0x44, 0x00, 0x88, 0x01, 0x10, 0x02,
+    0x21, 0x02, 0x22, 0x04, 0x44, 0x08, 0x9c, 0x8f, 0xcd, 0xe0, 0x02, 0x20, 0x88, 0x02, 0x10, 0x40,
+    0x01, 0xf0, 0x60, 0x44, 0xc0, 0xce, 0xb1, 0x8f, 0xd0, 0x30, 0x00, 0x60, 0x00, 0xa0, 0x00, 0xc4,
+    0x00, 0xcc, 0x01, 0x98, 0x03, 0x28, 0x03, 0x31, 0x03, 0x33, 0x06, 0x66, 0x07, 0x0e, 0x2c, 0xe3,
+    0x7b, 0x18, 0x85, 0xc7, 0xd6, 0x51, 0x71, 0x0f, 0x0e, 0xb8, 0x88, 0x9f, 0x5c, 0x6e, 0x41, 0xde,
+    0xeb, 0x71, 0x20, 0x5c, 0xba, 0xf7, 0xc8, 0x6f, 0xba, 0xc1, 0xf7, 0x30, 0xd0, 0xce, 0xc1, 0x31,
+    0x74, 0xec, 0x13, 0x41, 0x77, 0x41, 0x13, 0xa0, 0x10, 0xbf, 0x7c, 0x45, 0xd3, 0xa5, 0xbc, 0x55,
+    0x84, 0xaa, 0x41, 0xc1, 0xc1, 0xe0, 0xe0, 0x29, 0x01, 0x20, 0x81, 0x00, 0x03, 0x80, 0x07, 0xc0,
+    0x0f, 0xe0, 0x06, 0xbe, 0x16, 0x75, 0xe7, 0x9f, 0xfb, 0x1e, 0x17, 0x90, 0xef, 0x0b, 0xbb, 0x15,
+    0x03, 0x7c, 0x2b, 0x7e, 0x22, 0x78, 0x56, 0x83, 0xae, 0x77, 0x40, 0xcf, 0xb0, 0xf0, 0x98, 0x28,
+    0x04, 0x2f, 0xaf, 0x0e, 0x40, 0xfc, 0x01, 0x1c, 0x5c, 0xb1, 0xf2, 0xbf, 0xa5, 0xd7, 0x8f, 0x97,
+    0xc0, 0xfe, 0x9f, 0x02, 0xe7, 0x24, 0x79, 0xe0, 0x9b, 0xa9, 0xfd, 0x74, 0x3b, 0xaf, 0x2d, 0xf8,
+    0x4b, 0xd2, 0xf7, 0x84, 0x54, 0x04, 0x2a, 0x02, 0x02, 0x01, 0xe1, 0x1e, 0xf0, 0x87, 0xff, 0x77,
+    0x07, 0x00, 0x02, 0x00, 0x0d, 0xbd, 0xe1, 0xf0, 0x01, 0x1e, 0xf0, 0xfd, 0x80, 0x4c, 0x24, 0x11,
+    0x2c, 0x10, 0x24, 0x02, 0x01, 0x40, 0xb0, 0x5c, 0x2c, 0x14, 0x08, 0x07, 0x1b, 0x80, 0x01, 0xa7,
+    0xbd, 0x3e, 0x00, 0x27, 0xde, 0x9f, 0xb0, 0x85, 0x01, 0xfb, 0xd2, 0x04, 0x0c, 0x1c, 0x2e, 0x0e,
+    0x06, 0x18, 0x03, 0xd4, 0x00, 0x00, 0x67, 0xef, 0x4f, 0x80, 0x0a, 0xf7, 0xa7, 0xe3, 0x94, 0xe0,
+    0xe0, 0x10, 0x1b, 0xfd, 0xfc, 0x74, 0x62, 0xe8, 0xc0, 0x1d, 0x62, 0x00, 0x0b, 0x00, 0xb7, 0x70,
+    0xe6, 0x8a, 0x68, 0x75, 0x38, 0x3c, 0x3c, 0x4c, 0x2f, 0x87, 0xef, 0x01, 0xc7, 0xb2, 0x40, 0x21,
+    0xa3, 0x23, 0x0a, 0x08, 0x01, 0xa1, 0xa1, 0xe1, 0x80, 0x69, 0x40, 0xe1, 0x00, 0x00, 0x40, 0xd0,
+    0xea, 0xe5, 0xe1, 0xc0, 0x81, 0x87, 0xed, 0x68, 0x1a, 0x08, 0x94, 0x0c, 0x0c, 0xf1, 0x7c, 0xbe,
+    0x5f, 0x2f, 0x8f, 0x00, 0x00, 0x0d, 0x1f, 0x68, 0x7a, 0x1a, 0x04, 0x05, 0xce, 0xe6, 0x2a, 0x0c,
+    0x01, 0xc2, 0x00, 0x40, 0x42, 0x61, 0xc0, 0x49, 0x41, 0x60, 0xa0, 0x80, 0x01, 0xc0, 0x03, 0xe0,
+    0x07, 0xf0, 0x07, 0xfa, 0x00, 0x07, 0x3b, 0x99, 0x01, 0x0f, 0x19, 0x18, 0x54, 0x40, 0xe0, 0x60,
+    0xee, 0xd0, 0x0e, 0x19, 0x0a, 0x03, 0xa5, 0x7d, 0x05, 0xd0, 0x83, 0x98, 0x5a, 0x96, 0x21, 0x4b,
+    0x10, 0x10, 0xe6, 0x17, 0xaf, 0xeb, 0xaf, 0x34, 0x3c, 0xc8, 0x0f, 0xf0, 0x64, 0x3f, 0xd0, 0x0f,
+    0xe0, 0x03, 0xfe, 0x10, 0x02, 0x7d, 0x47, 0x2d, 0x58, 0xfc, 0x35, 0xe0, 0xca, 0x0f, 0x19, 0x0a,
+    0xf9, 0xf1, 0xe0, 0xb9, 0xc0, 0x81, 0x10, 0x03, 0xe0, 0xbd, 0x4f, 0xea, 0x61, 0xf7, 0xeb, 0xf6,
+    0x02, 0xd4, 0x7a, 0xf9, 0xff, 0x15, 0x30, 0xfa, 0x88, 0x68, 0x68, 0xd8, 0x80, 0x12, 0x60, 0x50,
+    0x50, 0xf0, 0x03, 0xfc, 0x01, 0xfe, 0x01, 0x7f, 0xa0, 0x7c, 0x28, 0xbf, 0xd0, 0x3e, 0x64, 0x0f,
+    0x00, 0x37, 0x00, 0x08, 0x80, 0x20, 0x0b, 0x88, 0x81, 0xa5, 0x04, 0x84, 0x60, 0x40, 0x36, 0x04,
+    0x1b, 0x8f, 0x88, 0x01, 0x00, 0xa1, 0x80, 0x1e, 0x00, 0x36, 0xfd, 0xb9, 0x12, 0x02, 0x4c, 0x09,
+    0x08, 0x1e, 0x00, 0x61, 0x80, 0x20, 0x60, 0x44, 0x17, 0xdc, 0x7c, 0x62, 0x00, 0x03, 0x67, 0xdb,
+    0x81, 0xb1, 0x30, 0x34, 0xb0, 0xa0, 0xaf, 0xa0, 0x80, 0x75, 0x35, 0x20, 0x7c, 0x49, 0xfc, 0x0f,
+    0xf5, 0x0d, 0x7f, 0x7e, 0x45, 0x00, 0x53, 0x42, 0x82, 0x83, 0xc0, 0x0c, 0x28, 0x1f, 0x72, 0x3e,
+    0xd3, 0xf5, 0x62, 0xd4, 0x00, 0x22, 0xa8, 0x81, 0xec, 0x67, 0x96, 0x02, 0xa0, 0x49, 0x7d, 0xfd,
+    0x6b, 0xbf, 0xcc, 0x7c, 0x4a, 0xf8, 0xd0, 0x00, 0x00, 0xcf, 0xd5, 0xd2, 0x23, 0x35, 0x60, 0x01,
+    0xf1, 0x60, 0x14, 0xc0, 0xb0, 0xbe, 0xb3, 0x02, 0x0f, 0x89, 0x5f, 0x1b, 0x00, 0x02, 0x0b, 0xfd,
+    0x80, 0x00, 0x01, 0x9b, 0xf3, 0x40, 0x42, 0x10, 0x00, 0xd8, 0xb8, 0x0f, 0xa8, 0x17, 0xfe, 0x59,
+    0xef, 0x14, 0x61, 0xf2, 0x30, 0x65, 0xfc, 0x51, 0xe2, 0xc1, 0x18, 0xc0, 0x07, 0x5e, 0x68, 0x08,
+    0xe8, 0x46, 0xf8, 0x95, 0xf1, 0xb0, 0xf9, 0x13, 0x7f, 0xbc, 0x00, 0x00, 0x32, 0x7e, 0xa8, 0xeb,
+    0xcd, 0x03, 0x20, 0x09, 0xa1, 0x81, 0x97, 0xfb, 0x87, 0x80, 0xb0, 0xf9, 0x19, 0x7c, 0xa8, 0x63,
+    0xf3, 0xe6, 0x20, 0x22, 0xbd, 0x85, 0x9e, 0x62, 0x00, 0x8b, 0x7c, 0x87, 0x91, 0x00, 0x22, 0xff,
+    0x21, 0xe2, 0xa0, 0x08, 0xc7, 0xc8, 0x78, 0x20, 0x02, 0x33, 0xf2, 0x1c, 0x10, 0x41, 0xe3, 0x40,
+    0x69, 0x7c, 0x45, 0x72, 0x62, 0xf0, 0x04, 0x7f, 0x60, 0x68, 0x6f, 0x80, 0x00, 0x08, 0x1f, 0xf7,
+    0xad, 0x51, 0x03, 0xf3, 0xf8, 0xa0, 0x9d, 0xa8, 0x40, 0x00, 0x23, 0x42, 0x37, 0x46, 0x0f, 0xde,
+    0xa6, 0x06, 0xd3, 0x3c, 0x33, 0xe1, 0x78, 0xd8, 0x34, 0x32, 0x14, 0x67, 0xdb, 0xd2, 0x38, 0xaf,
+    0xc7, 0x9c, 0xdf, 0xd0, 0x21, 0xe6, 0xd7, 0x80, 0x40, 0x22, 0x3f, 0x21, 0xe8, 0xd8, 0x12, 0xf9,
+    0x0f, 0xb4, 0x01, 0x13, 0xf9, 0x0f, 0x46, 0xc0, 0xa7, 0x13, 0x37, 0x1e, 0x67, 0x07, 0x8b, 0x01,
+    0xfd, 0xfe, 0x0f, 0xf7, 0x7a, 0xf0, 0x16, 0x36, 0x0a, 0x92, 0x08, 0x08, 0xc1, 0x70, 0xb8, 0x30,
+    0x34, 0xf1, 0xf3, 0x72, 0x27, 0x8f, 0x4b, 0x60, 0x21, 0xc4, 0xdd, 0xe2, 0xdf, 0x0b, 0xca, 0x4f,
+    0x2e, 0x4f, 0x9c, 0xde, 0x59, 0xe9, 0xf1, 0x55, 0x00, 0x8d, 0xf2, 0x20, 0x53, 0x3c, 0xc4, 0xf6,
+    0x46, 0x7e, 0x24, 0xee, 0xf2, 0x0c, 0x0d, 0x81, 0x83, 0xf9, 0x98, 0x0e, 0x00, 0x02, 0x10, 0x11,
+    0x01, 0x08, 0x95, 0x2a, 0xfc, 0x28, 0x95, 0x2a, 0x84, 0x80, 0xbf, 0x81, 0x06, 0x80, 0x0d, 0x00,
+    0x86, 0xe0, 0x6b, 0xa5, 0xc3, 0xd8, 0x8f, 0x22, 0xa0, 0x3e, 0xe9, 0x8f, 0x90, 0xf2, 0x6b, 0x85,
+    0x77, 0x57, 0x99, 0x43, 0x5c, 0x66, 0x5f, 0x9e, 0x85, 0x7c, 0x3f, 0x1f, 0xb3, 0xce, 0xc0, 0x0e,
+    0x64, 0x20, 0x0e, 0x20, 0xdc, 0x7e, 0x18, 0x81, 0x90, 0xa3, 0x13, 0x4e, 0x52, 0x71, 0x81, 0x03,
+    0xa4, 0x30, 0x30, 0x6c, 0x73, 0x8f, 0xc4, 0x50, 0x60, 0x16, 0x38, 0x03, 0xbf, 0x6f, 0x89, 0x3e,
+    0x00, 0x77, 0x00, 0xb1, 0xc0, 0x28, 0x3d, 0x73, 0x98, 0x06, 0xfe, 0x00, 0xe9, 0x81, 0xa3, 0xb8,
+    0x1c, 0x85, 0x20, 0x45, 0x45, 0xe1, 0xa1, 0x23, 0x63, 0xa0, 0x29, 0x61, 0x41, 0x27, 0xf4, 0x03,
+    0xfa, 0x01, 0x02, 0x05, 0xff, 0xe1, 0x20, 0x34, 0x08, 0x08, 0x04, 0x04, 0x02, 0xff, 0xeb, 0x96,
+    0x05, 0x24, 0x8e, 0x0a, 0xb1, 0xce, 0xf2, 0x06, 0xc7, 0xb9, 0x01, 0xd7, 0x20, 0x52, 0x04, 0x03,
+    0xe1, 0x47, 0xc4, 0xa4, 0x0b, 0xfd, 0x03, 0x01, 0xc0, 0x47, 0xe6, 0xc0, 0x2c, 0x7c, 0x09, 0x10,
+    0x1c, 0x0a, 0xfd, 0x7e, 0xc0, 0xd2, 0x94, 0x7a, 0x1a, 0x06, 0x07, 0xcf, 0x12, 0x2a, 0x8c, 0x1e,
+    0xe7, 0x07, 0x08, 0x81, 0x81, 0x91, 0x90, 0x72, 0x26, 0x9e, 0x55, 0x44, 0x0e, 0x4d, 0x21, 0x00,
+    0x08, 0x40, 0x02, 0x20, 0x01, 0x17, 0x2c, 0xd4, 0x22, 0x00, 0x88, 0x80, 0x44, 0x40, 0x23, 0xcd,
+    0xf8, 0xf1, 0xc8, 0x9b, 0x02, 0x10, 0x0c, 0x02, 0x99, 0x30, 0x00, 0x0a, 0x06, 0x01, 0x4b, 0x18,
+    0x00, 0x46, 0x00, 0x29, 0x9c, 0xa3, 0x86, 0x60, 0x11, 0x98, 0x05, 0x32, 0x80, 0xcc, 0xc0, 0xf3,
+    0xc3, 0xb8, 0x7a, 0x21, 0x7d, 0xbe, 0xfa, 0xce, 0x2a, 0x9d, 0xfa, 0xa0, 0x3c, 0x32, 0xfb, 0x7d,
+    0x13, 0x22, 0x05, 0xeb, 0x0b, 0xbb, 0xb8, 0x00, 0x15, 0xfe, 0xfe, 0x1a, 0x14, 0x7e, 0x1c, 0x00,
+    0x01, 0x82, 0x3a, 0xa7, 0xd2, 0x6c, 0x11, 0xdd, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x18, 0x23, 0x5a,
+    0x00, 0x80, 0xb0, 0x47, 0x84, 0x7c, 0xa8, 0x03, 0xa7, 0x82, 0x48, 0x83, 0x01, 0x50, 0x11, 0x2a,
+    0x37, 0xfb, 0xfc, 0x03, 0x03, 0xd1, 0xa3, 0x35, 0x68, 0xcd, 0x58, 0x40, 0x03, 0xe3, 0x47, 0xc4,
+    0xaf, 0x8d, 0x1f, 0x42, 0x84, 0x20, 0x81, 0x08, 0x57, 0xfb, 0xff, 0xd0, 0x98, 0x27, 0xc8, 0xaf,
+    0x99, 0x1f, 0x12, 0x04, 0x3e, 0x84, 0xfe, 0x08, 0x1c, 0xc1, 0x31, 0x58, 0x80, 0x3a, 0xd1, 0x99,
+    0x8a, 0x40, 0x02, 0x5a, 0x04, 0x00, 0x02, 0x1a, 0x38, 0xf3, 0x08, 0x00, 0x01, 0xda, 0xe3, 0x35,
+    0x60, 0x5f, 0x88, 0x00, 0x03, 0x6e, 0xbf, 0xdf, 0xc0, 0xbe, 0x20, 0x00, 0x42, 0x80, 0x01, 0x77,
+    0x9e, 0x80, 0xd0, 0x30, 0x4a, 0x32, 0x81, 0xe3, 0x94, 0x04, 0x21, 0x0a, 0x9c, 0xcc, 0x52, 0x03,
+    0x7d, 0xa7, 0x0c, 0x51, 0x80, 0x6f, 0xa5, 0xc0, 0x3f, 0x3e, 0x80, 0xa0, 0x22, 0x10, 0x40, 0x68,
+    0x17, 0x9f, 0x60, 0x1e, 0x9b, 0x09, 0x52, 0x03, 0x2d, 0x03, 0x81, 0x88, 0x41, 0x3c, 0x65, 0x14,
+    0x98, 0xcd, 0x58, 0x6a, 0x04, 0x21, 0x80, 0x9b, 0x81, 0x45, 0x21, 0x24, 0xe1, 0x8c, 0xf1, 0x9a,
+    0xb0, 0xa9, 0x38, 0xef, 0xe7, 0x90, 0xdf, 0x98, 0x00, 0x19, 0xa8, 0x18, 0x42, 0x6a, 0xc0, 0x7f,
+    0xda, 0x00, 0x00, 0x2b, 0x1e, 0x36, 0x7c, 0xaa, 0xa0, 0x00, 0xc0, 0xf8, 0xa0, 0xbe, 0x60, 0x2e,
+    0xb1, 0x09, 0xab, 0x60, 0x3e, 0x38, 0xf9, 0x6f, 0xa9, 0x3e, 0x08, 0x81, 0xa6, 0x8c, 0x13, 0xae,
+    0x83, 0x7e, 0x0a, 0xfb, 0x0f, 0x60, 0x86, 0x3e, 0x90, 0x6d, 0xa2, 0x33, 0x56, 0x06, 0xfa, 0xcf,
+    0xc5, 0x1f, 0x12, 0x38, 0x49, 0x3d, 0x04, 0x03, 0xa6, 0x42, 0x54, 0x82, 0x3e, 0xd3, 0xd1, 0xd0,
+    0x08, 0x58, 0x06, 0xdc, 0x10, 0x85, 0xe8, 0xf8, 0xf8, 0x94, 0x10, 0x84, 0x21, 0xe7, 0xa3, 0x85,
+    0xfe, 0xfe, 0xc1, 0xe9, 0x77, 0xa3, 0x27, 0xe7, 0xbd, 0x31, 0x98, 0x17, 0xa1, 0xe2, 0x13, 0xe8,
+    0x5a, 0xf1, 0x44, 0x7c, 0x4a, 0x00, 0x00, 0x07, 0x2d, 0x03, 0x2d, 0x05, 0xa3, 0x46, 0x6a, 0xc1,
+    0x9e, 0x9f, 0x9f, 0x51, 0xc0, 0x55, 0x1a, 0x13, 0x56, 0x0e, 0xf4, 0xa4, 0x85, 0xfd, 0x4c, 0x47,
+    0x10, 0x0d, 0x70, 0x24, 0x9b, 0xfa, 0x45, 0x41, 0x3a, 0x33, 0xea, 0x28, 0x60, 0x00, 0x80, 0x00,
+    0xbc, 0x00, 0x80, 0x7b, 0x2e, 0x43, 0x10, 0x0b, 0x00, 0xec, 0x1e, 0x98, 0x8a, 0xb4, 0x26, 0xac,
+    0x5f, 0xf9, 0x20, 0x03, 0xf2, 0xc1, 0xdf, 0xca, 0x14, 0x40, 0x07, 0x40, 0x1e, 0x00, 0x3d, 0x10,
+    0xe1, 0x37, 0x90, 0x64, 0x17, 0xec, 0x3d, 0x4c, 0xf5, 0x94, 0x20, 0x15, 0x80, 0xdc, 0x3e, 0x74,
+    0x7f, 0x87, 0x87, 0xa9, 0xa6, 0x33, 0x56, 0x16, 0xfd, 0xcf, 0xa9, 0x1f, 0x12, 0x23, 0x35, 0x60,
+    0xaf, 0xa4, 0x04, 0xf5, 0xb0, 0x1f, 0xe4, 0x3d, 0x75, 0x1c, 0x20, 0xeb, 0xd7, 0x19, 0x00, 0xb8,
+    0x04, 0x21, 0x7a, 0xd3, 0xbe, 0x15, 0xeb, 0x4a, 0xf1, 0x84, 0x78, 0x52, 0x3e, 0x25, 0x03, 0x16,
+    0x81, 0xc3, 0x7d, 0x59, 0x1f, 0x12, 0x30, 0x50, 0xe3, 0xe1, 0xcf, 0xc5, 0x8f, 0xa1, 0x1c, 0x0e,
+    0x9e, 0xd0, 0x0d, 0x7b, 0x18, 0x14, 0xcc, 0x21, 0x04, 0x1b, 0x6a, 0x8c, 0xd5, 0x86, 0xe0, 0x31,
+    0x9a, 0xb0, 0x4f, 0xc8, 0x0b, 0x7c, 0x40, 0x37, 0xc4, 0x5c, 0x22, 0x80, 0x3e, 0x54, 0x71, 0x10,
+    0xbf, 0x26, 0xf9, 0xa2, 0x1c, 0x0b, 0x82, 0xf0, 0x8f, 0x22, 0x47, 0x8a, 0xab, 0xca, 0xd4, 0x31,
+    0x08, 0xf1, 0xe6, 0x51, 0x9a, 0xb7, 0xcc, 0x80, 0x7f, 0xc9, 0xc2, 0x13, 0x08, 0xfd, 0x95, 0xfe,
+    0x23, 0xc0, 0x14, 0x0f, 0x08, 0xe1, 0xb5, 0x5f, 0x4a, 0x38, 0x10, 0x47, 0x1b, 0x17, 0x0a, 0x07,
+    0x1d, 0x38, 0xe3, 0xcb, 0x42, 0x10, 0x4f, 0x5d, 0x40, 0x3f, 0xf8, 0xe1, 0x0a, 0xe0, 0x45, 0xa8,
+    0x47, 0xe0, 0x78, 0x23, 0x0f, 0x91, 0x5f, 0x4a, 0x7f, 0xe3, 0xc9, 0x11, 0xe0, 0x4a, 0x09, 0xfe,
+    0x5a, 0xf0, 0xea, 0x8f, 0x21, 0x57, 0x82, 0xa3, 0xfa, 0x47, 0xc4, 0x8e, 0x0d, 0x8f, 0xcc, 0xfe,
+    0x11, 0xf1, 0x22, 0x33, 0x56, 0xe1, 0xf9, 0x1f, 0x9a, 0x83, 0x79, 0x2d, 0xe3, 0xf5, 0x23, 0xf6,
+    0x50, 0x64, 0x17, 0xce, 0x4f, 0x12, 0x58, 0x5f, 0xe0, 0xc4, 0x32, 0x0d, 0xfc, 0xab, 0xd5, 0x54,
+    0x15, 0x04, 0xfd, 0x91, 0xf1, 0x20, 0x32, 0x0d, 0xe1, 0x48, 0xf8, 0x91, 0xe5, 0x48, 0x09, 0xfc,
+    0xdb, 0x7b, 0xab, 0x84, 0x22, 0x0d, 0xfd, 0x23, 0xda, 0xd1, 0xf2, 0x20, 0x2a, 0x11, 0xfe, 0x23,
+    0xe7, 0x4f, 0x8c, 0x2f, 0x80, 0xe7, 0x1f, 0x09, 0x40, 0x2f, 0x00, 0xee, 0x7f, 0xf5, 0x1f, 0x12,
+    0x3c, 0x0d, 0x40, 0xff, 0xa9, 0xc3, 0x1b, 0x01, 0x42, 0xce, 0x18, 0x5b, 0x52, 0xd9, 0x8a, 0x79,
+    0xa7, 0xbc, 0xc5, 0x01, 0x08, 0x41, 0x21, 0xb5, 0xfc, 0x1b, 0x93, 0x1e, 0x8f, 0x60, 0x02, 0x98,
+    0xf8, 0xe0, 0x0c, 0x1c, 0x2e, 0x15, 0x00, 0xe7, 0x61, 0x08, 0x02, 0xfd, 0x16, 0x5c, 0xdb, 0xf2,
+    0xb8, 0x4f, 0x03, 0xfd, 0x81, 0x8a, 0x88, 0x52, 0x05, 0x20, 0x0e, 0xe9, 0xf9, 0xaa, 0xed, 0x7f,
+    0xbf, 0xd0, 0x0b, 0x0b, 0x42, 0x60, 0x85, 0xa1, 0x3f, 0x0a, 0x0b, 0x42, 0x40, 0x08, 0xa8, 0x02,
+    0x04, 0xa9, 0x60, 0x46, 0x00, 0x45, 0x40, 0x5c, 0xa7, 0xa6, 0xfa, 0x5c, 0x07, 0xf0, 0xe0, 0xa4,
+    0x0f, 0x94, 0xc4, 0x16, 0x82, 0x96, 0x82, 0x94, 0x83, 0x71, 0x76, 0x04, 0x94, 0x8f, 0xa1, 0xf3,
+    0x40, 0x00, 0x93, 0x85, 0xa2, 0x50, 0xc0, 0x00, 0x28, 0x1c, 0xbb, 0x03, 0x09, 0x12, 0x5e, 0x91,
+    0xaf, 0x21, 0x42, 0x05, 0x09, 0x6b, 0xe5, 0x59, 0x27, 0xcf, 0x8f, 0x88, 0x24, 0x00, 0x90, 0x7c,
+    0x60, 0x00, 0x00, 0x17, 0x1a, 0x02, 0x40, 0x2c, 0x03, 0x94, 0x1a, 0xf8, 0x02, 0xa0, 0x80, 0xd2,
+    0x15, 0xf5, 0x64, 0x00, 0xc0, 0x32, 0x01, 0x83, 0xa4, 0xc0, 0x5e, 0xb2, 0x0e, 0x70, 0x9a, 0x7b,
+    0x12, 0x23, 0x35, 0x6f, 0x26, 0x43, 0x7f, 0x40, 0x6a, 0x04, 0xe8, 0x14, 0x04, 0xa4, 0xb3, 0x14,
+    0x81, 0x30, 0x2f, 0x16, 0x84, 0xd0, 0x0c, 0x0b, 0x42, 0x6e, 0x14, 0x00, 0x9a, 0x00, 0x87, 0x76,
+    0x80, 0x07, 0x98, 0x2c, 0x03, 0x99, 0x9c, 0xf3, 0xbb, 0x7f, 0xb8, 0xa4, 0xdb, 0xde, 0xfc, 0x4a,
+    0x00, 0x05, 0xa4, 0xc2, 0x6a, 0xc0, 0xed, 0x3d, 0x15, 0xc1, 0x04, 0xe1, 0x30, 0x2e, 0x2c, 0xf1,
+    0x50, 0x69, 0x84, 0xa9, 0x0f, 0xf8, 0xc2, 0xbe, 0x35, 0xa8, 0x87, 0x50, 0x10, 0x0e, 0x00, 0xe5,
+    0x1e, 0xc6, 0xa9, 0x55, 0xfe, 0xff, 0x48, 0xf5, 0xe0, 0x53, 0xdc, 0x78, 0x80, 0x10, 0x51, 0x89,
+    0x52, 0xc0, 0x06, 0xab, 0x03, 0x14, 0x6f, 0xed, 0x85, 0xde, 0x80, 0x03, 0x09, 0x52, 0xe5, 0xff,
+    0x5e, 0x02, 0xbf, 0x8f, 0x8f, 0xc9, 0xcf, 0xe5, 0xeb, 0xf3, 0x72, 0xbb, 0x80, 0x00, 0xc6, 0x6a,
+    0xd8, 0x08, 0x95, 0xf4, 0xb2, 0xf9, 0x4f, 0xa1, 0xc1, 0xc2, 0x5a, 0xef, 0xf7, 0xfa, 0x81, 0xdd,
+    0xbd, 0xef, 0xee, 0xe0, 0xd1, 0xe5, 0x72, 0xc5, 0xcd, 0xf0, 0x2c, 0x00, 0x03, 0xcb, 0x98, 0xf0,
+    0x7f, 0x52, 0x00                                         
+};
+
+uint8_t decompressed_rd5[] = 
+{
+    0x24, 0x02, 0x03, 0x09, 0x00, 0x20, 0x0c, 0x05, 0x10, 0x01, 0x40, 0x0a, 0xff, 0xff, 0x0c, 0x84, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x0d, 0x38, 0x01, 0xc0, 0x10, 0x01, 0x10, 
+    0x01, 0xcc, 0xff, 0x7f, 0x03, 0x08, 0x00, 0x20, 0x04, 0x05, 0x10, 0x01, 0x40, 0x0a, 0x00, 0x0c, 
+    0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x01, 0x00, 0x00, 0x0d, 0x0a, 
+    0x0c, 0x0c, 0xff, 0x03, 0xff, 0x02, 0x00, 0x04, 0x00, 0x03, 0x06, 0x00, 0x00, 0x80, 0x00, 0x80, 
+    0x00, 0x02, 0x00, 0x00, 0x09, 0x00, 0x0c, 0x80, 0x00, 0x80, 0x00, 0x06, 0x00, 0x00, 0x48, 0x00, 
+    0x37, 0x01, 0x02, 0x00, 0x00, 0x01, 0x0c, 0x48, 0x00, 0x37, 0x01, 0x06, 0x01, 0x00, 0x00, 0x04, 
+    0x24, 0x00, 0x02, 0x01, 0x00, 0x01, 0x0c, 0x00, 0x04, 0x24, 0x00, 0x02, 0x00, 0x00, 0x09, 0x0a, 
+    0x3d, 0x0f, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 
+    0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 
+    0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 
+    0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x09, 0x18, 0xfb, 0x70, 0x06, 0x00, 0x03, 
+    0xff, 0xff, 0x00, 0x03, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x0f, 
+    0x00, 0x01, 0x49, 0x08, 0x07, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00, 0x72, 0x00, 0x19, 
+    0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0xff, 0xff, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 
+    0xf3, 0xf2, 0x0c, 0x08, 0x42, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 
+    0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x10, 0x84, 0x11, 
+    0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x3a, 0x01, 0x09, 0x99, 0xd6, 0x19, 0x18, 0xf0, 0x60, 0x11, 0x01, 
+    0x11, 0x01, 0x01, 0x01, 0x00, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 
+    0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 
+    0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 
+    0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 0x18, 
+    0xf4, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 
+    0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 
+    0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 
+    0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 
+    0x0a, 0x01, 0x09, 0x19, 0x18, 0xf4, 0x20, 0xff, 0xff, 0x00, 0x11, 0x01, 0x11, 0x01, 0x01, 0x11, 
+    0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0xdd, 0x0c, 0xf5, 
+    0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 
+    0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 
+    0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 
+    0x0a, 0x01, 0x09, 0x19, 0x18, 0xf4, 0x60, 0x00, 0x00, 0x00, 0xd0, 0x0e, 0xd0, 0x0e, 0x0e, 0x0b, 
+    0x01, 0x01, 0x43, 0x06, 0x02, 0xfc, 0xfc, 0x00, 0x00, 0x30, 0x00, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 
+    0xf5, 0x04, 0xff, 0xff, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0x08, 
+    0x42, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x99, 0xd6, 0x11, 0x0f, 
+    0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x10, 0x84, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 
+    0x11, 0x3a, 0x01, 0x09, 0x99, 0xd6, 0x19, 0x18, 0xf0, 0x60, 0x11, 0x01, 0x11, 0x01, 0x01, 0x01, 
+    0x01, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 
+    0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 
+    0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 
+    0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 
+    0x00, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 
+    0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 
+    0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 
+    0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 
+    0x18, 0xf4, 0x20, 0xff, 0xff, 0x00, 0x11, 0x01, 0x11, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 
+    0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0xdd, 0x0c, 0xf5, 0x04, 0x08, 0x42, 0x11, 
+    0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 
+    0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 
+    0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 
+    0x18, 0xf4, 0x60, 0x00, 0x00, 0x00, 0xd0, 0x0e, 0xd0, 0x0e, 0x0e, 0x13, 0x02, 0x00, 0x4a, 0x08, 
+    0x09, 0x3f, 0x3f, 0x21, 0xfd, 0xfd, 0x87, 0x84, 0x84, 0xfc, 0x00, 0x00, 0x00, 0x32, 0x00, 0x19, 
+    0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0xff, 0xff, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 
+    0xf3, 0xf2, 0x0c, 0x08, 0x42, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 
+    0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x10, 0x84, 0x11, 
+    0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x3a, 0x01, 0x09, 0x99, 0xd6, 0x19, 0x18, 0xf0, 0x60, 0x11, 0x01, 
+    0x11, 0x01, 0x01, 0x01, 0x02, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 
+    0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 
+    0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 
+    0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 0x18, 
+    0xf4, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 
+    0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 
+    0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 
+    0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 
+    0x0a, 0x01, 0x09, 0x19, 0x18, 0x54, 0x40, 0x00, 0x00, 0x00, 0x10, 0x10, 0x13, 0x03, 0x02, 0x4a, 
+    0x06, 0x09, 0x78, 0xcc, 0xcc, 0x18, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x73, 0x00, 
+    0x19, 0x0a, 0x3f, 0xdd, 0x0c, 0xf5, 0x04, 0xff, 0xff, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 
+    0x3e, 0xf3, 0xf2, 0x0c, 0x08, 0x42, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 
+    0x0b, 0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x10, 0x84, 
+    0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x3a, 0x01, 0x09, 0x99, 0xd6, 0x19, 0x18, 0xf0, 0x60, 0xd1, 
+    0x0f, 0xd1, 0x0f, 0x0f, 0x01, 0x03, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 
+    0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 
+    0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 
+    0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 
+    0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 
+    0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 
+    0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 
+    0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 
+    0x11, 0x0a, 0x01, 0x09, 0x19, 0x18, 0x54, 0x40, 0x00, 0x00, 0x00, 0x10, 0x10, 0x1b, 0x04, 0x00, 
+    0x4a, 0x09, 0x09, 0xff, 0x80, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
+    0x80, 0x80, 0x80, 0xff, 0x80, 0x00, 0x00, 0x31, 0x00, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 
+    0xff, 0xff, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0x08, 0x42, 0x11, 
+    0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0b, 
+    0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x10, 0x84, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x3a, 
+    0x01, 0x09, 0x99, 0xd6, 0x19, 0x18, 0xf0, 0x60, 0x11, 0x01, 0x11, 0x01, 0x01, 0x01, 0x04, 0x19, 
+    0x0a, 0x3f, 0xdd, 0x0c, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0d, 0x0e, 0xf3, 0x11, 0x3e, 
+    0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0b, 
+    0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 0xf4, 0x0a, 0x99, 0xd6, 0x11, 
+    0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 0xcf, 
+    0x0d, 0xcf, 0x0d, 0x0d, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 
+    0x0d, 0x0e, 0xf3, 0x11, 0x3e, 0xf3, 0xf2, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0d, 0xf4, 0x11, 
+    0x3f, 0x0d, 0x01, 0xf3, 0x0b, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0b, 0x0c, 0xf5, 0x11, 0x3e, 0xf5, 
+    0xf4, 0x0a, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0b, 0xf6, 0x11, 0x0a, 0x01, 0x09, 0x19, 0x18, 0xf4, 
+    0x20, 0xff, 0xff, 0x00, 0x11, 0x01, 0x11, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0xee, 0x34, 0x3c, 0x08, 0x2d, 0x09, 0x59, 0x0d, 0x97, 
+    0xff, 0x00, 0x02, 0x70, 0x0d, 0x0e, 0x51, 0xc2, 0x10, 0x20, 0x1c, 0x51, 0xc2, 0x12, 0xe0, 0xd6, 
+    0x51, 0xc2, 0x12, 0x30, 0x1c, 0x19, 0x0a, 0x32, 0x12, 0x10, 0x84, 0x59, 0x0d, 0xc6, 0xcc, 0x12, 
+    0xd0, 0xf2, 0x51, 0xc2, 0x10, 0x20, 0x1c, 0x51, 0xc2, 0x12, 0xe0, 0xd6, 0x51, 0xc2, 0x12, 0x30, 
+    0x1c, 0x19, 0x0a, 0x3f, 0x0a, 0x12, 0xb9, 0xf9, 0x08, 0x42, 0x11, 0x0f, 0xf6, 0x0a, 0x09, 0xf6, 
+    0x11, 0x3e, 0xf6, 0xf7, 0x09, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x08, 0xf7, 0x11, 0x3f, 0x08, 0x01, 
+    0xf8, 0x08, 0x10, 0x84, 0x11, 0x0f, 0xf8, 0x08, 0x07, 0xf8, 0x11, 0x3e, 0xf8, 0xf9, 0x07, 0x99, 
+    0xd6, 0x11, 0x0d, 0x01, 0x06, 0xf9, 0x11, 0x0a, 0x01, 0x06, 0x19, 0x18, 0xf5, 0x60, 0x05, 0x00, 
+    0x00, 0x00, 0xef, 0x5a, 0xec, 0x57, 0x57, 0x0f, 0x00, 0x00, 0x46, 0x06, 0x05, 0xcc, 0x78, 0x30, 
+    0x78, 0xcc, 0x00, 0x00, 0x00, 0x72, 0x00, 0x19, 0x0a, 0x3f, 0x13, 0xfe, 0xfa, 0x04, 0xff, 0xff, 
+    0x11, 0x0f, 0xf6, 0x0a, 0x09, 0xf6, 0x11, 0x3e, 0xf6, 0xf7, 0x09, 0x08, 0x42, 0x11, 0x0d, 0x01, 
+    0x08, 0xf7, 0x11, 0x3f, 0x08, 0x01, 0xf8, 0x08, 0x99, 0xd6, 0x11, 0x0f, 0xf8, 0x08, 0x07, 0xf8, 
+    0x11, 0x3e, 0xf8, 0xf9, 0x07, 0x10, 0x84, 0x11, 0x0d, 0x01, 0x06, 0xf9, 0x11, 0x3a, 0x01, 0x06, 
+    0x99, 0xd6, 0x19, 0x18, 0xf0, 0x60, 0x0c, 0x01, 0x0c, 0x01, 0x01, 0x01, 0x00, 0x19, 0x0a, 0x3f, 
+    0x13, 0xfe, 0xfa, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf6, 0x0a, 0x09, 0xf6, 0x11, 0x3e, 0xf6, 0xf7, 
+    0x09, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x08, 0xf7, 0x11, 0x3f, 0x08, 0x01, 0xf8, 0x08, 0x10, 0x84, 
+    0x11, 0x0f, 0xf8, 0x08, 0x07, 0xf8, 0x11, 0x3e, 0xf8, 0xf9, 0x07, 0x99, 0xd6, 0x11, 0x0d, 0x01, 
+    0x06, 0xf9, 0x11, 0x0a, 0x01, 0x06, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 0x0a, 0xff, 0x0a, 
+    0xff, 0xff, 0x19, 0x0a, 0x3f, 0x13, 0xfe, 0xfa, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf6, 0x0a, 0x09, 
+    0xf6, 0x11, 0x3e, 0xf6, 0xf7, 0x09, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x08, 0xf7, 0x11, 0x3f, 0x08, 
+    0x01, 0xf8, 0x08, 0x10, 0x84, 0x11, 0x0f, 0xf8, 0x08, 0x07, 0xf8, 0x11, 0x3e, 0xf8, 0xf9, 0x07, 
+    0x99, 0xd6, 0x11, 0x0d, 0x01, 0x06, 0xf9, 0x11, 0x0a, 0x01, 0x06, 0x19, 0x18, 0xf4, 0x20, 0xff, 
+    0xff, 0x00, 0x0c, 0x01, 0x0c, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 0xff, 0xff, 
+    0xff, 0xff, 0x19, 0x0a, 0x0f, 0x09, 0xfe, 0x09, 0x09, 0x19, 0x18, 0xf5, 0x60, 0x06, 0xff, 0xff, 
+    0x00, 0x09, 0xfe, 0x12, 0x07, 0x07, 0x23, 0x05, 0x03, 0x4d, 0x0d, 0x0d, 0x00, 0x00, 0x00, 0x08, 
+    0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x88, 0x01, 0x10, 0x02, 0x20, 0x04, 0x40, 0x08, 0x88, 
+    0x11, 0x10, 0x22, 0x20, 0x44, 0x40, 0x00, 0x00, 0x6f, 0x00, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 
+    0x1f, 0x06, 0x04, 0x4c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x60, 0x00, 0xc0, 
+    0x01, 0x90, 0x03, 0x30, 0x06, 0x60, 0x0c, 0xc0, 0x19, 0x90, 0x33, 0x30, 0x66, 0x60, 0x70, 0x00, 
+    0x19, 0x0a, 0x37, 0xe3, 0x10, 0xf1, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 
+    0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 
+    0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 
+    0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x60, 0x00, 0x00, 
+    0x00, 0xd6, 0x12, 0xd2, 0x0e, 0x0e, 0x0f, 0x07, 0x01, 0x48, 0x09, 0x04, 0x08, 0x00, 0x1c, 0x00, 
+    0x3e, 0x00, 0x7f, 0x00, 0x35, 0x00, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x10, 0x84, 0x11, 
+    0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x0e, 0xf1, 0xf2, 0x0e, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 
+    0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x0e, 0xf3, 
+    0xf4, 0x0c, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x0a, 0x01, 0x0b, 0x19, 0x18, 0xf0, 0x60, 0x11, 
+    0x01, 0x11, 0x01, 0x01, 0x01, 0x07, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 
+    0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 
+    0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 
+    0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 
+    0xd6, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 
+    0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 
+    0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 
+    0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 
+    0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x20, 0xff, 0xff, 0x00, 0x11, 
+    0x01, 0x11, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 
+    0x0a, 0x3f, 0xdd, 0x0e, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 
+    0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 
+    0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 
+    0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x60, 0x00, 0x00, 
+    0x00, 0xd0, 0x10, 0xd0, 0x10, 0x10, 0x0f, 0x08, 0x01, 0x48, 0x09, 0x04, 0x7f, 0x00, 0x3e, 0x00, 
+    0x1c, 0x00, 0x08, 0x00, 0x36, 0x00, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x10, 0x84, 0x11, 
+    0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x0e, 0xf1, 0xf2, 0x0e, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 
+    0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x0e, 0xf3, 
+    0xf4, 0x0c, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x0a, 0x01, 0x0b, 0x19, 0x18, 0xf0, 0x60, 0x11, 
+    0x01, 0x11, 0x01, 0x01, 0x01, 0x08, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 
+    0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 
+    0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 
+    0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 
+    0xd6, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 
+    0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 
+    0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 
+    0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 
+    0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x20, 0xff, 0xff, 0x00, 0x11, 
+    0x01, 0x11, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 
+    0x0a, 0x3f, 0xdd, 0x0e, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 
+    0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 
+    0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 
+    0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x60, 0x00, 0x00, 
+    0x00, 0xd0, 0x10, 0xd0, 0x10, 0x10, 0x13, 0x09, 0x04, 0x4b, 0x04, 0x09, 0x00, 0x80, 0xc0, 0xe0, 
+    0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 
+    0x04, 0x10, 0x84, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x0e, 0xf1, 0xf2, 0x0e, 0x11, 0x0d, 
+    0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x99, 0xd6, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 
+    0xf3, 0x11, 0x0e, 0xf3, 0xf4, 0x0c, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x0a, 0x01, 0x0b, 0x19, 
+    0x18, 0xf0, 0x60, 0x11, 0x01, 0x11, 0x01, 0x01, 0x01, 0x09, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 
+    0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 0x0e, 0x99, 0xd6, 
+    0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 0x11, 0x0f, 0xf3, 
+    0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 
+    0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 
+    0xff, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 
+    0x11, 0x3e, 0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 
+    0xf3, 0x0d, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 
+    0xff, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x20, 
+    0xff, 0xff, 0x00, 0x11, 0x01, 0x11, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 0xff, 
+    0xff, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0xdd, 0x0e, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 
+    0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 
+    0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 
+    0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 
+    0xf4, 0x60, 0x00, 0x00, 0x00, 0xd0, 0x10, 0xd0, 0x10, 0x10, 0x13, 0x0a, 0x03, 0x4b, 0x04, 0x09, 
+    0x00, 0x10, 0x30, 0x70, 0xf0, 0x70, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x19, 0x0a, 
+    0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x10, 0x84, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x0e, 0xf1, 
+    0xf2, 0x0e, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x99, 0xd6, 0x11, 
+    0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x0e, 0xf3, 0xf4, 0x0c, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 
+    0x0a, 0x01, 0x0b, 0x19, 0x18, 0xf0, 0x60, 0x11, 0x01, 0x11, 0x01, 0x01, 0x01, 0x0a, 0x19, 0x0a, 
+    0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 
+    0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 
+    0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 
+    0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 0x19, 0x18, 0xf4, 0x20, 0x10, 0x00, 0x00, 
+    0x0f, 0xff, 0x0f, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0x1d, 0xfe, 0xf5, 0x04, 0x08, 0x42, 0x11, 0x0f, 
+    0xf1, 0x0f, 0x0e, 0xf1, 0x11, 0x3e, 0xf1, 0xf2, 0x0e, 0x99, 0xd6, 0x11, 0x0d, 0x01, 0x0d, 0xf2, 
+    0x11, 0x3f, 0x0d, 0x01, 0xf3, 0x0d, 0x10, 0x84, 0x11, 0x0f, 0xf3, 0x0d, 0x0c, 0xf3, 0x11, 0x3e, 
+    0xf3, 0xf4, 0x0c, 0xff, 0xff, 0x11, 0x0d, 0x01, 0x0b, 0xf4, 0x11, 0x3a, 0x01, 0x0b, 0x99, 0xd6, 
+    0x19, 0x18, 0xf4, 0x20, 0xff, 0xff, 0x00, 0x11, 0x01, 0x11, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 
+    0x84, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0xce, 0x0e, 0x01, 0x01, 0xff, 0xff, 
+    0x1d, 0x18, 0xf4, 0x60, 0x0e, 0xe2, 0x00, 0x0b, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x0e, 
+    0xce, 0x0f, 0x0f, 0x13, 0x0b, 0x04, 0x4b, 0x04, 0x09, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xe0, 0xc0, 
+    0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x19, 0x0a, 0x01, 0x0d, 0x19, 0x18, 0x50, 0x40, 0x0d, 
+    0x0d, 0x0f, 0x0c, 0x03, 0x4a, 0x07, 0x08, 0x00, 0x02, 0x06, 0x8e, 0xdc, 0xf8, 0x70, 0x20, 0x61, 
+    0x00, 0x19, 0x0a, 0x01, 0x0d, 0x19, 0x18, 0x50, 0x40, 0x0d, 0x0d, 0x0f, 0x0d, 0x04, 0x4a, 0x06, 
+    0x06, 0x78, 0xfc, 0xfc, 0xfc, 0xfc, 0x78, 0x00, 0x00, 0x68, 0x00, 0x19, 0x0a, 0x3d, 0x0d, 0x02, 
+    0x02, 0x99, 0xd6, 0x19, 0x18, 0xd0, 0x60, 0x0e, 0x10, 0x02, 0x02, 0x13, 0x0e, 0x02, 0x4a, 0x0b, 
+    0x05, 0x04, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x3f, 0x80, 0x7f, 0xc0, 0x00, 0x00, 0x35, 0x00, 0x19, 
+    0x0a, 0x01, 0x0f, 0x19, 0x18, 0x54, 0x40, 0x10, 0x00, 0x00, 0x0f, 0x0f, 0x01, 0x0e, 0x19, 0x0a, 
+    0x03, 0xca, 0x0f, 0x19, 0x18, 0xf4, 0x20, 0xff, 0xff, 0x00, 0xcb, 0x10, 0xcb, 0x10, 0x10, 0x11, 
+    0xf4, 0x20, 0x10, 0x84, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x0a, 0x01, 0x0f, 0x19, 0x18, 
+    0x54, 0x40, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x13, 0x0f, 0x02, 0x4a, 0x0b, 0x05, 0x7f, 0xc0, 0x3f, 
+    0x80, 0x1f, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0x00, 0x19, 0x0a, 0x01, 0x0f, 0x19, 
+    0x18, 0x54, 0x40, 0x10, 0x00, 0x00, 0x0f, 0x0f, 0x01, 0x0f, 0x19, 0x0a, 0x01, 0x0f, 0x19, 0x18, 
+    0xf4, 0x20, 0xff, 0xff, 0x00, 0x10, 0x01, 0x10, 0x01, 0x01, 0x11, 0xf4, 0x20, 0x10, 0x84, 0x00, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x0a, 0x3f, 0xd3, 0x0f, 0xfe, 0xfe, 0xff, 0xff, 0x19, 0x18, 
+    0xf4, 0x60, 0x00, 0x00, 0x00, 0xd3, 0x0f, 0xd1, 0x0d, 0x0d, 0x1b, 0x10, 0x02, 0x4c, 0x0a, 0x0a, 
+    0x1e, 0x00, 0x7f, 0x80, 0x7f, 0x80, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0xff, 0xc0, 0x7f, 0x80, 
+    0x7f, 0x80, 0x1e, 0x00, 0x6e, 0x00, 0x11, 0x00, 0x40, 0x17, 0x11, 0x03, 0x4a, 0x09, 0x08, 0x01, 
+    0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0xc3, 0x00, 0x3c, 0x00, 0x6d, 
+    0x00, 0x11, 0x00, 0x40, 0x17, 0x12, 0x02, 0x4c, 0x09, 0x08, 0x1e, 0x00, 0x61, 0x80, 0x40, 0x00, 
+    0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x6c, 0x00, 0x11, 0x00, 0x40, 0x1b, 
+    0x13, 0x03, 0x4b, 0x0a, 0x0a, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 
+    0x40, 0x00, 0x80, 0x00, 0x80, 0xc3, 0x00, 0x3c, 0x00, 0x6b, 0x00, 0x11, 0x00, 0x40, 0x1b, 0x14, 
+    0x01, 0x4d, 0x0a, 0x0a, 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 
+    0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x6a, 0x00, 0x11, 0x54, 0x40, 0xff, 0xff, 0x00, 
+    0x0d, 0x0d, 0x1b, 0x15, 0x02, 0x4b, 0x09, 0x09, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 
+    0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0xff, 0x80, 0x00, 0x00, 0x67, 0x00, 0x11, 0x04, 
+    0x40, 0x99, 0xd6, 0x00, 0x1f, 0x16, 0x01, 0x4c, 0x0b, 0x0b, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
+    0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0xff, 0xe0, 
+    0x00, 0x00, 0x66, 0x00, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x1b, 0x17, 0x01, 0x4c, 0x0a, 0x0a, 
+    0xff, 0xc0, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 
+    0x80, 0x00, 0x80, 0x00, 0x65, 0x00, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 0x23, 0x18, 0x00, 0x4d, 
+    0x0d, 0x0d, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 
+    0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0xff, 0xf8, 0x00, 0x00, 0x64, 0x00, 
+    0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x1f, 0x19, 0x00, 0x4d, 0x0c, 0x0c, 0xff, 0xf0, 0x80, 0x00, 
+    0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 
+    0x80, 0x00, 0x80, 0x00, 0x63, 0x00, 0x11, 0x54, 0x40, 0xff, 0xff, 0x00, 0x0d, 0x0d, 0x01, 0x15, 
+    0x11, 0x04, 0x40, 0x99, 0xd6, 0x00, 0x01, 0x16, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x17, 
+    0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 0x01, 0x18, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x19, 
+    0x11, 0x04, 0x40, 0x00, 0x00, 0x00, 0x0f, 0x1a, 0x03, 0x4b, 0x07, 0x08, 0x00, 0x02, 0x06, 0x8e, 
+    0xdc, 0xf8, 0x70, 0x20, 0x62, 0x00, 0x11, 0x54, 0x40, 0x99, 0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x15, 
+    0x11, 0x00, 0x40, 0x01, 0x16, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x17, 0x11, 0x04, 0x40, 
+    0xff, 0xff, 0x00, 0x01, 0x18, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x19, 0x11, 0x54, 0x40, 
+    0x99, 0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x15, 0x11, 0x00, 0x40, 0x01, 0x16, 0x11, 0x04, 0x40, 0x08, 
+    0x42, 0x00, 0x01, 0x17, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 0x01, 0x18, 0x11, 0x04, 0x40, 0x10, 
+    0x84, 0x00, 0x01, 0x19, 0x11, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1a, 0x11, 0xf4, 0x60, 0x99, 
+    0xd6, 0x00, 0xcc, 0x0d, 0xcc, 0x0d, 0x0d, 0x01, 0x15, 0x11, 0x00, 0x40, 0x01, 0x16, 0x11, 0x04, 
+    0x40, 0x08, 0x42, 0x00, 0x01, 0x17, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 0x01, 0x18, 0x11, 0x04, 
+    0x40, 0x10, 0x84, 0x00, 0x01, 0x19, 0x11, 0x00, 0x40, 0x01, 0x1a, 0x19, 0x0a, 0x33, 0x0d, 0x0d, 
+    0x00, 0x00, 0x19, 0x18, 0x54, 0x40, 0xff, 0xff, 0x00, 0x0d, 0x0d, 0x01, 0x10, 0x11, 0x04, 0x40, 
+    0x99, 0xd6, 0x00, 0x01, 0x11, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x12, 0x11, 0x04, 0x40, 
+    0xff, 0xff, 0x00, 0x01, 0x13, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x14, 0x19, 0x0a, 0x01, 
+    0x0d, 0x19, 0x18, 0x54, 0x40, 0xff, 0xff, 0x00, 0x0d, 0x0d, 0x01, 0x10, 0x11, 0x04, 0x40, 0x99, 
+    0xd6, 0x00, 0x01, 0x11, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x12, 0x11, 0x04, 0x40, 0xff, 
+    0xff, 0x00, 0x01, 0x13, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x14, 0x11, 0x04, 0x40, 0x00, 
+    0x00, 0x00, 0x0b, 0x1b, 0x05, 0x49, 0x04, 0x04, 0x60, 0xf0, 0xf0, 0x60, 0x69, 0x00, 0x19, 0x0a, 
+    0x01, 0x0d, 0x19, 0x18, 0x54, 0x40, 0x99, 0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x10, 0x11, 0x00, 0x40, 
+    0x01, 0x11, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x12, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 
+    0x01, 0x13, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x14, 0x19, 0x0a, 0x01, 0x0d, 0x19, 0x18, 
+    0x54, 0x40, 0x99, 0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x10, 0x11, 0x00, 0x40, 0x01, 0x11, 0x11, 0x04, 
+    0x40, 0x08, 0x42, 0x00, 0x01, 0x12, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 0x01, 0x13, 0x11, 0x04, 
+    0x40, 0x10, 0x84, 0x00, 0x01, 0x14, 0x11, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x1b, 0x19, 0x0a, 
+    0x03, 0xcc, 0x0d, 0x19, 0x18, 0xf4, 0x60, 0x99, 0xd6, 0x00, 0xcc, 0x0d, 0xcc, 0x0d, 0x0d, 0x01, 
+    0x10, 0x11, 0x00, 0x40, 0x01, 0x11, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x12, 0x11, 0x04, 
+    0x40, 0xff, 0xff, 0x00, 0x01, 0x13, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x14, 0x11, 0x00, 
+    0x40, 0x01, 0x1b, 0x03, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x08, 0x08, 0x81, 0x08, 0xaa, 
+    0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0x09, 0x01, 0x7f, 0x02, 0x0d, 0x00, 0x1a, 0x01, 0x0d, 
+    0x00, 0x0d, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x99, 0xd6, 0x00, 0x81, 0x19, 0x18, 0x54, 0x40, 0x99, 
+    0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x16, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x17, 0x11, 0x04, 
+    0x40, 0xff, 0xff, 0x00, 0x01, 0x18, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x19, 0x11, 0x00, 
+    0x40, 0x01, 0x1a, 0x11, 0x54, 0x40, 0x99, 0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x15, 0x11, 0x00, 0x40, 
+    0x01, 0x16, 0x11, 0x04, 0x40, 0x08, 0x42, 0x00, 0x01, 0x17, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 
+    0x01, 0x18, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x01, 0x19, 0x11, 0x00, 0x40, 0x01, 0x1a, 0x11, 
+    0x54, 0x40, 0x99, 0xd6, 0x00, 0x0d, 0x0d, 0x01, 0x15, 0x11, 0x00, 0x40, 0x01, 0x16, 0x11, 0x04, 
+    0x40, 0x08, 0x42, 0x00, 0x01, 0x17, 0x11, 0x04, 0x40, 0xff, 0xff, 0x00, 0x01, 0x18, 0x11, 0x04, 
+    0x40, 0x10, 0x84, 0x00, 0x01, 0x19, 0x11, 0x00, 0x40, 0x01, 0x1a, 0x19, 0x0a, 0x31, 0x34, 0xff, 
+    0xff, 0x19, 0x18, 0x54, 0x40, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x1b, 0x1c, 0x02, 0x4b, 0x09, 0x09, 
+    0xc1, 0x80, 0xe3, 0x80, 0x77, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x3e, 0x00, 0x77, 0x00, 0xe3, 0x80, 
+    0xc1, 0x80, 0x00, 0x00, 0x72, 0x00, 0x19, 0x0a, 0x03, 0xcc, 0x0d, 0x1d, 0x18, 0xf0, 0x60, 0xa0, 
+    0x45, 0x45, 0xcc, 0x0d, 0xcc, 0x0d, 0x0d, 0x1b, 0x1d, 0x01, 0x4b, 0x0a, 0x09, 0x3f, 0xc0, 0x3f, 
+    0xc0, 0x20, 0x40, 0xff, 0x40, 0xff, 0x40, 0x81, 0xc0, 0x81, 0x00, 0x81, 0x00, 0xff, 0x00, 0x00, 
+    0x00, 0x32, 0x00, 0x19, 0x0a, 0x01, 0x0d, 0x19, 0x18, 0x50, 0x40, 0x0d, 0x0d, 0x1b, 0x1e, 0x01, 
+    0x4c, 0x0a, 0x0a, 0xff, 0xc0, 0xff, 0xc0, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 
+    0x40, 0x80, 0x40, 0x80, 0x40, 0xff, 0xc0, 0x31, 0x00, 0x19, 0x0a, 0x01, 0x0d, 0x19, 0x18, 0x50, 
+    0x40, 0x0d, 0x0d, 0x0b, 0x1f, 0x02, 0x44, 0x07, 0x02, 0xfe, 0xfe, 0x00, 0x00, 0x30, 0x00, 0x19, 
+    0x0a, 0x3d, 0x0d, 0x03, 0x03, 0x99, 0xd6, 0x19, 0x18, 0xd4, 0x60, 0xff, 0xff, 0x00, 0x0e, 0x11, 
+    0x03, 0x03, 0x23, 0x20, 0x00, 0x4d, 0x0d, 0x0d, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 
+    0x10, 0x00, 0x88, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x88, 0x80, 0x44, 0x40, 0x22, 0x20, 
+    0x11, 0x10, 0x00, 0x00, 0x78, 0x00, 0x11, 0x04, 0x40, 0x10, 0x84, 0x00, 0x1f, 0x21, 0x00, 0x4c, 
+    0x0c, 0x0c, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x98, 0x00, 0xcc, 0x00, 
+    0x66, 0x00, 0x33, 0x00, 0x99, 0x80, 0xcc, 0xc0, 0x66, 0x60, 0x79, 0x00, 0x19, 0x0a, 0x3d, 0x10, 
+    0xfd, 0xfd, 0xff, 0xff, 0x19, 0x18, 0xd4, 0x60, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0xfd, 0xfd, 0x13, 
+    0x22, 0x05, 0x4b, 0x04, 0x09, 0x00, 0x10, 0x30, 0x70, 0xf0, 0x70, 0x30, 0x10, 0x00, 0x00, 0x00, 
+    0x00, 0x77, 0x00, 0x02, 0xff, 0xff, 0x0d, 0x0a, 0x3f, 0x0e, 0x00, 0x00, 0xff, 0x03, 0xff, 0x02, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x06, 0x02, 0x00, 0x48, 0x00, 0x37, 
+    0x01, 0x02, 0x02, 0x00, 0x09, 0x00, 0x0c, 0x48, 0x00, 0x37, 0x01, 0x03, 0xcf, 0x04, 0xa2, 0x0c, 
+    0x05, 0x40, 0x44, 0xd1, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 
+    0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 
+    0x99, 0xd6, 0x99, 0xd6, 0x10, 0x84, 0x08, 0x42, 0xff, 0xff, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x84, 
+    0xff, 0xff, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x84, 
+    0xff, 0xff, 0x99, 0xd6, 0x10, 0x84, 0x08, 0x42, 0x1c, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x75, 0xc6, 0x66, 0x29, 0x00, 0x09, 0x68, 0x10, 0x00, 0x08, 0x68, 0x10, 0x84, 
+    0x00, 0x20, 0x00, 0x07, 0x6b, 0x99, 0xd6, 0x05, 0x6b, 0x99, 0xd6, 0x00, 0x03, 0x6e, 0xff, 0xff, 
+    0x02, 0x6e, 0xff, 0xff, 0x00, 0x10, 0xc0, 0x00, 0xf7, 0xbd, 0x01, 0xc0, 0x00, 0x08, 0x42, 0xc0, 
+    0x00, 0xff, 0xff, 0x81, 0x08, 0x42, 0xce, 0x66, 0x29, 0x01, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0xfd, 
+    0x2e, 0x01, 0x81, 0x08, 0x42, 0xce, 0x66, 0x29, 0x02, 0x81, 0x10, 0x84, 0x06, 0x82, 0x00, 0x00, 
+    0x00, 0x00, 0x07, 0xcd, 0x89, 0x52, 0x03, 0x2d, 0x03, 0x83, 0x10, 0x84, 0x99, 0xd6, 0x99, 0xd6, 
+    0xc9, 0x99, 0xd6, 0x1a, 0x82, 0x10, 0x00, 0x10, 0x00, 0x0a, 0x29, 0x09, 0x27, 0x0c, 0x67, 0x99, 
+    0xd6, 0x15, 0x27, 0x1d, 0x82, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x67, 0x99, 0xd6, 0x00, 0x19, 0xd0, 
+    0x30, 0x89, 0xd6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x99, 0xd6, 0x05, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x83, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xd8, 0x89, 
+    0xd6, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x83, 0x99, 0xd6, 0x10, 0x00, 0x10, 
+    0x00, 0x1a, 0x68, 0x00, 0x00, 0x09, 0x86, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x99, 0xd6, 0x18, 0x68, 0x00, 0x00, 0x1b, 0x68, 0x99, 0xd6, 0x06, 0x86, 0x99, 0xd6, 0x10, 
+    0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x99, 0xd6, 0x19, 0x6b, 0x99, 0xd6, 0x03, 0xcc, 0x89, 
+    0x52, 0x08, 0x68, 0x99, 0xd6, 0x05, 0x6b, 0x99, 0xd6, 0x04, 0x2c, 0x03, 0x6e, 0x08, 0x42, 0x02, 
+    0x6e, 0xff, 0xff, 0x02, 0x6e, 0xff, 0xff, 0x02, 0x6e, 0x08, 0x42, 0x10, 0x81, 0x08, 0x42, 0x70, 
+    0xff, 0xff, 0x60, 0x00, 0x08, 0x42, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0x81, 0x08, 0x42, 0xce, 0x66, 
+    0x29, 0x01, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0xfd, 0x2e, 0x02, 0xcd, 0x89, 0x52, 0x03, 0x89, 0x10, 
+    0x84, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x07, 0x2d, 0x03, 0x2d, 0x05, 0xc6, 0x99, 0xd6, 0x0c, 0x84, 0x99, 0xd6, 0x99, 0xd6, 0x99, 
+    0xd6, 0x99, 0xd6, 0x0a, 0xc6, 0x89, 0xd6, 0x0e, 0x82, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x84, 0x99, 
+    0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x1c, 0x40, 0x35, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0xd0, 0x4e, 0x99, 0xd6, 0x03, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x78, 0x01, 0x00, 0x82, 
+    0x10, 0x00, 0x10, 0x00, 0x0c, 0x40, 0x2c, 0x03, 0xe0, 0x05, 0x00, 0x00, 0x00, 0xd6, 0x89, 0xd6, 
+    0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x4e, 0x99, 0xd6, 0x3b, 0x00, 0x00, 0x00, 0x28, 0x80, 
+    0x1d, 0x00, 0x78, 0x00, 0x86, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x99, 
+    0xd6, 0x0c, 0x85, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x40, 0x2b, 0x01, 
+    0xf0, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x89, 0xd6, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x99, 
+    0xd6, 0x16, 0x86, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x0a, 
+    0x69, 0x99, 0xd6, 0x04, 0xcc, 0x89, 0x52, 0x07, 0x69, 0x99, 0xd6, 0x08, 0x68, 0x99, 0xd6, 0x03, 
+    0x6e, 0xff, 0xff, 0x02, 0x6e, 0x08, 0x42, 0x02, 0x6e, 0xff, 0xff, 0x02, 0x6e, 0xff, 0xff, 0x01, 
+    0x70, 0x08, 0x42, 0x70, 0xff, 0xff, 0x60, 0x00, 0x08, 0x42, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0x81, 
+    0x08, 0x42, 0xce, 0x66, 0x29, 0x01, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0xfd, 0x2e, 0x02, 0xcd, 0x89, 
+    0x52, 0x03, 0x8a, 0x10, 0x84, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2d, 0x03, 0x8d, 0x99, 0xd6, 0x99, 0xd6, 0x99, 
+    0xd6, 0x99, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 
+    0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x06, 0xc6, 0x99, 0xd6, 0x1a, 0xc6, 0x89, 0xd6, 0x0a, 0x66, 0x10, 
+    0x84, 0x1b, 0x6a, 0x99, 0xd6, 0x1b, 0x81, 0x99, 0xd6, 0x09, 0x6a, 0x99, 0xd6, 0x16, 0x6a, 0x99, 
+    0xd6, 0x06, 0x6a, 0x99, 0xd6, 0xf0, 0x94, 0x01, 0xcc, 0x89, 0x52, 0x00, 0x03, 0x6e, 0xff, 0xff, 
+    0x02, 0x6e, 0x08, 0x42, 0x02, 0x6e, 0xff, 0xff, 0x02, 0x6e, 0xff, 0xff, 0x01, 0x70, 0x08, 0x42, 
+    0x70, 0xff, 0xff, 0x60, 0x00, 0x08, 0x42, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0x81, 0x08, 0x42, 0xce, 
+    0x66, 0x29, 0x01, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0xfd, 0x2e, 0x02, 0xcd, 0x89, 0x52, 0x03, 0x10, 
+    0x2d, 0x03, 0x2d, 0x17, 0x88, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 
+    0xd6, 0x00, 0x00, 0x00, 0x00, 0x18, 0x88, 0xff, 0xff, 0xff, 0xff, 0x99, 0xd6, 0x99, 0xd6, 0x99, 
+    0xd6, 0x99, 0xd6, 0xff, 0xff, 0xff, 0xff, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 
+    0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x09, 0x88, 0x99, 0xd6, 0x00, 0x00, 0x00, 
+    0x00, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x07, 0x88, 0x10, 0x00, 0x10, 
+    0x00, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 0x10, 0x00, 0x08, 0x89, 0x10, 
+    0x84, 0x10, 0x84, 0xff, 0xff, 0xff, 0xff, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x84, 0x10, 0x84, 0x99, 
+    0xd6, 0x07, 0x88, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 
+    0x00, 0x99, 0xd6, 0x0a, 0x86, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 
+    0xd6, 0x08, 0x88, 0x99, 0xd6, 0x10, 0x00, 0x10, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 0x10, 
+    0x00, 0x99, 0xd6, 0x08, 0x88, 0x99, 0xd6, 0x10, 0x84, 0x10, 0x84, 0xff, 0xff, 0xff, 0xff, 0x10, 
+    0x84, 0x10, 0x84, 0x99, 0xd6, 0x09, 0x86, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x99, 0xd6, 0x0c, 0x84, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x0a, 0x86, 0x99, 
+    0xd6, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x99, 0xd6, 0x0a, 0x86, 0x99, 0xd6, 0x10, 
+    0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x99, 0xd6, 0x0b, 0x84, 0x99, 0xd6, 0x00, 0x00, 0x00, 
+    0x00, 0x99, 0xd6, 0x0d, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x84, 0x99, 
+    0xd6, 0x10, 0x00, 0x10, 0x00, 0x99, 0xd6, 0x0c, 0x85, 0x99, 0xd6, 0x10, 0x84, 0x10, 0x84, 0xff, 
+    0xff, 0xff, 0xff, 0x0b, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x86, 0x00, 
+    0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x84, 0x10, 0x00, 0x10, 
+    0x00, 0x10, 0x00, 0x10, 0x00, 0x0c, 0x86, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, 0xff, 
+    0xff, 0xff, 0xff, 0x09, 0x86, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x00, 0x00, 0x00, 
+    0x00, 0x0a, 0x88, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x00, 
+    0x00, 0x00, 0x00, 0x08, 0x86, 0x10, 0x00, 0x10, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 0x10, 
+    0x00, 0x0a, 0x88, 0x10, 0x84, 0x10, 0x84, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x84, 0x10, 0x84, 0xff, 
+    0xff, 0xff, 0xff, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 
+    0xd6, 0x00, 0x00, 0x00, 0x00, 0x09, 0x6a, 0x99, 0xd6, 0x05, 0x88, 0x10, 0x00, 0x10, 0x00, 0x99, 
+    0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x00, 0x10, 0x00, 0x08, 0x89, 0x10, 0x84, 0x10, 
+    0x84, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x10, 0x84, 0x10, 0x84, 0x99, 0xd6, 0x07, 
+    0x6a, 0x99, 0xd6, 0x16, 0x6a, 0x99, 0xd6, 0x06, 0x6a, 0x99, 0xd6, 0x14, 0x2c, 0x00, 0x03, 0x6e, 
+    0xff, 0xff, 0x02, 0x6e, 0x08, 0x42, 0x02, 0x6e, 0xff, 0xff, 0x02, 0xcb, 0x66, 0x29, 0x84, 0xff, 
+    0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x42, 0x09, 0x0d, 0xdf, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x03, 0x15, 0x00, 0xa2, 0x0c, 
+    0x05, 0x40, 0x40, 0x17, 0xff, 0xff, 0x00, 0x1c, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0xf0, 0xbc, 0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x0a, 0x40, 
+    0xc8, 0x03, 0xf4, 0x00, 0xa2, 0x0c, 0x05, 0x40, 0x40, 0xf6, 0xff, 0xff, 0xc0, 0x2c, 0x2d, 0x09, 
+    0x84, 0x2d, 0x09, 0x2d, 0x09, 0x2d, 0x09, 0x2d, 0x09, 0x00, 0x22, 0xc0, 0x10, 0x25, 0x4b, 0x02, 
+    0x30, 0x02, 0x2a, 0x02, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0xfd, 0x2e, 0x03, 0xfd, 0x2e, 0x03, 0xfd, 
+    0x29, 0x03, 0xcd, 0x89, 0x52, 0x03, 0x2d, 0x05, 0x2d, 0x05, 0x29, 0x06, 0xc6, 0x99, 0xd6, 0x09, 
+    0x29, 0x1f, 0x43, 0x03, 0x00, 0x00, 0x01, 0x27, 0x0b, 0x44, 0xc3, 0x00, 0x00, 0xc0, 0x68, 0x99, 
+    0xd6, 0x18, 0x48, 0xa5, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc2, 0x5a, 0x00, 0x60, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xa0, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x81, 0x99, 0xd6, 0x48, 0x05, 0x80, 0x05, 0x00, 0x00, 0xfc, 
+    0x01, 0x50, 0x40, 0x69, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x80, 0x06, 0x00, 
+    0x00, 0x02, 0x6a, 0x99, 0xd6, 0x1c, 0x86, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0x2d, 
+    0x09, 0x2d, 0x09, 0x6f, 0xff, 0xff, 0x02, 0x6e, 0xff, 0xff, 0x04, 0x6e, 0xff, 0xff, 0x04, 0xc9, 
+    0x66, 0x29, 0x02, 0x60, 0x5e, 0x2d, 0x09, 0xc0, 0x30, 0x2d, 0x09, 0xf0, 0xc0, 0x09, 0xc0, 0x10, 
+    0x08, 0x42, 0x00, 0x00, 0xfd, 0xce, 0x18, 0xc6, 0x01, 0xfd, 0x2e, 0x00, 0x02, 0xcd, 0x89, 0x52, 
+    0x03, 0x83, 0x99, 0xd6, 0x99, 0xd6, 0x99, 0xd6, 0xc9, 0xef, 0x7b, 0x81, 0x99, 0xd6, 0x00, 0x05, 
+    0xc9, 0x89, 0xd6, 0x07, 0x69, 0x10, 0x84, 0x00, 0x08, 0x27, 0x09, 0x82, 0xff, 0xff, 0x99, 0xd6, 
+    0xd0, 0x69, 0x89, 0x52, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x51, 0x0e, 0xc0, 0x40, 0x38, 0x03, 0xa8, 0x00, 0xa2, 0x0c, 0x05, 0x40, 0x40, 0xaa, 
+    0xff, 0xff, 0xc8, 0x2d, 0x09, 0x00, 0x14, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x20, 0xc6, 0x25, 0x4b, 0x00, 0x1a, 0xd8, 0x18, 0xc6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0xf7, 0xc0, 0x01, 0x89, 0x52, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 
+    0x00, 0x01, 0x99, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3b, 0xef, 
+    0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x2d, 0x09, 0x00, 0x58, 0xf3, 0x7c, 
+    0x0b, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x0a, 0x40, 0xc8, 
+};
+
+int init_mppc_suite(void)
+{
+       return 0;
+}
+
+int clean_mppc_suite(void)
+{
+       return 0;
+}
+
+int add_mppc_suite(void)
+{
+       add_test_suite(mppc);
+       add_test_function(mppc);
+       return 0;
+}
+
+void test_mppc(void)
+{
+    rdpRdp rdp;
+    struct rdp_mppc rmppc;
+    uint32_t roff;
+    uint32_t rlen;
+    long int dur;
+
+    struct timeval start_time;
+    struct timeval end_time;
+
+    rdp.mppc = &rmppc;
+    rdp.mppc->history_buf = calloc(1, RDP6_HISTORY_BUF_SIZE);
+    CU_ASSERT(rdp.mppc->history_buf != NULL)
+    rdp.mppc->history_ptr = rdp.mppc->history_buf;
+
+
+    /* save starting time */
+    gettimeofday(&start_time, NULL);
+
+    /* uncompress data */
+    CU_ASSERT(decompress_rdp_5(&rdp, compressed_rd5, sizeof(compressed_rd5), 
+        PACKET_COMPRESSED, &roff, &rlen) == true);
+
+    /* get end time */
+    gettimeofday(&end_time, NULL);
+
+    CU_ASSERT(memcmp(decompressed_rd5, rdp.mppc->history_buf, sizeof(decompressed_rd5)) == 0);
+    free(rdp.mppc->history_buf);
+
+    /* print time taken */
+    dur = ((end_time.tv_sec - start_time.tv_sec) * 1000000) + (end_time.tv_usec - start_time.tv_usec);
+    //printf("test_mppc: decompressed data in %ld micro seconds\n", dur);
+}
+
diff --git a/cunit/test_mppc.h b/cunit/test_mppc.h
new file mode 100644 (file)
index 0000000..9059dbb
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Microsoft Point to Point compression (MPPC) Unit Tests
+ *
+ * Copyright 2011 Laxmikant Rashinkar <LK.Rashinkar@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_mppc_suite(void);
+int clean_mppc_suite(void);
+int add_mppc_suite(void);
+
+void test_mppc(void);
diff --git a/cunit/test_orders.c b/cunit/test_orders.c
new file mode 100644 (file)
index 0000000..6ae8bfd
--- /dev/null
@@ -0,0 +1,772 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Drawing Orders Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_orders.h"
+#include "libfreerdp-core/orders.h"
+#include "libfreerdp-core/update.h"
+
+ORDER_INFO* orderInfo;
+
+int init_orders_suite(void)
+{
+       orderInfo = (ORDER_INFO*) malloc(sizeof(ORDER_INFO));
+       return 0;
+}
+
+int clean_orders_suite(void)
+{
+       free(orderInfo);
+       return 0;
+}
+
+int add_orders_suite(void)
+{
+       add_test_suite(orders);
+
+       add_test_function(read_dstblt_order);
+       add_test_function(read_patblt_order);
+       add_test_function(read_scrblt_order);
+       add_test_function(read_opaque_rect_order);
+       add_test_function(read_draw_nine_grid_order);
+       add_test_function(read_multi_opaque_rect_order);
+       add_test_function(read_line_to_order);
+       add_test_function(read_polyline_order);
+       add_test_function(read_glyph_index_order);
+       add_test_function(read_fast_index_order);
+       add_test_function(read_fast_glyph_order);
+       add_test_function(read_polygon_cb_order);
+
+       add_test_function(read_cache_bitmap_order);
+       add_test_function(read_cache_bitmap_v2_order);
+       add_test_function(read_cache_bitmap_v3_order);
+       add_test_function(read_cache_brush_order);
+
+       add_test_function(read_create_offscreen_bitmap_order);
+       add_test_function(read_switch_surface_order);
+
+       add_test_function(update_recv_orders);
+
+       return 0;
+}
+
+uint8 dstblt_order[] = "\x48\x00\x37\x01";
+
+void test_read_dstblt_order(void)
+{
+       STREAM _s, *s;
+       DSTBLT_ORDER dstblt;
+
+       s = &_s;
+       s->p = s->data = dstblt_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x0C;
+       memset(&dstblt, 0, sizeof(DSTBLT_ORDER));
+
+       update_read_dstblt_order(s, orderInfo, &dstblt);
+
+       CU_ASSERT(dstblt.nLeftRect == 0);
+       CU_ASSERT(dstblt.nTopRect == 0);
+       CU_ASSERT(dstblt.nWidth == 72);
+       CU_ASSERT(dstblt.nHeight == 311);
+       CU_ASSERT(dstblt.bRop == 0);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(dstblt_order) - 1));
+}
+
+uint8 patblt_order[] = "\x1a\x00\xc3\x01\x0d\x00\x0d\x00\xf0\xff\xff\x00\x5b\xef\x00\x81";
+
+void test_read_patblt_order(void)
+{
+       STREAM _s, *s;
+       PATBLT_ORDER patblt;
+
+       s = &_s;
+       s->p = s->data = patblt_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x027F;
+       memset(&patblt, 0, sizeof(PATBLT_ORDER));
+
+       update_read_patblt_order(s, orderInfo, &patblt);
+
+       CU_ASSERT(patblt.nLeftRect == 26);
+       CU_ASSERT(patblt.nTopRect == 451);
+       CU_ASSERT(patblt.nWidth == 13);
+       CU_ASSERT(patblt.nHeight == 13);
+       CU_ASSERT(patblt.bRop == 240);
+       CU_ASSERT(patblt.backColor == 0x00FFFF);
+       CU_ASSERT(patblt.foreColor == 0x00EF5B);
+       CU_ASSERT(patblt.brush.x == 0);
+       CU_ASSERT(patblt.brush.y == 0);
+       CU_ASSERT(patblt.brush.style == (BMF_1BPP | CACHED_BRUSH));
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(patblt_order) - 1));
+}
+
+uint8 scrblt_order[] = "\x07\x00\xa1\x01\xf1\x00\xcc\x2f\x01\x8e\x00";
+
+void test_read_scrblt_order(void)
+{
+       STREAM _s, *s;
+       SCRBLT_ORDER scrblt;
+
+       s = &_s;
+       s->p = s->data = scrblt_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x7D;
+       memset(&scrblt, 0, sizeof(SCRBLT_ORDER));
+
+       update_read_scrblt_order(s, orderInfo, &scrblt);
+
+       CU_ASSERT(scrblt.nLeftRect == 7);
+       CU_ASSERT(scrblt.nTopRect == 0);
+       CU_ASSERT(scrblt.nWidth == 417);
+       CU_ASSERT(scrblt.nHeight == 241);
+       CU_ASSERT(scrblt.bRop == 204);
+       CU_ASSERT(scrblt.nXSrc == 303);
+       CU_ASSERT(scrblt.nYSrc == 142);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(scrblt_order) - 1));
+}
+
+uint8 opaque_rect_order[] = "\x00\x04\x00\x03\x73\x02\x06";
+
+void test_read_opaque_rect_order(void)
+{
+       STREAM _s, *s;
+       OPAQUE_RECT_ORDER opaque_rect;
+
+       s = &_s;
+       s->p = s->data = opaque_rect_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x7C;
+       memset(&opaque_rect, 0, sizeof(OPAQUE_RECT_ORDER));
+
+       update_read_opaque_rect_order(s, orderInfo, &opaque_rect);
+
+       CU_ASSERT(opaque_rect.nLeftRect == 0);
+       CU_ASSERT(opaque_rect.nTopRect == 0);
+       CU_ASSERT(opaque_rect.nWidth == 1024);
+       CU_ASSERT(opaque_rect.nHeight == 768);
+       CU_ASSERT(opaque_rect.color == 0x00060273);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(opaque_rect_order) - 1));
+}
+
+uint8 draw_nine_grid_order[] = "\xfb\xf9\x0d\x00";
+
+void test_read_draw_nine_grid_order(void)
+{
+       STREAM _s, *s;
+       DRAW_NINE_GRID_ORDER draw_nine_grid;
+
+       s = &_s;
+       s->p = s->data = draw_nine_grid_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x1C;
+       orderInfo->deltaCoordinates = true;
+
+       memset(&draw_nine_grid, 0, sizeof(DRAW_NINE_GRID_ORDER));
+       draw_nine_grid.srcRight = 38;
+       draw_nine_grid.srcBottom = 40;
+
+       update_read_draw_nine_grid_order(s, orderInfo, &draw_nine_grid);
+
+       CU_ASSERT(draw_nine_grid.srcLeft == 0);
+       CU_ASSERT(draw_nine_grid.srcTop == 0);
+       CU_ASSERT(draw_nine_grid.srcRight == 33);
+       CU_ASSERT(draw_nine_grid.srcBottom == 33);
+       CU_ASSERT(draw_nine_grid.bitmapId == 13);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(draw_nine_grid_order) - 1));
+}
+
+
+uint8 multi_opaque_rect_order[] =
+       "\x87\x01\x1c\x01\xf1\x00\x12\x00\x5c\xef\x04\x16\x00\x08\x40\x81"
+       "\x87\x81\x1c\x80\xf1\x01\x01\x01\x10\x80\xf0\x01\x10\xff\x10\x10"
+       "\x80\xf1\x01";
+
+void test_read_multi_opaque_rect_order(void)
+{
+       STREAM _s, *s;
+       MULTI_OPAQUE_RECT_ORDER multi_opaque_rect;
+
+       s = &_s;
+       s->p = s->data = multi_opaque_rect_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x01BF;
+       memset(&multi_opaque_rect, 0, sizeof(MULTI_OPAQUE_RECT_ORDER));
+
+       update_read_multi_opaque_rect_order(s, orderInfo, &multi_opaque_rect);
+
+       CU_ASSERT(multi_opaque_rect.nLeftRect == 391);
+       CU_ASSERT(multi_opaque_rect.nTopRect == 284);
+       CU_ASSERT(multi_opaque_rect.nWidth == 241);
+       CU_ASSERT(multi_opaque_rect.nHeight == 18);
+       CU_ASSERT(multi_opaque_rect.color == 0x0000EF5C);
+       CU_ASSERT(multi_opaque_rect.cbData == 22);
+       CU_ASSERT(multi_opaque_rect.numRectangles == 4);
+
+       CU_ASSERT(multi_opaque_rect.rectangles[1].left == 391);
+       CU_ASSERT(multi_opaque_rect.rectangles[1].top == 284);
+       CU_ASSERT(multi_opaque_rect.rectangles[1].width == 241);
+       CU_ASSERT(multi_opaque_rect.rectangles[1].height == 1);
+
+       CU_ASSERT(multi_opaque_rect.rectangles[2].left == 391);
+       CU_ASSERT(multi_opaque_rect.rectangles[2].top == 285);
+       CU_ASSERT(multi_opaque_rect.rectangles[2].width == 1);
+       CU_ASSERT(multi_opaque_rect.rectangles[2].height == 16);
+
+       CU_ASSERT(multi_opaque_rect.rectangles[3].left == 631);
+       CU_ASSERT(multi_opaque_rect.rectangles[3].top == 285);
+       CU_ASSERT(multi_opaque_rect.rectangles[3].width == 1);
+       CU_ASSERT(multi_opaque_rect.rectangles[3].height == 16);
+
+       CU_ASSERT(multi_opaque_rect.rectangles[4].left == 391);
+       CU_ASSERT(multi_opaque_rect.rectangles[4].top == 301);
+       CU_ASSERT(multi_opaque_rect.rectangles[4].width == 241);
+       CU_ASSERT(multi_opaque_rect.rectangles[4].height == 1);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(multi_opaque_rect_order) - 1));
+}
+
+uint8 line_to_order[] = "\x03\xb1\x0e\xa6\x5b\xef\x00";
+
+void test_read_line_to_order(void)
+{
+       STREAM _s, *s;
+       LINE_TO_ORDER line_to;
+
+       s = &_s;
+       s->p = s->data = line_to_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x021E;
+       orderInfo->deltaCoordinates = true;
+
+       memset(&line_to, 0, sizeof(LINE_TO_ORDER));
+       line_to.nXStart = 826;
+       line_to.nYStart = 350;
+       line_to.nXEnd = 829;
+       line_to.nYEnd = 347;
+
+       update_read_line_to_order(s, orderInfo, &line_to);
+
+       CU_ASSERT(line_to.nXStart == 829);
+       CU_ASSERT(line_to.nYStart == 271);
+       CU_ASSERT(line_to.nXEnd == 843);
+       CU_ASSERT(line_to.nYEnd == 257);
+       CU_ASSERT(line_to.backColor == 0);
+       CU_ASSERT(line_to.bRop2 == 0);
+       CU_ASSERT(line_to.penStyle == 0);
+       CU_ASSERT(line_to.penWidth == 0);
+       CU_ASSERT(line_to.penColor == 0x00EF5B);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(line_to_order) - 1));
+}
+
+uint8 polyline_order[] =
+       "\xf8\x01\xb8\x02\x00\xc0\x00\x20\x6c\x00\x00\x00\x00\x00\x04\x00"
+       "\x00\xff\x7e\x76\xff\x41\x6c\xff\x24\x62\xff\x2b\x59\xff\x55\x51"
+       "\xff\x9c\x49\x73\x43\x80\x4d\xff\xbe\x80\x99\xff\xba\x80\xcd\xff"
+       "\xb7\x80\xde\xff\xb6\x80\xca\xff\xb6\x80\x96\xff\xb7\x80\x48\xff"
+       "\xba\x6f\xff\xbe\xff\x97\x43\xff\x52\x4a\xff\x2b\x51\xff\x24\x59"
+       "\xff\x44\x63\xff\x81\x6c\x56\x76\x2f\x80\x82\x0a\x80\xbf\x14\x80"
+       "\xdd\x1e\x80\xd4\x27\x80\xab\x2f\x80\x64\x37\x0d\x3d\xff\xb3\x80"
+       "\x42\xff\x67\x80\x46";
+
+void test_read_polyline_order(void)
+{
+       STREAM _s, *s;
+       POLYLINE_ORDER polyline;
+
+       s = &_s;
+       s->p = s->data = polyline_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x73;
+
+       memset(&polyline, 0, sizeof(POLYLINE_ORDER));
+
+       update_read_polyline_order(s, orderInfo, &polyline);
+
+       CU_ASSERT(polyline.xStart == 504);
+       CU_ASSERT(polyline.yStart == 696);
+       CU_ASSERT(polyline.bRop2 == 0);
+       CU_ASSERT(polyline.penColor == 0x0000C000);
+       CU_ASSERT(polyline.numPoints == 32);
+       CU_ASSERT(polyline.cbData == 108);
+
+       CU_ASSERT(polyline.points[0].x == -130);
+       CU_ASSERT(polyline.points[1].x == -191);
+       CU_ASSERT(polyline.points[2].x == -220);
+       CU_ASSERT(polyline.points[3].x == -213);
+       CU_ASSERT(polyline.points[4].x == -171);
+       CU_ASSERT(polyline.points[5].x == -100);
+       CU_ASSERT(polyline.points[6].x == -13);
+       CU_ASSERT(polyline.points[7].x == 77);
+       CU_ASSERT(polyline.points[8].x == 153);
+       CU_ASSERT(polyline.points[9].x == 205);
+       CU_ASSERT(polyline.points[10].x == 222);
+       CU_ASSERT(polyline.points[11].x == 202);
+       CU_ASSERT(polyline.points[12].x == 150);
+       CU_ASSERT(polyline.points[13].x == 72);
+       CU_ASSERT(polyline.points[14].x == -17);
+       CU_ASSERT(polyline.points[15].x == -105);
+       CU_ASSERT(polyline.points[16].x == -174);
+       CU_ASSERT(polyline.points[17].x == -213);
+       CU_ASSERT(polyline.points[18].x == -220);
+       CU_ASSERT(polyline.points[19].x == -188);
+       CU_ASSERT(polyline.points[20].x == -127);
+       CU_ASSERT(polyline.points[21].x == -42);
+       CU_ASSERT(polyline.points[22].x == 47);
+       CU_ASSERT(polyline.points[23].x == 130);
+       CU_ASSERT(polyline.points[24].x == 191);
+       CU_ASSERT(polyline.points[25].x == 221);
+       CU_ASSERT(polyline.points[26].x == 212);
+       CU_ASSERT(polyline.points[27].x == 171);
+       CU_ASSERT(polyline.points[28].x == 100);
+       CU_ASSERT(polyline.points[29].x == 13);
+       CU_ASSERT(polyline.points[30].x == -77);
+       CU_ASSERT(polyline.points[31].x == -153);
+       CU_ASSERT(polyline.points[32].x == 0);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(polyline_order) - 1));
+}
+
+uint8 glyph_index_order_1[] =
+       "\x6a\x02\x27\x38\x00\x39\x07\x3a\x06\x3b\x07\x3c\x06\x3d\x06\x18"
+       "\x04\x1f\x06\x17\x02\x14\x04\x1b\x06\x19\x06\x45\x05\x18\x06\x1f"
+       "\x06\x1f\x02\x14\x02\x46\x06\xff\x15\x24";
+
+uint8 glyph_index_order_2[] =
+       "\x00\xff\xff\xff\x0c\x02\x6e\x01\x4d\x02\x7b\x01\x09\x02\x6e\x01"
+       "\xf6\x02\x7b\x01\x0c\x02\x79\x01\x03\xfe\x04\x00";
+
+void test_read_glyph_index_order(void)
+{
+       STREAM _s, *s;
+       GLYPH_INDEX_ORDER glyph_index;
+
+       s = &_s;
+       s->p = s->data = glyph_index_order_1;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x200100;
+       orderInfo->deltaCoordinates = true;
+
+       memset(&glyph_index, 0, sizeof(GLYPH_INDEX_ORDER));
+
+       update_read_glyph_index_order(s, orderInfo, &glyph_index);
+
+       CU_ASSERT(glyph_index.bkRight == 618);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(glyph_index_order_1) - 1));
+
+       s->p = s->data = glyph_index_order_2;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x383FE8;
+       orderInfo->deltaCoordinates = true;
+
+       memset(&glyph_index, 0, sizeof(GLYPH_INDEX_ORDER));
+
+       update_read_glyph_index_order(s, orderInfo, &glyph_index);
+
+       CU_ASSERT(glyph_index.fOpRedundant == 0);
+       CU_ASSERT(glyph_index.foreColor == 0x00FFFFFF);
+       CU_ASSERT(glyph_index.bkLeft == 524);
+       CU_ASSERT(glyph_index.bkTop == 366);
+       CU_ASSERT(glyph_index.bkRight == 589);
+       CU_ASSERT(glyph_index.bkBottom == 379);
+       CU_ASSERT(glyph_index.opLeft == 521);
+       CU_ASSERT(glyph_index.opTop == 366);
+       CU_ASSERT(glyph_index.opRight == 758);
+       CU_ASSERT(glyph_index.opBottom == 379);
+       CU_ASSERT(glyph_index.x == 524);
+       CU_ASSERT(glyph_index.y == 377);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(glyph_index_order_2) - 1));
+}
+
+uint8 fast_index_order[] =
+       "\x07\x00\x03\xff\xff\x00\x74\x3b\x00\x0e\x00\x71\x00\x42\x00\x7e"
+       "\x00\x00\x80\x7c\x00\x15\x00\x00\x01\x06\x02\x04\x03\x08\x05\x09"
+       "\x06\x06\x06\x06\x07\x06\x08\x02\xff\x00\x12";
+
+void test_read_fast_index_order(void)
+{
+       STREAM _s, *s;
+       FAST_INDEX_ORDER fast_index;
+
+       s = &_s;
+       s->p = s->data = fast_index_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x70FF;
+
+       memset(&fast_index, 0, sizeof(FAST_INDEX_ORDER));
+       update_read_fast_index_order(s, orderInfo, &fast_index);
+
+       CU_ASSERT(fast_index.cacheId == 7);
+       CU_ASSERT(fast_index.flAccel == 3);
+       CU_ASSERT(fast_index.ulCharInc == 0);
+       CU_ASSERT(fast_index.backColor == 0x0000FFFF);
+       CU_ASSERT(fast_index.foreColor == 0x00003B74);
+       CU_ASSERT(fast_index.bkLeft == 14);
+       CU_ASSERT(fast_index.bkTop == 113);
+       CU_ASSERT(fast_index.bkRight == 66);
+       CU_ASSERT(fast_index.bkBottom == 126);
+       CU_ASSERT(fast_index.opLeft == 0);
+       CU_ASSERT(fast_index.opTop == 0);
+       CU_ASSERT(fast_index.opRight == 0);
+       CU_ASSERT(fast_index.opBottom == 0);
+       CU_ASSERT(fast_index.x == -32768);
+       CU_ASSERT(fast_index.y == 124);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(fast_index_order) - 1));
+}
+
+uint8 fast_glyph_order[] =
+       "\x06\x00\x03\xff\xff\x00\x8b\x00\xb1\x00\x93\x00\xbe\x00\x0d\x00"
+       "\xfe\x7f\x00\x80\x00\x80\xbb\x00\x13\x00\x01\x4a\x06\x0a\x80\x80"
+       "\x80\xb8\xc4\x84\x84\x84\x84\x84\x00\x00\x68\x00";
+
+void test_read_fast_glyph_order(void)
+{
+       STREAM _s, *s;
+       FAST_GLYPH_ORDER fast_glyph;
+
+       s = &_s;
+       s->p = s->data = fast_glyph_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x7EFB;
+
+       memset(&fast_glyph, 0, sizeof(FAST_GLYPH_ORDER));
+
+       update_read_fast_glyph_order(s, orderInfo, &fast_glyph);
+
+       CU_ASSERT(fast_glyph.backColor == 0);
+       CU_ASSERT(fast_glyph.foreColor == 0x0000FFFF);
+       CU_ASSERT(fast_glyph.bkLeft == 139);
+       CU_ASSERT(fast_glyph.bkTop == 177);
+       CU_ASSERT(fast_glyph.bkRight == 147);
+       CU_ASSERT(fast_glyph.bkBottom == 190);
+       CU_ASSERT(fast_glyph.opLeft == 0);
+       CU_ASSERT(fast_glyph.opTop == 13);
+       CU_ASSERT(fast_glyph.opRight == 32766);
+       CU_ASSERT(fast_glyph.opBottom == -32768);
+       CU_ASSERT(fast_glyph.x == -32768);
+       CU_ASSERT(fast_glyph.y == 187);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(fast_glyph_order) - 1));
+}
+
+uint8 polygon_cb_order[] =
+       "\xea\x00\x46\x01\x0d\x01\x08\x00\x00\x04\x03\x81\x08\x03\x05\x88"
+       "\x09\x26\x09\x77";
+
+void test_read_polygon_cb_order(void)
+{
+       STREAM _s, *s;
+       POLYGON_CB_ORDER polygon_cb;
+
+       s = &_s;
+       s->p = s->data = polygon_cb_order;
+
+       memset(orderInfo, 0, sizeof(ORDER_INFO));
+       orderInfo->fieldFlags = 0x1BEF;
+
+       memset(&polygon_cb, 0, sizeof(POLYGON_CB_ORDER));
+
+       update_read_polygon_cb_order(s, orderInfo, &polygon_cb);
+
+       CU_ASSERT(polygon_cb.xStart == 234);
+       CU_ASSERT(polygon_cb.yStart == 326);
+       CU_ASSERT(polygon_cb.bRop2 == 0x0D);
+       CU_ASSERT(polygon_cb.fillMode == 1);
+       CU_ASSERT(polygon_cb.backColor == 0);
+       CU_ASSERT(polygon_cb.foreColor == 0x00000008);
+       CU_ASSERT(polygon_cb.brush.x == 4);
+       CU_ASSERT(polygon_cb.brush.y == 3);
+       CU_ASSERT(polygon_cb.brush.style == 0x81);
+       CU_ASSERT(polygon_cb.nDeltaEntries == 3);
+       CU_ASSERT(polygon_cb.cbData == 5);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(polygon_cb_order) - 1));
+}
+
+uint8 cache_bitmap_order[] = "\x00\x00\x10\x01\x08\x01\x00\x00\x00\x10";
+
+void test_read_cache_bitmap_order(void)
+{
+       STREAM _s, *s;
+       uint16 extraFlags;
+       CACHE_BITMAP_ORDER cache_bitmap;
+
+       s = &_s;
+       extraFlags = 0x0400;
+       s->p = s->data = cache_bitmap_order;
+
+       memset(&cache_bitmap, 0, sizeof(CACHE_BITMAP_ORDER));
+
+       update_read_cache_bitmap_order(s, &cache_bitmap, true, extraFlags);
+
+       CU_ASSERT(cache_bitmap.cacheId == 0);
+       CU_ASSERT(cache_bitmap.bitmapWidth == 16);
+       CU_ASSERT(cache_bitmap.bitmapHeight == 1);
+       CU_ASSERT(cache_bitmap.bitmapBpp == 8);
+       CU_ASSERT(cache_bitmap.bitmapLength == 1);
+       CU_ASSERT(cache_bitmap.cacheIndex == 0);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(cache_bitmap_order) - 1));
+}
+
+uint8 cache_bitmap_v2_order[] =
+       "\x20\x40\xdc\xff\xff\x85\xff\xff\x99\xd6\x99\xd6\x99\xd6\x99\xd6"
+       "\x06\x8b\x99\xd6\x99\xd6\x99\xd6\x10\x84\x08\x42\x08\x42\x10\x84"
+       "\x99\xd6\x99\xd6\x99\xd6\x99\xd6\x06\x84\x99\xd6\x99\xd6\x99\xd6"
+       "\xff\xff\x16\x69\x99\xd6\x06\x69\x99\xd6\x04\xcc\x89\x52\x03\x6e"
+       "\xff\xff\x02\x6e\x08\x42\x01\x70\x08\x42\x71\xff\xff\xce\x18\xc6"
+       "\x01\x81\x08\x42\xce\x66\x29\x02\xcd\x89\x52\x03\x88\x10\x84\x99"
+       "\xd6\x99\xd6\x99\xd6\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x99\xd6"
+       "\x03\xf8\x01\x00\x00\x00\x00\xf0\x66\x99\xd6\x05\x6a\x99\xd6\x00"
+       "\xc4\xcc\x89\x52\x03\x6e\xff\xff\x02\x6e\x08\x42\x01\x70\x08\x42"
+       "\x71\xff\xff\xce\x18\xc6\x01\x81\x08\x42\xce\x66\x29\x02\xcd\x89"
+       "\x52\x03\x00\x04\xd6\x99\xd6\xc3\x80\x61\x00\xa5\x80\x40\xec\x52"
+       "\x00\x5a\x00\x2d\x00\x24\x00\x12\x00\x24\x00\x12\x00\x5a\x00\x2d"
+       "\x00\xa5\x80\x52\x00\xc3\x80\x61\x00\x00\x00\x00\x00\xcc\x89\x52"
+       "\x03\x6e\xff\xff\x02\xcb\x18\xc6\x84\x08\x42\x08\x42\x08\x42\xff"
+       "\xff";
+
+void test_read_cache_bitmap_v2_order(void)
+{
+       STREAM _s, *s;
+       uint16 extraFlags;
+       CACHE_BITMAP_V2_ORDER cache_bitmap_v2;
+
+       s = &_s;
+       extraFlags = 0x0CA1;
+       s->p = s->data = cache_bitmap_v2_order;
+
+       memset(&cache_bitmap_v2, 0, sizeof(CACHE_BITMAP_V2_ORDER));
+
+       update_read_cache_bitmap_v2_order(s, &cache_bitmap_v2, true, extraFlags);
+
+       CU_ASSERT(cache_bitmap_v2.cacheId == 1);
+       CU_ASSERT(cache_bitmap_v2.bitmapBpp == 16);
+       CU_ASSERT(cache_bitmap_v2.flags == 0x19);
+       CU_ASSERT(cache_bitmap_v2.bitmapWidth == 32);
+       CU_ASSERT(cache_bitmap_v2.bitmapHeight == 32);
+       CU_ASSERT(cache_bitmap_v2.bitmapLength == 220);
+       CU_ASSERT(cache_bitmap_v2.cacheIndex == 32767);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(cache_bitmap_v2_order) - 1));
+}
+
+uint8 cache_bitmap_v3_order[] =
+       "\xff\x7f\x35\x50\xec\xbc\x74\x52\x65\xb7\x20\x00\x00\x00\x05\x00"
+       "\x02\x00\x28\x00\x00\x00\x5b\x4f\x45\xff\x5b\x4f\x45\xff\x5b\x4f"
+       "\x45\xff\x5b\x4f\x45\xff\x5b\x4f\x45\xff\x5b\x50\x45\xff\x5b\x50"
+       "\x45\xff\x5b\x50\x45\xff\x5b\x50\x45\xff\x5b\x50\x45\xff";
+
+void test_read_cache_bitmap_v3_order(void)
+{
+       STREAM _s, *s;
+       uint16 extraFlags;
+       CACHE_BITMAP_V3_ORDER cache_bitmap_v3;
+
+       s = &_s;
+       extraFlags = 0x0C30;
+       s->p = s->data = cache_bitmap_v3_order;
+
+       memset(&cache_bitmap_v3, 0, sizeof(CACHE_BITMAP_V3_ORDER));
+
+       update_read_cache_bitmap_v3_order(s, &cache_bitmap_v3, true, extraFlags);
+
+       CU_ASSERT(cache_bitmap_v3.cacheIndex == 32767);
+       CU_ASSERT(cache_bitmap_v3.key1 == 0xBCEC5035);
+       CU_ASSERT(cache_bitmap_v3.key2 == 0xB7655274);
+       CU_ASSERT(cache_bitmap_v3.bpp == 32);
+
+       CU_ASSERT(cache_bitmap_v3.bitmapData.bpp == 32);
+       CU_ASSERT(cache_bitmap_v3.bitmapData.codecID == 0);
+       CU_ASSERT(cache_bitmap_v3.bitmapData.width == 5);
+       CU_ASSERT(cache_bitmap_v3.bitmapData.height == 2);
+       CU_ASSERT(cache_bitmap_v3.bitmapData.length == 40);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(cache_bitmap_v3_order) - 1));
+}
+
+uint8 cache_brush_order[] = "\x00\x01\x08\x08\x81\x08\xaa\x55\xaa\x55\xaa\x55\xaa\x55";
+
+void test_read_cache_brush_order(void)
+{
+       STREAM _s, *s;
+       CACHE_BRUSH_ORDER cache_brush;
+
+       s = &_s;
+       s->p = s->data = cache_brush_order;
+
+       memset(&cache_brush, 0, sizeof(CACHE_BRUSH_ORDER));
+
+       update_read_cache_brush_order(s, &cache_brush, 0);
+
+       CU_ASSERT(cache_brush.index == 0);
+       CU_ASSERT(cache_brush.bpp == 1);
+       CU_ASSERT(cache_brush.cx == 8);
+       CU_ASSERT(cache_brush.cy == 8);
+       CU_ASSERT(cache_brush.style == 0x81);
+       CU_ASSERT(cache_brush.length == 8);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(cache_brush_order) - 1));
+}
+
+uint8 create_offscreen_bitmap_order[] = "\x00\x80\x60\x01\x10\x00\x01\x00\x02\x00";
+
+void test_read_create_offscreen_bitmap_order(void)
+{
+       STREAM _s, *s;
+       OFFSCREEN_DELETE_LIST* deleteList;
+       CREATE_OFFSCREEN_BITMAP_ORDER create_offscreen_bitmap;
+
+       s = &_s;
+       s->p = s->data = create_offscreen_bitmap_order;
+
+       memset(&create_offscreen_bitmap, 0, sizeof(CREATE_OFFSCREEN_BITMAP_ORDER));
+
+       deleteList = &(create_offscreen_bitmap.deleteList);
+       deleteList->cIndices = 0;
+       deleteList->sIndices = 16;
+       deleteList->indices = malloc(sizeof(uint16) * deleteList->sIndices);
+
+       update_read_create_offscreen_bitmap_order(s, &create_offscreen_bitmap);
+
+       CU_ASSERT(create_offscreen_bitmap.id == 0);
+       CU_ASSERT(create_offscreen_bitmap.cx == 352);
+       CU_ASSERT(create_offscreen_bitmap.cy == 16);
+       CU_ASSERT(create_offscreen_bitmap.deleteList.cIndices == 1);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(create_offscreen_bitmap_order) - 1));
+}
+
+uint8 switch_surface_order[] = "\xff\xff";
+
+void test_read_switch_surface_order(void)
+{
+       STREAM _s, *s;
+       SWITCH_SURFACE_ORDER switch_surface;
+
+       s = &_s;
+       s->p = s->data = switch_surface_order;
+
+       memset(&switch_surface, 0, sizeof(SWITCH_SURFACE_ORDER));
+
+       update_read_switch_surface_order(s, &switch_surface);
+
+       CU_ASSERT(switch_surface.bitmapId == 0xFFFF);
+
+       CU_ASSERT(stream_get_length(s) == (sizeof(switch_surface_order) - 1));
+}
+
+int opaque_rect_count;
+int polyline_count;
+int patblt_count;
+
+uint8 orders_update_1[] =
+       "\x00\x00\x33\xd0\x07\x00\x80\xba\x0d\x0a\x7f\x1e\x2c\x4d\x00\x36"
+       "\x02\xd3\x00\x47\x00\x4d\x00\xf0\x01\x87\x00\xc2\xdc\xff\x05\x7f"
+       "\x0f\x67\x01\x90\x01\x8e\x01\xa5\x01\x67\x01\x90\x01\x28\x00\x16"
+       "\x00\xf0\xf0\xf0\x15\x0f\xf0\x2d\x01\x19\xfe\x2d\x01\xec\xfd\x0d"
+       "\x16\x77\xf0\xff\xff\x01\x01\xa8\x01\x90\x01\x0d\xf0\xf0\xf0\x04"
+       "\x05\x66\x6b\x14\x15\x6c\x1d\x0a\x0f\xd0\x16\x64\x01\x15\xff\x50"
+       "\x03\x15\x0f\xf0\x65\x01\x15\xfe\x65\x01\xb0\xfd\x1d\x16\x01\xf0"
+       "\xff\xff\x01\x01\x7a";
+
+uint8 orders_update_2[] =
+       "\x00\x00\x45\x62\x03\x00\x93\x14\x55\x01\x50\xff\xff\xff\x55\x01"
+       "\x50\x01\x01\x01\x55\x01\x50\xff\xff\xff\x16\x00\x17\x00\xea\x03"
+       "\xea\x03\x02\x00\x85\x02\x16\x00\x02\x00\x00\x00\x03\x00\x14\xb2";
+
+void test_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect)
+{
+       opaque_rect_count++;
+}
+
+void test_polyline(rdpContext* context, POLYLINE_ORDER* polyline)
+{
+       polyline_count++;
+}
+
+void test_patblt(rdpContext* context, PATBLT_ORDER* patblt)
+{
+       patblt_count++;
+}
+
+void test_update_recv_orders(void)
+{
+       rdpRdp* rdp;
+       STREAM _s, *s;
+       rdpUpdate* update;
+
+       s = &_s;
+       rdp = rdp_new(NULL);
+       update = update_new(rdp);
+
+       update->context = malloc(sizeof(rdpContext));
+       update->context->rdp = rdp;
+
+       opaque_rect_count = 0;
+       polyline_count = 0;
+       patblt_count = 0;
+
+       update->primary->OpaqueRect = test_opaque_rect;
+       update->primary->Polyline = test_polyline;
+       update->primary->PatBlt = test_patblt;
+
+       s->p = s->data = orders_update_1;
+       s->size = sizeof(orders_update_1);
+
+       update_recv(update, s);
+
+       CU_ASSERT(opaque_rect_count == 5);
+       CU_ASSERT(polyline_count == 2);
+
+       update->primary->order_info.orderType = ORDER_TYPE_PATBLT;
+       s->p = s->data = orders_update_2;
+       s->size = sizeof(orders_update_2);
+
+       update_recv(update, s);
+
+       CU_ASSERT(patblt_count == 3);
+
+       free(update->context);
+}
+
diff --git a/cunit/test_orders.h b/cunit/test_orders.h
new file mode 100644 (file)
index 0000000..eb7fb29
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Drawing Orders Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_orders_suite(void);
+int clean_orders_suite(void);
+int add_orders_suite(void);
+
+void test_read_dstblt_order(void);
+void test_read_patblt_order(void);
+void test_read_scrblt_order(void);
+void test_read_opaque_rect_order(void);
+void test_read_draw_nine_grid_order(void);
+void test_read_multi_opaque_rect_order(void);
+void test_read_line_to_order(void);
+void test_read_polyline_order(void);
+void test_read_glyph_index_order(void);
+void test_read_fast_index_order(void);
+void test_read_fast_glyph_order(void);
+void test_read_polygon_cb_order(void);
+
+void test_read_cache_bitmap_order(void);
+void test_read_cache_bitmap_v2_order(void);
+void test_read_cache_bitmap_v3_order(void);
+void test_read_cache_brush_order(void);
+
+void test_read_create_offscreen_bitmap_order(void);
+void test_read_switch_surface_order(void);
+
+void test_update_recv_orders(void);
+
diff --git a/cunit/test_pcap.c b/cunit/test_pcap.c
new file mode 100644 (file)
index 0000000..4255f04
--- /dev/null
@@ -0,0 +1,99 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * pcap File Format Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/pcap.h>
+
+#include "test_pcap.h"
+
+int init_pcap_suite(void)
+{
+       return 0;
+}
+
+int clean_pcap_suite(void)
+{
+       return 0;
+}
+
+int add_pcap_suite(void)
+{
+       add_test_suite(pcap);
+
+       add_test_function(pcap);
+
+       return 0;
+}
+
+uint8 test_packet_1[16] =
+       "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA";
+
+uint8 test_packet_2[32] =
+       "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB"
+       "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB";
+
+uint8 test_packet_3[64] =
+       "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
+       "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
+       "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
+       "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC";
+
+typedef struct
+{
+       void* data;
+       uint32 length;
+} test_packet;
+
+void test_pcap(void)
+{
+       rdpPcap* pcap;
+       pcap_record record;
+       test_packet packets[3];
+
+       packets[0].data = test_packet_1;
+       packets[0].length = sizeof(test_packet_1);
+       packets[1].data = test_packet_2;
+       packets[1].length = sizeof(test_packet_2);
+       packets[2].data = test_packet_3;
+       packets[2].length = sizeof(test_packet_3);
+
+       pcap = pcap_open("/tmp/test.pcap", true);
+       pcap_add_record(pcap, test_packet_1, sizeof(test_packet_1));
+       pcap_flush(pcap);
+       pcap_add_record(pcap, test_packet_2, sizeof(test_packet_2));
+       pcap_flush(pcap);
+       pcap_add_record(pcap, test_packet_3, sizeof(test_packet_3));
+       pcap_close(pcap);
+
+       pcap = pcap_open("/tmp/test.pcap", false);
+
+       int i = 0;
+       while (pcap_has_next_record(pcap))
+       {
+               pcap_get_next_record(pcap, &record);
+               CU_ASSERT(record.length == packets[i].length)
+               i++;
+       }
+
+       CU_ASSERT(i == 3);
+
+       pcap_close(pcap);
+}
+
diff --git a/cunit/test_pcap.h b/cunit/test_pcap.h
new file mode 100644 (file)
index 0000000..f506edc
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * pcap File Format Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_pcap_suite(void);
+int clean_pcap_suite(void);
+int add_pcap_suite(void);
+
+void test_pcap(void);
diff --git a/cunit/test_per.c b/cunit/test_per.c
new file mode 100644 (file)
index 0000000..45a5451
--- /dev/null
@@ -0,0 +1,64 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Packed Encoding Rules (PER) Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_per.h"
+#include "libfreerdp-core/per.h"
+
+int init_per_suite(void)
+{
+       return 0;
+}
+
+int clean_per_suite(void)
+{
+       return 0;
+}
+
+int add_per_suite(void)
+{
+       add_test_suite(per);
+
+       add_test_function(per_write_length);
+       add_test_function(per_write_object_identifier);
+
+       return 0;
+}
+
+uint8 per_length_expected[2] = "\x81\x2A";
+
+void test_per_write_length(void)
+{
+       STREAM* s = stream_new(2);
+       per_write_length(s, 298);
+       ASSERT_STREAM(s, (uint8*) per_length_expected, sizeof(per_length_expected));
+}
+
+uint8 per_oid[6] = { 0, 0, 20, 124, 0, 1 };
+uint8 per_oid_expected[6] = "\x05\x00\x14\x7C\x00\x01";
+
+void test_per_write_object_identifier(void)
+{
+       STREAM* s = stream_new(6);
+       per_write_object_identifier(s, per_oid);
+       ASSERT_STREAM(s, (uint8*) per_oid_expected, sizeof(per_oid_expected));
+}
diff --git a/cunit/test_per.h b/cunit/test_per.h
new file mode 100644 (file)
index 0000000..30f8d6f
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Packed Encoding Rules (PER) Unit Tests
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_per_suite(void);
+int clean_per_suite(void);
+int add_per_suite(void);
+
+void test_per_write_length(void);
+void test_per_write_object_identifier(void);
diff --git a/cunit/test_rail.c b/cunit/test_rail.c
new file mode 100644 (file)
index 0000000..b271706
--- /dev/null
@@ -0,0 +1,891 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   RAIL(TS RemoteApp) Virtual Channel Unit Tests
+
+   Copyright 2011 Vic Lee
+   Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/rail.h>
+#include <freerdp/rail.h>
+
+
+#include "test_rail.h"
+
+#define HCF_HIGHCONTRASTON  0x00000001
+#define HCF_AVAILABLE       0x00000002
+#define HCF_HOTKEYACTIVE    0x00000004
+#define HCF_CONFIRMHOTKEY   0x00000008
+#define HCF_HOTKEYSOUND     0x00000010
+#define HCF_INDICATOR       0x00000020
+#define HCF_HOTKEYAVAILABLE 0x00000040
+
+
+int init_rail_suite(void)
+{
+       freerdp_channels_global_init();
+       return 0;
+}
+
+int clean_rail_suite(void)
+{
+       freerdp_channels_global_uninit();
+       return 0;
+}
+
+int add_rail_suite(void)
+{
+       add_test_suite(rail);
+
+       add_test_function(rail_plugin);
+
+       return 0;
+}
+
+
+static uint8 client_handshake[] =
+{
+0x05, 0x00, 0x08, 0x00, 0xb0, 0x1d, 0x00, 0x00
+};
+
+static uint8 client_info_pdu[] =
+{
+0x0b, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00
+};
+
+// Flags: TS_RAIL_EXEC_FLAG_EXPAND_ARGUMENTS
+// ExeOrFile : ||iexplore
+// WorkingDir: f:\windows\system32
+// Arguments: www.bing.com
+
+static uint8 client_execute_pdu[] =
+{
+0x01,0x00,0x5e,0x00,0x08,0x00,0x14,0x00,0x26,0x00,0x18,0x00,0x7c,0x00,
+0x7c,0x00,0x69,0x00,0x65,0x00,0x78,0x00,0x70,0x00,0x6c,0x00,0x6f,0x00,
+0x72,0x00,0x65,0x00,0x66,0x00,0x3a,0x00,0x5c,0x00,0x77,0x00,0x69,0x00,
+0x6e,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x73,0x00,0x5c,0x00,0x73,0x00,
+0x79,0x00,0x73,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x33,0x00,0x32,0x00,
+0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x62,0x00,0x69,0x00,0x6e,0x00,
+0x67,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00
+};
+
+static uint8 client_activate_pdu[] =
+{
+0x02,0x00,
+0x09,0x00,
+0x8e,0x00,0x07,0x00,
+0x01
+};
+
+
+
+static uint8 client_sysparam_highcontrast_pdu[] =
+{
+0x03,0x00,
+0x12,0x00,
+0x43,0x00,0x00,0x00, // SPI_SETHIGHCONTRAST
+0x7e,0x00,0x00,0x00, // HCF_AVAILABLE | HCF_HOTKEYACTIVE | HCF_CONFIRMHOTKEY
+                     // HCF_HOTKEYSOUND | HCF_INDICATOR | HCF_HOTKEYAVAILABLE
+0x02,0x00,0x00,0x00, // Minimum length 2
+0x00,0x00 // Unicode String
+};
+
+
+static uint8 client_sysparam_taskbarpos_pdu[] =
+{
+0x03,0x00,
+0x10,0x00,
+0x00,0xf0,0x00,0x00, // RAIL_SPI_TASKBARPOS
+0x00,0x00, // 0
+0x9a,0x03, // 0x039a
+0x90,0x06, // 0x0690
+0xc2,0x03  // 0x03c2
+};
+
+static uint8 client_sysparam_mousebuttonswap_pdu[] =
+{
+0x03,0x00,
+0x09,0x00,
+0x21,0x00,0x00,0x00, // SPI_SETMOUSEBUTTONSWAP
+0x00 // false
+};
+
+
+static uint8 client_sysparam_keyboardpref_pdu[] =
+{
+0x03,0x00,
+0x09,0x00,
+0x45,0x00,0x00,0x00, // SPI_SETKEYBOARDPREF
+0x00 // false
+};
+
+
+static uint8 client_sysparam_dragfullwindow_pdu[] =
+{
+0x03,0x00,
+0x09,0x00,
+0x25,0x00,0x00,0x00, // SPI_SETDRAGFULLWINDOWS
+0x01 // true
+};
+
+
+static uint8 client_sysparam_keyboardcues_pdu[] =
+{
+0x03,0x00,
+0x09,0x00,
+0x0b,0x10,0x00,0x00, //SPI_SETKEYBOARDCUES
+0x00 // false
+};
+
+static uint8 client_sysparam_setworkarea_pdu[] =
+{
+0x03,0x00,
+0x10,0x00,
+0x2f,0x00,0x00,0x00, //SPI_SETWORKAREA
+0x00,0x00, // 0
+0x00,0x00, // 0
+0x90,0x06, // 0x0690
+0x9a,0x03  // 0x039a
+};
+
+static uint8 client_syscommand_pdu[] =
+{
+0x04,0x00,
+0x0a,0x00,
+0x52,0x00,0x02,0x00,
+0x20,0xf0
+};
+
+static uint8 client_notify_pdu[] =
+{
+0x06,0x00,
+0x10,0x00,
+0xaa,0x01,0x02,0x00,
+0x02,0x00,0x00,0x00,
+0x04,0x02,0x00,0x00
+};
+
+static uint8 client_windowmove_pdu[] =
+{
+0x08,0x00,
+0x10,0x00,
+0x20,0x00,0x02,0x00,
+0x09,0x03,
+0x00,0x01,
+0xdb,0x05,
+0x88,0x01
+};
+
+static uint8 client_system_menu_pdu[] =
+{
+0x0c,0x00,
+0x0c,0x00,
+0x22,0x01,0x09,0x00,
+0xa4,0xff,
+0x4a,0x02
+};
+
+static uint8 client_langbar_pdu[] =
+{
+0x0D,0x00,0x08,0x00,0x01,0x00,0x00,0x00
+};
+
+static uint8 client_get_app_id_req_pdu[] =
+{
+0x0E,0x00,0x08,0x00,0x52,0x00,0x02,0x00
+};
+
+static uint8 server_handshake[] =
+{
+       0x05, 0x00, 0x08, 0x00, 0xb0, 0x1d, 0x00, 0x00
+};
+
+static uint8 server_exec_result_pdu[] =
+{
+0x80,0x00,0x24,0x00,0x08,0x00,0x03,0x00,0x15,0x00,0x00,0x00,0x00,0x00,
+0x14,0x00,0x7c,0x00,0x7c,0x00,0x57,0x00,0x72,0x00,0x6f,0x00,0x6e,0x00,
+0x67,0x00,0x41,0x00,0x70,0x00,0x70,0x00
+};
+
+static uint8 server_exec_result_exe_or_file[] =
+{
+0x7c,0x00,0x7c,0x00,0x57,0x00,0x72,0x00,0x6f,0x00,0x6e,0x00,
+0x67,0x00,0x41,0x00,0x70,0x00,0x70,0x00
+};
+
+static uint8 server_sysparam1_pdu[] =
+{
+0x03,0x00,
+0x09,0x00,
+0x77,0x00,0x00,0x00,
+0x00
+};
+
+static uint8 server_sysparam2_pdu[] =
+{
+0x03,0x00,
+0x09,0x00,
+0x11,0x00,0x00,0x00,
+0x00
+};
+
+static uint8 server_localmovesize_start_pdu[] =
+{
+0x09,0x00,0x10,0x00,0x8e,0x00,0x07,0x00,0x01,0x00,0x09,0x00,0x7e,0x01,
+0x0a,0x00
+};
+
+static uint8 server_localmovesize_stop_pdu[] =
+{
+0x09,0x00,0x10,0x00,0x8e,0x00,0x07,0x00,0x00,0x00,0x09,0x00,0xa6,0x00,
+0x44,0x00
+};
+
+static uint8 server_minmaxinfo_pdu[] =
+{
+0x0a,0x00,0x18,0x00,0x8e,0x00,0x07,0x00,0x08,0x04,0xd6,0x02,0x00,0x00,
+0x00,0x00,0x70,0x00,0x1b,0x00,0x0c,0x04,0x0c,0x03
+};
+
+static uint8 server_langbar_pdu[] =
+{
+0x0D,0x00,0x08,0x00,0x01,0x00,0x00,0x00
+};
+
+
+static uint8 server_app_get_resp_pdu[] =
+{
+0x0F,0x00,0x08,0x02,0x52,0x00,0x02,0x00,0x6d,0x00,0x69,0x00,0x63,0x00,
+0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x2e,0x00,
+0x77,0x00,0x69,0x00,0x6e,0x6f,0x00,0x77,0x00,0x73,0x00,0x2e,0x00,0x6e,
+0x00,0x6f,0x00,0x74,0x00,0x65,0x00,0x70,0x00,0x61,0x00,0x64,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+static uint8 server_app_get_resp_app_id[] =
+{
+0x6d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,
+0x66,0x00,0x74,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6e,0x6f,0x00,0x77,
+0x00,0x73,0x00,0x2e,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x65,0x00,0x70,
+0x00,0x61,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,
+
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00
+};
+
+
+#define EMULATE_SERVER_SEND_CHANNEL_DATA(inst, byte_array) \
+       emulate_server_send_channel_data(inst, byte_array, RAIL_ARRAY_SIZE(byte_array))
+
+#define STREAM_EQUAL_TO_DUMP(stream, dump) \
+       (stream_equal_dump((stream)->data, (stream)->size, dump, RAIL_ARRAY_SIZE(dump)))
+
+#define UNICODE_STRING_EQUAL_TO_DUMP(ustring, dump) \
+       (stream_equal_dump((ustring)->string, (ustring)->length, dump, RAIL_ARRAY_SIZE(dump)))
+
+typedef struct
+{
+       RAIL_HANDSHAKE_ORDER handshake;
+       RAIL_CLIENT_STATUS_ORDER client_status;
+       RAIL_EXEC_ORDER exec;
+       RAIL_EXEC_RESULT_ORDER exec_result;
+       RAIL_SYSPARAM_ORDER sysparam;
+       RAIL_ACTIVATE_ORDER activate;
+       RAIL_SYSMENU_ORDER sysmenu;
+       RAIL_SYSCOMMAND_ORDER syscommand;
+       RAIL_NOTIFY_EVENT_ORDER notify_event;
+       RAIL_MINMAXINFO_ORDER minmaxinfo;
+       RAIL_LOCALMOVESIZE_ORDER localmovesize;
+       RAIL_WINDOW_MOVE_ORDER window_move;
+       RAIL_LANGBAR_INFO_ORDER langbar_info;
+       RAIL_GET_APPID_REQ_ORDER get_appid_req;
+       RAIL_GET_APPID_RESP_ORDER get_appid_resp;
+
+} RAIL_ORDERS;
+
+typedef struct
+{
+       RAIL_ORDERS order_info;
+       uint32 event_type;
+}
+RAIL_EVENT;
+
+typedef struct
+{
+       rdpChannels* chan_man;
+       freerdp*    instance;
+       int         th_count;
+       int         th_to_finish;
+
+       RAIL_ORDERS out_rail_orders;
+
+       RAIL_EVENT  in_events[20];
+       size_t      in_events_number;
+
+       STREAM      in_streams[20];
+       size_t      in_streams_number;
+
+       RDP_PLUGIN_DATA plugin_data;
+
+
+} thread_param;
+
+static thread_param* global_thread_params = NULL;
+
+//-----------------------------------------------------------------------------
+int stream_equal_dump(void * dataS, size_t sizeS, void * data, size_t size)
+{
+       size_t i;
+       if (sizeS != size)
+       {
+               printf("----------------- stream_equal_dump -----------------\n");
+               printf("Stream and dump have different length (%d != %d)\n",
+                       (int) sizeS, (int) size);
+               printf("Stream hexdump:\n");
+               freerdp_hexdump(dataS, sizeS);
+
+               printf("Dump hexdump:\n");
+               freerdp_hexdump(data, size);
+
+               printf("----------------- stream_equal_dump -----------------\n");
+               return 0;
+       }
+
+
+       for (i=0; i < size; i++)
+       {
+               if (((uint8*)dataS)[i] != ((uint8*)data)[i])
+               {
+                       printf("----------------- stream_equal_dump -----------------\n");
+                       printf("Stream and dump have different content from %d offset.\n", (int) i);
+                       printf("Stream hexdump:\n");
+                       freerdp_hexdump(dataS, sizeS);
+
+                       printf("Dump hexdump:\n");
+                       freerdp_hexdump(data, size);
+                       printf("----------------- stream_equal_dump -----------------\n");
+                       return 0;
+               }
+       }
+
+       return 1;
+}
+//-----------------------------------------------------------------------------
+static void test_on_free_rail_client_event(RDP_EVENT* event)
+{
+       if (event->event_class == RDP_EVENT_CLASS_RAIL)
+       {
+               rail_free_cloned_order(event->event_type, event->user_data);
+       }
+}
+//-----------------------------------------------------------------------------
+static void send_ui_event2plugin(
+       rdpChannels* chan_man,
+       uint16 event_type,
+       void * data
+       )
+{
+       RDP_EVENT* out_event = NULL;
+       void * payload = NULL;
+
+       payload = rail_clone_order(event_type, data);
+       if (payload != NULL)
+       {
+               out_event = freerdp_event_new(RDP_EVENT_CLASS_RAIL, event_type,
+                               test_on_free_rail_client_event, payload);
+               freerdp_channels_send_event(chan_man, out_event);
+       }
+}
+//-----------------------------------------------------------------------------
+static void emulate_server_send_channel_data(
+       freerdp* instance,
+       void* data,
+       size_t size
+       )
+{
+       static int counter = 0;
+       counter++;
+
+       printf("Emulate server packet (%d packet):\n", counter);
+       freerdp_hexdump(data, size);
+
+       freerdp_channels_data(instance, 0, (char*)data, size,
+                       CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, size);
+       usleep(10*1000);
+}
+static void save_dump(void* data, size_t size)
+{
+       thread_param * p = global_thread_params;
+       if (p->in_streams_number < RAIL_ARRAY_SIZE(p->in_streams))
+       {
+               STREAM* s = &p->in_streams[p->in_streams_number];
+               s->data = malloc(size);
+               s->size = size;
+
+               memcpy(s->data, data, size);
+               p->in_streams_number++;
+       }
+}
+//-----------------------------------------------------------------------------
+static int emulate_client_send_channel_data(
+       freerdp* freerdp, int channelId, uint8* data, int size
+       )
+{
+       static int counter = 0;
+       counter++;
+
+       printf("Client send to server (%d packet):\n", counter);
+       freerdp_hexdump(data, size);
+
+       // add to global dumps list
+       save_dump(data, size);
+
+       return 0;
+}
+//-----------------------------------------------------------------------------
+void save_event(RDP_EVENT* event, RAIL_EVENT* rail_event)
+{
+       rail_event->event_type = event->event_type;
+
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS:
+                       printf("UI receive Get Sysparams Event\n");
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS:
+                       {
+                               RAIL_EXEC_RESULT_ORDER* exec_result = (RAIL_EXEC_RESULT_ORDER*)event->user_data;
+                               printf("UI receive Exec Results Event\n");
+                               memcpy(&rail_event->order_info.exec_result, event->user_data,
+                                       sizeof(RAIL_EXEC_RESULT_ORDER));
+
+                               rail_unicode_string_alloc(&rail_event->order_info.exec_result.exeOrFile,
+                                               exec_result->exeOrFile.length);
+
+                               memcpy(rail_event->order_info.exec_result.exeOrFile.string,
+                                       exec_result->exeOrFile.string,
+                                       exec_result->exeOrFile.length);
+                       }
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM:
+                       printf("UI receive Server Sysparam Event\n");
+                       memcpy(&rail_event->order_info.sysparam, event->user_data,
+                               sizeof(RAIL_SYSPARAM_ORDER));
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO:
+                       printf("UI receive Server Minmax Info Event\n");
+                       memcpy(&rail_event->order_info.minmaxinfo, event->user_data,
+                               sizeof(RAIL_MINMAXINFO_ORDER));
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE:
+                       printf("UI receive Server Local Movesize Event\n");
+                       memcpy(&rail_event->order_info.localmovesize, event->user_data,
+                               sizeof(RAIL_LOCALMOVESIZE_ORDER));
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP:
+                       printf("UI receive AppId Response Event\n");
+                       memcpy(&rail_event->order_info.get_appid_resp, event->user_data,
+                               sizeof(RAIL_GET_APPID_RESP_ORDER));
+
+                       rail_event->order_info.get_appid_resp.applicationId.string =
+                               &rail_event->order_info.get_appid_resp.applicationIdBuffer[0];
+                       break;
+
+               case RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO:
+                       printf("UI receive Language Info Event\n");
+                       memcpy(&rail_event->order_info.langbar_info, event->user_data,
+                               sizeof(RAIL_LANGBAR_INFO_ORDER));
+                       break;
+       }
+}
+//-----------------------------------------------------------------------------
+static void process_events_and_channel_data_from_plugin(thread_param* param)
+{
+       RDP_EVENT* event;
+
+       param->th_count++;
+       while (param->th_to_finish == 0)
+       {
+               freerdp_channels_check_fds(param->chan_man, param->instance);
+
+               while (1)
+               {
+                       event = freerdp_channels_pop_event(param->chan_man);
+                       if (event == NULL) break;
+
+                       static int counter = 0;
+                       counter++;
+
+                       printf("UI receive event. (type=%d counter=%d).\n",
+                                       event->event_type,
+                                       counter);
+
+                       // add to global event list
+                       if (param->in_events_number < RAIL_ARRAY_SIZE(param->in_events))
+                       {
+                               save_event(event, &param->in_events[param->in_events_number]);
+                               param->in_events_number++;
+                       }
+                       freerdp_event_free(event);
+               }
+
+               usleep(1000);
+       }
+       param->th_count--;
+}
+//-----------------------------------------------------------------------------
+void* thread_func(void* param)
+{
+       thread_param* th_param = (thread_param*)param;
+       process_events_and_channel_data_from_plugin(th_param);
+       pthread_detach(pthread_self());
+
+       return NULL;
+}
+//-----------------------------------------------------------------------------
+void test_rail_plugin(void)
+{
+       thread_param param;
+       pthread_t thread;
+
+       rdpChannels* chan_man;
+       rdpSettings settings = { 0 };
+       freerdp s_inst = { 0 };
+       freerdp* inst = &s_inst;
+       size_t sn = 0;
+       size_t en = 0;
+       STREAM* ss = NULL;
+       RAIL_EVENT* ee = NULL;
+
+       printf("\n");
+
+       settings.hostname = "testhost";
+       inst->settings = &settings;
+       inst->SendChannelData = emulate_client_send_channel_data;
+
+       chan_man = freerdp_channels_new();
+
+       freerdp_channels_load_plugin(chan_man, &settings, "../channels/rail/rail.so", NULL);
+       freerdp_channels_pre_connect(chan_man, inst);
+       freerdp_channels_post_connect(chan_man, inst);
+
+       memset(&param, 0, sizeof(param));
+
+       param.chan_man = chan_man;
+       param.instance = inst;
+       param.th_count = 0;
+       param.th_to_finish = 0;
+
+       global_thread_params = &param;
+
+       pthread_create(&thread, 0, thread_func, &param);
+
+       // 1. Emulate server handshake binary
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_handshake);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_exec_result_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_sysparam1_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_sysparam2_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_localmovesize_start_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_localmovesize_stop_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_minmaxinfo_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_langbar_pdu);
+       EMULATE_SERVER_SEND_CHANNEL_DATA(inst, server_app_get_resp_pdu);
+
+       // 2. Send UI events
+
+       param.out_rail_orders.sysparam.params = 0;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_SET_HIGH_CONTRAST;
+       param.out_rail_orders.sysparam.highContrast.flags = 0x7e;
+       param.out_rail_orders.sysparam.highContrast.colorScheme.length = 0;
+       param.out_rail_orders.sysparam.highContrast.colorScheme.string = NULL;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_TASKBAR_POS;
+       param.out_rail_orders.sysparam.taskbarPos.left = 0;
+       param.out_rail_orders.sysparam.taskbarPos.top = 0x039a;
+       param.out_rail_orders.sysparam.taskbarPos.right = 0x0690;
+       param.out_rail_orders.sysparam.taskbarPos.bottom = 0x03c2;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_SET_MOUSE_BUTTON_SWAP;
+       param.out_rail_orders.sysparam.mouseButtonSwap = false;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_SET_KEYBOARD_PREF;
+       param.out_rail_orders.sysparam.keyboardPref = false;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_SET_DRAG_FULL_WINDOWS;
+       param.out_rail_orders.sysparam.dragFullWindows = true;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_SET_KEYBOARD_CUES;
+       param.out_rail_orders.sysparam.keyboardCues = false;
+
+       param.out_rail_orders.sysparam.params |= SPI_MASK_SET_WORK_AREA;
+       param.out_rail_orders.sysparam.workArea.left = 0;
+       param.out_rail_orders.sysparam.workArea.top = 0;
+       param.out_rail_orders.sysparam.workArea.right = 0x0690;
+       param.out_rail_orders.sysparam.workArea.bottom = 0x039a;
+
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS,
+               &param.out_rail_orders.sysparam);
+
+       param.plugin_data.size = sizeof(RDP_PLUGIN_DATA);
+       param.plugin_data.data[0] = "||iexplore";
+       param.plugin_data.data[1] = "f:\\windows\\system32";
+       param.plugin_data.data[2] = "www.bing.com";
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_EXEC_REMOTE_APP,
+               &param.plugin_data);
+
+       param.out_rail_orders.activate.enabled = true;
+       param.out_rail_orders.activate.windowId = 0x0007008e;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE,
+               &param.out_rail_orders.activate);
+
+       param.out_rail_orders.syscommand.windowId = 0x00020052;
+       param.out_rail_orders.syscommand.command  = 0xf020;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND,
+               &param.out_rail_orders.syscommand);
+
+       param.out_rail_orders.notify_event.windowId = 0x000201aa;
+       param.out_rail_orders.notify_event.notifyIconId = 0x02;
+       param.out_rail_orders.notify_event.message = 0x0204;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_NOTIFY_EVENT,
+               &param.out_rail_orders.notify_event);
+
+
+       param.out_rail_orders.window_move.windowId = 0x00020020;
+       param.out_rail_orders.window_move.left = 0x0309;
+       param.out_rail_orders.window_move.top = 0x0100;
+       param.out_rail_orders.window_move.right = 0x05db;
+       param.out_rail_orders.window_move.bottom = 0x0188;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE,
+               &param.out_rail_orders.window_move);
+
+       param.out_rail_orders.sysmenu.windowId = 0x00090122;
+       param.out_rail_orders.sysmenu.left = 0xffa4; // TODO: possible negative values?
+       param.out_rail_orders.sysmenu.top = 0x024a;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_SYSMENU,
+               &param.out_rail_orders.sysmenu);
+
+       param.out_rail_orders.langbar_info.languageBarStatus = 0x00000001;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_LANGBARINFO,
+               &param.out_rail_orders.langbar_info);
+
+       param.out_rail_orders.get_appid_req.windowId = 0x00020052;
+       send_ui_event2plugin(chan_man, RDP_EVENT_TYPE_RAIL_CLIENT_APPID_REQ,
+               &param.out_rail_orders.get_appid_req);
+
+       // Waiting for possible events or data
+       sleep(1);
+
+       // Finishing thread and wait for it
+       param.th_to_finish = 1;
+       while (param.th_count > 0)
+       {
+               usleep(1000);
+       }
+
+       // We need to collected all events and data dumps and then to.
+       // create CU_ASSERT series here!
+       sn = param.in_streams_number;
+       en = param.in_events_number;
+       ss = &param.in_streams[0];
+       ee = &param.in_events[0];
+
+       CU_ASSERT(sn > 0 && STREAM_EQUAL_TO_DUMP(&ss[ 0], client_handshake));
+       CU_ASSERT(sn > 1 && STREAM_EQUAL_TO_DUMP(&ss[ 1], client_info_pdu));
+       CU_ASSERT(sn > 2 && STREAM_EQUAL_TO_DUMP(&ss[ 2], client_sysparam_highcontrast_pdu));
+       CU_ASSERT(sn > 3 && STREAM_EQUAL_TO_DUMP(&ss[ 3], client_sysparam_taskbarpos_pdu));
+       CU_ASSERT(sn > 4 && STREAM_EQUAL_TO_DUMP(&ss[ 4], client_sysparam_mousebuttonswap_pdu));
+       CU_ASSERT(sn > 5 && STREAM_EQUAL_TO_DUMP(&ss[ 5], client_sysparam_keyboardpref_pdu));
+       CU_ASSERT(sn > 6 && STREAM_EQUAL_TO_DUMP(&ss[ 6], client_sysparam_dragfullwindow_pdu));
+       CU_ASSERT(sn > 7 && STREAM_EQUAL_TO_DUMP(&ss[ 7], client_sysparam_keyboardcues_pdu));
+       CU_ASSERT(sn > 8 && STREAM_EQUAL_TO_DUMP(&ss[ 8], client_sysparam_setworkarea_pdu));
+       CU_ASSERT(sn > 9 && STREAM_EQUAL_TO_DUMP(&ss[ 9], client_execute_pdu));
+       CU_ASSERT(sn >10 && STREAM_EQUAL_TO_DUMP(&ss[10], client_activate_pdu));
+       CU_ASSERT(sn >11 && STREAM_EQUAL_TO_DUMP(&ss[11], client_syscommand_pdu));
+       CU_ASSERT(sn >12 && STREAM_EQUAL_TO_DUMP(&ss[12], client_notify_pdu));
+       CU_ASSERT(sn >13 && STREAM_EQUAL_TO_DUMP(&ss[13], client_windowmove_pdu));
+       CU_ASSERT(sn >14 && STREAM_EQUAL_TO_DUMP(&ss[14], client_system_menu_pdu));
+       CU_ASSERT(sn >15 && STREAM_EQUAL_TO_DUMP(&ss[15], client_langbar_pdu));
+       CU_ASSERT(sn >16 && STREAM_EQUAL_TO_DUMP(&ss[16], client_get_app_id_req_pdu));
+
+       CU_ASSERT(en >  0 && ee[ 0].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS);
+       CU_ASSERT(en >  1 &&
+               ee[ 1].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS &&
+               ee[ 1].order_info.exec_result.flags == 0x08 &&
+               ee[ 1].order_info.exec_result.execResult == 0x03 &&
+               UNICODE_STRING_EQUAL_TO_DUMP(
+                       &ee[ 1].order_info.exec_result.exeOrFile,
+                       server_exec_result_exe_or_file)
+               );
+       CU_ASSERT(en >  2 &&
+               ee[ 2].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM &&
+               ee[ 2].order_info.sysparam.setScreenSaveSecure == false
+               );
+
+       CU_ASSERT(en >  3 &&
+               ee[ 3].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM &&
+               ee[ 3].order_info.sysparam.setScreenSaveActive == false
+               );
+
+       CU_ASSERT(en >  4 &&
+               ee[ 4].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE &&
+               ee[ 4].order_info.localmovesize.windowId == 0x0007008e &&
+               ee[ 4].order_info.localmovesize.isMoveSizeStart == true &&
+               ee[ 4].order_info.localmovesize.moveSizeType == RAIL_WMSZ_MOVE &&
+               ee[ 4].order_info.localmovesize.posX == 0x017e &&
+               ee[ 4].order_info.localmovesize.posY == 0x000a
+               );
+
+       CU_ASSERT(en >  5 &&
+               ee[ 5].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE &&
+               ee[ 5].order_info.localmovesize.windowId == 0x0007008e &&
+               ee[ 5].order_info.localmovesize.isMoveSizeStart == false &&
+               ee[ 5].order_info.localmovesize.moveSizeType == RAIL_WMSZ_MOVE &&
+               ee[ 5].order_info.localmovesize.posX == 0x00a6 &&
+               ee[ 5].order_info.localmovesize.posY == 0x0044
+               );
+
+       CU_ASSERT(en >  6 &&
+               ee[ 6].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO &&
+               ee[ 6].order_info.minmaxinfo.windowId == 0x0007008e &&
+               ee[ 6].order_info.minmaxinfo.maxWidth == 0x0408 &&
+               ee[ 6].order_info.minmaxinfo.maxHeight == 0x02d6 &&
+               ee[ 6].order_info.minmaxinfo.maxPosX ==  0x0000 &&
+               ee[ 6].order_info.minmaxinfo.maxPosY ==  0x0000 &&
+               ee[ 6].order_info.minmaxinfo.minTrackWidth ==  0x0070 &&
+               ee[ 6].order_info.minmaxinfo.minTrackHeight ==  0x001b &&
+               ee[ 6].order_info.minmaxinfo.maxTrackWidth ==  0x040c &&
+               ee[ 6].order_info.minmaxinfo.maxTrackHeight ==  0x030c
+               );
+
+       CU_ASSERT(en >  7 &&
+               ee[ 7].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO &&
+               ee[ 7].order_info.langbar_info.languageBarStatus == TF_SFT_SHOWNORMAL
+               );
+
+       CU_ASSERT(en >  8 &&
+               ee[ 8].event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP &&
+               ee[ 8].order_info.get_appid_resp.windowId == 0x00020052 &&
+               UNICODE_STRING_EQUAL_TO_DUMP(
+                       &ee[ 8].order_info.get_appid_resp.applicationId,
+                       server_app_get_resp_app_id
+                       )
+               );
+
+       freerdp_channels_close(chan_man, inst);
+       freerdp_channels_free(chan_man);
+}
+
+
+
+
diff --git a/cunit/test_rail.h b/cunit/test_rail.h
new file mode 100644 (file)
index 0000000..a39d18e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   RAIL(TS RemoteApp) Virtual Channel Unit Tests
+
+   Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#include "test_freerdp.h"
+
+int init_rail_suite(void);
+int clean_rail_suite(void);
+int add_rail_suite(void);
+
+void test_rail_plugin(void);
diff --git a/cunit/test_stream.c b/cunit/test_stream.c
new file mode 100644 (file)
index 0000000..ae1a9e2
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Stream Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/stream.h>
+
+#include "test_stream.h"
+
+int init_stream_suite(void)
+{
+       return 0;
+}
+
+int clean_stream_suite(void)
+{
+       return 0;
+}
+
+int add_stream_suite(void)
+{
+       add_test_suite(stream);
+
+       add_test_function(stream);
+
+       return 0;
+}
+
+void test_stream(void)
+{
+       STREAM * stream;
+       int pos;
+       uint32 n;
+       uint64 n64;
+
+       stream = stream_new(1);
+       pos = stream_get_pos(stream);
+
+       stream_write_uint8(stream, 0xFE);
+
+       stream_check_size(stream, 14);
+       stream_write_uint16(stream, 0x0102);
+       stream_write_uint32(stream, 0x03040506);
+       stream_write_uint64(stream, 0x0708091011121314LL);
+
+       /* freerdp_hexdump(stream->buffer, 15); */
+
+       stream_set_pos(stream, pos);
+       stream_seek(stream, 3);
+       stream_read_uint32(stream, n);
+       stream_read_uint64(stream, n64);
+
+       CU_ASSERT(n == 0x03040506);
+       CU_ASSERT(n64 == 0x0708091011121314LL);
+
+       stream_free(stream);
+}
diff --git a/cunit/test_stream.h b/cunit/test_stream.h
new file mode 100644 (file)
index 0000000..32080ed
--- /dev/null
@@ -0,0 +1,26 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Stream Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_stream_suite(void);
+int clean_stream_suite(void);
+int add_stream_suite(void);
+
+void test_stream(void);
diff --git a/cunit/test_utils.c b/cunit/test_utils.c
new file mode 100644 (file)
index 0000000..31fbdf2
--- /dev/null
@@ -0,0 +1,672 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Utils Unit Tests
+ *
+ * Copyright 2011 Vic Lee, 2011 Shea Levy
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define _XOPEN_SOURCE 700
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/select.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <termios.h>
+#include <unistd.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/mutex.h>
+#include <freerdp/utils/semaphore.h>
+#include <freerdp/utils/load_plugin.h>
+#include <freerdp/utils/wait_obj.h>
+#include <freerdp/utils/args.h>
+#include <freerdp/utils/passphrase.h>
+#include <freerdp/utils/signal.h>
+
+#include "test_utils.h"
+
+int init_utils_suite(void)
+{
+       return 0;
+}
+
+int clean_utils_suite(void)
+{
+       return 0;
+}
+
+int add_utils_suite(void)
+{
+       add_test_suite(utils);
+
+       add_test_function(mutex);
+       add_test_function(semaphore);
+       add_test_function(load_plugin);
+       add_test_function(wait_obj);
+       add_test_function(args);
+       add_test_function(passphrase_read);
+       add_test_function(handle_signals);
+
+       return 0;
+}
+
+void test_mutex(void)
+{
+       freerdp_mutex mutex;
+
+       mutex = freerdp_mutex_new();
+       freerdp_mutex_lock(mutex);
+       freerdp_mutex_unlock(mutex);
+       freerdp_mutex_free(mutex);
+}
+
+void test_semaphore(void)
+{
+       freerdp_sem sem;
+
+       sem = freerdp_sem_new(1);
+       freerdp_sem_wait(sem);
+       freerdp_sem_signal(sem);
+       freerdp_sem_free(sem);
+}
+
+void test_load_plugin(void)
+{
+       void* entry;
+
+#ifdef _WIN32
+       /* untested */
+       entry = freerdp_load_plugin("..\\channels\\cliprdr\\cliprdr", "VirtualChannelEntry");
+#else
+       entry = freerdp_load_plugin("../channels/cliprdr/cliprdr.so", "VirtualChannelEntry");
+#endif
+       CU_ASSERT(entry != NULL);
+}
+
+void test_wait_obj(void)
+{
+       struct wait_obj* wo;
+       int set;
+
+       wo = wait_obj_new();
+
+       set = wait_obj_is_set(wo);
+       CU_ASSERT(set == 0);
+
+       wait_obj_set(wo);
+       set = wait_obj_is_set(wo);
+       CU_ASSERT(set == 1);
+
+       wait_obj_clear(wo);
+       set = wait_obj_is_set(wo);
+       CU_ASSERT(set == 0);
+
+       wait_obj_select(&wo, 1, 1000);
+
+       wait_obj_free(wo);
+}
+
+static int process_plugin_args(rdpSettings* settings, const char* name,
+       RDP_PLUGIN_DATA* plugin_data, void* user_data)
+{
+       /*printf("load plugin: %s\n", name);*/
+       return 1;
+}
+
+static int process_ui_args(rdpSettings* settings, const char* opt,
+       const char* val, void* user_data)
+{
+       /*printf("ui arg: %s %s\n", opt, val);*/
+       return 1;
+}
+
+void test_args(void)
+{
+       char* argv_c[] =
+       {
+               "freerdp", "-a", "8", "-u", "testuser", "-d", "testdomain", "-g", "640x480", "address1:3389",
+               "freerdp", "-a", "16", "-u", "testuser", "-d", "testdomain", "-g", "1280x960", "address2:3390"
+       };
+       char** argv = argv_c;
+       int argc = sizeof(argv_c) / sizeof(char*);
+       int i;
+       int c;
+       rdpSettings* settings;
+
+       i = 0;
+       while (argc > 0)
+       {
+               settings = settings_new(NULL);
+
+               i++;
+               c = freerdp_parse_args(settings, argc, argv, process_plugin_args, NULL, process_ui_args, NULL);
+               CU_ASSERT(c > 0);
+               if (c == 0)
+               {
+                       settings_free(settings);
+                       break;
+               }
+               CU_ASSERT(settings->color_depth == i * 8);
+               CU_ASSERT(settings->width == i * 640);
+               CU_ASSERT(settings->height == i * 480);
+               CU_ASSERT(settings->port == i + 3388);
+
+               settings_free(settings);
+               argc -= c;
+               argv += c;
+       }
+       CU_ASSERT(i == 2);
+}
+
+void passphrase_read_prompts_to_tty()
+{
+       static const int read_nbyte = 11;
+       int masterfd;
+       char* slavedevice;
+       char read_buf[read_nbyte];
+       fd_set fd_set_write;
+
+       masterfd = posix_openpt(O_RDWR|O_NOCTTY);
+
+       if (masterfd == -1
+               || grantpt (masterfd) == -1
+               || unlockpt (masterfd) == -1
+               || (slavedevice = ptsname (masterfd)) == NULL)
+               CU_FAIL_FATAL("Could not create pty");
+
+       switch (fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       char buffer[password_size];
+                       int slavefd;
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       if ((slavefd = open(slavedevice, O_RDWR)) == 0)
+                               CU_FAIL_FATAL("Could not open slave end of pty");
+                       close(STDIN_FILENO);
+                       close(STDOUT_FILENO);
+                       close(STDERR_FILENO);
+                       close(masterfd);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       close(slavefd);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+
+       read_buf[read_nbyte - 1] = '\0';
+
+       FD_ZERO(&fd_set_write);
+       FD_SET(masterfd, &fd_set_write);
+       if (select(masterfd + 1, NULL, &fd_set_write, NULL, NULL) == -1)
+               CU_FAIL_FATAL("Master end of pty not writeable");
+       if (read(masterfd, read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to slave end of pty");
+       CU_ASSERT_STRING_EQUAL(read_buf, "Password: ");
+
+       write(masterfd, "\n", (size_t) 2);
+       close(masterfd);
+       return;
+}
+
+void passphrase_read_reads_from_tty()
+{
+       static const int read_nbyte = 11;
+       int masterfd;
+       int pipe_ends[2];
+       char* slavedevice;
+       char read_buf[read_nbyte];
+       fd_set fd_set_write;
+
+       masterfd = posix_openpt(O_RDWR|O_NOCTTY);
+
+       if (masterfd == -1
+               || grantpt (masterfd) == -1
+               || unlockpt (masterfd) == -1
+               || (slavedevice = ptsname (masterfd)) == NULL)
+               CU_FAIL_FATAL("Could not create pty");
+
+       if (pipe(pipe_ends) != 0)
+               CU_FAIL_FATAL("Could not create pipe");
+
+       switch (fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       char buffer[password_size];
+                       int slavefd;
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       if ((slavefd = open(slavedevice, O_RDWR)) == 0)
+                               CU_FAIL_FATAL("Could not open slave end of pty");
+                       close(STDIN_FILENO);
+                       close(STDOUT_FILENO);
+                       close(STDERR_FILENO);
+                       close(masterfd);
+                       close(pipe_ends[0]);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       write(pipe_ends[1], buffer, password_size);
+                       close(slavefd);
+                       close(pipe_ends[1]);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+
+       close(pipe_ends[1]);
+       read_buf[read_nbyte - 1] = '\0';
+
+       FD_ZERO(&fd_set_write);
+       FD_SET(masterfd, &fd_set_write);
+       if (select(masterfd + 1, NULL, &fd_set_write, NULL, NULL) == -1)
+               CU_FAIL_FATAL("Master end of pty not writeable");
+       if (read(masterfd, read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to slave end of pty");
+
+       write(masterfd, "passw0rd\n", sizeof "passw0rd\n");
+       if (read(pipe_ends[0], read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to pipe");
+       CU_ASSERT_STRING_EQUAL(read_buf, "passw0rd");
+       close(masterfd);
+       close(pipe_ends[0]);
+       return;
+}
+
+void passphrase_read_turns_off_echo_during_read()
+{
+       static const int read_nbyte = 11;
+       int masterfd, slavefd;
+       char* slavedevice;
+       char read_buf[read_nbyte];
+       fd_set fd_set_write;
+       struct termios term_flags;
+
+       masterfd = posix_openpt(O_RDWR|O_NOCTTY);
+
+       if (masterfd == -1
+               || grantpt (masterfd) == -1
+               || unlockpt (masterfd) == -1
+               || (slavedevice = ptsname (masterfd)) == NULL)
+               CU_FAIL_FATAL("Could not create pty");
+
+       slavefd = open(slavedevice, O_RDWR|O_NOCTTY);
+       if (slavefd == -1)
+               CU_FAIL_FATAL("Could not open slave end of pty");
+
+       if (tcgetattr(slavefd, &term_flags) != 0)
+               CU_FAIL_FATAL("Could not get slave pty attributes");
+       if (!(term_flags.c_lflag & ECHO))
+       {
+               term_flags.c_lflag |= ECHO;
+               if (tcsetattr(slavefd, TCSANOW, &term_flags) != 0)
+                       CU_FAIL_FATAL("Could not turn ECHO on on slave pty");
+       }
+
+       switch (fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       int child_slavefd;
+                       char buffer[password_size];
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       if ((child_slavefd = open(slavedevice, O_RDWR)) == 0)
+                               CU_FAIL_FATAL("Could not open slave end of pty");
+                       close(STDIN_FILENO);
+                       close(STDOUT_FILENO);
+                       close(STDERR_FILENO);
+                       close(masterfd);
+                       close(slavefd);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       close(child_slavefd);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+
+       read_buf[read_nbyte - 1] = '\0';
+
+       FD_ZERO(&fd_set_write);
+       FD_SET(masterfd, &fd_set_write);
+       if (select(masterfd + 1, NULL, &fd_set_write, NULL, NULL) == -1)
+               CU_FAIL_FATAL("Master end of pty not writeable");
+       if (read(masterfd, read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to slave end of pty");
+
+       if (tcgetattr(slavefd, &term_flags) != 0)
+               CU_FAIL_FATAL("Could not get slave pty attributes");
+       CU_ASSERT(!(term_flags.c_lflag & ECHO))
+       write(masterfd, "\n", (size_t) 2);
+       close(masterfd);
+       close(slavefd);
+       return;
+}
+
+void passphrase_read_resets_terminal_after_read()
+{
+       static const int read_nbyte = 11;
+       int masterfd, slavefd, status;
+       char* slavedevice;
+       char read_buf[read_nbyte];
+       fd_set fd_set_write;
+       struct termios term_flags;
+       pid_t child;
+
+       masterfd = posix_openpt(O_RDWR|O_NOCTTY);
+
+       if (masterfd == -1
+               || grantpt (masterfd) == -1
+               || unlockpt (masterfd) == -1
+               || (slavedevice = ptsname (masterfd)) == NULL)
+               CU_FAIL_FATAL("Could not create pty");
+
+       slavefd = open(slavedevice, O_RDWR|O_NOCTTY);
+       if (slavefd == -1)
+               CU_FAIL_FATAL("Could not open slave end of pty");
+
+       if (tcgetattr(slavefd, &term_flags) != 0)
+               CU_FAIL_FATAL("Could not get slave pty attributes");
+       if (!(term_flags.c_lflag & ECHO))
+       {
+               term_flags.c_lflag |= ECHO;
+               if (tcsetattr(slavefd, TCSANOW, &term_flags) != 0)
+                       CU_FAIL_FATAL("Could not turn ECHO on on slave pty");
+       }
+
+       switch (child = fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       int child_slavefd;
+                       char buffer[password_size];
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       if ((child_slavefd = open(slavedevice, O_RDWR)) == 0)
+                               CU_FAIL_FATAL("Could not open slave end of pty");
+                       close(STDIN_FILENO);
+                       close(STDOUT_FILENO);
+                       close(STDERR_FILENO);
+                       close(masterfd);
+                       close(slavefd);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       close(child_slavefd);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+
+       read_buf[read_nbyte - 1] = '\0';
+
+       FD_ZERO(&fd_set_write);
+       FD_SET(masterfd, &fd_set_write);
+       if (select(masterfd + 1, NULL, &fd_set_write, NULL, NULL) == -1)
+               CU_FAIL_FATAL("Master end of pty not writeable");
+       if (read(masterfd, read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to slave end of pty");
+
+       write(masterfd, "\n", (size_t) 2);
+       waitpid(child, &status, WUNTRACED);
+       if (tcgetattr(slavefd, &term_flags) != 0)
+               CU_FAIL_FATAL("Could not get slave pty attributes");
+       CU_ASSERT(term_flags.c_lflag & ECHO)
+       close(masterfd);
+       close(slavefd);
+       return;
+}
+
+void passphrase_read_turns_on_newline_echo_during_read()
+{
+       static const int read_nbyte = 11;
+       int masterfd, slavefd;
+       char* slavedevice;
+       char read_buf[read_nbyte];
+       fd_set fd_set_write;
+       struct termios term_flags;
+
+       masterfd = posix_openpt(O_RDWR|O_NOCTTY);
+
+       if (masterfd == -1
+               || grantpt (masterfd) == -1
+               || unlockpt (masterfd) == -1
+               || (slavedevice = ptsname (masterfd)) == NULL)
+               CU_FAIL_FATAL("Could not create pty");
+
+       slavefd = open(slavedevice, O_RDWR|O_NOCTTY);
+       if (slavefd == -1)
+               CU_FAIL_FATAL("Could not open slave end of pty");
+
+       if (tcgetattr(slavefd, &term_flags) != 0)
+               CU_FAIL_FATAL("Could not get slave pty attributes");
+       if (term_flags.c_lflag & ECHONL)
+       {
+               term_flags.c_lflag &= ~ECHONL;
+               if (tcsetattr(slavefd, TCSANOW, &term_flags) != 0)
+                       CU_FAIL_FATAL("Could not turn ECHO on on slave pty");
+       }
+
+       switch (fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       int child_slavefd;
+                       char buffer[password_size];
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       if ((child_slavefd = open(slavedevice, O_RDWR)) == 0)
+                               CU_FAIL_FATAL("Could not open slave end of pty");
+                       close(STDIN_FILENO);
+                       close(STDOUT_FILENO);
+                       close(STDERR_FILENO);
+                       close(masterfd);
+                       close(slavefd);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       close(child_slavefd);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+
+       read_buf[read_nbyte - 1] = '\0';
+
+       FD_ZERO(&fd_set_write);
+       FD_SET(masterfd, &fd_set_write);
+       if (select(masterfd + 1, NULL, &fd_set_write, NULL, NULL) == -1)
+               CU_FAIL_FATAL("Master end of pty not writeable");
+       if (read(masterfd, read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to slave end of pty");
+
+       if (tcgetattr(slavefd, &term_flags) != 0)
+               CU_FAIL_FATAL("Could not get slave pty attributes");
+       CU_ASSERT(term_flags.c_lflag & ECHONL)
+       write(masterfd, "\n", (size_t) 2);
+       close(masterfd);
+       close(slavefd);
+       return;
+}
+
+void passphrase_read_prompts_to_stderr_when_no_tty()
+{
+       static const int read_nbyte = 11;
+       int stdin_pipe[2], stderr_pipe[2];
+       char read_buf[read_nbyte];
+       struct sigaction ignore, orig;
+
+       ignore.sa_handler = SIG_IGN;
+       sigemptyset(&ignore.sa_mask);
+
+       if (pipe(stdin_pipe) != 0 || pipe(stderr_pipe) != 0)
+               CU_FAIL_FATAL("Could not create pipe");
+
+       switch (fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       char buffer[password_size];
+                       close(stderr_pipe[0]);
+                       close(stdin_pipe[1]);
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       dup2(stdin_pipe[0], STDIN_FILENO);
+                       dup2(stderr_pipe[1], STDERR_FILENO);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+       close(stderr_pipe[1]);
+       close(stdin_pipe[0]);
+
+       read_buf[read_nbyte - 1] = '\0';
+
+       if (read(stderr_pipe[0], read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to pipe");
+       CU_ASSERT_STRING_EQUAL(read_buf, "Password: ");
+
+       sigaction(SIGPIPE, &ignore, &orig);
+       write(stdin_pipe[1], "\n", (size_t) 2);
+       sigaction(SIGPIPE, &orig, NULL);
+       close(stderr_pipe[0]);
+       close(stdin_pipe[1]);
+       return;
+}
+
+void passphrase_read_reads_from_stdin_when_no_tty()
+{
+       static const int read_nbyte = 11;
+       int stdin_pipe[2], stderr_pipe[2], result_pipe[2];
+       char read_buf[read_nbyte];
+       struct sigaction ignore, orig;
+
+       ignore.sa_handler = SIG_IGN;
+       sigemptyset(&ignore.sa_mask);
+
+       if (pipe(stdin_pipe) != 0
+               || pipe(stderr_pipe) != 0
+               || pipe(result_pipe) !=0)
+               CU_FAIL_FATAL("Could not create pipe");
+
+       switch (fork())
+       {
+       case -1:
+               CU_FAIL_FATAL("Could not fork");
+       case 0:
+               {
+                       static const int password_size = 512;
+                       char buffer[password_size];
+                       close(stderr_pipe[0]);
+                       close(result_pipe[0]);
+                       close(stdin_pipe[1]);
+                       if (setsid() == (pid_t) -1)
+                               CU_FAIL_FATAL("Could not create new session");
+
+                       dup2(stdin_pipe[0], STDIN_FILENO);
+                       dup2(stderr_pipe[1], STDERR_FILENO);
+                       freerdp_passphrase_read("Password: ", buffer, password_size);
+                       write(result_pipe[1], buffer, strlen(buffer) + (size_t) 1);
+                       exit(EXIT_SUCCESS);
+               }
+       }
+       close(stderr_pipe[1]);
+       close(result_pipe[1]);
+       close(stdin_pipe[0]);
+
+       read_buf[read_nbyte - 1] = '\0';
+
+       if (read(stderr_pipe[0], read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to pipe");
+
+       sigaction(SIGPIPE, &ignore, &orig);
+       write(stdin_pipe[1], "passw0rd\n", sizeof "passw0rd\n");
+       sigaction(SIGPIPE, &orig, NULL);
+
+       if (read(result_pipe[0], read_buf, read_nbyte) == (ssize_t) -1)
+               CU_FAIL_FATAL("Nothing written to pipe");
+       CU_ASSERT_STRING_EQUAL(read_buf, "passw0rd");
+
+       close(stderr_pipe[0]);
+       close(stdin_pipe[1]);
+       return;
+}
+
+void test_passphrase_read(void)
+{
+       passphrase_read_prompts_to_tty();
+       passphrase_read_reads_from_tty();
+       passphrase_read_turns_off_echo_during_read();
+       passphrase_read_resets_terminal_after_read();
+       passphrase_read_turns_on_newline_echo_during_read();
+       passphrase_read_prompts_to_stderr_when_no_tty();
+       passphrase_read_reads_from_stdin_when_no_tty();
+}
+
+void handle_signals_resets_terminal(void)
+{
+       int status, masterfd;
+       char* slavedevice;
+       struct termios test_flags;
+       pid_t child_pid;
+
+       masterfd = posix_openpt(O_RDWR|O_NOCTTY);
+
+       if (masterfd == -1
+               || grantpt (masterfd) == -1
+               || unlockpt (masterfd) == -1
+               || (slavedevice = ptsname (masterfd)) == NULL)
+               CU_FAIL_FATAL("Could not create pty");
+
+       terminal_fildes = open(slavedevice, O_RDWR|O_NOCTTY);
+       tcgetattr(terminal_fildes, &orig_flags);
+       new_flags = orig_flags;
+       new_flags.c_lflag &= ~ECHO;
+       tcsetattr(terminal_fildes, TCSANOW, &new_flags);
+       terminal_needs_reset = 1;
+
+       if((child_pid = fork()) == 0)
+       {
+               freerdp_handle_signals();
+               raise(SIGINT);
+       }
+       while(wait(&status) != -1);
+       tcgetattr(terminal_fildes, &test_flags);
+       CU_ASSERT_EQUAL(orig_flags.c_lflag, test_flags.c_lflag);
+       close(masterfd);
+       close(terminal_fildes);
+}
+
+void test_handle_signals(void)
+{
+       handle_signals_resets_terminal();
+}
diff --git a/cunit/test_utils.h b/cunit/test_utils.h
new file mode 100644 (file)
index 0000000..1bc37d9
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Utils Unit Tests
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "test_freerdp.h"
+
+int init_utils_suite(void);
+int clean_utils_suite(void);
+int add_utils_suite(void);
+
+void test_mutex(void);
+void test_semaphore(void);
+void test_load_plugin(void);
+void test_wait_obj(void);
+void test_args(void);
+void test_passphrase_read(void);
+void test_handle_signals(void);
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..5074670
--- /dev/null
@@ -0,0 +1,114 @@
+freerdp (1.0.1-1ubuntu2) precise; urgency=low
+
+  * debian/rules: Drop -Skde, autodetection will work fine.
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Tue, 14 Feb 2012 14:34:18 +0100
+
+freerdp (1.0.1-1ubuntu1) precise; urgency=low
+
+  * debian/control, debian/rules: Drop libavcodec-dev build dependency and
+    disable ffmpeg support, to avoid the banned libavcodec53 on the
+    installation images. Support for MMR will come back later in the planned
+    gstreamer rewrite. (LP: #931931)
+
+ -- Martin Pitt <martin.pitt@ubuntu.com>  Tue, 14 Feb 2012 13:26:44 +0100
+
+freerdp (1.0.1-1) unstable; urgency=low
+
+  [ Jeremy Bicha ]
+  * New upstream release. Closes: #659332.
+  * Updated symbols
+
+ -- Otavio Salvador <otavio@debian.org>  Sat, 11 Feb 2012 10:34:05 -0200
+
+freerdp (1.0.0-2) unstable; urgency=low
+
+  [ Jeremy Bicha ]
+  * Don't install the freerdp keymaps; they're provided by xkb   
+
+ -- Otavio Salvador <otavio@debian.org>  Tue, 31 Jan 2012 23:50:40 -0200
+
+freerdp (1.0.0-1) unstable; urgency=low
+
+  [ Jeremy Bicha ]
+  * New upstream release. Closes: #647498.
+  * Updated symbols and bumped soname
+  * debian/control:
+    - Added new build dependencies
+    - Bump Standards-Version to 3.9.2
+  * debian/source/format: Set to 3.0 (quilt)
+  * debian/rules: Turn on strict symbols checking
+  * debian/watch: Watch github
+
+  [ Jean-Louis Dupond ]
+  * debian/control: Updated homepage
+  * debian/copyright: Reflect upstream switch to the Apache license
+
+  [ Martin Pitt ]
+  * debian/libfreerdp0.symbols: Fix version number, should
+    be 1.0~beta5, not 1.0-beta5.
+  * debian/control: Add libavcodec-dev build dependency, upstream build system
+    checks for that. Thanks Jean-Louis Dupond!
+
+ -- Otavio Salvador <otavio@debian.org>  Tue, 31 Jan 2012 11:46:23 -0200
+
+freerdp (0.8.2-2) unstable; urgency=low
+
+  * freerdp-x11: recommends libfreerdp-plugins-standard. Closes:
+    #603462.
+
+ -- Otavio Salvador <otavio@debian.org>  Fri, 19 Nov 2010 19:27:45 -0200
+
+freerdp (0.8.2-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- Otavio Salvador <otavio@debian.org>  Sat, 13 Nov 2010 10:58:11 -0200
+
+freerdp (0.8.1-2) unstable; urgency=low
+
+  * Add symbols file to allow for correct depends. Closes: #602218.
+
+ -- Otavio Salvador <otavio@debian.org>  Wed, 03 Nov 2010 09:46:00 -0200
+
+freerdp (0.8.1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Otavio Salvador <otavio@debian.org>  Mon, 25 Oct 2010 14:29:02 -0200
+
+freerdp (0.7.4-1) unstable; urgency=low
+
+  * New upstream release.
+    - Fixes connection with VirtualBox RDP server. Closes: #592454.
+  * Bump standards-version; no changes needed.
+
+ -- Otavio Salvador <otavio@debian.org>  Thu, 26 Aug 2010 11:07:49 -0300
+
+freerdp (0.7.3-1) unstable; urgency=low
+
+  * New upstream release.
+  * Fix section of libfreerdp0 to follow overrides.
+  * Add a watch file so it is easier to track new releases.
+
+ -- Otavio Salvador <otavio@debian.org>  Tue, 27 Jul 2010 01:13:00 -0300
+
+freerdp (0.7.2-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Otavio Salvador <otavio@debian.org>  Mon, 05 Jul 2010 14:05:26 -0300
+
+freerdp (0.7.1-1) unstable; urgency=low
+
+  * New upstream release.
+  * debian/copyright: add missing entries.
+
+ -- Otavio Salvador <otavio@debian.org>  Wed, 23 Jun 2010 21:39:09 -0300
+
+freerdp (0.7.0+debian-1) unstable; urgency=low
+
+  * Initial release.
+  * Rebuild upstream tarball without debian directory.
+
+ -- Otavio Salvador <otavio@debian.org>  Fri, 18 Jun 2010 15:09:19 -0300
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7f8f011
--- /dev/null
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..d461a85
--- /dev/null
@@ -0,0 +1,85 @@
+Source: freerdp
+Section: x11
+Priority: optional
+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
+XSBC-Original-Maintainer: Otavio Salvador <otavio@debian.org>
+Build-Depends:
+ debhelper (>= 7.0.50~), autotools-dev, cmake, libasound2-dev, libcups2-dev,
+ libpcsclite-dev, libpulse-dev, libssl-dev, libx11-dev, libxcursor-dev,
+ libxdamage-dev, libxext-dev, libxkbfile-dev, libxinerama-dev, libxv-dev,
+ pkg-config, xmlto
+Standards-Version: 3.9.2
+Homepage: http://www.freerdp.com/
+Vcs-Browser: http://git.debian.org/?p=collab-maint/freerdp.git
+Vcs-Git: git://git.debian.org/git/collab-maint/freerdp.git
+
+Package: freerdp-dbg
+Section: debug
+Priority: extra
+Architecture: any
+Depends:
+ ${misc:Depends}, freerdp-x11 (= ${binary:Version}),
+ libfreerdp1 (= ${binary:Version}),
+ libfreerdp-plugins-standard (= ${binary:Version}),
+Description: RDP client for Windows Terminal Services (debug)
+ FreeRDP is a client for Windows Terminal Services implementing the Remote
+ Desktop Protocol (RDP).
+ .
+ This package contains the debug symbols.
+
+Package: freerdp-x11
+Section: x11
+Architecture: any
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Recommends: libfreerdp-plugins-standard
+Provides: freerdp
+Description: RDP client for Windows Terminal Services
+ FreeRDP is a client for Windows Terminal Services implementing the Remote
+ Desktop Protocol (RDP).
+ .
+ Currently, the following Windows Versions are supported:
+ .
+  * Windows NT Server
+  * Windows 2000 Terminal Server
+  * Windows XP
+  * Windows 2003 Server
+  * Windows Vista
+  * Windows 2008 Server
+  * Windows 7
+ .
+ This package contains the X11 based client.
+
+Package: libfreerdp1
+Architecture: any
+Section: libs
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Suggests: xfreerdp
+Description: RDP client for Windows Terminal Services (library)
+ FreeRDP is a client for Windows Terminal Services implementing the Remote
+ Desktop Protocol (RDP).
+ .
+ This package contains the shared library.
+
+Package: libfreerdp-plugins-standard
+Architecture: any
+Section: libs
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Description: RDP client for Windows Terminal Services (plugins)
+ FreeRDP is a client for Windows Terminal Services implementing the Remote
+ Desktop Protocol (RDP).
+ .
+ This package contains the plugins available to the Channel Manager extending
+ the RDP core functionality, such as sounds, clipboard synchronisation,
+ disk/printer redirection, etc.
+
+Package: libfreerdp-dev
+Section: libdevel
+Architecture: any
+Depends:
+ ${misc:Depends}, libfreerdp1 (= ${binary:Version}),
+ libfreerdp-plugins-standard (= ${binary:Version})
+Description: RDP client for Windows Terminal Services (development)
+ FreeRDP is a client for Windows Terminal Services implementing the Remote
+ Desktop Protocol (RDP).
+ .
+ This package contains the development files.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..87d01ef
--- /dev/null
@@ -0,0 +1,40 @@
+Upstream-Contact: FreeRDP project <freerdp-devel@lists.sourceforge.net>
+Upstream-Homepage: http://freerdp.sourceforge.net/
+
+Files: *
+License: Apache-2.0
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ .
+      http://www.apache.org/licenses/LICENSE-2.0
+ .
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/Apache-2.0 file.
+
+Files: debian/*
+Copyright: (C) 2011 Rex Tsai <rex.tsai@ubuntu.com>
+Copyright: (C) 2010 Otavio Salvador <otavio@debian.org>
+License: GPL-2+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-2 file.
diff --git a/debian/freerdp-x11.install b/debian/freerdp-x11.install
new file mode 100644 (file)
index 0000000..98d1583
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin
+usr/share/man/man1
diff --git a/debian/libfreerdp-dev.install b/debian/libfreerdp-dev.install
new file mode 100644 (file)
index 0000000..f72f502
--- /dev/null
@@ -0,0 +1,5 @@
+usr/include
+usr/lib/*.so
+#usr/lib/*.a
+#usr/lib/freerdp/*.a
+usr/lib/pkgconfig
diff --git a/debian/libfreerdp-plugins-standard.install b/debian/libfreerdp-plugins-standard.install
new file mode 100644 (file)
index 0000000..84afc47
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/freerdp/*.so
diff --git a/debian/libfreerdp1.install b/debian/libfreerdp1.install
new file mode 100644 (file)
index 0000000..093956b
--- /dev/null
@@ -0,0 +1 @@
+usr/lib/*.so.*
diff --git a/debian/libfreerdp1.symbols b/debian/libfreerdp1.symbols
new file mode 100644 (file)
index 0000000..fa869ed
--- /dev/null
@@ -0,0 +1,1279 @@
+libfreerdp-cache.so.1.0 libfreerdp1 #MINVER#
+ bitmap_cache_free@Base 1.0~beta5
+ bitmap_cache_get@Base 1.0~beta5
+ bitmap_cache_new@Base 1.0~beta5
+ bitmap_cache_put@Base 1.0~beta5
+ bitmap_cache_register_callbacks@Base 1.0~beta5
+ brush_cache_free@Base 1.0~beta5
+ brush_cache_get@Base 1.0~beta5
+ brush_cache_new@Base 1.0~beta5
+ brush_cache_put@Base 1.0~beta5
+ brush_cache_register_callbacks@Base 1.0~beta5
+ cache_free@Base 1.0~beta5
+ cache_new@Base 1.0~beta5
+ glyph_cache_fragment_get@Base 1.0~beta5
+ glyph_cache_fragment_put@Base 1.0~beta5
+ glyph_cache_free@Base 1.0~beta5
+ glyph_cache_get@Base 1.0~beta5
+ glyph_cache_new@Base 1.0~beta5
+ glyph_cache_put@Base 1.0~beta5
+ glyph_cache_register_callbacks@Base 1.0~beta5
+ offscreen_cache_delete@Base 1.0~beta5
+ offscreen_cache_free@Base 1.0~beta5
+ offscreen_cache_get@Base 1.0~beta5
+ offscreen_cache_new@Base 1.0~beta5
+ offscreen_cache_put@Base 1.0~beta5
+ offscreen_cache_register_callbacks@Base 1.0~beta5
+ palette_cache_free@Base 1.0~beta5
+ palette_cache_get@Base 1.0~beta5
+ palette_cache_new@Base 1.0~beta5
+ palette_cache_put@Base 1.0~beta5
+ palette_cache_register_callbacks@Base 1.0~beta5
+ pointer_cache_free@Base 1.0~beta5
+ pointer_cache_get@Base 1.0~beta5
+ pointer_cache_new@Base 1.0~beta5
+ pointer_cache_put@Base 1.0~beta5
+ pointer_cache_register_callbacks@Base 1.0~beta5
+ update_gdi_bitmap_update@Base 1.0~beta5
+ update_gdi_cache_bitmap@Base 1.0~beta5
+ update_gdi_cache_bitmap_v2@Base 1.0~beta5
+ update_gdi_cache_brush@Base 1.0~beta5
+ update_gdi_cache_color_table@Base 1.0~beta5
+ update_gdi_cache_glyph@Base 1.0~beta5
+ update_gdi_cache_glyph_v2@Base 1.0~beta5
+ update_gdi_create_offscreen_bitmap@Base 1.0~beta5
+ update_gdi_fast_glyph@Base 1.0~beta5
+ update_gdi_fast_index@Base 1.0~beta5
+ update_gdi_glyph_index@Base 1.0~beta5
+ update_gdi_mem3blt@Base 1.0~beta5
+ update_gdi_memblt@Base 1.0~beta5
+ update_gdi_patblt@Base 1.0~beta5
+ update_gdi_switch_surface@Base 1.0~beta5
+ update_pointer_cached@Base 1.0~beta5
+ update_pointer_color@Base 1.0~beta5
+ update_pointer_new@Base 1.0~beta5
+ update_pointer_position@Base 1.0~beta5
+ update_pointer_system@Base 1.0~beta5
+ update_process_glyph@Base 1.0~beta5
+ update_process_glyph_fragments@Base 1.0~beta5
+libfreerdp-channels.so.1.0 libfreerdp1 #MINVER#
+ WTSCreateVirtualChannelManager@Base 1.0~beta5
+ WTSDestroyVirtualChannelManager@Base 1.0~beta5
+ WTSFreeMemory@Base 1.0~beta5
+ WTSVirtualChannelClose@Base 1.0~beta5
+ WTSVirtualChannelManagerCheckFileDescriptor@Base 1.0~beta5
+ WTSVirtualChannelManagerGetFileDescriptor@Base 1.0~beta5
+ WTSVirtualChannelOpenEx@Base 1.0~beta5
+ WTSVirtualChannelQuery@Base 1.0~beta5
+ WTSVirtualChannelRead@Base 1.0~beta5
+ WTSVirtualChannelWrite@Base 1.0~beta5
+ freerdp_channels_check_fds@Base 1.0~beta5
+ freerdp_channels_close@Base 1.0~beta5
+ freerdp_channels_data@Base 1.0~beta5
+ freerdp_channels_free@Base 1.0~beta5
+ freerdp_channels_get_fds@Base 1.0~beta5
+ freerdp_channels_global_init@Base 1.0~beta5
+ freerdp_channels_global_uninit@Base 1.0~beta5
+ freerdp_channels_load_plugin@Base 1.0~beta5
+ freerdp_channels_new@Base 1.0~beta5
+ freerdp_channels_pop_event@Base 1.0~beta5
+ freerdp_channels_post_connect@Base 1.0~beta5
+ freerdp_channels_pre_connect@Base 1.0~beta5
+ freerdp_channels_send_event@Base 1.0~beta5
+libfreerdp-codec.so.1.0 libfreerdp1 #MINVER#
+ RleDecompress16to16@Base 1.0~beta5
+ RleDecompress24to24@Base 1.0~beta5
+ RleDecompress8to8@Base 1.0~beta5
+ bitmap_decompress@Base 1.0~beta5
+ freerdp_alpha_cursor_convert@Base 1.0~beta5
+ freerdp_bitmap_flip@Base 1.0~beta5
+ freerdp_clrconv_free@Base 1.0.1
+ freerdp_clrconv_new@Base 1.0.1
+ freerdp_color_convert_bgr@Base 1.0~beta5
+ freerdp_color_convert_bgr_rgb@Base 1.0~beta5
+ freerdp_color_convert_rgb@Base 1.0~beta5
+ freerdp_color_convert_rgb_bgr@Base 1.0~beta5
+ freerdp_color_convert_var_bgr@Base 1.0~beta5
+ freerdp_color_convert_var_rgb@Base 1.0~beta5
+ freerdp_color_convert_var@Base 1.0.0
+ freerdp_color_make_bgr@Base 1.0~beta5
+ freerdp_color_make_rgb@Base 1.0~beta5
+ freerdp_color_split_bgr@Base 1.0~beta5
+ freerdp_color_split_rgb@Base 1.0~beta5
+ freerdp_get_pixel@Base 1.0~beta5
+ freerdp_glyph_convert@Base 1.0~beta5
+ freerdp_icon_convert@Base 1.0~beta5
+ freerdp_image_convert@Base 1.0~beta5
+ freerdp_image_convert_15bpp@Base 1.0~beta5
+ freerdp_image_convert_16bpp@Base 1.0~beta5
+ freerdp_image_convert_24bpp@Base 1.0~beta5
+ freerdp_image_convert_32bpp@Base 1.0~beta5
+ freerdp_image_convert_8bpp@Base 1.0~beta5
+ freerdp_image_convert_@Base 1.0~beta5
+ freerdp_image_flip@Base 1.0~beta5
+ freerdp_image_swap_color_order@Base 1.0~beta5
+ freerdp_mono_image_convert@Base 1.0~beta5
+ freerdp_set_pixel@Base 1.0~beta5
+ nsc_chroma_supersample@Base 1.0~beta5
+ nsc_cl_expand@Base 1.0~beta5
+ nsc_colorloss_recover@Base 1.0~beta5
+ nsc_combine_argb@Base 1.0~beta5
+ nsc_context_destroy@Base 1.0~beta5
+ nsc_context_initialize@Base 1.0~beta5
+ nsc_context_new@Base 1.0~beta5
+ nsc_process_message@Base 1.0~beta5
+ nsc_rle_decode@Base 1.0~beta5
+ nsc_rle_decompress_data@Base 1.0~beta5
+ nsc_stream_initialize@Base 1.0~beta5
+ nsc_ycocg_rgb@Base 1.0~beta5
+ rfx_compose_message@Base 1.0~beta5
+ rfx_compose_message_header@Base 1.0~beta5
+ rfx_context_free@Base 1.0~beta5
+ rfx_context_new@Base 1.0~beta5
+ rfx_context_reset@Base 1.0~beta5
+ rfx_context_set_cpu_opt@Base 1.0~beta5
+ rfx_context_set_pixel_format@Base 1.0~beta5
+ rfx_decode_rgb@Base 1.0~beta5
+ rfx_decode_ycbcr_to_rgb@Base 1.0~beta5
+ rfx_differential_decode@Base 1.0~beta5
+ rfx_differential_encode@Base 1.0~beta5
+ rfx_dwt_2d_decode@Base 1.0~beta5
+ rfx_dwt_2d_encode@Base 1.0~beta5
+ rfx_encode_rgb@Base 1.0~beta5
+ rfx_encode_rgb_to_ycbcr@Base 1.0~beta5
+ rfx_message_free@Base 1.0~beta5
+ rfx_message_get_rect@Base 1.0~beta5
+ rfx_message_get_rect_count@Base 1.0~beta5
+ rfx_message_get_tile@Base 1.0~beta5
+ rfx_message_get_tile_count@Base 1.0~beta5
+ rfx_pool_free@Base 1.0~beta5
+ rfx_pool_get_tile@Base 1.0~beta5
+ rfx_pool_get_tiles@Base 1.0~beta5
+ rfx_pool_new@Base 1.0~beta5
+ rfx_pool_put_tile@Base 1.0~beta5
+ rfx_pool_put_tiles@Base 1.0~beta5
+ rfx_process_message@Base 1.0~beta5
+ rfx_quantization_decode@Base 1.0~beta5
+ rfx_quantization_encode@Base 1.0~beta5
+ rfx_rlgr_decode@Base 1.0~beta5
+ rfx_rlgr_encode@Base 1.0~beta5
+libfreerdp-core.so.1.0 libfreerdp1 #MINVER#
+ Bitmap_Alloc@Base 1.0~beta5
+ Bitmap_Free@Base 1.0~beta5
+ Bitmap_New@Base 1.0~beta5
+ Bitmap_SetDimensions@Base 1.0~beta5
+ Bitmap_SetRectangle@Base 1.0~beta5
+ Bitmap_SetSurface@Base 1.0~beta5
+ Glyph_Alloc@Base 1.0~beta5
+ Glyph_BeginDraw@Base 1.0~beta5
+ Glyph_Draw@Base 1.0~beta5
+ Glyph_EndDraw@Base 1.0~beta5
+ Glyph_Free@Base 1.0~beta5
+ Glyph_New@Base 1.0~beta5
+ LEChash@Base 1.0.0
+ LOMhash@Base 1.0.0
+ Pointer_Alloc@Base 1.0~beta5
+ Pointer_Free@Base 1.0~beta5
+ Pointer_New@Base 1.0~beta5
+ Pointer_Set@Base 1.0~beta5
+ _ber_skip_length@Base 1.0~beta5
+ ber_get_content_length@Base 1.0~beta5
+ ber_read_application_tag@Base 1.0~beta5
+ ber_read_bit_string@Base 1.0~beta5
+ ber_read_boolean@Base 1.0~beta5
+ ber_read_contextual_tag@Base 1.0~beta5
+ ber_read_enumerated@Base 1.0~beta5
+ ber_read_integer@Base 1.0~beta5
+ ber_read_integer_length@Base 1.0~beta5
+ ber_read_length@Base 1.0~beta5
+ ber_read_octet_string@Base 1.0~beta5
+ ber_read_sequence_tag@Base 1.0~beta5
+ ber_read_universal_tag@Base 1.0~beta5
+ ber_skip_contextual_tag@Base 1.0~beta5
+ ber_skip_integer@Base 1.0~beta5
+ ber_skip_octet_string@Base 1.0~beta5
+ ber_skip_sequence@Base 1.0~beta5
+ ber_skip_sequence_tag@Base 1.0~beta5
+ ber_write_application_tag@Base 1.0~beta5
+ ber_write_boolean@Base 1.0~beta5
+ ber_write_contextual_tag@Base 1.0~beta5
+ ber_write_enumerated@Base 1.0~beta5
+ ber_write_integer@Base 1.0~beta5
+ ber_write_length@Base 1.0~beta5
+ ber_write_octet_string@Base 1.0~beta5
+ ber_write_octet_string_tag@Base 1.0~beta5
+ ber_write_sequence_tag@Base 1.0~beta5
+ ber_write_universal_tag@Base 1.0~beta5
+ certificate_data_free@Base 1.0.1
+ certificate_data_match@Base 1.0.1
+ certificate_data_new@Base 1.0.1
+ certificate_data_print@Base 1.0.1
+ certificate_free@Base 1.0~beta5
+ certificate_free_x509_certificate_chain@Base 1.0~beta5
+ certificate_new@Base 1.0~beta5
+ certificate_new_x509_certificate_chain@Base 1.0~beta5
+ certificate_read_server_certificate@Base 1.0~beta5
+ certificate_read_server_proprietary_certificate@Base 1.0~beta5
+ certificate_read_server_x509_certificate_chain@Base 1.0~beta5
+ certificate_read_x509_certificate@Base 1.0~beta5
+ certificate_store_free@Base 1.0.1
+ certificate_store_init@Base 1.0.1
+ certificate_store_new@Base 1.0.1
+ credssp_authenticate@Base 1.0~beta5
+ credssp_current_time@Base 1.0~beta5
+ credssp_encode_ts_credentials@Base 1.0~beta5
+ credssp_encrypt_public_key@Base 1.0~beta5
+ credssp_encrypt_ts_credentials@Base 1.0~beta5
+ credssp_free@Base 1.0~beta5
+ credssp_get_public_key@Base 1.0~beta5
+ credssp_new@Base 1.0~beta5
+ credssp_ntlmssp_init@Base 1.0~beta5
+ credssp_rc4k@Base 1.0~beta5
+ credssp_recv@Base 1.0~beta5
+ credssp_send@Base 1.0~beta5
+ credssp_skip_auth_info@Base 1.0~beta5
+ credssp_skip_nego_token@Base 1.0~beta5
+ credssp_skip_nego_tokens@Base 1.0~beta5
+ credssp_skip_pub_key_auth@Base 1.0~beta5
+ credssp_skip_ts_credentials@Base 1.0~beta5
+ credssp_skip_ts_password_creds@Base 1.0~beta5
+ credssp_skip_ts_request@Base 1.0~beta5
+ credssp_verify_public_key@Base 1.0~beta5
+ credssp_write_ts_credentials@Base 1.0~beta5
+ credssp_write_ts_password_creds@Base 1.0~beta5
+ crypto_cert_fingerprint@Base 1.0~beta5
+ crypto_cert_free@Base 1.0~beta5
+ crypto_cert_get_public_key@Base 1.0~beta5
+ crypto_cert_issuer@Base 1.0~beta5
+ crypto_cert_print_info@Base 1.0~beta5
+ crypto_cert_read@Base 1.0~beta5
+ crypto_cert_subject@Base 1.0~beta5
+ crypto_cert_subject_alt_name@Base 1.0.1
+ crypto_cert_subject_common_name@Base 1.0.1
+ crypto_des3_decrypt@Base 1.0~beta5
+ crypto_des3_decrypt_init@Base 1.0~beta5
+ crypto_des3_encrypt@Base 1.0~beta5
+ crypto_des3_encrypt_init@Base 1.0~beta5
+ crypto_des3_free@Base 1.0~beta5
+ crypto_get_certificate_data@Base 1.0.1
+ crypto_hmac_final@Base 1.0~beta5
+ crypto_hmac_free@Base 1.0~beta5
+ crypto_hmac_new@Base 1.0~beta5
+ crypto_hmac_sha1_init@Base 1.0~beta5
+ crypto_hmac_update@Base 1.0~beta5
+ crypto_md5_final@Base 1.0~beta5
+ crypto_md5_init@Base 1.0~beta5
+ crypto_md5_update@Base 1.0~beta5
+ crypto_nonce@Base 1.0~beta5
+ crypto_print_name@Base 1.0~beta5
+ crypto_rc4@Base 1.0~beta5
+ crypto_rc4_free@Base 1.0~beta5
+ crypto_rc4_init@Base 1.0~beta5
+ crypto_reverse@Base 1.0~beta5
+ crypto_rsa_decrypt@Base 1.0.1
+ crypto_rsa_private_decrypt@Base 1.0.1
+ crypto_rsa_private_encrypt@Base 1.0.1
+ crypto_rsa_public_decrypt@Base 1.0.1
+ crypto_rsa_public_encrypt@Base 1.0.1
+ crypto_sha1_final@Base 1.0~beta5
+ crypto_sha1_init@Base 1.0~beta5
+ crypto_sha1_update@Base 1.0~beta5
+ decompress_rdp@Base 1.0~beta5
+ decompress_rdp_4@Base 1.0~beta5
+ decompress_rdp_5@Base 1.0~beta5
+ decompress_rdp_61@Base 1.0~beta5
+ decompress_rdp_6@Base 1.0~beta5
+ extension_free@Base 1.0~beta5
+ extension_new@Base 1.0~beta5
+ extension_post_connect@Base 1.0~beta5
+ extension_pre_connect@Base 1.0~beta5
+ fastpath_free@Base 1.0~beta5
+ fastpath_header_length@Base 1.0.1
+ fastpath_input_pdu_init@Base 1.0~beta5
+ fastpath_new@Base 1.0~beta5
+ fastpath_read_header@Base 1.0~beta5
+ fastpath_read_header_rdp@Base 1.0~beta5
+ fastpath_read_update_header@Base 1.0~beta5
+ fastpath_recv_inputs@Base 1.0~beta5
+ fastpath_recv_updates@Base 1.0~beta5
+ fastpath_send_input_pdu@Base 1.0~beta5
+ fastpath_send_update_pdu@Base 1.0~beta5
+ fastpath_update_pdu_init@Base 1.0~beta5
+ fastpath_write_update_header@Base 1.0~beta5
+ freerdp_channel_peer_process@Base 1.0~beta5
+ freerdp_channel_process@Base 1.0~beta5
+ freerdp_channel_send@Base 1.0~beta5
+ freerdp_check_fds@Base 1.0~beta5
+ freerdp_connect@Base 1.0~beta5
+ freerdp_context_free@Base 1.0~beta5
+ freerdp_context_new@Base 1.0~beta5
+ freerdp_disconnect@Base 1.0~beta5
+ freerdp_error_info@Base 1.0~beta5
+ freerdp_free@Base 1.0~beta5
+ freerdp_get_fds@Base 1.0~beta5
+ freerdp_get_version@Base 1.0.0
+ freerdp_listener_free@Base 1.0~beta5
+ freerdp_listener_new@Base 1.0~beta5
+ freerdp_new@Base 1.0~beta5
+ freerdp_peer_context_free@Base 1.0~beta5
+ freerdp_peer_context_new@Base 1.0~beta5
+ freerdp_peer_free@Base 1.0~beta5
+ freerdp_peer_new@Base 1.0~beta5
+ freerdp_send_keep_alive@Base 1.0~beta5
+ freerdp_shall_disconnect@Base 1.0.1
+ gcc_read_client_cluster_data@Base 1.0~beta5
+ gcc_read_client_core_data@Base 1.0~beta5
+ gcc_read_client_data_blocks@Base 1.0~beta5
+ gcc_read_client_monitor_data@Base 1.0~beta5
+ gcc_read_client_network_data@Base 1.0~beta5
+ gcc_read_client_security_data@Base 1.0~beta5
+ gcc_read_conference_create_request@Base 1.0~beta5
+ gcc_read_conference_create_response@Base 1.0~beta5
+ gcc_read_server_core_data@Base 1.0~beta5
+ gcc_read_server_data_blocks@Base 1.0~beta5
+ gcc_read_server_network_data@Base 1.0~beta5
+ gcc_read_server_security_data@Base 1.0~beta5
+ gcc_read_user_data_header@Base 1.0~beta5
+ gcc_write_client_cluster_data@Base 1.0~beta5
+ gcc_write_client_core_data@Base 1.0~beta5
+ gcc_write_client_data_blocks@Base 1.0~beta5
+ gcc_write_client_monitor_data@Base 1.0~beta5
+ gcc_write_client_network_data@Base 1.0~beta5
+ gcc_write_client_security_data@Base 1.0~beta5
+ gcc_write_conference_create_request@Base 1.0~beta5
+ gcc_write_conference_create_response@Base 1.0~beta5
+ gcc_write_server_core_data@Base 1.0~beta5
+ gcc_write_server_data_blocks@Base 1.0~beta5
+ gcc_write_server_network_data@Base 1.0~beta5
+ gcc_write_server_security_data@Base 1.0~beta5
+ gcc_write_user_data_header@Base 1.0~beta5
+ getLECindex@Base 1.0.0
+ getLOMindex@Base 1.0.0
+ graphics_free@Base 1.0~beta5
+ graphics_new@Base 1.0~beta5
+ graphics_register_bitmap@Base 1.0~beta5
+ graphics_register_glyph@Base 1.0~beta5
+ graphics_register_pointer@Base 1.0~beta5
+ h221_cs_key@Base 1.0~beta5
+ h221_sc_key@Base 1.0~beta5
+ input_free@Base 1.0~beta5
+ input_new@Base 1.0~beta5
+ input_recv@Base 1.0.1
+ input_register_client_callbacks@Base 1.0~beta5
+ input_send_extended_mouse_event@Base 1.0~beta5
+ input_send_fastpath_extended_mouse_event@Base 1.0~beta5
+ input_send_fastpath_keyboard_event@Base 1.0~beta5
+ input_send_fastpath_mouse_event@Base 1.0~beta5
+ input_send_fastpath_synchronize_event@Base 1.0~beta5
+ input_send_fastpath_unicode_keyboard_event@Base 1.0~beta5
+ input_send_keyboard_event@Base 1.0~beta5
+ input_send_mouse_event@Base 1.0~beta5
+ input_send_synchronize_event@Base 1.0~beta5
+ input_send_unicode_keyboard_event@Base 1.0~beta5
+ input_write_extended_mouse_event@Base 1.0~beta5
+ input_write_keyboard_event@Base 1.0~beta5
+ input_write_mouse_event@Base 1.0~beta5
+ input_write_synchronize_event@Base 1.0~beta5
+ input_write_unicode_keyboard_event@Base 1.0~beta5
+ key_free@Base 1.0.1
+ key_new@Base 1.0.1
+ license_decrypt_platform_challenge@Base 1.0~beta5
+ license_encrypt_premaster_secret@Base 1.0~beta5
+ license_free@Base 1.0~beta5
+ license_free_binary_blob@Base 1.0~beta5
+ license_free_product_info@Base 1.0~beta5
+ license_free_scope_list@Base 1.0~beta5
+ license_generate_hwid@Base 1.0~beta5
+ license_generate_keys@Base 1.0~beta5
+ license_generate_randoms@Base 1.0~beta5
+ license_new@Base 1.0~beta5
+ license_new_binary_blob@Base 1.0~beta5
+ license_new_product_info@Base 1.0~beta5
+ license_new_scope_list@Base 1.0~beta5
+ license_read_binary_blob@Base 1.0~beta5
+ license_read_error_alert_packet@Base 1.0~beta5
+ license_read_license_request_packet@Base 1.0~beta5
+ license_read_new_license_packet@Base 1.0~beta5
+ license_read_platform_challenge_packet@Base 1.0~beta5
+ license_read_preamble@Base 1.0~beta5
+ license_read_product_info@Base 1.0~beta5
+ license_read_scope_list@Base 1.0~beta5
+ license_read_upgrade_license_packet@Base 1.0~beta5
+ license_recv@Base 1.0~beta5
+ license_send@Base 1.0~beta5
+ license_send_new_license_request_packet@Base 1.0~beta5
+ license_send_platform_challenge_response_packet@Base 1.0~beta5
+ license_send_stream_init@Base 1.0~beta5
+ license_send_valid_client_error_packet@Base 1.0~beta5
+ license_write_binary_blob@Base 1.0~beta5
+ license_write_new_license_request_packet@Base 1.0~beta5
+ license_write_padded_binary_blob@Base 1.0~beta5
+ license_write_platform_challenge_response_packet@Base 1.0~beta5
+ license_write_platform_id@Base 1.0~beta5
+ license_write_preamble@Base 1.0~beta5
+ mcs_free@Base 1.0~beta5
+ mcs_new@Base 1.0~beta5
+ mcs_print_domain_parameters@Base 1.0~beta5
+ mcs_read_domain_mcspdu_header@Base 1.0~beta5
+ mcs_read_domain_parameters@Base 1.0~beta5
+ mcs_recv_attach_user_confirm@Base 1.0~beta5
+ mcs_recv_attach_user_request@Base 1.0~beta5
+ mcs_recv_channel_join_confirm@Base 1.0~beta5
+ mcs_recv_channel_join_request@Base 1.0~beta5
+ mcs_recv_connect_initial@Base 1.0~beta5
+ mcs_recv_connect_response@Base 1.0~beta5
+ mcs_recv_erect_domain_request@Base 1.0~beta5
+ mcs_send_attach_user_confirm@Base 1.0~beta5
+ mcs_send_attach_user_request@Base 1.0~beta5
+ mcs_send_channel_join_confirm@Base 1.0~beta5
+ mcs_send_channel_join_request@Base 1.0~beta5
+ mcs_send_connect_initial@Base 1.0~beta5
+ mcs_send_connect_response@Base 1.0~beta5
+ mcs_send_disconnect_provider_ultimatum@Base 1.0~beta5
+ mcs_send_erect_domain_request@Base 1.0~beta5
+ mcs_write_connect_initial@Base 1.0~beta5
+ mcs_write_connect_response@Base 1.0~beta5
+ mcs_write_domain_mcspdu_header@Base 1.0~beta5
+ mcs_write_domain_parameters@Base 1.0~beta5
+ miniLEChash@Base 1.0.0
+ miniLOMhash@Base 1.0.0
+ mppc_free@Base 1.0~beta5
+ mppc_new@Base 1.0~beta5
+ nego_attempt_nla@Base 1.0~beta5
+ nego_attempt_rdp@Base 1.0~beta5
+ nego_attempt_tls@Base 1.0~beta5
+ nego_connect@Base 1.0~beta5
+ nego_enable_nla@Base 1.0~beta5
+ nego_enable_rdp@Base 1.0~beta5
+ nego_enable_tls@Base 1.0~beta5
+ nego_free@Base 1.0~beta5
+ nego_init@Base 1.0~beta5
+ nego_new@Base 1.0~beta5
+ nego_process_negotiation_failure@Base 1.0~beta5
+ nego_process_negotiation_request@Base 1.0~beta5
+ nego_process_negotiation_response@Base 1.0~beta5
+ nego_read_request@Base 1.0~beta5
+ nego_recv@Base 1.0~beta5
+ nego_recv_response@Base 1.0~beta5
+ nego_send@Base 1.0~beta5
+ nego_send_negotiation_request@Base 1.0~beta5
+ nego_send_negotiation_response@Base 1.0~beta5
+ nego_set_cookie@Base 1.0~beta5
+ nego_set_routing_token@Base 1.0~beta5
+ nego_set_target@Base 1.0~beta5
+ nego_tcp_connect@Base 1.0~beta5
+ nego_tcp_disconnect@Base 1.0~beta5
+ ntlmssp_compute_lm_hash@Base 1.0~beta5
+ ntlmssp_compute_lm_response@Base 1.0~beta5
+ ntlmssp_compute_lm_v2_response@Base 1.0~beta5
+ ntlmssp_compute_message_integrity_check@Base 1.0~beta5
+ ntlmssp_compute_ntlm_hash@Base 1.0~beta5
+ ntlmssp_compute_ntlm_v2_hash@Base 1.0~beta5
+ ntlmssp_compute_ntlm_v2_response@Base 1.0~beta5
+ ntlmssp_decrypt_message@Base 1.0~beta5
+ ntlmssp_encrypt_message@Base 1.0~beta5
+ ntlmssp_encrypt_random_session_key@Base 1.0~beta5
+ ntlmssp_free@Base 1.0~beta5
+ ntlmssp_free_av_pairs@Base 1.0~beta5
+ ntlmssp_generate_client_challenge@Base 1.0~beta5
+ ntlmssp_generate_client_sealing_key@Base 1.0~beta5
+ ntlmssp_generate_client_signing_key@Base 1.0~beta5
+ ntlmssp_generate_exported_session_key@Base 1.0~beta5
+ ntlmssp_generate_key_exchange_key@Base 1.0~beta5
+ ntlmssp_generate_random_session_key@Base 1.0~beta5
+ ntlmssp_generate_sealing_key@Base 1.0~beta5
+ ntlmssp_generate_server_sealing_key@Base 1.0~beta5
+ ntlmssp_generate_server_signing_key@Base 1.0~beta5
+ ntlmssp_generate_signing_key@Base 1.0~beta5
+ ntlmssp_generate_timestamp@Base 1.0~beta5
+ ntlmssp_init@Base 1.0~beta5
+ ntlmssp_init_rc4_seal_states@Base 1.0~beta5
+ ntlmssp_input_av_pairs@Base 1.0~beta5
+ ntlmssp_input_negotiate_flags@Base 1.0~beta5
+ ntlmssp_new@Base 1.0~beta5
+ ntlmssp_output_av_pairs@Base 1.0~beta5
+ ntlmssp_output_channel_bindings@Base 1.0~beta5
+ ntlmssp_output_negotiate_flags@Base 1.0~beta5
+ ntlmssp_output_target_name@Base 1.0~beta5
+ ntlmssp_populate_av_pairs@Base 1.0~beta5
+ ntlmssp_print_av_pairs@Base 1.0~beta5
+ ntlmssp_print_negotiate_flags@Base 1.0~beta5
+ ntlmssp_recv@Base 1.0~beta5
+ ntlmssp_recv_challenge_message@Base 1.0~beta5
+ ntlmssp_send@Base 1.0~beta5
+ ntlmssp_send_authenticate_message@Base 1.0~beta5
+ ntlmssp_send_negotiate_message@Base 1.0~beta5
+ ntlmssp_set_domain@Base 1.0~beta5
+ ntlmssp_set_password@Base 1.0~beta5
+ ntlmssp_set_username@Base 1.0~beta5
+ ntlmssp_set_workstation@Base 1.0~beta5
+ ntlmssp_uninit@Base 1.0~beta5
+ per_read_choice@Base 1.0~beta5
+ per_read_enumerated@Base 1.0~beta5
+ per_read_integer16@Base 1.0~beta5
+ per_read_integer@Base 1.0~beta5
+ per_read_length@Base 1.0~beta5
+ per_read_number_of_sets@Base 1.0~beta5
+ per_read_numeric_string@Base 1.0~beta5
+ per_read_object_identifier@Base 1.0~beta5
+ per_read_octet_string@Base 1.0~beta5
+ per_read_padding@Base 1.0~beta5
+ per_read_selection@Base 1.0~beta5
+ per_write_choice@Base 1.0~beta5
+ per_write_enumerated@Base 1.0~beta5
+ per_write_integer16@Base 1.0~beta5
+ per_write_integer@Base 1.0~beta5
+ per_write_length@Base 1.0~beta5
+ per_write_number_of_sets@Base 1.0~beta5
+ per_write_numeric_string@Base 1.0~beta5
+ per_write_object_identifier@Base 1.0~beta5
+ per_write_octet_string@Base 1.0~beta5
+ per_write_padding@Base 1.0~beta5
+ per_write_selection@Base 1.0~beta5
+ per_write_string@Base 1.0~beta5
+ rdp_capability_set_finish@Base 1.0~beta5
+ rdp_capability_set_start@Base 1.0~beta5
+ rdp_check_fds@Base 1.0~beta5
+ rdp_client_connect@Base 1.0~beta5
+ rdp_client_connect_demand_active@Base 1.0~beta5
+ rdp_client_connect_finalize@Base 1.0~beta5
+ rdp_client_connect_license@Base 1.0~beta5
+ rdp_client_connect_mcs_attach_user_confirm@Base 1.0~beta5
+ rdp_client_connect_mcs_channel_join_confirm@Base 1.0~beta5
+ rdp_client_connect_mcs_connect_response@Base 1.0~beta5
+ rdp_client_disconnect@Base 1.0~beta5
+ rdp_client_input_pdu_init@Base 1.0~beta5
+ rdp_client_redirect@Base 1.0~beta5
+ rdp_data_pdu_init@Base 1.0~beta5
+ rdp_decrypt@Base 1.0~beta5
+ rdp_free@Base 1.0~beta5
+ rdp_get_client_time_zone@Base 1.0~beta5
+ rdp_new@Base 1.0~beta5
+ rdp_pdu_init@Base 1.0~beta5
+ rdp_print_errinfo@Base 1.0~beta5
+ rdp_print_redirection_flags@Base 1.0~beta5
+ rdp_read_bitmap_cache_capability_set@Base 1.0~beta5
+ rdp_read_bitmap_cache_host_support_capability_set@Base 1.0~beta5
+ rdp_read_bitmap_cache_v2_capability_set@Base 1.0~beta5
+ rdp_read_bitmap_capability_set@Base 1.0~beta5
+ rdp_read_bitmap_codecs_capability_set@Base 1.0~beta5
+ rdp_read_brush_capability_set@Base 1.0~beta5
+ rdp_read_cache_definition@Base 1.0~beta5
+ rdp_read_capability_set_header@Base 1.0~beta5
+ rdp_read_capability_sets@Base 1.0~beta5
+ rdp_read_client_auto_reconnect_cookie@Base 1.0~beta5
+ rdp_read_client_time_zone@Base 1.0~beta5
+ rdp_read_color_cache_capability_set@Base 1.0~beta5
+ rdp_read_control_capability_set@Base 1.0~beta5
+ rdp_read_desktop_composition_capability_set@Base 1.0~beta5
+ rdp_read_draw_gdiplus_cache_capability_set@Base 1.0~beta5
+ rdp_read_draw_nine_grid_cache_capability_set@Base 1.0~beta5
+ rdp_read_extended_info_packet@Base 1.0~beta5
+ rdp_read_font_capability_set@Base 1.0~beta5
+ rdp_read_frame_acknowledge_capability_set@Base 1.0~beta5
+ rdp_read_general_capability_set@Base 1.0~beta5
+ rdp_read_glyph_cache_capability_set@Base 1.0~beta5
+ rdp_read_header@Base 1.0~beta5
+ rdp_read_info_packet@Base 1.0~beta5
+ rdp_read_input_capability_set@Base 1.0~beta5
+ rdp_read_large_pointer_capability_set@Base 1.0~beta5
+ rdp_read_multifragment_update_capability_set@Base 1.0~beta5
+ rdp_read_offscreen_bitmap_cache_capability_set@Base 1.0~beta5
+ rdp_read_order_capability_set@Base 1.0~beta5
+ rdp_read_pointer_capability_set@Base 1.0~beta5
+ rdp_read_remote_programs_capability_set@Base 1.0~beta5
+ rdp_read_security_header@Base 1.0~beta5
+ rdp_read_server_auto_reconnect_cookie@Base 1.0~beta5
+ rdp_read_share_capability_set@Base 1.0~beta5
+ rdp_read_share_control_header@Base 1.0~beta5
+ rdp_read_share_data_header@Base 1.0~beta5
+ rdp_read_sound_capability_set@Base 1.0~beta5
+ rdp_read_surface_commands_capability_set@Base 1.0~beta5
+ rdp_read_system_time@Base 1.0~beta5
+ rdp_read_virtual_channel_capability_set@Base 1.0~beta5
+ rdp_read_window_activation_capability_set@Base 1.0~beta5
+ rdp_read_window_list_capability_set@Base 1.0~beta5
+ rdp_recv@Base 1.0~beta5
+ rdp_recv_client_font_list_pdu@Base 1.0~beta5
+ rdp_recv_client_font_map_pdu@Base 1.0.0
+ rdp_recv_client_info@Base 1.0~beta5
+ rdp_recv_client_synchronize_pdu@Base 1.0~beta5
+ rdp_recv_confirm_active@Base 1.0~beta5
+ rdp_recv_control_pdu@Base 1.0~beta5
+ rdp_recv_data_pdu@Base 1.0~beta5
+ rdp_recv_deactivate_all@Base 1.0~beta5
+ rdp_recv_demand_active@Base 1.0~beta5
+ rdp_recv_enhanced_security_redirection_packet@Base 1.0~beta5
+ rdp_recv_font_map_pdu@Base 1.0.0
+ rdp_recv_logon_error_info@Base 1.0~beta5
+ rdp_recv_logon_info_extended@Base 1.0~beta5
+ rdp_recv_logon_info_v1@Base 1.0~beta5
+ rdp_recv_logon_info_v2@Base 1.0~beta5
+ rdp_recv_logon_plain_notify@Base 1.0~beta5
+ rdp_recv_out_of_sequence_pdu@Base 1.0~beta5
+ rdp_recv_redirection_packet@Base 1.0~beta5
+ rdp_recv_save_session_info@Base 1.0~beta5
+ rdp_recv_server_control_pdu@Base 1.0~beta5
+ rdp_recv_server_font_map_pdu@Base 1.0~beta5
+ rdp_recv_server_redirection_pdu@Base 1.0~beta5
+ rdp_recv_server_synchronize_pdu@Base 1.0~beta5
+ rdp_recv_set_error_info_data_pdu@Base 1.0~beta5
+ rdp_recv_synchronize_pdu@Base 1.0.0
+ rdp_send@Base 1.0~beta5
+ rdp_send_channel_data@Base 1.0~beta5
+ rdp_send_client_control_pdu@Base 1.0~beta5
+ rdp_send_client_font_list_pdu@Base 1.0~beta5
+ rdp_send_client_info@Base 1.0~beta5
+ rdp_send_client_input_pdu@Base 1.0~beta5
+ rdp_send_client_persistent_key_list_pdu@Base 1.0~beta5
+ rdp_send_client_synchronize_pdu@Base 1.0~beta5
+ rdp_send_confirm_active@Base 1.0~beta5
+ rdp_send_data_pdu@Base 1.0~beta5
+ rdp_send_deactivate_all@Base 1.0~beta5
+ rdp_send_demand_active@Base 1.0~beta5
+ rdp_send_pdu@Base 1.0~beta5
+ rdp_send_server_control_cooperate_pdu@Base 1.0~beta5
+ rdp_send_server_control_granted_pdu@Base 1.0~beta5
+ rdp_send_server_font_map_pdu@Base 1.0~beta5
+ rdp_send_server_synchronize_pdu@Base 1.0~beta5
+ rdp_send_stream_init@Base 1.0~beta5
+ rdp_server_accept_client_control_pdu@Base 1.0~beta5
+ rdp_server_accept_client_font_list_pdu@Base 1.0~beta5
+ rdp_server_accept_client_info@Base 1.0~beta5
+ rdp_server_accept_client_keys@Base 1.0.1
+ rdp_server_accept_confirm_active@Base 1.0~beta5
+ rdp_server_accept_mcs_attach_user_request@Base 1.0~beta5
+ rdp_server_accept_mcs_channel_join_request@Base 1.0~beta5
+ rdp_server_accept_mcs_connect_initial@Base 1.0~beta5
+ rdp_server_accept_mcs_erect_domain_request@Base 1.0~beta5
+ rdp_server_accept_nego@Base 1.0~beta5
+ rdp_server_reactivate@Base 1.0~beta5
+ rdp_set_blocking_mode@Base 1.0~beta5
+ rdp_write_bitmap_cache_capability_set@Base 1.0~beta5
+ rdp_write_bitmap_cache_cell_info@Base 1.0~beta5
+ rdp_write_bitmap_cache_host_support_capability_set@Base 1.0~beta5
+ rdp_write_bitmap_cache_v2_capability_set@Base 1.0~beta5
+ rdp_write_bitmap_capability_set@Base 1.0~beta5
+ rdp_write_bitmap_codecs_capability_set@Base 1.0~beta5
+ rdp_write_brush_capability_set@Base 1.0~beta5
+ rdp_write_cache_definition@Base 1.0~beta5
+ rdp_write_capability_set_header@Base 1.0~beta5
+ rdp_write_client_auto_reconnect_cookie@Base 1.0~beta5
+ rdp_write_client_control_pdu@Base 1.0~beta5
+ rdp_write_client_font_list_pdu@Base 1.0~beta5
+ rdp_write_client_input_pdu_header@Base 1.0~beta5
+ rdp_write_client_persistent_key_list_pdu@Base 1.0~beta5
+ rdp_write_client_time_zone@Base 1.0~beta5
+ rdp_write_color_cache_capability_set@Base 1.0~beta5
+ rdp_write_confirm_active@Base 1.0~beta5
+ rdp_write_control_capability_set@Base 1.0~beta5
+ rdp_write_demand_active@Base 1.0~beta5
+ rdp_write_desktop_composition_capability_set@Base 1.0~beta5
+ rdp_write_draw_gdiplus_cache_capability_set@Base 1.0~beta5
+ rdp_write_draw_nine_grid_cache_capability_set@Base 1.0~beta5
+ rdp_write_extended_info_packet@Base 1.0~beta5
+ rdp_write_font_capability_set@Base 1.0~beta5
+ rdp_write_frame_acknowledge_capability_set@Base 1.0~beta5
+ rdp_write_gdiplus_cache_chunk_size@Base 1.0~beta5
+ rdp_write_gdiplus_cache_entries@Base 1.0~beta5
+ rdp_write_gdiplus_image_cache_properties@Base 1.0~beta5
+ rdp_write_general_capability_set@Base 1.0~beta5
+ rdp_write_glyph_cache_capability_set@Base 1.0~beta5
+ rdp_write_header@Base 1.0~beta5
+ rdp_write_info_packet@Base 1.0~beta5
+ rdp_write_input_capability_set@Base 1.0~beta5
+ rdp_write_input_event_header@Base 1.0~beta5
+ rdp_write_large_pointer_capability_set@Base 1.0~beta5
+ rdp_write_multifragment_update_capability_set@Base 1.0~beta5
+ rdp_write_nsc_client_capability_container@Base 1.0~beta5
+ rdp_write_nsc_server_capability_container@Base 1.0~beta5
+ rdp_write_offscreen_bitmap_cache_capability_set@Base 1.0~beta5
+ rdp_write_order_capability_set@Base 1.0~beta5
+ rdp_write_persistent_list_entry@Base 1.0~beta5
+ rdp_write_pointer_capability_set@Base 1.0~beta5
+ rdp_write_remote_programs_capability_set@Base 1.0~beta5
+ rdp_write_rfx_client_capability_container@Base 1.0~beta5
+ rdp_write_rfx_server_capability_container@Base 1.0~beta5
+ rdp_write_security_header@Base 1.0~beta5
+ rdp_write_share_capability_set@Base 1.0~beta5
+ rdp_write_share_control_header@Base 1.0~beta5
+ rdp_write_share_data_header@Base 1.0~beta5
+ rdp_write_sound_capability_set@Base 1.0~beta5
+ rdp_write_surface_commands_capability_set@Base 1.0~beta5
+ rdp_write_synchronize_pdu@Base 1.0~beta5
+ rdp_write_system_time@Base 1.0~beta5
+ rdp_write_virtual_channel_capability_set@Base 1.0~beta5
+ rdp_write_window_activation_capability_set@Base 1.0~beta5
+ rdp_write_window_list_capability_set@Base 1.0~beta5
+ redirection_free@Base 1.0~beta5
+ redirection_new@Base 1.0~beta5
+ security_decrypt@Base 1.0~beta5
+ security_encrypt@Base 1.0~beta5
+ security_establish_keys@Base 1.0~beta5
+ security_fips_check_signature@Base 1.0~beta5
+ security_fips_decrypt@Base 1.0~beta5
+ security_fips_encrypt@Base 1.0~beta5
+ security_hmac_signature@Base 1.0~beta5
+ security_key_update@Base 1.0~beta5
+ security_licensing_encryption_key@Base 1.0~beta5
+ security_mac_data@Base 1.0~beta5
+ security_mac_salt_key@Base 1.0~beta5
+ security_mac_signature@Base 1.0~beta5
+ security_master_secret@Base 1.0~beta5
+ security_md5_16_32_32@Base 1.0~beta5
+ security_salted_mac_signature@Base 1.0.1
+ security_session_key_blob@Base 1.0~beta5
+ security_uint32_le@Base 1.0~beta5
+ settings_free@Base 1.0~beta5
+ settings_new@Base 1.0~beta5
+ t124_02_98_oid@Base 1.0~beta5
+ tcp_connect@Base 1.0~beta5
+ tcp_disconnect@Base 1.0~beta5
+ tcp_free@Base 1.0~beta5
+ tcp_get_ip_address@Base 1.0~beta5
+ tcp_get_mac_address@Base 1.0~beta5
+ tcp_new@Base 1.0~beta5
+ tcp_read@Base 1.0~beta5
+ tcp_set_blocking_mode@Base 1.0~beta5
+ tcp_set_keep_alive_mode@Base 1.0~beta5
+ tcp_write@Base 1.0~beta5
+ tls_accept@Base 1.0~beta5
+ tls_connect@Base 1.0~beta5
+ tls_disconnect@Base 1.0~beta5
+ tls_free@Base 1.0~beta5
+ tls_get_certificate@Base 1.0~beta5
+ tls_new@Base 1.0~beta5
+ tls_print_certificate_error@Base 1.0.1
+ tls_print_certificate_name_mismatch_error@Base 1.0.1
+ tls_print_error@Base 1.0~beta5
+ tls_read@Base 1.0~beta5
+ tls_verify_certificate@Base 1.0~beta5
+ tls_write@Base 1.0~beta5
+ tpdu_read_connection_confirm@Base 1.0~beta5
+ tpdu_read_connection_request@Base 1.0~beta5
+ tpdu_read_data@Base 1.0~beta5
+ tpdu_read_header@Base 1.0~beta5
+ tpdu_write_connection_confirm@Base 1.0~beta5
+ tpdu_write_connection_request@Base 1.0~beta5
+ tpdu_write_data@Base 1.0~beta5
+ tpdu_write_disconnect_request@Base 1.0~beta5
+ tpdu_write_header@Base 1.0~beta5
+ tpkt_read_header@Base 1.0~beta5
+ tpkt_verify_header@Base 1.0~beta5
+ tpkt_write_header@Base 1.0~beta5
+ transport_accept_nla@Base 1.0~beta5
+ transport_accept_rdp@Base 1.0~beta5
+ transport_accept_tls@Base 1.0~beta5
+ transport_attach@Base 1.0~beta5
+ transport_check_fds@Base 1.0~beta5
+ transport_connect@Base 1.0~beta5
+ transport_connect_nla@Base 1.0~beta5
+ transport_connect_rdp@Base 1.0~beta5
+ transport_connect_tls@Base 1.0~beta5
+ transport_disconnect@Base 1.0~beta5
+ transport_free@Base 1.0~beta5
+ transport_get_fds@Base 1.0~beta5
+ transport_new@Base 1.0~beta5
+ transport_read@Base 1.0~beta5
+ transport_recv_stream_init@Base 1.0~beta5
+ transport_send_stream_init@Base 1.0~beta5
+ transport_set_blocking_mode@Base 1.0~beta5
+ transport_write@Base 1.0~beta5
+ tssk_exponent@Base 1.0.1
+ tssk_modulus@Base 1.0.1
+ tssk_privateExponent@Base 1.0.1
+ update_decompress_brush@Base 1.0~beta5
+ update_free@Base 1.0~beta5
+ update_new@Base 1.0~beta5
+ update_read_2byte_signed@Base 1.0~beta5
+ update_read_2byte_unsigned@Base 1.0~beta5
+ update_read_4byte_unsigned@Base 1.0~beta5
+ update_read_bitmap@Base 1.0~beta5
+ update_read_bitmap_data@Base 1.0~beta5
+ update_read_bounds@Base 1.0~beta5
+ update_read_brush@Base 1.0~beta5
+ update_read_cache_bitmap_order@Base 1.0~beta5
+ update_read_cache_bitmap_v2_order@Base 1.0~beta5
+ update_read_cache_bitmap_v3_order@Base 1.0~beta5
+ update_read_cache_brush_order@Base 1.0~beta5
+ update_read_cache_color_table_order@Base 1.0~beta5
+ update_read_cache_glyph_order@Base 1.0~beta5
+ update_read_cache_glyph_v2_order@Base 1.0~beta5
+ update_read_cached_icon_info@Base 1.0~beta5
+ update_read_color@Base 1.0~beta5
+ update_read_color_quad@Base 1.0~beta5
+ update_read_colorref@Base 1.0~beta5
+ update_read_coord@Base 1.0~beta5
+ update_read_create_nine_grid_bitmap_order@Base 1.0~beta5
+ update_read_create_offscreen_bitmap_order@Base 1.0~beta5
+ update_read_delta@Base 1.0~beta5
+ update_read_delta_points@Base 1.0~beta5
+ update_read_delta_rects@Base 1.0~beta5
+ update_read_desktop_actively_monitored_order@Base 1.0~beta5
+ update_read_desktop_non_monitored_order@Base 1.0~beta5
+ update_read_draw_gdiplus_cache_end_order@Base 1.0~beta5
+ update_read_draw_gdiplus_cache_first_order@Base 1.0~beta5
+ update_read_draw_gdiplus_cache_next_order@Base 1.0~beta5
+ update_read_draw_gdiplus_end_order@Base 1.0~beta5
+ update_read_draw_gdiplus_first_order@Base 1.0~beta5
+ update_read_draw_gdiplus_next_order@Base 1.0~beta5
+ update_read_draw_nine_grid_order@Base 1.0~beta5
+ update_read_dstblt_order@Base 1.0~beta5
+ update_read_ellipse_cb_order@Base 1.0~beta5
+ update_read_ellipse_sc_order@Base 1.0~beta5
+ update_read_fast_glyph_order@Base 1.0~beta5
+ update_read_fast_index_order@Base 1.0~beta5
+ update_read_field_flags@Base 1.0~beta5
+ update_read_frame_marker_order@Base 1.0~beta5
+ update_read_glyph_delta@Base 1.0~beta5
+ update_read_glyph_index_order@Base 1.0~beta5
+ update_read_icon_info@Base 1.0~beta5
+ update_read_line_to_order@Base 1.0~beta5
+ update_read_mem3blt_order@Base 1.0~beta5
+ update_read_memblt_order@Base 1.0~beta5
+ update_read_multi_draw_nine_grid_order@Base 1.0~beta5
+ update_read_multi_dstblt_order@Base 1.0~beta5
+ update_read_multi_opaque_rect_order@Base 1.0~beta5
+ update_read_multi_patblt_order@Base 1.0~beta5
+ update_read_multi_scrblt_order@Base 1.0~beta5
+ update_read_notification_icon_delete_order@Base 1.0~beta5
+ update_read_notification_icon_state_order@Base 1.0~beta5
+ update_read_notify_icon_infotip@Base 1.0~beta5
+ update_read_opaque_rect_order@Base 1.0~beta5
+ update_read_palette@Base 1.0~beta5
+ update_read_patblt_order@Base 1.0~beta5
+ update_read_play_sound@Base 1.0~beta5
+ update_read_pointer_cached@Base 1.0~beta5
+ update_read_pointer_color@Base 1.0~beta5
+ update_read_pointer_new@Base 1.0~beta5
+ update_read_pointer_position@Base 1.0~beta5
+ update_read_pointer_system@Base 1.0~beta5
+ update_read_polygon_cb_order@Base 1.0~beta5
+ update_read_polygon_sc_order@Base 1.0~beta5
+ update_read_polyline_order@Base 1.0~beta5
+ update_read_save_bitmap_order@Base 1.0~beta5
+ update_read_scrblt_order@Base 1.0~beta5
+ update_read_stream_bitmap_first_order@Base 1.0~beta5
+ update_read_stream_bitmap_next_order@Base 1.0~beta5
+ update_read_switch_surface_order@Base 1.0~beta5
+ update_read_synchronize@Base 1.0~beta5
+ update_read_window_cached_icon_order@Base 1.0~beta5
+ update_read_window_delete_order@Base 1.0~beta5
+ update_read_window_icon_order@Base 1.0~beta5
+ update_read_window_state_order@Base 1.0~beta5
+ update_recv@Base 1.0~beta5
+ update_recv_altsec_order@Base 1.0~beta5
+ update_recv_altsec_window_order@Base 1.0~beta5
+ update_recv_desktop_info_order@Base 1.0~beta5
+ update_recv_notification_icon_info_order@Base 1.0~beta5
+ update_recv_order@Base 1.0~beta5
+ update_recv_orders@Base 1.0~beta5
+ update_recv_play_sound@Base 1.0~beta5
+ update_recv_pointer@Base 1.0~beta5
+ update_recv_primary_order@Base 1.0~beta5
+ update_recv_secondary_order@Base 1.0~beta5
+ update_recv_surfcmds@Base 1.0~beta5
+ update_recv_window_info_order@Base 1.0~beta5
+ update_register_server_callbacks@Base 1.0~beta5
+ update_reset_state@Base 1.0~beta5
+ update_seek_glyph_delta@Base 1.0~beta5
+ update_write_surfcmd_frame_marker@Base 1.0~beta5
+ update_write_surfcmd_surface_bits_header@Base 1.0~beta5
+ x509_verify_certificate@Base 1.0.1
+libfreerdp-gdi.so.1.0 libfreerdp1 #MINVER#
+ BitBlt_16bpp@Base 1.0~beta5
+ BitBlt_32bpp@Base 1.0~beta5
+ BitBlt_8bpp@Base 1.0~beta5
+ BitBlt_@Base 1.0~beta5
+ CreateSystemPalette@Base 1.0~beta5
+ FillRect_16bpp@Base 1.0~beta5
+ FillRect_32bpp@Base 1.0~beta5
+ FillRect_8bpp@Base 1.0~beta5
+ FillRect_@Base 1.0~beta5
+ LineTo_16bpp@Base 1.0~beta5
+ LineTo_32bpp@Base 1.0~beta5
+ LineTo_8bpp@Base 1.0~beta5
+ LineTo_@Base 1.0~beta5
+ LineTo_BLACK_16bpp@Base 1.0.1
+ LineTo_BLACK_32bpp@Base 1.0.1
+ LineTo_BLACK_8bpp@Base 1.0.1
+ LineTo_COPYPEN_16bpp@Base 1.0.1
+ LineTo_COPYPEN_32bpp@Base 1.0.1
+ LineTo_COPYPEN_8bpp@Base 1.0.1
+ LineTo_MASKNOTPEN_16bpp@Base 1.0.1
+ LineTo_MASKNOTPEN_32bpp@Base 1.0.1
+ LineTo_MASKNOTPEN_8bpp@Base 1.0.1
+ LineTo_MASKPENNOT_16bpp@Base 1.0.1
+ LineTo_MASKPENNOT_32bpp@Base 1.0.1
+ LineTo_MASKPENNOT_8bpp@Base 1.0.1
+ LineTo_MASKPEN_16bpp@Base 1.0.1
+ LineTo_MASKPEN_32bpp@Base 1.0.1
+ LineTo_MASKPEN_8bpp@Base 1.0.1
+ LineTo_MERGENOTPEN_16bpp@Base 1.0.1
+ LineTo_MERGENOTPEN_32bpp@Base 1.0.1
+ LineTo_MERGENOTPEN_8bpp@Base 1.0.1
+ LineTo_MERGEPENNOT_16bpp@Base 1.0.1
+ LineTo_MERGEPENNOT_32bpp@Base 1.0.1
+ LineTo_MERGEPENNOT_8bpp@Base 1.0.1
+ LineTo_MERGEPEN_16bpp@Base 1.0.1
+ LineTo_MERGEPEN_32bpp@Base 1.0.1
+ LineTo_MERGEPEN_8bpp@Base 1.0.1
+ LineTo_NOP_16bpp@Base 1.0.1
+ LineTo_NOP_32bpp@Base 1.0.1
+ LineTo_NOP_8bpp@Base 1.0.1
+ LineTo_NOTCOPYPEN_16bpp@Base 1.0.1
+ LineTo_NOTCOPYPEN_32bpp@Base 1.0.1
+ LineTo_NOTCOPYPEN_8bpp@Base 1.0.1
+ LineTo_NOTMASKPEN_16bpp@Base 1.0.1
+ LineTo_NOTMASKPEN_32bpp@Base 1.0.1
+ LineTo_NOTMASKPEN_8bpp@Base 1.0.1
+ LineTo_NOTMERGEPEN_16bpp@Base 1.0.1
+ LineTo_NOTMERGEPEN_32bpp@Base 1.0.1
+ LineTo_NOTMERGEPEN_8bpp@Base 1.0.1
+ LineTo_NOTXORPEN_16bpp@Base 1.0.1
+ LineTo_NOTXORPEN_32bpp@Base 1.0.1
+ LineTo_NOTXORPEN_8bpp@Base 1.0.1
+ LineTo_NOT_16bpp@Base 1.0.1
+ LineTo_NOT_32bpp@Base 1.0.1
+ LineTo_NOT_8bpp@Base 1.0.1
+ LineTo_ROP2_16bpp@Base 1.0.1
+ LineTo_ROP2_32bpp@Base 1.0.1
+ LineTo_ROP2_8bpp@Base 1.0.1
+ LineTo_WHITE_16bpp@Base 1.0.1
+ LineTo_WHITE_32bpp@Base 1.0.1
+ LineTo_WHITE_8bpp@Base 1.0.1
+ LineTo_XORPEN_16bpp@Base 1.0.1
+ LineTo_XORPEN_32bpp@Base 1.0.1
+ LineTo_XORPEN_8bpp@Base 1.0.1
+ PatBlt_16bpp@Base 1.0~beta5
+ PatBlt_32bpp@Base 1.0~beta5
+ PatBlt_8bpp@Base 1.0~beta5
+ PatBlt_@Base 1.0~beta5
+ SetPixel_BLACK_16bpp@Base 1.0~beta5
+ SetPixel_BLACK_32bpp@Base 1.0~beta5
+ SetPixel_BLACK_8bpp@Base 1.0~beta5
+ SetPixel_COPYPEN_16bpp@Base 1.0~beta5
+ SetPixel_COPYPEN_32bpp@Base 1.0~beta5
+ SetPixel_COPYPEN_8bpp@Base 1.0~beta5
+ SetPixel_MASKNOTPEN_16bpp@Base 1.0~beta5
+ SetPixel_MASKNOTPEN_32bpp@Base 1.0~beta5
+ SetPixel_MASKNOTPEN_8bpp@Base 1.0~beta5
+ SetPixel_MASKPENNOT_16bpp@Base 1.0~beta5
+ SetPixel_MASKPENNOT_32bpp@Base 1.0~beta5
+ SetPixel_MASKPENNOT_8bpp@Base 1.0~beta5
+ SetPixel_MASKPEN_16bpp@Base 1.0~beta5
+ SetPixel_MASKPEN_32bpp@Base 1.0~beta5
+ SetPixel_MASKPEN_8bpp@Base 1.0~beta5
+ SetPixel_MERGENOTPEN_16bpp@Base 1.0~beta5
+ SetPixel_MERGENOTPEN_32bpp@Base 1.0~beta5
+ SetPixel_MERGENOTPEN_8bpp@Base 1.0~beta5
+ SetPixel_MERGEPENNOT_16bpp@Base 1.0~beta5
+ SetPixel_MERGEPENNOT_32bpp@Base 1.0~beta5
+ SetPixel_MERGEPENNOT_8bpp@Base 1.0~beta5
+ SetPixel_MERGEPEN_16bpp@Base 1.0~beta5
+ SetPixel_MERGEPEN_32bpp@Base 1.0~beta5
+ SetPixel_MERGEPEN_8bpp@Base 1.0~beta5
+ SetPixel_NOP_16bpp@Base 1.0~beta5
+ SetPixel_NOP_32bpp@Base 1.0~beta5
+ SetPixel_NOP_8bpp@Base 1.0~beta5
+ SetPixel_NOTCOPYPEN_16bpp@Base 1.0~beta5
+ SetPixel_NOTCOPYPEN_32bpp@Base 1.0~beta5
+ SetPixel_NOTCOPYPEN_8bpp@Base 1.0~beta5
+ SetPixel_NOTMASKPEN_16bpp@Base 1.0~beta5
+ SetPixel_NOTMASKPEN_32bpp@Base 1.0~beta5
+ SetPixel_NOTMASKPEN_8bpp@Base 1.0~beta5
+ SetPixel_NOTMERGEPEN_16bpp@Base 1.0~beta5
+ SetPixel_NOTMERGEPEN_32bpp@Base 1.0~beta5
+ SetPixel_NOTMERGEPEN_8bpp@Base 1.0~beta5
+ SetPixel_NOTXORPEN_16bpp@Base 1.0~beta5
+ SetPixel_NOTXORPEN_32bpp@Base 1.0~beta5
+ SetPixel_NOTXORPEN_8bpp@Base 1.0~beta5
+ SetPixel_NOT_16bpp@Base 1.0~beta5
+ SetPixel_NOT_32bpp@Base 1.0~beta5
+ SetPixel_NOT_8bpp@Base 1.0~beta5
+ SetPixel_WHITE_16bpp@Base 1.0~beta5
+ SetPixel_WHITE_32bpp@Base 1.0~beta5
+ SetPixel_WHITE_8bpp@Base 1.0~beta5
+ SetPixel_XORPEN_16bpp@Base 1.0~beta5
+ SetPixel_XORPEN_32bpp@Base 1.0~beta5
+ SetPixel_XORPEN_8bpp@Base 1.0~beta5
+ gdi_BitBlt@Base 1.0~beta5
+ gdi_Bitmap_Decompress@Base 1.0~beta5
+ gdi_Bitmap_Free@Base 1.0~beta5
+ gdi_Bitmap_New@Base 1.0~beta5
+ gdi_Bitmap_Paint@Base 1.0~beta5
+ gdi_Bitmap_SetSurface@Base 1.0~beta5
+ gdi_CRectToCRgn@Base 1.0~beta5
+ gdi_CRectToRgn@Base 1.0~beta5
+ gdi_CRgnToCRect@Base 1.0~beta5
+ gdi_CRgnToRect@Base 1.0~beta5
+ gdi_ClipCoords@Base 1.0~beta5
+ gdi_CopyOverlap@Base 1.0~beta5
+ gdi_CopyRect@Base 1.0~beta5
+ gdi_CreateBitmap@Base 1.0~beta5
+ gdi_CreateCompatibleBitmap@Base 1.0~beta5
+ gdi_CreateCompatibleDC@Base 1.0~beta5
+ gdi_CreateDC@Base 1.0.1
+ gdi_CreatePalette@Base 1.0~beta5
+ gdi_CreatePatternBrush@Base 1.0~beta5
+ gdi_CreatePen@Base 1.0~beta5
+ gdi_CreateRect@Base 1.0~beta5
+ gdi_CreateRectRgn@Base 1.0~beta5
+ gdi_CreateSolidBrush@Base 1.0~beta5
+ gdi_DeleteDC@Base 1.0~beta5
+ gdi_DeleteObject@Base 1.0~beta5
+ gdi_Ellipse@Base 1.0~beta5
+ gdi_EqualRgn@Base 1.0~beta5
+ gdi_FillRect@Base 1.0~beta5
+ gdi_GetBkColor@Base 1.0~beta5
+ gdi_GetBkMode@Base 1.0~beta5
+ gdi_GetClipRgn@Base 1.0~beta5
+ gdi_GetDC@Base 1.0~beta5
+ gdi_GetPenColor_16bpp@Base 1.0~beta5
+ gdi_GetPenColor_32bpp@Base 1.0~beta5
+ gdi_GetPenColor_8bpp@Base 1.0~beta5
+ gdi_GetPixel@Base 1.0~beta5
+ gdi_GetPixel_16bpp@Base 1.0~beta5
+ gdi_GetPixel_32bpp@Base 1.0~beta5
+ gdi_GetPixel_8bpp@Base 1.0~beta5
+ gdi_GetPointer_16bpp@Base 1.0~beta5
+ gdi_GetPointer_32bpp@Base 1.0~beta5
+ gdi_GetPointer_8bpp@Base 1.0~beta5
+ gdi_GetROP2@Base 1.0~beta5
+ gdi_GetSystemPalette@Base 1.0~beta5
+ gdi_Glyph_BeginDraw@Base 1.0~beta5
+ gdi_Glyph_Draw@Base 1.0~beta5
+ gdi_Glyph_EndDraw@Base 1.0~beta5
+ gdi_Glyph_Free@Base 1.0~beta5
+ gdi_Glyph_New@Base 1.0~beta5
+ gdi_InvalidateRegion@Base 1.0~beta5
+ gdi_LineTo@Base 1.0~beta5
+ gdi_MoveToEx@Base 1.0~beta5
+ gdi_PatBlt@Base 1.0~beta5
+ gdi_PolyPolygon@Base 1.0~beta5
+ gdi_PolyPolyline@Base 1.0~beta5
+ gdi_Polygon@Base 1.0~beta5
+ gdi_Polyline@Base 1.0~beta5
+ gdi_PolylineTo@Base 1.0~beta5
+ gdi_PtInRect@Base 1.0~beta5
+ gdi_RectToCRgn@Base 1.0~beta5
+ gdi_RectToRgn@Base 1.0~beta5
+ gdi_Rectangle@Base 1.0~beta5
+ gdi_RgnToCRect@Base 1.0~beta5
+ gdi_RgnToRect@Base 1.0~beta5
+ gdi_SelectObject@Base 1.0~beta5
+ gdi_SetBkColor@Base 1.0~beta5
+ gdi_SetBkMode@Base 1.0~beta5
+ gdi_SetClipRgn@Base 1.0~beta5
+ gdi_SetNullClipRgn@Base 1.0~beta5
+ gdi_SetPixel@Base 1.0~beta5
+ gdi_SetPixel_16bpp@Base 1.0~beta5
+ gdi_SetPixel_32bpp@Base 1.0~beta5
+ gdi_SetPixel_8bpp@Base 1.0~beta5
+ gdi_SetROP2@Base 1.0~beta5
+ gdi_SetRect@Base 1.0~beta5
+ gdi_SetRectRgn@Base 1.0~beta5
+ gdi_SetRgn@Base 1.0~beta5
+ gdi_SetTextColor@Base 1.0~beta5
+ gdi_bitmap_free_ex@Base 1.0~beta5
+ gdi_bitmap_new_ex@Base 1.0~beta5
+ gdi_create_bitmap@Base 1.0~beta5
+ gdi_dstblt@Base 1.0~beta5
+ gdi_free@Base 1.0~beta5
+ gdi_get_bitmap_pointer@Base 1.0~beta5
+ gdi_get_brush_pointer@Base 1.0~beta5
+ gdi_get_color_16bpp@Base 1.0~beta5
+ gdi_get_color_32bpp@Base 1.0~beta5
+ gdi_glyph_free@Base 1.0~beta5
+ gdi_glyph_new@Base 1.0~beta5
+ gdi_init@Base 1.0~beta5
+ gdi_init_primary@Base 1.0~beta5
+ gdi_is_mono_pixel_set@Base 1.0~beta5
+ gdi_line_to@Base 1.0~beta5
+ gdi_mem3blt@Base 1.0~beta5
+ gdi_memblt@Base 1.0~beta5
+ gdi_multi_opaque_rect@Base 1.0~beta5
+ gdi_opaque_rect@Base 1.0~beta5
+ gdi_palette_update@Base 1.0~beta5
+ gdi_patblt@Base 1.0~beta5
+ gdi_polyline@Base 1.0~beta5
+ gdi_register_graphics@Base 1.0~beta5
+ gdi_register_update_callbacks@Base 1.0~beta5
+ gdi_resize@Base 1.0~beta5
+ gdi_rop3_code@Base 1.0~beta5
+ gdi_scrblt@Base 1.0~beta5
+ gdi_set_bounds@Base 1.0~beta5
+ gdi_surface_bits@Base 1.0~beta5
+ tilenum@Base 1.0~beta5
+libfreerdp-kbd.so.1.0 libfreerdp1 #MINVER#
+ detect_keyboard_layout_from_locale@Base 1.0~beta5
+ detect_keyboard_layout_from_xkb@Base 1.0~beta5
+ find_keyboard_layout_in_xorg_rules@Base 1.0~beta5
+ freerdp_kbd_get_keycode_by_scancode@Base 1.0.0
+ freerdp_kbd_get_layouts@Base 1.0~beta5
+ freerdp_kbd_get_scancode_by_keycode@Base 1.0~beta5
+ freerdp_kbd_get_scancode_by_virtualkey@Base 1.0~beta5
+ freerdp_kbd_init@Base 1.0~beta5
+ get_keyboard_layouts@Base 1.0~beta5
+ get_layout_name@Base 1.0~beta5
+ init_keycodes_from_xkb@Base 1.0~beta5
+ init_xkb@Base 1.0~beta5
+ rdp_scancode_to_x_keycode@Base 1.0.0
+ x_keycode_to_rdp_scancode@Base 1.0.0
+libfreerdp-rail.so.1.0 libfreerdp1 #MINVER#
+ icon_cache_free@Base 1.0~beta5
+ icon_cache_get@Base 1.0~beta5
+ icon_cache_new@Base 1.0~beta5
+ icon_cache_put@Base 1.0~beta5
+ print_extended_window_styles@Base 1.0~beta5
+ print_window_styles@Base 1.0~beta5
+ rail_CreateWindow@Base 1.0~beta5
+ rail_DestroyWindow@Base 1.0~beta5
+ rail_UpdateWindow@Base 1.0~beta5
+ rail_free@Base 1.0~beta5
+ rail_new@Base 1.0~beta5
+ rail_register_update_callbacks@Base 1.0~beta5
+ window_list_create@Base 1.0~beta5
+ window_list_delete@Base 1.0~beta5
+ window_list_free@Base 1.0~beta5
+ window_list_get_by_extra_id@Base 1.0~beta5
+ window_list_get_by_id@Base 1.0~beta5
+ window_list_get_next@Base 1.0~beta5
+ window_list_has_next@Base 1.0~beta5
+ window_list_new@Base 1.0~beta5
+ window_list_rewind@Base 1.0~beta5
+ window_list_update@Base 1.0~beta5
+ window_state_update@Base 1.0~beta5
+libfreerdp-utils.so.1.0 libfreerdp1 #MINVER#
+ dsp_decode_ima_adpcm@Base 1.0~beta5
+ dsp_encode_ima_adpcm@Base 1.0~beta5
+ dsp_resample@Base 1.0~beta5
+ freerdp_append_shared_library_suffix@Base 1.0.1
+ freerdp_bitmap_write@Base 1.0~beta5
+ freerdp_blob_alloc@Base 1.0~beta5
+ freerdp_blob_free@Base 1.0~beta5
+ freerdp_check_file_exists@Base 1.0.1
+ freerdp_close_library@Base 1.0.1
+ freerdp_construct_path@Base 1.0.1
+ freerdp_detect_development_mode@Base 1.0.1
+ freerdp_detect_paths@Base 1.0.1
+ freerdp_event_free@Base 1.0~beta5
+ freerdp_event_new@Base 1.0~beta5
+ freerdp_get_config_path@Base 1.0.1
+ freerdp_get_current_path@Base 1.0.1
+ freerdp_get_home_path@Base 1.0.1
+ freerdp_get_library_symbol@Base 1.0.1
+ freerdp_get_parent_path@Base 1.0.1
+ freerdp_handle_signals@Base 1.0~beta5
+ freerdp_hexdump@Base 1.0~beta5
+ freerdp_load_channel_plugin@Base 1.0.1
+ freerdp_load_library_symbol@Base 1.0.1
+ freerdp_load_plugin@Base 1.0~beta5
+ freerdp_mkdir@Base 1.0~beta5
+ freerdp_mutex_free@Base 1.0~beta5
+ freerdp_mutex_lock@Base 1.0~beta5
+ freerdp_mutex_new@Base 1.0~beta5
+ freerdp_mutex_unlock@Base 1.0~beta5
+ freerdp_open_library@Base 1.0.1
+ freerdp_parse_args@Base 1.0~beta5
+ freerdp_passphrase_read@Base 1.0~beta5
+ freerdp_path_contains_separator@Base 1.0.1
+ freerdp_read_rectangle_16@Base 1.0~beta5
+ freerdp_rectangle_16_free@Base 1.0~beta5
+ freerdp_rectangle_16_new@Base 1.0~beta5
+ freerdp_sem_free@Base 1.0~beta5
+ freerdp_sem_new@Base 1.0~beta5
+ freerdp_sem_signal@Base 1.0~beta5
+ freerdp_sem_wait@Base 1.0~beta5
+ freerdp_sleep@Base 1.0~beta5
+ freerdp_string_free@Base 1.0~beta5
+ freerdp_string_read_length32@Base 1.0~beta5
+ freerdp_thread_free@Base 1.0~beta5
+ freerdp_thread_new@Base 1.0~beta5
+ freerdp_thread_start@Base 1.0~beta5
+ freerdp_thread_stop@Base 1.0~beta5
+ freerdp_uniconv_free@Base 1.0~beta5
+ freerdp_uniconv_in@Base 1.0~beta5
+ freerdp_uniconv_new@Base 1.0~beta5
+ freerdp_uniconv_out@Base 1.0~beta5
+ freerdp_uniconv_uppercase@Base 1.0~beta5
+ freerdp_usleep@Base 1.0~beta5
+ freerdp_write_rectangle_16@Base 1.0~beta5
+ list_dequeue@Base 1.0~beta5
+ list_enqueue@Base 1.0~beta5
+ list_free@Base 1.0~beta5
+ list_new@Base 1.0~beta5
+ list_next@Base 1.0~beta5
+ list_peek@Base 1.0~beta5
+ list_remove@Base 1.0~beta5
+ list_size@Base 1.0~beta5
+ new_flags@Base 1.0~beta5
+ orig_flags@Base 1.0~beta5
+ pcap_add_record@Base 1.0~beta5
+ pcap_close@Base 1.0~beta5
+ pcap_flush@Base 1.0~beta5
+ pcap_get_next_record@Base 1.0~beta5
+ pcap_get_next_record_content@Base 1.0~beta5
+ pcap_get_next_record_header@Base 1.0~beta5
+ pcap_has_next_record@Base 1.0~beta5
+ pcap_open@Base 1.0~beta5
+ pcap_read_header@Base 1.0~beta5
+ pcap_read_record@Base 1.0~beta5
+ pcap_read_record_header@Base 1.0~beta5
+ pcap_write_header@Base 1.0~beta5
+ pcap_write_record@Base 1.0~beta5
+ pcap_write_record_header@Base 1.0~beta5
+ profiler_create@Base 1.0~beta5
+ profiler_enter@Base 1.0~beta5
+ profiler_exit@Base 1.0~beta5
+ profiler_free@Base 1.0~beta5
+ profiler_print@Base 1.0~beta5
+ profiler_print_footer@Base 1.0~beta5
+ profiler_print_header@Base 1.0~beta5
+ rail_clone_order@Base 1.0~beta5
+ rail_free_cloned_order@Base 1.0~beta5
+ rail_read_rectangle_16@Base 1.0~beta5
+ rail_read_unicode_string@Base 1.0~beta5
+ rail_unicode_string_alloc@Base 1.0~beta5
+ rail_unicode_string_free@Base 1.0~beta5
+ rail_write_rectangle_16@Base 1.0~beta5
+ rail_write_unicode_string@Base 1.0~beta5
+ rail_write_unicode_string_value@Base 1.0~beta5
+ registry_close@Base 1.0~beta5
+ registry_create@Base 1.0~beta5
+ registry_free@Base 1.0~beta5
+ registry_init@Base 1.0~beta5
+ registry_load@Base 1.0~beta5
+ registry_new@Base 1.0~beta5
+ registry_open@Base 1.0~beta5
+ registry_print@Base 1.0~beta5
+ registry_print_entry@Base 1.0~beta5
+ registry_print_section@Base 1.0~beta5
+ stopwatch_create@Base 1.0~beta5
+ stopwatch_free@Base 1.0~beta5
+ stopwatch_get_elapsed_time_in_seconds@Base 1.0~beta5
+ stopwatch_get_elapsed_time_in_useconds@Base 1.0~beta5
+ stopwatch_reset@Base 1.0~beta5
+ stopwatch_start@Base 1.0~beta5
+ stopwatch_stop@Base 1.0~beta5
+ stream_extend@Base 1.0~beta5
+ stream_free@Base 1.0~beta5
+ stream_new@Base 1.0~beta5
+ svc_plugin_init@Base 1.0~beta5
+ svc_plugin_send@Base 1.0~beta5
+ svc_plugin_send_event@Base 1.0~beta5
+ terminal_fildes@Base 1.0~beta5
+ terminal_needs_reset@Base 1.0~beta5
+ wait_obj_clear@Base 1.0~beta5
+ wait_obj_free@Base 1.0~beta5
+ wait_obj_get_fds@Base 1.0~beta5
+ wait_obj_is_set@Base 1.0~beta5
+ wait_obj_new@Base 1.0~beta5
+ wait_obj_new_with_fd@Base 1.0~beta5
+ wait_obj_select@Base 1.0~beta5
+ wait_obj_set@Base 1.0~beta5
+ xfree@Base 1.0~beta5
+ xmalloc@Base 1.0~beta5
+ xrealloc@Base 1.0~beta5
+ xstrdup@Base 1.0~beta5
+ xzalloc@Base 1.0~beta5
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..179c91b
--- /dev/null
@@ -0,0 +1,21 @@
+#!/usr/bin/make -f
+
+%:
+       dh ${@}
+
+override_dh_auto_configure:
+       dh_auto_configure -- -DWITH_FFMPEG=OFF
+
+override_dh_install:
+       # Removing unused files
+       rm -f debian/tmp/usr/lib/*.la
+       rm -f debian/tmp/usr/lib/freerdp/*.la
+       rm -rf debian/tmp/usr/share/freerdp/keymaps
+
+       dh_install --fail-missing
+
+override_dh_strip:
+       dh_strip --dbg-package=freerdp-dbg
+
+override_dh_makeshlibs:
+       dh_makeshlibs -V -- -c4
diff --git a/debian/source/format b/debian/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/watch b/debian/watch
new file mode 100644 (file)
index 0000000..a0d23a4
--- /dev/null
@@ -0,0 +1,3 @@
+version=3
+
+http://sf.net/freerdp/freerdp-(.+)\.tar\.gz
diff --git a/docs/Doxyfile b/docs/Doxyfile
new file mode 100644 (file)
index 0000000..5660fa1
--- /dev/null
@@ -0,0 +1,1515 @@
+# Doxyfile 1.6.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a 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.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = FreeRDP
+
+# 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         =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# 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       =
+
+# 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 cause performance problems for the file system.
+
+CREATE_SUBDIRS         = 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.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) 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.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) 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.
+
+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" "the"
+
+ABBREVIATE_BRIEF       =
+
+# 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.
+
+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.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then 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.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then 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.
+
+STRIP_FROM_PATH        =
+
+# 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 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.
+
+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
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+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 comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+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 behaviour.
+# 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 behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# 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.
+
+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.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# 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                = \
+                         msdn{1}="http://msdn.microsoft.com/en-us/library/\1/"
+
+# 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.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+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.
+
+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, VHDL, C, C++. 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 that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# 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); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip 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.
+
+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 (the default)
+# 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.
+
+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.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) 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.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT 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.
+
+TYPEDEF_HIDES_STRUCT   = YES
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_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 and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+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.
+
+EXTRACT_LOCAL_CLASSES  = NO
+
+# This flag is only useful for Objective-C code. When 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 (the default) only methods in the interface are included.
+
+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.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) 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.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# 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 (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+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 (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+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 (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+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.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) 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.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+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 default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to 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 default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# 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 default), 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.
+
+SORT_BY_SCOPE_NAME     = 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.
+
+GENERATE_TODOLIST      = NO
+
+# 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.
+
+GENERATE_TESTLIST      = NO
+
+# 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.
+
+GENERATE_BUGLIST       = NO
+
+# 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.
+
+GENERATE_DEPRECATEDLIST= NO
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = YES
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of 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 initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+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.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = 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 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 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. See the manual for examples.
+
+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. The 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.
+
+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
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED 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.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR 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.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+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)
+
+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 stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be 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.
+
+INPUT                  = ..
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. 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.
+
+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 pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# 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.
+
+EXCLUDE                = ../build ../cmake ../CMakeFiles ../cunit ../docs ../keymaps ../resources
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# 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
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are 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 <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> 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.
+
+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
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# 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 also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# 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.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# 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.
+
+REFERENCES_LINK_SOURCE = 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.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) 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.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# 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.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+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 one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+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. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = api
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+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 the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = 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. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.freerdp
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, 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.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, 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.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, 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).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, 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.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = YES
+
+# 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.
+
+TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# 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.
+
+FORMULA_FONTSIZE       = 10
+
+# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP)
+# there is already a search function so this one should typically
+# be disabled.
+
+SEARCHENGINE           = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+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 (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# 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.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+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.
+
+INCLUDE_PATH           =
+
+# 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.
+
+INCLUDE_FILE_PATTERNS  =
+
+# 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
+# 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.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. 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. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that 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.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+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.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# 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            =
+
+# 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.
+
+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, 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)
+
+HAVE_DOT               = YES
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need 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.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are 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
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are 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.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# 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.
+
+INCLUDE_GRAPH          = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are 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.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH and HAVE_DOT tags are 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.
+
+CALLER_GRAPH           = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are 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.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH 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.
+
+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).
+
+DOTFILE_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.
+
+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.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# 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).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES 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.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/docs/FreeRDP.vsd b/docs/FreeRDP.vsd
new file mode 100644 (file)
index 0000000..e2f8cfd
Binary files /dev/null and b/docs/FreeRDP.vsd differ
diff --git a/freerdp.pc.in b/freerdp.pc.in
new file mode 100644 (file)
index 0000000..6a44529
--- /dev/null
@@ -0,0 +1,13 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@
+includedir=@CMAKE_INSTALL_PREFIX@/include
+
+Name: FreeRDP
+Description: A free remote desktop protocol client
+URL: http://www.freerdp.com/
+Version: @FREERDP_VERSION_FULL@
+Requires: 
+Libs: -L${libdir} -lfreerdp-core -lfreerdp-codec -lfreerdp-gdi -lfreerdp-kbd -lfreerdp-rail -lfreerdp-channels -lfreerdp-utils
+Cflags: -I${includedir}
+
diff --git a/freerdp.spec b/freerdp.spec
new file mode 100644 (file)
index 0000000..65b1e17
--- /dev/null
@@ -0,0 +1,107 @@
+# cmake
+# make package_source
+# rpmbuild -ta freerdp-<...>.tar.gz
+
+Summary: Remote Desktop Protocol functionality
+Name: freerdp
+Version: 1.0.0
+Release: 1%{?dist}
+License: Apache License 2.0
+Group: Applications/Communications
+URL: http://www.freerdp.com/
+Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
+BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildRequires:  openssl-devel
+BuildRequires: libX11-devel, libXcursor-devel, libXext-devel, libXinerama-devel, libXdamage-devel, libXv-devel, libxkbfile-devel
+BuildRequires: cups-devel
+BuildRequires: alsa-lib-devel
+BuildRequires: pcsc-lite-devel
+
+%description
+FreeRDP is a free implementation of the Remote Desktop Protocol (RDP)
+according to the Microsoft Open Specifications.
+
+%package -n xfreerdp
+Summary: Remote Desktop Protocol client
+Group: Applications/Communications
+Requires: %{name}-libs = %{version}-%{release}, %{name}-plugins-standard = %{version}-%{release}
+%description -n xfreerdp
+FreeRDP is a free implementation of the Remote Desktop Protocol (RDP)
+according to the Microsoft Open Specifications.
+
+%package libs
+Summary: Core libraries implementing the RDP protocol
+Group: Applications/Communications
+%description libs
+libfreerdp-core can be embedded in applications.
+
+libfreerdp-channels and libfreerdp-kbd might be convenient to use in X
+applications together with libfreerdp-core.
+
+libfreerdp-core can be extended with plugins handling RDP channels.
+
+%package plugins-standard
+Summary: Plugins for handling the standard RDP channels
+Group: Applications/Communications
+Requires: %{name}-libs = %{version}-%{release}
+%description plugins-standard
+A set of plugins to the channel manager implementing the standard virtual
+channels extending RDP core functionality. For instance, sounds, clipboard
+sync, disk/printer redirection, etc.
+
+%package devel
+Summary: Libraries and header files for embedding and extending freerdp
+Group: Applications/Communications
+Requires: %{name}-libs = %{version}-%{release}
+Requires: pkgconfig
+%description devel
+Header files and unversioned libraries for libfreerdp-core, libfreerdp-channels,
+libfreerdp-kbd, libfreerdp-cache, libfreerdp-codec, libfreerdp-rail,
+libfreerdp-gdi and libfreerdp-utils.
+
+%prep
+%setup -q
+
+%build
+cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DWITH_PCSC=ON . 
+
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT
+rm -f $RPM_BUILD_ROOT%{_libdir}/{freerdp/,lib}*.{a,la} # FIXME: They shouldn't be installed in the first place
+
+%post libs -p /sbin/ldconfig
+
+%postun libs -p /sbin/ldconfig
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -n xfreerdp
+%defattr(-,root,root)
+%{_bindir}/xfreerdp
+%{_mandir}/*/*
+
+%files libs
+%defattr(-,root,root)
+%doc LICENSE README
+%{_libdir}/lib*.so.*
+%dir %{_libdir}/freerdp
+%{_datadir}/freerdp/
+
+%files plugins-standard
+%defattr(-,root,root)
+%{_libdir}/freerdp/*.so
+
+%files devel
+%defattr(-,root,root)
+%{_includedir}/freerdp/
+%{_libdir}/lib*.so
+%{_libdir}/pkgconfig/*
+
+%changelog
+
+* Tue Mar 16 2010 Mads Kiilerich <mads@kiilerich.com> - 0.0.1-1
+- Initial "upstream" freerdp spec - made and tested for Fedora 12
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b7ffe72
--- /dev/null
@@ -0,0 +1,30 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# include headers cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+file(GLOB HEADERS "freerdp/*.h")
+install_files(/include/freerdp FILES ${HEADERS})
+
+install(DIRECTORY freerdp/utils DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/channels DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/cache DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/gdi DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/kbd DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/rail DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/codec DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
+install(DIRECTORY freerdp/plugins DESTINATION include/freerdp FILES_MATCHING PATTERN "*.h")
diff --git a/include/freerdp/altsec.h b/include/freerdp/altsec.h
new file mode 100644 (file)
index 0000000..08da675
--- /dev/null
@@ -0,0 +1,217 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Alternate Secondary Drawing Orders Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_ALTSEC_H
+#define __UPDATE_ALTSEC_H
+
+#include <freerdp/types.h>
+
+#define DSDNG_STRETCH                  0x00000001
+#define DSDNG_TILE                     0x00000002
+#define DSDNG_PERPIXELALPHA            0x00000004
+#define DSDNG_TRANSPARENT              0x00000008
+#define DSDNG_MUSTFLIP                         0x00000010
+#define DSDNG_TRUESIZE                         0x00000020
+
+#define FRAME_START                    0x00000000
+#define FRAME_END                      0x00000001
+
+#define STREAM_BITMAP_END              0x01
+#define STREAM_BITMAP_COMPRESSED       0x02
+#define STREAM_BITMAP_V2               0x04
+
+struct _OFFSCREEN_DELETE_LIST
+{
+       uint32 sIndices;
+       uint32 cIndices;
+       uint16* indices;
+};
+typedef struct _OFFSCREEN_DELETE_LIST OFFSCREEN_DELETE_LIST;
+
+struct _CREATE_OFFSCREEN_BITMAP_ORDER
+{
+       uint32 id;
+       uint32 cx;
+       uint32 cy;
+       OFFSCREEN_DELETE_LIST deleteList;
+};
+typedef struct _CREATE_OFFSCREEN_BITMAP_ORDER CREATE_OFFSCREEN_BITMAP_ORDER;
+
+struct _SWITCH_SURFACE_ORDER
+{
+       uint32 bitmapId;
+};
+typedef struct _SWITCH_SURFACE_ORDER SWITCH_SURFACE_ORDER;
+
+struct _NINE_GRID_BITMAP_INFO
+{
+       uint32 flFlags;
+       uint32 ulLeftWidth;
+       uint32 ulRightWidth;
+       uint32 ulTopHeight;
+       uint32 ulBottomHeight;
+       uint32 crTransparent;
+};
+typedef struct _NINE_GRID_BITMAP_INFO NINE_GRID_BITMAP_INFO;
+
+struct _CREATE_NINE_GRID_BITMAP_ORDER
+{
+       uint32 bitmapBpp;
+       uint32 bitmapId;
+       uint32 cx;
+       uint32 cy;
+       NINE_GRID_BITMAP_INFO nineGridInfo;
+};
+typedef struct _CREATE_NINE_GRID_BITMAP_ORDER CREATE_NINE_GRID_BITMAP_ORDER;
+
+struct _FRAME_MARKER_ORDER
+{
+       uint32 action;
+};
+typedef struct _FRAME_MARKER_ORDER FRAME_MARKER_ORDER;
+
+struct _STREAM_BITMAP_FIRST_ORDER
+{
+       uint32 bitmapFlags;
+       uint32 bitmapBpp;
+       uint32 bitmapType;
+       uint32 bitmapWidth;
+       uint32 bitmapHeight;
+       uint32 bitmapSize;
+       uint32 bitmapBlockSize;
+       uint8* bitmapBlock;
+};
+typedef struct _STREAM_BITMAP_FIRST_ORDER STREAM_BITMAP_FIRST_ORDER;
+
+struct _STREAM_BITMAP_NEXT_ORDER
+{
+       uint32 bitmapFlags;
+       uint32 bitmapType;
+       uint32 bitmapBlockSize;
+       uint8* bitmapBlock;
+};
+typedef struct _STREAM_BITMAP_NEXT_ORDER STREAM_BITMAP_NEXT_ORDER;
+
+struct _DRAW_GDIPLUS_FIRST_ORDER
+{
+       uint32 cbSize;
+       uint32 cbTotalSize;
+       uint32 cbTotalEmfSize;
+       uint8* emfRecords;
+};
+typedef struct _DRAW_GDIPLUS_FIRST_ORDER DRAW_GDIPLUS_FIRST_ORDER;
+
+struct _DRAW_GDIPLUS_NEXT_ORDER
+{
+       uint32 cbSize;
+       uint8* emfRecords;
+};
+typedef struct _DRAW_GDIPLUS_NEXT_ORDER DRAW_GDIPLUS_NEXT_ORDER;
+
+struct _DRAW_GDIPLUS_END_ORDER
+{
+       uint32 cbSize;
+       uint32 cbTotalSize;
+       uint32 cbTotalEmfSize;
+       uint8* emfRecords;
+};
+typedef struct _DRAW_GDIPLUS_END_ORDER DRAW_GDIPLUS_END_ORDER;
+
+struct _DRAW_GDIPLUS_CACHE_FIRST_ORDER
+{
+       uint32 flags;
+       uint32 cacheType;
+       uint32 cacheIndex;
+       uint32 cbSize;
+       uint32 cbTotalSize;
+       uint8* emfRecords;
+};
+typedef struct _DRAW_GDIPLUS_CACHE_FIRST_ORDER DRAW_GDIPLUS_CACHE_FIRST_ORDER;
+
+struct _DRAW_GDIPLUS_CACHE_NEXT_ORDER
+{
+       uint32 flags;
+       uint32 cacheType;
+       uint32 cacheIndex;
+       uint32 cbSize;
+       uint8* emfRecords;
+};
+typedef struct _DRAW_GDIPLUS_CACHE_NEXT_ORDER DRAW_GDIPLUS_CACHE_NEXT_ORDER;
+
+struct _DRAW_GDIPLUS_CACHE_END_ORDER
+{
+       uint32 flags;
+       uint32 cacheType;
+       uint32 cacheIndex;
+       uint32 cbSize;
+       uint32 cbTotalSize;
+       uint8* emfRecords;
+};
+typedef struct _DRAW_GDIPLUS_CACHE_END_ORDER DRAW_GDIPLUS_CACHE_END_ORDER;
+
+typedef void (*pCreateOffscreenBitmap)(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap);
+typedef void (*pSwitchSurface)(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface);
+typedef void (*pCreateNineGridBitmap)(rdpContext* context, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap);
+typedef void (*pFrameMarker)(rdpContext* context, FRAME_MARKER_ORDER* frame_marker);
+typedef void (*pStreamBitmapFirst)(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first);
+typedef void (*pStreamBitmapNext)(rdpContext* context, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_next);
+typedef void (*pDrawGdiPlusFirst)(rdpContext* context, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first);
+typedef void (*pDrawGdiPlusNext)(rdpContext* context, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next);
+typedef void (*pDrawGdiPlusEnd)(rdpContext* context, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end);
+typedef void (*pDrawGdiPlusCacheFirst)(rdpContext* context, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first);
+typedef void (*pDrawGdiPlusCacheNext)(rdpContext* context, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next);
+typedef void (*pDrawGdiPlusCacheEnd)(rdpContext* context, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end);
+
+struct rdp_altsec_update
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       pCreateOffscreenBitmap CreateOffscreenBitmap; /* 16 */
+       pSwitchSurface SwitchSurface; /* 17 */
+       pCreateNineGridBitmap CreateNineGridBitmap; /* 18 */
+       pFrameMarker FrameMarker; /* 19 */
+       pStreamBitmapFirst StreamBitmapFirst; /* 20 */
+       pStreamBitmapNext StreamBitmapNext; /* 21 */
+       pDrawGdiPlusFirst DrawGdiPlusFirst; /* 22 */
+       pDrawGdiPlusNext DrawGdiPlusNext; /* 23 */
+       pDrawGdiPlusEnd DrawGdiPlusEnd; /* 24 */
+       pDrawGdiPlusCacheFirst DrawGdiPlusCacheFirst; /* 25 */
+       pDrawGdiPlusCacheNext DrawGdiPlusCacheNext; /* 26 */
+       pDrawGdiPlusCacheEnd DrawGdiPlusCacheEnd; /* 27 */
+       uint32 paddingB[32 - 28]; /* 28 */
+
+       /* internal */
+
+       CREATE_OFFSCREEN_BITMAP_ORDER create_offscreen_bitmap;
+       SWITCH_SURFACE_ORDER switch_surface;
+       CREATE_NINE_GRID_BITMAP_ORDER create_nine_grid_bitmap;
+       FRAME_MARKER_ORDER frame_marker;
+       STREAM_BITMAP_FIRST_ORDER stream_bitmap_first;
+       STREAM_BITMAP_FIRST_ORDER stream_bitmap_next;
+       DRAW_GDIPLUS_CACHE_FIRST_ORDER draw_gdiplus_cache_first;
+       DRAW_GDIPLUS_CACHE_NEXT_ORDER draw_gdiplus_cache_next;
+       DRAW_GDIPLUS_CACHE_END_ORDER draw_gdiplus_cache_end;
+       DRAW_GDIPLUS_FIRST_ORDER draw_gdiplus_first;
+       DRAW_GDIPLUS_NEXT_ORDER draw_gdiplus_next;
+       DRAW_GDIPLUS_END_ORDER draw_gdiplus_end;
+};
+typedef struct rdp_altsec_update rdpAltSecUpdate;
+
+#endif /* __UPDATE_ALTSEC_H */
diff --git a/include/freerdp/api.h b/include/freerdp/api.h
new file mode 100644 (file)
index 0000000..1c2ba7a
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Interface
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_API_H
+#define __FREERDP_API_H
+
+#define FREERDP_INTERFACE_VERSION 4
+
+#if defined _WIN32 || defined __CYGWIN__
+  #ifdef FREERDP_EXPORTS
+    #ifdef __GNUC__
+      #define FREERDP_API __attribute__((dllexport))
+    #else
+      #define FREERDP_API __declspec(dllexport)
+    #endif
+  #else
+    #ifdef __GNUC__
+      #define FREERDP_API __attribute__((dllimport))
+    #else
+      #define FREERDP_API __declspec(dllimport)
+    #endif
+  #endif
+#else
+  #if __GNUC__ >= 4
+    #define FREERDP_API   __attribute__ ((visibility("default")))
+  #else
+    #define FREERDP_API
+  #endif
+#endif
+
+#ifdef _WIN32
+#define FREERDP_CC __cdecl
+#else
+#define FREERDP_CC
+#endif
+
+#ifdef _WIN32
+#define INLINE __inline
+#else
+#define INLINE inline
+#endif
+
+#define IFCALL(_cb, ...) do { if (_cb != NULL) { _cb( __VA_ARGS__ ); } } while (0)
+#define IFCALLRET(_cb, _ret, ...) do { if (_cb != NULL) { _ret = _cb( __VA_ARGS__ ); } } while (0)
+
+#endif
diff --git a/include/freerdp/cache/bitmap.h b/include/freerdp/cache/bitmap.h
new file mode 100644 (file)
index 0000000..5455b1f
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Bitmap Cache V2
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BITMAP_V2_CACHE_H
+#define __BITMAP_V2_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct _BITMAP_V2_CELL BITMAP_V2_CELL;
+typedef struct rdp_bitmap_cache rdpBitmapCache;
+
+#include <freerdp/cache/cache.h>
+
+struct _BITMAP_V2_CELL
+{
+       uint32 number;
+       rdpBitmap** entries;
+};
+
+struct rdp_bitmap_cache
+{
+       pMemBlt MemBlt; /* 0 */
+       pMem3Blt Mem3Blt; /* 1 */
+       pCacheBitmap CacheBitmap; /* 2 */
+       pCacheBitmapV2 CacheBitmapV2; /* 3 */
+       pCacheBitmapV3 CacheBitmapV3; /* 4 */
+       pBitmapUpdate BitmapUpdate; /* 5 */
+       uint32 paddingA[16 - 6]; /* 6 */
+
+       uint32 maxCells; /* 16 */
+       BITMAP_V2_CELL* cells; /* 17 */
+       uint32 paddingB[32 - 18]; /* 18 */
+
+       /* internal */
+
+       rdpBitmap* bitmap;
+       rdpUpdate* update;
+       rdpContext* context;
+       rdpSettings* settings;
+};
+
+FREERDP_API rdpBitmap* bitmap_cache_get(rdpBitmapCache* bitmap_cache, uint32 id, uint32 index);
+FREERDP_API void bitmap_cache_put(rdpBitmapCache* bitmap_cache, uint32 id, uint32 index, rdpBitmap* bitmap);
+
+FREERDP_API void bitmap_cache_register_callbacks(rdpUpdate* update);
+
+FREERDP_API rdpBitmapCache* bitmap_cache_new(rdpSettings* settings);
+FREERDP_API void bitmap_cache_free(rdpBitmapCache* bitmap_cache);
+
+#endif /* __BITMAP_V2_CACHE_H */
diff --git a/include/freerdp/cache/brush.h b/include/freerdp/cache/brush.h
new file mode 100644 (file)
index 0000000..ad1d547
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Brush Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BRUSH_CACHE_H
+#define __BRUSH_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct _BRUSH_ENTRY BRUSH_ENTRY;
+typedef struct rdp_brush_cache rdpBrushCache;
+
+#include <freerdp/cache/cache.h>
+
+struct _BRUSH_ENTRY
+{
+       uint32 bpp;
+       void* entry;
+};
+
+struct rdp_brush_cache
+{
+       pPatBlt PatBlt; /* 0 */
+       pCacheBrush CacheBrush; /* 1 */
+       uint32 paddingA[16 - 2]; /* 2 */
+
+       uint32 maxEntries; /* 16 */
+       uint32 maxMonoEntries; /* 17 */
+       BRUSH_ENTRY* entries; /* 18 */
+       BRUSH_ENTRY* monoEntries; /* 19 */
+       uint32 paddingB[32 - 20]; /* 20 */
+
+       /* internal */
+
+       rdpSettings* settings;
+};
+
+FREERDP_API void* brush_cache_get(rdpBrushCache* brush, uint32 index, uint32* bpp);
+FREERDP_API void brush_cache_put(rdpBrushCache* brush, uint32 index, void* entry, uint32 bpp);
+
+FREERDP_API void brush_cache_register_callbacks(rdpUpdate* update);
+
+FREERDP_API rdpBrushCache* brush_cache_new(rdpSettings* settings);
+FREERDP_API void brush_cache_free(rdpBrushCache* brush);
+
+#endif /* __BRUSH_CACHE_H */
diff --git a/include/freerdp/cache/cache.h b/include/freerdp/cache/cache.h
new file mode 100644 (file)
index 0000000..aea19a1
--- /dev/null
@@ -0,0 +1,52 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Caches
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CACHE_H
+#define __CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+#include <freerdp/cache/glyph.h>
+#include <freerdp/cache/brush.h>
+#include <freerdp/cache/pointer.h>
+#include <freerdp/cache/bitmap.h>
+#include <freerdp/cache/offscreen.h>
+#include <freerdp/cache/palette.h>
+
+struct rdp_cache
+{
+       rdpGlyphCache* glyph; /* 0 */
+       rdpBrushCache* brush; /* 1 */
+       rdpPointerCache* pointer; /* 2 */
+       rdpBitmapCache* bitmap; /* 3 */
+       rdpOffscreenCache* offscreen; /* 4 */
+       rdpPaletteCache* palette; /* 5 */
+
+       /* internal */
+
+       rdpSettings* settings;
+};
+
+FREERDP_API rdpCache* cache_new(rdpSettings* settings);
+FREERDP_API void cache_free(rdpCache* cache);
+
+#endif /* __CACHE_H */
diff --git a/include/freerdp/cache/glyph.h b/include/freerdp/cache/glyph.h
new file mode 100644 (file)
index 0000000..7f0c106
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Glyph Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GLYPH_CACHE_H
+#define __GLYPH_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct _GLYPH_CACHE GLYPH_CACHE;
+typedef struct _FRAGMENT_CACHE_ENTRY FRAGMENT_CACHE_ENTRY;
+typedef struct _FRAGMENT_CACHE FRAGMENT_CACHE;
+typedef struct rdp_glyph_cache rdpGlyphCache;
+
+#include <freerdp/cache/cache.h>
+
+struct _GLYPH_CACHE
+{
+       uint32 number;
+       uint32 maxCellSize;
+       rdpGlyph** entries;
+};
+
+struct _FRAGMENT_CACHE_ENTRY
+{
+       void* fragment;
+       uint32 size;
+};
+
+struct _FRAGMENT_CACHE
+{
+       FRAGMENT_CACHE_ENTRY* entries;
+};
+
+struct rdp_glyph_cache
+{
+       FRAGMENT_CACHE fragCache;
+       GLYPH_CACHE glyphCache[10];
+
+       rdpContext* context;
+       rdpSettings* settings;
+};
+
+FREERDP_API rdpGlyph* glyph_cache_get(rdpGlyphCache* glyph_cache, uint32 id, uint32 index);
+FREERDP_API void glyph_cache_put(rdpGlyphCache* glyph_cache, uint32 id, uint32 index, rdpGlyph* entry);
+
+FREERDP_API void* glyph_cache_fragment_get(rdpGlyphCache* glyph, uint32 index, uint32* count);
+FREERDP_API void glyph_cache_fragment_put(rdpGlyphCache* glyph, uint32 index, uint32 count, void* entry);
+
+FREERDP_API void glyph_cache_register_callbacks(rdpUpdate* update);
+
+FREERDP_API rdpGlyphCache* glyph_cache_new(rdpSettings* settings);
+FREERDP_API void glyph_cache_free(rdpGlyphCache* glyph);
+
+#endif /* __GLYPH_CACHE_H */
diff --git a/include/freerdp/cache/offscreen.h b/include/freerdp/cache/offscreen.h
new file mode 100644 (file)
index 0000000..286bcf1
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Offscreen Bitmap Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __OFFSCREEN_CACHE_H
+#define __OFFSCREEN_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_offscreen_cache rdpOffscreenCache;
+
+#include <freerdp/cache/cache.h>
+
+struct rdp_offscreen_cache
+{
+       uint32 maxSize; /* 0 */
+       uint32 maxEntries; /* 1 */
+       rdpBitmap** entries; /* 2 */
+       uint32 currentSurface; /* 3 */
+
+       /* internal */
+
+       rdpUpdate* update;
+       rdpSettings* settings;
+};
+
+FREERDP_API rdpBitmap* offscreen_cache_get(rdpOffscreenCache* offscreen_cache, uint32 index);
+FREERDP_API void offscreen_cache_put(rdpOffscreenCache* offscreen_cache, uint32 index, rdpBitmap* bitmap);
+FREERDP_API void offscreen_cache_delete(rdpOffscreenCache* offscreen, uint32 index);
+
+FREERDP_API void offscreen_cache_register_callbacks(rdpUpdate* update);
+
+FREERDP_API rdpOffscreenCache* offscreen_cache_new(rdpSettings* settings);
+FREERDP_API void offscreen_cache_free(rdpOffscreenCache* offscreen);
+
+#endif /* __OFFSCREEN_CACHE_H */
diff --git a/include/freerdp/cache/palette.h b/include/freerdp/cache/palette.h
new file mode 100644 (file)
index 0000000..d30e9cf
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Palette (Color Table) Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PALETTE_CACHE_H
+#define __PALETTE_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct _PALETTE_TABLE_ENTRY PALETTE_TABLE_ENTRY;
+typedef struct rdp_palette_cache rdpPaletteCache;
+
+#include <freerdp/cache/cache.h>
+
+struct _PALETTE_TABLE_ENTRY
+{
+       void* entry;
+};
+
+struct rdp_palette_cache
+{
+       uint32 maxEntries; /* 0 */
+       PALETTE_TABLE_ENTRY* entries; /* 1 */
+
+       /* internal */
+
+       rdpSettings* settings;
+};
+
+FREERDP_API void* palette_cache_get(rdpPaletteCache* palette, uint32 index);
+FREERDP_API void palette_cache_put(rdpPaletteCache* palette, uint32 index, void* entry);
+
+FREERDP_API void palette_cache_register_callbacks(rdpUpdate* update);
+
+FREERDP_API rdpPaletteCache* palette_cache_new(rdpSettings* settings);
+FREERDP_API void palette_cache_free(rdpPaletteCache* palette_cache);
+
+#endif /* __PALETTE_CACHE_H */
diff --git a/include/freerdp/cache/pointer.h b/include/freerdp/cache/pointer.h
new file mode 100644 (file)
index 0000000..5351c9b
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Pointer Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __POINTER_CACHE_H
+#define __POINTER_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/graphics.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_pointer_cache rdpPointerCache;
+
+#include <freerdp/cache/cache.h>
+
+struct rdp_pointer_cache
+{
+       uint32 cacheSize; /* 0 */
+       rdpPointer** entries; /* 1 */
+
+       /* internal */
+
+       rdpUpdate* update;
+       rdpSettings* settings;
+};
+
+FREERDP_API rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache, uint32 index);
+FREERDP_API void pointer_cache_put(rdpPointerCache* pointer_cache, uint32 index, rdpPointer* pointer);
+
+FREERDP_API void pointer_cache_register_callbacks(rdpUpdate* update);
+
+FREERDP_API rdpPointerCache* pointer_cache_new(rdpSettings* settings);
+FREERDP_API void pointer_cache_free(rdpPointerCache* pointer_cache);
+
+#endif /* __POINTER_CACHE_H */
diff --git a/include/freerdp/channels/channels.h b/include/freerdp/channels/channels.h
new file mode 100644 (file)
index 0000000..8bc3a39
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Virtual Channel Manager
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_CHANNELS_H
+#define __FREERDP_CHANNELS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/freerdp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+FREERDP_API int freerdp_channels_global_init(void);
+FREERDP_API int freerdp_channels_global_uninit(void);
+FREERDP_API rdpChannels* freerdp_channels_new(void);
+FREERDP_API void freerdp_channels_free(rdpChannels* channels);
+FREERDP_API int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings,
+       const char* name, void* data);
+FREERDP_API int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance);
+FREERDP_API int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance);
+FREERDP_API int freerdp_channels_data(freerdp* instance, int channel_id, void* data, int data_size,
+       int flags, int total_size);
+FREERDP_API int freerdp_channels_send_event(rdpChannels* channels, RDP_EVENT* event);
+FREERDP_API boolean freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds,
+       int* read_count, void** write_fds, int* write_count);
+FREERDP_API boolean freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance);
+FREERDP_API RDP_EVENT* freerdp_channels_pop_event(rdpChannels* channels);
+FREERDP_API void freerdp_channels_close(rdpChannels* channels, freerdp* instance);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __FREERDP_CHANNELS_H */
diff --git a/include/freerdp/channels/wtsvc.h b/include/freerdp/channels/wtsvc.h
new file mode 100644 (file)
index 0000000..3756507
--- /dev/null
@@ -0,0 +1,128 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Server Virtual Channel Interface
+ *
+ * Copyright 2011-2012 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The server-side virtual channel API follows the Microsoft Remote Desktop
+ * Services API functions WTSVirtualChannel* defined in:
+ * http://msdn.microsoft.com/en-us/library/windows/desktop/aa383464.aspx
+ *
+ * Difference between the MS API are documented in this header. All functions
+ * are implemented in and integrated with libfreerdp-channels.
+ *
+ * Unlike MS API, all functions except WTSVirtualChannelOpenEx in this
+ * implementation are thread-safe.
+ */
+
+#ifndef __FREERDP_WTSVC_H
+#define __FREERDP_WTSVC_H
+
+#include <freerdp/types.h>
+#include <freerdp/peer.h>
+
+typedef struct WTSVirtualChannelManager WTSVirtualChannelManager;
+
+#define WTS_CHANNEL_OPTION_DYNAMIC 0x00000001
+
+typedef enum _WTS_VIRTUAL_CLASS
+{
+       WTSVirtualClientData,
+       WTSVirtualFileHandle 
+} WTS_VIRTUAL_CLASS;
+
+/**
+ * WTSVirtualChannelManager functions are FreeRDP extensions to the API.
+ */
+FREERDP_API WTSVirtualChannelManager* WTSCreateVirtualChannelManager(freerdp_peer* client);
+FREERDP_API void WTSDestroyVirtualChannelManager(WTSVirtualChannelManager* vcm);
+FREERDP_API void WTSVirtualChannelManagerGetFileDescriptor(WTSVirtualChannelManager* vcm,
+       void** fds, int* fds_count);
+FREERDP_API boolean WTSVirtualChannelManagerCheckFileDescriptor(WTSVirtualChannelManager* vcm);
+
+/**
+ * Opens a static or dynamic virtual channel and return the handle. If the
+ * operation fails, a NULL handle is returned.
+ * 
+ * The original MS API has 'DWORD SessionId' as the first argument, while we
+ * use our WTSVirtualChannelManager object instead.
+ *
+ * This functions should be called only from the main thread.
+ */
+FREERDP_API void* WTSVirtualChannelOpenEx(
+       /* __in */ WTSVirtualChannelManager* vcm,
+       /* __in */ const char* pVirtualName,
+       /* __in */ uint32 flags);
+
+/**
+ * Returns information about a specified virtual channel.
+ *
+ * Servers use this function to gain access to a virtual channel file handle
+ * that can be used for asynchronous I/O.
+ */
+FREERDP_API boolean WTSVirtualChannelQuery(
+       /* __in */  void* hChannelHandle,
+       /* __in */  WTS_VIRTUAL_CLASS WtsVirtualClass,
+       /* __out */ void** ppBuffer,
+       /* __out */ uint32* pBytesReturned);
+
+/**
+ * Frees memory allocated by WTSVirtualChannelQuery
+ */
+FREERDP_API void WTSFreeMemory(
+       /* __in */ void* pMemory);
+
+/**
+ * Reads data from the server end of a virtual channel.
+ *
+ * FreeRDP behavior:
+ *
+ * This function will always return a complete channel data packet, i.e. chunks
+ * are already assembled. If BufferSize argument is smaller than the packet
+ * size, it will set the desired size in pBytesRead and return false. The
+ * caller should allocate a large enough buffer and call this function again.
+ * Returning false with pBytesRead set to zero indicates an error has occurred.
+ * If no pending packet to be read, it will set pBytesRead to zero and return
+ * true.
+ *
+ * TimeOut is not supported, and this function will always return immediately.
+ * The caller should use the file handle returned by WTSVirtualChannelQuery to
+ * determine whether a packet has arrived.
+ */
+FREERDP_API boolean WTSVirtualChannelRead(
+       /* __in */  void* hChannelHandle,
+       /* __in */  uint32 TimeOut,
+       /* __out */ uint8* Buffer,
+       /* __in */  uint32 BufferSize,
+       /* __out */ uint32* pBytesRead);
+
+/**
+ * Writes data to the server end of a virtual channel.
+ */
+FREERDP_API boolean WTSVirtualChannelWrite(
+       /* __in */  void* hChannelHandle,
+       /* __in */  uint8* Buffer,
+       /* __in */  uint32 Length,
+       /* __out */ uint32* pBytesWritten);
+
+/**
+ * Closes an open virtual channel handle.
+ */
+FREERDP_API boolean WTSVirtualChannelClose(
+       /* __in */ void* hChannelHandle);
+
+#endif /* __FREERDP_WTSVC_H */
diff --git a/include/freerdp/codec/bitmap.h b/include/freerdp/codec/bitmap.h
new file mode 100644 (file)
index 0000000..b440eaf
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Compressed Bitmap
+ *
+ * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BITMAP_H
+#define __BITMAP_H
+
+#include <freerdp/types.h>
+
+FREERDP_API boolean bitmap_decompress(uint8* srcData, uint8* dstData, int width, int height, int size, int srcBpp, int dstBpp);
+
+#endif /* __BITMAP_H */
diff --git a/include/freerdp/codec/color.h b/include/freerdp/codec/color.h
new file mode 100644 (file)
index 0000000..14f3058
--- /dev/null
@@ -0,0 +1,264 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Color Conversion Routines
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __COLOR_H
+#define __COLOR_H
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Color Space Conversions: http://msdn.microsoft.com/en-us/library/ff566496/ */
+
+/* Color Space Conversion */
+
+#define RGB_555_565(_r, _g, _b) \
+       _r = _r; \
+       _g = (_g << 1 & ~0x1) | (_g >> 4); \
+       _b = _b;
+
+#define RGB_565_555(_r, _g, _b) \
+       _r = _r; \
+       _g = (_g >> 1); \
+       _b = _b;
+
+#define RGB_555_888(_r, _g, _b) \
+       _r = (_r << 3 & ~0x7) | (_r >> 2); \
+       _g = (_g << 3 & ~0x7) | (_g >> 2); \
+       _b = (_b << 3 & ~0x7) | (_b >> 2);
+
+#define RGB_565_888(_r, _g, _b) \
+       _r = (_r << 3 & ~0x7) | (_r >> 2); \
+       _g = (_g << 2 & ~0x3) | (_g >> 4); \
+       _b = (_b << 3 & ~0x7) | (_b >> 2);
+
+#define RGB_888_565(_r, _g, _b) \
+       _r = (_r >> 3); \
+       _g = (_g >> 2); \
+       _b = (_b >> 3);
+
+#define RGB_888_555(_r, _g, _b) \
+       _r = (_r >> 3); \
+       _g = (_g >> 3); \
+       _b = (_b >> 3);
+
+/* RGB 15 (RGB_555) */
+
+#define RGB555(_r, _g, _b)  \
+       ((_r & 0x1F) << 10) | ((_g & 0x1F) << 5) | (_b & 0x1F)
+
+#define RGB15(_r, _g, _b)  \
+       (((_r >> 3) & 0x1F) << 10) | (((_g >> 3) & 0x1F) << 5) | ((_b >> 3) & 0x1F)
+
+#define GetRGB_555(_r, _g, _b, _p) \
+       _r = (_p & 0x7C00) >> 10; \
+       _g = (_p & 0x3E0) >> 5; \
+       _b = (_p & 0x1F);
+
+#define GetRGB15(_r, _g, _b, _p) \
+       GetRGB_555(_r, _g, _b, _p); \
+       RGB_555_888(_r, _g, _b);
+
+/* BGR 15 (BGR_555) */
+
+#define BGR555(_r, _g, _b)  \
+       ((_b & 0x1F) << 10) | ((_g & 0x1F) << 5) | (_r & 0x1F)
+
+#define BGR15(_r, _g, _b)  \
+       (((_b >> 3) & 0x1F) << 10) | (((_g >> 3) & 0x1F) << 5) | ((_r >> 3) & 0x1F)
+
+#define GetBGR_555(_r, _g, _b, _p) \
+       _b = (_p & 0x7C00) >> 10; \
+       _g = (_p & 0x3E0) >> 5; \
+       _r = (_p & 0x1F);
+
+#define GetBGR15(_r, _g, _b, _p) \
+       GetBGR_555(_r, _g, _b, _p); \
+       RGB_555_888(_r, _g, _b);
+
+/* RGB 16 (RGB_565) */
+
+#define RGB565(_r, _g, _b)  \
+       ((_r & 0x1F) << 11) | ((_g & 0x3F) << 5) | (_b & 0x1F)
+
+#define RGB16(_r, _g, _b)  \
+       (((_r >> 3) & 0x1F) << 11) | (((_g >> 2) & 0x3F) << 5) | ((_b >> 3) & 0x1F)
+
+#define GetRGB_565(_r, _g, _b, _p) \
+       _r = (_p & 0xF800) >> 11; \
+       _g = (_p & 0x7E0) >> 5; \
+       _b = (_p & 0x1F);
+
+#define GetRGB16(_r, _g, _b, _p) \
+       GetRGB_565(_r, _g, _b, _p); \
+       RGB_565_888(_r, _g, _b);
+
+/* BGR 16 (BGR_565) */
+
+#define BGR565(_r, _g, _b)  \
+       ((_b & 0x1F) << 11) | ((_g & 0x3F) << 5) | (_r & 0x1F)
+
+#define BGR16(_r, _g, _b)  \
+       (((_b >> 3) & 0x1F) << 11) | (((_g >> 2) & 0x3F) << 5) | ((_r >> 3) & 0x1F)
+
+#define GetBGR_565(_r, _g, _b, _p) \
+       _b = (_p & 0xF800) >> 11; \
+       _g = (_p & 0x7E0) >> 5; \
+       _r = (_p & 0x1F);
+
+#define GetBGR16(_r, _g, _b, _p) \
+       GetBGR_565(_r, _g, _b, _p); \
+       RGB_565_888(_r, _g, _b);
+
+/* RGB 24 (RGB_888) */
+
+#define RGB24(_r, _g, _b)  \
+       (_r << 16) | (_g << 8) | _b
+
+#define GetRGB24(_r, _g, _b, _p) \
+       _r = (_p & 0xFF0000) >> 16; \
+       _g = (_p & 0xFF00) >> 8; \
+       _b = (_p & 0xFF);
+
+/* BGR 24 (BGR_888) */
+
+#define BGR24(_r, _g, _b)  \
+       (_b << 16) | (_g << 8) | _r
+
+#define GetBGR24(_r, _g, _b, _p) \
+       _b = (_p & 0xFF0000) >> 16; \
+       _g = (_p & 0xFF00) >> 8; \
+       _r = (_p & 0xFF);
+
+/* RGB 32 (ARGB_8888), alpha ignored */
+
+#define RGB32(_r, _g, _b)  \
+       (_r << 16) | (_g << 8) | _b
+
+#define GetRGB32(_r, _g, _b, _p) \
+       _r = (_p & 0xFF0000) >> 16; \
+       _g = (_p & 0xFF00) >> 8; \
+       _b = (_p & 0xFF);
+
+/* ARGB 32 (ARGB_8888) */
+
+#define ARGB32(_a,_r, _g, _b)  \
+       (_a << 24) | (_r << 16) | (_g << 8) | _b
+
+#define GetARGB32(_a, _r, _g, _b, _p) \
+       _a = (_p & 0xFF000000) >> 24; \
+       _r = (_p & 0xFF0000) >> 16; \
+       _g = (_p & 0xFF00) >> 8; \
+       _b = (_p & 0xFF);
+
+/* BGR 32 (ABGR_8888), alpha ignored */
+
+#define BGR32(_r, _g, _b)  \
+       (_b << 16) | (_g << 8) | _r
+
+#define GetBGR32(_r, _g, _b, _p) \
+       _b = (_p & 0xFF0000) >> 16; \
+       _g = (_p & 0xFF00) >> 8; \
+       _r = (_p & 0xFF);
+
+/* BGR 32 (ABGR_8888) */
+
+#define ABGR32(_a, _r, _g, _b)  \
+       (_a << 24) | (_b << 16) | (_g << 8) | _r
+
+#define GetABGR32(_a, _r, _g, _b, _p) \
+       _a = (_p & 0xFF000000) >> 24; \
+       _b = (_p & 0xFF0000) >> 16; \
+       _g = (_p & 0xFF00) >> 8; \
+       _r = (_p & 0xFF);
+
+/* Color Conversion */
+
+#define BGR16_RGB32(_r, _g, _b, _p) \
+       GetBGR16(_r, _g, _b, _p); \
+       RGB_565_888(_r, _g, _b); \
+       _p = RGB32(_r, _g, _b);
+
+#define RGB32_RGB16(_r, _g, _b, _p) \
+       GetRGB32(_r, _g, _b, _p); \
+       RGB_888_565(_r, _g, _b); \
+       _p = RGB565(_r, _g, _b);
+
+#define RGB15_RGB16(_r, _g, _b, _p) \
+       GetRGB_555(_r, _g, _b, _p); \
+       _g = (_g << 1 & ~0x1) | (_g >> 4); \
+       _p = RGB565(_r, _g, _b);
+
+#define RGB16_RGB15(_r, _g, _b, _p) \
+       GetRGB_565(_r, _g, _b, _p); \
+       _g = (_g >> 1); \
+       _p = RGB555(_r, _g, _b);
+
+#define CLRCONV_ALPHA          1
+#define CLRCONV_INVERT         2
+/* if defined RGB555 format is used when rendering with a 16-bit frame buffer */
+#define CLRCONV_RGB555         4
+
+/* Supported Internal Buffer Formats */
+#define CLRBUF_16BPP           8
+#define        CLRBUF_24BPP            16
+#define        CLRBUF_32BPP            32
+
+struct _CLRCONV
+{
+       int alpha;
+       int invert;
+       int rgb555;
+       rdpPalette* palette;
+};
+typedef struct _CLRCONV CLRCONV;
+typedef CLRCONV* HCLRCONV;
+
+#define IBPP(_bpp) (((_bpp + 1)/ 8) % 5)
+
+typedef uint8* (*p_freerdp_image_convert)(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv);
+
+FREERDP_API uint8* freerdp_image_convert(uint8* srcData, uint8 *dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint8* freerdp_glyph_convert(int width, int height, uint8* data);
+FREERDP_API void   freerdp_bitmap_flip(uint8 * src, uint8 * dst, int scanLineSz, int height);
+FREERDP_API uint8* freerdp_image_flip(uint8* srcData, uint8* dstData, int width, int height, int bpp);
+FREERDP_API uint8* freerdp_icon_convert(uint8* srcData, uint8* dstData, uint8* mask, int width, int height, int bpp, HCLRCONV clrconv);
+FREERDP_API uint8* freerdp_mono_image_convert(uint8* srcData, int width, int height, int srcBpp, int dstBpp, uint32 bgcolor, uint32 fgcolor, HCLRCONV clrconv);
+FREERDP_API void freerdp_alpha_cursor_convert(uint8* alphaData, uint8* xorMask, uint8* andMask, int width, int height, int bpp, HCLRCONV clrconv);
+FREERDP_API void freerdp_image_swap_color_order(uint8* data, int width, int height);
+
+FREERDP_API uint32 freerdp_color_convert_var(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint32 freerdp_color_convert_rgb(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint32 freerdp_color_convert_bgr(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint32 freerdp_color_convert_rgb_bgr(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint32 freerdp_color_convert_bgr_rgb(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint32 freerdp_color_convert_var_rgb(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+FREERDP_API uint32 freerdp_color_convert_var_bgr(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv);
+
+FREERDP_API HCLRCONV freerdp_clrconv_new(uint32 flags);
+FREERDP_API void freerdp_clrconv_free(HCLRCONV clrconv);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __COLOR_H */
diff --git a/include/freerdp/codec/nsc.h b/include/freerdp/codec/nsc.h
new file mode 100644 (file)
index 0000000..73e448a
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * NSCodec Codec
+ *
+ * Copyright 2011 Samsung, Author Jiten Pathy
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NSC_H
+#define __NSC_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BYTESUM(_bs) (_bs[0] + _bs[1] + _bs[2] + _bs[3])
+#define ROUND_UP_TO(_b, _n) (_b + ((~(_b & (_n-1)) + 0x1) & (_n-1)));
+
+/* NSCODEC_BITMAP_STREAM */
+struct _NSC_STREAM
+{
+       uint32 PlaneByteCount[4];
+       uint8 colorLossLevel;
+       uint8 ChromaSubSamplingLevel;
+       uint16 Reserved;
+       STREAM* pdata;
+};
+typedef struct _NSC_STREAM NSC_STREAM;
+
+struct _NSC_CONTEXT
+{
+       uint32 OrgByteCount[4]; /* original byte length of luma, chroma orange, chroma green, alpha variable in order */
+       NSC_STREAM* nsc_stream;
+       uint16 width;
+       uint16 height;
+       uint8* bmpdata;     /* final argb values in little endian order */
+       STREAM* org_buf[4];     /* Decompressed Plane Buffers in the respective order */
+};
+typedef struct _NSC_CONTEXT NSC_CONTEXT;
+
+FREERDP_API NSC_CONTEXT* nsc_context_new(void);
+FREERDP_API void nsc_process_message(NSC_CONTEXT* context, uint8* data, uint32 length);
+FREERDP_API void nsc_context_initialize(NSC_CONTEXT* context, STREAM* s);
+FREERDP_API void nsc_stream_initialize(NSC_CONTEXT* context, STREAM* s);
+FREERDP_API void nsc_rle_decompress_data(NSC_CONTEXT* context);
+FREERDP_API void nsc_ycocg_rgb_convert(NSC_CONTEXT* context);
+FREERDP_API void nsc_rle_decode(STREAM* in, STREAM* out, uint32 origsz);
+FREERDP_API void nsc_chroma_supersample(NSC_CONTEXT* context);
+FREERDP_API void nsc_cl_expand(STREAM* stream, uint8 shiftcount, uint32 origsz);
+FREERDP_API void nsc_colorloss_recover(NSC_CONTEXT* context);
+FREERDP_API void nsc_ycocg_rgb(NSC_CONTEXT* context);
+FREERDP_API void nsc_context_destroy(NSC_CONTEXT* context);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NSC_H */
diff --git a/include/freerdp/codec/rfx.h b/include/freerdp/codec/rfx.h
new file mode 100644 (file)
index 0000000..2d6a0fe
--- /dev/null
@@ -0,0 +1,149 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_H
+#define __RFX_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum _RLGR_MODE
+{
+       RLGR1,
+       RLGR3
+};
+typedef enum _RLGR_MODE RLGR_MODE;
+
+enum _RFX_PIXEL_FORMAT
+{
+       RFX_PIXEL_FORMAT_BGRA,
+       RFX_PIXEL_FORMAT_RGBA,
+       RFX_PIXEL_FORMAT_BGR,
+       RFX_PIXEL_FORMAT_RGB,
+       RFX_PIXEL_FORMAT_BGR565_LE,
+       RFX_PIXEL_FORMAT_RGB565_LE,
+       RFX_PIXEL_FORMAT_PALETTE4_PLANER,
+       RFX_PIXEL_FORMAT_PALETTE8
+};
+typedef enum _RFX_PIXEL_FORMAT RFX_PIXEL_FORMAT;
+
+struct _RFX_RECT
+{
+       uint16 x;
+       uint16 y;
+       uint16 width;
+       uint16 height;
+};
+typedef struct _RFX_RECT RFX_RECT;
+
+struct _RFX_TILE
+{
+       uint16 x;
+       uint16 y;
+       uint8* data;
+};
+typedef struct _RFX_TILE RFX_TILE;
+
+struct _RFX_MESSAGE
+{
+       /**
+        * The rects array represents the updated region of the frame. The UI
+        * requires to clip drawing destination base on the union of the rects.
+        */
+       uint16 num_rects;
+       RFX_RECT* rects;
+
+       /**
+        * The tiles array represents the actual frame data. Each tile is always
+        * 64x64. Note that only pixels inside the updated region (represented as
+        * rects described above) are valid. Pixels outside of the region may
+        * contain arbitrary data.
+        */
+       uint16 num_tiles;
+       RFX_TILE** tiles;
+};
+typedef struct _RFX_MESSAGE RFX_MESSAGE;
+
+typedef struct _RFX_CONTEXT_PRIV RFX_CONTEXT_PRIV;
+
+struct _RFX_CONTEXT
+{
+       uint16 flags;
+       uint16 properties;
+       uint16 width;
+       uint16 height;
+       RLGR_MODE mode;
+       uint32 version;
+       uint32 codec_id;
+       uint32 codec_version;
+       RFX_PIXEL_FORMAT pixel_format;
+       uint8 bits_per_pixel;
+
+       /* color palette allocated by the application */
+       const uint8* palette;
+
+       /* temporary data within a frame */
+       uint32 frame_idx;
+       boolean header_processed;
+       uint8 num_quants;
+       uint32* quants;
+       uint8 quant_idx_y;
+       uint8 quant_idx_cb;
+       uint8 quant_idx_cr;
+
+       /* routines */
+       void (*decode_ycbcr_to_rgb)(sint16* y_r_buf, sint16* cb_g_buf, sint16* cr_b_buf);
+       void (*encode_rgb_to_ycbcr)(sint16* y_r_buf, sint16* cb_g_buf, sint16* cr_b_buf);
+       void (*quantization_decode)(sint16* buffer, const uint32* quantization_values);
+       void (*quantization_encode)(sint16* buffer, const uint32* quantization_values);
+       void (*dwt_2d_decode)(sint16* buffer, sint16* dwt_buffer);
+       void (*dwt_2d_encode)(sint16* buffer, sint16* dwt_buffer);
+
+       /* private definitions */
+       RFX_CONTEXT_PRIV* priv;
+};
+typedef struct _RFX_CONTEXT RFX_CONTEXT;
+
+FREERDP_API RFX_CONTEXT* rfx_context_new(void);
+FREERDP_API void rfx_context_free(RFX_CONTEXT* context);
+FREERDP_API void rfx_context_set_cpu_opt(RFX_CONTEXT* context, uint32 cpu_opt);
+FREERDP_API void rfx_context_set_pixel_format(RFX_CONTEXT* context, RFX_PIXEL_FORMAT pixel_format);
+FREERDP_API void rfx_context_reset(RFX_CONTEXT* context);
+
+FREERDP_API RFX_MESSAGE* rfx_process_message(RFX_CONTEXT* context, uint8* data, uint32 length);
+FREERDP_API uint16 rfx_message_get_tile_count(RFX_MESSAGE* message);
+FREERDP_API RFX_TILE* rfx_message_get_tile(RFX_MESSAGE* message, int index);
+FREERDP_API uint16 rfx_message_get_rect_count(RFX_MESSAGE* message);
+FREERDP_API RFX_RECT* rfx_message_get_rect(RFX_MESSAGE* message, int index);
+FREERDP_API void rfx_message_free(RFX_CONTEXT* context, RFX_MESSAGE* message);
+
+FREERDP_API void rfx_compose_message_header(RFX_CONTEXT* context, STREAM* s);
+FREERDP_API void rfx_compose_message(RFX_CONTEXT* context, STREAM* s,
+       const RFX_RECT* rects, int num_rects, uint8* image_data, int width, int height, int rowstride);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __RFX_H */
diff --git a/include/freerdp/constants.h b/include/freerdp/constants.h
new file mode 100644 (file)
index 0000000..6f48171
--- /dev/null
@@ -0,0 +1,113 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Constants
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_CONSTANTS
+#define __FREERDP_CONSTANTS
+
+/**
+ * Codec IDs
+ */
+enum RDP_CODEC_ID
+{
+       CODEC_ID_NONE = 0x00,
+       CODEC_ID_NSCODEC = 0x01,
+       CODEC_ID_REMOTEFX = 0x03
+};
+
+/**
+ * Static Virtual Channel Flags
+ */
+enum RDP_SVC_CHANNEL_FLAG
+{
+       CHANNEL_FLAG_MIDDLE = 0,
+       CHANNEL_FLAG_FIRST = 0x01,
+       CHANNEL_FLAG_LAST = 0x02,
+       CHANNEL_FLAG_ONLY = (CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST),
+       CHANNEL_FLAG_SHOW_PROTOCOL = 0x10,
+       CHANNEL_FLAG_SUSPEND = 0x20,
+       CHANNEL_FLAG_RESUME = 0x40,
+       CHANNEL_FLAG_FAIL = 0x100
+};
+
+/**
+ * Static Virtual Channel Options
+ */
+enum RDP_SVC_CHANNEL_OPTION
+{
+       CHANNEL_OPTION_SHOW_PROTOCOL = 0x00200000,
+       CHANNEL_OPTION_COMPRESS      = 0x00400000,
+       CHANNEL_OPTION_COMPRESS_RDP  = 0x00800000,
+       CHANNEL_OPTION_PRI_LOW       = 0x02000000,
+       CHANNEL_OPTION_PRI_MED       = 0x04000000,
+       CHANNEL_OPTION_PRI_HIGH      = 0x08000000,
+       CHANNEL_OPTION_ENCRYPT_CS    = 0x10000000,
+       CHANNEL_OPTION_ENCRYPT_SC    = 0x20000000,
+       CHANNEL_OPTION_ENCRYPT_RDP   = 0x40000000,
+       CHANNEL_OPTION_INITIALIZED   = 0x80000000
+};
+
+/**
+ * Static Virtual Channel Events
+ */
+enum RDP_SVC_CHANNEL_EVENT
+{
+       CHANNEL_EVENT_INITIALIZED = 0,
+       CHANNEL_EVENT_CONNECTED = 1,
+       CHANNEL_EVENT_V1_CONNECTED = 2,
+       CHANNEL_EVENT_DISCONNECTED = 3,
+       CHANNEL_EVENT_TERMINATED = 4,
+       CHANNEL_EVENT_DATA_RECEIVED = 10,
+       CHANNEL_EVENT_WRITE_COMPLETE = 11,
+       CHANNEL_EVENT_WRITE_CANCELLED = 12,
+       CHANNEL_EVENT_USER = 1000
+};
+
+/**
+ * Virtual Channel Constants
+ */
+#define CHANNEL_CHUNK_LENGTH 1600
+
+/**
+ * CPU Optimization flags
+ */
+#define CPU_SSE2                       0x1
+
+/**
+ * OSMajorType
+ */
+#define OSMAJORTYPE_UNSPECIFIED                        0x0000
+#define OSMAJORTYPE_WINDOWS                    0x0001
+#define OSMAJORTYPE_OS2                                0x0002
+#define OSMAJORTYPE_MACINTOSH                  0x0003
+#define OSMAJORTYPE_UNIX                       0x0004
+
+/**
+ * OSMinorType
+ */
+#define OSMINORTYPE_UNSPECIFIED                        0x0000
+#define OSMINORTYPE_WINDOWS_31X                        0x0001
+#define OSMINORTYPE_WINDOWS_95                 0x0002
+#define OSMINORTYPE_WINDOWS_NT                 0x0003
+#define OSMINORTYPE_OS2_V21                    0x0004
+#define OSMINORTYPE_POWER_PC                   0x0005
+#define OSMINORTYPE_MACINTOSH                  0x0006
+#define OSMINORTYPE_NATIVE_XSERVER             0x0007
+#define OSMINORTYPE_PSEUDO_XSERVER             0x0008
+
+#endif
diff --git a/include/freerdp/dvc.h b/include/freerdp/dvc.h
new file mode 100644 (file)
index 0000000..dfa487c
--- /dev/null
@@ -0,0 +1,149 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Dynamic Virtual Channel Interface
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * DVC Plugin API: See the original MS DVC Client API:
+ * http://msdn.microsoft.com/en-us/library/bb540880%28v=VS.85%29.aspx
+ *
+ * The FreeRDP DVC Plugin API is a simulation of the MS DVC Client API in C.
+ * The main difference is that every interface method must take an instance
+ * pointer as the first parameter.
+ */
+
+/**
+ * Implemented by DRDYNVC:
+ * o IWTSVirtualChannelManager
+ * o IWTSListener
+ * o IWTSVirtualChannel
+ *
+ * Implemented by DVC plugin:
+ * o IWTSPlugin
+ * o IWTSListenerCallback
+ * o IWTSVirtualChannelCallback
+ *
+ * A basic DVC plugin implementation:
+ * 1. DVCPluginEntry:
+ *    The plugin entry point, which creates and initializes a new IWTSPlugin
+ *    instance
+ * 2. IWTSPlugin.Initialize:
+ *    Call IWTSVirtualChannelManager.CreateListener with a newly created
+ *    IWTSListenerCallback instance
+ * 3. IWTSListenerCallback.OnNewChannelConnection:
+ *    Create IWTSVirtualChannelCallback instance if the new channel is accepted
+ */
+
+#ifndef __FREERDP_DVC_H
+#define __FREERDP_DVC_H
+
+#include <freerdp/types.h>
+
+typedef struct _IWTSVirtualChannelManager IWTSVirtualChannelManager;
+typedef struct _IWTSListener IWTSListener;
+typedef struct _IWTSVirtualChannel IWTSVirtualChannel;
+
+typedef struct _IWTSPlugin IWTSPlugin;
+typedef struct _IWTSListenerCallback IWTSListenerCallback;
+typedef struct _IWTSVirtualChannelCallback IWTSVirtualChannelCallback;
+
+struct _IWTSListener
+{
+       /* Retrieves the listener-specific configuration. */
+       int (*GetConfiguration) (IWTSListener* pListener,
+               void** ppPropertyBag);
+};
+
+struct _IWTSVirtualChannel
+{
+       /* Starts a write request on the channel. */
+       int (*Write) (IWTSVirtualChannel* pChannel,
+               uint32 cbSize,
+               uint8* pBuffer,
+               void* pReserved);
+       /* Closes the channel. */
+       int (*Close) (IWTSVirtualChannel* pChannel);
+};
+
+struct _IWTSVirtualChannelManager
+{
+       /* Returns an instance of a listener object that listens on a specific
+          endpoint, or creates a static channel. */
+       int (*CreateListener) (IWTSVirtualChannelManager* pChannelMgr,
+               const char* pszChannelName,
+               uint32 ulFlags,
+               IWTSListenerCallback* pListenerCallback,
+               IWTSListener** ppListener);
+       /* Push a virtual channel event.
+          This is a FreeRDP extension to standard MS API. */
+       int (*PushEvent) (IWTSVirtualChannelManager* pChannelMgr,
+               RDP_EVENT* pEvent);
+};
+
+struct _IWTSPlugin
+{
+       /* Used for the first call that is made from the client to the plug-in. */
+       int (*Initialize) (IWTSPlugin* pPlugin,
+               IWTSVirtualChannelManager* pChannelMgr);
+       /* Notifies the plug-in that the Remote Desktop Connection (RDC) client
+          has successfully connected to the Remote Desktop Session Host (RD
+          Session Host) server. */
+       int (*Connected) (IWTSPlugin* pPlugin);
+       /* Notifies the plug-in that the Remote Desktop Connection (RDC) client
+          has disconnected from the RD Session Host server. */
+       int (*Disconnected) (IWTSPlugin* pPlugin,
+               uint32 dwDisconnectCode);
+       /* Notifies the plug-in that the Remote Desktop Connection (RDC) client
+          has terminated. */
+       int (*Terminated) (IWTSPlugin* pPlugin);
+};
+
+struct _IWTSListenerCallback
+{
+       /* Accepts or denies a connection request for an incoming connection to
+          the associated listener. */
+       int (*OnNewChannelConnection) (IWTSListenerCallback* pListenerCallback,
+               IWTSVirtualChannel* pChannel,
+               uint8* Data,
+               int* pbAccept,
+               IWTSVirtualChannelCallback** ppCallback);
+};
+
+struct _IWTSVirtualChannelCallback
+{
+       /* Notifies the user about data that is being received. */
+       int (*OnDataReceived) (IWTSVirtualChannelCallback* pChannelCallback,
+               uint32 cbSize,
+               uint8* pBuffer);
+       /* Notifies the user that the channel has been closed. */
+       int (*OnClose) (IWTSVirtualChannelCallback* pChannelCallback);
+};
+
+/* The DVC Plugin entry points */
+typedef struct _IDRDYNVC_ENTRY_POINTS IDRDYNVC_ENTRY_POINTS;
+struct _IDRDYNVC_ENTRY_POINTS
+{
+       int (*RegisterPlugin) (IDRDYNVC_ENTRY_POINTS* pEntryPoints,
+               const char* name, IWTSPlugin* pPlugin);
+       IWTSPlugin* (*GetPlugin) (IDRDYNVC_ENTRY_POINTS* pEntryPoints,
+               const char* name);
+       RDP_PLUGIN_DATA* (*GetPluginData) (IDRDYNVC_ENTRY_POINTS* pEntryPoints);
+};
+
+typedef int (*PDVC_PLUGIN_ENTRY) (IDRDYNVC_ENTRY_POINTS*);
+
+#endif
diff --git a/include/freerdp/extension.h b/include/freerdp/extension.h
new file mode 100644 (file)
index 0000000..17c8456
--- /dev/null
@@ -0,0 +1,59 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Extensions
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDP_EXTENSION_H
+#define __RDP_EXTENSION_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/freerdp.h>
+
+#define FREERDP_EXT_EXPORT_FUNC_NAME   "FreeRDPExtensionEntry"
+
+typedef struct rdp_ext_plugin rdpExtPlugin;
+
+struct rdp_ext_plugin
+{
+       void* ext;
+       int (*init) (rdpExtPlugin* plugin, freerdp* instance);
+       int (*uninit) (rdpExtPlugin* plugin, freerdp* instance);
+};
+
+typedef uint32 (FREERDP_CC* PFREERDP_EXTENSION_HOOK)(rdpExtPlugin* plugin, freerdp* instance);
+
+typedef uint32 (FREERDP_CC* PREGISTEREXTENSION)(rdpExtPlugin* plugin);
+typedef uint32 (FREERDP_CC* PREGISTERPRECONNECTHOOK)(rdpExtPlugin* plugin, PFREERDP_EXTENSION_HOOK hook);
+typedef uint32 (FREERDP_CC* PREGISTERPOSTCONNECTHOOK)(rdpExtPlugin* plugin, PFREERDP_EXTENSION_HOOK hook);
+
+struct _FREERDP_EXTENSION_ENTRY_POINTS
+{
+       void* ext; /* Reference to internal instance */
+       PREGISTEREXTENSION pRegisterExtension;
+       PREGISTERPRECONNECTHOOK pRegisterPreConnectHook;
+       PREGISTERPOSTCONNECTHOOK pRegisterPostConnectHook;
+       void* data;
+};
+
+typedef struct _FREERDP_EXTENSION_ENTRY_POINTS FREERDP_EXTENSION_ENTRY_POINTS;
+typedef FREERDP_EXTENSION_ENTRY_POINTS* PFREERDP_EXTENSION_ENTRY_POINTS;
+
+typedef int (FREERDP_CC* PFREERDP_EXTENSION_ENTRY)(PFREERDP_EXTENSION_ENTRY_POINTS pEntryPoints);
+
+#endif /* __RDP_EXTENSION_H */
+
diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h
new file mode 100644 (file)
index 0000000..dd993c4
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Interface
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_H
+#define __FREERDP_H
+
+typedef struct rdp_rdp rdpRdp;
+typedef struct rdp_gdi rdpGdi;
+typedef struct rdp_rail rdpRail;
+typedef struct rdp_cache rdpCache;
+typedef struct rdp_channels rdpChannels;
+typedef struct rdp_graphics rdpGraphics;
+
+typedef struct rdp_freerdp freerdp;
+typedef struct rdp_context rdpContext;
+typedef struct rdp_freerdp_peer freerdp_peer;
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/extension.h>
+
+#include <freerdp/input.h>
+#include <freerdp/update.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*pContextNew)(freerdp* instance, rdpContext* context);
+typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
+
+typedef boolean (*pPreConnect)(freerdp* instance);
+typedef boolean (*pPostConnect)(freerdp* instance);
+typedef boolean (*pAuthenticate)(freerdp* instance, char** username, char** password, char** domain);
+typedef boolean (*pVerifyCertificate)(freerdp* instance, char* subject, char* issuer, char* fingerprint);
+
+typedef int (*pSendChannelData)(freerdp* instance, int channelId, uint8* data, int size);
+typedef int (*pReceiveChannelData)(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size);
+
+struct rdp_context
+{
+       freerdp* instance; /* 0 */
+       freerdp_peer* peer; /* 1 */
+       uint32 paddingA[16 - 2]; /* 2 */
+
+       int argc; /* 16 */
+       char** argv; /* 17 */
+       uint32 paddingB[32 - 18]; /* 18 */
+
+       rdpRdp* rdp; /* 32 */
+       rdpGdi* gdi; /* 33 */
+       rdpRail* rail; /* 34 */
+       rdpCache* cache; /* 35 */
+       rdpChannels* channels; /* 36 */
+       rdpGraphics* graphics; /* 37 */
+       uint32 paddingC[64 - 38]; /* 38 */
+};
+
+struct rdp_freerdp
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       rdpInput* input; /* 16 */
+       rdpUpdate* update; /* 17 */
+       rdpSettings* settings; /* 18 */
+       uint32 paddingB[32 - 19]; /* 19 */
+
+       size_t context_size; /* 32 */
+       pContextNew ContextNew; /* 33 */
+       pContextFree ContextFree; /* 34 */
+       uint32 paddingC[48 - 35]; /* 35 */
+
+       pPreConnect PreConnect; /* 48 */
+       pPostConnect PostConnect; /* 49 */
+       pAuthenticate Authenticate; /* 50 */
+       pVerifyCertificate VerifyCertificate; /* 51 */
+       uint32 paddingD[64 - 52]; /* 52 */
+
+       pSendChannelData SendChannelData; /* 64 */
+       pReceiveChannelData ReceiveChannelData; /* 65 */
+       uint32 paddingE[80 - 66]; /* 66 */
+};
+
+FREERDP_API void freerdp_context_new(freerdp* instance);
+FREERDP_API void freerdp_context_free(freerdp* instance);
+
+FREERDP_API boolean freerdp_connect(freerdp* instance);
+FREERDP_API boolean freerdp_shall_disconnect(freerdp* instance);
+FREERDP_API boolean freerdp_disconnect(freerdp* instance);
+
+FREERDP_API boolean freerdp_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount);
+FREERDP_API boolean freerdp_check_fds(freerdp* instance);
+
+FREERDP_API void freerdp_send_keep_alive(freerdp* instance);
+FREERDP_API uint32 freerdp_error_info(freerdp* instance);
+
+FREERDP_API void freerdp_get_version(int* major, int* minor, int* revision);
+
+FREERDP_API freerdp* freerdp_new();
+FREERDP_API void freerdp_free(freerdp* instance);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/freerdp/gdi/16bpp.h b/include/freerdp/gdi/16bpp.h
new file mode 100644 (file)
index 0000000..5e0b767
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI 16bpp Internal Buffer Routines
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+typedef int (*pLineTo_16bpp)(HGDI_DC hdc, int nXEnd, int nYEnd);
+
+FREERDP_API uint16 gdi_get_color_16bpp(HGDI_DC hdc, GDI_COLOR color);
+
+FREERDP_API int FillRect_16bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr);
+FREERDP_API int BitBlt_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop);
+FREERDP_API int PatBlt_16bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop);
+FREERDP_API int LineTo_16bpp(HGDI_DC hdc, int nXEnd, int nYEnd);
diff --git a/include/freerdp/gdi/32bpp.h b/include/freerdp/gdi/32bpp.h
new file mode 100644 (file)
index 0000000..a843b61
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI 32bpp Internal Buffer Routines
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+typedef int (*pLineTo_32bpp)(HGDI_DC hdc, int nXEnd, int nYEnd);
+
+FREERDP_API uint32 gdi_get_color_32bpp(HGDI_DC hdc, GDI_COLOR color);
+
+FREERDP_API int FillRect_32bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr);
+FREERDP_API int BitBlt_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop);
+FREERDP_API int PatBlt_32bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop);
+FREERDP_API int LineTo_32bpp(HGDI_DC hdc, int nXEnd, int nYEnd);
diff --git a/include/freerdp/gdi/8bpp.h b/include/freerdp/gdi/8bpp.h
new file mode 100644 (file)
index 0000000..cd944dc
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI 8bpp Internal Buffer Routines
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+typedef int (*pLineTo_8bpp)(HGDI_DC hdc, int nXEnd, int nYEnd);
+
+FREERDP_API uint8 gdi_get_color_8bpp(HGDI_DC hdc, GDI_COLOR color);
+
+FREERDP_API int FillRect_8bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr);
+FREERDP_API int BitBlt_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop);
+FREERDP_API int PatBlt_8bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop);
+FREERDP_API int LineTo_8bpp(HGDI_DC hdc, int nXEnd, int nYEnd);
diff --git a/include/freerdp/gdi/bitmap.h b/include/freerdp/gdi/bitmap.h
new file mode 100644 (file)
index 0000000..75a9dee
--- /dev/null
@@ -0,0 +1,43 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Bitmap Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_BITMAP_H
+#define __GDI_BITMAP_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API GDI_COLOR gdi_GetPixel(HGDI_DC hdc, int nXPos, int nYPos);
+FREERDP_API GDI_COLOR gdi_SetPixel(HGDI_DC hdc, int X, int Y, GDI_COLOR crColor);
+FREERDP_API uint8 gdi_GetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y);
+FREERDP_API uint16 gdi_GetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y);
+FREERDP_API uint32 gdi_GetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y);
+FREERDP_API uint8* gdi_GetPointer_8bpp(HGDI_BITMAP hBmp, int X, int Y);
+FREERDP_API uint16* gdi_GetPointer_16bpp(HGDI_BITMAP hBmp, int X, int Y);
+FREERDP_API uint32* gdi_GetPointer_32bpp(HGDI_BITMAP hBmp, int X, int Y);
+FREERDP_API void gdi_SetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y, uint8 pixel);
+FREERDP_API void gdi_SetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y, uint16 pixel);
+FREERDP_API void gdi_SetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y, uint32 pixel);
+FREERDP_API HGDI_BITMAP gdi_CreateBitmap(int nWidth, int nHeight, int cBitsPerPixel, uint8* data);
+FREERDP_API HGDI_BITMAP gdi_CreateCompatibleBitmap(HGDI_DC hdc, int nWidth, int nHeight);
+FREERDP_API int gdi_BitBlt(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop);
+
+typedef int (*p_BitBlt)(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop);
+
+#endif /* __GDI_BITMAP_H */
diff --git a/include/freerdp/gdi/brush.h b/include/freerdp/gdi/brush.h
new file mode 100644 (file)
index 0000000..5055059
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Brush Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_BRUSH_H
+#define __GDI_BRUSH_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API HGDI_BRUSH gdi_CreateSolidBrush(GDI_COLOR crColor);
+FREERDP_API HGDI_BRUSH gdi_CreatePatternBrush(HGDI_BITMAP hbmp);
+FREERDP_API int gdi_PatBlt(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop);
+
+typedef int (*p_PatBlt)(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop);
+
+#endif /* __GDI_BRUSH_H */
diff --git a/include/freerdp/gdi/clipping.h b/include/freerdp/gdi/clipping.h
new file mode 100644 (file)
index 0000000..88fede0
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Clipping Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_CLIPPING_H
+#define __GDI_CLIPPING_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API int gdi_SetClipRgn(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight);
+FREERDP_API HGDI_RGN gdi_GetClipRgn(HGDI_DC hdc);
+FREERDP_API int gdi_SetNullClipRgn(HGDI_DC hdc);
+FREERDP_API int gdi_ClipCoords(HGDI_DC hdc, int *x, int *y, int *w, int *h, int *srcx, int *srcy);
+
+#endif /* __GDI_CLIPPING_H */
diff --git a/include/freerdp/gdi/dc.h b/include/freerdp/gdi/dc.h
new file mode 100644 (file)
index 0000000..83fa115
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Device Context Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_DC_H
+#define __GDI_DC_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API HGDI_DC gdi_GetDC();
+FREERDP_API HGDI_DC gdi_CreateDC(HCLRCONV clrconv, int bpp);
+FREERDP_API HGDI_DC gdi_CreateCompatibleDC(HGDI_DC hdc);
+FREERDP_API HGDIOBJECT gdi_SelectObject(HGDI_DC hdc, HGDIOBJECT hgdiobject);
+FREERDP_API int gdi_DeleteObject(HGDIOBJECT hgdiobject);
+FREERDP_API int gdi_DeleteDC(HGDI_DC hdc);
+
+#endif /* __GDI_DC_H */
diff --git a/include/freerdp/gdi/drawing.h b/include/freerdp/gdi/drawing.h
new file mode 100644 (file)
index 0000000..7447450
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Drawing Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_DRAWING_H
+#define __GDI_DRAWING_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API int gdi_GetROP2(HGDI_DC hdc);
+FREERDP_API int gdi_SetROP2(HGDI_DC hdc, int fnDrawMode);
+FREERDP_API GDI_COLOR gdi_GetBkColor(HGDI_DC hdc);
+FREERDP_API GDI_COLOR gdi_SetBkColor(HGDI_DC hdc, GDI_COLOR crColor);
+FREERDP_API int gdi_GetBkMode(HGDI_DC hdc);
+FREERDP_API int gdi_SetBkMode(HGDI_DC hdc, int iBkMode);
+FREERDP_API GDI_COLOR gdi_SetTextColor(HGDI_DC hdc, GDI_COLOR crColor);
+
+#endif /* __GDI_DRAWING_H */
diff --git a/include/freerdp/gdi/gdi.h b/include/freerdp/gdi/gdi.h
new file mode 100644 (file)
index 0000000..feab649
--- /dev/null
@@ -0,0 +1,283 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Library
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_H
+#define __GDI_H
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/cache/cache.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/codec/color.h>
+
+/* For more information, see [MS-RDPEGDI] */
+
+/* Binary Raster Operations (ROP2) */
+#define GDI_R2_BLACK                   0x01  /* D = 0 */
+#define GDI_R2_NOTMERGEPEN             0x02  /* D = ~(D | P) */
+#define GDI_R2_MASKNOTPEN              0x03  /* D = D & ~P */
+#define GDI_R2_NOTCOPYPEN              0x04  /* D = ~P */
+#define GDI_R2_MASKPENNOT              0x05  /* D = P & ~D */
+#define GDI_R2_NOT                     0x06  /* D = ~D */
+#define GDI_R2_XORPEN                  0x07  /* D = D ^ P */
+#define GDI_R2_NOTMASKPEN              0x08  /* D = ~(D & P) */
+#define GDI_R2_MASKPEN                 0x09  /* D = D & P */
+#define GDI_R2_NOTXORPEN               0x0A  /* D = ~(D ^ P) */
+#define GDI_R2_NOP                     0x0B  /* D = D */
+#define GDI_R2_MERGENOTPEN             0x0C  /* D = D | ~P */
+#define GDI_R2_COPYPEN                 0x0D  /* D = P */
+#define GDI_R2_MERGEPENNOT             0x0E  /* D = P | ~D */
+#define GDI_R2_MERGEPEN                        0x0F  /* D = P | D */
+#define GDI_R2_WHITE                   0x10  /* D = 1 */
+
+/* Ternary Raster Operations (ROP3) */
+#define GDI_SRCCOPY                    0x00CC0020 /* D = S */
+#define GDI_SRCPAINT                   0x00EE0086 /* D = S | D */
+#define GDI_SRCAND                     0x008800C6 /* D = S & D */
+#define GDI_SRCINVERT                  0x00660046 /* D = S ^ D */
+#define GDI_SRCERASE                   0x00440328 /* D = S & ~D */
+#define GDI_NOTSRCCOPY                 0x00330008 /* D = ~S */
+#define GDI_NOTSRCERASE                        0x001100A6 /* D = ~S & ~D */
+#define GDI_MERGECOPY                  0x00C000CA /* D = S & P */
+#define GDI_MERGEPAINT                 0x00BB0226 /* D = ~S | D */
+#define GDI_PATCOPY                    0x00F00021 /* D = P */
+#define GDI_PATPAINT                   0x00FB0A09 /* D = D | (P | ~S) */
+#define GDI_PATINVERT                  0x005A0049 /* D = P ^ D */
+#define GDI_DSTINVERT                  0x00550009 /* D = ~D */
+#define GDI_BLACKNESS                  0x00000042 /* D = 0 */
+#define GDI_WHITENESS                  0x00FF0062 /* D = 1 */
+#define GDI_DSPDxax                    0x00E20746 /* D = (S & P) | (~S & D) */
+#define GDI_SPna                       0x000C0324 /* D = S & ~P */
+#define GDI_DSna                       0x00220326 /* D = D & ~S */
+#define GDI_PDxn                       0x00A50065 /* D = D ^ ~P */
+
+/* Brush Styles */
+#define GDI_BS_SOLID                   0x00
+#define GDI_BS_NULL                    0x01
+#define GDI_BS_HATCHED                 0x02
+#define GDI_BS_PATTERN                 0x03
+
+/* Hatch Patterns */
+#define GDI_HS_HORIZONTAL              0x00
+#define GDI_HS_VERTICAL                        0x01
+#define GDI_HS_FDIAGONAL               0x02
+#define GDI_HS_BDIAGONAL               0x03
+#define GDI_HS_CROSS                   0x04
+#define GDI_HS_DIAGCROSS               0x05
+
+/* Pen Styles */
+#define GDI_PS_SOLID                   0x00
+#define GDI_PS_DASH                    0x01
+#define GDI_PS_NULL                    0x05
+
+/* Background Modes */
+#define GDI_OPAQUE                     0x00000001
+#define GDI_TRANSPARENT                        0x00000002
+
+/* GDI Object Types */
+#define GDIOBJECT_BITMAP               0x00
+#define GDIOBJECT_PEN                  0x01
+#define GDIOBJECT_PALETTE              0x02
+#define GDIOBJECT_BRUSH                        0x03
+#define GDIOBJECT_RECT                 0x04
+#define GDIOBJECT_REGION               0x04
+
+struct _GDIOBJECT
+{
+       uint8 objectType;
+};
+typedef struct _GDIOBJECT GDIOBJECT;
+typedef GDIOBJECT* HGDIOBJECT;
+
+/* RGB encoded as 0x00BBGGRR */
+typedef unsigned int GDI_COLOR;
+typedef GDI_COLOR* LPGDI_COLOR;
+
+struct _GDI_RECT
+{
+       uint8 objectType;
+       int left;
+       int top;
+       int right;
+       int bottom;
+};
+typedef struct _GDI_RECT GDI_RECT;
+typedef GDI_RECT* HGDI_RECT;
+
+struct _GDI_RGN
+{
+       uint8 objectType;
+       int x; /* left */
+       int y; /* top */
+       int w; /* width */
+       int h; /* height */
+       int null; /* null region */
+};
+typedef struct _GDI_RGN GDI_RGN;
+typedef GDI_RGN* HGDI_RGN;
+
+struct _GDI_BITMAP
+{
+       uint8 objectType;
+       int bytesPerPixel;
+       int bitsPerPixel;
+       int width;
+       int height;
+       int scanline;
+       uint8* data;
+};
+typedef struct _GDI_BITMAP GDI_BITMAP;
+typedef GDI_BITMAP* HGDI_BITMAP;
+
+struct _GDI_PEN
+{
+       uint8 objectType;
+       int style;
+       int width;
+       int posX;
+       int posY;
+       GDI_COLOR color;
+};
+typedef struct _GDI_PEN GDI_PEN;
+typedef GDI_PEN* HGDI_PEN;
+
+struct _GDI_PALETTEENTRY
+{
+       uint8 red;
+       uint8 green;
+       uint8 blue;
+};
+typedef struct _GDI_PALETTEENTRY GDI_PALETTEENTRY;
+
+struct _GDI_PALETTE
+{
+       uint16 count;
+       GDI_PALETTEENTRY *entries;
+};
+typedef struct _GDI_PALETTE GDI_PALETTE;
+typedef GDI_PALETTE* HGDI_PALETTE;
+
+struct _GDI_POINT
+{
+       int x;
+       int y;
+};
+typedef struct _GDI_POINT GDI_POINT;
+typedef GDI_POINT* HGDI_POINT;
+
+struct _GDI_BRUSH
+{
+       uint8 objectType;
+       int style;
+       HGDI_BITMAP pattern;
+       GDI_COLOR color;
+};
+typedef struct _GDI_BRUSH GDI_BRUSH;
+typedef GDI_BRUSH* HGDI_BRUSH;
+
+struct _GDI_WND
+{
+       int count;
+       int ninvalid;
+       HGDI_RGN invalid;
+       HGDI_RGN cinvalid;
+};
+typedef struct _GDI_WND GDI_WND;
+typedef GDI_WND* HGDI_WND;
+
+struct _GDI_DC
+{
+       HGDIOBJECT selectedObject;
+       int bytesPerPixel;
+       int bitsPerPixel;
+       GDI_COLOR bkColor;
+       GDI_COLOR textColor;
+       HGDI_BRUSH brush;
+       HGDI_RGN clip;
+       HGDI_PEN pen;
+       HGDI_WND hwnd;
+       int drawMode;
+       int bkMode;
+       int alpha;
+       int invert;
+       int rgb555;
+};
+typedef struct _GDI_DC GDI_DC;
+typedef GDI_DC* HGDI_DC;
+
+struct gdi_bitmap
+{
+       rdpBitmap _p;
+
+       HGDI_DC hdc;
+       HGDI_BITMAP bitmap;
+       HGDI_BITMAP org_bitmap;
+};
+typedef struct gdi_bitmap gdiBitmap;
+
+struct gdi_glyph
+{
+       rdpBitmap _p;
+
+       HGDI_DC hdc;
+       HGDI_BITMAP bitmap;
+       HGDI_BITMAP org_bitmap;
+};
+typedef struct gdi_glyph gdiGlyph;
+
+struct rdp_gdi
+{
+       rdpContext* context;
+
+       int width;
+       int height;
+       int dstBpp;
+       int srcBpp;
+       int cursor_x;
+       int cursor_y;
+       int bytesPerPixel;
+
+       HGDI_DC hdc;
+       HCLRCONV clrconv;
+       gdiBitmap* primary;
+       gdiBitmap* drawing;
+       uint8* primary_buffer;
+       GDI_COLOR textColor;
+       void* rfx_context;
+       void* nsc_context;
+       gdiBitmap* tile;
+       gdiBitmap* image;
+};
+
+FREERDP_API uint32 gdi_rop3_code(uint8 code);
+FREERDP_API uint8* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y);
+FREERDP_API uint8* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y);
+FREERDP_API int gdi_is_mono_pixel_set(uint8* data, int x, int y, int width);
+FREERDP_API void gdi_resize(rdpGdi* gdi, int width, int height);
+
+FREERDP_API int gdi_init(freerdp* instance, uint32 flags, uint8* buffer);
+FREERDP_API void gdi_free(freerdp* instance);
+
+#ifdef WITH_DEBUG_GDI
+#define DEBUG_GDI(fmt, ...) DEBUG_CLASS(GDI, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_GDI(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __GDI_H */
diff --git a/include/freerdp/gdi/line.h b/include/freerdp/gdi/line.h
new file mode 100644 (file)
index 0000000..35a19fa
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Line Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_LINE_H
+#define __GDI_LINE_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API int gdi_LineTo(HGDI_DC hdc, int nXEnd, int nYEnd);
+FREERDP_API int gdi_PolylineTo(HGDI_DC hdc, GDI_POINT *lppt, int cCount);
+FREERDP_API int gdi_Polyline(HGDI_DC hdc, GDI_POINT *lppt, int cPoints);
+FREERDP_API int gdi_PolyPolyline(HGDI_DC hdc, GDI_POINT *lppt, int *lpdwPolyPoints, int cCount);
+FREERDP_API int gdi_MoveToEx(HGDI_DC hdc, int X, int Y, HGDI_POINT lpPoint);
+
+typedef int (*p_LineTo)(HGDI_DC hdc, int nXEnd, int nYEnd);
+
+#endif /* __GDI_LINE_H */
diff --git a/include/freerdp/gdi/palette.h b/include/freerdp/gdi/palette.h
new file mode 100644 (file)
index 0000000..d07a8d0
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Palette Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_PALETTE_H
+#define __GDI_PALETTE_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API HGDI_PALETTE gdi_CreatePalette(HGDI_PALETTE palette);
+FREERDP_API HGDI_PALETTE gdi_GetSystemPalette();
+
+#endif /* __GDI_PALETTE_H */
diff --git a/include/freerdp/gdi/pen.h b/include/freerdp/gdi/pen.h
new file mode 100644 (file)
index 0000000..c347734
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Pen Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_PEN_H
+#define __GDI_PEN_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API HGDI_PEN gdi_CreatePen(int fnPenStyle, int nWidth, int crColor);
+FREERDP_API uint8 gdi_GetPenColor_8bpp(HGDI_PEN pen);
+FREERDP_API uint16 gdi_GetPenColor_16bpp(HGDI_PEN pen);
+FREERDP_API uint32 gdi_GetPenColor_32bpp(HGDI_PEN pen);
+
+#endif /* __GDI_PEN_H */
diff --git a/include/freerdp/gdi/region.h b/include/freerdp/gdi/region.h
new file mode 100644 (file)
index 0000000..09b2129
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Region Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_REGION_H
+#define __GDI_REGION_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API HGDI_RGN gdi_CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
+FREERDP_API HGDI_RECT gdi_CreateRect(int xLeft, int yTop, int xRight, int yBottom);
+FREERDP_API void gdi_RectToRgn(HGDI_RECT rect, HGDI_RGN rgn);
+FREERDP_API void gdi_CRectToRgn(int left, int top, int right, int bottom, HGDI_RGN rgn);
+FREERDP_API void gdi_RectToCRgn(HGDI_RECT rect, int *x, int *y, int *w, int *h);
+FREERDP_API void gdi_CRectToCRgn(int left, int top, int right, int bottom, int *x, int *y, int *w, int *h);
+FREERDP_API void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect);
+FREERDP_API void gdi_CRgnToRect(int x, int y, int w, int h, HGDI_RECT rect);
+FREERDP_API void gdi_RgnToCRect(HGDI_RGN rgn, int *left, int *top, int *right, int *bottom);
+FREERDP_API void gdi_CRgnToCRect(int x, int y, int w, int h, int *left, int *top, int *right, int *bottom);
+FREERDP_API int gdi_CopyOverlap(int x, int y, int width, int height, int srcx, int srcy);
+FREERDP_API int gdi_SetRect(HGDI_RECT rc, int xLeft, int yTop, int xRight, int yBottom);
+FREERDP_API int gdi_SetRgn(HGDI_RGN hRgn, int nXLeft, int nYLeft, int nWidth, int nHeight);
+FREERDP_API int gdi_SetRectRgn(HGDI_RGN hRgn, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
+FREERDP_API int gdi_EqualRgn(HGDI_RGN hSrcRgn1, HGDI_RGN hSrcRgn2);
+FREERDP_API int gdi_CopyRect(HGDI_RECT dst, HGDI_RECT src);
+FREERDP_API int gdi_PtInRect(HGDI_RECT rc, int x, int y);
+FREERDP_API int gdi_InvalidateRegion(HGDI_DC hdc, int x, int y, int w, int h);
+
+#endif /* __GDI_REGION_H */
diff --git a/include/freerdp/gdi/shape.h b/include/freerdp/gdi/shape.h
new file mode 100644 (file)
index 0000000..4ec28e6
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Shape Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_SHAPE_H
+#define __GDI_SHAPE_H
+
+#include <freerdp/api.h>
+#include <freerdp/gdi/gdi.h>
+
+FREERDP_API int gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
+FREERDP_API int gdi_FillRect(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr);
+FREERDP_API int gdi_Polygon(HGDI_DC hdc, GDI_POINT *lpPoints, int nCount);
+FREERDP_API int gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT *lpPoints, int *lpPolyCounts, int nCount);
+FREERDP_API int gdi_Rectangle(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
+
+typedef int (*p_FillRect)(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr);
+
+#endif /* __GDI_SHAPE_H */
diff --git a/include/freerdp/graphics.h b/include/freerdp/graphics.h
new file mode 100644 (file)
index 0000000..ab6c0e8
--- /dev/null
@@ -0,0 +1,162 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GRAPHICS_H
+#define __GRAPHICS_H
+
+typedef struct rdp_bitmap rdpBitmap;
+typedef struct rdp_pointer rdpPointer;
+typedef struct rdp_glyph rdpGlyph;
+
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/freerdp.h>
+
+/* Bitmap Class */
+
+typedef void (*pBitmap_New)(rdpContext* context, rdpBitmap* bitmap);
+typedef void (*pBitmap_Free)(rdpContext* context, rdpBitmap* bitmap);
+typedef void (*pBitmap_Paint)(rdpContext* context, rdpBitmap* bitmap);
+typedef void (*pBitmap_Decompress)(rdpContext* context, rdpBitmap* bitmap,
+               uint8* data, int width, int height, int bpp, int length, boolean compressed);
+typedef void (*pBitmap_SetSurface)(rdpContext* context, rdpBitmap* bitmap, boolean primary);
+
+struct rdp_bitmap
+{
+       size_t size; /* 0 */
+       pBitmap_New New; /* 1 */
+       pBitmap_Free Free; /* 2 */
+       pBitmap_Paint Paint; /* 3 */
+       pBitmap_Decompress Decompress; /* 4 */
+       pBitmap_SetSurface SetSurface; /* 5 */
+       uint32 paddingA[16 - 6];  /* 6 */
+
+       uint32 left; /* 16 */
+       uint32 top; /* 17 */
+       uint32 right; /* 18 */
+       uint32 bottom; /* 19 */
+       uint32 width; /* 20 */
+       uint32 height; /* 21 */
+       uint32 bpp; /* 22 */
+       uint32 flags; /* 23 */
+       uint32 length; /* 24 */
+       uint8* data; /* 25 */
+       uint32 paddingB[32 - 26]; /* 26 */
+
+       boolean compressed; /* 32 */
+       boolean ephemeral; /* 33 */
+       uint32 paddingC[64 - 34]; /* 34 */
+};
+
+FREERDP_API rdpBitmap* Bitmap_Alloc(rdpContext* context);
+FREERDP_API void Bitmap_New(rdpContext* context, rdpBitmap* bitmap);
+FREERDP_API void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap);
+FREERDP_API void Bitmap_Register(rdpContext* context, rdpBitmap* bitmap);
+FREERDP_API void Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
+               uint8* data, int width, int height, int bpp, int length, boolean compressed);
+FREERDP_API void Bitmap_SetRectangle(rdpContext* context, rdpBitmap* bitmap,
+               uint16 left, uint16 top, uint16 right, uint16 bottom);
+FREERDP_API void Bitmap_SetDimensions(rdpContext* context, rdpBitmap* bitmap, uint16 width, uint16 height);
+FREERDP_API void Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary);
+
+/* Pointer Class */
+
+typedef void (*pPointer_New)(rdpContext* context, rdpPointer* pointer);
+typedef void (*pPointer_Free)(rdpContext* context, rdpPointer* pointer);
+typedef void (*pPointer_Set)(rdpContext* context, rdpPointer* pointer);
+
+struct rdp_pointer
+{
+       size_t size; /* 0 */
+       pPointer_New New; /* 1 */
+       pPointer_Free Free; /* 2 */
+       pPointer_Set Set; /* 3 */
+       uint32 paddingA[16 - 4]; /* 4 */
+
+       uint32 xPos; /* 16 */
+       uint32 yPos; /* 17 */
+       uint32 width; /* 18 */
+       uint32 height; /* 19 */
+       uint32 xorBpp; /* 20 */
+       uint32 lengthAndMask; /* 21 */
+       uint32 lengthXorMask; /* 22 */
+       uint8* xorMaskData; /* 23 */
+       uint8* andMaskData; /* 24 */
+       uint32 paddingB[32 - 25]; /* 25 */
+};
+
+FREERDP_API rdpPointer* Pointer_Alloc(rdpContext* context);
+FREERDP_API void Pointer_New(rdpContext* context, rdpPointer* pointer);
+FREERDP_API void Pointer_Free(rdpContext* context, rdpPointer* pointer);
+FREERDP_API void Pointer_Set(rdpContext* context, rdpPointer* pointer);
+
+/* Glyph Class */
+
+typedef void (*pGlyph_New)(rdpContext* context, rdpGlyph* glyph);
+typedef void (*pGlyph_Free)(rdpContext* context, rdpGlyph* glyph);
+typedef void (*pGlyph_Draw)(rdpContext* context, rdpGlyph* glyph, int x, int y);
+typedef void (*pGlyph_BeginDraw)(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
+typedef void (*pGlyph_EndDraw)(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
+
+struct rdp_glyph
+{
+       size_t size; /* 0 */
+       pGlyph_New New; /* 1 */
+       pGlyph_Free Free; /* 2 */
+       pGlyph_Draw Draw; /* 3 */
+       pGlyph_BeginDraw BeginDraw; /* 4 */
+       pGlyph_EndDraw EndDraw; /* 5 */
+       uint32 paddingA[16 - 6]; /* 6 */
+
+       sint32 x; /* 16 */
+       sint32 y; /* 17 */
+       uint32 cx; /* 18 */
+       uint32 cy; /* 19 */
+       uint32 cb; /* 20 */
+       uint8* aj; /* 21 */
+       uint32 paddingB[32 - 22]; /* 22 */
+};
+
+FREERDP_API rdpGlyph* Glyph_Alloc(rdpContext* context);
+FREERDP_API void Glyph_New(rdpContext* context, rdpGlyph* glyph);
+FREERDP_API void Glyph_Free(rdpContext* context, rdpGlyph* glyph);
+FREERDP_API void Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y);
+FREERDP_API void Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
+FREERDP_API void Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor);
+
+/* Graphics Module */
+
+struct rdp_graphics
+{
+       rdpContext* context; /* 0 */
+       rdpBitmap* Bitmap_Prototype; /* 1 */
+       rdpPointer* Pointer_Prototype; /* 2 */
+       rdpGlyph* Glyph_Prototype; /* 3 */
+       uint32 paddingA[16 - 4]; /* 4 */
+};
+
+FREERDP_API void graphics_register_bitmap(rdpGraphics* graphics, rdpBitmap* bitmap);
+FREERDP_API void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer);
+FREERDP_API void graphics_register_glyph(rdpGraphics* graphics, rdpGlyph* glyph);
+
+FREERDP_API rdpGraphics* graphics_new(rdpContext* context);
+FREERDP_API void graphics_free(rdpGraphics* graphics);
+
+#endif /* __GRAPHICS_H */
diff --git a/include/freerdp/input.h b/include/freerdp/input.h
new file mode 100644 (file)
index 0000000..e59bed2
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Input Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __INPUT_API_H
+#define __INPUT_API_H
+
+typedef struct rdp_input rdpInput;
+
+#include <freerdp/freerdp.h>
+
+/* keyboard Flags */
+#define KBD_FLAGS_EXTENDED             0x0100
+#define KBD_FLAGS_DOWN                 0x4000
+#define KBD_FLAGS_RELEASE              0x8000
+
+/* Pointer Flags */
+#define PTR_FLAGS_WHEEL                        0x0200
+#define PTR_FLAGS_WHEEL_NEGATIVE       0x0100
+#define PTR_FLAGS_MOVE                 0x0800
+#define PTR_FLAGS_DOWN                 0x8000
+#define PTR_FLAGS_BUTTON1              0x1000
+#define PTR_FLAGS_BUTTON2              0x2000
+#define PTR_FLAGS_BUTTON3              0x4000
+#define WheelRotationMask              0x01FF
+
+/* Extended Pointer Flags */
+#define PTR_XFLAGS_DOWN                        0x8000
+#define PTR_XFLAGS_BUTTON1             0x0001
+#define PTR_XFLAGS_BUTTON2             0x0002
+
+/* Keyboard Toggle Flags */
+#define KBD_SYNC_SCROLL_LOCK           0x00000001
+#define KBD_SYNC_NUM_LOCK              0x00000002
+#define KBD_SYNC_CAPS_LOCK             0x00000004
+#define KBD_SYNC_KANA_LOCK             0x00000008
+
+#define RDP_CLIENT_INPUT_PDU_HEADER_LENGTH     4
+
+typedef void (*pSynchronizeEvent)(rdpInput* input, uint32 flags);
+typedef void (*pKeyboardEvent)(rdpInput* input, uint16 flags, uint16 code);
+typedef void (*pUnicodeKeyboardEvent)(rdpInput* input, uint16 flags, uint16 code);
+typedef void (*pMouseEvent)(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+typedef void (*pExtendedMouseEvent)(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+
+struct rdp_input
+{
+       rdpContext* context; /* 0 */
+       void* param1; /* 1 */
+       uint32 paddingA[16 - 2]; /* 2 */
+
+       pSynchronizeEvent SynchronizeEvent; /* 16 */
+       pKeyboardEvent KeyboardEvent; /* 17 */
+       pUnicodeKeyboardEvent UnicodeKeyboardEvent; /* 18 */
+       pMouseEvent MouseEvent; /* 19 */
+       pExtendedMouseEvent ExtendedMouseEvent; /* 20 */
+       uint32 paddingB[32 - 21]; /* 21 */
+};
+
+#endif /* __INPUT_API_H */
diff --git a/include/freerdp/kbd/kbd.h b/include/freerdp/kbd/kbd.h
new file mode 100644 (file)
index 0000000..82d1024
--- /dev/null
@@ -0,0 +1,42 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based keyboard mapping
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_KBD_H
+#define __FREERDP_KBD_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+#define RDP_KEYBOARD_LAYOUT_TYPE_STANDARD   1
+#define RDP_KEYBOARD_LAYOUT_TYPE_VARIANT    2
+#define RDP_KEYBOARD_LAYOUT_TYPE_IME        4
+
+typedef struct rdp_keyboard_layout
+{
+       uint32 code;
+       char name[50];
+} rdpKeyboardLayout;
+
+FREERDP_API rdpKeyboardLayout* freerdp_kbd_get_layouts(int types);
+FREERDP_API uint32 freerdp_kbd_init(void *dpy, uint32 keyboard_layout_id);
+FREERDP_API uint8 freerdp_kbd_get_scancode_by_keycode(uint8 keycode, boolean* extended);
+FREERDP_API uint8 freerdp_kbd_get_keycode_by_scancode(uint8 scancode, boolean extended);
+FREERDP_API uint8 freerdp_kbd_get_scancode_by_virtualkey(int vkcode, boolean* extended);
+
+#endif /* __FREERDP_KBD_H */
diff --git a/include/freerdp/kbd/layouts.h b/include/freerdp/kbd/layouts.h
new file mode 100644 (file)
index 0000000..c92c7ac
--- /dev/null
@@ -0,0 +1,184 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Keyboard layout IDs used in the RDP protocol */
+
+#ifndef __LAYOUT_IDS_H
+#define __LAYOUT_IDS_H
+
+#include <freerdp/api.h>
+#include <freerdp/kbd/kbd.h>
+
+/* Keyboard layout IDs */
+
+#define KBD_ARABIC_101                         0x00000401
+#define KBD_BULGARIAN                          0x00000402
+#define KBD_CHINESE_TRADITIONAL_US             0x00000404
+#define KBD_CZECH                              0x00000405
+#define KBD_DANISH                             0x00000406
+#define KBD_GERMAN                             0x00000407
+#define KBD_GREEK                              0x00000408
+#define KBD_US                                 0x00000409
+#define KBD_SPANISH                            0x0000040A
+#define KBD_FINNISH                            0x0000040B
+#define KBD_FRENCH                             0x0000040C
+#define KBD_HEBREW                             0x0000040D
+#define KBD_HUNGARIAN                          0x0000040E
+#define KBD_ICELANDIC                          0x0000040F
+#define KBD_ITALIAN                            0x00000410
+#define KBD_JAPANESE                           0x00000411
+#define KBD_KOREAN                             0x00000412
+#define KBD_DUTCH                              0x00000413
+#define KBD_NORWEGIAN                          0x00000414
+#define KBD_POLISH_PROGRAMMERS                 0x00000415
+#define KBD_PORTUGUESE_BRAZILIAN_ABNT          0x00000416
+#define KBD_ROMANIAN                           0x00000418
+#define KBD_RUSSIAN                            0x00000419
+#define KBD_CROATIAN                           0x0000041A
+#define KBD_SLOVAK                             0x0000041B
+#define KBD_ALBANIAN                           0x0000041C
+#define KBD_SWEDISH                            0x0000041D
+#define KBD_THAI_KEDMANEE                      0x0000041E
+#define KBD_TURKISH_Q                          0x0000041F
+#define KBD_URDU                               0x00000420
+#define KBD_UKRAINIAN                          0x00000422
+#define KBD_BELARUSIAN                         0x00000423
+#define KBD_SLOVENIAN                          0x00000424
+#define KBD_ESTONIAN                           0x00000425
+#define KBD_LATVIAN                            0x00000426
+#define KBD_LITHUANIAN_IBM                     0x00000427
+#define KBD_FARSI                              0x00000429
+#define KBD_VIETNAMESE                         0x0000042A
+#define KBD_ARMENIAN_EASTERN                   0x0000042B
+#define KBD_AZERI_LATIN                                0x0000042C
+#define KBD_FYRO_MACEDONIAN                    0x0000042F
+#define KBD_GEORGIAN                           0x00000437
+#define KBD_FAEROESE                           0x00000438
+#define KBD_DEVANAGARI_INSCRIPT                        0x00000439
+#define KBD_MALTESE_47_KEY                     0x0000043A
+#define KBD_NORWEGIAN_WITH_SAMI                        0x0000043B
+#define KBD_KAZAKH                             0x0000043F
+#define KBD_KYRGYZ_CYRILLIC                    0x00000440
+#define KBD_TATAR                              0x00000444
+#define KBD_BENGALI                            0x00000445
+#define KBD_PUNJABI                            0x00000446
+#define KBD_GUJARATI                           0x00000447
+#define KBD_TAMIL                              0x00000449
+#define KBD_TELUGU                             0x0000044A
+#define KBD_KANNADA                            0x0000044B
+#define KBD_MALAYALAM                          0x0000044C
+#define KBD_MARATHI                            0x0000044E
+#define KBD_MONGOLIAN_CYRILLIC                 0x00000450
+#define KBD_UNITED_KINGDOM_EXTENDED            0x00000452
+#define KBD_SYRIAC                             0x0000045A
+#define KBD_NEPALI                             0x00000461
+#define KBD_PASHTO                             0x00000463
+#define KBD_DIVEHI_PHONETIC                    0x00000465
+#define KBD_LUXEMBOURGISH                      0x0000046E
+#define KBD_MAORI                              0x00000481
+#define KBD_CHINESE_SIMPLIFIED_US              0x00000804
+#define KBD_SWISS_GERMAN                       0x00000807
+#define KBD_UNITED_KINGDOM                     0x00000809
+#define KBD_LATIN_AMERICAN                     0x0000080A
+#define KBD_BELGIAN_FRENCH                     0x0000080C
+#define KBD_BELGIAN_PERIOD                     0x00000813
+#define KBD_PORTUGUESE                         0x00000816
+#define KBD_SERBIAN_LATIN                      0x0000081A
+#define KBD_AZERI_CYRILLIC                     0x0000082C
+#define KBD_SWEDISH_WITH_SAMI                  0x0000083B
+#define KBD_UZBEK_CYRILLIC                     0x00000843
+#define KBD_INUKTITUT_LATIN                    0x0000085D
+#define KBD_CANADIAN_FRENCH_LEGACY             0x00000C0C
+#define KBD_SERBIAN_CYRILLIC                   0x00000C1A
+#define KBD_CANADIAN_FRENCH                    0x00001009
+#define KBD_SWISS_FRENCH                       0x0000100C
+#define KBD_BOSNIAN                            0x0000141A
+#define KBD_IRISH                              0x00001809
+#define KBD_BOSNIAN_CYRILLIC                   0x0000201A
+
+/* Keyboard layout variant IDs */
+
+#define KBD_ARABIC_102                                 0x00010401
+#define KBD_BULGARIAN_LATIN                            0x00010402
+#define KBD_CZECH_QWERTY                               0x00010405
+#define KBD_GERMAN_IBM                                 0x00010407
+#define KBD_GREEK_220                                  0x00010408
+#define KBD_UNITED_STATES_DVORAK                       0x00010409
+#define KBD_SPANISH_VARIATION                          0x0001040A
+#define KBD_HUNGARIAN_101_KEY                          0x0001040E
+#define KBD_ITALIAN_142                                        0x00010410
+#define KBD_POLISH_214                                 0x00010415
+#define KBD_PORTUGUESE_BRAZILIAN_ABNT2                 0x00010416
+#define KBD_RUSSIAN_TYPEWRITER                         0x00010419
+#define KBD_SLOVAK_QWERTY                              0x0001041B
+#define KBD_THAI_PATTACHOTE                            0x0001041E
+#define KBD_TURKISH_F                                  0x0001041F
+#define KBD_LATVIAN_QWERTY                             0x00010426
+#define KBD_LITHUANIAN                                 0x00010427
+#define KBD_ARMENIAN_WESTERN                           0x0001042B
+#define KBD_HINDI_TRADITIONAL                          0x00010439
+#define KBD_MALTESE_48_KEY                             0x0001043A
+#define KBD_SAMI_EXTENDED_NORWAY                       0x0001043B
+#define KBD_BENGALI_INSCRIPT                           0x00010445
+#define KBD_SYRIAC_PHONETIC                            0x0001045A
+#define KBD_DIVEHI_TYPEWRITER                          0x00010465
+#define KBD_BELGIAN_COMMA                              0x0001080C
+#define KBD_FINNISH_WITH_SAMI                          0x0001083B
+#define KBD_CANADIAN_MULTILINGUAL_STANDARD             0x00011009
+#define KBD_GAELIC                                     0x00011809
+#define KBD_ARABIC_102_AZERTY                          0x00020401
+#define KBD_CZECH_PROGRAMMERS                          0x00020405
+#define KBD_GREEK_319                                  0x00020408
+#define KBD_UNITED_STATES_INTERNATIONAL                        0x00020409
+#define KBD_THAI_KEDMANEE_NON_SHIFTLOCK                        0x0002041E
+#define KBD_SAMI_EXTENDED_FINLAND_SWEDEN               0x0002083B
+#define KBD_GREEK_220_LATIN                            0x00030408
+#define KBD_UNITED_STATES_DVORAK_FOR_LEFT_HAND         0x00030409
+#define KBD_THAI_PATTACHOTE_NON_SHIFTLOCK              0x0003041E
+#define KBD_GREEK_319_LATIN                            0x00040408
+#define KBD_UNITED_STATES_DVORAK_FOR_RIGHT_HAND                0x00040409
+#define KBD_GREEK_LATIN                                        0x00050408
+#define KBD_US_ENGLISH_TABLE_FOR_IBM_ARABIC_238_L      0x00050409
+#define KBD_GREEK_POLYTONIC                            0x00060408
+#define KBD_GERMAN_NEO                                 0xB0000407
+
+/* Global Input Method Editor (IME) IDs */
+
+#define KBD_CHINESE_TRADITIONAL_PHONETIC                       0xE0010404
+#define KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002                   0xE0010411
+#define KBD_KOREAN_INPUT_SYSTEM_IME_2000                       0xE0010412
+#define KBD_CHINESE_SIMPLIFIED_QUANPIN                         0xE0010804
+#define KBD_CHINESE_TRADITIONAL_CHANGJIE                       0xE0020404
+#define KBD_CHINESE_SIMPLIFIED_SHUANGPIN                       0xE0020804
+#define KBD_CHINESE_TRADITIONAL_QUICK                          0xE0030404
+#define KBD_CHINESE_SIMPLIFIED_ZHENGMA                         0xE0030804
+#define KBD_CHINESE_TRADITIONAL_BIG5_CODE                      0xE0040404
+#define KBD_CHINESE_TRADITIONAL_ARRAY                          0xE0050404
+#define KBD_CHINESE_SIMPLIFIED_NEIMA                           0xE0050804
+#define KBD_CHINESE_TRADITIONAL_DAYI                           0xE0060404
+#define KBD_CHINESE_TRADITIONAL_UNICODE                                0xE0070404
+#define KBD_CHINESE_TRADITIONAL_NEW_PHONETIC                   0xE0080404
+#define KBD_CHINESE_TRADITIONAL_NEW_CHANGJIE                   0xE0090404
+#define KBD_CHINESE_TRADITIONAL_MICROSOFT_PINYIN_IME_3         0xE00E0804
+#define KBD_CHINESE_TRADITIONAL_ALPHANUMERIC                   0xE00F0404
+
+FREERDP_API rdpKeyboardLayout* get_keyboard_layouts(int types);
+FREERDP_API const char* get_layout_name(uint32 keyboardLayoutID);
+
+#endif
diff --git a/include/freerdp/kbd/locales.h b/include/freerdp/kbd/locales.h
new file mode 100644 (file)
index 0000000..b98a06e
--- /dev/null
@@ -0,0 +1,328 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Detection of plausible keyboard layout id based on current locale (LANG) setting. */
+
+/*
+ * Refer to "Windows XP/Server 2003 - List of Locale IDs, Input Locale, and Language Collection":
+ * http://www.microsoft.com/globaldev/reference/winxp/xp-lcid.mspx
+ */
+
+#ifndef __LOCALES_H
+#define __LOCALES_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+#define AFRIKAANS                              0x0436
+#define ALBANIAN                               0x041c
+#define ALSATIAN                               0x0484
+#define AMHARIC                                        0x045E
+#define ARABIC_SAUDI_ARABIA                    0x0401
+#define ARABIC_IRAQ                            0x0801
+#define ARABIC_EGYPT                           0x0c01
+#define ARABIC_LIBYA                           0x1001
+#define ARABIC_ALGERIA                         0x1401
+#define ARABIC_MOROCCO                         0x1801
+#define ARABIC_TUNISIA                         0x1c01
+#define ARABIC_OMAN                            0x2001
+#define ARABIC_YEMEN                           0x2401
+#define ARABIC_SYRIA                           0x2801
+#define ARABIC_JORDAN                          0x2c01
+#define ARABIC_LEBANON                         0x3001
+#define ARABIC_KUWAIT                          0x3401
+#define ARABIC_UAE                             0x3801
+#define ARABIC_BAHRAIN                         0x3c01
+#define ARABIC_QATAR                           0x4001
+#define ARMENIAN                               0x042b
+#define ASSAMESE                               0x044D
+#define AZERI_LATIN                            0x042c
+#define AZERI_CYRILLIC                         0x082c
+#define BASHKIR                                        0x046D
+#define BASQUE                                 0x042d
+#define BELARUSIAN                             0x0423
+#define BENGALI_INDIA                          0x0445
+#define BOSNIAN_LATIN                          0x141A
+#define        BRETON                                  0x047E
+#define BULGARIAN                              0x0402
+#define CATALAN                                        0x0403
+#define CHINESE_TAIWAN                         0x0404
+#define CHINESE_PRC                            0x0804
+#define CHINESE_HONG_KONG                      0x0c04
+#define CHINESE_SINGAPORE                      0x1004
+#define CHINESE_MACAU                          0x1404
+#define CROATIAN                               0x041a
+#define CROATIAN_BOSNIA_HERZEGOVINA            0x101A
+#define CZECH                                  0x0405
+#define DANISH                                 0x0406
+#define DARI                                   0x048C
+#define DIVEHI                                 0x0465
+#define DUTCH_STANDARD                         0x0413
+#define DUTCH_BELGIAN                          0x0813
+#define ENGLISH_UNITED_STATES                  0x0409
+#define ENGLISH_UNITED_KINGDOM                 0x0809
+#define ENGLISH_AUSTRALIAN                     0x0c09
+#define ENGLISH_CANADIAN                       0x1009
+#define ENGLISH_NEW_ZEALAND                    0x1409
+#define ENGLISH_INDIA                          0x4009
+#define ENGLISH_IRELAND                                0x1809
+#define ENGLISH_MALAYSIA                       0x4409
+#define ENGLISH_SOUTH_AFRICA                   0x1c09
+#define ENGLISH_JAMAICA                                0x2009
+#define ENGLISH_CARIBBEAN                      0x2409
+#define ENGLISH_BELIZE                         0x2809
+#define ENGLISH_TRINIDAD                       0x2c09
+#define ENGLISH_ZIMBABWE                       0x3009
+#define ENGLISH_PHILIPPINES                    0x3409
+#define ENGLISH_SINGAPORE                      0x4809
+#define ESTONIAN                               0x0425
+#define FAEROESE                               0x0438
+#define FARSI                                  0x0429
+#define FILIPINO                               0x0464
+#define FINNISH                                        0x040b
+#define FRENCH_STANDARD                                0x040c
+#define FRENCH_BELGIAN                         0x080c
+#define FRENCH_CANADIAN                                0x0c0c
+#define FRENCH_SWISS                           0x100c
+#define FRENCH_LUXEMBOURG                      0x140c
+#define FRENCH_MONACO                          0x180c
+#define FRISIAN                                        0x0462
+#define GEORGIAN                               0x0437
+#define GALICIAN                               0x0456
+#define GERMAN_STANDARD                                0x0407
+#define GERMAN_SWISS                           0x0807
+#define GERMAN_AUSTRIAN                                0x0c07
+#define GERMAN_LUXEMBOURG                      0x1007
+#define GERMAN_LIECHTENSTEIN                   0x1407
+#define GREEK                                  0x0408
+#define GREENLANDIC                            0x046F
+#define GUJARATI                               0x0447
+#define HEBREW                                 0x040d
+#define HINDI                                  0x0439
+#define HUNGARIAN                              0x040e
+#define ICELANDIC                              0x040f
+#define IGBO                                   0x0470
+#define INDONESIAN                             0x0421
+#define IRISH                                  0x083C
+#define ITALIAN_STANDARD                       0x0410
+#define ITALIAN_SWISS                          0x0810
+#define JAPANESE                               0x0411
+#define KANNADA                                        0x044b
+#define KAZAKH                                 0x043f
+#define KHMER                                  0x0453
+#define KICHE                                  0x0486
+#define KINYARWANDA                            0x0487
+#define KONKANI                                        0x0457
+#define KOREAN                                 0x0412
+#define KYRGYZ                                 0x0440
+#define LAO                                    0x0454
+#define LATVIAN                                        0x0426
+#define LITHUANIAN                             0x0427
+#define LOWER_SORBIAN                          0x082E
+#define LUXEMBOURGISH                          0x046E
+#define MACEDONIAN                             0x042f
+#define MALAY_MALAYSIA                         0x043e
+#define MALAY_BRUNEI_DARUSSALAM                        0x083e
+#define MALAYALAM                              0x044c
+#define MALTESE                                        0x043a
+#define MAPUDUNGUN                             0x047A
+#define MAORI                                  0x0481
+#define MARATHI                                        0x044e
+#define MOHAWK                                 0x047C
+#define MONGOLIAN                              0x0450
+#define NEPALI                                 0x0461
+#define NORWEGIAN_BOKMAL                       0x0414
+#define NORWEGIAN_NYNORSK                      0x0814
+#define OCCITAN                                        0x0482
+#define ORIYA                                  0x0448
+#define PASHTO                                 0x0463
+#define POLISH                                 0x0415
+#define PORTUGUESE_BRAZILIAN                   0x0416
+#define PORTUGUESE_STANDARD                    0x0816
+#define PUNJABI                                        0x0446
+#define QUECHUA_BOLIVIA                                0x046b
+#define QUECHUA_ECUADOR                                0x086b
+#define QUECHUA_PERU                           0x0c6b
+#define ROMANIAN                               0x0418
+#define ROMANSH                                        0x0417
+#define RUSSIAN                                        0x0419
+#define SAMI_INARI                             0x243b
+#define SAMI_LULE_NORWAY                       0x103b
+#define SAMI_LULE_SWEDEN                       0x143b
+#define SAMI_NORTHERN_FINLAND                  0x0c3b
+#define SAMI_NORTHERN_NORWAY                   0x043b
+#define SAMI_NORTHERN_SWEDEN                   0x083b
+#define SAMI_SKOLT                             0x203b
+#define SAMI_SOUTHERN_NORWAY                   0x183b
+#define SAMI_SOUTHERN_SWEDEN                   0x1c3b
+#define SANSKRIT                               0x044f
+#define SERBIAN_LATIN                          0x081a
+#define SERBIAN_LATIN_BOSNIA_HERZEGOVINA       0x181a
+#define SERBIAN_CYRILLIC                       0x0c1a
+#define SERBIAN_CYRILLIC_BOSNIA_HERZEGOVINA    0x1c1a
+#define SESOTHO_SA_LEBOA                       0x046C
+#define SINHALA                                        0x045B
+#define SLOVAK                                 0x041b
+#define SLOVENIAN                              0x0424
+#define SPANISH_TRADITIONAL_SORT               0x040a
+#define SPANISH_MEXICAN                                0x080a
+#define SPANISH_MODERN_SORT                    0x0c0a
+#define SPANISH_GUATEMALA                      0x100a
+#define SPANISH_COSTA_RICA                     0x140a
+#define SPANISH_PANAMA                         0x180a
+#define SPANISH_DOMINICAN_REPUBLIC             0x1c0a
+#define SPANISH_VENEZUELA                      0x200a
+#define SPANISH_COLOMBIA                       0x240a
+#define SPANISH_PERU                           0x280a
+#define SPANISH_ARGENTINA                      0x2c0a
+#define SPANISH_ECUADOR                                0x300a
+#define SPANISH_CHILE                          0x340a
+#define SPANISH_UNITED_STATES                  0x540A
+#define SPANISH_URUGUAY                                0x380a
+#define SPANISH_PARAGUAY                       0x3c0a
+#define SPANISH_BOLIVIA                                0x400a
+#define SPANISH_EL_SALVADOR                    0x440a
+#define SPANISH_HONDURAS                       0x480a
+#define SPANISH_NICARAGUA                      0x4c0a
+#define SPANISH_PUERTO_RICO                    0x500a
+#define SWAHILI                                        0x0441
+#define SWEDISH                                        0x041d
+#define SWEDISH_FINLAND                                0x081d
+#define SYRIAC                                 0x045a
+#define TAMIL                                  0x0449
+#define TATAR                                  0x0444
+#define TELUGU                                 0x044a
+#define THAI                                   0x041e
+#define TIBETAN_BHUTAN                         0x0851
+#define TIBETAN_PRC                            0x0451
+#define TSWANA                                 0x0432
+#define UKRAINIAN                              0x0422
+#define TURKISH                                        0x041f
+#define TURKMEN                                        0x0442
+#define UIGHUR                                 0x0480
+#define UPPER_SORBIAN                          0x042E
+#define URDU                                   0x0420
+#define URDU_INDIA                             0x0820
+#define UZBEK_LATIN                            0x0443
+#define UZBEK_CYRILLIC                         0x0843
+#define VIETNAMESE                             0x042a
+#define WELSH                                  0x0452
+#define WOLOF                                  0x0488
+#define XHOSA                                  0x0434
+#define YAKUT                                  0x0485
+#define YI                                     0x0478
+#define YORUBA                                 0x046A
+#define ZULU                                   0x0435
+
+
+/*
+Time zones, taken from Windows Server 2008
+
+(GMT -12:00) International Date Line West
+(GMT -11:00) Midway Island, Samoa
+(GMT -10:00) Hawaii
+(GMT -09:00) Alaska
+(GMT -08:00) Pacific Time (US & Canada)
+(GMT -08:00) Tijuana, Baja California
+(GMT -07:00) Arizona
+(GMT -07:00) Chihuahua, La Paz, Mazatlan
+(GMT -07:00) Mountain Time (US & Canada)
+(GMT -06:00) Central America
+(GMT -06:00) Central Time (US & Canada)
+(GMT -06:00) Guadalajara, Mexico City, Monterrey
+(GMT -06:00) Saskatchewan
+(GMT -05:00) Bogota, Lima, Quito, Rio Branco
+(GMT -05:00) Eastern Time (US & Canada)
+(GMT -05:00) Indiana (East)
+(GMT -04:30) Caracas
+(GMT -04:00) Atlantic Time (Canada)
+(GMT -04:00) La Paz
+(GMT -04:00) Manaus
+(GMT -04:00) Santiago
+(GMT -03:30) Newfoundland
+(GMT -03:00) Brasilia
+(GMT -03:00) Buenos Aires
+(GMT -03:00) Georgetown
+(GMT -03:00) Greenland
+(GMT -03:00) Montevideo
+(GMT -02:00) Mid-Atlantic
+(GMT -01:00) Azores
+(GMT -01:00) Cape Verde Is.
+(GMT +00:00) Casablanca
+(GMT +00:00) Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London
+(GMT +00:00) Monrovia, Reykjavik
+(GMT +01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
+(GMT +01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
+(GMT +01:00) Brussels, Copenhagen, Madrid, Paris
+(GMT +01:00) Sarajevo, Skopje, Warsaw, Zagreb
+(GMT +01:00) West Central Africa
+(GMT +02:00) Amman
+(GMT +02:00) Athens, Bucharest, Istanbul
+(GMT +02:00) Beirut
+(GMT +02:00) Cairo
+(GMT +02:00) Harare, Pretoria
+(GMT +02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius
+(GMT +02:00) Jerusalem
+(GMT +02:00) Minsk
+(GMT +02:00) Windhoek
+(GMT +03:00) Baghdad
+(GMT +03:00) Kuwait, Riyadh
+(GMT +03:00) Moscow, St. Petersburg, Volgograd
+(GMT +03:00) Nairobi
+(GMT +03:00) Tbilisi
+(GMT +03:30) Tehran
+(GMT +04:00) Abu Dhabi, Muscat
+(GMT +04:00) Baku
+(GMT +04:00) Port Louis
+(GMT +04:00) Yerevan
+(GMT +04:30) Kabul
+(GMT +05:00) Ekaterinburg
+(GMT +05:00) Islamabad, Karachi
+(GMT +05:00) Tashkent
+(GMT +05:30) Chennai, Kolkata, Mumbai, New Delhi
+(GMT +05:30) Sri Jayawardenepura
+(GMT +05:45) Kathmandu
+(GMT +06:00) Almaty, Novosibirsk
+(GMT +06:00) Astana, Dhaka
+(GMT +06:30) Yangon (Rangoon)
+(GMT +07:00) Bangkok, Hanoi, Jakarta
+(GMT +07:00) Krasnoyarsk
+(GMT +08:00) Beijing, Chongqing, Hong Kong, Urumqi
+(GMT +08:00) Irkutsk, Ulaan Bataar
+(GMT +08:00) Kuala Lumpur, Singapore
+(GMT +08:00) Perth
+(GMT +08:00) Taipei
+(GMT +09:00) Osaka, Sapporo, Tokyo
+(GMT +09:00) Seoul
+(GMT +09:00) Yakutsk
+(GMT +09:30) Adelaide
+(GMT +09:30) Darwin
+(GMT +10:00) Brisbane
+(GMT +10:00) Canberra, Melbourne, Sydney
+(GMT +10:00) Guam, Port Moresby
+(GMT +10:00) Hobart, Vladivostok
+(GMT +11:00) Magadan, Solomon Is., New Caledonia
+(GMT +12:00) Auckland, Wellington
+(GMT +12:00) Fiji, Kamchatka, Marshall Is.
+(GMT +13:00) Nuku'alofa
+*/
+
+FREERDP_API uint32 detect_keyboard_layout_from_locale();
+
+#endif /* __LOCALES_H */
diff --git a/include/freerdp/kbd/vkcodes.h b/include/freerdp/kbd/vkcodes.h
new file mode 100644 (file)
index 0000000..f2f87d1
--- /dev/null
@@ -0,0 +1,587 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Microsoft Virtual Key Code Definitions and Conversion Tables
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Microsoft Windows Virtual Key Codes: http://msdn.microsoft.com/en-us/library/ms645540.aspx */
+
+#ifndef __VKCODES_H
+#define __VKCODES_H
+
+#include <stddef.h>
+#include <freerdp/api.h>
+#include <freerdp/kbd/layouts.h>
+
+/* Mouse buttons */
+
+#define VK_LBUTTON     0x01 /* Left mouse button */
+#define VK_RBUTTON     0x02 /* Right mouse button */
+#define VK_CANCEL      0x03 /* Control-break processing */
+#define VK_MBUTTON     0x04 /* Middle mouse button (three-button mouse) */
+#define VK_XBUTTON1    0x05 /* Windows 2000/XP: X1 mouse button */
+#define VK_XBUTTON2    0x06 /* Windows 2000/XP: X2 mouse button */
+
+/* 0x07 is undefined */
+
+#define VK_BACK                0x08 /* BACKSPACE key */
+#define VK_TAB         0x09 /* TAB key */
+
+/* 0x0A to 0x0B are reserved */
+
+#define VK_CLEAR       0x0C /* CLEAR key */
+#define VK_RETURN      0x0D /* ENTER key */
+
+/* 0x0E to 0x0F are undefined */
+
+#define VK_SHIFT       0x10 /* SHIFT key */
+#define VK_CONTROL     0x11 /* CTRL key */
+#define VK_MENU                0x12 /* ALT key */
+#define VK_PAUSE       0x13 /* PAUSE key */
+#define VK_CAPITAL     0x14 /* CAPS LOCK key */
+#define VK_KANA                0x15 /* Input Method Editor (IME) Kana mode */
+#define VK_HANGUEL     0x15 /* IME Hanguel mode (maintained for compatibility; use #define VK_HANGUL) */
+#define VK_HANGUL      0x15 /* IME Hangul mode */
+
+/* 0x16 is undefined */
+
+#define VK_JUNJA       0x17 /* IME Junja mode */
+#define VK_FINAL       0x18 /* IME final mode */
+#define VK_HANJA       0x19 /* IME Hanja mode */
+#define VK_KANJI       0x19 /* IME Kanji mode */
+
+/* 0x1A is undefined */
+
+#define VK_ESCAPE      0x1B /* ESC key */
+#define VK_CONVERT     0x1C /* IME convert */
+#define VK_NONCONVERT  0x1D /* IME nonconvert */
+#define VK_ACCEPT      0x1E /* IME accept */
+#define VK_MODECHANGE  0x1F /* IME mode change request */
+
+#define VK_SPACE       0x20 /* SPACEBAR */
+#define VK_PRIOR       0x21 /* PAGE UP key */
+#define VK_NEXT                0x22 /* PAGE DOWN key */
+#define VK_END         0x23 /* END key */
+#define VK_HOME                0x24 /* HOME key */
+#define VK_LEFT                0x25 /* LEFT ARROW key */
+#define VK_UP          0x26 /* UP ARROW key */
+#define VK_RIGHT       0x27 /* RIGHT ARROW key */
+#define VK_DOWN                0x28 /* DOWN ARROW key */
+#define VK_SELECT      0x29 /* SELECT key */
+#define VK_PRINT       0x2A /* PRINT key */
+#define VK_EXECUTE     0x2B /* EXECUTE key */
+#define VK_SNAPSHOT    0x2C /* PRINT SCREEN key */
+#define VK_INSERT      0x2D /* INS key */
+#define VK_DELETE      0x2E /* DEL key */
+#define VK_HELP                0x2F /* HELP key */
+
+/* Digits, the last 4 bits of the code represent the corresponding digit */
+
+#define VK_KEY_0       0x30 /* '0' key */
+#define VK_KEY_1       0x31 /* '1' key */
+#define VK_KEY_2       0x32 /* '2' key */
+#define VK_KEY_3       0x33 /* '3' key */
+#define VK_KEY_4       0x34 /* '4' key */
+#define VK_KEY_5       0x35 /* '5' key */
+#define VK_KEY_6       0x36 /* '6' key */
+#define VK_KEY_7       0x37 /* '7' key */
+#define VK_KEY_8       0x38 /* '8' key */
+#define VK_KEY_9       0x39 /* '9' key */
+
+/* 0x3A to 0x40 are undefined */
+
+/* The alphabet, the code corresponds to the capitalized letter in the ASCII code */
+
+#define VK_KEY_A       0x41 /* 'A' key */
+#define VK_KEY_B       0x42 /* 'B' key */
+#define VK_KEY_C       0x43 /* 'C' key */
+#define VK_KEY_D       0x44 /* 'D' key */
+#define VK_KEY_E       0x45 /* 'E' key */
+#define VK_KEY_F       0x46 /* 'F' key */
+#define VK_KEY_G       0x47 /* 'G' key */
+#define VK_KEY_H       0x48 /* 'H' key */
+#define VK_KEY_I       0x49 /* 'I' key */
+#define VK_KEY_J       0x4A /* 'J' key */
+#define VK_KEY_K       0x4B /* 'K' key */
+#define VK_KEY_L       0x4C /* 'L' key */
+#define VK_KEY_M       0x4D /* 'M' key */
+#define VK_KEY_N       0x4E /* 'N' key */
+#define VK_KEY_O       0x4F /* 'O' key */
+#define VK_KEY_P       0x50 /* 'P' key */
+#define VK_KEY_Q       0x51 /* 'Q' key */
+#define VK_KEY_R       0x52 /* 'R' key */
+#define VK_KEY_S       0x53 /* 'S' key */
+#define VK_KEY_T       0x54 /* 'T' key */
+#define VK_KEY_U       0x55 /* 'U' key */
+#define VK_KEY_V       0x56 /* 'V' key */
+#define VK_KEY_W       0x57 /* 'W' key */
+#define VK_KEY_X       0x58 /* 'X' key */
+#define VK_KEY_Y       0x59 /* 'Y' key */
+#define VK_KEY_Z       0x5A /* 'Z' key */
+
+#define VK_LWIN                0x5B /* Left Windows key (Microsoft Natural keyboard) */
+#define VK_RWIN                0x5C /* Right Windows key (Natural keyboard) */
+#define VK_APPS                0x5D /* Applications key (Natural keyboard) */
+
+/* 0x5E is reserved */
+
+#define VK_SLEEP       0x5F /* Computer Sleep key */
+
+/* Numeric keypad digits, the last four bits of the code represent the corresponding digit */
+
+#define VK_NUMPAD0     0x60 /* Numeric keypad '0' key */
+#define VK_NUMPAD1     0x61 /* Numeric keypad '1' key */
+#define VK_NUMPAD2     0x62 /* Numeric keypad '2' key */
+#define VK_NUMPAD3     0x63 /* Numeric keypad '3' key */
+#define VK_NUMPAD4     0x64 /* Numeric keypad '4' key */
+#define VK_NUMPAD5     0x65 /* Numeric keypad '5' key */
+#define VK_NUMPAD6     0x66 /* Numeric keypad '6' key */
+#define VK_NUMPAD7     0x67 /* Numeric keypad '7' key */
+#define VK_NUMPAD8     0x68 /* Numeric keypad '8' key */
+#define VK_NUMPAD9     0x69 /* Numeric keypad '9' key */
+
+/* Numeric keypad operators and special keys */
+
+#define VK_MULTIPLY    0x6A /* Multiply key */
+#define VK_ADD         0x6B /* Add key */
+#define VK_SEPARATOR   0x6C /* Separator key */
+#define VK_SUBTRACT    0x6D /* Subtract key */
+#define VK_DECIMAL     0x6E /* Decimal key */
+#define VK_DIVIDE      0x6F /* Divide key */
+
+/* Function keys, from F1 to F24 */
+
+#define VK_F1          0x70 /* F1 key */
+#define VK_F2          0x71 /* F2 key */
+#define VK_F3          0x72 /* F3 key */
+#define VK_F4          0x73 /* F4 key */
+#define VK_F5          0x74 /* F5 key */
+#define VK_F6          0x75 /* F6 key */
+#define VK_F7          0x76 /* F7 key */
+#define VK_F8          0x77 /* F8 key */
+#define VK_F9          0x78 /* F9 key */
+#define VK_F10         0x79 /* F10 key */
+#define VK_F11         0x7A /* F11 key */
+#define VK_F12         0x7B /* F12 key */
+#define VK_F13         0x7C /* F13 key */
+#define VK_F14         0x7D /* F14 key */
+#define VK_F15         0x7E /* F15 key */
+#define VK_F16         0x7F /* F16 key */
+#define VK_F17         0x80 /* F17 key */
+#define VK_F18         0x81 /* F18 key */
+#define VK_F19         0x82 /* F19 key */
+#define VK_F20         0x83 /* F20 key */
+#define VK_F21         0x84 /* F21 key */
+#define VK_F22         0x85 /* F22 key */
+#define VK_F23         0x86 /* F23 key */
+#define VK_F24         0x87 /* F24 key */
+
+/* 0x88 to 0x8F are unassigned */
+
+#define VK_NUMLOCK     0x90 /* NUM LOCK key */
+#define VK_SCROLL      0x91 /* SCROLL LOCK key */
+
+/* 0x92 to 0x96 are OEM specific */
+/* 0x97 to 0x9F are unassigned */
+
+/* Modifier keys */
+
+#define VK_LSHIFT      0xA0 /* Left SHIFT key */
+#define VK_RSHIFT      0xA1 /* Right SHIFT key */
+#define VK_LCONTROL    0xA2 /* Left CONTROL key */
+#define VK_RCONTROL    0xA3 /* Right CONTROL key */
+#define VK_LMENU       0xA4 /* Left MENU key */
+#define VK_RMENU       0xA5 /* Right MENU key */
+
+/* Browser related keys */
+
+#define VK_BROWSER_BACK                0xA6 /* Windows 2000/XP: Browser Back key */
+#define VK_BROWSER_FORWARD     0xA7 /* Windows 2000/XP: Browser Forward key */
+#define VK_BROWSER_REFRESH     0xA8 /* Windows 2000/XP: Browser Refresh key */
+#define VK_BROWSER_STOP                0xA9 /* Windows 2000/XP: Browser Stop key */
+#define VK_BROWSER_SEARCH      0xAA /* Windows 2000/XP: Browser Search key */
+#define VK_BROWSER_FAVORITES   0xAB /* Windows 2000/XP: Browser Favorites key */
+#define VK_BROWSER_HOME                0xAC /* Windows 2000/XP: Browser Start and Home key */
+
+/* Volume related keys */
+
+#define VK_VOLUME_MUTE         0xAD /* Windows 2000/XP: Volume Mute key */
+#define VK_VOLUME_DOWN         0xAE /* Windows 2000/XP: Volume Down key */
+#define VK_VOLUME_UP           0xAF /* Windows 2000/XP: Volume Up key */
+
+/* Media player related keys */
+
+#define VK_MEDIA_NEXT_TRACK    0xB0 /* Windows 2000/XP: Next Track key */
+#define VK_MEDIA_PREV_TRACK    0xB1 /* Windows 2000/XP: Previous Track key */
+#define VK_MEDIA_STOP          0xB2 /* Windows 2000/XP: Stop Media key */
+#define VK_MEDIA_PLAY_PAUSE    0xB3 /* Windows 2000/XP: Play/Pause Media key */
+
+/* Application launcher keys */
+
+#define VK_LAUNCH_MAIL         0xB4 /* Windows 2000/XP: Start Mail key */
+#define VK_LAUNCH_MEDIA_SELECT 0xB5 /* Windows 2000/XP: Select Media key */
+#define VK_LAUNCH_APP1         0xB6 /* Windows 2000/XP: Start Application 1 key */
+#define VK_LAUNCH_APP2         0xB7 /* Windows 2000/XP: Start Application 2 key */
+
+/* 0xB8 and 0xB9 are reserved */
+
+/* OEM keys */
+
+#define VK_OEM_1       0xBA /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the ';:' key */
+
+#define VK_OEM_PLUS    0xBB /* Windows 2000/XP: For any country/region, the '+' key */
+#define VK_OEM_COMMA   0xBC /* Windows 2000/XP: For any country/region, the ',' key */
+#define VK_OEM_MINUS   0xBD /* Windows 2000/XP: For any country/region, the '-' key */
+#define VK_OEM_PERIOD  0xBE /* Windows 2000/XP: For any country/region, the '.' key */
+
+#define VK_OEM_2       0xBF /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the '/?' key */
+
+#define VK_OEM_3       0xC0 /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the '`~' key */
+
+/* 0xC1 to 0xD7 are reserved */
+#define VK_ABNT_C1     0xC1 /* Brazilian (ABNT) Keyboard */
+#define VK_ABNT_C2     0xC2 /* Brazilian (ABNT) Keyboard */
+
+/* 0xD8 to 0xDA are unassigned */
+
+#define VK_OEM_4       0xDB /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the '[{' key */
+
+#define VK_OEM_5       0xDC /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the '\|' key */
+
+#define VK_OEM_6       0xDD /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the ']}' key */
+
+#define VK_OEM_7       0xDE /* Used for miscellaneous characters; it can vary by keyboard. */
+                            /* Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key */
+
+#define VK_OEM_8       0xDF /* Used for miscellaneous characters; it can vary by keyboard. */
+
+/* 0xE0 is reserved */
+/* 0xE1 is OEM specific */
+
+#define VK_OEM_102     0xE2 /* Windows 2000/XP: Either the angle bracket key or */
+                            /* the backslash key on the RT 102-key keyboard */
+
+/* 0xE3 and 0xE4 are OEM specific */
+
+#define VK_PROCESSKEY  0xE5 /* Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key */
+
+/* 0xE6 is OEM specific */
+
+#define VK_PACKET      0xE7    /* Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. */
+                               /* The #define VK_PACKET key is the low word of a 32-bit Virtual Key value used */
+                               /* for non-keyboard input methods. For more information, */
+                               /* see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP */
+
+/* 0xE8 is unassigned */
+/* 0xE9 to 0xF5 are OEM specific */
+
+#define VK_ATTN                0xF6 /* Attn key */
+#define VK_CRSEL       0xF7 /* CrSel key */
+#define VK_EXSEL       0xF8 /* ExSel key */
+#define VK_EREOF       0xF9 /* Erase EOF key */
+#define VK_PLAY                0xFA /* Play key */
+#define VK_ZOOM                0xFB /* Zoom key */
+#define VK_NONAME      0xFC /* Reserved */
+#define VK_PA1         0xFD /* PA1 key */
+#define VK_OEM_CLEAR   0xFE /* Clear key */
+
+/* Use the virtual key code as an index in this array in order to get its associated scan code */
+
+typedef struct _virtualKey
+{
+       /* Windows "scan code", aka keycode in RDP */
+       unsigned char scancode;
+
+       /* Windows "extended" flag, boolean */
+       unsigned char extended;
+
+       /* Windows virtual key name */
+       char *name;
+
+       /* XKB keyname */
+       char *x_keyname;
+} virtualKey;
+
+static const virtualKey virtualKeyboard[256 + 2] =
+{
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, "VK_LBUTTON"          , NULL   },
+       { 0x00, 0, "VK_RBUTTON"          , NULL   },
+       { 0x00, 0, "VK_CANCEL"           , NULL   },
+       { 0x00, 0, "VK_MBUTTON"          , NULL   },
+       { 0x00, 0, "VK_XBUTTON1"         , NULL   },
+       { 0x00, 0, "VK_XBUTTON2"         , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x0E, 0, "VK_BACK"             , "BKSP" },
+       { 0x0F, 0, "VK_TAB"              , "TAB"  },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, "VK_CLEAR"            , NULL   },
+       { 0x1C, 0, "VK_RETURN"           , "RTRN" },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x2A, 0, "VK_SHIFT"            , "LFSH" },
+       { 0x00, 0, "VK_CONTROL"          , NULL   },
+       { 0x38, 0, "VK_MENU"             , "LALT" },
+       { 0x46, 1, "VK_PAUSE"            , "PAUS" },
+       { 0x3A, 0, "VK_CAPITAL"          , "CAPS" },
+       { 0x72, 0, "VK_KANA / VK_HANGUL" , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, "VK_JUNJA"            , NULL   },
+       { 0x00, 0, "VK_FINAL"            , NULL   },
+       { 0x71, 0, "VK_HANJA / VK_KANJI" , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x01, 0, "VK_ESCAPE"           , "ESC"  },
+       { 0x00, 0, "VK_CONVERT"          , NULL   },
+       { 0x00, 0, "VK_NONCONVERT"       , NULL   },
+       { 0x00, 0, "VK_ACCEPT"           , NULL   },
+       { 0x00, 0, "VK_MODECHANGE"       , NULL   },
+       { 0x39, 0, "VK_SPACE"            , "SPCE" },
+       { 0x49, 1, "VK_PRIOR"            , "PGUP" },
+       { 0x51, 1, "VK_NEXT"             , "PGDN" },
+       { 0x4F, 1, "VK_END"              , "END"  },
+       { 0x47, 1, "VK_HOME"             , "HOME" },
+       { 0x4B, 1, "VK_LEFT"             , "LEFT" },
+       { 0x48, 1, "VK_UP"               , "UP"   },
+       { 0x4D, 1, "VK_RIGHT"            , "RGHT" },
+       { 0x50, 1, "VK_DOWN"             , "DOWN" },
+       { 0x00, 0, "VK_SELECT"           , NULL   },
+       { 0x37, 1, "VK_PRINT"            , "PRSC" },
+       { 0x37, 1, "VK_EXECUTE"          , NULL   },
+       { 0x37, 1, "VK_SNAPSHOT"         , NULL   },
+       { 0x52, 1, "VK_INSERT"           , "INS"  },
+       { 0x53, 1, "VK_DELETE"           , "DELE" },
+       { 0x63, 0, "VK_HELP"             , NULL   },
+       { 0x0B, 0, "VK_KEY_0"            , "AE10" },
+       { 0x02, 0, "VK_KEY_1"            , "AE01" },
+       { 0x03, 0, "VK_KEY_2"            , "AE02" },
+       { 0x04, 0, "VK_KEY_3"            , "AE03" },
+       { 0x05, 0, "VK_KEY_4"            , "AE04" },
+       { 0x06, 0, "VK_KEY_5"            , "AE05" },
+       { 0x07, 0, "VK_KEY_6"            , "AE06" },
+       { 0x08, 0, "VK_KEY_7"            , "AE07" },
+       { 0x09, 0, "VK_KEY_8"            , "AE08" },
+       { 0x0A, 0, "VK_KEY_9"            , "AE09" },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x1E, 0, "VK_KEY_A"            , "AC01" },
+       { 0x30, 0, "VK_KEY_B"            , "AB05" },
+       { 0x2E, 0, "VK_KEY_C"            , "AB03" },
+       { 0x20, 0, "VK_KEY_D"            , "AC03" },
+       { 0x12, 0, "VK_KEY_E"            , "AD03" },
+       { 0x21, 0, "VK_KEY_F"            , "AC04" },
+       { 0x22, 0, "VK_KEY_G"            , "AC05" },
+       { 0x23, 0, "VK_KEY_H"            , "AC06" },
+       { 0x17, 0, "VK_KEY_I"            , "AD08" },
+       { 0x24, 0, "VK_KEY_J"            , "AC07" },
+       { 0x25, 0, "VK_KEY_K"            , "AC08" },
+       { 0x26, 0, "VK_KEY_L"            , "AC09" },
+       { 0x32, 0, "VK_KEY_M"            , "AB07" },
+       { 0x31, 0, "VK_KEY_N"            , "AB06" },
+       { 0x18, 0, "VK_KEY_O"            , "AD09" },
+       { 0x19, 0, "VK_KEY_P"            , "AD10" },
+       { 0x10, 0, "VK_KEY_Q"            , "AD01" },
+       { 0x13, 0, "VK_KEY_R"            , "AD04" },
+       { 0x1F, 0, "VK_KEY_S"            , "AC02" },
+       { 0x14, 0, "VK_KEY_T"            , "AD05" },
+       { 0x16, 0, "VK_KEY_U"            , "AD07" },
+       { 0x2F, 0, "VK_KEY_V"            , "AB04" },
+       { 0x11, 0, "VK_KEY_W"            , "AD02" },
+       { 0x2D, 0, "VK_KEY_X"            , "AB02" },
+       { 0x15, 0, "VK_KEY_Y"            , "AD06" },
+       { 0x2C, 0, "VK_KEY_Z"            , "AB01" },
+       { 0x5B, 1, "VK_LWIN"             , "LWIN" },
+       { 0x5C, 1, "VK_RWIN"             , "RWIN" },
+       { 0x5D, 1, "VK_APPS"             , "COMP" },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x5F, 0, "VK_SLEEP"            , NULL   },
+       { 0x52, 0, "VK_NUMPAD0"          , "KP0"  },
+       { 0x4F, 0, "VK_NUMPAD1"          , "KP1"  },
+       { 0x50, 0, "VK_NUMPAD2"          , "KP2"  },
+       { 0x51, 0, "VK_NUMPAD3"          , "KP3"  },
+       { 0x4B, 0, "VK_NUMPAD4"          , "KP4"  },
+       { 0x4C, 0, "VK_NUMPAD5"          , "KP5"  },
+       { 0x4D, 0, "VK_NUMPAD6"          , "KP6"  },
+       { 0x47, 0, "VK_NUMPAD7"          , "KP7"  },
+       { 0x48, 0, "VK_NUMPAD8"          , "KP8"  },
+       { 0x49, 0, "VK_NUMPAD9"          , "KP9"  },
+       { 0x37, 0, "VK_MULTIPLY"         , "KPMU" },
+       { 0x4E, 0, "VK_ADD"              , "KPAD" },
+       { 0x00, 0, "VK_SEPARATOR"        , NULL   },
+       { 0x4A, 0, "VK_SUBTRACT"         , "KPSU" },
+       { 0x53, 0, "VK_DECIMAL"          , "KPDL" },
+       { 0x35, 0, "VK_DIVIDE"           , "KPDV" },
+       { 0x3B, 0, "VK_F1"               , "FK01" },
+       { 0x3C, 0, "VK_F2"               , "FK02" },
+       { 0x3D, 0, "VK_F3"               , "FK03" },
+       { 0x3E, 0, "VK_F4"               , "FK04" },
+       { 0x3F, 0, "VK_F5"               , "FK05" },
+       { 0x40, 0, "VK_F6"               , "FK06" },
+       { 0x41, 0, "VK_F7"               , "FK07" },
+       { 0x42, 0, "VK_F8"               , "FK08" },
+       { 0x43, 0, "VK_F9"               , "FK09" },
+       { 0x44, 0, "VK_F10"              , "FK10" },
+       { 0x57, 0, "VK_F11"              , "FK11" },
+       { 0x58, 0, "VK_F12"              , "FK12" },
+       { 0x64, 0, "VK_F13"              , NULL   },
+       { 0x65, 0, "VK_F14"              , NULL   },
+       { 0x66, 0, "VK_F15"              , NULL   },
+       { 0x67, 0, "VK_F16"              , NULL   },
+       { 0x68, 0, "VK_F17"              , NULL   },
+       { 0x69, 0, "VK_F18"              , NULL   },
+       { 0x6A, 0, "VK_F19"              , NULL   },
+       { 0x6B, 0, "VK_F20"              , NULL   },
+       { 0x6C, 0, "VK_F21"              , NULL   },
+       { 0x6D, 0, "VK_F22"              , NULL   },
+       { 0x6E, 0, "VK_F23"              , NULL   },
+       { 0x6F, 0, "VK_F24"              , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x45, 0, "VK_NUMLOCK"          , "NMLK" },
+       { 0x46, 0, "VK_SCROLL"           , "SCLK" },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x2A, 0, "VK_LSHIFT"           , NULL   },
+       { 0x36, 0, "VK_RSHIFT"           , "RTSH" },
+       { 0x1D, 0, "VK_LCONTROL"         , "LCTL" },
+       { 0x1D, 1, "VK_RCONTROL"         , "RCTL" },
+       { 0x38, 0, "VK_LMENU"            , NULL   },
+       { 0x38, 1, "VK_RMENU"            , "RALT" },
+       { 0x00, 0, "VK_BROWSER_BACK"     , NULL   },
+       { 0x00, 0, "VK_BROWSER_FORWARD"  , NULL   },
+       { 0x00, 0, "VK_BROWSER_REFRESH"  , NULL   },
+       { 0x00, 0, "VK_BROWSER_STOP"     , NULL   },
+       { 0x00, 0, "VK_BROWSER_SEARCH"   , NULL   },
+       { 0x00, 0, "VK_BROWSER_FAVORITES", NULL   },
+       { 0x00, 0, "VK_BROWSER_HOME"     , NULL   },
+       { 0x00, 0, "VK_VOLUME_MUTE"      , NULL   },
+       { 0x00, 0, "VK_VOLUME_DOWN"      , NULL   },
+       { 0x00, 0, "VK_VOLUME_UP"        , NULL   },
+       { 0x00, 0, "VK_MEDIA_NEXT_TRACK" , NULL   },
+       { 0x00, 0, "VK_MEDIA_PREV_TRACK" , NULL   },
+       { 0x00, 0, "VK_MEDIA_STOP"       , NULL   },
+       { 0x00, 0, "VK_MEDIA_PLAY_PAUSE" , NULL   },
+       { 0x00, 0, "VK_LAUNCH_MAIL"      , NULL   },
+       { 0x00, 0, "VK_MEDIA_SELECT"     , NULL   },
+       { 0x00, 0, "VK_LAUNCH_APP1"      , NULL   },
+       { 0x00, 0, "VK_LAUNCH_APP2"      , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x27, 0, "VK_OEM_1"            , "AC10" },
+       { 0x0D, 0, "VK_OEM_PLUS"         , "AE12" },
+       { 0x33, 0, "VK_OEM_COMMA"        , "AB08" },
+       { 0x0C, 0, "VK_OEM_MINUS"        , "AE11" },
+       { 0x34, 0, "VK_OEM_PERIOD"       , "AB09" },
+       { 0x35, 0, "VK_OEM_2"            , "AB10" },
+       { 0x29, 0, "VK_OEM_3"            , "TLDE" },
+       { 0x73, 0, "VK_ABNT_C1"          , "AB11" },
+       { 0x7E, 0, "VK_ABNT_C2"          , "I129" },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x1A, 0, "VK_OEM_4"            , "AD11" },
+       { 0x2B, 0, "VK_OEM_5"            , "BKSL" },
+       { 0x1B, 0, "VK_OEM_6"            , "AD12" },
+       { 0x28, 0, "VK_OEM_7"            , "AC11" },
+       { 0x1D, 0, "VK_OEM_8"            , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x56, 0, "VK_OEM_102"          , "LSGT" },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, "VK_PROCESSKEY"       , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, "VK_PACKET"           , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       { 0x00, 0, "VK_ATTN"             , NULL   },
+       { 0x00, 0, "VK_CRSEL"            , NULL   },
+       { 0x00, 0, "VK_EXSEL"            , NULL   },
+       { 0x00, 0, "VK_EREOF"            , NULL   },
+       { 0x00, 0, "VK_PLAY"             , NULL   },
+       { 0x62, 0, "VK_ZOOM"             , NULL   },
+       { 0x00, 0, "VK_NONAME"           , NULL   },
+       { 0x00, 0, "VK_PA1"              , NULL   },
+       { 0x00, 0, "VK_OEM_CLEAR"        , NULL   },
+       { 0x00, 0, ""                    , NULL   },
+       /* end of 256 VK entries */
+       { 0x54, 0, ""                    , "LVL3" },
+       { 0x1C, 1, ""                    , "KPEN" },
+};
+
+#endif /* __VKCODES_H */
diff --git a/include/freerdp/listener.h b/include/freerdp/listener.h
new file mode 100644 (file)
index 0000000..6b0a256
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RDP Server Listener
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_LISTENER_H
+#define __FREERDP_LISTENER_H
+
+typedef struct rdp_freerdp_listener freerdp_listener;
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/peer.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef boolean (*psListenerOpen)(freerdp_listener* instance, const char* bind_address, uint16 port);
+typedef boolean (*psListenerGetFileDescriptor)(freerdp_listener* instance, void** rfds, int* rcount);
+typedef boolean (*psListenerCheckFileDescriptor)(freerdp_listener* instance);
+typedef void (*psListenerClose)(freerdp_listener* instance);
+typedef void (*psPeerAccepted)(freerdp_listener* instance, freerdp_peer* client);
+
+struct rdp_freerdp_listener
+{
+       void* info;
+       void* listener;
+       void* param1;
+       void* param2;
+       void* param3;
+       void* param4;
+
+       psListenerOpen Open;
+       psListenerGetFileDescriptor GetFileDescriptor;
+       psListenerCheckFileDescriptor CheckFileDescriptor;
+       psListenerClose Close;
+
+       psPeerAccepted PeerAccepted;
+};
+
+FREERDP_API freerdp_listener* freerdp_listener_new(void);
+FREERDP_API void freerdp_listener_free(freerdp_listener* instance);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/include/freerdp/peer.h b/include/freerdp/peer.h
new file mode 100644 (file)
index 0000000..1650410
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RDP Server Peer
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FREERDP_PEER_H
+#define __FREERDP_PEER_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/input.h>
+#include <freerdp/update.h>
+
+typedef void (*psPeerContextNew)(freerdp_peer* client, rdpContext* context);
+typedef void (*psPeerContextFree)(freerdp_peer* client, rdpContext* context);
+
+typedef boolean (*psPeerInitialize)(freerdp_peer* client);
+typedef boolean (*psPeerGetFileDescriptor)(freerdp_peer* client, void** rfds, int* rcount);
+typedef boolean (*psPeerCheckFileDescriptor)(freerdp_peer* client);
+typedef void (*psPeerDisconnect)(freerdp_peer* client);
+typedef boolean (*psPeerCapabilities)(freerdp_peer* client);
+typedef boolean (*psPeerPostConnect)(freerdp_peer* client);
+typedef boolean (*psPeerActivate)(freerdp_peer* client);
+
+typedef int (*psPeerSendChannelData)(freerdp_peer* client, int channelId, uint8* data, int size);
+typedef int (*psPeerReceiveChannelData)(freerdp_peer* client, int channelId, uint8* data, int size, int flags, int total_size);
+
+struct rdp_freerdp_peer
+{
+       rdpContext* context;
+       int sockfd;
+       char hostname[50];
+
+       rdpInput* input;
+       rdpUpdate* update;
+       rdpSettings* settings;
+
+       size_t context_size;
+       psPeerContextNew ContextNew;
+       psPeerContextFree ContextFree;
+
+       psPeerInitialize Initialize;
+       psPeerGetFileDescriptor GetFileDescriptor;
+       psPeerCheckFileDescriptor CheckFileDescriptor;
+       psPeerDisconnect Disconnect;
+
+       psPeerCapabilities Capabilities;
+       psPeerPostConnect PostConnect;
+       psPeerActivate Activate;
+
+       psPeerSendChannelData SendChannelData;
+       psPeerReceiveChannelData ReceiveChannelData;
+};
+
+FREERDP_API void freerdp_peer_context_new(freerdp_peer* client);
+FREERDP_API void freerdp_peer_context_free(freerdp_peer* client);
+
+FREERDP_API freerdp_peer* freerdp_peer_new(int sockfd);
+FREERDP_API void freerdp_peer_free(freerdp_peer* client);
+
+#endif /* __FREERDP_PEER_H */
+
diff --git a/include/freerdp/plugins/cliprdr.h b/include/freerdp/plugins/cliprdr.h
new file mode 100644 (file)
index 0000000..2890a4b
--- /dev/null
@@ -0,0 +1,74 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Clipboard Virtual Channel Types
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CLIPRDR_PLUGIN
+#define __CLIPRDR_PLUGIN
+
+/**
+ * Event Types
+ */
+#define RDP_EVENT_TYPE_CB_MONITOR_READY                1
+#define RDP_EVENT_TYPE_CB_FORMAT_LIST          2
+#define RDP_EVENT_TYPE_CB_DATA_REQUEST         3
+#define RDP_EVENT_TYPE_CB_DATA_RESPONSE                4
+
+/**
+ * Clipboard Formats
+ */
+
+#define CB_FORMAT_RAW                  0x0000
+#define CB_FORMAT_TEXT                 0x0001
+#define CB_FORMAT_DIB                  0x0008
+#define CB_FORMAT_UNICODETEXT          0x000D
+#define CB_FORMAT_HTML                 0xD010
+#define CB_FORMAT_PNG                  0xD011
+#define CB_FORMAT_JPEG                 0xD012
+#define CB_FORMAT_GIF                  0xD013
+
+/**
+ * Clipboard Events
+ */
+typedef RDP_EVENT RDP_CB_MONITOR_READY_EVENT;
+
+struct _RDP_CB_FORMAT_LIST_EVENT
+{
+       RDP_EVENT event;
+       uint32* formats;
+       uint16 num_formats;
+       uint8* raw_format_data;
+       uint32 raw_format_data_size;
+};
+typedef struct _RDP_CB_FORMAT_LIST_EVENT RDP_CB_FORMAT_LIST_EVENT;
+
+struct _RDP_CB_DATA_REQUEST_EVENT
+{
+       RDP_EVENT event;
+       uint32 format;
+};
+typedef struct _RDP_CB_DATA_REQUEST_EVENT RDP_CB_DATA_REQUEST_EVENT;
+
+struct _RDP_CB_DATA_RESPONSE_EVENT
+{
+       RDP_EVENT event;
+       uint8* data;
+       uint32 size;
+};
+typedef struct _RDP_CB_DATA_RESPONSE_EVENT RDP_CB_DATA_RESPONSE_EVENT;
+
+#endif /* __CLIPRDR_PLUGIN */
diff --git a/include/freerdp/plugins/tsmf.h b/include/freerdp/plugins/tsmf.h
new file mode 100644 (file)
index 0000000..6df4964
--- /dev/null
@@ -0,0 +1,64 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Multimedia Redirection Virtual Channel Types
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TSMF_PLUGIN
+#define __TSMF_PLUGIN
+
+/**
+ * Event Types
+ */
+enum RDP_EVENT_TYPE_TSMF
+{
+       RDP_EVENT_TYPE_TSMF_VIDEO_FRAME = 1,
+       RDP_EVENT_TYPE_TSMF_REDRAW
+};
+
+struct _RDP_VIDEO_FRAME_EVENT
+{
+       RDP_EVENT event;
+       uint8* frame_data;
+       uint32 frame_size;
+       uint32 frame_pixfmt;
+       sint16 frame_width;
+       sint16 frame_height;
+       sint16 x;
+       sint16 y;
+       sint16 width;
+       sint16 height;
+       uint16 num_visible_rects;
+       RDP_RECT* visible_rects;
+};
+typedef struct _RDP_VIDEO_FRAME_EVENT RDP_VIDEO_FRAME_EVENT;
+
+struct _RDP_REDRAW_EVENT
+{
+       RDP_EVENT event;
+       sint16 x;
+       sint16 y;
+       sint16 width;
+       sint16 height;
+};
+typedef struct _RDP_REDRAW_EVENT RDP_REDRAW_EVENT;
+
+/* RDP_VIDEO_FRAME_EVENT.frame_pixfmt */
+/* http://www.fourcc.org/yuv.php */
+#define RDP_PIXFMT_I420                0x30323449
+#define RDP_PIXFMT_YV12                0x32315659
+
+#endif /* __TSMF_PLUGIN */
diff --git a/include/freerdp/pointer.h b/include/freerdp/pointer.h
new file mode 100644 (file)
index 0000000..b8170fe
--- /dev/null
@@ -0,0 +1,102 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Pointer Updates Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_POINTER_H
+#define __UPDATE_POINTER_H
+
+#include <freerdp/types.h>
+
+#define PTR_MSG_TYPE_SYSTEM            0x0001
+#define PTR_MSG_TYPE_POSITION          0x0003
+#define PTR_MSG_TYPE_COLOR             0x0006
+#define PTR_MSG_TYPE_CACHED            0x0007
+#define PTR_MSG_TYPE_POINTER           0x0008
+
+#define SYSPTR_NULL                    0x00000000
+#define SYSPTR_DEFAULT                 0x00007F00
+
+struct _POINTER_POSITION_UPDATE
+{
+       uint32 xPos;
+       uint32 yPos;
+};
+typedef struct _POINTER_POSITION_UPDATE POINTER_POSITION_UPDATE;
+
+struct _POINTER_SYSTEM_UPDATE
+{
+       uint32 type;
+};
+typedef struct _POINTER_SYSTEM_UPDATE POINTER_SYSTEM_UPDATE;
+
+struct _POINTER_COLOR_UPDATE
+{
+       uint32 cacheIndex;
+       uint32 xPos;
+       uint32 yPos;
+       uint32 width;
+       uint32 height;
+       uint32 lengthAndMask;
+       uint32 lengthXorMask;
+       uint8* xorMaskData;
+       uint8* andMaskData;
+};
+typedef struct _POINTER_COLOR_UPDATE POINTER_COLOR_UPDATE;
+
+struct _POINTER_NEW_UPDATE
+{
+       uint32 xorBpp;
+       POINTER_COLOR_UPDATE colorPtrAttr;
+};
+typedef struct _POINTER_NEW_UPDATE POINTER_NEW_UPDATE;
+
+struct _POINTER_CACHED_UPDATE
+{
+       uint32 cacheIndex;
+};
+typedef struct _POINTER_CACHED_UPDATE POINTER_CACHED_UPDATE;
+
+typedef void (*pPointerPosition)(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position);
+typedef void (*pPointerSystem)(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system);
+typedef void (*pPointerColor)(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color);
+typedef void (*pPointerNew)(rdpContext* context, POINTER_NEW_UPDATE* pointer_new);
+typedef void (*pPointerCached)(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached);
+
+struct rdp_pointer_update
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       pPointerPosition PointerPosition; /* 16 */
+       pPointerSystem PointerSystem; /* 17 */
+       pPointerColor PointerColor; /* 18 */
+       pPointerNew PointerNew; /* 19 */
+       pPointerCached PointerCached; /* 20 */
+       uint32 paddingB[32 - 21]; /* 21 */
+
+       /* internal */
+
+       POINTER_POSITION_UPDATE pointer_position;
+       POINTER_SYSTEM_UPDATE pointer_system;
+       POINTER_COLOR_UPDATE pointer_color;
+       POINTER_NEW_UPDATE pointer_new;
+       POINTER_CACHED_UPDATE pointer_cached;
+};
+typedef struct rdp_pointer_update rdpPointerUpdate;
+
+#endif /* __UPDATE_POINTER_H */
diff --git a/include/freerdp/primary.h b/include/freerdp/primary.h
new file mode 100644 (file)
index 0000000..d3b7488
--- /dev/null
@@ -0,0 +1,495 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Primary Drawing Orders Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_PRIMARY_H
+#define __UPDATE_PRIMARY_H
+
+#include <freerdp/types.h>
+
+struct rdp_bounds
+{
+       sint32 left;
+       sint32 top;
+       sint32 right;
+       sint32 bottom;
+};
+typedef struct rdp_bounds rdpBounds;
+
+struct rdp_brush
+{
+       uint32 x;
+       uint32 y;
+       uint32 bpp;
+       uint32 style;
+       uint32 hatch;
+       uint32 index;
+       uint8* data;
+       uint8 p8x8[8];
+};
+typedef struct rdp_brush rdpBrush;
+
+struct _ORDER_INFO
+{
+       uint32 orderType;
+       uint32 fieldFlags;
+       rdpBounds bounds;
+       sint32 deltaBoundLeft;
+       sint32 deltaBoundTop;
+       sint32 deltaBoundRight;
+       sint32 deltaBoundBottom;
+       boolean deltaCoordinates;
+};
+typedef struct _ORDER_INFO ORDER_INFO;
+
+struct _DSTBLT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+};
+typedef struct _DSTBLT_ORDER DSTBLT_ORDER;
+
+struct _PATBLT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       uint32 backColor;
+       uint32 foreColor;
+       rdpBrush brush;
+};
+typedef struct _PATBLT_ORDER PATBLT_ORDER;
+
+struct _SCRBLT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       sint32 nXSrc;
+       sint32 nYSrc;
+};
+typedef struct _SCRBLT_ORDER SCRBLT_ORDER;
+
+struct _OPAQUE_RECT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 color;
+};
+typedef struct _OPAQUE_RECT_ORDER OPAQUE_RECT_ORDER;
+
+struct _DRAW_NINE_GRID_ORDER
+{
+       sint32 srcLeft;
+       sint32 srcTop;
+       sint32 srcRight;
+       sint32 srcBottom;
+       uint32 bitmapId;
+};
+typedef struct _DRAW_NINE_GRID_ORDER DRAW_NINE_GRID_ORDER;
+
+struct _DELTA_RECT
+{
+       sint32 left;
+       sint32 top;
+       sint32 width;
+       sint32 height;
+};
+typedef struct _DELTA_RECT DELTA_RECT;
+
+struct _MULTI_DSTBLT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       uint32 numRectangles;
+       uint32 cbData;
+       DELTA_RECT rectangles[45];
+};
+typedef struct _MULTI_DSTBLT_ORDER MULTI_DSTBLT_ORDER;
+
+struct _MULTI_PATBLT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       uint32 backColor;
+       uint32 foreColor;
+       rdpBrush brush;
+       uint32 numRectangles;
+       uint32 cbData;
+       DELTA_RECT rectangles[45];
+};
+typedef struct _MULTI_PATBLT_ORDER MULTI_PATBLT_ORDER;
+
+struct _MULTI_SCRBLT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       sint32 nXSrc;
+       sint32 nYSrc;
+       uint32 numRectangles;
+       uint32 cbData;
+       DELTA_RECT rectangles[45];
+};
+typedef struct _MULTI_SCRBLT_ORDER MULTI_SCRBLT_ORDER;
+
+struct _MULTI_OPAQUE_RECT_ORDER
+{
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 color;
+       uint32 numRectangles;
+       uint32 cbData;
+       DELTA_RECT rectangles[45];
+};
+typedef struct _MULTI_OPAQUE_RECT_ORDER MULTI_OPAQUE_RECT_ORDER;
+
+struct _MULTI_DRAW_NINE_GRID_ORDER
+{
+       sint32 srcLeft;
+       sint32 srcTop;
+       sint32 srcRight;
+       sint32 srcBottom;
+       uint32 bitmapId;
+       uint32 nDeltaEntries;
+       uint32 cbData;
+       uint8* codeDeltaList;
+};
+typedef struct _MULTI_DRAW_NINE_GRID_ORDER MULTI_DRAW_NINE_GRID_ORDER;
+
+struct _LINE_TO_ORDER
+{
+       uint32 backMode;
+       sint32 nXStart;
+       sint32 nYStart;
+       sint32 nXEnd;
+       sint32 nYEnd;
+       uint32 backColor;
+       uint32 bRop2;
+       uint32 penStyle;
+       uint32 penWidth;
+       uint32 penColor;
+};
+typedef struct _LINE_TO_ORDER LINE_TO_ORDER;
+
+struct _DELTA_POINT
+{
+       sint32 x;
+       sint32 y;
+};
+typedef struct _DELTA_POINT DELTA_POINT;
+
+struct _POLYLINE_ORDER
+{
+       sint32 xStart;
+       sint32 yStart;
+       uint32 bRop2;
+       uint32 penColor;
+       uint32 numPoints;
+       uint32 cbData;
+       DELTA_POINT* points;
+};
+typedef struct _POLYLINE_ORDER POLYLINE_ORDER;
+
+struct _MEMBLT_ORDER
+{
+       uint32 cacheId;
+       uint32 colorIndex;
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       sint32 nXSrc;
+       sint32 nYSrc;
+       uint32 cacheIndex;
+       rdpBitmap* bitmap;
+};
+typedef struct _MEMBLT_ORDER MEMBLT_ORDER;
+
+struct _MEM3BLT_ORDER
+{
+       uint32 cacheId;
+       uint32 colorIndex;
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nWidth;
+       sint32 nHeight;
+       uint32 bRop;
+       sint32 nXSrc;
+       sint32 nYSrc;
+       uint32 backColor;
+       uint32 foreColor;
+       rdpBrush brush;
+       uint32 cacheIndex;
+       rdpBitmap* bitmap;
+};
+typedef struct _MEM3BLT_ORDER MEM3BLT_ORDER;
+
+struct _SAVE_BITMAP_ORDER
+{
+       uint32 savedBitmapPosition;
+       sint32 nLeftRect;
+       sint32 nTopRect;
+       sint32 nRightRect;
+       sint32 nBottomRect;
+       uint32 operation;
+};
+typedef struct _SAVE_BITMAP_ORDER SAVE_BITMAP_ORDER;
+
+struct _GLYPH_FRAGMENT_INDEX
+{
+       uint32 index;
+       uint32 delta;
+};
+typedef struct _GLYPH_FRAGMENT_INDEX GLYPH_FRAGMENT_INDEX;
+
+struct _GLYPH_FRAGMENT
+{
+       uint32 operation;
+       uint32 index;
+       uint32 size;
+       uint32 nindices;
+       GLYPH_FRAGMENT_INDEX* indices;
+};
+typedef struct _GLYPH_FRAGMENT GLYPH_FRAGMENT;
+
+struct _GLYPH_INDEX_ORDER
+{
+       uint32 cacheId;
+       uint32 flAccel;
+       uint32 ulCharInc;
+       uint32 fOpRedundant;
+       uint32 backColor;
+       uint32 foreColor;
+       sint32 bkLeft;
+       sint32 bkTop;
+       sint32 bkRight;
+       sint32 bkBottom;
+       sint32 opLeft;
+       sint32 opTop;
+       sint32 opRight;
+       sint32 opBottom;
+       rdpBrush brush;
+       sint32 x;
+       sint32 y;
+       uint32 cbData;
+       uint8 data[256];
+};
+typedef struct _GLYPH_INDEX_ORDER GLYPH_INDEX_ORDER;
+
+struct _FAST_INDEX_ORDER
+{
+       uint32 cacheId;
+       uint32 flAccel;
+       uint32 ulCharInc;
+       uint32 backColor;
+       uint32 foreColor;
+       sint32 bkLeft;
+       sint32 bkTop;
+       sint32 bkRight;
+       sint32 bkBottom;
+       sint32 opLeft;
+       sint32 opTop;
+       sint32 opRight;
+       sint32 opBottom;
+       boolean opaqueRect;
+       sint32 x;
+       sint32 y;
+       uint32 cbData;
+       uint8 data[256];
+};
+typedef struct _FAST_INDEX_ORDER FAST_INDEX_ORDER;
+
+struct _FAST_GLYPH_ORDER
+{
+       uint32 cacheId;
+       uint32 flAccel;
+       uint32 ulCharInc;
+       uint32 backColor;
+       uint32 foreColor;
+       sint32 bkLeft;
+       sint32 bkTop;
+       sint32 bkRight;
+       sint32 bkBottom;
+       sint32 opLeft;
+       sint32 opTop;
+       sint32 opRight;
+       sint32 opBottom;
+       sint32 x;
+       sint32 y;
+       uint32 cbData;
+       uint8 data[256];
+       void* glyph_data;
+};
+typedef struct _FAST_GLYPH_ORDER FAST_GLYPH_ORDER;
+
+struct _POLYGON_SC_ORDER
+{
+       sint32 xStart;
+       sint32 yStart;
+       uint32 bRop2;
+       uint32 fillMode;
+       uint32 brushColor;
+       uint32 nDeltaEntries;
+       uint32 cbData;
+       uint8* codeDeltaList;
+};
+typedef struct _POLYGON_SC_ORDER POLYGON_SC_ORDER;
+
+struct _POLYGON_CB_ORDER
+{
+       sint32 xStart;
+       sint32 yStart;
+       uint32 bRop2;
+       uint32 fillMode;
+       uint32 backColor;
+       uint32 foreColor;
+       rdpBrush brush;
+       uint32 nDeltaEntries;
+       uint32 cbData;
+       uint8* codeDeltaList;
+};
+typedef struct _POLYGON_CB_ORDER POLYGON_CB_ORDER;
+
+struct _ELLIPSE_SC_ORDER
+{
+       sint32 leftRect;
+       sint32 topRect;
+       sint32 rightRect;
+       sint32 bottomRect;
+       uint32 bRop2;
+       uint32 fillMode;
+       uint32 color;
+};
+typedef struct _ELLIPSE_SC_ORDER ELLIPSE_SC_ORDER;
+
+struct _ELLIPSE_CB_ORDER
+{
+       sint32 leftRect;
+       sint32 topRect;
+       sint32 rightRect;
+       sint32 bottomRect;
+       uint32 bRop2;
+       uint32 fillMode;
+       uint32 backColor;
+       uint32 foreColor;
+       rdpBrush brush;
+};
+typedef struct _ELLIPSE_CB_ORDER ELLIPSE_CB_ORDER;
+
+typedef void (*pDstBlt)(rdpContext* context, DSTBLT_ORDER* dstblt);
+typedef void (*pPatBlt)(rdpContext* context, PATBLT_ORDER* patblt);
+typedef void (*pScrBlt)(rdpContext* context, SCRBLT_ORDER* scrblt);
+typedef void (*pOpaqueRect)(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect);
+typedef void (*pDrawNineGrid)(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid);
+typedef void (*pMultiDstBlt)(rdpContext* context, MULTI_DSTBLT_ORDER* multi_dstblt);
+typedef void (*pMultiPatBlt)(rdpContext* context, MULTI_PATBLT_ORDER* multi_patblt);
+typedef void (*pMultiScrBlt)(rdpContext* context, MULTI_SCRBLT_ORDER* multi_scrblt);
+typedef void (*pMultiOpaqueRect)(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect);
+typedef void (*pMultiDrawNineGrid)(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid);
+typedef void (*pLineTo)(rdpContext* context, LINE_TO_ORDER* line_to);
+typedef void (*pPolyline)(rdpContext* context, POLYLINE_ORDER* polyline);
+typedef void (*pMemBlt)(rdpContext* context, MEMBLT_ORDER* memblt);
+typedef void (*pMem3Blt)(rdpContext* context, MEM3BLT_ORDER* memblt);
+typedef void (*pSaveBitmap)(rdpContext* context, SAVE_BITMAP_ORDER* save_bitmap);
+typedef void (*pGlyphIndex)(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index);
+typedef void (*pFastIndex)(rdpContext* context, FAST_INDEX_ORDER* fast_index);
+typedef void (*pFastGlyph)(rdpContext* context, FAST_GLYPH_ORDER* fast_glyph);
+typedef void (*pPolygonSC)(rdpContext* context, POLYGON_SC_ORDER* polygon_sc);
+typedef void (*pPolygonCB)(rdpContext* context, POLYGON_CB_ORDER* polygon_cb);
+typedef void (*pEllipseSC)(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc);
+typedef void (*pEllipseCB)(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb);
+
+struct rdp_primary_update
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       pDstBlt DstBlt; /* 16 */
+       pPatBlt PatBlt; /* 17 */
+       pScrBlt ScrBlt; /* 18 */
+       pOpaqueRect OpaqueRect; /* 19 */
+       pDrawNineGrid DrawNineGrid; /* 20 */
+       pMultiDstBlt MultiDstBlt; /* 21 */
+       pMultiPatBlt MultiPatBlt; /* 22 */
+       pMultiScrBlt MultiScrBlt; /* 23 */
+       pMultiOpaqueRect MultiOpaqueRect; /* 24 */
+       pMultiDrawNineGrid MultiDrawNineGrid; /* 25 */
+       pLineTo LineTo; /* 26 */
+       pPolyline Polyline; /* 27 */
+       pMemBlt MemBlt; /* 28 */
+       pMem3Blt Mem3Blt; /* 29 */
+       pSaveBitmap SaveBitmap; /* 30 */
+       pGlyphIndex GlyphIndex; /* 31 */
+       pFastIndex FastIndex; /* 32 */
+       pFastGlyph FastGlyph; /* 33 */
+       pPolygonSC PolygonSC; /* 34 */
+       pPolygonCB PolygonCB; /* 35 */
+       pEllipseSC EllipseSC; /* 36 */
+       pEllipseCB EllipseCB; /* 37 */
+       uint32 paddingB[48 - 38]; /* 38 */
+
+       /* internal */
+
+       ORDER_INFO order_info;
+       DSTBLT_ORDER dstblt;
+       PATBLT_ORDER patblt;
+       SCRBLT_ORDER scrblt;
+       OPAQUE_RECT_ORDER opaque_rect;
+       DRAW_NINE_GRID_ORDER draw_nine_grid;
+       MULTI_DSTBLT_ORDER multi_dstblt;
+       MULTI_PATBLT_ORDER multi_patblt;
+       MULTI_SCRBLT_ORDER multi_scrblt;
+       MULTI_OPAQUE_RECT_ORDER multi_opaque_rect;
+       MULTI_DRAW_NINE_GRID_ORDER multi_draw_nine_grid;
+       LINE_TO_ORDER line_to;
+       POLYLINE_ORDER polyline;
+       MEMBLT_ORDER memblt;
+       MEM3BLT_ORDER mem3blt;
+       SAVE_BITMAP_ORDER save_bitmap;
+       GLYPH_INDEX_ORDER glyph_index;
+       FAST_INDEX_ORDER fast_index;
+       FAST_GLYPH_ORDER fast_glyph;
+       POLYGON_SC_ORDER polygon_sc;
+       POLYGON_CB_ORDER polygon_cb;
+       ELLIPSE_SC_ORDER ellipse_sc;
+       ELLIPSE_CB_ORDER ellipse_cb;
+};
+typedef struct rdp_primary_update rdpPrimaryUpdate;
+
+#endif /* __UPDATE_PRIMARY_H */
diff --git a/include/freerdp/rail.h b/include/freerdp/rail.h
new file mode 100644 (file)
index 0000000..840e7f0
--- /dev/null
@@ -0,0 +1,344 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Remote Applications Integrated Locally (RAIL)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_GLOBAL_H
+#define __RAIL_GLOBAL_H
+
+#include <freerdp/types.h>
+
+/* RAIL PDU flags */
+#define RAIL_EXEC_FLAG_EXPAND_WORKINGDIRECTORY         0x0001
+#define RAIL_EXEC_FLAG_TRANSLATE_FILES                 0x0002
+#define RAIL_EXEC_FLAG_FILE                            0x0004
+#define RAIL_EXEC_FLAG_EXPAND_ARGUMENTS                        0x0008
+
+/* Notification Icon Balloon Tooltip */
+#define NIIF_NONE                                      0x00000000
+#define NIIF_INFO                                      0x00000001
+#define NIIF_WARNING                                   0x00000002
+#define NIIF_ERROR                                     0x00000003
+#define NIIF_NOSOUND                                   0x00000010
+#define NIIF_LARGE_ICON                                        0x00000020
+
+/* Client Execute PDU Flags */
+#define RAIL_EXEC_FLAG_EXPAND_WORKING_DIRECTORY                0x0001
+#define RAIL_EXEC_FLAG_TRANSLATE_FILES                 0x0002
+#define RAIL_EXEC_FLAG_FILE                            0x0004
+#define RAIL_EXEC_FLAG_EXPAND_ARGUMENTS                        0x0008
+
+/* Server Execute Result PDU */
+#define RAIL_EXEC_S_OK                                 0x0000
+#define RAIL_EXEC_E_HOOK_NOT_LOADED                    0x0001
+#define RAIL_EXEC_E_DECODE_FAILED                      0x0002
+#define RAIL_EXEC_E_NOT_IN_ALLOWLIST                   0x0003
+#define RAIL_EXEC_E_FILE_NOT_FOUND                     0x0005
+#define RAIL_EXEC_E_FAIL                               0x0006
+#define RAIL_EXEC_E_SESSION_LOCKED                     0x0007
+
+/* Client System Parameters Update PDU */
+#define SPI_SET_DRAG_FULL_WINDOWS                      0x00000025
+#define SPI_SET_KEYBOARD_CUES                          0x0000100B
+#define SPI_SET_KEYBOARD_PREF                          0x00000045
+#define SPI_SET_MOUSE_BUTTON_SWAP                      0x00000021
+#define SPI_SET_WORK_AREA                              0x0000002F
+#define SPI_DISPLAY_CHANGE                             0x0000F001
+#define SPI_TASKBAR_POS                                        0x0000F000
+#define SPI_SET_HIGH_CONTRAST                          0x00000043
+
+/* Server System Parameters Update PDU */
+#define SPI_SET_SCREEN_SAVE_ACTIVE                     0x00000011
+#define SPI_SET_SCREEN_SAVE_SECURE                     0x00000077
+
+/*Bit mask values for SPI_ parameters*/
+enum SPI_MASK
+{
+       SPI_MASK_SET_DRAG_FULL_WINDOWS          = 0x00000001,
+       SPI_MASK_SET_KEYBOARD_CUES                      = 0x00000002,
+       SPI_MASK_SET_KEYBOARD_PREF                      = 0x00000004,
+       SPI_MASK_SET_MOUSE_BUTTON_SWAP          = 0x00000008,
+       SPI_MASK_SET_WORK_AREA                          = 0x00000010,
+       SPI_MASK_DISPLAY_CHANGE                         = 0x00000020,
+       SPI_MASK_TASKBAR_POS                            = 0x00000040,
+       SPI_MASK_SET_HIGH_CONTRAST                      = 0x00000080,
+       SPI_MASK_SET_SCREEN_SAVE_ACTIVE         = 0x00000100,
+       SPI_MASK_SET_SET_SCREEN_SAVE_SECURE = 0x00000200
+};
+
+
+/* Client System Command PDU */
+#define SC_SIZE                                                0xF000
+#define SC_MOVE                                                0xF010
+#define SC_MINIMIZE                                    0xF020
+#define SC_MAXIMIZE                                    0xF030
+#define SC_CLOSE                                       0xF060
+#define SC_KEYMENU                                     0xF100
+#define SC_RESTORE                                     0xF120
+#define SC_DEFAULT                                     0xF160
+
+/* Client Notify Event PDU */
+#ifndef _WIN32
+#define WM_LBUTTONDOWN                                 0x00000201
+#define WM_LBUTTONUP                                   0x00000202
+#define WM_RBUTTONDOWN                                 0x00000204
+#define WM_RBUTTONUP                                   0x00000205
+#define WM_CONTEXTMENU                                 0x0000007B
+#define WM_LBUTTONDBLCLK                               0x00000203
+#define WM_RBUTTONDBLCLK                               0x00000206
+
+#define NIN_SELECT                                     0x00000400
+#define NIN_KEYSELECT                                  0x00000401
+#define NIN_BALLOONSHOW                                        0x00000402
+#define NIN_BALLOONHIDE                                        0x00000403
+#define NIN_BALLOONTIMEOUT                             0x00000404
+#define NIN_BALLOONUSERCLICK                           0x00000405
+#endif
+
+/* Client Information PDU */
+#define RAIL_CLIENTSTATUS_ALLOWLOCALMOVESIZE           0x00000001
+#define RAIL_CLIENTSTATUS_AUTORECONNECT                        0x00000002
+
+/* HIGHCONTRAST flags values */
+#define HCF_AVAILABLE                                  0x00000002
+#define HCF_CONFIRMHOTKEY                              0x00000008
+#define HCF_HIGHCONTRASTON                             0x00000001
+#define HCF_HOTKEYACTIVE                               0x00000004
+#define HCF_HOTKEYAVAILABLE                            0x00000040
+#define HCF_HOTKEYSOUND                                0x00000010
+#define HCF_INDICATOR                                  0x00000020
+
+/* Server Move/Size Start PDU */
+#define RAIL_WMSZ_LEFT                                 0x0001
+#define RAIL_WMSZ_RIGHT                                        0x0002
+#define RAIL_WMSZ_TOP                                  0x0003
+#define RAIL_WMSZ_TOPLEFT                              0x0004
+#define RAIL_WMSZ_TOPRIGHT                             0x0005
+#define RAIL_WMSZ_BOTTOM                               0x0006
+#define RAIL_WMSZ_BOTTOMLEFT                           0x0007
+#define RAIL_WMSZ_BOTTOMRIGHT                          0x0008
+#define RAIL_WMSZ_MOVE                                 0x0009
+#define RAIL_WMSZ_KEYMOVE                              0x000A
+#define RAIL_WMSZ_KEYSIZE                              0x000B
+
+/* Language Bar Information PDU */
+#define TF_SFT_SHOWNORMAL                              0x00000001
+#define TF_SFT_DOCK                                    0x00000002
+#define TF_SFT_MINIMIZED                               0x00000004
+#define TF_SFT_HIDDEN                                  0x00000008
+#define TF_SFT_NOTRANSPARENCY                          0x00000010
+#define TF_SFT_LOWTRANSPARENCY                         0x00000020
+#define TF_SFT_HIGHTRANSPARENCY                                0x00000040
+#define TF_SFT_LABELS                                  0x00000080
+#define TF_SFT_NOLABELS                                        0x00000100
+#define TF_SFT_EXTRAICONSONMINIMIZED                   0x00000200
+#define TF_SFT_NOEXTRAICONSONMINIMIZED                 0x00000400
+#define TF_SFT_DESKBAND                                        0x00000800
+
+struct _UNICODE_STRING
+{
+       uint16 length;
+       uint8* string;
+};
+typedef struct _UNICODE_STRING UNICODE_STRING;
+
+struct _HIGH_CONTRAST
+{
+       uint32 flags;
+       uint32 colorSchemeLength;
+       UNICODE_STRING colorScheme;
+};
+typedef struct _HIGH_CONTRAST HIGH_CONTRAST;
+
+/* RAIL Orders */
+
+struct _RAIL_HANDSHAKE_ORDER
+{
+       uint32 buildNumber;
+};
+typedef struct _RAIL_HANDSHAKE_ORDER RAIL_HANDSHAKE_ORDER;
+
+struct _RAIL_CLIENT_STATUS_ORDER
+{
+       uint32 flags;
+};
+typedef struct _RAIL_CLIENT_STATUS_ORDER RAIL_CLIENT_STATUS_ORDER;
+
+struct _RAIL_EXEC_ORDER
+{
+       uint16 flags;
+       UNICODE_STRING exeOrFile;
+       UNICODE_STRING workingDir;
+       UNICODE_STRING arguments;
+};
+typedef struct _RAIL_EXEC_ORDER RAIL_EXEC_ORDER;
+
+struct _RAIL_EXEC_RESULT_ORDER
+{
+       uint16 flags;
+       uint16 execResult;
+       uint32 rawResult;
+       UNICODE_STRING exeOrFile;
+};
+typedef struct _RAIL_EXEC_RESULT_ORDER RAIL_EXEC_RESULT_ORDER;
+
+struct _RAIL_SYSPARAM_ORDER
+{
+       uint32 param;
+       uint32 params;
+       boolean dragFullWindows;
+       boolean keyboardCues;
+       boolean keyboardPref;
+       boolean mouseButtonSwap;
+       RECTANGLE_16 workArea;
+       RECTANGLE_16 displayChange;
+       RECTANGLE_16 taskbarPos;
+       HIGH_CONTRAST highContrast;
+       boolean setScreenSaveActive;
+       boolean setScreenSaveSecure;
+};
+typedef struct _RAIL_SYSPARAM_ORDER RAIL_SYSPARAM_ORDER;
+
+struct _RAIL_ACTIVATE_ORDER
+{
+       uint32 windowId;
+       boolean enabled;
+};
+typedef struct _RAIL_ACTIVATE_ORDER RAIL_ACTIVATE_ORDER;
+
+struct _RAIL_SYSMENU_ORDER
+{
+       uint32 windowId;
+       uint16 left;
+       uint16 top;
+};
+typedef struct _RAIL_SYSMENU_ORDER RAIL_SYSMENU_ORDER;
+
+struct _RAIL_SYSCOMMAND_ORDER
+{
+       uint32 windowId;
+       uint16 command;
+};
+typedef struct _RAIL_SYSCOMMAND_ORDER RAIL_SYSCOMMAND_ORDER;
+
+struct _RAIL_NOTIFY_EVENT_ORDER
+{
+       uint32 windowId;
+       uint32 notifyIconId;
+       uint32 message;
+};
+typedef struct _RAIL_NOTIFY_EVENT_ORDER RAIL_NOTIFY_EVENT_ORDER;
+
+struct _RAIL_MINMAXINFO_ORDER
+{
+       uint32 windowId;
+       uint16 maxWidth;
+       uint16 maxHeight;
+       uint16 maxPosX;
+       uint16 maxPosY;
+       uint16 minTrackWidth;
+       uint16 minTrackHeight;
+       uint16 maxTrackWidth;
+       uint16 maxTrackHeight;
+};
+typedef struct _RAIL_MINMAXINFO_ORDER RAIL_MINMAXINFO_ORDER;
+
+struct _RAIL_LOCALMOVESIZE_ORDER
+{
+       uint32 windowId;
+       boolean isMoveSizeStart;
+       uint16 moveSizeType;
+       uint16 posX;
+       uint16 posY;
+};
+typedef struct _RAIL_LOCALMOVESIZE_ORDER RAIL_LOCALMOVESIZE_ORDER;
+
+struct _RAIL_WINDOWMOVE_ORDER
+{
+       uint32 windowId;
+       uint16 left;
+       uint16 top;
+       uint16 right;
+       uint16 bottom;
+};
+typedef struct _RAIL_WINDOWMOVE_ORDER RAIL_WINDOW_MOVE_ORDER;
+
+struct _RAIL_GET_APPID_REQ_ORDER
+{
+       uint32 windowId;
+};
+typedef struct _RAIL_GET_APPID_REQ_ORDER RAIL_GET_APPID_REQ_ORDER;
+
+struct _RAIL_GET_APPID_RESP_ORDER
+{
+       uint32 windowId;
+       UNICODE_STRING applicationId;
+       uint8 applicationIdBuffer[512];
+};
+typedef struct _RAIL_GET_APPID_RESP_ORDER RAIL_GET_APPID_RESP_ORDER;
+
+struct _RAIL_LANGBARINFO_ORDER
+{
+       uint32 languageBarStatus;
+};
+typedef struct _RAIL_LANGBARINFO_ORDER RAIL_LANGBAR_INFO_ORDER;
+
+/* RAIL Constants */
+
+enum RDP_RAIL_PDU_TYPE
+{
+       RDP_RAIL_ORDER_EXEC             = 0x0001,
+       RDP_RAIL_ORDER_ACTIVATE         = 0x0002,
+       RDP_RAIL_ORDER_SYSPARAM         = 0x0003,
+       RDP_RAIL_ORDER_SYSCOMMAND       = 0x0004,
+       RDP_RAIL_ORDER_HANDSHAKE        = 0x0005,
+       RDP_RAIL_ORDER_NOTIFY_EVENT     = 0x0006,
+       RDP_RAIL_ORDER_WINDOWMOVE       = 0x0008,
+       RDP_RAIL_ORDER_LOCALMOVESIZE    = 0x0009,
+       RDP_RAIL_ORDER_MINMAXINFO       = 0x000A,
+       RDP_RAIL_ORDER_CLIENTSTATUS     = 0x000B,
+       RDP_RAIL_ORDER_SYSMENU          = 0x000C,
+       RDP_RAIL_ORDER_LANGBARINFO      = 0x000D,
+       RDP_RAIL_ORDER_EXEC_RESULT      = 0x0080,
+       RDP_RAIL_ORDER_GET_APPID_REQ    = 0x000E,
+       RDP_RAIL_ORDER_GET_APPID_RESP   = 0x000F
+};
+
+enum RDP_EVENT_TYPE_RAIL
+{
+       RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS = 1,
+       RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS,
+       RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM,
+       RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO,
+       RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE,
+       RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP,
+       RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO,
+
+       RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS,
+       RDP_EVENT_TYPE_RAIL_CLIENT_EXEC_REMOTE_APP,
+       RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE,
+       RDP_EVENT_TYPE_RAIL_CLIENT_SYSMENU,
+       RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND,
+       RDP_EVENT_TYPE_RAIL_CLIENT_NOTIFY_EVENT,
+       RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE,
+       RDP_EVENT_TYPE_RAIL_CLIENT_APPID_REQ,
+       RDP_EVENT_TYPE_RAIL_CLIENT_LANGBARINFO
+};
+
+#endif /* __RAIL_GLOBAL_H */
+
diff --git a/include/freerdp/rail/icon.h b/include/freerdp/rail/icon.h
new file mode 100644 (file)
index 0000000..448434b
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Window Icon Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_ICON_CACHE_H
+#define __RAIL_ICON_CACHE_H
+
+#include <freerdp/api.h>
+#include <freerdp/rail.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_icon rdpIcon;
+typedef struct rdp_icon_cache rdpIconCache;
+
+#include <freerdp/rail/rail.h>
+
+struct rdp_icon
+{
+       ICON_INFO* entry;
+       boolean big;
+       void* extra;
+};
+
+struct _WINDOW_ICON_CACHE
+{
+       rdpIcon* entries;
+};
+typedef struct _WINDOW_ICON_CACHE WINDOW_ICON_CACHE;
+
+struct rdp_icon_cache
+{
+       rdpRail* rail;
+       uint8 numCaches;
+       uint16 numCacheEntries;
+       WINDOW_ICON_CACHE* caches;
+};
+
+ICON_INFO* icon_cache_get(rdpIconCache* cache, uint8 id, uint16 index, void** extra);
+void icon_cache_put(rdpIconCache* cache, uint8 id, uint16 index, ICON_INFO* entry, void* extra);
+
+rdpIconCache* icon_cache_new(rdpRail* rail);
+void icon_cache_free(rdpIconCache* cache);
+
+#endif /* __RAIL_ICON_H */
diff --git a/include/freerdp/rail/rail.h b/include/freerdp/rail/rail.h
new file mode 100644 (file)
index 0000000..a5b4f54
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Remote Applications Integrated Locally (RAIL)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_H
+#define __RAIL_H
+
+#include <freerdp/api.h>
+#include <freerdp/rail.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/rail/icon.h>
+#include <freerdp/rail/window.h>
+#include <freerdp/rail/window_list.h>
+
+typedef void (*railCreateWindow)(rdpRail* rail, rdpWindow* window);
+typedef void (*railDestroyWindow)(rdpRail* rail, rdpWindow* window);
+typedef void (*railMoveWindow)(rdpRail* rail, rdpWindow* window);
+typedef void (*railShowWindow)(rdpRail* rail, rdpWindow* window, uint8 state);
+typedef void (*railSetWindowText)(rdpRail* rail, rdpWindow* window);
+typedef void (*railSetWindowIcon)(rdpRail* rail, rdpWindow* window, rdpIcon* icon);
+typedef void (*railSetWindowRects)(rdpRail* rail, rdpWindow* window);
+typedef void (*railSetWindowVisibilityRects)(rdpRail* rail, rdpWindow* window);
+
+struct rdp_rail
+{
+       void* extra;
+       UNICONV* uniconv;
+       CLRCONV* clrconv;
+       rdpIconCache* cache;
+       rdpWindowList* list;
+       rdpSettings* settings;
+       railCreateWindow rail_CreateWindow;
+       railDestroyWindow rail_DestroyWindow;
+       railMoveWindow rail_MoveWindow;
+       railShowWindow rail_ShowWindow;
+       railSetWindowText rail_SetWindowText;
+       railSetWindowIcon rail_SetWindowIcon;
+       railSetWindowRects rail_SetWindowRects;
+       railSetWindowVisibilityRects rail_SetWindowVisibilityRects;
+};
+
+FREERDP_API void rail_register_update_callbacks(rdpRail* rail, rdpUpdate* update);
+
+FREERDP_API rdpRail* rail_new(rdpSettings* settings);
+FREERDP_API void rail_free(rdpRail* rail);
+
+#endif /* __RAIL_H */
diff --git a/include/freerdp/rail/window.h b/include/freerdp/rail/window.h
new file mode 100644 (file)
index 0000000..43444bb
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RAIL Windows
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_WINDOW_H
+#define __RAIL_WINDOW_H
+
+#include <freerdp/api.h>
+#include <freerdp/rail.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_window rdpWindow;
+
+#include <freerdp/rail/rail.h>
+#include <freerdp/rail/icon.h>
+
+struct rdp_window
+{
+       void* extra;
+       void* extraId;
+       char* title;
+       rdpIcon* bigIcon;
+       rdpIcon* smallIcon;
+       uint32 fieldFlags;
+       rdpWindow* prev;
+       rdpWindow* next;
+       uint32 windowId;
+       uint32 ownerWindowId;
+       rdpWindow* ownerWindow;
+       uint32 style;
+       uint32 extendedStyle;
+       uint8 showState;
+       UNICODE_STRING titleInfo;
+       uint32 clientOffsetX;
+       uint32 clientOffsetY;
+       uint32 clientAreaWidth;
+       uint32 clientAreaHeight;
+       uint8 RPContent;
+       uint32 rootParentHandle;
+       sint32 windowOffsetX;
+       sint32 windowOffsetY;
+       uint32 windowClientDeltaX;
+       uint32 windowClientDeltaY;
+       uint32 windowWidth;
+       uint32 windowHeight;
+       uint16 numWindowRects;
+       RECTANGLE_16* windowRects;
+       uint32 visibleOffsetX;
+       uint32 visibleOffsetY;
+       uint16 numVisibilityRects;
+       RECTANGLE_16* visibilityRects;
+};
+
+FREERDP_API void window_state_update(rdpWindow* window, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state);
+
+FREERDP_API void rail_CreateWindow(rdpRail* rail, rdpWindow* window);
+FREERDP_API void rail_UpdateWindow(rdpRail* rail, rdpWindow* window);
+FREERDP_API void rail_DestroyWindow(rdpRail* rail, rdpWindow* window);
+
+#endif /* __RAIL_WINDOW_H */
diff --git a/include/freerdp/rail/window_list.h b/include/freerdp/rail/window_list.h
new file mode 100644 (file)
index 0000000..82914a4
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RAIL Window List
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_WINDOW_LIST_H
+#define __RAIL_WINDOW_LIST_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_window_list rdpWindowList;
+
+#include <freerdp/rail/rail.h>
+#include <freerdp/rail/window.h>
+
+struct rdp_window_list
+{
+       rdpRail* rail;
+       rdpWindow* head;
+       rdpWindow* tail;
+       rdpWindow* iterator;
+};
+
+FREERDP_API void window_list_rewind(rdpWindowList* list);
+FREERDP_API boolean window_list_has_next(rdpWindowList* list);
+FREERDP_API rdpWindow* window_list_get_next(rdpWindowList* list);
+
+FREERDP_API rdpWindow* window_list_get_by_id(rdpWindowList* list, uint32 windowId);
+FREERDP_API rdpWindow* window_list_get_by_extra_id(rdpWindowList* list, void* extraId);
+
+FREERDP_API void window_list_create(rdpWindowList* list, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state);
+FREERDP_API void window_list_update(rdpWindowList* list, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state);
+FREERDP_API void window_list_delete(rdpWindowList* list, WINDOW_ORDER_INFO* orderInfo);
+
+FREERDP_API rdpWindowList* window_list_new(rdpRail* rail);
+FREERDP_API void window_list_free(rdpWindowList* list);
+
+#endif /* __RAIL_WINDOW_LIST_H */
diff --git a/include/freerdp/secondary.h b/include/freerdp/secondary.h
new file mode 100644 (file)
index 0000000..5bf09b0
--- /dev/null
@@ -0,0 +1,224 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Secondary Drawing Orders Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_SECONDARY_H
+#define __UPDATE_SECONDARY_H
+
+#include <freerdp/types.h>
+
+#define GLYPH_FRAGMENT_NOP             0x00
+#define GLYPH_FRAGMENT_USE             0xFE
+#define GLYPH_FRAGMENT_ADD             0xFF
+
+#define CBR2_HEIGHT_SAME_AS_WIDTH      0x01
+#define CBR2_PERSISTENT_KEY_PRESENT    0x02
+#define CBR2_NO_BITMAP_COMPRESSION_HDR 0x08
+#define CBR2_DO_NOT_CACHE              0x10
+
+#define SCREEN_BITMAP_SURFACE          0xFFFF
+#define BITMAP_CACHE_WAITING_LIST_INDEX 0x7FFF
+
+#define CACHED_BRUSH                   0x80
+
+#define BMF_1BPP                       0x1
+#define BMF_8BPP                       0x3
+#define BMF_16BPP                      0x4
+#define BMF_24BPP                      0x5
+#define BMF_32BPP                      0x6
+
+#ifndef _WIN32
+#define BS_SOLID                       0x00
+#define BS_NULL                                0x01
+#define BS_HATCHED                     0x02
+#define BS_PATTERN                     0x03
+#endif
+
+#ifndef _WIN32
+#define HS_HORIZONTAL          0x00
+#define HS_VERTICAL                    0x01
+#define HS_FDIAGONAL           0x02
+#define HS_BDIAGONAL           0x03
+#define HS_CROSS                       0x04
+#define HS_DIAGCROSS           0x05
+#endif
+
+#define SO_FLAG_DEFAULT_PLACEMENT      0x01
+#define SO_HORIZONTAL                  0x02
+#define SO_VERTICAL                    0x04
+#define SO_REVERSED                    0x08
+#define SO_ZERO_BEARINGS               0x10
+#define SO_CHAR_INC_EQUAL_BM_BASE      0x20
+#define SO_MAXEXT_EQUAL_BM_SIDE                0x40
+
+struct _CACHE_BITMAP_ORDER
+{
+       uint32 cacheId;
+       uint32 bitmapBpp;
+       uint32 bitmapWidth;
+       uint32 bitmapHeight;
+       uint32 bitmapLength;
+       uint32 cacheIndex;
+       boolean compressed;
+       uint8 bitmapComprHdr[8];
+       uint8* bitmapDataStream;
+};
+typedef struct _CACHE_BITMAP_ORDER CACHE_BITMAP_ORDER;
+
+struct _CACHE_BITMAP_V2_ORDER
+{
+       uint32 cacheId;
+       uint32 flags;
+       uint32 key1;
+       uint32 key2;
+       uint32 bitmapBpp;
+       uint32 bitmapWidth;
+       uint32 bitmapHeight;
+       uint32 bitmapLength;
+       uint32 cacheIndex;
+       boolean compressed;
+       uint32 cbCompFirstRowSize;
+       uint32 cbCompMainBodySize;
+       uint32 cbScanWidth;
+       uint32 cbUncompressedSize;
+       uint8* bitmapDataStream;
+};
+typedef struct _CACHE_BITMAP_V2_ORDER CACHE_BITMAP_V2_ORDER;
+
+struct _BITMAP_DATA_EX
+{
+       uint32 bpp;
+       uint32 codecID;
+       uint32 width;
+       uint32 height;
+       uint32 length;
+       uint8* data;
+};
+typedef struct _BITMAP_DATA_EX BITMAP_DATA_EX;
+
+struct _CACHE_BITMAP_V3_ORDER
+{
+       uint32 cacheId;
+       uint32 bpp;
+       uint32 flags;
+       uint32 cacheIndex;
+       uint32 key1;
+       uint32 key2;
+       BITMAP_DATA_EX bitmapData;
+};
+typedef struct _CACHE_BITMAP_V3_ORDER CACHE_BITMAP_V3_ORDER;
+
+struct _CACHE_COLOR_TABLE_ORDER
+{
+       uint32 cacheIndex;
+       uint32 numberColors;
+       uint32* colorTable;
+};
+typedef struct _CACHE_COLOR_TABLE_ORDER CACHE_COLOR_TABLE_ORDER;
+
+struct _GLYPH_DATA
+{
+       uint32 cacheIndex;
+       sint32 x;
+       sint32 y;
+       uint32 cx;
+       uint32 cy;
+       uint32 cb;
+       uint8* aj;
+};
+typedef struct _GLYPH_DATA GLYPH_DATA;
+
+struct _CACHE_GLYPH_ORDER
+{
+       uint32 cacheId;
+       uint32 cGlyphs;
+       GLYPH_DATA* glyphData[255];
+       uint8* unicodeCharacters;
+};
+typedef struct _CACHE_GLYPH_ORDER CACHE_GLYPH_ORDER;
+
+struct _GLYPH_DATA_V2
+{
+       uint32 cacheIndex;
+       sint32 x;
+       sint32 y;
+       uint32 cx;
+       uint32 cy;
+       uint32 cb;
+       uint8* aj;
+};
+typedef struct _GLYPH_DATA_V2 GLYPH_DATA_V2;
+
+struct _CACHE_GLYPH_V2_ORDER
+{
+       uint32 cacheId;
+       uint32 flags;
+       uint32 cGlyphs;
+       GLYPH_DATA_V2* glyphData[255];
+       uint8* unicodeCharacters;
+};
+typedef struct _CACHE_GLYPH_V2_ORDER CACHE_GLYPH_V2_ORDER;
+
+struct _CACHE_BRUSH_ORDER
+{
+       uint32 index;
+       uint32 bpp;
+       uint32 cx;
+       uint32 cy;
+       uint32 style;
+       uint32 length;
+       uint8* data;
+};
+typedef struct _CACHE_BRUSH_ORDER CACHE_BRUSH_ORDER;
+
+typedef void (*pCacheBitmap)(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap_order);
+typedef void (*pCacheBitmapV2)(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order);
+typedef void (*pCacheBitmapV3)(rdpContext* context, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order);
+typedef void (*pCacheColorTable)(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table_order);
+typedef void (*pCacheGlyph)(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph_order);
+typedef void (*pCacheGlyphV2)(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order);
+typedef void (*pCacheBrush)(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush_order);
+
+struct rdp_secondary_update
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       pCacheBitmap CacheBitmap; /* 16 */
+       pCacheBitmapV2 CacheBitmapV2; /* 17 */
+       pCacheBitmapV3 CacheBitmapV3; /* 18 */
+       pCacheColorTable CacheColorTable; /* 19 */
+       pCacheGlyph CacheGlyph; /* 20 */
+       pCacheGlyphV2 CacheGlyphV2; /* 21 */
+       pCacheBrush CacheBrush; /* 22 */
+       uint32 paddingE[32 - 23]; /* 23 */
+
+       /* internal */
+
+       boolean glyph_v2;
+       CACHE_BITMAP_ORDER cache_bitmap_order;
+       CACHE_BITMAP_V2_ORDER cache_bitmap_v2_order;
+       CACHE_BITMAP_V3_ORDER cache_bitmap_v3_order;
+       CACHE_COLOR_TABLE_ORDER cache_color_table_order;
+       CACHE_GLYPH_ORDER cache_glyph_order;
+       CACHE_GLYPH_V2_ORDER cache_glyph_v2_order;
+       CACHE_BRUSH_ORDER cache_brush_order;
+};
+typedef struct rdp_secondary_update rdpSecondaryUpdate;
+
+#endif /* __UPDATE_SECONDARY_H */
diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h
new file mode 100644 (file)
index 0000000..5a9acd8
--- /dev/null
@@ -0,0 +1,446 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Settings
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDP_SETTINGS_H
+#define __RDP_SETTINGS_H
+
+#include <freerdp/types.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/unicode.h>
+
+/* Performance Flags */
+#define PERF_FLAG_NONE                         0x00000000
+#define PERF_DISABLE_WALLPAPER                 0x00000001
+#define PERF_DISABLE_FULLWINDOWDRAG                    0x00000002
+#define PERF_DISABLE_MENUANIMATIONS            0x00000004
+#define PERF_DISABLE_THEMING                   0x00000008
+#define PERF_DISABLE_CURSOR_SHADOW             0x00000020
+#define PERF_DISABLE_CURSORSETTINGS            0x00000040
+#define PERF_ENABLE_FONT_SMOOTHING             0x00000080
+#define PERF_ENABLE_DESKTOP_COMPOSITION        0x00000100
+
+/* Connection Types */
+#define CONNECTION_TYPE_MODEM                  0x01
+#define CONNECTION_TYPE_BROADBAND_LOW          0x02
+#define CONNECTION_TYPE_SATELLITE              0x03
+#define CONNECTION_TYPE_BROADBAND_HIGH         0x04
+#define CONNECTION_TYPE_WAN                    0x05
+#define CONNECTION_TYPE_LAN                    0x06
+
+/* Encryption Methods */
+#define ENCRYPTION_METHOD_NONE                 0x00000000
+#define ENCRYPTION_METHOD_40BIT                        0x00000001
+#define ENCRYPTION_METHOD_128BIT               0x00000002
+#define ENCRYPTION_METHOD_56BIT                        0x00000008
+#define ENCRYPTION_METHOD_FIPS                 0x00000010
+
+/* Encryption Levels */
+#define ENCRYPTION_LEVEL_NONE                  0x00000000
+#define ENCRYPTION_LEVEL_LOW                   0x00000001
+#define ENCRYPTION_LEVEL_CLIENT_COMPATIBLE     0x00000002
+#define ENCRYPTION_LEVEL_HIGH                  0x00000003
+#define ENCRYPTION_LEVEL_FIPS                  0x00000004
+
+/* Auto Reconnect Version */
+#define AUTO_RECONNECT_VERSION_1               0x00000001
+
+/* Order Support */
+#define NEG_DSTBLT_INDEX                       0x00
+#define NEG_PATBLT_INDEX                       0x01
+#define NEG_SCRBLT_INDEX                       0x02
+#define NEG_MEMBLT_INDEX                       0x03
+#define NEG_MEM3BLT_INDEX                      0x04
+#define NEG_ATEXTOUT_INDEX                     0x05
+#define NEG_AEXTTEXTOUT_INDEX                  0x06
+#define NEG_DRAWNINEGRID_INDEX                 0x07
+#define NEG_LINETO_INDEX                       0x08
+#define NEG_MULTI_DRAWNINEGRID_INDEX           0x09
+#define NEG_OPAQUE_RECT_INDEX                  0x0A
+#define NEG_SAVEBITMAP_INDEX                   0x0B
+#define NEG_WTEXTOUT_INDEX                     0x0C
+#define NEG_MEMBLT_V2_INDEX                    0x0D
+#define NEG_MEM3BLT_V2_INDEX                   0x0E
+#define NEG_MULTIDSTBLT_INDEX                  0x0F
+#define NEG_MULTIPATBLT_INDEX                  0x10
+#define NEG_MULTISCRBLT_INDEX                  0x11
+#define NEG_MULTIOPAQUERECT_INDEX              0x12
+#define NEG_FAST_INDEX_INDEX                   0x13
+#define NEG_POLYGON_SC_INDEX                   0x14
+#define NEG_POLYGON_CB_INDEX                   0x15
+#define NEG_POLYLINE_INDEX                     0x16
+#define NEG_FAST_GLYPH_INDEX                   0x18
+#define NEG_ELLIPSE_SC_INDEX                   0x19
+#define NEG_ELLIPSE_CB_INDEX                   0x1A
+#define NEG_GLYPH_INDEX_INDEX                  0x1B
+#define NEG_GLYPH_WEXTTEXTOUT_INDEX            0x1C
+#define NEG_GLYPH_WLONGTEXTOUT_INDEX           0x1D
+#define NEG_GLYPH_WLONGEXTTEXTOUT_INDEX                0x1E
+
+/* Glyph Support Level */
+#define GLYPH_SUPPORT_NONE                     0x0000
+#define GLYPH_SUPPORT_PARTIAL                  0x0001
+#define GLYPH_SUPPORT_FULL                     0x0002
+#define GLYPH_SUPPORT_ENCODE                   0x0003
+
+/* SYSTEM_TIME */
+typedef struct
+{
+       uint16 wYear;
+       uint16 wMonth;
+       uint16 wDayOfWeek;
+       uint16 wDay;
+       uint16 wHour;
+       uint16 wMinute;
+       uint16 wSecond;
+       uint16 wMilliseconds;
+} SYSTEM_TIME;
+
+/* TIME_ZONE_INFORMATION */
+struct _TIME_ZONE_INFO
+{
+       uint32 bias;
+       char standardName[32];
+       SYSTEM_TIME standardDate;
+       uint32 standardBias;
+       char daylightName[32];
+       SYSTEM_TIME daylightDate;
+       uint32 daylightBias;
+};
+typedef struct _TIME_ZONE_INFO TIME_ZONE_INFO;
+
+/* ARC_CS_PRIVATE_PACKET */
+typedef struct
+{
+       uint32 cbLen;
+       uint32 version;
+       uint32 logonId;
+       uint8 securityVerifier[16];
+} ARC_CS_PRIVATE_PACKET;
+
+/* ARC_SC_PRIVATE_PACKET */
+typedef struct
+{
+       uint32 cbLen;
+       uint32 version;
+       uint32 logonId;
+       uint8 arcRandomBits[16];
+} ARC_SC_PRIVATE_PACKET;
+
+/* Certificates */
+
+typedef struct rdp_certificate rdpCertificate;
+typedef struct rdp_key rdpKey;
+
+struct rdp_CertBlob
+{
+       uint32 length;
+       uint8* data;
+};
+typedef struct rdp_CertBlob rdpCertBlob;
+
+struct rdp_X509CertChain
+{
+       uint32 count;
+       rdpCertBlob* array;
+};
+typedef struct rdp_X509CertChain rdpX509CertChain;
+
+struct rdp_CertInfo
+{
+       rdpBlob modulus;
+       uint8 exponent[4];
+};
+typedef struct rdp_CertInfo rdpCertInfo;
+
+struct rdp_certificate
+{
+       rdpCertInfo cert_info;
+       rdpX509CertChain* x509_cert_chain;
+};
+
+/* Channels */
+
+struct rdp_channel
+{
+       char name[8]; /* ui sets */
+       int options; /* ui sets */
+       int channel_id; /* core sets */
+       boolean joined; /* client has joined the channel */
+       void* handle; /* just for ui */
+};
+typedef struct rdp_channel rdpChannel;
+
+/* Extensions */
+
+struct rdp_ext_set
+{
+       char name[256]; /* plugin name or path */
+       void* data; /* plugin data */
+};
+
+/* Bitmap Cache */
+
+struct _BITMAP_CACHE_CELL_INFO
+{
+       uint16 numEntries;
+       uint16 maxSize;
+};
+typedef struct _BITMAP_CACHE_CELL_INFO BITMAP_CACHE_CELL_INFO;
+
+struct _BITMAP_CACHE_V2_CELL_INFO
+{
+       uint32 numEntries;
+       boolean persistent;
+};
+typedef struct _BITMAP_CACHE_V2_CELL_INFO BITMAP_CACHE_V2_CELL_INFO;
+
+/* Glyph Cache */
+
+struct _GLYPH_CACHE_DEFINITION
+{
+       uint16 cacheEntries;
+       uint16 cacheMaximumCellSize;
+};
+typedef struct _GLYPH_CACHE_DEFINITION GLYPH_CACHE_DEFINITION;
+
+/* Monitors */
+
+struct rdp_monitor
+{
+       int x;
+       int y;
+       int width;
+       int height;
+       int is_primary;
+};
+
+/* Settings */
+
+struct rdp_settings
+{
+       void* instance; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       /* Core Protocol Parameters */
+       uint32 width; /* 16 */
+       uint32 height; /* 17 */
+       uint32 rdp_version; /* 18 */
+       uint32 color_depth; /* 19 */
+       uint32 kbd_layout; /* 20 */
+       uint32 kbd_type; /* 21 */
+       uint32 kbd_subtype; /* 22 */
+       uint32 kbd_fn_keys; /* 23 */
+       uint32 client_build; /* 24 */
+       uint32 requested_protocols; /* 25 */
+       uint32 selected_protocol; /* 26 */
+       uint32 encryption_method; /* 27 */
+       uint32 encryption_level; /* 28 */
+       boolean authentication; /* 29 */
+       uint32 negotiationFlags; /* 30 */
+       uint32 paddingB[48 - 31]; /* 31 */
+
+       /* Connection Settings */
+       uint32 port; /* 48 */
+       boolean ipv6; /* 49 */
+       char* hostname; /* 50 */
+       char* username; /* 51 */
+       char* password; /* 52 */
+       char* domain; /* 53 */
+       char* shell; /* 54 */
+       char* directory; /* 55 */
+       char* ip_address; /* 56 */
+       char* client_dir; /* 57 */
+       boolean autologon; /* 58 */
+       boolean compression; /* 59 */
+       uint32 performance_flags; /* 60 */
+       rdpBlob* password_cookie; /* 61 */
+       uint32 paddingC[80 - 62]; /* 62 */
+
+       /* User Interface Parameters */
+       boolean sw_gdi; /* 80 */
+       boolean workarea; /* 81 */
+       boolean fullscreen; /* 82 */
+       boolean grab_keyboard; /* 83 */
+       boolean decorations; /* 84 */
+       uint32 percent_screen; /* 85 */
+       boolean mouse_motion; /* 86 */
+       char* window_title; /* 87 */
+       uint64 parent_window_xid; /* 88 */
+       uint32 paddingD[112 - 89]; /* 89 */
+
+       /* Internal Parameters */
+       char* home_path; /* 112 */
+       uint32 share_id; /* 113 */
+       uint32 pdu_source; /* 114 */
+       UNICONV* uniconv; /* 115 */
+       boolean server_mode; /* 116 */
+       char* config_path; /* 117 */
+       char* current_path; /* 118 */
+       char* development_path; /* 119 */
+       boolean development_mode; /* 120 */
+       uint32 paddingE[144 - 121]; /* 121 */
+
+       /* Security */
+       boolean encryption; /* 144 */
+       boolean tls_security; /* 145 */
+       boolean nla_security; /* 146 */
+       boolean rdp_security; /* 147 */
+       uint32 ntlm_version; /* 148 */
+       boolean secure_checksum; /* 149 */
+       uint32 paddingF[160 - 150]; /* 150 */
+
+       /* Session */
+       boolean console_audio; /* 160 */
+       boolean console_session; /* 161 */
+       uint32 redirected_session_id; /* 162 */
+       uint32 paddingG[176 - 163]; /* 163 */
+
+       /* Output Control */
+       boolean refresh_rect; /* 176 */
+       boolean suppress_output; /* 177 */
+       boolean desktop_resize; /* 178 */
+       uint32 paddingH[192 - 179]; /* 179 */
+
+       /* Reconnection */
+       boolean auto_reconnection; /* 192 */
+       ARC_CS_PRIVATE_PACKET* client_auto_reconnect_cookie; /* 193 */
+       ARC_SC_PRIVATE_PACKET* server_auto_reconnect_cookie; /* 194 */
+       uint32 paddingI[208 - 195]; /* 195 */
+
+       /* Time Zone */
+       TIME_ZONE_INFO* client_time_zone; /* 208 */
+       uint32 paddingJ[216 - 209]; /* 209 */
+
+       /* Capabilities */
+       uint32 os_major_type; /* 216 */
+       uint32 os_minor_type; /* 217 */
+       uint32 vc_chunk_size; /* 218 */
+       boolean sound_beeps; /* 219 */
+       boolean smooth_fonts; /* 220 */
+       boolean frame_marker; /* 221 */
+       boolean fastpath_input; /* 222 */
+       boolean fastpath_output; /* 223 */
+       uint8 received_caps[32]; /* 224 (8) */
+       uint8 order_support[32]; /* 232 (8) */
+       boolean surface_commands; /* 240 */
+       boolean disable_wallpaper; /* 241 */
+       boolean disable_full_window_drag; /* 242 */
+       boolean disable_menu_animations; /* 243 */
+       boolean disable_theming; /* 244 */
+       uint32 connection_type; /* 245 */
+       uint32 multifrag_max_request_size; /* 246 */
+       uint32 paddingK[248 - 247]; /* 247 */
+
+       /* Certificate */
+       char* cert_file; /* 248 */
+       char* privatekey_file; /* 249 */
+       char client_hostname[32]; /* 250 (8) */
+       char client_product_id[32]; /* 258 (8) */
+       rdpBlob* server_random; /* 266 */
+       rdpBlob* server_certificate; /* 267 */
+       boolean ignore_certificate; /* 268 */
+       rdpCertificate* server_cert; /* 269 */
+       char* rdp_key_file; /* 270 */
+       rdpKey* server_key; /* 271 */
+       char* certificate_name; /* 272 */
+       uint32 paddingL[280 - 273]; /* 273 */
+
+       /* Codecs */
+       boolean rfx_codec; /* 280 */
+       boolean ns_codec; /* 281 */
+       uint32 rfx_codec_id; /* 282 */
+       uint32 ns_codec_id; /* 283 */
+       uint32 rfx_codec_mode; /* 284 */
+       boolean frame_acknowledge; /* 285 */
+       uint32 paddingM[296 - 286]; /* 286 */
+
+       /* Recording */
+       boolean dump_rfx; /* 296 */
+       boolean play_rfx; /* 297 */
+       char* dump_rfx_file; /* 298 */
+       char* play_rfx_file; /* 299 */
+       uint32 paddingN[312 - 300]; /* 300 */
+
+       /* RemoteApp */
+       boolean remote_app; /* 312 */
+       uint32 num_icon_caches; /* 313 */
+       uint32 num_icon_cache_entries; /* 314 */
+       boolean rail_langbar_supported; /* 315 */
+       uint32 paddingO[320 - 316]; /* 316 */
+
+       /* Pointer */
+       boolean large_pointer; /* 320 */
+       boolean color_pointer; /* 321 */
+       uint32 pointer_cache_size; /* 322 */
+       uint32 paddingP[328 - 323]; /* 323 */
+
+       /* Bitmap Cache */
+       boolean bitmap_cache; /* 328 */
+       boolean bitmap_cache_v3; /* 329 */
+       boolean persistent_bitmap_cache; /* 330 */
+       uint32 bitmapCacheV2NumCells; /* 331 */
+       BITMAP_CACHE_V2_CELL_INFO* bitmapCacheV2CellInfo; /* 332 */
+       uint32 paddingQ[344 - 333]; /* 333 */
+
+       /* Offscreen Bitmap Cache */
+       boolean offscreen_bitmap_cache; /* 344 */
+       uint32 offscreen_bitmap_cache_size; /* 345 */
+       uint32 offscreen_bitmap_cache_entries; /* 346 */
+       uint32 paddingR[352 - 347]; /* 347 */
+
+       /* Glyph Cache */
+       boolean glyph_cache; /* 352 */
+       uint32 glyphSupportLevel; /* 353 */
+       GLYPH_CACHE_DEFINITION* glyphCache; /* 354 */
+       GLYPH_CACHE_DEFINITION* fragCache; /* 355 */
+       uint32 paddingS[360 - 356]; /* 356 */
+
+       /* Draw Nine Grid */
+       boolean draw_nine_grid; /* 360 */
+       uint32 draw_nine_grid_cache_size; /* 361 */
+       uint32 draw_nine_grid_cache_entries; /* 362 */
+       uint32 paddingT[368 - 363]; /* 363 */
+
+       /* Draw GDI+ */
+       boolean draw_gdi_plus; /* 368 */
+       boolean draw_gdi_plus_cache; /* 369 */
+       uint32 paddingU[376 - 370]; /* 370 */
+
+       /* Desktop Composition */
+       boolean desktop_composition; /* 376 */
+       uint32 paddingV[384 - 377]; /* 377 */
+
+       /* Channels */
+       int num_channels;
+       rdpChannel channels[16];
+
+       /* Monitors */
+       int num_monitors;
+       struct rdp_monitor monitors[16];
+
+       /* Extensions */
+       int num_extensions;
+       struct rdp_ext_set extensions[16];
+};
+typedef struct rdp_settings rdpSettings;
+
+rdpSettings* settings_new(void* instance);
+void settings_free(rdpSettings* settings);
+
+#endif /* __RDP_SETTINGS_H */
diff --git a/include/freerdp/svc.h b/include/freerdp/svc.h
new file mode 100644 (file)
index 0000000..1c3e347
--- /dev/null
@@ -0,0 +1,116 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Static Virtual Channel Interface
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * MS compatible SVC plugin interface
+ * reference:
+ * http://msdn.microsoft.com/en-us/library/aa383580.aspx
+ */
+
+#ifndef __FREERDP_SVC_H
+#define __FREERDP_SVC_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+#define CHANNEL_EXPORT_FUNC_NAME "VirtualChannelEntry"
+
+#define CHANNEL_NAME_LEN 7
+
+struct _CHANNEL_DEF
+{
+       char name[CHANNEL_NAME_LEN + 1];
+       uint32 options;
+};
+typedef struct _CHANNEL_DEF CHANNEL_DEF;
+typedef CHANNEL_DEF* PCHANNEL_DEF;
+typedef CHANNEL_DEF** PPCHANNEL_DEF;
+
+typedef void (FREERDP_CC * PCHANNEL_INIT_EVENT_FN)(void* pInitHandle,
+       uint32 event, void* pData, uint32 dataLength);
+
+
+typedef void (FREERDP_CC * PCHANNEL_OPEN_EVENT_FN)(uint32 openHandle,
+       uint32 event, void* pData, uint32 dataLength,
+       uint32 totalLength, uint32 dataFlags);
+
+#define CHANNEL_RC_OK                             0
+#define CHANNEL_RC_ALREADY_INITIALIZED            1
+#define CHANNEL_RC_NOT_INITIALIZED                2
+#define CHANNEL_RC_ALREADY_CONNECTED              3
+#define CHANNEL_RC_NOT_CONNECTED                  4
+#define CHANNEL_RC_TOO_MANY_CHANNELS              5
+#define CHANNEL_RC_BAD_CHANNEL                    6
+#define CHANNEL_RC_BAD_CHANNEL_HANDLE             7
+#define CHANNEL_RC_NO_BUFFER                      8
+#define CHANNEL_RC_BAD_INIT_HANDLE                9
+#define CHANNEL_RC_NOT_OPEN                      10
+#define CHANNEL_RC_BAD_PROC                      11
+#define CHANNEL_RC_NO_MEMORY                     12
+#define CHANNEL_RC_UNKNOWN_CHANNEL_NAME          13
+#define CHANNEL_RC_ALREADY_OPEN                  14
+#define CHANNEL_RC_NOT_IN_VIRTUALCHANNELENTRY    15
+#define CHANNEL_RC_NULL_DATA                     16
+#define CHANNEL_RC_ZERO_LENGTH                   17
+
+#define VIRTUAL_CHANNEL_VERSION_WIN2000         1
+
+typedef uint32 (FREERDP_CC * PVIRTUALCHANNELINIT)(void** ppInitHandle,
+       PCHANNEL_DEF pChannel, int channelCount, uint32 versionRequested,
+       PCHANNEL_INIT_EVENT_FN pChannelInitEventProc);
+typedef uint32 (FREERDP_CC * PVIRTUALCHANNELOPEN)(void* pInitHandle,
+       uint32* pOpenHandle, char* pChannelName,
+       PCHANNEL_OPEN_EVENT_FN pChannelOpenEventProc);
+typedef uint32 (FREERDP_CC * PVIRTUALCHANNELCLOSE)(uint32 openHandle);
+
+typedef uint32 (FREERDP_CC * PVIRTUALCHANNELWRITE)(uint32 openHandle,
+       void* pData, uint32 dataLength, void* pUserData);
+
+typedef uint32 (FREERDP_CC * PVIRTUALCHANNELEVENTPUSH)(uint32 openHandle,
+       RDP_EVENT* event);
+
+struct _CHANNEL_ENTRY_POINTS
+{
+       uint32 cbSize;
+       uint32 protocolVersion;
+       PVIRTUALCHANNELINIT  pVirtualChannelInit;
+       PVIRTUALCHANNELOPEN  pVirtualChannelOpen;
+       PVIRTUALCHANNELCLOSE pVirtualChannelClose;
+       PVIRTUALCHANNELWRITE pVirtualChannelWrite;
+};
+typedef struct _CHANNEL_ENTRY_POINTS CHANNEL_ENTRY_POINTS;
+typedef CHANNEL_ENTRY_POINTS* PCHANNEL_ENTRY_POINTS;
+
+typedef int (FREERDP_CC * PVIRTUALCHANNELENTRY)(PCHANNEL_ENTRY_POINTS pEntryPoints);
+
+struct _CHANNEL_ENTRY_POINTS_EX
+{
+       uint32 cbSize;
+       uint32 protocolVersion;
+       PVIRTUALCHANNELINIT  pVirtualChannelInit;
+       PVIRTUALCHANNELOPEN  pVirtualChannelOpen;
+       PVIRTUALCHANNELCLOSE pVirtualChannelClose;
+       PVIRTUALCHANNELWRITE pVirtualChannelWrite;
+       void* pExtendedData; /* extended data field to pass initial parameters */
+       PVIRTUALCHANNELEVENTPUSH pVirtualChannelEventPush;
+};
+typedef struct _CHANNEL_ENTRY_POINTS_EX CHANNEL_ENTRY_POINTS_EX;
+typedef CHANNEL_ENTRY_POINTS_EX* PCHANNEL_ENTRY_POINTS_EX;
+
+#endif
diff --git a/include/freerdp/types.h b/include/freerdp/types.h
new file mode 100644 (file)
index 0000000..feed3fd
--- /dev/null
@@ -0,0 +1,164 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Type Definitions
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDP_TYPES_H
+#define __RDP_TYPES_H
+
+#ifdef _WIN32
+#include <windef.h>
+#endif
+
+/* Base Types */
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+
+#ifdef HAVE_INTTYPES_H
+
+#include <inttypes.h>
+typedef uint8_t uint8;
+typedef int8_t sint8;
+typedef uint16_t uint16;
+typedef int16_t sint16;
+typedef uint32_t uint32;
+typedef int32_t sint32;
+typedef uint64_t uint64;
+typedef int64_t sint64;
+
+#else
+
+typedef unsigned char uint8;
+typedef signed char sint8;
+typedef unsigned short uint16;
+typedef signed short sint16;
+typedef unsigned int uint32;
+typedef signed int sint32;
+#ifdef _WIN32
+typedef unsigned __int64 uint64;
+typedef signed __int64 sint64;
+#else
+typedef unsigned long long uint64;
+typedef signed long long sint64;
+#endif
+
+#endif /* HAVE_INTTYPES_H */
+
+#ifdef HAVE_STDBOOL_H
+
+#include <stdbool.h>
+
+typedef int boolean;
+
+#else
+
+#ifndef __cplusplus
+
+#ifndef __bool_true_false_are_defined
+#define __bool_true_false_are_defined  1
+
+#define true   1
+#define false  0
+
+#ifdef _WIN32
+#define boolean BOOLEAN
+#else
+typedef int boolean;
+#endif
+
+#endif /* __bool_true_false_are_defined */
+
+#else
+
+#ifndef true
+#define true   1
+#endif
+
+#ifndef false
+#define false  0
+#endif
+
+typedef int boolean;
+
+#endif /* __cplusplus */
+
+#endif /* HAVE_STDBOOL_H */
+
+#ifndef MIN
+#define MIN(x,y)       (((x) < (y)) ? (x) : (y))
+#endif
+
+#ifndef MAX
+#define MAX(x,y)       (((x) > (y)) ? (x) : (y))
+#endif
+
+#include <freerdp/settings.h>
+
+struct _RDP_PLUGIN_DATA
+{
+       uint16 size;
+       void* data[4];
+};
+typedef struct _RDP_PLUGIN_DATA RDP_PLUGIN_DATA;
+
+struct _RDP_RECT
+{
+       sint16 x;
+       sint16 y;
+       sint16 width;
+       sint16 height;
+};
+typedef struct _RDP_RECT RDP_RECT;
+
+struct _RECTANGLE_16
+{
+       uint16 left;
+       uint16 top;
+       uint16 right;
+       uint16 bottom;
+};
+typedef struct _RECTANGLE_16 RECTANGLE_16;
+
+/* Plugin events */
+typedef struct _RDP_EVENT RDP_EVENT;
+
+typedef void (*RDP_EVENT_CALLBACK) (RDP_EVENT* event);
+
+struct _RDP_EVENT
+{
+       uint16 event_class;
+       uint16 event_type;
+       RDP_EVENT_CALLBACK on_event_free_callback;
+       void* user_data;
+};
+
+enum RDP_EVENT_CLASS
+{
+       RDP_EVENT_CLASS_DEBUG = 0,
+       RDP_EVENT_CLASS_CLIPRDR,
+       RDP_EVENT_CLASS_TSMF,
+       RDP_EVENT_CLASS_RAIL
+};
+
+#endif /* __RDP_TYPES_H */
diff --git a/include/freerdp/update.h b/include/freerdp/update.h
new file mode 100644 (file)
index 0000000..c4c9afe
--- /dev/null
@@ -0,0 +1,191 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Update Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_API_H
+#define __UPDATE_API_H
+
+typedef struct rdp_update rdpUpdate;
+
+#include <freerdp/rail.h>
+#include <freerdp/types.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/graphics.h>
+#include <freerdp/utils/pcap.h>
+#include <freerdp/utils/stream.h>
+
+#include <freerdp/primary.h>
+#include <freerdp/secondary.h>
+#include <freerdp/altsec.h>
+#include <freerdp/window.h>
+#include <freerdp/pointer.h>
+
+/* Bitmap Updates */
+
+struct _BITMAP_DATA
+{
+       uint32 destLeft;
+       uint32 destTop;
+       uint32 destRight;
+       uint32 destBottom;
+       uint32 width;
+       uint32 height;
+       uint32 bitsPerPixel;
+       uint32 flags;
+       uint32 bitmapLength;
+       uint32 cbCompFirstRowSize;
+       uint32 cbCompMainBodySize;
+       uint32 cbScanWidth;
+       uint32 cbUncompressedSize;
+       uint8* bitmapDataStream;
+       boolean compressed;
+};
+typedef struct _BITMAP_DATA BITMAP_DATA;
+
+struct _BITMAP_UPDATE
+{
+       uint32 count;
+       uint32 number;
+       BITMAP_DATA* rectangles;
+};
+typedef struct _BITMAP_UPDATE BITMAP_UPDATE;
+
+/* Palette Updates */
+
+struct _PALETTE_ENTRY
+{
+       uint8 red;
+       uint8 green;
+       uint8 blue;
+};
+typedef struct _PALETTE_ENTRY PALETTE_ENTRY;
+
+struct _PALETTE_UPDATE
+{
+       uint32 number;
+       PALETTE_ENTRY entries[256];
+};
+typedef struct _PALETTE_UPDATE PALETTE_UPDATE;
+
+struct rdp_palette
+{
+       uint32 count;
+       PALETTE_ENTRY* entries;
+};
+typedef struct rdp_palette rdpPalette;
+
+/* Play Sound (System Beep) Updates */
+
+struct _PLAY_SOUND_UPDATE
+{
+       uint32 duration;
+       uint32 frequency;
+};
+typedef struct _PLAY_SOUND_UPDATE PLAY_SOUND_UPDATE;
+
+/* Surface Command Updates */
+
+struct _SURFACE_BITS_COMMAND
+{
+       uint32 cmdType;
+       uint32 destLeft;
+       uint32 destTop;
+       uint32 destRight;
+       uint32 destBottom;
+       uint32 bpp;
+       uint32 codecID;
+       uint32 width;
+       uint32 height;
+       uint32 bitmapDataLength;
+       uint8* bitmapData;
+};
+typedef struct _SURFACE_BITS_COMMAND SURFACE_BITS_COMMAND;
+
+struct _SURFACE_FRAME_MARKER
+{
+       uint32 frameAction;
+       uint32 frameId;
+};
+typedef struct _SURFACE_FRAME_MARKER SURFACE_FRAME_MARKER;
+
+/* Update Interface */
+
+typedef void (*pBeginPaint)(rdpContext* context);
+typedef void (*pEndPaint)(rdpContext* context);
+typedef void (*pSetBounds)(rdpContext* context, rdpBounds* bounds);
+
+typedef void (*pSynchronize)(rdpContext* context);
+typedef void (*pDesktopResize)(rdpContext* context);
+typedef void (*pBitmapUpdate)(rdpContext* context, BITMAP_UPDATE* bitmap);
+typedef void (*pPalette)(rdpContext* context, PALETTE_UPDATE* palette);
+typedef void (*pPlaySound)(rdpContext* context, PLAY_SOUND_UPDATE* play_sound);
+
+typedef void (*pRefreshRect)(rdpContext* context, uint8 count, RECTANGLE_16* areas);
+typedef void (*pSuppressOutput)(rdpContext* context, uint8 allow, RECTANGLE_16* area);
+
+typedef void (*pSurfaceCommand)(rdpContext* context, STREAM* s);
+typedef void (*pSurfaceBits)(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command);
+typedef void (*pSurfaceFrameMarker)(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker);
+
+struct rdp_update
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       pBeginPaint BeginPaint; /* 16 */
+       pEndPaint EndPaint; /* 17 */
+       pSetBounds SetBounds; /* 18 */
+       pSynchronize Synchronize; /* 19 */
+       pDesktopResize DesktopResize; /* 20 */
+       pBitmapUpdate BitmapUpdate; /* 21 */
+       pPalette Palette; /* 22 */
+       pPlaySound PlaySound; /* 23 */
+       uint32 paddingB[32 - 24]; /* 24 */
+
+       rdpPointerUpdate* pointer; /* 32 */
+       rdpPrimaryUpdate* primary; /* 33 */
+       rdpSecondaryUpdate* secondary; /* 34 */
+       rdpAltSecUpdate* altsec; /* 35 */
+       rdpWindowUpdate* window; /* 36 */
+       uint32 paddingC[48 - 37]; /* 37 */
+
+       pRefreshRect RefreshRect; /* 48 */
+       pSuppressOutput SuppressOutput; /* 49 */
+       uint32 paddingD[64 - 50]; /* 50 */
+
+       pSurfaceCommand SurfaceCommand; /* 64 */
+       pSurfaceBits SurfaceBits; /* 65 */
+       pSurfaceFrameMarker SurfaceFrameMarker; /* 66 */
+       uint32 paddingE[80 - 67]; /* 67 */
+
+       /* internal */
+
+       boolean dump_rfx;
+       boolean play_rfx;
+       rdpPcap* pcap_rfx;
+
+       BITMAP_UPDATE bitmap_update;
+       PALETTE_UPDATE palette_update;
+       PLAY_SOUND_UPDATE play_sound;
+
+       SURFACE_BITS_COMMAND surface_bits_command;
+       SURFACE_FRAME_MARKER surface_frame_marker;
+};
+
+#endif /* __UPDATE_API_H */
+
diff --git a/include/freerdp/utils/args.h b/include/freerdp/utils/args.h
new file mode 100644 (file)
index 0000000..87155ad
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Arguments Parsing
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ARGS_UTILS_H
+#define __ARGS_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+
+
+typedef enum _FREERDP_ARGS_PARSE_RESULT
+{
+       FREERDP_ARGS_PARSE_FAILURE = -1,
+       FREERDP_ARGS_PARSE_HELP = -2,
+       FREERDP_ARGS_PARSE_VERSION = -3,
+} FREERDP_ARGS_PARSE_RESULT;
+
+
+/* Returns 1 if succeed, otherwise returns zero */
+typedef int (*ProcessPluginArgs) (rdpSettings* settings, const char* name,
+       RDP_PLUGIN_DATA* plugin_data, void* user_data);
+
+/* Returns number of arguments processed (1 or 2), otherwise returns zero */
+typedef int (*ProcessUIArgs) (rdpSettings* settings, const char* opt,
+       const char* val, void* user_data);
+
+FREERDP_API int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
+       ProcessPluginArgs plugin_callback, void* plugin_user_data,
+       ProcessUIArgs ui_callback, void* ui_user_data);
+
+#endif /* __ARGS_UTILS_H */
diff --git a/include/freerdp/utils/bitmap.h b/include/freerdp/utils/bitmap.h
new file mode 100644 (file)
index 0000000..cb09474
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Bitmap File Format Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_BITMAP_H
+#define __UTILS_BITMAP_H
+
+#include <freerdp/api.h>
+
+FREERDP_API void freerdp_bitmap_write(char* filename, void* data, int width, int height, int bpp);
+
+#endif /* __UTILS_BITMAP_H */
diff --git a/include/freerdp/utils/blob.h b/include/freerdp/utils/blob.h
new file mode 100644 (file)
index 0000000..3f20e32
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * BLOB Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BLOB_UTILS_H
+#define __BLOB_UTILS_H
+
+#include <freerdp/api.h>
+
+struct rdp_blob
+{
+       void* data;
+       int length;
+};
+typedef struct rdp_blob rdpBlob;
+
+FREERDP_API void freerdp_blob_alloc(rdpBlob* blob, int length);
+FREERDP_API void freerdp_blob_free(rdpBlob* blob);
+
+#endif /* __BLOB_UTILS_H */
diff --git a/include/freerdp/utils/debug.h b/include/freerdp/utils/debug.h
new file mode 100644 (file)
index 0000000..55fc289
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Debug Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_DEBUG_H
+#define __UTILS_DEBUG_H
+
+#include "config.h"
+
+#include <stdio.h>
+
+#define DEBUG_NULL(fmt, ...) do { } while (0)
+#define DEBUG_PRINT(_dbg_str, fmt, ...) printf(_dbg_str fmt "\n" , __FUNCTION__, __LINE__, ## __VA_ARGS__)
+#define DEBUG_CLASS(_dbg_class, fmt, ...) DEBUG_PRINT("DBG_" #_dbg_class " %s (%d): ", fmt, ## __VA_ARGS__)
+#define DEBUG_WARN(fmt, ...) DEBUG_PRINT("Warning %s (%d): ", fmt, ## __VA_ARGS__)
+
+#ifdef WITH_DEBUG
+#define DEBUG(fmt, ...)        DEBUG_PRINT("DBG %s (%d): ", fmt, ## __VA_ARGS__)
+#else
+#define DEBUG(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __UTILS_DEBUG_H */
diff --git a/include/freerdp/utils/dsp.h b/include/freerdp/utils/dsp.h
new file mode 100644 (file)
index 0000000..10e799e
--- /dev/null
@@ -0,0 +1,42 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Digital Sound Processing
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DSP_UTILS_H
+#define __DSP_UTILS_H
+
+#include <freerdp/api.h>
+
+struct _ADPCM
+{
+       sint16 last_sample[2];
+       sint16 last_step[2];
+};
+typedef struct _ADPCM ADPCM;
+
+FREERDP_API uint8* dsp_resample(uint8* src, int bytes_per_sample,
+       uint32 schan, uint32 srate, int sframes,
+       uint32 rchan, uint32 rrate, int * prframes);
+
+FREERDP_API uint8* dsp_decode_ima_adpcm(ADPCM* adpcm,
+       uint8* src, int size, int channels, int block_size, int* out_size);
+FREERDP_API uint8* dsp_encode_ima_adpcm(ADPCM* adpcm,
+       uint8* src, int size, int channels, int block_size, int* out_size);
+
+#endif /* __DSP_UTILS_H */
+
diff --git a/include/freerdp/utils/event.h b/include/freerdp/utils/event.h
new file mode 100644 (file)
index 0000000..e0650d2
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Events
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EVENT_UTILS_H
+#define __EVENT_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+FREERDP_API RDP_EVENT* freerdp_event_new(uint16 event_class, uint16 event_type,
+       RDP_EVENT_CALLBACK on_event_free_callback, void* user_data);
+FREERDP_API void freerdp_event_free(RDP_EVENT* event);
+
+#endif
diff --git a/include/freerdp/utils/file.h b/include/freerdp/utils/file.h
new file mode 100644 (file)
index 0000000..7922a9d
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * File Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FILE_UTILS_H
+#define __FILE_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+
+FREERDP_API void freerdp_mkdir(char* path);
+FREERDP_API boolean freerdp_check_file_exists(char* file);
+FREERDP_API char* freerdp_get_home_path(rdpSettings* settings);
+FREERDP_API char* freerdp_get_config_path(rdpSettings* settings);
+FREERDP_API char* freerdp_get_current_path(rdpSettings* settings);
+FREERDP_API char* freerdp_construct_path(char* base_path, char* relative_path);
+FREERDP_API char* freerdp_append_shared_library_suffix(char* file_path);
+FREERDP_API char* freerdp_get_parent_path(char* base_path, int depth);
+FREERDP_API boolean freerdp_path_contains_separator(char* path);
+FREERDP_API boolean freerdp_detect_development_mode(rdpSettings* settings);
+FREERDP_API void freerdp_detect_paths(rdpSettings* settings);
+
+#endif /* __FILE_UTILS_H */
diff --git a/include/freerdp/utils/hexdump.h b/include/freerdp/utils/hexdump.h
new file mode 100644 (file)
index 0000000..4b0363b
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Hex Dump Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_HEXDUMP_H
+#define __UTILS_HEXDUMP_H
+
+#include <freerdp/api.h>
+
+#define FREERDP_HEXDUMP_LINE_LENGTH    16
+
+FREERDP_API void freerdp_hexdump(uint8* data, int length);
+
+#endif /* __UTILS_HEXDUMP_H */
diff --git a/include/freerdp/utils/list.h b/include/freerdp/utils/list.h
new file mode 100644 (file)
index 0000000..de53a10
--- /dev/null
@@ -0,0 +1,52 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Double-linked List Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LIST_UTILS_H
+#define __LIST_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/utils/memory.h>
+
+typedef struct _LIST_ITEM LIST_ITEM;
+struct _LIST_ITEM
+{
+       void* data;
+       LIST_ITEM* prev;
+       LIST_ITEM* next;
+};
+
+typedef struct _LIST LIST;
+struct _LIST
+{
+       int count;
+       LIST_ITEM* head;
+       LIST_ITEM* tail;
+};
+
+FREERDP_API LIST* list_new(void);
+FREERDP_API void list_free(LIST* list);
+FREERDP_API void list_enqueue(LIST* list, void* data);
+FREERDP_API void* list_dequeue(LIST* list);
+FREERDP_API void* list_peek(LIST* list);
+FREERDP_API void* list_next(LIST* list, void* data);
+#define list_add(_l, _d) list_enqueue(_l, _d)
+FREERDP_API void* list_remove(LIST* list, void* data);
+FREERDP_API int list_size(LIST* list);
+
+#endif /* __LIST_UTILS_H */
diff --git a/include/freerdp/utils/load_plugin.h b/include/freerdp/utils/load_plugin.h
new file mode 100644 (file)
index 0000000..9b698d0
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Plugin Loading Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LOAD_PLUGIN_UTILS_H
+#define __LOAD_PLUGIN_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/settings.h>
+
+FREERDP_API void* freerdp_open_library(const char* file);
+FREERDP_API void* freerdp_get_library_symbol(void* library, const char* name);
+FREERDP_API boolean freerdp_close_library(void* library);
+FREERDP_API void* freerdp_load_library_symbol(const char* file, const char* name);
+FREERDP_API void* freerdp_load_plugin(const char* name, const char* entry_name);
+FREERDP_API void* freerdp_load_channel_plugin(rdpSettings* settings, const char* name, const char* entry_name);
+
+#endif /* __LOAD_PLUGIN_UTILS_H */
diff --git a/include/freerdp/utils/memory.h b/include/freerdp/utils/memory.h
new file mode 100644 (file)
index 0000000..892a7ad
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Memory Utils
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MEMORY_UTILS_H
+#define __MEMORY_UTILS_H
+
+#include <stddef.h>
+#include <freerdp/api.h>
+
+FREERDP_API void* xmalloc(size_t size);
+FREERDP_API void* xzalloc(size_t size);
+FREERDP_API void* xrealloc(void* ptr, size_t size);
+FREERDP_API void xfree(void* ptr);
+FREERDP_API char* xstrdup(const char* str);
+
+#define xnew(_type) (_type*)xzalloc(sizeof(_type))
+
+#endif /* __MEMORY_UTILS_H */
diff --git a/include/freerdp/utils/mutex.h b/include/freerdp/utils/mutex.h
new file mode 100644 (file)
index 0000000..ffb12f8
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Mutex Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MUTEX_UTILS_H
+#define __MUTEX_UTILS_H
+
+#include <freerdp/api.h>
+
+typedef void* freerdp_mutex;
+
+FREERDP_API freerdp_mutex freerdp_mutex_new(void);
+FREERDP_API void freerdp_mutex_free(freerdp_mutex mutex);
+FREERDP_API void freerdp_mutex_lock(freerdp_mutex mutex);
+FREERDP_API void freerdp_mutex_unlock(freerdp_mutex mutex);
+
+#endif /* __MUTEX_UTILS_H */
diff --git a/include/freerdp/utils/passphrase.h b/include/freerdp/utils/passphrase.h
new file mode 100644 (file)
index 0000000..44c6d0b
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Passphrase Handling Utils
+ *
+ * Copyright 2011 Shea Levy <shea@shealevy.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_PASSPHRASE_H
+#define __UTILS_PASSPHRASE_H
+
+#include <stdlib.h>
+#include <freerdp/api.h>
+
+FREERDP_API char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz);
+
+#endif /* __UTILS_PASSPHRASE_H */
diff --git a/include/freerdp/utils/pcap.h b/include/freerdp/utils/pcap.h
new file mode 100644 (file)
index 0000000..147b1f3
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * pcap File Format Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_PCAP_H
+#define __UTILS_PCAP_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+struct _pcap_header
+{
+       uint32 magic_number;   /* magic number */
+       uint16 version_major;  /* major version number */
+       uint16 version_minor;  /* minor version number */
+       sint32 thiszone;       /* GMT to local correction */
+       uint32 sigfigs;        /* accuracy of timestamps */
+       uint32 snaplen;        /* max length of captured packets, in octets */
+       uint32 network;        /* data link type */
+};
+typedef struct _pcap_header pcap_header;
+
+struct _pcap_record_header
+{
+       uint32 ts_sec;         /* timestamp seconds */
+       uint32 ts_usec;        /* timestamp microseconds */
+       uint32 incl_len;       /* number of octets of packet saved in file */
+       uint32 orig_len;       /* actual length of packet */
+};
+typedef struct _pcap_record_header pcap_record_header;
+
+typedef struct _pcap_record pcap_record;
+
+struct _pcap_record
+{
+       pcap_record_header header;
+       void* data;
+       uint32 length;
+       pcap_record* next;
+};
+
+struct rdp_pcap
+{
+       FILE* fp;
+       char* name;
+       boolean write;
+       int file_size;
+       int record_count;
+       pcap_header header;
+       pcap_record* head;
+       pcap_record* tail;
+       pcap_record* record;
+};
+typedef struct rdp_pcap rdpPcap;
+
+FREERDP_API rdpPcap* pcap_open(char* name, boolean write);
+FREERDP_API void pcap_close(rdpPcap* pcap);
+
+FREERDP_API void pcap_add_record(rdpPcap* pcap, void* data, uint32 length);
+FREERDP_API boolean pcap_has_next_record(rdpPcap* pcap);
+FREERDP_API boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record);
+FREERDP_API boolean pcap_get_next_record_header(rdpPcap* pcap, pcap_record* record);
+FREERDP_API boolean pcap_get_next_record_content(rdpPcap* pcap, pcap_record* record);
+FREERDP_API void pcap_flush(rdpPcap* pcap);
+
+#endif /* __UTILS_PCAP_H */
diff --git a/include/freerdp/utils/print.h b/include/freerdp/utils/print.h
new file mode 100644 (file)
index 0000000..bbe02a6
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Print Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PRINT_UTILS_H
+#define __PRINT_UTILS_H
+
+#include <stdio.h>
+
+#ifdef _WIN32
+#define        snprintf        sprintf_s
+#endif
+
+#endif /* __PRINT_UTILS_H */
diff --git a/include/freerdp/utils/profiler.h b/include/freerdp/utils/profiler.h
new file mode 100644 (file)
index 0000000..fa367ae
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Profiler Utils
+ *
+ * Copyright 2011 Stephen Erisman
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_PROFILER_H
+#define __UTILS_PROFILER_H
+
+#include <freerdp/api.h>
+
+#include "config.h"
+
+#include <stdio.h>
+
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stopwatch.h>
+
+struct _PROFILER
+{
+       char* name;
+       STOPWATCH* stopwatch;
+};
+typedef struct _PROFILER PROFILER;
+
+FREERDP_API PROFILER* profiler_create(char* name);
+FREERDP_API void profiler_free(PROFILER* profiler);
+
+FREERDP_API void profiler_enter(PROFILER* profiler);
+FREERDP_API void profiler_exit(PROFILER* profiler);
+
+FREERDP_API void profiler_print_header();
+FREERDP_API void profiler_print(PROFILER* profiler);
+FREERDP_API void profiler_print_footer();
+
+#ifdef WITH_PROFILER
+#define IF_PROFILER(then)                      then
+#define PROFILER_DEFINE(prof)          PROFILER* prof
+#define PROFILER_CREATE(prof,name)     prof = profiler_create(name)
+#define PROFILER_FREE(prof)                    profiler_free(prof)
+#define PROFILER_ENTER(prof)           profiler_enter(prof)
+#define PROFILER_EXIT(prof)                    profiler_exit(prof)
+#define PROFILER_PRINT_HEADER          profiler_print_header()
+#define PROFILER_PRINT(prof)           profiler_print(prof)
+#define PROFILER_PRINT_FOOTER          profiler_print_footer()
+#else
+#define IF_PROFILER(then)              do { } while (0)
+#define PROFILER_DEFINE(prof)          void* prof
+#define PROFILER_CREATE(prof,name)     do { } while (0)
+#define PROFILER_FREE(prof)            do { } while (0)
+#define PROFILER_ENTER(prof)           do { } while (0)
+#define PROFILER_EXIT(prof)            do { } while (0)
+#define PROFILER_PRINT_HEADER          do { } while (0)
+#define PROFILER_PRINT(prof)           do { } while (0)
+#define PROFILER_PRINT_FOOTER          do { } while (0)
+#endif
+
+#endif /* __UTILS_PROFILER_H */
diff --git a/include/freerdp/utils/rail.h b/include/freerdp/utils/rail.h
new file mode 100644 (file)
index 0000000..1b95810
--- /dev/null
@@ -0,0 +1,38 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Remote Applications Integrated Locally (RAIL) Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RAIL_UTILS_H
+#define __RAIL_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/rail.h>
+#include <freerdp/utils/rect.h>
+#include <freerdp/utils/stream.h>
+
+#define RAIL_ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
+
+FREERDP_API void rail_unicode_string_alloc(UNICODE_STRING* unicode_string, uint16 cbString);
+FREERDP_API void rail_unicode_string_free(UNICODE_STRING* unicode_string);
+FREERDP_API void rail_read_unicode_string(STREAM* s, UNICODE_STRING* unicode_string);
+FREERDP_API void rail_write_unicode_string(STREAM* s, UNICODE_STRING* unicode_string);
+FREERDP_API void rail_write_unicode_string_value(STREAM* s, UNICODE_STRING* unicode_string);
+FREERDP_API void* rail_clone_order(uint32 event_type, void* order);
+FREERDP_API void  rail_free_cloned_order(uint32 event_type, void* order);
+
+#endif /* __RAIL_UTILS_H */
diff --git a/include/freerdp/utils/rect.h b/include/freerdp/utils/rect.h
new file mode 100644 (file)
index 0000000..530dfbb
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Rectangle Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RECT_UTILS_H
+#define __RECT_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+
+FREERDP_API void freerdp_read_rectangle_16(STREAM* s, RECTANGLE_16* rectangle_16);
+FREERDP_API void freerdp_write_rectangle_16(STREAM* s, RECTANGLE_16* rectangle_16);
+
+FREERDP_API RECTANGLE_16* freerdp_rectangle_16_new(uint16 left, uint16 top, uint16 right, uint16 bottom);
+FREERDP_API void freerdp_rectangle_16_free(RECTANGLE_16* rectangle_16);
+
+#endif /* __RECT_UTILS_H */
diff --git a/include/freerdp/utils/registry.h b/include/freerdp/utils/registry.h
new file mode 100644 (file)
index 0000000..b3956ce
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Registry Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __REGISTRY_UTILS_H
+#define __REGISTRY_UTILS_H
+
+typedef struct rdp_registry rdpRegistry;
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/memory.h>
+
+enum REG_TYPE
+{
+       REG_TYPE_NONE,
+       REG_TYPE_STRING,
+       REG_TYPE_INTEGER,
+       REG_TYPE_BOOLEAN,
+       REG_TYPE_SECTION
+};
+
+typedef struct
+{
+       uint8 type;
+       char* name;
+       uint32 length;
+       void* value;
+} REG_ENTRY;
+
+typedef REG_ENTRY REG_STRING;
+typedef REG_ENTRY REG_INTEGER;
+typedef REG_ENTRY REG_BOOLEAN;
+typedef REG_ENTRY REG_SECTION;
+
+struct rdp_registry
+{
+       FILE* fp;
+       char* path;
+       char* file;
+       char* home;
+       boolean available;
+       struct rdp_settings* settings;
+};
+
+FREERDP_API void registry_open(rdpRegistry* registry);
+FREERDP_API void registry_close(rdpRegistry* registry);
+
+FREERDP_API void registry_init(rdpRegistry* registry);
+FREERDP_API rdpRegistry* registry_new(rdpSettings* settings);
+FREERDP_API void registry_free(rdpRegistry* registry);
+
+#endif /* __REGISTRY_UTILS_H */
diff --git a/include/freerdp/utils/semaphore.h b/include/freerdp/utils/semaphore.h
new file mode 100644 (file)
index 0000000..15830eb
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Semaphore Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SEMAPHORE_UTILS_H
+#define __SEMAPHORE_UTILS_H
+
+#include <freerdp/api.h>
+
+typedef void* freerdp_sem;
+
+FREERDP_API freerdp_sem freerdp_sem_new(int iv);
+FREERDP_API void freerdp_sem_free(freerdp_sem sem);
+FREERDP_API void freerdp_sem_signal(freerdp_sem sem);
+FREERDP_API void freerdp_sem_wait(freerdp_sem sem);
+
+#endif /* __SEMAPHORE_UTILS_H */
diff --git a/include/freerdp/utils/signal.h b/include/freerdp/utils/signal.h
new file mode 100644 (file)
index 0000000..eb54c3f
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Signal handling
+ *
+ * Copyright 2011 Shea Levy <shea@shealevy.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_SIGNAL_H
+#define __UTILS_SIGNAL_H
+
+#include <freerdp/api.h>
+#ifndef _WIN32
+#include <signal.h>
+#include <termios.h>
+
+extern volatile sig_atomic_t terminal_needs_reset;
+extern int terminal_fildes;
+extern struct termios orig_flags;
+extern struct termios new_flags;
+#endif
+
+FREERDP_API int freerdp_handle_signals(void);
+
+#endif /* __UTILS_SIGNAL_H */
diff --git a/include/freerdp/utils/sleep.h b/include/freerdp/utils/sleep.h
new file mode 100644 (file)
index 0000000..a3650cc
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Sleep Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SLEEP_UTILS_H
+#define __SLEEP_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+FREERDP_API void freerdp_sleep(uint32 seconds);
+FREERDP_API void freerdp_usleep(uint32 useconds);
+
+#endif /* __SLEEP_UTILS_H */
diff --git a/include/freerdp/utils/stopwatch.h b/include/freerdp/utils/stopwatch.h
new file mode 100644 (file)
index 0000000..58d7be5
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Stopwatch Utils
+ *
+ * Copyright 2011 Stephen Erisman
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UTILS_STOPWATCH_H
+#define __UTILS_STOPWATCH_H
+
+#include <time.h>
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+
+struct _STOPWATCH
+{
+       clock_t start;
+       clock_t end;
+       double elapsed;
+       clock_t count;
+};
+typedef struct _STOPWATCH STOPWATCH;
+
+FREERDP_API STOPWATCH* stopwatch_create();
+FREERDP_API void stopwatch_free(STOPWATCH* stopwatch);
+
+FREERDP_API void stopwatch_start(STOPWATCH* stopwatch);
+FREERDP_API void stopwatch_stop(STOPWATCH* stopwatch);
+FREERDP_API void stopwatch_reset(STOPWATCH* stopwatch);
+
+FREERDP_API double stopwatch_get_elapsed_time_in_seconds(STOPWATCH* stopwatch);
+FREERDP_API void stopwatch_get_elapsed_time_in_useconds(STOPWATCH* stopwatch, uint32* sec, uint32* usec);
+
+#endif /* __UTILS_STOPWATCH_H */
diff --git a/include/freerdp/utils/stream.h b/include/freerdp/utils/stream.h
new file mode 100644 (file)
index 0000000..c583dbd
--- /dev/null
@@ -0,0 +1,176 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Stream Utils
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __STREAM_UTILS_H
+#define __STREAM_UTILS_H
+
+#include <string.h>
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+
+struct _STREAM
+{
+       int size;
+       uint8* p;
+       uint8* data;
+};
+typedef struct _STREAM STREAM;
+
+FREERDP_API STREAM* stream_new(int size);
+FREERDP_API void stream_free(STREAM* stream);
+
+#define stream_attach(_s, _buf, _size) do { \
+       _s->size = _size; \
+       _s->data = _buf; \
+       _s->p = _buf; } while (0)
+#define stream_detach(_s) memset(_s, 0, sizeof(STREAM))
+#define stream_clear(_s) memset(_s->data, 0, _s->size)
+
+FREERDP_API void stream_extend(STREAM* stream, int request_size);
+#define stream_check_size(_s, _n) \
+       while (_s->p - _s->data + (_n) > _s->size) \
+               stream_extend(_s, _n)
+
+#define stream_get_pos(_s) (_s->p - _s->data)
+#define stream_set_pos(_s,_m) _s->p = _s->data + (_m)
+#define stream_seek(_s,_offset) _s->p += (_offset)
+#define stream_rewind(_s,_offset) _s->p -= (_offset)
+#define stream_seal(_s) _s->size = (_s->p - _s->data)
+#define stream_get_mark(_s,_mark) _mark = _s->p
+#define stream_set_mark(_s,_mark) _s->p = _mark
+#define stream_get_head(_s) _s->data
+#define stream_get_tail(_s) _s->p
+#define stream_get_length(_s) (_s->p - _s->data)
+#define stream_get_data(_s) (_s->data)
+#define stream_get_size(_s) (_s->size)
+#define stream_get_left(_s) (_s->size - (_s->p - _s->data))
+
+#define stream_read_uint8(_s, _v) do { _v = *_s->p++; } while (0)
+#define stream_read_uint16(_s, _v) do { _v = \
+       (uint16)(*_s->p) + \
+       (((uint16)(*(_s->p + 1))) << 8); \
+       _s->p += 2; } while (0)
+#define stream_read_uint32(_s, _v) do { _v = \
+       (uint32)(*_s->p) + \
+       (((uint32)(*(_s->p + 1))) << 8) + \
+       (((uint32)(*(_s->p + 2))) << 16) + \
+       (((uint32)(*(_s->p + 3))) << 24); \
+       _s->p += 4; } while (0)
+#define stream_read_uint64(_s, _v) do { _v = \
+       (uint64)(*_s->p) + \
+       (((uint64)(*(_s->p + 1))) << 8) + \
+       (((uint64)(*(_s->p + 2))) << 16) + \
+       (((uint64)(*(_s->p + 3))) << 24) + \
+       (((uint64)(*(_s->p + 4))) << 32) + \
+       (((uint64)(*(_s->p + 5))) << 40) + \
+       (((uint64)(*(_s->p + 6))) << 48) + \
+       (((uint64)(*(_s->p + 7))) << 56); \
+       _s->p += 8; } while (0)
+#define stream_read(_s, _b, _n) do { \
+       memcpy(_b, (_s->p), (_n)); \
+       _s->p += (_n); \
+       } while (0)
+
+#define stream_write_uint8(_s, _v) do { \
+       *_s->p++ = (uint8)(_v); } while (0)
+#define stream_write_uint16(_s, _v) do { \
+       *_s->p++ = (_v) & 0xFF; \
+       *_s->p++ = ((_v) >> 8) & 0xFF; } while (0)
+#define stream_write_uint32(_s, _v) do { \
+       *_s->p++ = (_v) & 0xFF; \
+       *_s->p++ = ((_v) >> 8) & 0xFF; \
+       *_s->p++ = ((_v) >> 16) & 0xFF; \
+       *_s->p++ = ((_v) >> 24) & 0xFF; } while (0)
+#define stream_write_uint64(_s, _v) do { \
+       *_s->p++ = (uint64)(_v) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 8) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 16) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 24) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 32) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 40) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 48) & 0xFF; \
+       *_s->p++ = ((uint64)(_v) >> 56) & 0xFF; } while (0)
+#define stream_write(_s, _b, _n) do { \
+       memcpy(_s->p, (_b), (_n)); \
+       _s->p += (_n); \
+       } while (0)
+#define stream_write_zero(_s, _n) do { \
+       memset(_s->p, '\0', (_n)); \
+       _s->p += (_n); \
+       } while (0)
+#define stream_set_byte(_s, _v, _n) do { \
+       memset(_s->p, _v, (_n)); \
+       _s->p += (_n); \
+       } while (0)
+
+#define stream_peek_uint8(_s, _v) do { _v = *_s->p; } while (0)
+#define stream_peek_uint16(_s, _v) do { _v = \
+       (uint16)(*_s->p) + \
+       (((uint16)(*(_s->p + 1))) << 8); \
+       } while (0)
+#define stream_peek_uint32(_s, _v) do { _v = \
+       (uint32)(*_s->p) + \
+       (((uint32)(*(_s->p + 1))) << 8) + \
+       (((uint32)(*(_s->p + 2))) << 16) + \
+       (((uint32)(*(_s->p + 3))) << 24); \
+       } while (0)
+#define stream_peek_uint64(_s, _v) do { _v = \
+       (uint64)(*_s->p) + \
+       (((uint64)(*(_s->p + 1))) << 8) + \
+       (((uint64)(*(_s->p + 2))) << 16) + \
+       (((uint64)(*(_s->p + 3))) << 24) + \
+       (((uint64)(*(_s->p + 4))) << 32) + \
+       (((uint64)(*(_s->p + 5))) << 40) + \
+       (((uint64)(*(_s->p + 6))) << 48) + \
+       (((uint64)(*(_s->p + 7))) << 56); \
+       } while (0)
+
+#define stream_seek_uint8(_s)  stream_seek(_s, 1)
+#define stream_seek_uint16(_s) stream_seek(_s, 2)
+#define stream_seek_uint32(_s) stream_seek(_s, 4)
+#define stream_seek_uint64(_s) stream_seek(_s, 8)
+
+#define stream_read_uint16_be(_s, _v) do { _v = \
+       (((uint16)(*_s->p)) << 8) + \
+       (uint16)(*(_s->p + 1)); \
+       _s->p += 2; } while (0)
+#define stream_read_uint32_be(_s, _v) do { _v = \
+       (((uint32)(*(_s->p))) << 8) + \
+       (((uint32)(*(_s->p + 1)))) + \
+       (((uint32)(*(_s->p + 2))) << 24) + \
+       (((uint32)(*(_s->p + 3))) << 16); \
+       _s->p += 4; } while (0)
+
+#define stream_write_uint16_be(_s, _v) do { \
+       *_s->p++ = ((_v) >> 8) & 0xFF; \
+       *_s->p++ = (_v) & 0xFF; } while (0)
+#define stream_write_uint32_be(_s, _v) do { \
+       stream_write_uint16_be(_s, ((_v) >> 16 & 0xFFFF)); \
+       stream_write_uint16_be(_s, ((_v) & 0xFFFF)); \
+       } while (0)
+
+#define stream_copy(_dst, _src, _n) do { \
+       memcpy(_dst->p, _src->p, _n); \
+       _dst->p += _n; \
+       _src->p += _n; \
+       } while (0)
+
+#endif /* __STREAM_UTILS_H */
+
diff --git a/include/freerdp/utils/string.h b/include/freerdp/utils/string.h
new file mode 100644 (file)
index 0000000..636b93b
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * String Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __STRING_UTILS_H
+#define __STRING_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/unicode.h>
+
+struct rdp_string
+{
+       char* ascii;
+       char* unicode;
+       uint32 length;
+};
+typedef struct rdp_string rdpString;
+
+FREERDP_API void freerdp_string_read_length32(STREAM* s, rdpString* string, UNICONV* uniconv);
+FREERDP_API void freerdp_string_free(rdpString* string);
+
+#endif /* __STRING_UTILS_H */
diff --git a/include/freerdp/utils/svc_plugin.h b/include/freerdp/utils/svc_plugin.h
new file mode 100644 (file)
index 0000000..829b09b
--- /dev/null
@@ -0,0 +1,84 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Static Virtual Channel Interface
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SVC_PLUGIN_UTILS_H
+#define __SVC_PLUGIN_UTILS_H
+
+/* static channel plugin base implementation */
+
+#include <freerdp/api.h>
+#include <freerdp/svc.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/debug.h>
+
+typedef struct rdp_svc_plugin_private rdpSvcPluginPrivate;
+typedef struct rdp_svc_plugin rdpSvcPlugin;
+
+struct rdp_svc_plugin
+{
+       CHANNEL_ENTRY_POINTS_EX channel_entry_points;
+       CHANNEL_DEF channel_def;
+
+       int interval_ms;
+
+       void (*connect_callback)(rdpSvcPlugin* plugin);
+       void (*receive_callback)(rdpSvcPlugin* plugin, STREAM* data_in);
+       void (*event_callback)(rdpSvcPlugin* plugin, RDP_EVENT* event);
+       void (*interval_callback)(rdpSvcPlugin* plugin);
+       void (*terminate_callback)(rdpSvcPlugin* plugin);
+
+       rdpSvcPluginPrivate* priv;
+};
+
+FREERDP_API void svc_plugin_init(rdpSvcPlugin* plugin, CHANNEL_ENTRY_POINTS* pEntryPoints);
+FREERDP_API int svc_plugin_send(rdpSvcPlugin* plugin, STREAM* data_out);
+FREERDP_API int svc_plugin_send_event(rdpSvcPlugin* plugin, RDP_EVENT* event);
+
+#define svc_plugin_get_data(_p) (RDP_PLUGIN_DATA*)(((rdpSvcPlugin*)_p)->channel_entry_points.pExtendedData)
+
+#ifdef WITH_DEBUG_SVC
+#define DEBUG_SVC(fmt, ...) DEBUG_CLASS(SVC, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_SVC(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#define DEFINE_SVC_PLUGIN(_prefix, _name, _options) \
+\
+int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) \
+{ \
+       _prefix##Plugin* _p; \
+\
+       _p = xnew(_prefix##Plugin); \
+\
+       _p->plugin.channel_def.options = _options; \
+       strcpy(_p->plugin.channel_def.name, _name); \
+\
+       _p->plugin.connect_callback = _prefix##_process_connect; \
+       _p->plugin.receive_callback = _prefix##_process_receive; \
+       _p->plugin.event_callback = _prefix##_process_event; \
+       _p->plugin.terminate_callback = _prefix##_process_terminate; \
+\
+       svc_plugin_init((rdpSvcPlugin*)_p, pEntryPoints); \
+\
+       return 1; \
+}
+
+#endif /* __SVC_PLUGIN_UTILS_H */
diff --git a/include/freerdp/utils/thread.h b/include/freerdp/utils/thread.h
new file mode 100644 (file)
index 0000000..10fe682
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Thread Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __THREAD_UTILS_H
+#define __THREAD_UTILS_H
+
+#include <freerdp/api.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/mutex.h>
+#include <freerdp/utils/wait_obj.h>
+#ifndef _WIN32
+#include <pthread.h>
+#endif
+
+typedef struct _freerdp_thread freerdp_thread;
+
+struct _freerdp_thread
+{
+       freerdp_mutex* mutex;
+
+       struct wait_obj* signals[5];
+       int num_signals;
+
+       int status;
+};
+
+FREERDP_API freerdp_thread* freerdp_thread_new(void);
+FREERDP_API void freerdp_thread_start(freerdp_thread* thread, void* func, void* arg);
+FREERDP_API void freerdp_thread_stop(freerdp_thread* thread);
+FREERDP_API void freerdp_thread_free(freerdp_thread* thread);
+
+#define freerdp_thread_wait(_t) wait_obj_select(_t->signals, _t->num_signals, -1)
+#define freerdp_thread_wait_timeout(_t, _timeout) wait_obj_select(_t->signals, _t->num_signals, _timeout)
+#define freerdp_thread_is_stopped(_t) wait_obj_is_set(_t->signals[0])
+#define freerdp_thread_is_running(_t) (_t->status == 1)
+#define freerdp_thread_quit(_t) do { \
+       _t->status = -1; \
+       wait_obj_clear(_t->signals[0]); } while (0)
+#define freerdp_thread_signal(_t) wait_obj_set(_t->signals[1])
+#define freerdp_thread_reset(_t) wait_obj_clear(_t->signals[1])
+#define freerdp_thread_lock(_t) freerdp_mutex_lock(_t->mutex)
+#define freerdp_thread_unlock(_t) freerdp_mutex_unlock(_t->mutex)
+
+#endif /* __THREAD_UTILS_H */
diff --git a/include/freerdp/utils/unicode.h b/include/freerdp/utils/unicode.h
new file mode 100644 (file)
index 0000000..7268a8e
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Unicode Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UNICODE_UTILS_H
+#define __UNICODE_UTILS_H
+
+#include <stdio.h>
+#include <string.h>
+#include <freerdp/api.h>
+
+#define DEFAULT_CODEPAGE       "UTF-8"
+#define WINDOWS_CODEPAGE       "UTF-16LE"
+
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#endif
+
+#ifndef ICONV_CONST
+#define ICONV_CONST ""
+#endif
+
+struct _UNICONV
+{
+       int iconv;
+#ifdef HAVE_ICONV
+       iconv_t* in_iconv_h;
+       iconv_t* out_iconv_h;
+#endif
+};
+typedef struct _UNICONV UNICONV;
+
+FREERDP_API UNICONV* freerdp_uniconv_new();
+FREERDP_API void freerdp_uniconv_free(UNICONV *uniconv);
+FREERDP_API char* freerdp_uniconv_in(UNICONV *uniconv, unsigned char* pin, size_t in_len);
+FREERDP_API char* freerdp_uniconv_out(UNICONV *uniconv, char *str, size_t *pout_len);
+FREERDP_API void freerdp_uniconv_uppercase(UNICONV *uniconv, char *wstr, int length);
+
+#endif /* __UNICODE_UTILS_H */
diff --git a/include/freerdp/utils/wait_obj.h b/include/freerdp/utils/wait_obj.h
new file mode 100644 (file)
index 0000000..a202a25
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Virtual Channel Manager
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WAIT_OBJ_UTILS
+#define __WAIT_OBJ_UTILS
+
+#include <freerdp/api.h>
+
+FREERDP_API struct wait_obj* wait_obj_new(void);
+FREERDP_API struct wait_obj* wait_obj_new_with_fd(void* fd);
+FREERDP_API void wait_obj_free(struct wait_obj* obj);
+FREERDP_API int wait_obj_is_set(struct wait_obj* obj);
+FREERDP_API void wait_obj_set(struct wait_obj* obj);
+FREERDP_API void wait_obj_clear(struct wait_obj* obj);
+FREERDP_API int wait_obj_select(struct wait_obj** listobj, int numobj, int timeout);
+FREERDP_API void wait_obj_get_fds(struct wait_obj* obj, void** fds, int* count);
+
+#endif
diff --git a/include/freerdp/window.h b/include/freerdp/window.h
new file mode 100644 (file)
index 0000000..4eff0e6
--- /dev/null
@@ -0,0 +1,265 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Window Alternate Secondary Drawing Orders Interface API
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_WINDOW_H
+#define __UPDATE_WINDOW_H
+
+#include <freerdp/types.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+/* Window Order Header Flags */
+#define WINDOW_ORDER_TYPE_WINDOW                       0x01000000
+#define WINDOW_ORDER_TYPE_NOTIFY                       0x02000000
+#define WINDOW_ORDER_TYPE_DESKTOP                      0x04000000
+#define WINDOW_ORDER_STATE_NEW                         0x10000000
+#define WINDOW_ORDER_STATE_DELETED                     0x20000000
+#define WINDOW_ORDER_FIELD_OWNER                       0x00000002
+#define WINDOW_ORDER_FIELD_STYLE                       0x00000008
+#define WINDOW_ORDER_FIELD_SHOW                                0x00000010
+#define WINDOW_ORDER_FIELD_TITLE                       0x00000004
+#define WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET          0x00004000
+#define WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE            0x00010000
+#define WINDOW_ORDER_FIELD_RP_CONTENT                  0x00020000
+#define WINDOW_ORDER_FIELD_ROOT_PARENT                 0x00040000
+#define WINDOW_ORDER_FIELD_WND_OFFSET                  0x00000800
+#define WINDOW_ORDER_FIELD_WND_CLIENT_DELTA            0x00008000
+#define WINDOW_ORDER_FIELD_WND_SIZE                    0x00000400
+#define WINDOW_ORDER_FIELD_WND_RECTS                   0x00000100
+#define WINDOW_ORDER_FIELD_VIS_OFFSET                  0x00001000
+#define WINDOW_ORDER_FIELD_VISIBILITY                  0x00000200
+#define WINDOW_ORDER_FIELD_ICON_BIG                    0x00002000
+#define WINDOW_ORDER_ICON                              0x40000000
+#define WINDOW_ORDER_CACHED_ICON                       0x80000000
+#define WINDOW_ORDER_FIELD_NOTIFY_VERSION              0x00000008
+#define WINDOW_ORDER_FIELD_NOTIFY_TIP                  0x00000001
+#define WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP             0x00000002
+#define WINDOW_ORDER_FIELD_NOTIFY_STATE                        0x00000004
+#define WINDOW_ORDER_FIELD_DESKTOP_NONE                        0x00000001
+#define WINDOW_ORDER_FIELD_DESKTOP_HOOKED              0x00000002
+#define WINDOW_ORDER_FIELD_DESKTOP_ARC_COMPLETED       0x00000004
+#define WINDOW_ORDER_FIELD_DESKTOP_ARC_BEGAN           0x00000008
+#define WINDOW_ORDER_FIELD_DESKTOP_ZORDER              0x00000010
+#define WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND          0x00000020
+
+/* Window Show States */
+#define WINDOW_HIDE                                    0x00
+#define WINDOW_SHOW_MINIMIZED                          0x02
+#define WINDOW_SHOW_MAXIMIZED                          0x03
+#define WINDOW_SHOW                                    0x05
+
+/* Window Styles */
+#ifndef _WIN32
+#define WS_BORDER                      0x00800000
+#define WS_CAPTION                     0x00C00000
+#define WS_CHILD                       0x40000000
+#define WS_CLIPCHILDREN                        0x02000000
+#define WS_CLIPSIBLINGS                        0x04000000
+#define WS_DISABLED                    0x08000000
+#define WS_DLGFRAME                    0x00400000
+#define WS_GROUP                       0x00020000
+#define WS_HSCROLL                     0x00100000
+#define WS_ICONIC                      0x20000000
+#define WS_MAXIMIZE                    0x01000000
+#define WS_MAXIMIZEBOX                 0x00010000
+#define WS_MINIMIZE                    0x20000000
+#define WS_MINIMIZEBOX                 0x00020000
+#define WS_OVERLAPPED                  0x00000000
+#define WS_OVERLAPPEDWINDOW            (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX)
+#define WS_POPUP                       0x80000000
+#define WS_POPUPWINDOW                 (WS_POPUP | WS_BORDER | WS_SYSMENU)
+#define WS_SIZEBOX                     0x00040000
+#define WS_SYSMENU                     0x00080000
+#define WS_TABSTOP                     0x00010000
+#define WS_THICKFRAME                  0x00040000
+#define WS_VISIBLE                     0x10000000
+#define WS_VSCROLL                     0x00200000
+#endif
+
+/* Extended Window Styles */
+#ifndef _WIN32
+#define WS_EX_ACCEPTFILES              0x00000010
+#define WS_EX_APPWINDOW                        0x00040000
+#define WS_EX_CLIENTEDGE               0x00000200
+#define WS_EX_COMPOSITED               0x02000000
+#define WS_EX_CONTEXTHELP              0x00000400
+#define WS_EX_CONTROLPARENT            0x00010000
+#define WS_EX_DLGMODALFRAME            0x00000001
+#define WS_EX_LAYERED                  0x00080000
+#define WS_EX_LAYOUTRTL                        0x00400000
+#define WS_EX_LEFT                     0x00000000
+#define WS_EX_LEFTSCROLLBAR            0x00004000
+#define WS_EX_LTRREADING               0x00000000
+#define WS_EX_MDICHILD                 0x00000040
+#define WS_EX_NOACTIVATE               0x08000000
+#define WS_EX_NOINHERITLAYOUT          0x00100000
+#define WS_EX_NOPARENTNOTIFY           0x00000004
+#define WS_EX_OVERLAPPEDWINDOW         (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
+#define WS_EX_PALETTEWINDOW            (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)
+#define WS_EX_RIGHT                    0x00001000
+#define WS_EX_RIGHTSCROLLBAR           0x00000000
+#define WS_EX_RTLREADING               0x00002000
+#define WS_EX_STATICEDGE               0x00020000
+#define WS_EX_TOOLWINDOW               0x00000080
+#define WS_EX_TOPMOST                  0x00000008
+#define WS_EX_TRANSPARENT              0x00000020
+#define WS_EX_WINDOWEDGE               0x00000100
+#endif
+
+struct _WINDOW_ORDER_INFO
+{
+       uint32 windowId;
+       uint32 fieldFlags;
+       uint32 notifyIconId;
+};
+typedef struct _WINDOW_ORDER_INFO WINDOW_ORDER_INFO;
+
+struct _ICON_INFO
+{
+       uint32 cacheEntry;
+       uint32 cacheId;
+       uint32 bpp;
+       uint32 width;
+       uint32 height;
+       uint32 cbColorTable;
+       uint32 cbBitsMask;
+       uint32 cbBitsColor;
+       uint8* bitsMask;
+       uint8* colorTable;
+       uint8* bitsColor;
+};
+typedef struct _ICON_INFO ICON_INFO;
+
+struct _CACHED_ICON_INFO
+{
+       uint32 cacheEntry;
+       uint32 cacheId;
+};
+typedef struct _CACHED_ICON_INFO CACHED_ICON_INFO;
+
+struct _NOTIFY_ICON_INFOTIP
+{
+       uint32 timeout;
+       uint32 flags;
+       UNICODE_STRING text;
+       UNICODE_STRING title;
+};
+typedef struct _NOTIFY_ICON_INFOTIP NOTIFY_ICON_INFOTIP;
+
+struct _WINDOW_STATE_ORDER
+{
+       uint32 ownerWindowId;
+       uint32 style;
+       uint32 extendedStyle;
+       uint32 showState;
+       UNICODE_STRING titleInfo;
+       uint32 clientOffsetX;
+       uint32 clientOffsetY;
+       uint32 clientAreaWidth;
+       uint32 clientAreaHeight;
+       uint32 RPContent;
+       uint32 rootParentHandle;
+       uint32 windowOffsetX;
+       uint32 windowOffsetY;
+       uint32 windowClientDeltaX;
+       uint32 windowClientDeltaY;
+       uint32 windowWidth;
+       uint32 windowHeight;
+       uint32 numWindowRects;
+       RECTANGLE_16* windowRects;
+       uint32 visibleOffsetX;
+       uint32 visibleOffsetY;
+       uint32 numVisibilityRects;
+       RECTANGLE_16* visibilityRects;
+};
+typedef struct _WINDOW_STATE_ORDER WINDOW_STATE_ORDER;
+
+struct _WINDOW_ICON_ORDER
+{
+       ICON_INFO* iconInfo;
+};
+typedef struct _WINDOW_ICON_ORDER WINDOW_ICON_ORDER;
+
+struct _WINDOW_CACHED_ICON_ORDER
+{
+       CACHED_ICON_INFO cachedIcon;
+};
+typedef struct _WINDOW_CACHED_ICON_ORDER WINDOW_CACHED_ICON_ORDER;
+
+struct _NOTIFY_ICON_STATE_ORDER
+{
+       uint32 version;
+       UNICODE_STRING toolTip;
+       NOTIFY_ICON_INFOTIP infoTip;
+       uint32 state;
+       ICON_INFO icon;
+       CACHED_ICON_INFO cachedIcon;
+};
+typedef struct _NOTIFY_ICON_STATE_ORDER NOTIFY_ICON_STATE_ORDER;
+
+struct _MONITORED_DESKTOP_ORDER
+{
+       uint32 activeWindowId;
+       uint32 numWindowIds;
+       uint32* windowIds;
+};
+typedef struct _MONITORED_DESKTOP_ORDER MONITORED_DESKTOP_ORDER;
+
+typedef void (*pWindowCreate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state);
+typedef void (*pWindowUpdate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state);
+typedef void (*pWindowIcon)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* window_icon);
+typedef void (*pWindowCachedIcon)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon);
+typedef void (*pWindowDelete)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo);
+typedef void (*pNotifyIconCreate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state);
+typedef void (*pNotifyIconUpdate)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state);
+typedef void (*pNotifyIconDelete)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo);
+typedef void (*pMonitoredDesktop)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitored_desktop);
+typedef void (*pNonMonitoredDesktop)(rdpContext* context, WINDOW_ORDER_INFO* orderInfo);
+
+struct rdp_window_update
+{
+       rdpContext* context; /* 0 */
+       uint32 paddingA[16 - 1]; /* 1 */
+
+       pWindowCreate WindowCreate; /* 16 */
+       pWindowUpdate WindowUpdate; /* 17 */
+       pWindowIcon WindowIcon; /* 18 */
+       pWindowCachedIcon WindowCachedIcon; /* 19 */
+       pWindowDelete WindowDelete; /* 20 */
+       pNotifyIconCreate NotifyIconCreate; /* 21 */
+       pNotifyIconUpdate NotifyIconUpdate; /* 22 */
+       pNotifyIconDelete NotifyIconDelete; /* 23 */
+       pMonitoredDesktop MonitoredDesktop; /* 24 */
+       pNonMonitoredDesktop NonMonitoredDesktop; /* 25 */
+       uint32 paddingB[32 - 26]; /* 26 */
+
+       /* internal */
+
+       WINDOW_ORDER_INFO orderInfo;
+       WINDOW_STATE_ORDER window_state;
+       WINDOW_ICON_ORDER window_icon;
+       WINDOW_CACHED_ICON_ORDER window_cached_icon;
+       NOTIFY_ICON_STATE_ORDER notify_icon_state;
+       MONITORED_DESKTOP_ORDER monitored_desktop;
+};
+typedef struct rdp_window_update rdpWindowUpdate;
+
+#endif /* __UPDATE_WINDOW_H */
diff --git a/keymaps/CMakeLists.txt b/keymaps/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b6a6c4f
--- /dev/null
@@ -0,0 +1,3 @@
+install(FILES aliases amiga ataritt empty evdev fujitsu hp ibm macintosh macosx sony sun xfree86 xfree98 xkb.pl DESTINATION share/freerdp/keymaps)
+install(DIRECTORY digital_vndr DESTINATION share/freerdp/keymaps FILES_MATCHING PATTERN "*")
+install(DIRECTORY sgi_vndr DESTINATION share/freerdp/keymaps FILES_MATCHING PATTERN "*")
diff --git a/keymaps/aliases b/keymaps/aliases
new file mode 100644 (file)
index 0000000..e26c243
--- /dev/null
@@ -0,0 +1,17 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "qwerty"
+{
+};
+
+keyboard "azerty"
+{
+};
+
+keyboard "qwertz"
+{
+};
+
diff --git a/keymaps/amiga b/keymaps/amiga
new file mode 100644 (file)
index 0000000..7ac2df8
--- /dev/null
@@ -0,0 +1,193 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "usa1"
+{
+       VK_ESCAPE       <77>
+       VK_F1           <88>
+       VK_F2           <89>
+       VK_F3           <90>
+       VK_F4           <91>
+       VK_F5           <92>
+       VK_F6           <93>
+       VK_F7           <94>
+       VK_F8           <95>
+       VK_F9           <96>
+       VK_F10          <97>
+       VK_OEM_3        <8>
+       VK_KEY_1        <9>
+       VK_KEY_2        <10>
+       VK_KEY_3        <11>
+       VK_KEY_4        <12>
+       VK_KEY_5        <13>
+       VK_KEY_6        <14>
+       VK_KEY_7        <15>
+       VK_KEY_8        <16>
+       VK_KEY_9        <17>
+       VK_KEY_0        <18>
+       VK_OEM_MINUS    <19>
+       VK_OEM_PLUS     <20>
+       VK_OEM_5        <21>
+       VK_BACK         <73>
+       VK_TAB          <74>
+       VK_KEY_Q        <24>
+       VK_KEY_W        <25>
+       VK_KEY_E        <26>
+       VK_KEY_R        <27>
+       VK_KEY_T        <28>
+       VK_KEY_Y        <29>
+       VK_KEY_U        <30>
+       VK_KEY_I        <31>
+       VK_KEY_O        <32>
+       VK_KEY_P        <33>
+       VK_OEM_4        <34>
+       VK_OEM_6        <35>
+       VK_RETURN       <76>
+       VK_LCONTROL     <107>
+       VK_CAPITAL      <106>
+       VK_KEY_A        <40>
+       VK_KEY_S        <41>
+       VK_KEY_D        <42>
+       VK_KEY_F        <43>
+       VK_KEY_G        <44>
+       VK_KEY_H        <45>
+       VK_KEY_J        <46>
+       VK_KEY_K        <47>
+       VK_KEY_L        <48>
+       VK_OEM_1        <49>
+       VK_OEM_7        <50>
+       VK_LSHIFT       <104>
+       VK_KEY_Z        <57>
+       VK_KEY_X        <58>
+       VK_KEY_C        <59>
+       VK_KEY_V        <60>
+       VK_KEY_B        <61>
+       VK_KEY_N        <62>
+       VK_KEY_M        <63>
+       VK_OEM_COMMA    <64>
+       VK_OEM_PERIOD   <65>
+       VK_OEM_2        <66>
+       VK_RSHIFT       <105>
+       VK_LMENU        <108>
+       VK_SPACE        <72>
+       VK_RMENU        <109>
+       VK_DELETE       <78>
+       VK_HELP         <103>
+       VK_UP           <84>
+       VK_LEFT         <87>
+       VK_DOWN         <85>
+       VK_RIGHT        <86>
+       VK_DIVIDE       <100>
+       VK_MULTIPLY     <101>
+       VK_NUMPAD7      <69>
+       VK_NUMPAD8      <70>
+       VK_NUMPAD9      <71>
+       VK_SUBTRACT     <82>
+       VK_NUMPAD4      <53>
+       VK_NUMPAD5      <54>
+       VK_NUMPAD6      <55>
+       VK_ADD          <102>
+       VK_NUMPAD1      <37>
+       VK_NUMPAD2      <38>
+       VK_NUMPAD3      <39>
+       VK_NUMPAD0      <23>
+       VK_RETURN       <75>
+};
+
+keyboard "de"
+{
+       VK_ESCAPE       <77>
+       VK_F1           <88>
+       VK_F2           <89>
+       VK_F3           <90>
+       VK_F4           <91>
+       VK_F5           <92>
+       VK_F6           <93>
+       VK_F7           <94>
+       VK_F8           <95>
+       VK_F9           <96>
+       VK_F10          <97>
+       VK_OEM_3        <8>
+       VK_KEY_1        <9>
+       VK_KEY_2        <10>
+       VK_KEY_3        <11>
+       VK_KEY_4        <12>
+       VK_KEY_5        <13>
+       VK_KEY_6        <14>
+       VK_KEY_7        <15>
+       VK_KEY_8        <16>
+       VK_KEY_9        <17>
+       VK_KEY_0        <18>
+       VK_OEM_MINUS    <19>
+       VK_OEM_PLUS     <20>
+       VK_OEM_5        <21>
+       VK_BACK         <73>
+       VK_TAB          <74>
+       VK_KEY_Q        <24>
+       VK_KEY_W        <25>
+       VK_KEY_E        <26>
+       VK_KEY_R        <27>
+       VK_KEY_T        <28>
+       VK_KEY_Y        <29>
+       VK_KEY_U        <30>
+       VK_KEY_I        <31>
+       VK_KEY_O        <32>
+       VK_KEY_P        <33>
+       VK_OEM_4        <34>
+       VK_OEM_6        <35>
+       VK_RETURN       <76>
+       VK_LCONTROL     <107>
+       VK_CAPITAL      <106>
+       VK_KEY_A        <40>
+       VK_KEY_S        <41>
+       VK_KEY_D        <42>
+       VK_KEY_F        <43>
+       VK_KEY_G        <44>
+       VK_KEY_H        <45>
+       VK_KEY_J        <46>
+       VK_KEY_K        <47>
+       VK_KEY_L        <48>
+       VK_OEM_1        <49>
+       VK_OEM_7        <50>
+       VK_OEM_5        <51>
+       VK_LSHIFT       <104>
+       VK_OEM_102      <56>
+       VK_KEY_Z        <57>
+       VK_KEY_X        <58>
+       VK_KEY_C        <59>
+       VK_KEY_V        <60>
+       VK_KEY_B        <61>
+       VK_KEY_N        <62>
+       VK_KEY_M        <63>
+       VK_OEM_COMMA    <64>
+       VK_OEM_PERIOD   <65>
+       VK_OEM_2        <66>
+       VK_RSHIFT       <105>
+       VK_LMENU        <108>
+       VK_SPACE        <72>
+       VK_RMENU        <109>
+       VK_DELETE       <78>
+       VK_HELP         <103>
+       VK_UP           <84>
+       VK_LEFT         <87>
+       VK_DOWN         <85>
+       VK_RIGHT        <86>
+       VK_DIVIDE       <100>
+       VK_MULTIPLY     <101>
+       VK_NUMPAD7      <69>
+       VK_NUMPAD8      <70>
+       VK_NUMPAD9      <71>
+       VK_SUBTRACT     <82>
+       VK_NUMPAD4      <53>
+       VK_NUMPAD5      <54>
+       VK_NUMPAD6      <55>
+       VK_ADD          <102>
+       VK_NUMPAD1      <37>
+       VK_NUMPAD2      <38>
+       VK_NUMPAD3      <39>
+       VK_NUMPAD0      <23>
+       VK_RETURN       <75>
+};
+
diff --git a/keymaps/ataritt b/keymaps/ataritt
new file mode 100644 (file)
index 0000000..4229cea
--- /dev/null
@@ -0,0 +1,104 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "us"
+{
+       VK_ESCAPE       <9>
+       VK_KEY_1        <10>
+       VK_KEY_2        <11>
+       VK_KEY_3        <12>
+       VK_KEY_4        <13>
+       VK_KEY_5        <14>
+       VK_KEY_6        <15>
+       VK_KEY_7        <16>
+       VK_KEY_8        <17>
+       VK_KEY_9        <18>
+       VK_KEY_0        <19>
+       VK_OEM_MINUS    <20>
+       VK_OEM_PLUS     <21>
+       VK_OEM_3        <49>
+       VK_BACK         <22>
+       VK_TAB          <23>
+       VK_KEY_Q        <24>
+       VK_KEY_W        <25>
+       VK_KEY_E        <26>
+       VK_KEY_R        <27>
+       VK_KEY_T        <28>
+       VK_KEY_Y        <29>
+       VK_KEY_U        <30>
+       VK_KEY_I        <31>
+       VK_KEY_O        <32>
+       VK_KEY_P        <33>
+       VK_OEM_4        <34>
+       VK_OEM_6        <35>
+       VK_RETURN       <36>
+       VK_DELETE       <91>
+       VK_LCONTROL     <37>
+       VK_KEY_A        <38>
+       VK_KEY_S        <39>
+       VK_KEY_D        <40>
+       VK_KEY_F        <41>
+       VK_KEY_G        <42>
+       VK_KEY_H        <43>
+       VK_KEY_J        <44>
+       VK_KEY_K        <45>
+       VK_KEY_L        <46>
+       VK_OEM_1        <47>
+       VK_OEM_7        <48>
+       VK_OEM_5        <51>
+       VK_LSHIFT       <50>
+       VK_KEY_Z        <52>
+       VK_KEY_X        <53>
+       VK_KEY_C        <54>
+       VK_KEY_V        <55>
+       VK_KEY_B        <56>
+       VK_KEY_N        <57>
+       VK_KEY_M        <58>
+       VK_OEM_COMMA    <59>
+       VK_OEM_PERIOD   <60>
+       VK_OEM_2        <61>
+       VK_RSHIFT       <62>
+       VK_SPACE        <65>
+       VK_CAPITAL      <66>
+       VK_F1           <67>
+       VK_F2           <68>
+       VK_F3           <69>
+       VK_F4           <70>
+       VK_F5           <71>
+       VK_F6           <72>
+       VK_F7           <73>
+       VK_F8           <74>
+       VK_F9           <75>
+       VK_F10          <76>
+       VK_HELP         <106>
+       VK_INSERT       <90>
+       VK_HOME         <79>
+       VK_UP           <80>
+       VK_LEFT         <83>
+       VK_DOWN         <88>
+       VK_RIGHT        <85>
+       VK_DIVIDE       <109>
+       VK_MULTIPLY     <110>
+       VK_NUMPAD7      <111>
+       VK_NUMPAD8      <112>
+       VK_NUMPAD9      <113>
+       VK_SUBTRACT     <82>
+       VK_NUMPAD4      <114>
+       VK_NUMPAD5      <115>
+       VK_NUMPAD6      <116>
+       VK_ADD          <86>
+       VK_NUMPAD1      <117>
+       VK_NUMPAD2      <118>
+       VK_NUMPAD3      <119>
+       VK_NUMPAD0      <120>
+       VK_RETURN       <122>
+};
+
+keyboard "de"
+: extends "ataritt(us)"
+{
+       VK_OEM_102      <104>
+};
+
diff --git a/keymaps/digital_vndr/lk b/keymaps/digital_vndr/lk
new file mode 100644 (file)
index 0000000..77ff19c
--- /dev/null
@@ -0,0 +1,197 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "lk_common"
+{
+       VK_F1           <86>
+       VK_F2           <87>
+       VK_F3           <88>
+       VK_F4           <89>
+       VK_F5           <90>
+       VK_F6           <100>
+       VK_F7           <101>
+       VK_F8           <102>
+       VK_F9           <103>
+       VK_F10          <104>
+       VK_F11          <113>
+       VK_F12          <114>
+       VK_UP           <170>
+       VK_LEFT         <167>
+       VK_DOWN         <169>
+       VK_RIGHT        <168>
+       VK_NUMPAD7      <157>
+       VK_NUMPAD8      <158>
+       VK_NUMPAD9      <159>
+       VK_NUMPAD4      <153>
+       VK_NUMPAD5      <154>
+       VK_NUMPAD6      <155>
+       VK_NUMPAD1      <150>
+       VK_NUMPAD2      <151>
+       VK_NUMPAD3      <152>
+       VK_RETURN       <149>
+       VK_NUMPAD0      <146>
+       VK_DECIMAL      <148>
+       VK_TILDE        <191>
+       VK_KEY_1        <192>
+       VK_KEY_2        <197>
+       VK_KEY_3        <203>
+       VK_KEY_4        <208>
+       VK_KEY_5        <214>
+       VK_KEY_6        <219>
+       VK_KEY_7        <224>
+       VK_KEY_8        <229>
+       VK_KEY_9        <234>
+       VK_KEY_0        <239>
+       VK_OEM_MINUS    <249>
+       VK_OEM_PLUS     <245>
+       VK_BACK         <188>
+       VK_TAB          <190>
+       VK_KEY_Q        <193>
+       VK_KEY_W        <198>
+       VK_KEY_E        <204>
+       VK_KEY_R        <209>
+       VK_KEY_T        <215>
+       VK_KEY_Y        <220>
+       VK_KEY_U        <225>
+       VK_KEY_I        <230>
+       VK_KEY_O        <235>
+       VK_KEY_P        <240>
+       VK_OEM_4        <250>
+       VK_OEM_6        <246>
+       VK_RETURN       <189>
+       VK_LCONTROL     <175>
+       VK_CAPITAL      <176>
+       VK_KEY_A        <194>
+       VK_KEY_S        <199>
+       VK_KEY_D        <205>
+       VK_KEY_F        <210>
+       VK_KEY_G        <216>
+       VK_KEY_H        <221>
+       VK_KEY_J        <226>
+       VK_KEY_K        <231>
+       VK_KEY_L        <236>
+       VK_OEM_1        <242>
+       VK_OEM_7        <251>
+       VK_LSHIFT       <174>
+       VK_KEY_Z        <195>
+       VK_KEY_X        <200>
+       VK_KEY_C        <206>
+       VK_KEY_V        <211>
+       VK_KEY_B        <217>
+       VK_KEY_N        <222>
+       VK_KEY_M        <227>
+       VK_OEM_COMMA    <232>
+       VK_OEM_PERIOD   <237>
+       VK_OEM_2        <243>
+       VK_RSHIFT       <171>
+       VK_SPACE        <212>
+};
+
+keyboard "lkx01"
+: extends "digital_vndr/lk(lk_common)"
+{
+       VK_LSHIFT       <201>
+       VK_F13          <115>
+       VK_F14          <116>
+       VK_F17          <128>
+       VK_F18          <129>
+       VK_F19          <130>
+       VK_F20          <131>
+       VK_HELP         <124>
+       VK_INSERT       <139>
+       VK_DELETE       <140>
+       VK_SELECT       <141>
+       VK_PRIOR        <142>
+       VK_NEXT         <143>
+       VK_NUMLOCK      <161>
+       VK_DIVIDE       <162>
+       VK_MULTIPLY     <163>
+       VK_SUBTRACT     <164>
+       VK_SUBTRACT     <160>
+       VK_ADD          <156>
+       VK_OEM_5        <247>
+};
+
+keyboard "lk201"
+: extends "digital_vndr/lk(lkx01)"
+{
+};
+
+keyboard "lk421"
+: extends "digital_vndr/lk(lkx01)"
+{
+       VK_LMENU        <172>
+       VK_RMENU        <178>
+};
+
+keyboard "lk401"
+: extends "digital_vndr/lk(lk421)"
+{
+};
+
+keyboard "lk44x"
+: extends "digital_vndr/lk(lk_common)"
+{
+       VK_ESCAPE       <85>
+       VK_SNAPSHOT     <115>
+       VK_SCROLL       <116>
+       VK_PAUSE        <124>
+       VK_INSERT       <138>
+       VK_HOME         <139>
+       VK_PRIOR        <140>
+       VK_DELETE       <141>
+       VK_END          <142>
+       VK_NEXT         <143>
+       VK_NUMLOCK      <161>
+       VK_DIVIDE       <162>
+       VK_MULTIPLY     <163>
+       VK_SUBTRACT     <164>
+       VK_ADD          <156>
+       VK_LMENU        <172>
+       VK_RMENU        <178>
+       VK_RCONTROL     <173>
+};
+
+keyboard "lk443"
+: extends "digital_vndr/lk(lk44x)"
+{
+       VK_OEM_5        <247>
+};
+
+keyboard "lk444"
+: extends "digital_vndr/lk(lk44x)"
+{
+       VK_OEM_5        <201>
+       VK_OEM_5        <247>
+};
+
+keyboard "lk421aj"
+: extends "digital_vndr/lk(lk421)"
+{
+       VK_ABNT_C1      <252>
+};
+
+keyboard "lk421jj"
+: extends "digital_vndr/lk(lk421aj)"
+{
+       VK_NONCONVERT   <94>
+       VK_KANJI        <95>
+       VK_KANA         <97>
+};
+
+keyboard "lk401bj"
+: extends "digital_vndr/lk(lk401)"
+{
+       VK_NONCONVERT   <94>
+       VK_KANJI        <95>
+       VK_KANA         <97>
+};
+
+keyboard "lk401jj"
+: extends "digital_vndr/lk(lk401bj)"
+{
+       VK_ABNT_C1      <252>
+};
+
diff --git a/keymaps/digital_vndr/pc b/keymaps/digital_vndr/pc
new file mode 100644 (file)
index 0000000..81dabb9
--- /dev/null
@@ -0,0 +1,192 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "pc_common"
+{
+       VK_F1           <9>
+       VK_F2           <15>
+       VK_F3           <23>
+       VK_F4           <31>
+       VK_F5           <39>
+       VK_F6           <47>
+       VK_F7           <55>
+       VK_F8           <63>
+       VK_F9           <71>
+       VK_F10          <79>
+       VK_F11          <86>
+       VK_F12          <94>
+       VK_UP           <99>
+       VK_LEFT         <97>
+       VK_DOWN         <96>
+       VK_RIGHT        <106>
+       VK_NUMPAD7      <108>
+       VK_NUMPAD8      <117>
+       VK_NUMPAD9      <125>
+       VK_NUMPAD4      <107>
+       VK_NUMPAD5      <115>
+       VK_NUMPAD6      <116>
+       VK_NUMPAD1      <105>
+       VK_NUMPAD2      <114>
+       VK_NUMPAD3      <122>
+       VK_RETURN       <121>
+       VK_NUMPAD0      <112>
+       VK_DECIMAL      <113>
+       VK_KEY_1        <22>
+       VK_KEY_2        <30>
+       VK_KEY_3        <38>
+       VK_KEY_4        <37>
+       VK_KEY_5        <46>
+       VK_KEY_6        <54>
+       VK_KEY_7        <61>
+       VK_KEY_8        <62>
+       VK_KEY_9        <70>
+       VK_KEY_0        <69>
+       VK_OEM_MINUS    <78>
+       VK_OEM_PLUS     <85>
+       VK_BACK         <102>
+       VK_TAB          <13>
+       VK_KEY_Q        <21>
+       VK_KEY_W        <29>
+       VK_KEY_E        <36>
+       VK_KEY_R        <45>
+       VK_KEY_T        <44>
+       VK_KEY_Y        <53>
+       VK_KEY_U        <60>
+       VK_KEY_I        <67>
+       VK_KEY_O        <68>
+       VK_KEY_P        <77>
+       VK_OEM_4        <84>
+       VK_OEM_6        <91>
+       VK_CAPITAL      <20>
+       VK_KEY_A        <28>
+       VK_KEY_S        <27>
+       VK_KEY_D        <35>
+       VK_KEY_F        <43>
+       VK_KEY_G        <52>
+       VK_KEY_H        <51>
+       VK_KEY_J        <59>
+       VK_KEY_K        <66>
+       VK_KEY_L        <75>
+       VK_OEM_1        <76>
+       VK_OEM_7        <82>
+       VK_RETURN       <90>
+       VK_LSHIFT       <18>
+       VK_KEY_Z        <26>
+       VK_KEY_X        <34>
+       VK_KEY_C        <33>
+       VK_KEY_V        <42>
+       VK_KEY_B        <50>
+       VK_KEY_N        <49>
+       VK_KEY_M        <58>
+       VK_OEM_COMMA    <65>
+       VK_OEM_PERIOD   <73>
+       VK_OEM_2        <74>
+       VK_RSHIFT       <89>
+       VK_LCONTROL     <17>
+       VK_LMENU        <25>
+       VK_SPACE        <41>
+       VK_RMENU        <57>
+};
+
+keyboard "pc10x"
+: extends "digital_vndr/pc(pc_common)"
+{
+       VK_ESCAPE       <8>
+       VK_TILDE        <14>
+       VK_SNAPSHOT     <87>
+       VK_SCROLL       <95>
+       VK_PAUSE        <98>
+       VK_INSERT       <103>
+       VK_HOME         <110>
+       VK_PRIOR        <111>
+       VK_DELETE       <100>
+       VK_END          <101>
+       VK_NEXT         <109>
+       VK_NUMLOCK      <118>
+       VK_DIVIDE       <119>
+       VK_MULTIPLY     <126>
+       VK_SUBTRACT     <132>
+       VK_ADD          <124>
+       VK_RCONTROL     <88>
+};
+
+keyboard "pc101"
+: extends "digital_vndr/pc(pc10x)"
+{
+       VK_OEM_5        <92>
+};
+
+keyboard "pc102"
+: extends "digital_vndr/pc(pc10x)"
+{
+       VK_OEM_5        <19>
+       VK_OEM_5        <83>
+};
+
+keyboard "pc104"
+: extends "digital_vndr/pc(pc101)"
+{
+       VK_LWIN         <139>
+       VK_RWIN         <140>
+       VK_APPS         <141>
+};
+
+keyboard "lk411_common"
+: extends "digital_vndr/pc(pc_common)"
+{
+       VK_TILDE        <8>
+       VK_LSHIFT       <14>
+       VK_F13          <24>
+       VK_F14          <10>
+       VK_F17          <16>
+       VK_F18          <87>
+       VK_F19          <95>
+       VK_F20          <98>
+       VK_HELP         <11>
+       VK_INSERT       <103>
+       VK_DELETE       <100>
+       VK_SELECT       <101>
+       VK_PRIOR        <111>
+       VK_NEXT         <109>
+       VK_NUMLOCK      <118>
+       VK_DIVIDE       <119>
+       VK_MULTIPLY     <126>
+       VK_SUBTRACT     <132>
+       VK_SUBTRACT     <19>
+       VK_ADD          <124>
+};
+
+keyboard "lk411"
+: extends "digital_vndr/pc(lk411_common)"
+{
+       VK_OEM_5        <92>
+};
+
+keyboard "lk450"
+: extends "digital_vndr/pc(lk411)"
+{
+};
+
+keyboard "pcxajaa"
+: extends "digital_vndr/pc(pc10x)"
+{
+       VK_OEM_5        <93>
+       VK_OEM_5        <83>
+       VK_ABNT_C1      <81>
+       VK_NONCONVERT   <133>
+       VK_KANJI        <134>
+       VK_KANA         <135>
+};
+
+keyboard "lk411jj"
+: extends "digital_vndr/pc(lk411_common)"
+{
+       VK_ABNT_C1      <81>
+       VK_OEM_5        <83>
+       VK_NONCONVERT   <133>
+       VK_KANJI        <134>
+       VK_KANA         <135>
+};
+
diff --git a/keymaps/empty b/keymaps/empty
new file mode 100644 (file)
index 0000000..b0c6667
--- /dev/null
@@ -0,0 +1,13 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "empty"
+{
+};
+
+keyboard "empty"
+{
+};
+
diff --git a/keymaps/evdev b/keymaps/evdev
new file mode 100644 (file)
index 0000000..cb78135
--- /dev/null
@@ -0,0 +1,135 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "evdev"
+{
+       VK_OEM_102      <94>
+       VK_OEM_3        <49>
+       VK_KEY_1        <10>
+       VK_KEY_2        <11>
+       VK_KEY_3        <12>
+       VK_KEY_4        <13>
+       VK_KEY_5        <14>
+       VK_KEY_6        <15>
+       VK_KEY_7        <16>
+       VK_KEY_8        <17>
+       VK_KEY_9        <18>
+       VK_KEY_0        <19>
+       VK_OEM_MINUS    <20>
+       VK_OEM_PLUS     <21>
+       VK_BACK         <22>
+       VK_TAB          <23>
+       VK_KEY_Q        <24>
+       VK_KEY_W        <25>
+       VK_KEY_E        <26>
+       VK_KEY_R        <27>
+       VK_KEY_T        <28>
+       VK_KEY_Y        <29>
+       VK_KEY_U        <30>
+       VK_KEY_I        <31>
+       VK_KEY_O        <32>
+       VK_KEY_P        <33>
+       VK_OEM_4        <34>
+       VK_OEM_6        <35>
+       VK_OEM_5        <51>
+       VK_RETURN       <36>
+       VK_CAPITAL      <66>
+       VK_KEY_A        <38>
+       VK_KEY_S        <39>
+       VK_KEY_D        <40>
+       VK_KEY_F        <41>
+       VK_KEY_G        <42>
+       VK_KEY_H        <43>
+       VK_KEY_J        <44>
+       VK_KEY_K        <45>
+       VK_KEY_L        <46>
+       VK_OEM_1        <47>
+       VK_OEM_7        <48>
+       VK_LSHIFT       <50>
+       VK_KEY_Z        <52>
+       VK_KEY_X        <53>
+       VK_KEY_C        <54>
+       VK_KEY_V        <55>
+       VK_KEY_B        <56>
+       VK_KEY_N        <57>
+       VK_KEY_M        <58>
+       VK_OEM_COMMA    <59>
+       VK_OEM_PERIOD   <60>
+       VK_OEM_2        <61>
+       VK_RSHIFT       <62>
+       VK_LMENU        <64>
+       VK_LCONTROL     <37>
+       VK_SPACE        <65>
+       VK_RCONTROL     <105>
+       VK_RMENU        <108>
+       VK_LWIN         <133>
+       VK_RWIN         <134>
+       VK_APPS         <135>
+       VK_ESCAPE       <9>
+       VK_F1           <67>
+       VK_F2           <68>
+       VK_F3           <69>
+       VK_F4           <70>
+       VK_F5           <71>
+       VK_F6           <72>
+       VK_F7           <73>
+       VK_F8           <74>
+       VK_F9           <75>
+       VK_F10          <76>
+       VK_F11          <95>
+       VK_F12          <96>
+       VK_SNAPSHOT     <107>
+       VK_SCROLL       <78>
+       VK_PAUSE        <127>
+       VK_INSERT       <118>
+       VK_HOME         <110>
+       VK_PRIOR        <112>
+       VK_DELETE       <119>
+       VK_END          <115>
+       VK_NEXT         <117>
+       VK_UP           <111>
+       VK_LEFT         <113>
+       VK_DOWN         <116>
+       VK_RIGHT        <114>
+       VK_NUMLOCK      <77>
+       VK_DIVIDE       <106>
+       VK_MULTIPLY     <63>
+       VK_SUBTRACT     <82>
+       VK_NUMPAD7      <79>
+       VK_NUMPAD8      <80>
+       VK_NUMPAD9      <81>
+       VK_ADD          <86>
+       VK_NUMPAD4      <83>
+       VK_NUMPAD5      <84>
+       VK_NUMPAD6      <85>
+       VK_NUMPAD1      <87>
+       VK_NUMPAD2      <88>
+       VK_NUMPAD3      <89>
+       VK_RETURN       <104>
+       VK_NUMPAD0      <90>
+       VK_DECIMAL      <91>
+       VK_F13          <191>
+       VK_F14          <192>
+       VK_F15          <193>
+       VK_F16          <194>
+       VK_F17          <195>
+       VK_F18          <196>
+       VK_F19          <197>
+       VK_F20          <198>
+       VK_F21          <199>
+       VK_F22          <200>
+       VK_F23          <201>
+       VK_F24          <202>
+       VK_ABNT_C1      <97>
+       VK_NONCONVERT   <102>
+       VK_KANA         <99>
+       VK_HELP         <146>
+};
+
+keyboard "pc98"
+: extends "evdev(evdev)"
+{
+};
+
diff --git a/keymaps/fujitsu b/keymaps/fujitsu
new file mode 100644 (file)
index 0000000..6f21368
--- /dev/null
@@ -0,0 +1,119 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "138"
+{
+       VK_ESCAPE       <37>
+       VK_KEY_1        <38>
+       VK_KEY_2        <39>
+       VK_KEY_3        <40>
+       VK_KEY_4        <41>
+       VK_KEY_5        <42>
+       VK_KEY_6        <43>
+       VK_KEY_7        <44>
+       VK_KEY_8        <45>
+       VK_KEY_9        <46>
+       VK_KEY_0        <47>
+       VK_OEM_MINUS    <48>
+       VK_OEM_PLUS     <49>
+       VK_OEM_3        <50>
+       VK_BACK         <51>
+       VK_TAB          <61>
+       VK_KEY_Q        <62>
+       VK_KEY_W        <63>
+       VK_KEY_E        <64>
+       VK_KEY_R        <65>
+       VK_KEY_T        <66>
+       VK_KEY_Y        <67>
+       VK_KEY_U        <68>
+       VK_KEY_I        <69>
+       VK_KEY_O        <70>
+       VK_KEY_P        <71>
+       VK_OEM_4        <72>
+       VK_OEM_6        <73>
+       VK_LCONTROL     <84>
+       VK_KEY_A        <85>
+       VK_KEY_S        <86>
+       VK_KEY_D        <87>
+       VK_KEY_F        <88>
+       VK_KEY_G        <89>
+       VK_KEY_H        <90>
+       VK_KEY_J        <91>
+       VK_KEY_K        <92>
+       VK_KEY_L        <93>
+       VK_OEM_1        <94>
+       VK_OEM_7        <95>
+       VK_OEM_5        <96>
+       VK_RETURN       <97>
+       VK_LSHIFT       <107>
+       VK_KEY_Z        <108>
+       VK_KEY_X        <109>
+       VK_KEY_C        <110>
+       VK_KEY_V        <111>
+       VK_KEY_B        <112>
+       VK_KEY_N        <113>
+       VK_KEY_M        <114>
+       VK_OEM_COMMA    <115>
+       VK_OEM_PERIOD   <116>
+       VK_OEM_2        <117>
+       VK_ABNT_C1      <52>
+       VK_RSHIFT       <118>
+       VK_CAPITAL      <127>
+       VK_LMENU        <27>
+       VK_SPACE        <129>
+       VK_RMENU        <23>
+       VK_APPS         <75>
+       VK_F1           <13>
+       VK_F2           <14>
+       VK_F3           <16>
+       VK_F4           <18>
+       VK_F5           <20>
+       VK_F6           <22>
+       VK_F7           <24>
+       VK_F8           <25>
+       VK_F9           <26>
+       VK_F10          <15>
+       VK_F11          <17>
+       VK_F12          <19>
+       VK_F13          <137>
+       VK_F14          <138>
+       VK_F15          <139>
+       VK_F16          <140>
+       VK_F17          <141>
+       VK_F18          <142>
+       VK_F19          <143>
+       VK_F20          <144>
+       VK_F21          <145>
+       VK_F22          <146>
+       VK_F23          <147>
+       VK_F24          <148>
+       VK_HELP         <126>
+       VK_SNAPSHOT     <30>
+       VK_PAUSE        <29>
+       VK_PRIOR        <35>
+       VK_HOME         <32>
+       VK_NEXT         <36>
+       VK_INSERT       <60>
+       VK_UP           <33>
+       VK_DOWN         <103>
+       VK_LEFT         <57>
+       VK_RIGHT        <80>
+       VK_MULTIPLY     <55>
+       VK_DIVIDE       <54>
+       VK_ADD          <133>
+       VK_SUBTRACT     <79>
+       VK_NUMPAD7      <76>
+       VK_NUMPAD8      <77>
+       VK_NUMPAD9      <78>
+       VK_NUMPAD4      <99>
+       VK_NUMPAD5      <100>
+       VK_NUMPAD6      <101>
+       VK_NUMPAD1      <120>
+       VK_NUMPAD2      <121>
+       VK_NUMPAD3      <122>
+       VK_RETURN       <98>
+       VK_NUMPAD0      <102>
+};
+
diff --git a/keymaps/hp b/keymaps/hp
new file mode 100644 (file)
index 0000000..270d149
--- /dev/null
@@ -0,0 +1,105 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "hil"
+{
+       VK_OEM_3        <71>
+       VK_KEY_1        <70>
+       VK_KEY_2        <69>
+       VK_KEY_3        <68>
+       VK_KEY_4        <67>
+       VK_KEY_5        <66>
+       VK_KEY_6        <65>
+       VK_KEY_7        <64>
+       VK_KEY_8        <96>
+       VK_KEY_9        <97>
+       VK_KEY_0        <98>
+       VK_OEM_MINUS    <99>
+       VK_OEM_PLUS     <100>
+       VK_BACK         <101>
+       VK_TAB          <63>
+       VK_KEY_Q        <62>
+       VK_KEY_W        <61>
+       VK_KEY_E        <60>
+       VK_KEY_R        <59>
+       VK_KEY_T        <58>
+       VK_KEY_Y        <57>
+       VK_KEY_U        <56>
+       VK_KEY_I        <104>
+       VK_KEY_O        <105>
+       VK_KEY_P        <106>
+       VK_OEM_4        <107>
+       VK_OEM_6        <108>
+       VK_OEM_5        <109>
+       VK_CAPITAL      <55>
+       VK_KEY_A        <53>
+       VK_KEY_S        <52>
+       VK_KEY_D        <51>
+       VK_KEY_F        <50>
+       VK_KEY_G        <49>
+       VK_KEY_H        <48>
+       VK_KEY_J        <112>
+       VK_KEY_K        <113>
+       VK_KEY_L        <114>
+       VK_OEM_1        <115>
+       VK_OEM_7        <116>
+       VK_RETURN       <117>
+       VK_LSHIFT       <13>
+       VK_KEY_Z        <36>
+       VK_KEY_X        <35>
+       VK_KEY_C        <34>
+       VK_KEY_V        <33>
+       VK_KEY_B        <32>
+       VK_KEY_N        <128>
+       VK_KEY_M        <120>
+       VK_OEM_COMMA    <121>
+       VK_OEM_PERIOD   <122>
+       VK_OEM_2        <123>
+       VK_RSHIFT       <12>
+       VK_LCONTROL     <14>
+       VK_LMENU        <11>
+       VK_SPACE        <129>
+       VK_RMENU        <10>
+       VK_SNAPSHOT     <87>
+       VK_ESCAPE       <39>
+       VK_F1           <84>
+       VK_F2           <83>
+       VK_F3           <82>
+       VK_F4           <81>
+       VK_APPS         <80>
+       VK_F5           <89>
+       VK_F6           <90>
+       VK_F7           <91>
+       VK_F8           <92>
+       VK_F9           <45>
+       VK_F10          <41>
+       VK_F11          <43>
+       VK_F12          <47>
+       VK_HOME         <118>
+       VK_PRIOR        <119>
+       VK_NEXT         <127>
+       VK_SELECT       <125>
+       VK_UP           <134>
+       VK_LEFT         <132>
+       VK_DOWN         <133>
+       VK_RIGHT        <135>
+       VK_DIVIDE       <25>
+       VK_MULTIPLY     <29>
+       VK_ADD          <27>
+       VK_SUBTRACT     <31>
+       VK_NUMPAD7      <21>
+       VK_NUMPAD8      <17>
+       VK_NUMPAD9      <19>
+       VK_RETURN       <23>
+       VK_NUMPAD4      <16>
+       VK_NUMPAD5      <18>
+       VK_NUMPAD6      <20>
+       VK_NUMPAD1      <24>
+       VK_NUMPAD2      <26>
+       VK_NUMPAD3      <28>
+       VK_NUMPAD0      <30>
+       VK_DECIMAL      <44>
+};
+
diff --git a/keymaps/ibm b/keymaps/ibm
new file mode 100644 (file)
index 0000000..be9e61b
--- /dev/null
@@ -0,0 +1,5 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
diff --git a/keymaps/macintosh b/keymaps/macintosh
new file mode 100644 (file)
index 0000000..8d24f7d
--- /dev/null
@@ -0,0 +1,142 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "macintosh"
+: extends "xfree86"
+{
+       VK_F13          <182>
+       VK_F14          <183>
+       VK_F15          <184>
+};
+
+keyboard "old"
+{
+       VK_ESCAPE       <61>
+       VK_OEM_3        <58>
+       VK_KEY_1        <26>
+       VK_KEY_2        <27>
+       VK_KEY_3        <28>
+       VK_KEY_4        <29>
+       VK_KEY_5        <31>
+       VK_KEY_6        <30>
+       VK_KEY_7        <34>
+       VK_KEY_8        <36>
+       VK_KEY_9        <33>
+       VK_KEY_0        <37>
+       VK_OEM_MINUS    <35>
+       VK_OEM_PLUS     <32>
+       VK_BACK         <59>
+       VK_TAB          <56>
+       VK_KEY_Q        <20>
+       VK_KEY_W        <21>
+       VK_KEY_E        <22>
+       VK_KEY_R        <23>
+       VK_KEY_T        <25>
+       VK_KEY_Y        <24>
+       VK_KEY_U        <40>
+       VK_KEY_I        <42>
+       VK_KEY_O        <39>
+       VK_KEY_P        <43>
+       VK_OEM_4        <41>
+       VK_OEM_6        <38>
+       VK_OEM_5        <50>
+       VK_CAPITAL      <65>
+       VK_KEY_A        <8>
+       VK_KEY_S        <9>
+       VK_KEY_D        <10>
+       VK_KEY_F        <11>
+       VK_KEY_G        <13>
+       VK_KEY_H        <12>
+       VK_KEY_J        <46>
+       VK_KEY_K        <48>
+       VK_KEY_L        <45>
+       VK_OEM_1        <49>
+       VK_OEM_7        <47>
+       VK_RETURN       <44>
+       VK_OEM_102      <18>
+       VK_KEY_Z        <14>
+       VK_KEY_X        <15>
+       VK_KEY_C        <16>
+       VK_KEY_V        <17>
+       VK_KEY_B        <19>
+       VK_KEY_N        <53>
+       VK_KEY_M        <54>
+       VK_OEM_COMMA    <51>
+       VK_OEM_PERIOD   <55>
+       VK_OEM_2        <52>
+       VK_SPACE        <57>
+       VK_LCONTROL     <62>
+       VK_LMENU        <63>
+       VK_LSHIFT       <64>
+       VK_RMENU        <66>
+       VK_RSHIFT       <131>
+       VK_RMENU        <132>
+       VK_RCONTROL     <133>
+       VK_F1           <130>
+       VK_F2           <128>
+       VK_F3           <107>
+       VK_F4           <126>
+       VK_F5           <104>
+       VK_F6           <105>
+       VK_F7           <106>
+       VK_F8           <108>
+       VK_F9           <109>
+       VK_F10          <117>
+       VK_F11          <111>
+       VK_F12          <119>
+       VK_SNAPSHOT     <113>
+       VK_SCROLL       <115>
+       VK_PAUSE        <121>
+       VK_INSERT       <122>
+       VK_HOME         <123>
+       VK_PRIOR        <124>
+       VK_DELETE       <125>
+       VK_END          <127>
+       VK_NEXT         <129>
+       VK_UP           <70>
+       VK_LEFT         <67>
+       VK_DOWN         <69>
+       VK_RIGHT        <68>
+       VK_NUMLOCK      <79>
+       VK_DIVIDE       <83>
+       VK_MULTIPLY     <75>
+       VK_NUMPAD7      <97>
+       VK_NUMPAD8      <99>
+       VK_NUMPAD9      <100>
+       VK_SUBTRACT     <86>
+       VK_NUMPAD4      <94>
+       VK_NUMPAD5      <95>
+       VK_NUMPAD6      <96>
+       VK_ADD          <77>
+       VK_NUMPAD1      <91>
+       VK_NUMPAD2      <92>
+       VK_NUMPAD3      <93>
+       VK_RETURN       <84>
+       VK_NUMPAD0      <90>
+       VK_DECIMAL      <73>
+};
+
+keyboard "hhk"
+: extends "macintosh"
+{
+       VK_OEM_5        <51>
+       VK_LWIN         <49>
+       VK_RWIN         <208>
+       VK_F13          <111>
+       VK_F14          <78>
+       VK_F15          <110>
+};
+
+keyboard "alukbd"
+: extends "xfree86"
+{
+       VK_F18          <129>
+       VK_F19          <130>
+};
+
+keyboard "jisevdev"
+{
+};
+
diff --git a/keymaps/macosx b/keymaps/macosx
new file mode 100644 (file)
index 0000000..8363f81
--- /dev/null
@@ -0,0 +1,107 @@
+# This file is manually edited from the "macintosh" keymap
+# X11.app is a special case, and xfreerdp on Mac OS X uses this hard-coded keymap instead
+
+keyboard "macosx"
+{
+       VK_ESCAPE       <61>
+       VK_OEM_3        <58>
+       VK_KEY_1        <26>
+       VK_KEY_2        <27>
+       VK_KEY_3        <28>
+       VK_KEY_4        <29>
+       VK_KEY_5        <31>
+       VK_KEY_6        <30>
+       VK_KEY_7        <34>
+       VK_KEY_8        <36>
+       VK_KEY_9        <33>
+       VK_KEY_0        <37>
+       VK_OEM_MINUS    <35>
+       VK_OEM_PLUS     <32>
+       VK_BACK         <59>
+       VK_TAB          <56>
+       VK_KEY_Q        <20>
+       VK_KEY_W        <21>
+       VK_KEY_E        <22>
+       VK_KEY_R        <23>
+       VK_KEY_T        <25>
+       VK_KEY_Y        <24>
+       VK_KEY_U        <40>
+       VK_KEY_I        <42>
+       VK_KEY_O        <39>
+       VK_KEY_P        <43>
+       VK_OEM_4        <41>
+       VK_OEM_6        <38>
+       VK_OEM_5        <50>
+       VK_CAPITAL      <65>
+       VK_KEY_A        <8>
+       VK_KEY_S        <9>
+       VK_KEY_D        <10>
+       VK_KEY_F        <11>
+       VK_KEY_G        <13>
+       VK_KEY_H        <12>
+       VK_KEY_J        <46>
+       VK_KEY_K        <48>
+       VK_KEY_L        <45>
+       VK_OEM_1        <49>
+       VK_OEM_7        <47>
+       VK_RETURN       <44>
+       VK_OEM_102      <18>
+       VK_KEY_Z        <14>
+       VK_KEY_X        <15>
+       VK_KEY_C        <16>
+       VK_KEY_V        <17>
+       VK_KEY_B        <19>
+       VK_KEY_N        <53>
+       VK_KEY_M        <54>
+       VK_OEM_COMMA    <51>
+       VK_OEM_PERIOD   <55>
+       VK_OEM_2        <52>
+       VK_SPACE        <57>
+       VK_LCONTROL     <67>
+       VK_LMENU        <66>
+       VK_LSHIFT       <64>
+       VK_RMENU        <69>
+       VK_RSHIFT       <68>
+       VK_F1           <130>
+       VK_F2           <128>
+       VK_F3           <107>
+       VK_F4           <126>
+       VK_F5           <104>
+       VK_F6           <105>
+       VK_F7           <106>
+       VK_F8           <108>
+       VK_F9           <109>
+       VK_F10          <117>
+       VK_F11          <111>
+       VK_F12          <119>
+       VK_SNAPSHOT     <113>
+       VK_SCROLL       <115>
+       VK_PAUSE        <121>
+       VK_INSERT       <122>
+       VK_HOME         <123>
+       VK_PRIOR        <124>
+       VK_DELETE       <125>
+       VK_END          <127>
+       VK_NEXT         <129>
+       VK_UP           <134>
+       VK_LEFT         <131>
+       VK_DOWN         <133>
+       VK_RIGHT        <132>
+       VK_NUMLOCK      <79>
+       VK_DIVIDE       <83>
+       VK_MULTIPLY     <75>
+       VK_NUMPAD7      <97>
+       VK_NUMPAD8      <99>
+       VK_NUMPAD9      <100>
+       VK_SUBTRACT     <86>
+       VK_NUMPAD4      <94>
+       VK_NUMPAD5      <95>
+       VK_NUMPAD6      <96>
+       VK_ADD          <77>
+       VK_NUMPAD1      <91>
+       VK_NUMPAD2      <92>
+       VK_NUMPAD3      <93>
+       VK_RETURN       <84>
+       VK_NUMPAD0      <90>
+       VK_DECIMAL      <73>
+};
diff --git a/keymaps/sgi_vndr/indigo b/keymaps/sgi_vndr/indigo
new file mode 100644 (file)
index 0000000..6a79b21
--- /dev/null
@@ -0,0 +1,116 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "pc101"
+{
+       VK_OEM_3        <62>
+       VK_KEY_1        <15>
+       VK_KEY_2        <21>
+       VK_KEY_3        <22>
+       VK_KEY_4        <29>
+       VK_KEY_5        <30>
+       VK_KEY_6        <37>
+       VK_KEY_7        <38>
+       VK_KEY_8        <45>
+       VK_KEY_9        <46>
+       VK_KEY_0        <53>
+       VK_OEM_MINUS    <54>
+       VK_OEM_PLUS     <61>
+       VK_BACK         <68>
+       VK_TAB          <16>
+       VK_KEY_Q        <17>
+       VK_KEY_W        <23>
+       VK_KEY_E        <24>
+       VK_KEY_R        <31>
+       VK_KEY_T        <32>
+       VK_KEY_Y        <39>
+       VK_KEY_U        <40>
+       VK_KEY_I        <47>
+       VK_KEY_O        <48>
+       VK_KEY_P        <55>
+       VK_OEM_4        <56>
+       VK_OEM_6        <63>
+       VK_RETURN       <58>
+       VK_CAPITAL      <11>
+       VK_KEY_A        <18>
+       VK_KEY_S        <19>
+       VK_KEY_D        <25>
+       VK_KEY_F        <26>
+       VK_KEY_G        <33>
+       VK_KEY_H        <34>
+       VK_KEY_J        <41>
+       VK_KEY_K        <42>
+       VK_KEY_L        <49>
+       VK_OEM_1        <50>
+       VK_OEM_7        <57>
+       VK_LSHIFT       <13>
+       VK_KEY_Z        <27>
+       VK_KEY_X        <28>
+       VK_KEY_C        <35>
+       VK_KEY_V        <36>
+       VK_KEY_B        <43>
+       VK_KEY_N        <44>
+       VK_KEY_M        <51>
+       VK_OEM_COMMA    <52>
+       VK_OEM_PERIOD   <59>
+       VK_OEM_2        <60>
+       VK_RSHIFT       <12>
+       VK_OEM_5        <64>
+       VK_LMENU        <91>
+       VK_LCONTROL     <10>
+       VK_SPACE        <90>
+       VK_RCONTROL     <93>
+       VK_RMENU        <92>
+       VK_ESCAPE       <14>
+       VK_F1           <94>
+       VK_F2           <95>
+       VK_F3           <96>
+       VK_F4           <97>
+       VK_F5           <98>
+       VK_F6           <99>
+       VK_F7           <100>
+       VK_F8           <101>
+       VK_F9           <102>
+       VK_F10          <103>
+       VK_F11          <104>
+       VK_F12          <105>
+       VK_SNAPSHOT     <106>
+       VK_SCROLL       <107>
+       VK_PAUSE        <108>
+       VK_INSERT       <109>
+       VK_HOME         <110>
+       VK_PRIOR        <111>
+       VK_DELETE       <69>
+       VK_END          <112>
+       VK_NEXT         <113>
+       VK_UP           <88>
+       VK_LEFT         <80>
+       VK_DOWN         <81>
+       VK_RIGHT        <87>
+       VK_NUMLOCK      <114>
+       VK_DIVIDE       <115>
+       VK_MULTIPLY     <116>
+       VK_SUBTRACT     <83>
+       VK_NUMPAD7      <74>
+       VK_NUMPAD8      <75>
+       VK_NUMPAD9      <82>
+       VK_ADD          <117>
+       VK_NUMPAD4      <70>
+       VK_NUMPAD5      <76>
+       VK_NUMPAD6      <77>
+       VK_NUMPAD1      <65>
+       VK_NUMPAD2      <71>
+       VK_NUMPAD3      <72>
+       VK_RETURN       <89>
+       VK_NUMPAD0      <66>
+       VK_DECIMAL      <73>
+};
+
+keyboard "pc102"
+: extends "sgi_vndr/indigo(pc101)"
+{
+       VK_OEM_102      <118>
+};
+
diff --git a/keymaps/sgi_vndr/indy b/keymaps/sgi_vndr/indy
new file mode 100644 (file)
index 0000000..e451926
--- /dev/null
@@ -0,0 +1,148 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "universal"
+{
+       VK_OEM_5        <91>
+       VK_OEM_5        <100>
+       VK_OEM_5        <101>
+};
+
+keyboard "pc101"
+{
+       VK_OEM_3        <22>
+       VK_KEY_1        <30>
+       VK_KEY_2        <38>
+       VK_KEY_3        <46>
+       VK_KEY_4        <45>
+       VK_KEY_5        <54>
+       VK_KEY_6        <62>
+       VK_KEY_7        <69>
+       VK_KEY_8        <70>
+       VK_KEY_9        <78>
+       VK_KEY_0        <77>
+       VK_OEM_MINUS    <86>
+       VK_OEM_PLUS     <93>
+       VK_BACK         <110>
+       VK_TAB          <21>
+       VK_KEY_Q        <29>
+       VK_KEY_W        <37>
+       VK_KEY_E        <44>
+       VK_KEY_R        <53>
+       VK_KEY_T        <52>
+       VK_KEY_Y        <61>
+       VK_KEY_U        <68>
+       VK_KEY_I        <75>
+       VK_KEY_O        <76>
+       VK_KEY_P        <85>
+       VK_OEM_4        <92>
+       VK_OEM_6        <99>
+       VK_RETURN       <98>
+       VK_CAPITAL      <28>
+       VK_KEY_A        <36>
+       VK_KEY_S        <35>
+       VK_KEY_D        <43>
+       VK_KEY_F        <51>
+       VK_KEY_G        <60>
+       VK_KEY_H        <59>
+       VK_KEY_J        <67>
+       VK_KEY_K        <74>
+       VK_KEY_L        <83>
+       VK_OEM_1        <84>
+       VK_OEM_7        <90>
+       VK_LSHIFT       <26>
+       VK_KEY_Z        <34>
+       VK_KEY_X        <42>
+       VK_KEY_C        <41>
+       VK_KEY_V        <50>
+       VK_KEY_B        <58>
+       VK_KEY_N        <57>
+       VK_KEY_M        <66>
+       VK_OEM_COMMA    <73>
+       VK_OEM_PERIOD   <81>
+       VK_OEM_2        <82>
+       VK_RSHIFT       <97>
+       VK_OEM_5        <100>
+       VK_LMENU        <33>
+       VK_LCONTROL     <25>
+       VK_SPACE        <49>
+       VK_RCONTROL     <96>
+       VK_RMENU        <65>
+       VK_ESCAPE       <16>
+       VK_F1           <15>
+       VK_F2           <23>
+       VK_F3           <31>
+       VK_F4           <39>
+       VK_F5           <47>
+       VK_F6           <55>
+       VK_F7           <63>
+       VK_F8           <71>
+       VK_F9           <79>
+       VK_F10          <87>
+       VK_F11          <94>
+       VK_F12          <102>
+       VK_SNAPSHOT     <95>
+       VK_SCROLL       <103>
+       VK_PAUSE        <106>
+       VK_INSERT       <111>
+       VK_HOME         <118>
+       VK_PRIOR        <119>
+       VK_DELETE       <108>
+       VK_END          <109>
+       VK_NEXT         <117>
+       VK_UP           <107>
+       VK_LEFT         <105>
+       VK_DOWN         <104>
+       VK_RIGHT        <114>
+       VK_NUMLOCK      <126>
+       VK_DIVIDE       <127>
+       VK_MULTIPLY     <134>
+       VK_SUBTRACT     <140>
+       VK_NUMPAD7      <116>
+       VK_NUMPAD8      <125>
+       VK_NUMPAD9      <133>
+       VK_ADD          <132>
+       VK_NUMPAD4      <115>
+       VK_NUMPAD5      <123>
+       VK_NUMPAD6      <124>
+       VK_NUMPAD1      <113>
+       VK_NUMPAD2      <122>
+       VK_NUMPAD3      <130>
+       VK_RETURN       <129>
+       VK_NUMPAD0      <120>
+       VK_DECIMAL      <121>
+};
+
+keyboard "pc102"
+{
+       VK_OEM_102      <27>
+};
+
+keyboard "pc104"
+: extends "sgi_vndr/indy(pc101)"
+{
+       VK_LWIN         <147>
+       VK_RWIN         <148>
+       VK_APPS         <149>
+};
+
+keyboard "pc105"
+{
+};
+
+keyboard "jp106"
+{
+       VK_ABNT_C1      <89>
+       VK_OEM_5        <91>
+};
+
+keyboard "overlayKeypad"
+{
+};
+
+keyboard "shiftLock"
+{
+};
+
diff --git a/keymaps/sgi_vndr/iris b/keymaps/sgi_vndr/iris
new file mode 100644 (file)
index 0000000..2b2fa55
--- /dev/null
@@ -0,0 +1,10 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "iris"
+: extends "sgi_vndr/indigo(pc101)"
+{
+};
+
diff --git a/keymaps/sony b/keymaps/sony
new file mode 100644 (file)
index 0000000..f65782a
--- /dev/null
@@ -0,0 +1,103 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "nwp5461"
+{
+       VK_ESCAPE       <18>
+       VK_KEY_1        <19>
+       VK_KEY_2        <20>
+       VK_KEY_3        <21>
+       VK_KEY_4        <22>
+       VK_KEY_5        <23>
+       VK_KEY_6        <24>
+       VK_KEY_7        <25>
+       VK_KEY_8        <26>
+       VK_KEY_9        <27>
+       VK_KEY_0        <28>
+       VK_OEM_MINUS    <29>
+       VK_OEM_PLUS     <30>
+       VK_OEM_5        <31>
+       VK_BACK         <32>
+       VK_TAB          <33>
+       VK_KEY_Q        <34>
+       VK_KEY_W        <35>
+       VK_KEY_E        <36>
+       VK_KEY_R        <37>
+       VK_KEY_T        <38>
+       VK_KEY_Y        <39>
+       VK_KEY_U        <40>
+       VK_KEY_I        <41>
+       VK_KEY_O        <42>
+       VK_KEY_P        <43>
+       VK_OEM_4        <44>
+       VK_OEM_6        <45>
+       VK_DELETE       <46>
+       VK_LCONTROL     <47>
+       VK_KEY_A        <48>
+       VK_KEY_S        <49>
+       VK_KEY_D        <50>
+       VK_KEY_F        <51>
+       VK_KEY_G        <52>
+       VK_KEY_H        <53>
+       VK_KEY_J        <54>
+       VK_KEY_K        <55>
+       VK_KEY_L        <56>
+       VK_OEM_1        <57>
+       VK_OEM_7        <58>
+       VK_OEM_3        <59>
+       VK_RETURN       <60>
+       VK_LSHIFT       <61>
+       VK_KEY_Z        <62>
+       VK_KEY_X        <63>
+       VK_KEY_C        <64>
+       VK_KEY_V        <65>
+       VK_KEY_B        <66>
+       VK_KEY_N        <67>
+       VK_KEY_M        <68>
+       VK_OEM_COMMA    <69>
+       VK_OEM_PERIOD   <70>
+       VK_OEM_2        <71>
+       VK_ABNT_C1      <72>
+       VK_RSHIFT       <73>
+       VK_LMENU        <74>
+       VK_CAPITAL      <75>
+       VK_SPACE        <77>
+       VK_F1           <8>
+       VK_F2           <9>
+       VK_F3           <10>
+       VK_F4           <11>
+       VK_F5           <12>
+       VK_F6           <13>
+       VK_F7           <14>
+       VK_F8           <15>
+       VK_F9           <16>
+       VK_F10          <17>
+       VK_F11          <111>
+       VK_F12          <112>
+       VK_HELP         <113>
+       VK_INSERT       <114>
+       VK_PRIOR        <116>
+       VK_NEXT         <117>
+       VK_UP           <95>
+       VK_LEFT         <98>
+       VK_DOWN         <99>
+       VK_RIGHT        <100>
+       VK_MULTIPLY     <107>
+       VK_DIVIDE       <108>
+       VK_ADD          <89>
+       VK_NUMPAD7      <82>
+       VK_NUMPAD8      <83>
+       VK_NUMPAD9      <84>
+       VK_SUBTRACT     <85>
+       VK_NUMPAD4      <86>
+       VK_NUMPAD5      <87>
+       VK_NUMPAD6      <88>
+       VK_NUMPAD1      <90>
+       VK_NUMPAD2      <91>
+       VK_NUMPAD3      <92>
+       VK_RETURN       <97>
+       VK_NUMPAD0      <94>
+};
+
diff --git a/keymaps/sun b/keymaps/sun
new file mode 100644 (file)
index 0000000..1eecd1b
--- /dev/null
@@ -0,0 +1,618 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "type4"
+{
+       VK_ESCAPE       <36>
+       VK_KEY_1        <37>
+       VK_KEY_2        <38>
+       VK_KEY_3        <39>
+       VK_KEY_4        <40>
+       VK_KEY_5        <41>
+       VK_KEY_6        <42>
+       VK_KEY_7        <43>
+       VK_KEY_8        <44>
+       VK_KEY_9        <45>
+       VK_KEY_0        <46>
+       VK_OEM_MINUS    <47>
+       VK_OEM_PLUS     <48>
+       VK_OEM_3        <49>
+       VK_BACK         <50>
+       VK_TAB          <60>
+       VK_KEY_Q        <61>
+       VK_KEY_W        <62>
+       VK_KEY_E        <63>
+       VK_KEY_R        <64>
+       VK_KEY_T        <65>
+       VK_KEY_Y        <66>
+       VK_KEY_U        <67>
+       VK_KEY_I        <68>
+       VK_KEY_O        <69>
+       VK_KEY_P        <70>
+       VK_OEM_4        <71>
+       VK_OEM_6        <72>
+       VK_DELETE       <73>
+       VK_LCONTROL     <83>
+       VK_KEY_A        <84>
+       VK_KEY_S        <85>
+       VK_KEY_D        <86>
+       VK_KEY_F        <87>
+       VK_KEY_G        <88>
+       VK_KEY_H        <89>
+       VK_KEY_J        <90>
+       VK_KEY_K        <91>
+       VK_KEY_L        <92>
+       VK_OEM_1        <93>
+       VK_OEM_7        <94>
+       VK_OEM_5        <95>
+       VK_RETURN       <96>
+       VK_LSHIFT       <106>
+       VK_KEY_Z        <107>
+       VK_KEY_X        <108>
+       VK_KEY_C        <109>
+       VK_KEY_V        <110>
+       VK_KEY_B        <111>
+       VK_KEY_N        <112>
+       VK_KEY_M        <113>
+       VK_OEM_COMMA    <114>
+       VK_OEM_PERIOD   <115>
+       VK_OEM_2        <116>
+       VK_RSHIFT       <117>
+       VK_HELP         <125>
+       VK_CAPITAL      <126>
+       VK_LMENU        <26>
+       VK_SPACE        <128>
+       VK_APPS         <74>
+       VK_F1           <12>
+       VK_F2           <13>
+       VK_F3           <15>
+       VK_F4           <17>
+       VK_F5           <19>
+       VK_F6           <21>
+       VK_F7           <23>
+       VK_F8           <24>
+       VK_F9           <25>
+       VK_F10          <14>
+       VK_F11          <16>
+       VK_F12          <18>
+       VK_SNAPSHOT     <29>
+       VK_SCROLL       <30>
+       VK_PAUSE        <28>
+       VK_NUMLOCK      <105>
+       VK_DIVIDE       <53>
+       VK_MULTIPLY     <54>
+       VK_SUBTRACT     <78>
+       VK_NUMPAD7      <75>
+       VK_NUMPAD8      <76>
+       VK_NUMPAD9      <77>
+       VK_ADD          <132>
+       VK_NUMPAD4      <98>
+       VK_NUMPAD5      <99>
+       VK_NUMPAD6      <100>
+       VK_NUMPAD1      <119>
+       VK_NUMPAD2      <120>
+       VK_NUMPAD3      <121>
+       VK_RETURN       <97>
+       VK_NUMPAD0      <101>
+       VK_DECIMAL      <57>
+};
+
+keyboard "type5"
+{
+       VK_ESCAPE       <36>
+       VK_KEY_1        <37>
+       VK_KEY_2        <38>
+       VK_KEY_3        <39>
+       VK_KEY_4        <40>
+       VK_KEY_5        <41>
+       VK_KEY_6        <42>
+       VK_KEY_7        <43>
+       VK_KEY_8        <44>
+       VK_KEY_9        <45>
+       VK_KEY_0        <46>
+       VK_OEM_MINUS    <47>
+       VK_OEM_PLUS     <48>
+       VK_OEM_3        <49>
+       VK_BACK         <50>
+       VK_TAB          <60>
+       VK_KEY_Q        <61>
+       VK_KEY_W        <62>
+       VK_KEY_E        <63>
+       VK_KEY_R        <64>
+       VK_KEY_T        <65>
+       VK_KEY_Y        <66>
+       VK_KEY_U        <67>
+       VK_KEY_I        <68>
+       VK_KEY_O        <69>
+       VK_KEY_P        <70>
+       VK_OEM_4        <71>
+       VK_OEM_6        <72>
+       VK_DELETE       <73>
+       VK_APPS         <74>
+       VK_LCONTROL     <83>
+       VK_KEY_A        <84>
+       VK_KEY_S        <85>
+       VK_KEY_D        <86>
+       VK_KEY_F        <87>
+       VK_KEY_G        <88>
+       VK_KEY_H        <89>
+       VK_KEY_J        <90>
+       VK_KEY_K        <91>
+       VK_KEY_L        <92>
+       VK_OEM_1        <93>
+       VK_OEM_7        <94>
+       VK_OEM_5        <95>
+       VK_RETURN       <96>
+       VK_LSHIFT       <106>
+       VK_KEY_Z        <107>
+       VK_KEY_X        <108>
+       VK_KEY_C        <109>
+       VK_KEY_V        <110>
+       VK_KEY_B        <111>
+       VK_KEY_N        <112>
+       VK_KEY_M        <113>
+       VK_OEM_COMMA    <114>
+       VK_OEM_PERIOD   <115>
+       VK_OEM_2        <116>
+       VK_RSHIFT       <117>
+       VK_LMENU        <26>
+       VK_CAPITAL      <126>
+       VK_SPACE        <128>
+       VK_F1           <12>
+       VK_F2           <13>
+       VK_F3           <15>
+       VK_F4           <17>
+       VK_F5           <19>
+       VK_F6           <21>
+       VK_F7           <23>
+       VK_F8           <24>
+       VK_F9           <25>
+       VK_F10          <14>
+       VK_F11          <16>
+       VK_F12          <18>
+       VK_SNAPSHOT     <29>
+       VK_SCROLL       <30>
+       VK_PAUSE        <28>
+       VK_NUMLOCK      <105>
+       VK_DIVIDE       <53>
+       VK_MULTIPLY     <54>
+       VK_SUBTRACT     <78>
+       VK_NUMPAD7      <75>
+       VK_NUMPAD8      <76>
+       VK_NUMPAD9      <77>
+       VK_ADD          <132>
+       VK_NUMPAD4      <98>
+       VK_NUMPAD5      <99>
+       VK_NUMPAD6      <100>
+       VK_NUMPAD1      <119>
+       VK_NUMPAD2      <120>
+       VK_NUMPAD3      <121>
+       VK_RETURN       <97>
+       VK_NUMPAD0      <101>
+       VK_DECIMAL      <57>
+       VK_UP           <27>
+       VK_LEFT         <31>
+       VK_DOWN         <34>
+       VK_RIGHT        <35>
+       VK_INSERT       <51>
+       VK_HOME         <59>
+       VK_END          <81>
+       VK_PRIOR        <103>
+       VK_NEXT         <130>
+       VK_HELP         <125>
+};
+
+keyboard "type4tuv"
+: extends "sun(type4)"
+{
+       VK_OEM_102      <131>
+};
+
+keyboard "type4_ca"
+: extends "sun(type4)"
+{
+       VK_OEM_102      <131>
+};
+
+keyboard "type4_jp"
+: extends "sun(type4)"
+{
+       VK_KANJI        <123>
+};
+
+keyboard "type4_euro"
+: extends "sun(type4)"
+{
+       VK_OEM_102      <131>
+};
+
+keyboard "type5tuv"
+: extends "sun(type5)"
+{
+       VK_OEM_102      <131>
+};
+
+keyboard "type5_jp"
+: extends "sun(type5)"
+{
+       VK_KANJI        <123>
+};
+
+keyboard "type5_euro"
+: extends "sun(type5)"
+{
+       VK_OEM_102      <131>
+};
+
+keyboard "type5hobo"
+{
+       VK_ESCAPE       <36>
+       VK_KEY_1        <37>
+       VK_KEY_2        <38>
+       VK_KEY_3        <39>
+       VK_KEY_4        <40>
+       VK_KEY_5        <41>
+       VK_KEY_6        <42>
+       VK_KEY_7        <43>
+       VK_KEY_8        <44>
+       VK_KEY_9        <45>
+       VK_KEY_0        <46>
+       VK_OEM_MINUS    <47>
+       VK_OEM_PLUS     <48>
+       VK_OEM_3        <49>
+       VK_BACK         <50>
+       VK_TAB          <60>
+       VK_KEY_Q        <61>
+       VK_KEY_W        <62>
+       VK_KEY_E        <63>
+       VK_KEY_R        <64>
+       VK_KEY_T        <65>
+       VK_KEY_Y        <66>
+       VK_KEY_U        <67>
+       VK_KEY_I        <68>
+       VK_KEY_O        <69>
+       VK_KEY_P        <70>
+       VK_OEM_4        <71>
+       VK_OEM_6        <72>
+       VK_DELETE       <73>
+       VK_APPS         <74>
+       VK_LCONTROL     <83>
+       VK_KEY_A        <84>
+       VK_KEY_S        <85>
+       VK_KEY_D        <86>
+       VK_KEY_F        <87>
+       VK_KEY_G        <88>
+       VK_KEY_H        <89>
+       VK_KEY_J        <90>
+       VK_KEY_K        <91>
+       VK_KEY_L        <92>
+       VK_OEM_1        <93>
+       VK_OEM_7        <94>
+       VK_OEM_5        <95>
+       VK_RETURN       <96>
+       VK_LSHIFT       <106>
+       VK_KEY_Z        <107>
+       VK_KEY_X        <108>
+       VK_KEY_C        <109>
+       VK_KEY_V        <110>
+       VK_KEY_B        <111>
+       VK_KEY_N        <112>
+       VK_KEY_M        <113>
+       VK_OEM_COMMA    <114>
+       VK_OEM_PERIOD   <115>
+       VK_OEM_2        <116>
+       VK_RSHIFT       <117>
+       VK_LMENU        <26>
+       VK_CAPITAL      <126>
+       VK_SPACE        <128>
+       VK_F1           <12>
+       VK_F2           <13>
+       VK_F3           <15>
+       VK_F4           <17>
+       VK_F5           <19>
+       VK_F6           <21>
+       VK_F7           <23>
+       VK_F8           <24>
+       VK_F9           <25>
+       VK_F10          <14>
+       VK_F11          <16>
+       VK_F12          <18>
+       VK_SNAPSHOT     <29>
+       VK_SCROLL       <30>
+       VK_PAUSE        <28>
+       VK_NUMLOCK      <105>
+       VK_DIVIDE       <53>
+       VK_MULTIPLY     <54>
+       VK_SUBTRACT     <78>
+       VK_NUMPAD7      <75>
+       VK_NUMPAD8      <76>
+       VK_NUMPAD9      <77>
+       VK_ADD          <132>
+       VK_NUMPAD4      <98>
+       VK_NUMPAD5      <99>
+       VK_NUMPAD6      <100>
+       VK_NUMPAD1      <119>
+       VK_NUMPAD2      <120>
+       VK_NUMPAD3      <121>
+       VK_RETURN       <97>
+       VK_NUMPAD0      <101>
+       VK_DECIMAL      <57>
+       VK_UP           <27>
+       VK_LEFT         <31>
+       VK_DOWN         <34>
+       VK_RIGHT        <35>
+       VK_INSERT       <51>
+       VK_HOME         <59>
+       VK_END          <81>
+       VK_PRIOR        <103>
+       VK_NEXT         <130>
+       VK_HELP         <125>
+};
+
+keyboard "type5tuvhobo"
+: extends "sun(type5hobo)"
+{
+       VK_OEM_102      <131>
+};
+
+keyboard "type5_jphobo"
+: extends "sun(type5hobo)"
+{
+       VK_KANJI        <123>
+};
+
+keyboard "type6"
+: extends "sun(type5)"
+{
+};
+
+keyboard "type6tuv"
+: extends "sun(type5tuv)"
+{
+};
+
+keyboard "type6unix"
+: extends "sun(type5)"
+{
+};
+
+keyboard "type6_jp"
+: extends "sun(type5_jp)"
+{
+};
+
+keyboard "type6_euro"
+: extends "sun(type5_euro)"
+{
+};
+
+keyboard "type6_usb"
+: extends "xfree86"
+{
+       VK_HELP         <245>
+};
+
+keyboard "type6tuv_usb"
+: extends "sun(type6_usb)"
+{
+       VK_OEM_102      <94>
+       VK_OEM_5        <51>
+};
+
+keyboard "type6_jp_usb"
+: extends "sun(type6_usb)"
+{
+};
+
+keyboard "type5_se"
+{
+       VK_HELP         <125>
+       VK_ESCAPE       <36>
+       VK_F1           <12>
+       VK_F2           <13>
+       VK_F3           <15>
+       VK_F4           <17>
+       VK_F5           <19>
+       VK_F6           <21>
+       VK_F7           <23>
+       VK_F8           <24>
+       VK_F9           <25>
+       VK_F10          <14>
+       VK_F11          <16>
+       VK_F12          <18>
+       VK_SNAPSHOT     <29>
+       VK_SCROLL       <30>
+       VK_PAUSE        <28>
+       VK_TILDE        <49>
+       VK_KEY_1        <37>
+       VK_KEY_2        <38>
+       VK_KEY_3        <39>
+       VK_KEY_4        <40>
+       VK_KEY_5        <41>
+       VK_KEY_6        <42>
+       VK_KEY_7        <43>
+       VK_KEY_8        <44>
+       VK_KEY_9        <45>
+       VK_KEY_0        <46>
+       VK_OEM_MINUS    <47>
+       VK_OEM_PLUS     <48>
+       VK_BACK         <50>
+       VK_INSERT       <51>
+       VK_HOME         <59>
+       VK_PRIOR        <103>
+       VK_NUMLOCK      <105>
+       VK_DIVIDE       <53>
+       VK_MULTIPLY     <54>
+       VK_SUBTRACT     <78>
+       VK_KEY_Q        <61>
+       VK_KEY_W        <62>
+       VK_KEY_E        <63>
+       VK_KEY_R        <64>
+       VK_KEY_T        <65>
+       VK_KEY_Y        <66>
+       VK_KEY_U        <67>
+       VK_KEY_I        <68>
+       VK_KEY_O        <69>
+       VK_KEY_P        <70>
+       VK_OEM_4        <71>
+       VK_OEM_6        <72>
+       VK_DELETE       <73>
+       VK_END          <81>
+       VK_NEXT         <130>
+       VK_NUMPAD7      <75>
+       VK_NUMPAD8      <76>
+       VK_NUMPAD9      <77>
+       VK_ADD          <132>
+       VK_KEY_A        <84>
+       VK_KEY_S        <85>
+       VK_KEY_D        <86>
+       VK_KEY_F        <87>
+       VK_KEY_G        <88>
+       VK_KEY_H        <89>
+       VK_KEY_J        <90>
+       VK_KEY_K        <91>
+       VK_KEY_L        <92>
+       VK_OEM_1        <93>
+       VK_OEM_7        <94>
+       VK_OEM_5        <95>
+       VK_RETURN       <96>
+       VK_NUMPAD4      <98>
+       VK_NUMPAD5      <99>
+       VK_NUMPAD6      <100>
+       VK_LSHIFT       <106>
+       VK_LSHIFT       <131>
+       VK_KEY_Z        <107>
+       VK_KEY_X        <108>
+       VK_KEY_C        <109>
+       VK_KEY_V        <110>
+       VK_KEY_B        <111>
+       VK_KEY_N        <112>
+       VK_KEY_M        <113>
+       VK_OEM_COMMA    <114>
+       VK_OEM_PERIOD   <115>
+       VK_OEM_2        <116>
+       VK_RSHIFT       <117>
+       VK_UP           <27>
+       VK_NUMPAD1      <119>
+       VK_NUMPAD2      <120>
+       VK_NUMPAD3      <121>
+       VK_RETURN       <97>
+       VK_LCONTROL     <83>
+       VK_LMENU        <26>
+       VK_SPACE        <128>
+       VK_APPS         <74>
+       VK_LEFT         <31>
+       VK_DOWN         <34>
+       VK_RIGHT        <35>
+       VK_NUMPAD0      <101>
+       VK_DECIMAL      <57>
+};
+
+keyboard "type5c_se"
+: extends "sun(type5_se)"
+{
+};
+
+keyboard "type4__se"
+{
+       VK_F1           <12>
+       VK_F2           <13>
+       VK_F3           <15>
+       VK_F4           <17>
+       VK_F5           <19>
+       VK_F6           <21>
+       VK_F7           <23>
+       VK_F8           <24>
+       VK_F9           <25>
+       VK_F10          <14>
+       VK_F11          <16>
+       VK_F12          <18>
+       VK_DELETE       <73>
+       VK_PAUSE        <28>
+       VK_SNAPSHOT     <29>
+       VK_SCROLL       <30>
+       VK_NUMLOCK      <105>
+       VK_TILDE        <36>
+       VK_KEY_1        <37>
+       VK_KEY_2        <38>
+       VK_KEY_3        <39>
+       VK_KEY_4        <40>
+       VK_KEY_5        <41>
+       VK_KEY_6        <42>
+       VK_KEY_7        <43>
+       VK_KEY_8        <44>
+       VK_KEY_9        <45>
+       VK_KEY_0        <46>
+       VK_OEM_MINUS    <47>
+       VK_OEM_PLUS     <48>
+       VK_BACK         <50>
+       VK_DIVIDE       <53>
+       VK_MULTIPLY     <54>
+       VK_SUBTRACT     <78>
+       VK_KEY_Q        <61>
+       VK_KEY_W        <62>
+       VK_KEY_E        <63>
+       VK_KEY_R        <64>
+       VK_KEY_T        <65>
+       VK_KEY_Y        <66>
+       VK_KEY_U        <67>
+       VK_KEY_I        <68>
+       VK_KEY_O        <69>
+       VK_KEY_P        <70>
+       VK_OEM_4        <71>
+       VK_OEM_6        <72>
+       VK_NUMPAD7      <75>
+       VK_NUMPAD8      <76>
+       VK_NUMPAD9      <77>
+       VK_ADD          <132>
+       VK_KEY_A        <84>
+       VK_KEY_S        <85>
+       VK_KEY_D        <86>
+       VK_KEY_F        <87>
+       VK_KEY_G        <88>
+       VK_KEY_H        <89>
+       VK_KEY_J        <90>
+       VK_KEY_K        <91>
+       VK_KEY_L        <92>
+       VK_OEM_1        <93>
+       VK_OEM_7        <94>
+       VK_OEM_5        <49>
+       VK_RETURN       <96>
+       VK_NUMPAD4      <98>
+       VK_NUMPAD5      <99>
+       VK_NUMPAD6      <100>
+       VK_LSHIFT       <106>
+       VK_LSHIFT       <131>
+       VK_KEY_Z        <107>
+       VK_KEY_X        <108>
+       VK_KEY_C        <109>
+       VK_KEY_V        <110>
+       VK_KEY_B        <111>
+       VK_KEY_N        <112>
+       VK_KEY_M        <113>
+       VK_OEM_COMMA    <114>
+       VK_OEM_PERIOD   <115>
+       VK_OEM_2        <116>
+       VK_RSHIFT       <117>
+       VK_NUMPAD1      <119>
+       VK_NUMPAD2      <120>
+       VK_NUMPAD3      <121>
+       VK_RETURN       <97>
+       VK_HELP         <125>
+       VK_LMENU        <26>
+       VK_SPACE        <128>
+       VK_APPS         <74>
+       VK_NUMPAD0      <101>
+       VK_DECIMAL      <57>
+};
+
+keyboard "type4_se"
+{
+};
+
+keyboard "type4_se_swapctl"
+{
+};
+
diff --git a/keymaps/xfree86 b/keymaps/xfree86
new file mode 100644 (file)
index 0000000..63d5c2e
--- /dev/null
@@ -0,0 +1,152 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "xfree86"
+: extends "xfree86(basic)"
+{
+       VK_OEM_5        <51>
+       VK_OEM_102      <94>
+};
+
+keyboard "basic"
+{
+       VK_OEM_3        <49>
+       VK_KEY_1        <10>
+       VK_KEY_2        <11>
+       VK_KEY_3        <12>
+       VK_KEY_4        <13>
+       VK_KEY_5        <14>
+       VK_KEY_6        <15>
+       VK_KEY_7        <16>
+       VK_KEY_8        <17>
+       VK_KEY_9        <18>
+       VK_KEY_0        <19>
+       VK_OEM_MINUS    <20>
+       VK_OEM_PLUS     <21>
+       VK_BACK         <22>
+       VK_TAB          <23>
+       VK_KEY_Q        <24>
+       VK_KEY_W        <25>
+       VK_KEY_E        <26>
+       VK_KEY_R        <27>
+       VK_KEY_T        <28>
+       VK_KEY_Y        <29>
+       VK_KEY_U        <30>
+       VK_KEY_I        <31>
+       VK_KEY_O        <32>
+       VK_KEY_P        <33>
+       VK_OEM_4        <34>
+       VK_OEM_6        <35>
+       VK_RETURN       <36>
+       VK_CAPITAL      <66>
+       VK_KEY_A        <38>
+       VK_KEY_S        <39>
+       VK_KEY_D        <40>
+       VK_KEY_F        <41>
+       VK_KEY_G        <42>
+       VK_KEY_H        <43>
+       VK_KEY_J        <44>
+       VK_KEY_K        <45>
+       VK_KEY_L        <46>
+       VK_OEM_1        <47>
+       VK_OEM_7        <48>
+       VK_LSHIFT       <50>
+       VK_KEY_Z        <52>
+       VK_KEY_X        <53>
+       VK_KEY_C        <54>
+       VK_KEY_V        <55>
+       VK_KEY_B        <56>
+       VK_KEY_N        <57>
+       VK_KEY_M        <58>
+       VK_OEM_COMMA    <59>
+       VK_OEM_PERIOD   <60>
+       VK_OEM_2        <61>
+       VK_RSHIFT       <62>
+       VK_LMENU        <64>
+       VK_LCONTROL     <37>
+       VK_SPACE        <65>
+       VK_RCONTROL     <109>
+       VK_RMENU        <113>
+       VK_LWIN         <115>
+       VK_RWIN         <116>
+       VK_APPS         <117>
+       VK_ESCAPE       <9>
+       VK_F1           <67>
+       VK_F2           <68>
+       VK_F3           <69>
+       VK_F4           <70>
+       VK_F5           <71>
+       VK_F6           <72>
+       VK_F7           <73>
+       VK_F8           <74>
+       VK_F9           <75>
+       VK_F10          <76>
+       VK_F11          <95>
+       VK_F12          <96>
+       VK_SNAPSHOT     <111>
+       VK_SCROLL       <78>
+       VK_PAUSE        <110>
+       VK_INSERT       <106>
+       VK_HOME         <97>
+       VK_PRIOR        <99>
+       VK_DELETE       <107>
+       VK_END          <103>
+       VK_NEXT         <105>
+       VK_UP           <98>
+       VK_LEFT         <100>
+       VK_DOWN         <104>
+       VK_RIGHT        <102>
+       VK_NUMLOCK      <77>
+       VK_DIVIDE       <112>
+       VK_MULTIPLY     <63>
+       VK_SUBTRACT     <82>
+       VK_NUMPAD7      <79>
+       VK_NUMPAD8      <80>
+       VK_NUMPAD9      <81>
+       VK_ADD          <86>
+       VK_NUMPAD4      <83>
+       VK_NUMPAD5      <84>
+       VK_NUMPAD6      <85>
+       VK_NUMPAD1      <87>
+       VK_NUMPAD2      <88>
+       VK_NUMPAD3      <89>
+       VK_RETURN       <108>
+       VK_NUMPAD0      <90>
+       VK_DECIMAL      <91>
+       VK_F13          <118>
+       VK_F14          <119>
+       VK_F15          <120>
+       VK_F16          <121>
+       VK_F17          <122>
+       VK_ABNT_C1      <211>
+};
+
+keyboard "102"
+: extends "xfree86(xfree86)"
+{
+       VK_RMENU        <122>
+       VK_RCONTROL     <123>
+       VK_SNAPSHOT     <121>
+       VK_PAUSE        <118>
+       VK_INSERT       <131>
+       VK_HOME         <135>
+       VK_PRIOR        <119>
+       VK_DELETE       <129>
+       VK_END          <130>
+       VK_NEXT         <134>
+       VK_UP           <128>
+       VK_LEFT         <132>
+       VK_DOWN         <120>
+       VK_RIGHT        <133>
+       VK_DIVIDE       <125>
+       VK_RETURN       <124>
+};
+
+keyboard "thinkpadz60"
+: extends "xfree86(xfree86)"
+{
+       VK_APPS         <227>
+};
+
diff --git a/keymaps/xfree98 b/keymaps/xfree98
new file mode 100644 (file)
index 0000000..6e3bae6
--- /dev/null
@@ -0,0 +1,106 @@
+# This file was generated with xkb.pl (Wed Aug 11 09:09:10 2010)
+# and is based on the X Keyboard Configuration Database version 1.9
+# Please use xkb.pl to re-export newer versions of XKB
+
+
+keyboard "pc98"
+{
+       VK_ESCAPE       <8>
+       VK_KEY_1        <9>
+       VK_KEY_2        <10>
+       VK_KEY_3        <11>
+       VK_KEY_4        <12>
+       VK_KEY_5        <13>
+       VK_KEY_6        <14>
+       VK_KEY_7        <15>
+       VK_KEY_8        <16>
+       VK_KEY_9        <17>
+       VK_KEY_0        <18>
+       VK_OEM_MINUS    <19>
+       VK_OEM_PLUS     <20>
+       VK_OEM_5        <21>
+       VK_BACK         <22>
+       VK_TAB          <23>
+       VK_KEY_Q        <24>
+       VK_KEY_W        <25>
+       VK_KEY_E        <26>
+       VK_KEY_R        <27>
+       VK_KEY_T        <28>
+       VK_KEY_Y        <29>
+       VK_KEY_U        <30>
+       VK_KEY_I        <31>
+       VK_KEY_O        <32>
+       VK_KEY_P        <33>
+       VK_OEM_4        <34>
+       VK_OEM_6        <35>
+       VK_RETURN       <36>
+       VK_LCONTROL     <124>
+       VK_CAPITAL      <121>
+       VK_KEY_A        <37>
+       VK_KEY_S        <38>
+       VK_KEY_D        <39>
+       VK_KEY_F        <40>
+       VK_KEY_G        <41>
+       VK_KEY_H        <42>
+       VK_KEY_J        <43>
+       VK_KEY_K        <44>
+       VK_KEY_L        <45>
+       VK_OEM_1        <46>
+       VK_OEM_7        <47>
+       VK_OEM_5        <48>
+       VK_LSHIFT       <120>
+       VK_KEY_Z        <49>
+       VK_KEY_X        <50>
+       VK_KEY_C        <51>
+       VK_KEY_V        <52>
+       VK_KEY_B        <53>
+       VK_KEY_N        <54>
+       VK_KEY_M        <55>
+       VK_OEM_COMMA    <56>
+       VK_OEM_PERIOD   <57>
+       VK_OEM_2        <58>
+       VK_ABNT_C1      <59>
+       VK_LMENU        <123>
+       VK_SPACE        <60>
+       VK_SNAPSHOT     <105>
+       VK_F1           <106>
+       VK_F2           <107>
+       VK_F3           <108>
+       VK_F4           <109>
+       VK_F5           <110>
+       VK_F6           <111>
+       VK_F7           <112>
+       VK_F8           <113>
+       VK_F9           <114>
+       VK_F10          <115>
+       VK_F11          <90>
+       VK_F12          <91>
+       VK_F13          <92>
+       VK_F14          <93>
+       VK_F15          <94>
+       VK_INSERT       <64>
+       VK_DELETE       <65>
+       VK_PRIOR        <63>
+       VK_NEXT         <62>
+       VK_UP           <66>
+       VK_LEFT         <67>
+       VK_RIGHT        <68>
+       VK_DOWN         <69>
+       VK_HOME         <70>
+       VK_HELP         <71>
+       VK_SUBTRACT     <72>
+       VK_DIVIDE       <73>
+       VK_NUMPAD7      <74>
+       VK_NUMPAD8      <75>
+       VK_NUMPAD9      <76>
+       VK_MULTIPLY     <77>
+       VK_NUMPAD4      <78>
+       VK_NUMPAD5      <79>
+       VK_NUMPAD6      <80>
+       VK_ADD          <81>
+       VK_NUMPAD1      <82>
+       VK_NUMPAD2      <83>
+       VK_NUMPAD3      <84>
+       VK_NUMPAD0      <86>
+};
+
diff --git a/keymaps/xkb.pl b/keymaps/xkb.pl
new file mode 100755 (executable)
index 0000000..9faa5a0
--- /dev/null
@@ -0,0 +1,303 @@
+#!/usr/bin/perl
+
+#   FreeRDP: A Remote Desktop Protocol client.
+#   XKB database conversion script
+
+#   Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+
+#       http://www.apache.org/licenses/LICENSE-2.0
+
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+# Description:
+# Script to export XKB configuration files to keycode -> virtual key code keymaps that are
+# easy to use in FreeRDP. This makes keymap maintenance easier to make as all bugs can
+# simply be reported to the XKB Configuration Database project, and then this script can
+# be used to export newer (and fixed) version of the XKB Configuration Database.
+
+use Cwd;
+
+my %sym2virt = (
+       "AE00" => "VK_TILDE",
+       "AE01" => "VK_KEY_1",
+        "AE02" => "VK_KEY_2",
+        "AE03" => "VK_KEY_3",
+        "AE04" => "VK_KEY_4",
+        "AE05" => "VK_KEY_5",
+        "AE06" => "VK_KEY_6",
+        "AE07" => "VK_KEY_7",
+        "AE08" => "VK_KEY_8",
+        "AE09" => "VK_KEY_9",
+        "AE10" => "VK_KEY_0",
+        "AE11" => "VK_OEM_MINUS",
+        "AE12" => "VK_OEM_PLUS",
+
+        "AD01" => "VK_KEY_Q",
+        "AD02" => "VK_KEY_W",
+        "AD03" => "VK_KEY_E",
+        "AD04" => "VK_KEY_R",
+        "AD05" => "VK_KEY_T",
+        "AD06" => "VK_KEY_Y",
+        "AD07" => "VK_KEY_U",
+        "AD08" => "VK_KEY_I",
+        "AD09" => "VK_KEY_O",
+        "AD10" => "VK_KEY_P",
+        "AD11" => "VK_OEM_4",
+        "AD12" => "VK_OEM_6",
+
+        "AC01" => "VK_KEY_A",
+        "AC02" => "VK_KEY_S",
+        "AC03" => "VK_KEY_D",
+        "AC04" => "VK_KEY_F",
+        "AC05" => "VK_KEY_G",
+        "AC06" => "VK_KEY_H",
+        "AC07" => "VK_KEY_J",
+        "AC08" => "VK_KEY_K",
+        "AC09" => "VK_KEY_L",
+        "AC10" => "VK_OEM_1",
+        "AC11" => "VK_OEM_7",
+        "AC12" => "VK_OEM_5",
+
+        "AB00" => "VK_LSHIFT",
+        "AB01" => "VK_KEY_Z",
+        "AB02" => "VK_KEY_X",
+        "AB03" => "VK_KEY_C",
+        "AB04" => "VK_KEY_V",
+        "AB05" => "VK_KEY_B",
+        "AB06" => "VK_KEY_N",
+        "AB07" => "VK_KEY_M",
+        "AB08" => "VK_OEM_COMMA",
+        "AB09" => "VK_OEM_PERIOD",
+        "AB10" => "VK_OEM_2",
+        "AB11" => "VK_ABNT_C1",
+
+        "FK01" => "VK_F1",
+        "FK02" => "VK_F2",
+        "FK03" => "VK_F3",
+        "FK04" => "VK_F4",
+        "FK05" => "VK_F5",
+        "FK06" => "VK_F6",
+        "FK07" => "VK_F7",
+        "FK08" => "VK_F8",
+        "FK09" => "VK_F9",
+        "FK10" => "VK_F10",
+        "FK11" => "VK_F11",
+        "FK12" => "VK_F12",
+        "FK13" => "VK_F13",
+        "FK14" => "VK_F14",
+        "FK15" => "VK_F15",
+        "FK16" => "VK_F16",
+        "FK17" => "VK_F17",
+        "FK18" => "VK_F18",
+        "FK19" => "VK_F19",
+        "FK20" => "VK_F20",
+        "FK21" => "VK_F21",
+        "FK22" => "VK_F22",
+        "FK23" => "VK_F23",
+        "FK24" => "VK_F24",
+
+        "KP0" => "VK_NUMPAD0",
+        "KP1" => "VK_NUMPAD1",
+        "KP2" => "VK_NUMPAD2",
+        "KP3" => "VK_NUMPAD3",
+        "KP4" => "VK_NUMPAD4",
+        "KP5" => "VK_NUMPAD5",
+        "KP6" => "VK_NUMPAD6",
+        "KP7" => "VK_NUMPAD7",
+        "KP8" => "VK_NUMPAD8",
+        "KP9" => "VK_NUMPAD9",
+
+        "KPDV" => "VK_DIVIDE",
+        "KPMU" => "VK_MULTIPLY",
+        "KPSU" => "VK_SUBTRACT",
+        "KPAD" => "VK_ADD",
+        "KPDL" => "VK_DECIMAL",
+        "KPEN" => "VK_RETURN",
+
+        "RTRN" => "VK_RETURN",
+        "SPCE" => "VK_SPACE",
+        "BKSP" => "VK_BACK",
+        "BKSL" => "VK_OEM_5",
+        "LSGT" => "VK_OEM_102",
+        "ESC" => "VK_ESCAPE",
+        "TLDE" => "VK_OEM_3",
+        "CAPS" => "VK_CAPITAL",
+        "TAB" => "VK_TAB",
+        "LFSH" => "VK_LSHIFT",
+        "RTSH" => "VK_RSHIFT",
+        "LCTL" => "VK_LCONTROL",
+        "RCTL" => "VK_RCONTROL",
+        "LWIN" => "VK_LWIN",
+        "RWIN" => "VK_RWIN",
+        "LALT" => "VK_LMENU",
+        "RALT" => "VK_RMENU",
+        "COMP" => "VK_APPS",
+        "MENU" => "VK_APPS",
+        "UP" => "VK_UP",
+        "DOWN" => "VK_DOWN",
+        "LEFT" => "VK_LEFT",
+        "RGHT" => "VK_RIGHT",
+        "INS" => "VK_INSERT",
+        "DELE" => "VK_DELETE",
+        "PGUP" => "VK_PRIOR",
+        "PGDN" => "VK_NEXT",
+        "HOME" => "VK_HOME",
+        "END" => "VK_END",
+        "PAUS" => "VK_PAUSE",
+        "NMLK" => "VK_NUMLOCK",
+        "SCLK" => "VK_SCROLL",
+
+       # This page helps understanding the keys that follow:
+       # http://www.stanford.edu/class/cs140/projects/pintos/specs/kbd/scancodes-7.html
+       "KANJ" => "VK_KANJI",
+       "HANJ" => "VK_HANJA",
+       "MUHE" => "VK_NONCONVERT",
+       "HIRA" => "VK_KANA",
+       "PRSC" => "VK_SNAPSHOT",
+
+       "KPF1" => "VK_NUMLOCK",
+       "KPF2" => "VK_DIVIDE",
+       "KPF3" => "VK_MULTIPLY",
+       "KPF4" => "VK_SUBTRACT",
+       "KPCO" => "VK_ADD",
+
+        "HELP" => "VK_HELP",
+        "SELE" => "VK_SELECT",
+
+       # We can ignore LDM (Lock Down Modifier)
+       # What are LCMP/RCMP?
+       # DO, FIND?
+
+);
+
+my $inDir;
+my $outDir;
+
+if(@ARGV < 1) {
+       $inDir = getcwd() . "/";
+       $outDir = $inDir;
+} elsif(@ARGV == 1) {
+       $inDir = $ARGV[0];
+       $outDir = getcwd() . "/";
+} elsif(@ARGV == 2) {
+       $inDir = $ARGV[0];
+       $outDir = $ARGV[1];
+} else {
+       print   "Error: Too many arguments\n" .
+               "Usage:\n" .
+               "perl xkb.pl <XKB Directory>\n" .
+               "perl xkb.pl <XKB Directory> <Output Directory>\n\n" .
+               "In Linux, the XKB directory usually is /usr/share/X11/xkb/\n" .
+               "The latest version of XKB can always be downloaded at:\n" .
+               "http://freedesktop.org/wiki/Software/XKeyboardConfig\n";
+               exit 0;
+}
+
+
+
+open("SPEC", $inDir . "xkeyboard-config.spec");
+
+$xkbVersion = "";
+while($line = <SPEC>) {
+       if($line =~ m/Version:\s+(.\..)/) {
+               $xkbVersion = "version $1";
+       }
+}
+
+# Create directory if it does not exists
+if(not -e $outDir) {
+       mkdir $outDir or die("Error: Can't create directory $outDir\n");
+}
+
+open("KCD", $inDir . "keycodes/keycodes.dir") or die("Error: Can't open $inDir" . "keycodes/keycodes.dir\n");
+
+$previousFile = "";
+while($line = <KCD>) {
+       if($line =~ m/........ -------- (.+)\((.+)\)/) {
+               if($1 ne $previousFile) {
+                       push(@keymapFiles, $1);
+                       $previousFile = $1;
+               }
+       }       
+}
+close("KCD");
+
+foreach $keymapFile (@keymapFiles) {
+
+               print "File $keymapFile:\n";
+
+               @directories = split(/\//, $keymapFile);
+               splice(@directories, @directories - 1, 1); 
+
+               if(@directories > 0) {
+                       $directory = $outDir;           
+                       for($i = 0; $i < @directories; $i++) {
+                               $directory .= $directories[$i] . "/";
+                               if(not -e $directory) {
+                                       mkdir $directory or die("Can't create directory $directory\n");                         
+                               }                       
+                       }
+               }
+
+               open("IN", $inDir . "keycodes/" . $keymapFile);
+               open("OUT", ">" . "$outDir" . $keymapFile);
+
+               print OUT "# This file was generated with xkb.pl\n";
+               print OUT "# and is based on the X Keyboard Configuration Database $xkbVersion\n";
+               print OUT "# Please use xkb.pl to re-export newer versions of XKB\n";
+               print OUT "\n\n";
+
+               while($line = <IN>) {
+                       if($line =~ m/xkb_keycodes \"(\w+)\"/) {
+
+                               print "Exporting \"$1\"\n";
+                               print OUT "keyboard \"$1\"";
+
+
+                               while($line = <IN>) {
+                                       if($line =~ m/include\W+\"(.+)\"/) {
+                                               print OUT "\n: extends \"$1\"";
+                                               last;
+                                       } else {
+                                               last;
+                                       }
+                               }
+                               print OUT "\n{\n";              
+
+                               while($line = <IN>) {
+                                       if($line =~ m/<(\w{1,4})>\W+=\W+(\w+);/) {
+                                               if($sym2virt{$1} ne undef) {
+                                                       $vkcode = $sym2virt{$1};
+                                                       print OUT "\t$vkcode";
+
+                                                       if(length($vkcode) < 8) {
+                                                               print OUT "\t";
+                                                       }
+                                                       print OUT "\t<$2>\n";
+                                               } else {
+                                                       # If undef, then this symbolic key code is
+                                                       # missing from the sym2virt hash table
+                                                       # print "\t$1\t$2\n";
+                                               }
+                                       } elsif($line =~ m/};/) {
+                                               print OUT "};\n\n";
+                                               last;
+                                       }
+                               }
+                       }
+               }
+
+               close("IN");
+               close("OUT");
+}
+
diff --git a/libfreerdp-cache/CMakeLists.txt b/libfreerdp-cache/CMakeLists.txt
new file mode 100644 (file)
index 0000000..17769e3
--- /dev/null
@@ -0,0 +1,36 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-cache cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(FREERDP_CACHE_SRCS
+       brush.c
+       pointer.c
+       bitmap.c
+       offscreen.c
+       palette.c
+       glyph.c
+       cache.c)
+
+add_library(freerdp-cache ${FREERDP_CACHE_SRCS})
+
+set_target_properties(freerdp-cache PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+
+target_link_libraries(freerdp-cache freerdp-core)
+target_link_libraries(freerdp-cache freerdp-utils)
+
+install(TARGETS freerdp-cache DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/libfreerdp-cache/bitmap.c b/libfreerdp-cache/bitmap.c
new file mode 100644 (file)
index 0000000..652a391
--- /dev/null
@@ -0,0 +1,282 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Bitmap Cache V2
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/bitmap.h>
+
+void update_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt)
+{
+       rdpBitmap* bitmap;
+       rdpCache* cache = context->cache;
+
+       if (memblt->cacheId == 0xFF)
+               bitmap = offscreen_cache_get(cache->offscreen, memblt->cacheIndex);
+       else
+               bitmap = bitmap_cache_get(cache->bitmap, (uint8) memblt->cacheId, memblt->cacheIndex);
+
+       memblt->bitmap = bitmap;
+       IFCALL(cache->bitmap->MemBlt, context, memblt);
+}
+
+void update_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt)
+{
+       rdpBitmap* bitmap;
+       rdpCache* cache = context->cache;
+
+       if (mem3blt->cacheId == 0xFF)
+               bitmap = offscreen_cache_get(cache->offscreen, mem3blt->cacheIndex);
+       else
+               bitmap = bitmap_cache_get(cache->bitmap, (uint8) mem3blt->cacheId, mem3blt->cacheIndex);
+
+       mem3blt->bitmap = bitmap;
+       IFCALL(cache->bitmap->Mem3Blt, context, mem3blt);
+}
+
+void update_gdi_cache_bitmap(rdpContext* context, CACHE_BITMAP_ORDER* cache_bitmap)
+{
+       rdpBitmap* bitmap;
+       rdpBitmap* prevBitmap;
+       rdpCache* cache = context->cache;
+
+       bitmap = Bitmap_Alloc(context);
+
+       Bitmap_SetDimensions(context, bitmap, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight);
+
+       bitmap->Decompress(context, bitmap,
+                       cache_bitmap->bitmapDataStream, cache_bitmap->bitmapWidth, cache_bitmap->bitmapHeight,
+                       cache_bitmap->bitmapBpp, cache_bitmap->bitmapLength, cache_bitmap->compressed);
+
+       bitmap->New(context, bitmap);
+
+       prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex);
+
+       if (prevBitmap != NULL)
+               Bitmap_Free(context, prevBitmap);
+
+       bitmap_cache_put(cache->bitmap, cache_bitmap->cacheId, cache_bitmap->cacheIndex, bitmap);
+}
+
+void update_gdi_cache_bitmap_v2(rdpContext* context, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2)
+{
+       rdpBitmap* bitmap;
+       rdpBitmap* prevBitmap;
+       rdpCache* cache = context->cache;
+
+       bitmap = Bitmap_Alloc(context);
+
+       Bitmap_SetDimensions(context, bitmap, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight);
+
+       if (cache_bitmap_v2->bitmapBpp == 0)
+       {
+               /* Workaround for Windows 8 bug where bitmapBpp is not set */
+               cache_bitmap_v2->bitmapBpp = context->instance->settings->color_depth;
+       }
+
+       bitmap->Decompress(context, bitmap,
+                       cache_bitmap_v2->bitmapDataStream, cache_bitmap_v2->bitmapWidth, cache_bitmap_v2->bitmapHeight,
+                       cache_bitmap_v2->bitmapBpp, cache_bitmap_v2->bitmapLength, cache_bitmap_v2->compressed);
+
+       bitmap->New(context, bitmap);
+
+       prevBitmap = bitmap_cache_get(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex);
+
+       if (prevBitmap != NULL)
+               Bitmap_Free(context, prevBitmap);
+
+       bitmap_cache_put(cache->bitmap, cache_bitmap_v2->cacheId, cache_bitmap_v2->cacheIndex, bitmap);
+}
+
+void update_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmap_update)
+{
+       int i;
+       rdpBitmap* bitmap;
+       BITMAP_DATA* bitmap_data;
+       boolean reused = true;
+       rdpCache* cache = context->cache;
+
+       if (cache->bitmap->bitmap == NULL)
+       {
+               cache->bitmap->bitmap = Bitmap_Alloc(context);
+               cache->bitmap->bitmap->ephemeral = true;
+               reused = false;
+       }
+
+       bitmap = cache->bitmap->bitmap;
+
+       for (i = 0; i < (int) bitmap_update->number; i++)
+       {
+               bitmap_data = &bitmap_update->rectangles[i];
+
+               bitmap->bpp = bitmap_data->bitsPerPixel;
+               bitmap->length = bitmap_data->bitmapLength;
+               bitmap->compressed = bitmap_data->compressed;
+
+               Bitmap_SetRectangle(context, bitmap,
+                               bitmap_data->destLeft, bitmap_data->destTop,
+                               bitmap_data->destRight, bitmap_data->destBottom);
+
+               Bitmap_SetDimensions(context, bitmap, bitmap_data->width, bitmap_data->height);
+
+               bitmap->Decompress(context, bitmap,
+                               bitmap_data->bitmapDataStream, bitmap_data->width, bitmap_data->height,
+                               bitmap_data->bitsPerPixel, bitmap_data->bitmapLength, bitmap_data->compressed);
+
+               if (reused)
+                       bitmap->Free(context, bitmap);
+               else
+                       reused = true;
+
+               bitmap->New(context, bitmap);
+
+               bitmap->Paint(context, bitmap);
+       }
+}
+
+rdpBitmap* bitmap_cache_get(rdpBitmapCache* bitmap_cache, uint32 id, uint32 index)
+{
+       rdpBitmap* bitmap;
+
+       if (id > bitmap_cache->maxCells)
+       {
+               printf("get invalid bitmap cell id: %d\n", id);
+               return NULL;
+       }
+
+       if (index == BITMAP_CACHE_WAITING_LIST_INDEX)
+               index = bitmap_cache->cells[id].number - 1;
+
+       if (index > bitmap_cache->cells[id].number)
+       {
+               printf("get invalid bitmap index %d in cell id: %d\n", index, id);
+               return NULL;
+       }
+
+       bitmap = bitmap_cache->cells[id].entries[index];
+
+       return bitmap;
+}
+
+void bitmap_cache_put(rdpBitmapCache* bitmap_cache, uint32 id, uint32 index, rdpBitmap* bitmap)
+{
+       if (id > bitmap_cache->maxCells)
+       {
+               printf("put invalid bitmap cell id: %d\n", id);
+               return;
+       }
+
+       if (index == BITMAP_CACHE_WAITING_LIST_INDEX)
+               index = bitmap_cache->cells[id].number - 1;
+
+       if (index > bitmap_cache->cells[id].number)
+       {
+               printf("put invalid bitmap index %d in cell id: %d\n", index, id);
+               return;
+       }
+
+       bitmap_cache->cells[id].entries[index] = bitmap;
+}
+
+void bitmap_cache_register_callbacks(rdpUpdate* update)
+{
+       rdpCache* cache = update->context->cache;
+
+       cache->bitmap->MemBlt = update->primary->MemBlt;
+       cache->bitmap->Mem3Blt = update->primary->Mem3Blt;
+
+       update->primary->MemBlt = update_gdi_memblt;
+       update->primary->Mem3Blt = update_gdi_mem3blt;
+
+       update->secondary->CacheBitmap = update_gdi_cache_bitmap;
+       update->secondary->CacheBitmapV2 = update_gdi_cache_bitmap_v2;
+
+       update->BitmapUpdate = update_gdi_bitmap_update;
+}
+
+rdpBitmapCache* bitmap_cache_new(rdpSettings* settings)
+{
+       int i;
+       rdpBitmapCache* bitmap_cache;
+
+       bitmap_cache = (rdpBitmapCache*) xzalloc(sizeof(rdpBitmapCache));
+
+       if (bitmap_cache != NULL)
+       {
+               bitmap_cache->settings = settings;
+               bitmap_cache->update = ((freerdp*) settings->instance)->update;
+               bitmap_cache->context = bitmap_cache->update->context;
+
+               bitmap_cache->maxCells = 5;
+
+               settings->bitmap_cache = false;
+               settings->bitmapCacheV2NumCells = 5;
+               settings->bitmapCacheV2CellInfo[0].numEntries = 600;
+               settings->bitmapCacheV2CellInfo[0].persistent = false;
+               settings->bitmapCacheV2CellInfo[1].numEntries = 600;
+               settings->bitmapCacheV2CellInfo[1].persistent = false;
+               settings->bitmapCacheV2CellInfo[2].numEntries = 2048;
+               settings->bitmapCacheV2CellInfo[2].persistent = false;
+               settings->bitmapCacheV2CellInfo[3].numEntries = 4096;
+               settings->bitmapCacheV2CellInfo[3].persistent = false;
+               settings->bitmapCacheV2CellInfo[4].numEntries = 2048;
+               settings->bitmapCacheV2CellInfo[4].persistent = false;
+
+               bitmap_cache->cells = (BITMAP_V2_CELL*) xzalloc(sizeof(BITMAP_V2_CELL) * bitmap_cache->maxCells);
+
+               for (i = 0; i < (int) bitmap_cache->maxCells; i++)
+               {
+                       bitmap_cache->cells[i].number = settings->bitmapCacheV2CellInfo[i].numEntries;
+                       bitmap_cache->cells[i].entries = (rdpBitmap**) xzalloc(sizeof(rdpBitmap*) * bitmap_cache->cells[i].number);
+               }
+       }
+
+       return bitmap_cache;
+}
+
+void bitmap_cache_free(rdpBitmapCache* bitmap_cache)
+{
+       int i, j;
+       rdpBitmap* bitmap;
+
+       if (bitmap_cache != NULL)
+       {
+               for (i = 0; i < (int) bitmap_cache->maxCells; i++)
+               {
+                       for (j = 0; j < (int) bitmap_cache->cells[i].number; j++)
+                       {
+                               bitmap = bitmap_cache->cells[i].entries[j];
+
+                               if (bitmap != NULL)
+                               {
+                                       Bitmap_Free(bitmap_cache->context, bitmap);
+                               }
+                       }
+
+                       xfree(bitmap_cache->cells[i].entries);
+               }
+
+               if (bitmap_cache->bitmap != NULL)
+                       Bitmap_Free(bitmap_cache->context, bitmap_cache->bitmap);
+
+               xfree(bitmap_cache->cells);
+               xfree(bitmap_cache);
+       }
+}
diff --git a/libfreerdp-cache/brush.c b/libfreerdp-cache/brush.c
new file mode 100644 (file)
index 0000000..2aabfe8
--- /dev/null
@@ -0,0 +1,185 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Brush Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/brush.h>
+
+void update_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt)
+{
+       uint8 style;
+       rdpBrush* brush = &patblt->brush;
+       rdpCache* cache = context->cache;
+
+       style = brush->style;
+
+       if (brush->style & CACHED_BRUSH)
+       {
+               brush->data = brush_cache_get(cache->brush, brush->index, &brush->bpp);
+               brush->style = 0x03;
+       }
+
+       IFCALL(cache->brush->PatBlt, context, patblt);
+       brush->style = style;
+}
+
+void update_gdi_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush)
+{
+       rdpCache* cache = context->cache;
+       brush_cache_put(cache->brush, cache_brush->index, cache_brush->data, cache_brush->bpp);
+}
+
+void* brush_cache_get(rdpBrushCache* brush, uint32 index, uint32* bpp)
+{
+       void* entry;
+
+       if (*bpp == 1)
+       {
+               if (index > brush->maxMonoEntries)
+               {
+                       printf("invalid brush (%d bpp) index: 0x%04X\n", *bpp, index);
+                       return NULL;
+               }
+
+               *bpp = brush->monoEntries[index].bpp;
+               entry = brush->monoEntries[index].entry;
+       }
+       else
+       {
+               if (index > brush->maxEntries)
+               {
+                       printf("invalid brush (%d bpp) index: 0x%04X\n", *bpp, index);
+                       return NULL;
+               }
+
+               *bpp = brush->entries[index].bpp;
+               entry = brush->entries[index].entry;
+       }
+
+       if (entry == NULL)
+       {
+               printf("invalid brush (%d bpp) at index: 0x%04X\n", *bpp, index);
+               return NULL;
+       }
+
+       return entry;
+}
+
+void brush_cache_put(rdpBrushCache* brush, uint32 index, void* entry, uint32 bpp)
+{
+       void* prevEntry;
+
+       if (bpp == 1)
+       {
+               if (index > brush->maxMonoEntries)
+               {
+                       printf("invalid brush (%d bpp) index: 0x%04X\n", bpp, index);
+                       return;
+               }
+
+               prevEntry = brush->monoEntries[index].entry;
+
+               if (prevEntry != NULL)
+                       xfree(prevEntry);
+
+               brush->monoEntries[index].bpp = bpp;
+               brush->monoEntries[index].entry = entry;
+       }
+       else
+       {
+               if (index > brush->maxEntries)
+               {
+                       printf("invalid brush (%d bpp) index: 0x%04X\n", bpp, index);
+                       return;
+               }
+
+               prevEntry = brush->entries[index].entry;
+
+               if (prevEntry != NULL)
+                       xfree(prevEntry);
+
+               brush->entries[index].bpp = bpp;
+               brush->entries[index].entry = entry;
+       }
+}
+
+void brush_cache_register_callbacks(rdpUpdate* update)
+{
+       rdpCache* cache = update->context->cache;
+
+       cache->brush->PatBlt = update->primary->PatBlt;
+
+       update->primary->PatBlt = update_gdi_patblt;
+       update->secondary->CacheBrush = update_gdi_cache_brush;
+}
+
+rdpBrushCache* brush_cache_new(rdpSettings* settings)
+{
+       rdpBrushCache* brush;
+
+       brush = (rdpBrushCache*) xzalloc(sizeof(rdpBrushCache));
+
+       if (brush != NULL)
+       {
+               brush->settings = settings;
+
+               brush->maxEntries = 64;
+               brush->maxMonoEntries = 64;
+
+               brush->entries = (BRUSH_ENTRY*) xzalloc(sizeof(BRUSH_ENTRY) * brush->maxEntries);
+               brush->monoEntries = (BRUSH_ENTRY*) xzalloc(sizeof(BRUSH_ENTRY) * brush->maxMonoEntries);
+       }
+
+       return brush;
+}
+
+void brush_cache_free(rdpBrushCache* brush)
+{
+       int i;
+
+       if (brush != NULL)
+       {
+               if (brush->entries != NULL)
+               {
+                       for (i = 0; i < (int) brush->maxEntries; i++)
+                       {
+                               if (brush->entries[i].entry != NULL)
+                                       xfree(brush->entries[i].entry);
+                       }
+
+                       xfree(brush->entries);
+               }
+
+               if (brush->monoEntries != NULL)
+               {
+                       for (i = 0; i < (int) brush->maxMonoEntries; i++)
+                       {
+                               if (brush->monoEntries[i].entry != NULL)
+                                       xfree(brush->monoEntries[i].entry);
+                       }
+
+                       xfree(brush->monoEntries);
+               }
+
+               xfree(brush);
+       }
+}
diff --git a/libfreerdp-cache/cache.c b/libfreerdp-cache/cache.c
new file mode 100644 (file)
index 0000000..3756765
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Caches
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/cache.h>
+
+rdpCache* cache_new(rdpSettings* settings)
+{
+       rdpCache* cache;
+
+       cache = (rdpCache*) xzalloc(sizeof(rdpCache));
+
+       if (cache != NULL)
+       {
+               cache->settings = settings;
+               cache->glyph = glyph_cache_new(settings);
+               cache->brush = brush_cache_new(settings);
+               cache->pointer = pointer_cache_new(settings);
+               cache->bitmap = bitmap_cache_new(settings);
+               cache->offscreen = offscreen_cache_new(settings);
+               cache->palette = palette_cache_new(settings);
+       }
+
+       return cache;
+}
+
+void cache_free(rdpCache* cache)
+{
+       if (cache != NULL)
+       {
+               glyph_cache_free(cache->glyph);
+               brush_cache_free(cache->brush);
+               pointer_cache_free(cache->pointer);
+               bitmap_cache_free(cache->bitmap);
+               offscreen_cache_free(cache->offscreen);
+               palette_cache_free(cache->palette);
+               xfree(cache);
+       }
+}
diff --git a/libfreerdp-cache/glyph.c b/libfreerdp-cache/glyph.c
new file mode 100644 (file)
index 0000000..fc33266
--- /dev/null
@@ -0,0 +1,513 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Glyph Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/glyph.h>
+
+void update_process_glyph(rdpContext* context, uint8* data, int* index,
+               int* x, int* y, uint32 cacheId, uint32 ulCharInc, uint32 flAccel)
+{
+       int offset;
+       rdpGlyph* glyph;
+       uint32 cacheIndex;
+       rdpGraphics* graphics;
+       rdpGlyphCache* glyph_cache;
+
+       graphics = context->graphics;
+       glyph_cache = context->cache->glyph;
+
+       cacheIndex = data[*index];
+
+       glyph = glyph_cache_get(glyph_cache, cacheId, cacheIndex);
+
+       if ((ulCharInc == 0) && (!(flAccel & SO_CHAR_INC_EQUAL_BM_BASE)))
+       {
+               (*index)++;
+               offset = data[*index];
+
+               if (offset & 0x80)
+               {
+                       offset = data[*index + 1] | (data[*index + 2] << 8);
+                       (*index)++;
+                       (*index)++;
+               }
+
+               if (flAccel & SO_VERTICAL)
+                       *y += offset;
+               else
+                       *x += offset;
+       }
+
+       if (glyph != NULL)
+       {
+               Glyph_Draw(context, glyph, glyph->x + *x, glyph->y + *y);
+
+               if (flAccel & SO_CHAR_INC_EQUAL_BM_BASE)
+                       *x += glyph->cx;
+       }
+}
+
+void update_process_glyph_fragments(rdpContext* context, uint8* data, uint32 length,
+               uint32 cacheId, uint32 ulCharInc, uint32 flAccel, uint32 bgcolor, uint32 fgcolor, int x, int y,
+               int bkX, int bkY, int bkWidth, int bkHeight, int opX, int opY, int opWidth, int opHeight)
+{
+       int n;
+       uint32 id;
+       uint32 size;
+       int index = 0;
+       uint8* fragments;
+       rdpGraphics* graphics;
+       rdpGlyphCache* glyph_cache;
+
+       graphics = context->graphics;
+       glyph_cache = context->cache->glyph;
+
+       if (opWidth > 0 && opHeight > 0)
+               Glyph_BeginDraw(context, opX, opY, opWidth, opHeight, bgcolor, fgcolor);
+       else
+               Glyph_BeginDraw(context, 0, 0, 0, 0, bgcolor, fgcolor);
+
+       while (index < (int) length)
+       {
+               switch (data[index])
+               {
+                       case GLYPH_FRAGMENT_USE:
+
+                               if (index + 2 > (int) length)
+                               {
+                                       /* at least one byte need to follow */
+                                       index = length = 0;
+                                       break;
+                               }
+
+                               id = data[index + 1];
+                               fragments = (uint8*) glyph_cache_fragment_get(glyph_cache, id, &size);
+
+                               if (fragments != NULL)
+                               {
+                                       if ((ulCharInc == 0) && (!(flAccel & SO_CHAR_INC_EQUAL_BM_BASE)))
+                                       {
+                                               if (flAccel & SO_VERTICAL)
+                                                       y += data[index + 2];
+                                               else
+                                                       x += data[index + 2];
+                                       }
+
+                                       for (n = 0; n < (int) size; n++)
+                                       {
+                                               update_process_glyph(context, fragments, &n, &x, &y, cacheId, ulCharInc, flAccel);
+                                       }
+                               }
+
+                               index += (index + 2 < (int) length) ? 3 : 2;
+                               length -= index;
+                               data = &(data[index]);
+                               index = 0;
+
+                               break;
+
+                       case GLYPH_FRAGMENT_ADD:
+
+                               if (index + 3 > (int) length)
+                               {
+                                       /* at least two bytes need to follow */
+                                       index = length = 0;
+                                       break;
+                               }
+
+                               id = data[index + 1];
+                               size = data[index + 2];
+
+                               fragments = (uint8*) xmalloc(size);
+                               memcpy(fragments, data, size);
+                               glyph_cache_fragment_put(glyph_cache, id, size, fragments);
+
+                               index += 3;
+                               length -= index;
+                               data = &(data[index]);
+                               index = 0;
+
+                               break;
+
+                       default:
+                               update_process_glyph(context, data, &index, &x, &y, cacheId, ulCharInc, flAccel);
+                               index++;
+                               break;
+               }
+       }
+
+       if (opWidth > 0 && opHeight > 0)
+               Glyph_EndDraw(context, opX, opY, opWidth, opHeight, bgcolor, fgcolor);
+       else
+               Glyph_EndDraw(context, bkX, bkY, bkWidth, bkHeight, bgcolor, fgcolor);
+}
+
+void update_gdi_glyph_index(rdpContext* context, GLYPH_INDEX_ORDER* glyph_index)
+{
+       rdpGlyphCache* glyph_cache;
+
+       glyph_cache = context->cache->glyph;
+       update_process_glyph_fragments(context, glyph_index->data, glyph_index->cbData,
+                       glyph_index->cacheId, glyph_index->ulCharInc, glyph_index->flAccel,
+                       glyph_index->backColor, glyph_index->foreColor, glyph_index->x, glyph_index->y,
+                       glyph_index->bkLeft, glyph_index->bkTop,
+                       glyph_index->bkRight - glyph_index->bkLeft, glyph_index->bkBottom - glyph_index->bkTop,
+                       glyph_index->opLeft, glyph_index->opTop,
+                       glyph_index->opRight - glyph_index->opLeft, glyph_index->opBottom - glyph_index->opTop);
+}
+
+void update_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fast_index)
+{
+       sint32 opLeft, opTop, opRight, opBottom;
+       sint32 x, y;
+       rdpGlyphCache* glyph_cache;
+
+       glyph_cache = context->cache->glyph;
+
+       opLeft = fast_index->opLeft;
+       opTop = fast_index->opTop;
+       opRight = fast_index->opRight;
+       opBottom = fast_index->opBottom;
+       x = fast_index->x;
+       y = fast_index->y;
+
+       if (opBottom == -32768)
+       {
+               uint8 flags = (uint8) (opTop & 0x0F);
+
+               if (flags & 0x01)
+                       opBottom = fast_index->bkBottom;
+               if (flags & 0x02)
+                       opRight = fast_index->bkRight;
+               if (flags & 0x04)
+                       opTop = fast_index->bkTop;
+               if (flags & 0x08)
+                       opLeft = fast_index->bkLeft;
+       }
+
+       if (opLeft == 0)
+               opLeft = fast_index->bkLeft;
+
+       if (opRight == 0)
+               opRight = fast_index->bkRight;
+
+       if (x == -32768)
+               x = fast_index->bkLeft;
+
+       if (y == -32768)
+               y = fast_index->bkTop;
+
+       update_process_glyph_fragments(context, fast_index->data, fast_index->cbData,
+                       fast_index->cacheId, fast_index->ulCharInc, fast_index->flAccel,
+                       fast_index->backColor, fast_index->foreColor, x, y,
+                       fast_index->bkLeft, fast_index->bkTop,
+                       fast_index->bkRight - fast_index->bkLeft, fast_index->bkBottom - fast_index->bkTop,
+                       opLeft, opTop,
+                       opRight - opLeft, opBottom - opTop);
+}
+
+void update_gdi_fast_glyph(rdpContext* context, FAST_GLYPH_ORDER* fast_glyph)
+{
+       sint32 opLeft, opTop, opRight, opBottom;
+       sint32 x, y;
+       GLYPH_DATA_V2* glyph_data;
+       rdpGlyph* glyph;
+       rdpCache* cache = context->cache;
+       uint8 text_data[2];
+
+       opLeft = fast_glyph->opLeft;
+       opTop = fast_glyph->opTop;
+       opRight = fast_glyph->opRight;
+       opBottom = fast_glyph->opBottom;
+       x = fast_glyph->x;
+       y = fast_glyph->y;
+
+       if (opBottom == -32768)
+       {
+               uint8 flags = (uint8) (opTop & 0x0F);
+
+               if (flags & 0x01)
+                       opBottom = fast_glyph->bkBottom;
+               if (flags & 0x02)
+                       opRight = fast_glyph->bkRight;
+               if (flags & 0x04)
+                       opTop = fast_glyph->bkTop;
+               if (flags & 0x08)
+                       opLeft = fast_glyph->bkLeft;
+       }
+
+       if (opLeft == 0)
+               opLeft = fast_glyph->bkLeft;
+
+       if (opRight == 0)
+               opRight = fast_glyph->bkRight;
+
+       if (x == -32768)
+               x = fast_glyph->bkLeft;
+
+       if (y == -32768)
+               y = fast_glyph->bkTop;
+
+       if (fast_glyph->glyph_data != NULL)
+       {
+               /* got option font that needs to go into cache */
+               glyph_data = (GLYPH_DATA_V2*) (fast_glyph->glyph_data);
+               glyph = Glyph_Alloc(context);
+               glyph->x = glyph_data->x;
+               glyph->y = glyph_data->y;
+               glyph->cx = glyph_data->cx;
+               glyph->cy = glyph_data->cy;
+               glyph->aj = glyph_data->aj;
+               glyph->cb = glyph_data->cb;
+               Glyph_New(context, glyph);
+               glyph_cache_put(cache->glyph, fast_glyph->cacheId, fast_glyph->data[0], glyph);
+               xfree(fast_glyph->glyph_data);
+               fast_glyph->glyph_data = NULL;
+       }
+
+       text_data[0] = fast_glyph->data[0];
+       text_data[1] = 0;
+
+       update_process_glyph_fragments(context, text_data, 1,
+                       fast_glyph->cacheId, fast_glyph->ulCharInc, fast_glyph->flAccel,
+                       fast_glyph->backColor, fast_glyph->foreColor, x, y,
+                       fast_glyph->bkLeft, fast_glyph->bkTop,
+                       fast_glyph->bkRight - fast_glyph->bkLeft, fast_glyph->bkBottom - fast_glyph->bkTop,
+                       opLeft, opTop,
+                       opRight - opLeft, opBottom - opTop);
+}
+
+void update_gdi_cache_glyph(rdpContext* context, CACHE_GLYPH_ORDER* cache_glyph)
+{
+       int i;
+       rdpGlyph* glyph;
+       GLYPH_DATA* glyph_data;
+       rdpCache* cache = context->cache;
+
+       for (i = 0; i < (int) cache_glyph->cGlyphs; i++)
+       {
+               glyph_data = cache_glyph->glyphData[i];
+
+               glyph = Glyph_Alloc(context);
+
+               glyph->x = glyph_data->x;
+               glyph->y = glyph_data->y;
+               glyph->cx = glyph_data->cx;
+               glyph->cy = glyph_data->cy;
+               glyph->aj = glyph_data->aj;
+               glyph->cb = glyph_data->cb;
+               Glyph_New(context, glyph);
+
+               glyph_cache_put(cache->glyph, cache_glyph->cacheId, glyph_data->cacheIndex, glyph);
+
+               cache_glyph->glyphData[i] = NULL;
+               xfree(glyph_data);
+       }
+}
+
+void update_gdi_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2)
+{
+       int i;
+       rdpGlyph* glyph;
+       GLYPH_DATA_V2* glyph_data;
+       rdpCache* cache = context->cache;
+
+       for (i = 0; i < (int) cache_glyph_v2->cGlyphs; i++)
+       {
+               glyph_data = cache_glyph_v2->glyphData[i];
+
+               glyph = Glyph_Alloc(context);
+
+               glyph->x = glyph_data->x;
+               glyph->y = glyph_data->y;
+               glyph->cx = glyph_data->cx;
+               glyph->cy = glyph_data->cy;
+               glyph->aj = glyph_data->aj;
+               glyph->cb = glyph_data->cb;
+               Glyph_New(context, glyph);
+
+               glyph_cache_put(cache->glyph, cache_glyph_v2->cacheId, glyph_data->cacheIndex, glyph);
+
+               cache_glyph_v2->glyphData[i] = NULL;
+               xfree(glyph_data);
+       }
+}
+
+rdpGlyph* glyph_cache_get(rdpGlyphCache* glyph_cache, uint32 id, uint32 index)
+{
+       rdpGlyph* glyph;
+
+       if (id > 9)
+       {
+               printf("invalid glyph cache id: %d\n", id);
+               return NULL;
+       }
+
+       if (index > glyph_cache->glyphCache[id].number)
+       {
+               printf("invalid glyph cache index: %d in cache id: %d\n", index, id);
+               return NULL;
+       }
+
+       glyph = glyph_cache->glyphCache[id].entries[index];
+
+       if (glyph == NULL)
+       {
+               printf("invalid glyph at cache index: %d in cache id: %d\n", index, id);
+       }
+
+       return glyph;
+}
+
+void glyph_cache_put(rdpGlyphCache* glyph_cache, uint32 id, uint32 index, rdpGlyph* glyph)
+{
+       rdpGlyph* prevGlyph;
+
+       if (id > 9)
+       {
+               printf("invalid glyph cache id: %d\n", id);
+               return;
+       }
+
+       if (index > glyph_cache->glyphCache[id].number)
+       {
+               printf("invalid glyph cache index: %d in cache id: %d\n", index, id);
+               return;
+       }
+
+       prevGlyph = glyph_cache->glyphCache[id].entries[index];
+
+       if (prevGlyph != NULL)
+       {
+               Glyph_Free(glyph_cache->context, prevGlyph);
+               xfree(prevGlyph->aj);
+               xfree(prevGlyph);
+       }
+
+       glyph_cache->glyphCache[id].entries[index] = glyph;
+}
+
+void* glyph_cache_fragment_get(rdpGlyphCache* glyph_cache, uint32 index, uint32* size)
+{
+       void* fragment;
+
+       fragment = glyph_cache->fragCache.entries[index].fragment;
+       *size = (uint8) glyph_cache->fragCache.entries[index].size;
+
+       if (fragment == NULL)
+       {
+               printf("invalid glyph fragment at index:%d\n", index);
+       }
+
+       return fragment;
+}
+
+void glyph_cache_fragment_put(rdpGlyphCache* glyph_cache, uint32 index, uint32 size, void* fragment)
+{
+       void* prevFragment;
+
+       prevFragment = glyph_cache->fragCache.entries[index].fragment;
+
+       glyph_cache->fragCache.entries[index].fragment = fragment;
+       glyph_cache->fragCache.entries[index].size = size;
+
+       if (prevFragment != NULL)
+       {
+               xfree(prevFragment);
+       }
+}
+
+void glyph_cache_register_callbacks(rdpUpdate* update)
+{
+       update->primary->GlyphIndex = update_gdi_glyph_index;
+       update->primary->FastIndex = update_gdi_fast_index;
+       update->primary->FastGlyph = update_gdi_fast_glyph;
+       update->secondary->CacheGlyph = update_gdi_cache_glyph;
+       update->secondary->CacheGlyphV2 = update_gdi_cache_glyph_v2;
+}
+
+rdpGlyphCache* glyph_cache_new(rdpSettings* settings)
+{
+       rdpGlyphCache* glyph;
+
+       glyph = (rdpGlyphCache*) xzalloc(sizeof(rdpGlyphCache));
+
+       if (glyph != NULL)
+       {
+               int i;
+
+               glyph->settings = settings;
+               glyph->context = ((freerdp*) settings->instance)->update->context;
+
+               if (settings->glyph_cache)
+                       settings->glyphSupportLevel = GLYPH_SUPPORT_FULL;
+
+               for (i = 0; i < 10; i++)
+               {
+                       glyph->glyphCache[i].number = settings->glyphCache[i].cacheEntries;
+                       glyph->glyphCache[i].maxCellSize = settings->glyphCache[i].cacheMaximumCellSize;
+                       glyph->glyphCache[i].entries = (rdpGlyph**) xzalloc(sizeof(rdpGlyph*) * glyph->glyphCache[i].number);
+               }
+
+               glyph->fragCache.entries = xzalloc(sizeof(FRAGMENT_CACHE_ENTRY) * 256);
+       }
+
+       return glyph;
+}
+
+void glyph_cache_free(rdpGlyphCache* glyph_cache)
+{
+       if (glyph_cache != NULL)
+       {
+               int i;
+               void* fragment;
+
+               for (i = 0; i < 10; i++)
+               {
+                       int j;
+
+                       for (j = 0; j < (int) glyph_cache->glyphCache[i].number; j++)
+                       {
+                               rdpGlyph* glyph;
+
+                               glyph = glyph_cache->glyphCache[i].entries[j];
+
+                               if (glyph != NULL)
+                               {
+                                       Glyph_Free(glyph_cache->context, glyph);
+                                       xfree(glyph->aj);
+                                       xfree(glyph);
+                               }
+                       }
+                       xfree(glyph_cache->glyphCache[i].entries);
+               }
+
+               for (i = 0; i < 255; i++)
+               {
+                       fragment = glyph_cache->fragCache.entries[i].fragment;
+                       xfree(fragment);
+               }
+
+               xfree(glyph_cache->fragCache.entries);
+               xfree(glyph_cache);
+       }
+}
diff --git a/libfreerdp-cache/offscreen.c b/libfreerdp-cache/offscreen.c
new file mode 100644 (file)
index 0000000..c4eb018
--- /dev/null
@@ -0,0 +1,169 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Offscreen Bitmap Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/offscreen.h>
+
+void update_gdi_create_offscreen_bitmap(rdpContext* context, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap)
+{
+       int i;
+       uint16 index;
+       rdpBitmap* bitmap;
+       rdpCache* cache = context->cache;
+
+       bitmap = Bitmap_Alloc(context);
+
+       bitmap->width = create_offscreen_bitmap->cx;
+       bitmap->height = create_offscreen_bitmap->cy;
+
+       bitmap->New(context, bitmap);
+
+       offscreen_cache_delete(cache->offscreen, create_offscreen_bitmap->id);
+       offscreen_cache_put(cache->offscreen, create_offscreen_bitmap->id, bitmap);
+
+       if(cache->offscreen->currentSurface == create_offscreen_bitmap->id)
+               Bitmap_SetSurface(context, bitmap, false);
+
+       for (i = 0; i < (int) create_offscreen_bitmap->deleteList.cIndices; i++)
+       {
+               index = create_offscreen_bitmap->deleteList.indices[i];
+               offscreen_cache_delete(cache->offscreen, index);
+       }
+}
+
+void update_gdi_switch_surface(rdpContext* context, SWITCH_SURFACE_ORDER* switch_surface)
+{
+       rdpCache* cache = context->cache;
+
+       if (switch_surface->bitmapId == SCREEN_BITMAP_SURFACE)
+       {
+               Bitmap_SetSurface(context, NULL, true);
+       }
+       else
+       {
+               rdpBitmap* bitmap;
+               bitmap = offscreen_cache_get(cache->offscreen, switch_surface->bitmapId);
+               Bitmap_SetSurface(context, bitmap, false);
+       }
+
+       cache->offscreen->currentSurface = switch_surface->bitmapId;
+}
+
+rdpBitmap* offscreen_cache_get(rdpOffscreenCache* offscreen_cache, uint32 index)
+{
+       rdpBitmap* bitmap;
+
+       if (index > offscreen_cache->maxEntries)
+       {
+               printf("invalid offscreen bitmap index: 0x%04X\n", index);
+               return NULL;
+       }
+
+       bitmap = offscreen_cache->entries[index];
+
+       if (bitmap == NULL)
+       {
+               printf("invalid offscreen bitmap at index: 0x%04X\n", index);
+               return NULL;
+       }
+
+       return bitmap;
+}
+
+void offscreen_cache_put(rdpOffscreenCache* offscreen, uint32 index, rdpBitmap* bitmap)
+{
+       if (index > offscreen->maxEntries)
+       {
+               printf("invalid offscreen bitmap index: 0x%04X\n", index);
+               return;
+       }
+
+       offscreen_cache_delete(offscreen, index);
+       offscreen->entries[index] = bitmap;
+}
+
+void offscreen_cache_delete(rdpOffscreenCache* offscreen, uint32 index)
+{
+       rdpBitmap* prevBitmap;
+
+       if (index > offscreen->maxEntries)
+       {
+               printf("invalid offscreen bitmap index (delete): 0x%04X\n", index);
+               return;
+       }
+
+       prevBitmap = offscreen->entries[index];
+
+       if (prevBitmap != NULL)
+               Bitmap_Free(offscreen->update->context, prevBitmap);
+
+       offscreen->entries[index] = NULL;
+}
+
+void offscreen_cache_register_callbacks(rdpUpdate* update)
+{
+       update->altsec->CreateOffscreenBitmap = update_gdi_create_offscreen_bitmap;
+       update->altsec->SwitchSurface = update_gdi_switch_surface;
+}
+
+rdpOffscreenCache* offscreen_cache_new(rdpSettings* settings)
+{
+       rdpOffscreenCache* offscreen_cache;
+
+       offscreen_cache = (rdpOffscreenCache*) xzalloc(sizeof(rdpOffscreenCache));
+
+       if (offscreen_cache != NULL)
+       {
+               offscreen_cache->settings = settings;
+               offscreen_cache->update = ((freerdp*) settings->instance)->update;
+
+               offscreen_cache->currentSurface = SCREEN_BITMAP_SURFACE;
+               offscreen_cache->maxSize = 7680;
+               offscreen_cache->maxEntries = 100;
+
+               settings->offscreen_bitmap_cache_size = offscreen_cache->maxSize;
+               settings->offscreen_bitmap_cache_entries = offscreen_cache->maxEntries;
+
+               offscreen_cache->entries = (rdpBitmap**) xzalloc(sizeof(rdpBitmap*) * offscreen_cache->maxEntries);
+       }
+
+       return offscreen_cache;
+}
+
+void offscreen_cache_free(rdpOffscreenCache* offscreen_cache)
+{
+       int i;
+       rdpBitmap* bitmap;
+
+       if (offscreen_cache != NULL)
+       {
+               for (i = 0; i < (int) offscreen_cache->maxEntries; i++)
+               {
+                       bitmap = offscreen_cache->entries[i];
+
+                       if (bitmap != NULL)
+                               Bitmap_Free(offscreen_cache->update->context, bitmap);
+               }
+
+               xfree(offscreen_cache->entries);
+               xfree(offscreen_cache);
+       }
+}
diff --git a/libfreerdp-cache/palette.c b/libfreerdp-cache/palette.c
new file mode 100644 (file)
index 0000000..8998f78
--- /dev/null
@@ -0,0 +1,92 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Palette (Color Table) Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/palette.h>
+
+void update_gdi_cache_color_table(rdpContext* context, CACHE_COLOR_TABLE_ORDER* cache_color_table)
+{
+       rdpCache* cache = context->cache;
+       palette_cache_put(cache->palette, cache_color_table->cacheIndex, (void*) cache_color_table->colorTable);
+}
+
+void* palette_cache_get(rdpPaletteCache* palette_cache, uint32 index)
+{
+       void* entry;
+
+       if (index > palette_cache->maxEntries)
+       {
+               printf("invalid color table index: 0x%04X\n", index);
+               return NULL;
+       }
+
+       entry = palette_cache->entries[index].entry;
+
+       if (entry == NULL)
+       {
+               printf("invalid color table at index: 0x%04X\n", index);
+               return NULL;
+       }
+
+       return entry;
+}
+
+void palette_cache_put(rdpPaletteCache* palette_cache, uint32 index, void* entry)
+{
+       if (index > palette_cache->maxEntries)
+       {
+               printf("invalid color table index: 0x%04X\n", index);
+               return;
+       }
+
+       palette_cache->entries[index].entry = entry;
+}
+
+void palette_cache_register_callbacks(rdpUpdate* update)
+{
+       update->secondary->CacheColorTable = update_gdi_cache_color_table;
+}
+
+rdpPaletteCache* palette_cache_new(rdpSettings* settings)
+{
+       rdpPaletteCache* palette_cache;
+
+       palette_cache = (rdpPaletteCache*) xzalloc(sizeof(rdpPaletteCache));
+
+       if (palette_cache != NULL)
+       {
+               palette_cache->settings = settings;
+               palette_cache->maxEntries = 6;
+               palette_cache->entries = (PALETTE_TABLE_ENTRY*) xzalloc(sizeof(PALETTE_TABLE_ENTRY) * palette_cache->maxEntries);
+       }
+
+       return palette_cache;
+}
+
+void palette_cache_free(rdpPaletteCache* palette_cache)
+{
+       if (palette_cache != NULL)
+       {
+               xfree(palette_cache->entries);
+               xfree(palette_cache);
+       }
+}
+
diff --git a/libfreerdp-cache/pointer.c b/libfreerdp-cache/pointer.c
new file mode 100644 (file)
index 0000000..86d2f30
--- /dev/null
@@ -0,0 +1,155 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Glyph Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/cache/pointer.h>
+
+void update_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* pointer_position)
+{
+
+}
+
+void update_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system)
+{
+
+}
+
+void update_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color)
+{
+
+}
+
+void update_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new)
+{
+       rdpPointer* pointer;
+       rdpCache* cache = context->cache;
+
+       pointer = Pointer_Alloc(context);
+
+       if (pointer != NULL)
+       {
+               pointer->xorBpp = pointer_new->xorBpp;
+               pointer->xPos = pointer_new->colorPtrAttr.xPos;
+               pointer->yPos = pointer_new->colorPtrAttr.yPos;
+               pointer->width = pointer_new->colorPtrAttr.width;
+               pointer->height = pointer_new->colorPtrAttr.height;
+               pointer->lengthAndMask = pointer_new->colorPtrAttr.lengthAndMask;
+               pointer->lengthXorMask = pointer_new->colorPtrAttr.lengthXorMask;
+               pointer->xorMaskData = pointer_new->colorPtrAttr.xorMaskData;
+               pointer->andMaskData = pointer_new->colorPtrAttr.andMaskData;
+
+               pointer->New(context, pointer);
+               pointer_cache_put(cache->pointer, pointer_new->colorPtrAttr.cacheIndex, pointer);
+               Pointer_Set(context, pointer);
+       }
+}
+
+void update_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached)
+{
+       rdpPointer* pointer;
+       rdpCache* cache = context->cache;
+
+       pointer = pointer_cache_get(cache->pointer, pointer_cached->cacheIndex);
+
+       if (pointer != NULL)
+               Pointer_Set(context, pointer);
+}
+
+rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache, uint32 index)
+{
+       rdpPointer* pointer;
+
+       if (index >= pointer_cache->cacheSize)
+       {
+               printf("invalid pointer index:%d\n", index);
+               return NULL;
+       }
+
+       pointer = pointer_cache->entries[index];
+
+       return pointer;
+}
+
+void pointer_cache_put(rdpPointerCache* pointer_cache, uint32 index, rdpPointer* pointer)
+{
+       rdpPointer* prevPointer;
+
+       if (index >= pointer_cache->cacheSize)
+       {
+               printf("invalid pointer index:%d\n", index);
+               return;
+       }
+
+       prevPointer = pointer_cache->entries[index];
+
+       if (prevPointer != NULL)
+               Pointer_Free(pointer_cache->update->context, prevPointer);
+
+       pointer_cache->entries[index] = pointer;
+}
+
+void pointer_cache_register_callbacks(rdpUpdate* update)
+{
+       rdpPointerUpdate* pointer = update->pointer;
+
+       pointer->PointerPosition = update_pointer_position;
+       pointer->PointerSystem = update_pointer_system;
+       pointer->PointerColor = update_pointer_color;
+       pointer->PointerNew = update_pointer_new;
+       pointer->PointerCached = update_pointer_cached;
+}
+
+rdpPointerCache* pointer_cache_new(rdpSettings* settings)
+{
+       rdpPointerCache* pointer_cache;
+
+       pointer_cache = (rdpPointerCache*) xzalloc(sizeof(rdpPointerCache));
+
+       if (pointer_cache != NULL)
+       {
+               pointer_cache->settings = settings;
+               pointer_cache->cacheSize = settings->pointer_cache_size;
+               pointer_cache->update = ((freerdp*) settings->instance)->update;
+               pointer_cache->entries = (rdpPointer**) xzalloc(sizeof(rdpPointer*) * pointer_cache->cacheSize);
+       }
+
+       return pointer_cache;
+}
+
+void pointer_cache_free(rdpPointerCache* pointer_cache)
+{
+       if (pointer_cache != NULL)
+       {
+               int i;
+               rdpPointer* pointer;
+
+               for (i = 0; i < (int) pointer_cache->cacheSize; i++)
+               {
+                       pointer = pointer_cache->entries[i];
+
+                       if (pointer != NULL)
+                               Pointer_Free(pointer_cache->update->context, pointer);
+               }
+
+               xfree(pointer_cache->entries);
+               xfree(pointer_cache);
+       }
+}
diff --git a/libfreerdp-channels/CMakeLists.txt b/libfreerdp-channels/CMakeLists.txt
new file mode 100644 (file)
index 0000000..55a139a
--- /dev/null
@@ -0,0 +1,32 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-chanman cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(FREERDP_CHANNELS_SRCS
+       libchannels.c
+       libchannels.h
+       wtsvc.c
+       wtsvc.h)
+
+add_library(freerdp-channels ${FREERDP_CHANNELS_SRCS})
+
+set_target_properties(freerdp-channels PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+target_link_libraries(freerdp-channels freerdp-utils)
+
+install(TARGETS freerdp-channels DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
diff --git a/libfreerdp-channels/libchannels.c b/libfreerdp-channels/libchannels.c
new file mode 100644 (file)
index 0000000..cb0a06b
--- /dev/null
@@ -0,0 +1,988 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Virtual Channel Manager
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * MS compatible plugin interface
+ * reference:
+ * http://msdn.microsoft.com/en-us/library/aa383580.aspx
+ *
+ * Notes on threads:
+ * Many virtual channel plugins are built using threads.
+ * Non main threads may call MyVirtualChannelOpen,
+ * MyVirtualChannelClose, or MyVirtualChannelWrite.
+ * Since the plugin's VirtualChannelEntry function is called
+ * from the main thread, MyVirtualChannelInit has to be called
+ * from the main thread.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/channels/channels.h>
+#include <freerdp/svc.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/semaphore.h>
+#include <freerdp/utils/mutex.h>
+#include <freerdp/utils/wait_obj.h>
+#include <freerdp/utils/load_plugin.h>
+#include <freerdp/utils/event.h>
+
+#include "libchannels.h"
+
+#define CHANNEL_MAX_COUNT 30
+
+struct lib_data
+{
+       PVIRTUALCHANNELENTRY entry; /* the one and only exported function */
+       PCHANNEL_INIT_EVENT_FN init_event_proc;
+       void* init_handle;
+};
+
+struct channel_data
+{
+       char name[CHANNEL_NAME_LEN + 1];
+       int open_handle;
+       int options;
+       int flags; /* 0 nothing 1 init 2 open */
+       PCHANNEL_OPEN_EVENT_FN open_event_proc;
+};
+
+struct sync_data
+{
+       void* data;
+       uint32 data_length;
+       void* user_data;
+       int index;
+};
+
+typedef struct rdp_init_handle rdpInitHandle;
+struct rdp_init_handle
+{
+       rdpChannels* channels;
+};
+
+struct rdp_channels
+{
+       /**
+        * Only the main thread alters these arrays, before any
+        * library thread is allowed in(post_connect is called)
+        * so no need to use mutex locking
+        * After post_connect, each library thread can only access it's
+        * own array items
+        * ie, no two threads can access index 0, ...
+        */
+
+       struct lib_data libs_data[CHANNEL_MAX_COUNT];
+       int num_libs_data;
+
+       struct channel_data channels_data[CHANNEL_MAX_COUNT];
+       int num_channels_data;
+
+       rdpInitHandle init_handles[CHANNEL_MAX_COUNT];
+       int num_init_handles;
+
+       /* control for entry into MyVirtualChannelInit */
+       int can_call_init;
+       rdpSettings* settings;
+
+       /* true once freerdp_chanman_post_connect is called */
+       int is_connected;
+
+       /* used for locating the channels for a given instance */
+       freerdp* instance;
+
+       /* signal for incoming data or event */
+       struct wait_obj* signal;
+
+       /* used for sync write */
+       freerdp_mutex sync_data_mutex;
+       LIST* sync_data_list;
+
+       /* used for sync event */
+       freerdp_sem event_sem;
+       RDP_EVENT* event;
+};
+
+/**
+ * The current channel manager reference passes from VirtualChannelEntry to
+ * VirtualChannelInit for the pInitHandle.
+ */
+static rdpChannels* g_init_channels;
+
+/* The list of all channel managers. */
+typedef struct rdp_channels_list rdpChannelsList;
+struct rdp_channels_list
+{
+       rdpChannels* channels;
+       rdpChannelsList* next;
+};
+
+static rdpChannelsList* g_channels_list;
+
+/* To generate unique sequence for all open handles */
+static int g_open_handle_sequence;
+
+/* For locking the global resources */
+static freerdp_mutex g_mutex_init;
+static freerdp_mutex g_mutex_list;
+
+/* returns the channels for the open handle passed in */
+static rdpChannels* freerdp_channels_find_by_open_handle(int open_handle, int* pindex)
+{
+       int lindex;
+       rdpChannels* channels;
+       rdpChannelsList* channels_list;
+
+       freerdp_mutex_lock(g_mutex_list);
+
+       for (channels_list = g_channels_list; channels_list; channels_list = channels_list->next)
+       {
+               channels = channels_list->channels;
+
+               for (lindex = 0; lindex < channels->num_channels_data; lindex++)
+               {
+                       if (channels->channels_data[lindex].open_handle == open_handle)
+                       {
+                               freerdp_mutex_unlock(g_mutex_list);
+                               *pindex = lindex;
+                               return channels;
+                       }
+               }
+       }
+
+       freerdp_mutex_unlock(g_mutex_list);
+
+       return NULL;
+}
+
+/* returns the channels for the rdp instance passed in */
+static rdpChannels* freerdp_channels_find_by_instance(freerdp* instance)
+{
+       rdpChannels* channels;
+       rdpChannelsList* channels_list;
+
+       freerdp_mutex_lock(g_mutex_list);
+
+       for (channels_list = g_channels_list; channels_list; channels_list = channels_list->next)
+       {
+               channels = channels_list->channels;
+               if (channels->instance == instance)
+               {
+                       freerdp_mutex_unlock(g_mutex_list);
+                       return channels;
+               }
+       }
+
+       freerdp_mutex_unlock(g_mutex_list);
+
+       return NULL;
+}
+
+/* returns struct channel_data for the channel name passed in */
+static struct channel_data* freerdp_channels_find_channel_data_by_name(rdpChannels* channels, const char* channel_name, int* pindex)
+{
+       int lindex;
+       struct channel_data* lchannel_data;
+
+       for (lindex = 0; lindex < channels->num_channels_data; lindex++)
+       {
+               lchannel_data = channels->channels_data + lindex;
+
+               if (strcmp(channel_name, lchannel_data->name) == 0)
+               {
+                       if (pindex != 0)
+                               *pindex = lindex;
+
+                       return lchannel_data;
+               }
+       }
+
+       return NULL;
+}
+
+/* returns rdpChannel for the channel id passed in */
+static rdpChannel* freerdp_channels_find_channel_by_id(rdpChannels* channels, rdpSettings* settings, int channel_id, int* pindex)
+{
+       int lindex;
+       int lcount;
+       rdpChannel* lrdp_channel;
+
+       lcount = settings->num_channels;
+
+       for (lindex = 0; lindex < lcount; lindex++)
+       {
+               lrdp_channel = settings->channels + lindex;
+
+               if (lrdp_channel->channel_id == channel_id)
+               {
+                       if (pindex != 0)
+                               *pindex = lindex;
+
+                       return lrdp_channel;
+               }
+       }
+
+       return NULL;
+}
+
+/* returns rdpChannel for the channel name passed in */
+static rdpChannel* freerdp_channels_find_channel_by_name(rdpChannels* channels,
+               rdpSettings* settings, const char* channel_name, int* pindex)
+{
+       int lindex;
+       int lcount;
+       rdpChannel* lrdp_channel;
+
+       lcount = settings->num_channels;
+
+       for (lindex = 0; lindex < lcount; lindex++)
+       {
+               lrdp_channel = settings->channels + lindex;
+
+               if (strcmp(channel_name, lrdp_channel->name) == 0)
+               {
+                       if (pindex != 0)
+                               *pindex = lindex;
+
+                       return lrdp_channel;
+               }
+       }
+
+       return NULL;
+}
+
+/**
+ * must be called by same thread that calls freerdp_chanman_load_plugin
+ * according to MS docs
+ * only called from main thread
+ */
+static uint32 FREERDP_CC MyVirtualChannelInit(void** ppInitHandle, PCHANNEL_DEF pChannel,
+       int channelCount, uint32 versionRequested, PCHANNEL_INIT_EVENT_FN pChannelInitEventProc)
+{
+       int index;
+       rdpChannels* channels;
+       struct lib_data* llib;
+       rdpChannel* lrdp_channel;
+       PCHANNEL_DEF lchannel_def;
+       struct channel_data* lchannel_data;
+
+       channels = g_init_channels;
+       channels->init_handles[channels->num_init_handles].channels = channels;
+       *ppInitHandle = &channels->init_handles[channels->num_init_handles];
+       channels->num_init_handles++;
+
+       DEBUG_CHANNELS("enter");
+
+       if (!channels->can_call_init)
+       {
+               DEBUG_CHANNELS("error not in entry");
+               return CHANNEL_RC_NOT_IN_VIRTUALCHANNELENTRY;
+       }
+
+       if (ppInitHandle == 0)
+       {
+               DEBUG_CHANNELS("error bad pphan");
+               return CHANNEL_RC_BAD_INIT_HANDLE;
+       }
+
+       if (channels->num_channels_data + channelCount >= CHANNEL_MAX_COUNT)
+       {
+               DEBUG_CHANNELS("error too many channels");
+               return CHANNEL_RC_TOO_MANY_CHANNELS;
+       }
+
+       if (pChannel == 0)
+       {
+               DEBUG_CHANNELS("error bad pchan");
+               return CHANNEL_RC_BAD_CHANNEL;
+       }
+
+       if (channels->is_connected)
+       {
+               DEBUG_CHANNELS("error already connected");
+               return CHANNEL_RC_ALREADY_CONNECTED;
+       }
+
+       if (versionRequested != VIRTUAL_CHANNEL_VERSION_WIN2000)
+       {
+               DEBUG_CHANNELS("warning version");
+       }
+
+       for (index = 0; index < channelCount; index++)
+       {
+               lchannel_def = pChannel + index;
+               if (freerdp_channels_find_channel_data_by_name(channels, lchannel_def->name, 0) != 0)
+               {
+                       DEBUG_CHANNELS("error channel already used");
+                       return CHANNEL_RC_BAD_CHANNEL;
+               }
+       }
+
+       llib = channels->libs_data + channels->num_libs_data;
+       llib->init_event_proc = pChannelInitEventProc;
+       llib->init_handle = *ppInitHandle;
+       channels->num_libs_data++;
+
+       for (index = 0; index < channelCount; index++)
+       {
+               lchannel_def = pChannel + index;
+               lchannel_data = channels->channels_data + channels->num_channels_data;
+
+               freerdp_mutex_lock(g_mutex_list);
+               lchannel_data->open_handle = g_open_handle_sequence++;
+               freerdp_mutex_unlock(g_mutex_list);
+
+               lchannel_data->flags = 1; /* init */
+               strncpy(lchannel_data->name, lchannel_def->name, CHANNEL_NAME_LEN);
+               lchannel_data->options = lchannel_def->options;
+
+               if (channels->settings->num_channels < 16)
+               {
+                       lrdp_channel = channels->settings->channels + channels->settings->num_channels;
+                       strncpy(lrdp_channel->name, lchannel_def->name, 7);
+                       lrdp_channel->options = lchannel_def->options;
+                       channels->settings->num_channels++;
+               }
+               else
+               {
+                       DEBUG_CHANNELS("warning more than 16 channels");
+               }
+
+               channels->num_channels_data++;
+       }
+
+       return CHANNEL_RC_OK;
+}
+
+/**
+ * can be called from any thread
+ * thread safe because no 2 threads can have the same channel name registered
+ */
+static uint32 FREERDP_CC MyVirtualChannelOpen(void* pInitHandle, uint32* pOpenHandle,
+       char* pChannelName, PCHANNEL_OPEN_EVENT_FN pChannelOpenEventProc)
+{
+       int index;
+       rdpChannels* channels;
+       struct channel_data* lchannel_data;
+
+       DEBUG_CHANNELS("enter");
+
+       channels = ((rdpInitHandle*) pInitHandle)->channels;
+
+       if (pOpenHandle == 0)
+       {
+               DEBUG_CHANNELS("error bad chanhan");
+               return CHANNEL_RC_BAD_CHANNEL_HANDLE;
+       }
+
+       if (pChannelOpenEventProc == 0)
+       {
+               DEBUG_CHANNELS("error bad proc");
+               return CHANNEL_RC_BAD_PROC;
+       }
+
+       if (!channels->is_connected)
+       {
+               DEBUG_CHANNELS("error not connected");
+               return CHANNEL_RC_NOT_CONNECTED;
+       }
+
+       lchannel_data = freerdp_channels_find_channel_data_by_name(channels, pChannelName, &index);
+
+       if (lchannel_data == 0)
+       {
+               DEBUG_CHANNELS("error chan name");
+               return CHANNEL_RC_UNKNOWN_CHANNEL_NAME;
+       }
+
+       if (lchannel_data->flags == 2)
+       {
+               DEBUG_CHANNELS("error chan already open");
+               return CHANNEL_RC_ALREADY_OPEN;
+       }
+
+       lchannel_data->flags = 2; /* open */
+       lchannel_data->open_event_proc = pChannelOpenEventProc;
+       *pOpenHandle = lchannel_data->open_handle;
+
+       return CHANNEL_RC_OK;
+}
+
+/**
+ * can be called from any thread
+ * thread safe because no 2 threads can have the same openHandle
+ */
+static uint32 FREERDP_CC MyVirtualChannelClose(uint32 openHandle)
+{
+       int index;
+       rdpChannels* channels;
+       struct channel_data* lchannel_data;
+
+       DEBUG_CHANNELS("enter");
+
+       channels = freerdp_channels_find_by_open_handle(openHandle, &index);
+
+       if ((channels == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT))
+       {
+               DEBUG_CHANNELS("error bad channels");
+               return CHANNEL_RC_BAD_CHANNEL_HANDLE;
+       }
+
+       lchannel_data = channels->channels_data + index;
+
+       if (lchannel_data->flags != 2)
+       {
+               DEBUG_CHANNELS("error not open");
+               return CHANNEL_RC_NOT_OPEN;
+       }
+
+       lchannel_data->flags = 0;
+
+       return CHANNEL_RC_OK;
+}
+
+/* can be called from any thread */
+static uint32 FREERDP_CC MyVirtualChannelWrite(uint32 openHandle, void* pData, uint32 dataLength, void* pUserData)
+{
+       int index;
+       rdpChannels* channels;
+       struct sync_data* item;
+       struct channel_data* lchannel_data;
+
+       channels = freerdp_channels_find_by_open_handle(openHandle, &index);
+
+       if ((channels == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT))
+       {
+               DEBUG_CHANNELS("error bad chanhan");
+               return CHANNEL_RC_BAD_CHANNEL_HANDLE;
+       }
+
+       if (!channels->is_connected)
+       {
+               DEBUG_CHANNELS("error not connected");
+               return CHANNEL_RC_NOT_CONNECTED;
+       }
+
+       if (pData == 0)
+       {
+               DEBUG_CHANNELS("error bad pData");
+               return CHANNEL_RC_NULL_DATA;
+       }
+
+       if (dataLength == 0)
+       {
+               DEBUG_CHANNELS("error bad dataLength");
+               return CHANNEL_RC_ZERO_LENGTH;
+       }
+
+       lchannel_data = channels->channels_data + index;
+
+       if (lchannel_data->flags != 2)
+       {
+               DEBUG_CHANNELS("error not open");
+               return CHANNEL_RC_NOT_OPEN;
+       }
+
+       freerdp_mutex_lock(channels->sync_data_mutex); /* lock channels->sync* vars */
+
+       if (!channels->is_connected)
+       {
+               freerdp_mutex_unlock(channels->sync_data_mutex);
+               DEBUG_CHANNELS("error not connected");
+               return CHANNEL_RC_NOT_CONNECTED;
+       }
+
+       item = xnew(struct sync_data);
+       item->data = pData;
+       item->data_length = dataLength;
+       item->user_data = pUserData;
+       item->index = index;
+       list_enqueue(channels->sync_data_list, item);
+       freerdp_mutex_unlock(channels->sync_data_mutex);
+
+       /* set the event */
+       wait_obj_set(channels->signal);
+
+       return CHANNEL_RC_OK;
+}
+
+static uint32 FREERDP_CC MyVirtualChannelEventPush(uint32 openHandle, RDP_EVENT* event)
+{
+       int index;
+       rdpChannels* channels;
+       struct channel_data* lchannel_data;
+
+       channels = freerdp_channels_find_by_open_handle(openHandle, &index);
+
+       if ((channels == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT))
+       {
+               DEBUG_CHANNELS("error bad chanhan");
+               return CHANNEL_RC_BAD_CHANNEL_HANDLE;
+       }
+
+       if (!channels->is_connected)
+       {
+               DEBUG_CHANNELS("error not connected");
+               return CHANNEL_RC_NOT_CONNECTED;
+       }
+
+       if (event == NULL)
+       {
+               DEBUG_CHANNELS("error bad event");
+               return CHANNEL_RC_NULL_DATA;
+       }
+
+       lchannel_data = channels->channels_data + index;
+
+       if (lchannel_data->flags != 2)
+       {
+               DEBUG_CHANNELS("error not open");
+               return CHANNEL_RC_NOT_OPEN;
+       }
+
+       freerdp_sem_wait(channels->event_sem); /* lock channels->event */
+
+       if (!channels->is_connected)
+       {
+               freerdp_sem_signal(channels->event_sem);
+               DEBUG_CHANNELS("error not connected");
+               return CHANNEL_RC_NOT_CONNECTED;
+       }
+
+       channels->event = event;
+       /* set the event */
+       wait_obj_set(channels->signal);
+
+       return CHANNEL_RC_OK;
+}
+
+/**
+ * this is called shortly after the application starts and
+ * before any other function in the file
+ * called only from main thread
+ */
+int freerdp_channels_global_init(void)
+{
+       g_init_channels = NULL;
+       g_channels_list = NULL;
+       g_open_handle_sequence = 1;
+       g_mutex_init = freerdp_mutex_new();
+       g_mutex_list = freerdp_mutex_new();
+
+       return 0;
+}
+
+int freerdp_channels_global_uninit(void)
+{
+       while (g_channels_list)
+               freerdp_channels_free(g_channels_list->channels);
+
+       freerdp_mutex_free(g_mutex_init);
+       freerdp_mutex_free(g_mutex_list);
+
+       return 0;
+}
+
+rdpChannels* freerdp_channels_new(void)
+{
+       rdpChannels* channels;
+       rdpChannelsList* channels_list;
+
+       channels = xnew(rdpChannels);
+
+       channels->sync_data_mutex = freerdp_mutex_new();
+       channels->sync_data_list = list_new();
+
+       channels->event_sem = freerdp_sem_new(1);
+       channels->signal = wait_obj_new();
+
+       /* Add it to the global list */
+       channels_list = xnew(rdpChannelsList);
+       channels_list->channels = channels;
+
+       freerdp_mutex_lock(g_mutex_list);
+       channels_list->next = g_channels_list;
+       g_channels_list = channels_list;
+       freerdp_mutex_unlock(g_mutex_list);
+
+       return channels;
+}
+
+void freerdp_channels_free(rdpChannels* channels)
+{
+       rdpChannelsList* list;
+       rdpChannelsList* prev;
+
+       freerdp_mutex_free(channels->sync_data_mutex);
+       list_free(channels->sync_data_list);
+
+       freerdp_sem_free(channels->event_sem);
+       wait_obj_free(channels->signal);
+
+       /* Remove from global list */
+
+       freerdp_mutex_lock(g_mutex_list);
+
+       for (prev = NULL, list = g_channels_list; list; prev = list, list = list->next)
+       {
+               if (list->channels == channels)
+                       break;
+       }
+
+       if (list)
+       {
+               if (prev)
+                       prev->next = list->next;
+               else
+                       g_channels_list = list->next;
+               xfree(list);
+       }
+
+       freerdp_mutex_unlock(g_mutex_list);
+
+       xfree(channels);
+}
+
+/**
+ * this is called when processing the command line parameters
+ * called only from main thread
+ */
+int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings, const char* name, void* data)
+{
+       int ok;
+       struct lib_data* lib;
+       CHANNEL_ENTRY_POINTS_EX ep;
+
+       DEBUG_CHANNELS("%s", name);
+
+       if (channels->num_libs_data + 1 >= CHANNEL_MAX_COUNT)
+       {
+               DEBUG_CHANNELS("too many channels");
+               return 1;
+       }
+
+       lib = channels->libs_data + channels->num_libs_data;
+       lib->entry = (PVIRTUALCHANNELENTRY) freerdp_load_plugin(name, CHANNEL_EXPORT_FUNC_NAME);
+       //lib->entry = (PVIRTUALCHANNELENTRY) freerdp_load_channel_plugin(settings, name, CHANNEL_EXPORT_FUNC_NAME);
+
+       if (lib->entry == NULL)
+       {
+               DEBUG_CHANNELS("failed to find export function");
+               return 1;
+       }
+
+       ep.cbSize = sizeof(ep);
+       ep.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000;
+       ep.pVirtualChannelInit = MyVirtualChannelInit;
+       ep.pVirtualChannelOpen = MyVirtualChannelOpen;
+       ep.pVirtualChannelClose = MyVirtualChannelClose;
+       ep.pVirtualChannelWrite = MyVirtualChannelWrite;
+       ep.pExtendedData = data;
+       ep.pVirtualChannelEventPush = MyVirtualChannelEventPush;
+
+       /* enable MyVirtualChannelInit */
+       channels->can_call_init = 1;
+       channels->settings = settings;
+
+       freerdp_mutex_lock(g_mutex_init);
+
+       g_init_channels = channels;
+       ok = lib->entry((PCHANNEL_ENTRY_POINTS) &ep);
+       g_init_channels = NULL;
+
+       freerdp_mutex_unlock(g_mutex_init);
+
+       /* disable MyVirtualChannelInit */
+       channels->settings = 0;
+       channels->can_call_init = 0;
+
+       if (!ok)
+       {
+               DEBUG_CHANNELS("export function call failed");
+               return 1;
+       }
+
+       return 0;
+}
+
+/**
+ * go through and inform all the libraries that we are initialized
+ * called only from main thread
+ */
+int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance)
+{
+       int index;
+       void* dummy;
+       struct lib_data* llib;
+       CHANNEL_DEF lchannel_def;
+
+       DEBUG_CHANNELS("enter");
+       channels->instance = instance;
+
+       /**
+         * If rdpsnd is registered but not rdpdr, it's necessary to register a fake
+        * rdpdr channel to make sound work. This is a workaround for Window 7 and
+        * Windows 2008
+        */
+       if (freerdp_channels_find_channel_data_by_name(channels, "rdpsnd", 0) != 0 &&
+               freerdp_channels_find_channel_data_by_name(channels, "rdpdr", 0) == 0)
+       {
+               lchannel_def.options = CHANNEL_OPTION_INITIALIZED |
+                       CHANNEL_OPTION_ENCRYPT_RDP;
+               strcpy(lchannel_def.name, "rdpdr");
+               channels->can_call_init = 1;
+               channels->settings = instance->settings;
+               freerdp_mutex_lock(g_mutex_init);
+               g_init_channels = channels;
+               MyVirtualChannelInit(&dummy, &lchannel_def, 1,
+                       VIRTUAL_CHANNEL_VERSION_WIN2000, 0);
+               g_init_channels = NULL;
+               freerdp_mutex_unlock(g_mutex_init);
+               channels->can_call_init = 0;
+               channels->settings = 0;
+               DEBUG_CHANNELS("registered fake rdpdr for rdpsnd.");
+       }
+
+       for (index = 0; index < channels->num_libs_data; index++)
+       {
+               llib = channels->libs_data + index;
+
+               if (llib->init_event_proc != 0)
+                       llib->init_event_proc(llib->init_handle, CHANNEL_EVENT_INITIALIZED, 0, 0);
+       }
+
+       return 0;
+}
+
+/**
+ * go through and inform all the libraries that we are connected
+ * this will tell the libraries that its ok to call MyVirtualChannelOpen
+ * called only from main thread
+ */
+int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
+{
+       int index;
+       char* hostname;
+       int hostname_len;
+       struct lib_data* llib;
+
+       channels->is_connected = 1;
+       hostname = instance->settings->hostname;
+       hostname_len = strlen(hostname);
+
+       DEBUG_CHANNELS("hostname [%s] channels->num_libs [%d]", hostname, channels->num_libs_data);
+
+       for (index = 0; index < channels->num_libs_data; index++)
+       {
+               llib = channels->libs_data + index;
+
+               if (llib->init_event_proc != 0)
+                       llib->init_event_proc(llib->init_handle, CHANNEL_EVENT_CONNECTED, hostname, hostname_len);
+       }
+
+       return 0;
+}
+
+/**
+ * data comming from the server to the client
+ * called only from main thread
+ */
+int freerdp_channels_data(freerdp* instance, int channel_id, void* data, int data_size, int flags, int total_size)
+{
+       int index;
+       rdpChannels* channels;
+       rdpChannel* lrdp_channel;
+       struct channel_data* lchannel_data;
+
+       channels = freerdp_channels_find_by_instance(instance);
+
+       if (channels == 0)
+       {
+               DEBUG_CHANNELS("could not find channel manager");
+               return 1;
+       }
+
+       lrdp_channel = freerdp_channels_find_channel_by_id(channels, instance->settings,
+               channel_id, &index);
+       if (lrdp_channel == 0)
+       {
+               DEBUG_CHANNELS("could not find channel id");
+               return 1;
+       }
+
+       lchannel_data = freerdp_channels_find_channel_data_by_name(channels, lrdp_channel->name, &index);
+
+       if (lchannel_data == 0)
+       {
+               DEBUG_CHANNELS("could not find channel name");
+               return 1;
+       }
+
+       if (lchannel_data->open_event_proc != 0)
+       {
+               lchannel_data->open_event_proc(lchannel_data->open_handle,
+                       CHANNEL_EVENT_DATA_RECEIVED, data, data_size, total_size, flags);
+       }
+
+       return 0;
+}
+
+static const char* event_class_to_name_table[] =
+{
+       "rdpdbg",   /* RDP_EVENT_CLASS_DEBUG */
+       "cliprdr",  /* RDP_EVENT_CLASS_CLIPRDR */
+       "tsmf",     /* RDP_EVENT_CLASS_TSMF */
+       "rail",     /* RDP_EVENT_CLASS_RAIL */
+       NULL
+};
+
+/**
+ * Send a plugin-defined event to the plugin.
+ * called only from main thread
+ * @param channels the channel manager instance
+ * @param event an event object created by freerdp_event_new()
+ */
+FREERDP_API int freerdp_channels_send_event(rdpChannels* channels, RDP_EVENT* event)
+{
+       int index;
+       const char* name;
+       struct channel_data* lchannel_data;
+
+       name = event_class_to_name_table[event->event_class];
+
+       if (name == NULL)
+       {
+               DEBUG_CHANNELS("unknown event_class %d", event->event_class);
+               freerdp_event_free(event);
+               return 1;
+       }
+
+       lchannel_data = freerdp_channels_find_channel_data_by_name(channels, name, &index);
+
+       if (lchannel_data == NULL)
+       {
+               DEBUG_CHANNELS("could not find channel name %s", name);
+               freerdp_event_free(event);
+               return 1;
+       }
+
+       if (lchannel_data->open_event_proc != NULL)
+       {
+               lchannel_data->open_event_proc(lchannel_data->open_handle,
+                       CHANNEL_EVENT_USER,
+                       event, sizeof(RDP_EVENT), sizeof(RDP_EVENT), 0);
+       }
+
+       return 0;
+}
+
+/**
+ * called only from main thread
+ */
+static void freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance)
+{
+       struct sync_data* item;
+       rdpChannel* lrdp_channel;
+       struct channel_data* lchannel_data;
+
+       while (channels->sync_data_list->head != NULL)
+       {
+               freerdp_mutex_lock(channels->sync_data_mutex);
+               item = (struct sync_data*)list_dequeue(channels->sync_data_list);
+               freerdp_mutex_unlock(channels->sync_data_mutex);
+
+               lchannel_data = channels->channels_data + item->index;
+               lrdp_channel = freerdp_channels_find_channel_by_name(channels, instance->settings,
+                       lchannel_data->name, &item->index);
+
+               if (lrdp_channel != NULL)
+                       instance->SendChannelData(instance, lrdp_channel->channel_id, item->data, item->data_length);
+
+               if (lchannel_data->open_event_proc != 0)
+               {
+                       lchannel_data->open_event_proc(lchannel_data->open_handle,
+                               CHANNEL_EVENT_WRITE_COMPLETE,
+                               item->user_data, sizeof(void *), sizeof(void *), 0);
+               }
+               xfree(item);
+       }
+}
+
+/**
+ * called only from main thread
+ */
+boolean freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds,
+       int* read_count, void** write_fds, int* write_count)
+{
+       wait_obj_get_fds(channels->signal, read_fds, read_count);
+       return true;
+}
+
+/**
+ * called only from main thread
+ */
+boolean freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance)
+{
+       if (wait_obj_is_set(channels->signal))
+       {
+               wait_obj_clear(channels->signal);
+               freerdp_channels_process_sync(channels, instance);
+       }
+
+       return true;
+}
+
+RDP_EVENT* freerdp_channels_pop_event(rdpChannels* channels)
+{
+       RDP_EVENT* event;
+
+       if (channels->event == NULL)
+               return NULL;
+
+       event = channels->event;
+       channels->event = NULL;
+
+       freerdp_sem_signal(channels->event_sem); /* release channels->event */
+
+       return event;
+}
+
+void freerdp_channels_close(rdpChannels* channels, freerdp* instance)
+{
+       int index;
+       struct lib_data* llib;
+
+       DEBUG_CHANNELS("closing");
+       channels->is_connected = 0;
+       freerdp_channels_check_fds(channels, instance);
+
+       /* tell all libraries we are shutting down */
+       for (index = 0; index < channels->num_libs_data; index++)
+       {
+               llib = channels->libs_data + index;
+
+               if (llib->init_event_proc != 0)
+                       llib->init_event_proc(llib->init_handle, CHANNEL_EVENT_TERMINATED, 0, 0);
+       }
+}
diff --git a/libfreerdp-channels/libchannels.h b/libfreerdp-channels/libchannels.h
new file mode 100644 (file)
index 0000000..27058e3
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Virtual Channel Manager
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LIBCHANNELS_H
+#define __LIBCHANNELS_H
+
+#include <freerdp/utils/debug.h>
+
+#ifdef WITH_DEBUG_CHANNELS
+#define DEBUG_CHANNELS(fmt, ...) DEBUG_CLASS(CHANNELS, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_CHANNELS(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __LIBCHANNELS_H */
diff --git a/libfreerdp-channels/wtsvc.c b/libfreerdp-channels/wtsvc.c
new file mode 100644 (file)
index 0000000..03a91b4
--- /dev/null
@@ -0,0 +1,372 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Server Virtual Channel Interface
+ *
+ * Copyright 2011-2012 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+
+#include "wtsvc.h"
+
+typedef struct wts_data_item
+{
+       uint16 channel_id;
+       uint8* buffer;
+       uint32 length;
+} wts_data_item;
+
+static void wts_data_item_free(wts_data_item* item)
+{
+       xfree(item->buffer);
+       xfree(item);
+}
+
+static void WTSProcessChannelData(rdpPeerChannel* channel, int channelId, uint8* data, int size, int flags, int total_size)
+{
+       wts_data_item* item;
+
+       if (flags & CHANNEL_FLAG_FIRST)
+       {
+               stream_set_pos(channel->receive_data, 0);
+       }
+
+       stream_check_size(channel->receive_data, size);
+       stream_write(channel->receive_data, data, size);
+
+       if (flags & CHANNEL_FLAG_LAST)
+       {
+               if (stream_get_length(channel->receive_data) != total_size)
+               {
+                       printf("WTSProcessChannelData: read error\n");
+               }
+               if (channel->channel_type == RDP_PEER_CHANNEL_TYPE_DVC)
+               {
+                       /* TODO: Receive DVC channel data */
+               }
+               else
+               {
+                       item = xnew(wts_data_item);
+                       item->length = stream_get_length(channel->receive_data);
+                       item->buffer = xmalloc(item->length);
+                       memcpy(item->buffer, stream_get_head(channel->receive_data), item->length);
+
+                       freerdp_mutex_lock(channel->mutex);
+                       list_enqueue(channel->receive_queue, item);
+                       freerdp_mutex_unlock(channel->mutex);
+
+                       wait_obj_set(channel->receive_event);
+               }
+               stream_set_pos(channel->receive_data, 0);
+       }
+}
+
+static int WTSReceiveChannelData(freerdp_peer* client, int channelId, uint8* data, int size, int flags, int total_size)
+{
+       int i;
+       boolean result = false;
+       rdpPeerChannel* channel;
+
+       for (i = 0; i < client->settings->num_channels; i++)
+       {
+               if (client->settings->channels[i].channel_id == channelId)
+                       break;
+       }
+       if (i < client->settings->num_channels)
+       {
+               channel = (rdpPeerChannel*) client->settings->channels[i].handle;
+               if (channel != NULL)
+               {
+                       WTSProcessChannelData(channel, channelId, data, size, flags, total_size);
+                       result = true;
+               }
+       }
+
+       return result;
+}
+
+WTSVirtualChannelManager* WTSCreateVirtualChannelManager(freerdp_peer* client)
+{
+       WTSVirtualChannelManager* vcm;
+
+       vcm = xnew(WTSVirtualChannelManager);
+       if (vcm != NULL)
+       {
+               vcm->client = client;
+               vcm->send_event = wait_obj_new();
+               vcm->send_queue = list_new();
+               vcm->mutex = freerdp_mutex_new();
+
+               client->ReceiveChannelData = WTSReceiveChannelData;
+       }
+
+       return vcm;
+}
+
+void WTSDestroyVirtualChannelManager(WTSVirtualChannelManager* vcm)
+{
+       wts_data_item* item;
+
+       if (vcm != NULL)
+       {
+               if (vcm->drdynvc_channel != NULL)
+               {
+                       WTSVirtualChannelClose(vcm->drdynvc_channel);
+                       vcm->drdynvc_channel = NULL;
+               }
+
+               wait_obj_free(vcm->send_event);
+               while ((item = (wts_data_item*) list_dequeue(vcm->send_queue)) != NULL)
+               {
+                       wts_data_item_free(item);
+               }
+               list_free(vcm->send_queue);
+               freerdp_mutex_free(vcm->mutex);
+               xfree(vcm);
+       }
+}
+
+void WTSVirtualChannelManagerGetFileDescriptor(WTSVirtualChannelManager* vcm,
+       void** fds, int* fds_count)
+{
+       wait_obj_get_fds(vcm->send_event, fds, fds_count);
+}
+
+boolean WTSVirtualChannelManagerCheckFileDescriptor(WTSVirtualChannelManager* vcm)
+{
+       boolean result = true;
+       wts_data_item* item;
+
+       wait_obj_clear(vcm->send_event);
+
+       freerdp_mutex_lock(vcm->mutex);
+       while ((item = (wts_data_item*) list_dequeue(vcm->send_queue)) != NULL)
+       {
+               if (vcm->client->SendChannelData(vcm->client, item->channel_id, item->buffer, item->length) == false)
+               {
+                       result = false;
+               }
+               wts_data_item_free(item);
+               if (result == false)
+                       break;
+       }
+       freerdp_mutex_unlock(vcm->mutex);
+
+       return result;
+}
+
+void* WTSVirtualChannelOpenEx(
+       /* __in */ WTSVirtualChannelManager* vcm,
+       /* __in */ const char* pVirtualName,
+       /* __in */ uint32 flags)
+{
+       int i;
+       int len;
+       rdpPeerChannel* channel;
+       const char* channel_name;
+       freerdp_peer* client = vcm->client;
+
+       channel_name = ((flags & WTS_CHANNEL_OPTION_DYNAMIC) != 0 ? "drdynvc" : pVirtualName);
+
+       len = strlen(channel_name);
+       if (len > 8)
+               return NULL;
+
+       for (i = 0; i < client->settings->num_channels; i++)
+       {
+               if (client->settings->channels[i].joined &&
+                       strncmp(client->settings->channels[i].name, channel_name, len) == 0)
+               {
+                       break;
+               }
+       }
+       if (i >= client->settings->num_channels)
+               return NULL;
+
+       channel = (rdpPeerChannel*) client->settings->channels[i].handle;
+       if (channel == NULL)
+       {
+               channel = xnew(rdpPeerChannel);
+               channel->vcm = vcm;
+               channel->client = client;
+               channel->channel_id = client->settings->channels[i].channel_id;
+               channel->index = i;
+               channel->receive_data = stream_new(client->settings->vc_chunk_size);
+               if ((flags & WTS_CHANNEL_OPTION_DYNAMIC) != 0)
+               {
+                       channel->channel_type = RDP_PEER_CHANNEL_TYPE_DVC;
+                       vcm->drdynvc_channel = channel;
+               }
+               else
+               {
+                       channel->channel_type = RDP_PEER_CHANNEL_TYPE_SVC;
+                       channel->receive_event = wait_obj_new();
+                       channel->receive_queue = list_new();
+                       channel->mutex = freerdp_mutex_new();
+               }
+
+               client->settings->channels[i].handle = channel;
+       }
+       if (channel->channel_type == RDP_PEER_CHANNEL_TYPE_DVC)
+       {
+               /* TODO: do DVC channel initialization here using pVirtualName */
+               /* A sub-channel should be created and returned, instead of using the main drdynvc channel */
+               /* Set channel->index to num_channels */
+       }
+
+       return channel;
+}
+
+boolean WTSVirtualChannelQuery(
+       /* __in */  void* hChannelHandle,
+       /* __in */  WTS_VIRTUAL_CLASS WtsVirtualClass,
+       /* __out */ void** ppBuffer,
+       /* __out */ uint32* pBytesReturned)
+{
+       void* fds[10];
+       int fds_count = 0;
+       boolean result = false;
+       rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle;
+
+       switch (WtsVirtualClass)
+       {
+               case WTSVirtualFileHandle:
+                       wait_obj_get_fds(channel->receive_event, fds, &fds_count);
+                       *ppBuffer = xmalloc(sizeof(void*));
+                       memcpy(*ppBuffer, &fds[0], sizeof(void*));
+                       *pBytesReturned = sizeof(void*);
+                       result = true;
+                       break;
+
+               default:
+                       break;
+       }
+       return result;
+}
+
+void WTSFreeMemory(
+       /* __in */ void* pMemory)
+{
+       xfree(pMemory);
+}
+
+boolean WTSVirtualChannelRead(
+       /* __in */  void* hChannelHandle,
+       /* __in */  uint32 TimeOut,
+       /* __out */ uint8* Buffer,
+       /* __in */  uint32 BufferSize,
+       /* __out */ uint32* pBytesRead)
+{
+       wts_data_item* item;
+       rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle;
+
+       item = (wts_data_item*) list_peek(channel->receive_queue);
+       if (item == NULL)
+       {
+               wait_obj_clear(channel->receive_event);
+               *pBytesRead = 0;
+               return true;
+       }
+       *pBytesRead = item->length;
+       if (item->length > BufferSize)
+               return false;
+
+       /* remove the first element (same as what we just peek) */
+       freerdp_mutex_lock(channel->mutex);
+       list_dequeue(channel->receive_queue);
+       if (channel->receive_queue->head == NULL)
+               wait_obj_clear(channel->receive_event);
+       freerdp_mutex_unlock(channel->mutex);
+
+       memcpy(Buffer, item->buffer, item->length);
+
+       return true;
+}
+
+boolean WTSVirtualChannelWrite(
+       /* __in */  void* hChannelHandle,
+       /* __in */  uint8* Buffer,
+       /* __in */  uint32 Length,
+       /* __out */ uint32* pBytesWritten)
+{
+       uint32 written = 0;
+       wts_data_item* item;
+       boolean result = false;
+       rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle;
+       WTSVirtualChannelManager* vcm = channel->vcm;
+
+       if (channel == NULL)
+               return false;
+
+       if (channel->channel_type == RDP_PEER_CHANNEL_TYPE_SVC)
+       {
+               item = xnew(wts_data_item);
+               item->channel_id = channel->channel_id;
+               item->buffer = xmalloc(Length);
+               item->length = Length;
+               memcpy(item->buffer, Buffer, Length);
+
+               freerdp_mutex_lock(vcm->mutex);
+               list_enqueue(vcm->send_queue, item);
+               freerdp_mutex_unlock(vcm->mutex);
+
+               wait_obj_set(vcm->send_event);
+
+               written = Length;
+               result = true;
+       }
+       else
+       {
+               /* TODO: Send to DVC channel */
+       }
+
+       if (pBytesWritten != NULL)
+               *pBytesWritten = written;
+       return result;
+}
+
+boolean WTSVirtualChannelClose(
+       /* __in */ void* hChannelHandle)
+{
+       wts_data_item* item;
+       rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle;
+
+       if (channel != NULL)
+       {
+               if (channel->index < channel->client->settings->num_channels)
+                       channel->client->settings->channels[channel->index].handle = NULL;
+               stream_free(channel->receive_data);
+               if (channel->receive_event)
+                       wait_obj_free(channel->receive_event);
+               if (channel->receive_queue)
+               {
+                       while ((item = (wts_data_item*) list_dequeue(channel->receive_queue)) != NULL)
+                       {
+                               wts_data_item_free(item);
+                       }
+                       list_free(channel->receive_queue);
+               }
+               if (channel->mutex)
+                       freerdp_mutex_free(channel->mutex);
+               xfree(channel);
+       }
+
+       return true;
+}
diff --git a/libfreerdp-channels/wtsvc.h b/libfreerdp-channels/wtsvc.h
new file mode 100644 (file)
index 0000000..11110d4
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Server Virtual Channel Interface
+ *
+ * Copyright 2011-2012 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WTSVC_H
+#define __WTSVC_H
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/mutex.h>
+#include <freerdp/utils/wait_obj.h>
+#include <freerdp/channels/wtsvc.h>
+
+enum
+{
+       RDP_PEER_CHANNEL_TYPE_SVC = 0,
+       RDP_PEER_CHANNEL_TYPE_DVC = 1,
+       RDP_PEER_CHANNEL_TYPE_DVC_SUB = 2
+};
+
+typedef struct rdp_peer_channel
+{
+       WTSVirtualChannelManager* vcm;
+       freerdp_peer* client;
+       uint16 channel_id;
+       uint16 channel_type;
+       uint16 index;
+
+       STREAM* receive_data;
+       struct wait_obj* receive_event;
+       LIST* receive_queue;
+       freerdp_mutex mutex;
+} rdpPeerChannel;
+
+struct WTSVirtualChannelManager
+{
+       freerdp_peer* client;
+       struct wait_obj* send_event;
+       LIST* send_queue;
+       freerdp_mutex mutex;
+
+       rdpPeerChannel* drdynvc_channel;
+};
+
+#endif /* __WTSVC_H */
diff --git a/libfreerdp-codec/CMakeLists.txt b/libfreerdp-codec/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7562a91
--- /dev/null
@@ -0,0 +1,66 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-codec cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(FREERDP_CODEC_SRCS
+       bitmap.c
+       color.c
+       rfx_bitstream.h
+       rfx_constants.h
+       rfx_decode.c
+       rfx_decode.h
+       rfx_differential.c
+       rfx_differential.h
+       rfx_dwt.c
+       rfx_dwt.h
+       rfx_encode.c
+       rfx_encode.h
+       rfx_pool.c
+       rfx_pool.h
+       rfx_quantization.c
+       rfx_quantization.h
+       rfx_rlgr.c
+       rfx_rlgr.h
+       rfx_types.h
+       rfx.c
+       nsc.c
+)
+
+if(WITH_SSE2)
+       set(FREERDP_CODEC_SRCS ${FREERDP_CODEC_SRCS}
+       rfx_sse2.c
+       rfx_sse2.h
+)
+       set_property(SOURCE rfx_sse2.c PROPERTY COMPILE_FLAGS "-msse2")
+endif()
+
+if(WITH_NEON)
+       set(FREERDP_CODEC_SRCS ${FREERDP_CODEC_SRCS}
+       rfx_neon.c
+       rfx_neon.h
+)
+       set_property(SOURCE rfx_neon.c PROPERTY COMPILE_FLAGS "-mfpu=neon -mfloat-abi=softfp")
+endif()
+
+add_library(freerdp-codec ${FREERDP_CODEC_SRCS})
+
+set_target_properties(freerdp-codec PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+target_link_libraries(freerdp-codec freerdp-utils)
+
+install(TARGETS freerdp-codec DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
diff --git a/libfreerdp-codec/bitmap.c b/libfreerdp-codec/bitmap.c
new file mode 100644 (file)
index 0000000..dc21a4f
--- /dev/null
@@ -0,0 +1,471 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Compressed Bitmap
+ *
+ * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/codec/bitmap.h>
+
+/*
+   RLE Compressed Bitmap Stream (RLE_BITMAP_STREAM)
+   http://msdn.microsoft.com/en-us/library/cc240895%28v=prot.10%29.aspx
+   pseudo-code
+   http://msdn.microsoft.com/en-us/library/dd240593%28v=prot.10%29.aspx
+*/
+
+#define REGULAR_BG_RUN              0x00
+#define MEGA_MEGA_BG_RUN            0xF0
+#define REGULAR_FG_RUN              0x01
+#define MEGA_MEGA_FG_RUN            0xF1
+#define LITE_SET_FG_FG_RUN          0x0C
+#define MEGA_MEGA_SET_FG_RUN        0xF6
+#define LITE_DITHERED_RUN           0x0E
+#define MEGA_MEGA_DITHERED_RUN      0xF8
+#define REGULAR_COLOR_RUN           0x03
+#define MEGA_MEGA_COLOR_RUN         0xF3
+#define REGULAR_FGBG_IMAGE          0x02
+#define MEGA_MEGA_FGBG_IMAGE        0xF2
+#define LITE_SET_FG_FGBG_IMAGE      0x0D
+#define MEGA_MEGA_SET_FGBG_IMAGE    0xF7
+#define REGULAR_COLOR_IMAGE         0x04
+#define MEGA_MEGA_COLOR_IMAGE       0xF4
+#define SPECIAL_FGBG_1              0xF9
+#define SPECIAL_FGBG_2              0xFA
+#define SPECIAL_WHITE               0xFD
+#define SPECIAL_BLACK               0xFE
+
+#define BLACK_PIXEL 0x000000
+#define WHITE_PIXEL 0xFFFFFF
+
+typedef uint32 PIXEL;
+
+static const uint8 g_MaskBit0 = 0x01; /* Least significant bit */
+static const uint8 g_MaskBit1 = 0x02;
+static const uint8 g_MaskBit2 = 0x04;
+static const uint8 g_MaskBit3 = 0x08;
+static const uint8 g_MaskBit4 = 0x10;
+static const uint8 g_MaskBit5 = 0x20;
+static const uint8 g_MaskBit6 = 0x40;
+static const uint8 g_MaskBit7 = 0x80; /* Most significant bit */
+
+static const uint8 g_MaskSpecialFgBg1 = 0x03;
+static const uint8 g_MaskSpecialFgBg2 = 0x05;
+
+static const uint8 g_MaskRegularRunLength = 0x1F;
+static const uint8 g_MaskLiteRunLength = 0x0F;
+
+/**
+ * Reads the supplied order header and extracts the compression
+ * order code ID.
+ */
+static uint32 ExtractCodeId(uint8 bOrderHdr)
+{
+       int code;
+
+       switch (bOrderHdr)
+       {
+               case MEGA_MEGA_BG_RUN:
+               case MEGA_MEGA_FG_RUN:
+               case MEGA_MEGA_SET_FG_RUN:
+               case MEGA_MEGA_DITHERED_RUN:
+               case MEGA_MEGA_COLOR_RUN:
+               case MEGA_MEGA_FGBG_IMAGE:
+               case MEGA_MEGA_SET_FGBG_IMAGE:
+               case MEGA_MEGA_COLOR_IMAGE:
+               case SPECIAL_FGBG_1:
+               case SPECIAL_FGBG_2:
+               case SPECIAL_WHITE:
+               case SPECIAL_BLACK:
+                       return bOrderHdr;
+       }
+       code = bOrderHdr >> 5;
+       switch (code)
+       {
+               case REGULAR_BG_RUN:
+               case REGULAR_FG_RUN:
+               case REGULAR_COLOR_RUN:
+               case REGULAR_FGBG_IMAGE:
+               case REGULAR_COLOR_IMAGE:
+                       return code;
+       }
+       return bOrderHdr >> 4;
+}
+
+/**
+ * Extract the run length of a compression order.
+ */
+static uint32 ExtractRunLength(uint32 code, uint8* pbOrderHdr, uint32* advance)
+{
+       uint32 runLength;
+       uint32 ladvance;
+
+       ladvance = 1;
+       runLength = 0;
+       switch (code)
+       {
+               case REGULAR_FGBG_IMAGE:
+                       runLength = (*pbOrderHdr) & g_MaskRegularRunLength;
+                       if (runLength == 0)
+                       {
+                               runLength = (*(pbOrderHdr + 1)) + 1;
+                               ladvance += 1;
+                       }
+                       else
+                       {
+                               runLength = runLength * 8;
+                       }
+                       break;
+               case LITE_SET_FG_FGBG_IMAGE:
+                       runLength = (*pbOrderHdr) & g_MaskLiteRunLength;
+                       if (runLength == 0)
+                       {
+                               runLength = (*(pbOrderHdr + 1)) + 1;
+                               ladvance += 1;
+                       }
+                       else
+                       {
+                               runLength = runLength * 8;
+                       }
+                       break;
+               case REGULAR_BG_RUN:
+               case REGULAR_FG_RUN:
+               case REGULAR_COLOR_RUN:
+               case REGULAR_COLOR_IMAGE:
+                       runLength = (*pbOrderHdr) & g_MaskRegularRunLength;
+                       if (runLength == 0)
+                       {
+                               /* An extended (MEGA) run. */
+                               runLength = (*(pbOrderHdr + 1)) + 32;
+                               ladvance += 1;
+                       }
+                       break;
+               case LITE_SET_FG_FG_RUN:
+               case LITE_DITHERED_RUN:
+                       runLength = (*pbOrderHdr) & g_MaskLiteRunLength;
+                       if (runLength == 0)
+                       {
+                               /* An extended (MEGA) run. */
+                               runLength = (*(pbOrderHdr + 1)) + 16;
+                               ladvance += 1;
+                       }
+                       break;
+               case MEGA_MEGA_BG_RUN:
+               case MEGA_MEGA_FG_RUN:
+               case MEGA_MEGA_SET_FG_RUN:
+               case MEGA_MEGA_DITHERED_RUN:
+               case MEGA_MEGA_COLOR_RUN:
+               case MEGA_MEGA_FGBG_IMAGE:
+               case MEGA_MEGA_SET_FGBG_IMAGE:
+               case MEGA_MEGA_COLOR_IMAGE:
+                       runLength = ((uint16) pbOrderHdr[1]) | ((uint16) (pbOrderHdr[2] << 8));
+                       ladvance += 2;
+                       break;
+       }
+       *advance = ladvance;
+       return runLength;
+}
+
+#define UNROLL_COUNT 4
+#define UNROLL(_exp) do { _exp _exp _exp _exp } while (0)
+
+#undef DESTWRITEPIXEL
+#undef DESTREADPIXEL
+#undef SRCREADPIXEL
+#undef DESTNEXTPIXEL
+#undef SRCNEXTPIXEL
+#undef WRITEFGBGIMAGE
+#undef WRITEFIRSTLINEFGBGIMAGE
+#undef RLEDECOMPRESS
+#undef RLEEXTRA
+#define DESTWRITEPIXEL(_buf, _pix) (_buf)[0] = (uint8)(_pix)
+#define DESTREADPIXEL(_pix, _buf) _pix = (_buf)[0]
+#define SRCREADPIXEL(_pix, _buf) _pix = (_buf)[0]
+#define DESTNEXTPIXEL(_buf) _buf += 1
+#define SRCNEXTPIXEL(_buf) _buf += 1
+#define WRITEFGBGIMAGE WriteFgBgImage8to8
+#define WRITEFIRSTLINEFGBGIMAGE WriteFirstLineFgBgImage8to8
+#define RLEDECOMPRESS RleDecompress8to8
+#define RLEEXTRA
+#include "include/bitmap.c"
+
+#undef DESTWRITEPIXEL
+#undef DESTREADPIXEL
+#undef SRCREADPIXEL
+#undef DESTNEXTPIXEL
+#undef SRCNEXTPIXEL
+#undef WRITEFGBGIMAGE
+#undef WRITEFIRSTLINEFGBGIMAGE
+#undef RLEDECOMPRESS
+#undef RLEEXTRA
+#define DESTWRITEPIXEL(_buf, _pix) ((uint16*)(_buf))[0] = (uint16)(_pix)
+#define DESTREADPIXEL(_pix, _buf) _pix = ((uint16*)(_buf))[0]
+#define SRCREADPIXEL(_pix, _buf) _pix = ((uint16*)(_buf))[0]
+#define DESTNEXTPIXEL(_buf) _buf += 2
+#define SRCNEXTPIXEL(_buf) _buf += 2
+#define WRITEFGBGIMAGE WriteFgBgImage16to16
+#define WRITEFIRSTLINEFGBGIMAGE WriteFirstLineFgBgImage16to16
+#define RLEDECOMPRESS RleDecompress16to16
+#define RLEEXTRA
+#include "include/bitmap.c"
+
+#undef DESTWRITEPIXEL
+#undef DESTREADPIXEL
+#undef SRCREADPIXEL
+#undef DESTNEXTPIXEL
+#undef SRCNEXTPIXEL
+#undef WRITEFGBGIMAGE
+#undef WRITEFIRSTLINEFGBGIMAGE
+#undef RLEDECOMPRESS
+#undef RLEEXTRA
+#define DESTWRITEPIXEL(_buf, _pix) do { (_buf)[0] = (uint8)(_pix);  \
+  (_buf)[1] = (uint8)((_pix) >> 8); (_buf)[2] = (uint8)((_pix) >> 16); } while (0)
+#define DESTREADPIXEL(_pix, _buf) _pix = (_buf)[0] | ((_buf)[1] << 8) | \
+  ((_buf)[2] << 16)
+#define SRCREADPIXEL(_pix, _buf) _pix = (_buf)[0] | ((_buf)[1] << 8) | \
+  ((_buf)[2] << 16)
+#define DESTNEXTPIXEL(_buf) _buf += 3
+#define SRCNEXTPIXEL(_buf) _buf += 3
+#define WRITEFGBGIMAGE WriteFgBgImage24to24
+#define WRITEFIRSTLINEFGBGIMAGE WriteFirstLineFgBgImage24to24
+#define RLEDECOMPRESS RleDecompress24to24
+#define RLEEXTRA
+#include "include/bitmap.c"
+
+#define IN_UINT8_MV(_p) (*((_p)++))
+
+/**
+ * decompress an RLE color plane
+ * RDP6_BITMAP_STREAM
+ */
+static int process_rle_plane(uint8* in, int width, int height, uint8* out, int size)
+{
+       int indexw;
+       int indexh;
+       int code;
+       int collen;
+       int replen;
+       int color;
+       int x;
+       int revcode;
+       uint8* last_line;
+       uint8* this_line;
+       uint8* org_in;
+       uint8* org_out;
+
+       org_in = in;
+       org_out = out;
+       last_line = 0;
+       indexh = 0;
+       while (indexh < height)
+       {
+               out = (org_out + width * height * 4) - ((indexh + 1) * width * 4);
+               color = 0;
+               this_line = out;
+               indexw = 0;
+               if (last_line == 0)
+               {
+                       while (indexw < width)
+                       {
+                               code = IN_UINT8_MV(in);
+                               replen = code & 0xf;
+                               collen = (code >> 4) & 0xf;
+                               revcode = (replen << 4) | collen;
+                               if ((revcode <= 47) && (revcode >= 16))
+                               {
+                                       replen = revcode;
+                                       collen = 0;
+                               }
+                               while (collen > 0)
+                               {
+                                       color = IN_UINT8_MV(in);
+                                       *out = color;
+                                       out += 4;
+                                       indexw++;
+                                       collen--;
+                               }
+                               while (replen > 0)
+                               {
+                                       *out = color;
+                                       out += 4;
+                                       indexw++;
+                                       replen--;
+                               }
+                       }
+               }
+               else
+               {
+                       while (indexw < width)
+                       {
+                               code = IN_UINT8_MV(in);
+                               replen = code & 0xf;
+                               collen = (code >> 4) & 0xf;
+                               revcode = (replen << 4) | collen;
+                               if ((revcode <= 47) && (revcode >= 16))
+                               {
+                                       replen = revcode;
+                                       collen = 0;
+                               }
+                               while (collen > 0)
+                               {
+                                       x = IN_UINT8_MV(in);
+                                       if (x & 1)
+                                       {
+                                               x = x >> 1;
+                                               x = x + 1;
+                                               color = -x;
+                                       }
+                                       else
+                                       {
+                                               x = x >> 1;
+                                               color = x;
+                                       }
+                                       x = last_line[indexw * 4] + color;
+                                       *out = x;
+                                       out += 4;
+                                       indexw++;
+                                       collen--;
+                               }
+                               while (replen > 0)
+                               {
+                                       x = last_line[indexw * 4] + color;
+                                       *out = x;
+                                       out += 4;
+                                       indexw++;
+                                       replen--;
+                               }
+                       }
+               }
+               indexh++;
+               last_line = this_line;
+       }
+       return (int) (in - org_in);
+}
+
+/**
+ * process a raw color plane
+ */
+static int process_raw_plane(uint8* srcData, int width, int height, uint8* dstData, int size)
+{
+       int x, y;
+
+       for (y = 0; y < height; y++)
+       {
+               for (x = 0; x < width; x++)
+               {
+                       dstData[(((height - y - 1) * width) + x) * 4] = srcData[((y * width) + x)];
+               }
+       }
+
+       return (width * height);
+}
+
+/**
+ * 4 byte bitmap decompress
+ * RDP6_BITMAP_STREAM
+ */
+static boolean bitmap_decompress4(uint8* srcData, uint8* dstData, int width, int height, int size)
+{
+       int RLE;
+       int code;
+       int NoAlpha;
+       int bytes_processed;
+       int total_processed;
+
+       code = IN_UINT8_MV(srcData);
+       RLE = code & 0x10;
+
+       total_processed = 1;
+       NoAlpha = code & 0x20;
+
+       if (NoAlpha == 0)
+       {
+               bytes_processed = process_rle_plane(srcData, width, height, dstData + 3, size - total_processed);
+               total_processed += bytes_processed;
+               srcData += bytes_processed;
+       }
+
+       if (RLE != 0)
+       {
+               bytes_processed = process_rle_plane(srcData, width, height, dstData + 2, size - total_processed);
+               total_processed += bytes_processed;
+               srcData += bytes_processed;
+
+               bytes_processed = process_rle_plane(srcData, width, height, dstData + 1, size - total_processed);
+               total_processed += bytes_processed;
+               srcData += bytes_processed;
+
+               bytes_processed = process_rle_plane(srcData, width, height, dstData + 0, size - total_processed);
+               total_processed += bytes_processed;
+       }
+       else
+       {
+               bytes_processed = process_raw_plane(srcData, width, height, dstData + 2, size - total_processed);
+               total_processed += bytes_processed;
+               srcData += bytes_processed;
+
+               bytes_processed = process_raw_plane(srcData, width, height, dstData + 1, size - total_processed);
+               total_processed += bytes_processed;
+               srcData += bytes_processed;
+
+               bytes_processed = process_raw_plane(srcData, width, height, dstData + 0, size - total_processed);
+               total_processed += bytes_processed + 1;
+       }
+
+       return (size == total_processed) ? true : false;
+}
+
+
+/**
+ * bitmap decompression routine
+ */
+boolean bitmap_decompress(uint8* srcData, uint8* dstData, int width, int height, int size, int srcBpp, int dstBpp)
+{
+       if (srcBpp == 16 && dstBpp == 16)
+       {
+               RleDecompress16to16(srcData, size, dstData, width * 2, width, height);
+               freerdp_bitmap_flip(dstData, dstData, width * 2, height);
+       }
+       else if (srcBpp == 32 && dstBpp == 32)
+       {
+               if (!bitmap_decompress4(srcData, dstData, width, height, size))
+                       return false;
+       }
+       else if (srcBpp == 15 && dstBpp == 15)
+       {
+               RleDecompress16to16(srcData, size, dstData, width * 2, width, height);
+               freerdp_bitmap_flip(dstData, dstData, width * 2, height);
+       }
+       else if (srcBpp == 8 && dstBpp == 8)
+       {
+               RleDecompress8to8(srcData, size, dstData, width, width, height);
+               freerdp_bitmap_flip(dstData, dstData, width, height);
+       }
+       else if (srcBpp == 24 && dstBpp == 24)
+       {
+               RleDecompress24to24(srcData, size, dstData, width * 3, width, height);
+               freerdp_bitmap_flip(dstData, dstData, width * 3, height);
+       }
+       else
+       {
+               return false;
+       }
+
+       return true;
+}
diff --git a/libfreerdp-codec/color.c b/libfreerdp-codec/color.c
new file mode 100644 (file)
index 0000000..97187f8
--- /dev/null
@@ -0,0 +1,1061 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Color Conversion Routines
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/utils/memory.h>
+
+int freerdp_get_pixel(uint8 * data, int x, int y, int width, int height, int bpp)
+{
+       int start;
+       int shift;
+       uint16 *src16;
+       uint32 *src32;
+       int red, green, blue;
+
+       switch (bpp)
+       {
+               case  1:
+                       width = (width + 7) / 8;
+                       start = (y * width) + x / 8;
+                       shift = x % 8;
+                       return (data[start] & (0x80 >> shift)) != 0;
+               case 8:
+                       return data[y * width + x];
+               case 15:
+               case 16:
+                       src16 = (uint16*) data;
+                       return src16[y * width + x];
+               case 24:
+                       data += y * width * 3;
+                       data += x * 3;
+                       red = data[0];
+                       green = data[1];
+                       blue = data[2];
+                       return RGB24(red, green, blue);
+               case 32:
+                       src32 = (uint32*) data;
+                       return src32[y * width + x];
+               default:
+                       break;
+       }
+
+       return 0;
+}
+
+void freerdp_set_pixel(uint8* data, int x, int y, int width, int height, int bpp, int pixel)
+{
+       int start;
+       int shift;
+       int *dst32;
+
+       if (bpp == 1)
+       {
+               width = (width + 7) / 8;
+               start = (y * width) + x / 8;
+               shift = x % 8;
+               if (pixel)
+                       data[start] = data[start] | (0x80 >> shift);
+               else
+                       data[start] = data[start] & ~(0x80 >> shift);
+       }
+       else if (bpp == 32)
+       {
+               dst32 = (int*) data;
+               dst32[y * width + x] = pixel;
+       }
+}
+
+INLINE void freerdp_color_split_rgb(uint32* color, int bpp, uint8* red, uint8* green, uint8* blue, uint8* alpha, HCLRCONV clrconv)
+{
+       *red = *green = *blue = 0;
+       *alpha = (clrconv->alpha) ? 0xFF : 0x00;
+
+       switch (bpp)
+       {
+               case 32:
+                       if (clrconv->alpha)
+                       {
+                               GetARGB32(*alpha, *red, *green, *blue, *color);
+                       }
+                       else
+                       {
+                               GetRGB32(*red, *green, *blue, *color);
+                       }
+                       break;
+
+               case 24:
+                       GetRGB24(*red, *green, *blue, *color);
+                       break;
+
+               case 16:
+                       GetRGB16(*red, *green, *blue, *color);
+                       break;
+
+               case 15:
+                       GetRGB15(*red, *green, *blue, *color);
+                       break;
+
+               case 8:
+                       *color &= 0xFF;
+                       *red = clrconv->palette->entries[*color].red;
+                       *green = clrconv->palette->entries[*color].green;
+                       *blue = clrconv->palette->entries[*color].blue;
+                       break;
+
+               case 1:
+                       if (*color != 0)
+                       {
+                               *red = 0xFF;
+                               *green = 0xFF;
+                               *blue = 0xFF;
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+INLINE void freerdp_color_split_bgr(uint32* color, int bpp, uint8* red, uint8* green, uint8* blue, uint8* alpha, HCLRCONV clrconv)
+{
+       *red = *green = *blue = 0;
+       *alpha = (clrconv->alpha) ? 0xFF : 0x00;
+
+       switch (bpp)
+       {
+               case 32:
+                       if (clrconv->alpha)
+                       {
+                               GetABGR32(*alpha, *red, *green, *blue, *color);
+                       }
+                       else
+                       {
+                               GetBGR32(*red, *green, *blue, *color);
+                       }
+                       break;
+
+               case 24:
+                       GetBGR24(*red, *green, *blue, *color);
+                       break;
+
+               case 16:
+                       GetBGR16(*red, *green, *blue, *color);
+                       break;
+
+               case 15:
+                       GetBGR15(*red, *green, *blue, *color);
+                       break;
+
+               case 8:
+                       *color &= 0xFF;
+                       *red = clrconv->palette->entries[*color].red;
+                       *green = clrconv->palette->entries[*color].green;
+                       *blue = clrconv->palette->entries[*color].blue;
+                       break;
+
+               case 1:
+                       if (*color != 0)
+                       {
+                               *red = 0xFF;
+                               *green = 0xFF;
+                               *blue = 0xFF;
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+INLINE void freerdp_color_make_rgb(uint32* color, int bpp, uint8* red, uint8* green, uint8* blue, uint8* alpha, HCLRCONV clrconv)
+{
+       switch (bpp)
+       {
+               case 32:
+                       *color = ARGB32(*alpha, *red, *green, *blue);
+                       break;
+
+               case 24:
+                       *color = RGB24(*red, *green, *blue);
+                       break;
+
+               case 16:
+                       if (clrconv->rgb555)
+                       {
+                               *color = RGB15(*red, *green, *blue);
+                       }
+                       else
+                       {
+                               *color = RGB16(*red, *green, *blue);
+                       }
+                       break;
+
+               case 15:
+                       *color = RGB15(*red, *green, *blue);
+                       break;
+
+               case 8:
+                       *color = RGB24(*red, *green, *blue);
+                       break;
+
+               case 1:
+                       if ((*red != 0) || (*green != 0) || (*blue != 0))
+                               *color = 1;
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+INLINE void freerdp_color_make_bgr(uint32* color, int bpp, uint8* red, uint8* green, uint8* blue, uint8* alpha, HCLRCONV clrconv)
+{
+       switch (bpp)
+       {
+               case 32:
+                       *color = ABGR32(*alpha, *red, *green, *blue);
+                       break;
+
+               case 24:
+                       *color = BGR24(*red, *green, *blue);
+                       break;
+
+               case 16:
+                       if (clrconv->rgb555)
+                       {
+                               *color = BGR15(*red, *green, *blue);
+                       }
+                       else
+                       {
+                               *color = BGR16(*red, *green, *blue);
+                       }
+                       break;
+
+               case 15:
+                       *color = BGR15(*red, *green, *blue);
+                       break;
+
+               case 8:
+                       *color = BGR24(*red, *green, *blue);
+                       break;
+
+               case 1:
+                       if ((*red != 0) || (*green != 0) || (*blue != 0))
+                               *color = 1;
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+uint32 freerdp_color_convert_rgb(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       uint8 red = 0;
+       uint8 green = 0;
+       uint8 blue = 0;
+       uint8 alpha = 0xFF;
+       uint32 dstColor = 0;
+
+       freerdp_color_split_rgb(&srcColor, srcBpp, &red, &green, &blue, &alpha, clrconv);
+       freerdp_color_make_rgb(&dstColor, dstBpp, &red, &green, &blue, &alpha, clrconv);
+
+       return dstColor;
+}
+
+uint32 freerdp_color_convert_bgr(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       uint8 red = 0;
+       uint8 green = 0;
+       uint8 blue = 0;
+       uint8 alpha = 0xFF;
+       uint32 dstColor = 0;
+
+       freerdp_color_split_bgr(&srcColor, srcBpp, &red, &green, &blue, &alpha, clrconv);
+       freerdp_color_make_bgr(&dstColor, dstBpp, &red, &green, &blue, &alpha, clrconv);
+
+       return dstColor;
+}
+
+uint32 freerdp_color_convert_rgb_bgr(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       uint8 red = 0;
+       uint8 green = 0;
+       uint8 blue = 0;
+       uint8 alpha = 0xFF;
+       uint32 dstColor = 0;
+
+       freerdp_color_split_rgb(&srcColor, srcBpp, &red, &green, &blue, &alpha, clrconv);
+       freerdp_color_make_bgr(&dstColor, dstBpp, &red, &green, &blue, &alpha, clrconv);
+
+       return dstColor;
+}
+
+uint32 freerdp_color_convert_bgr_rgb(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       uint8 red = 0;
+       uint8 green = 0;
+       uint8 blue = 0;
+       uint8 alpha = 0xFF;
+       uint32 dstColor = 0;
+
+       freerdp_color_split_bgr(&srcColor, srcBpp, &red, &green, &blue, &alpha, clrconv);
+       freerdp_color_make_rgb(&dstColor, dstBpp, &red, &green, &blue, &alpha, clrconv);
+
+       return dstColor;
+}
+
+uint32 freerdp_color_convert_var(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       if (clrconv->invert)
+               return freerdp_color_convert_var_bgr(srcColor, srcBpp, dstBpp, clrconv);
+       else
+               return freerdp_color_convert_var_rgb(srcColor, srcBpp, dstBpp, clrconv);
+}
+
+uint32 freerdp_color_convert_var_rgb(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       if (srcBpp > 16)
+               return freerdp_color_convert_bgr_rgb(srcColor, srcBpp, 32, clrconv);
+       else
+               return freerdp_color_convert_rgb(srcColor, srcBpp, 32, clrconv);
+}
+
+uint32 freerdp_color_convert_var_bgr(uint32 srcColor, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       if (srcBpp > 16)
+               return freerdp_color_convert_bgr(srcColor, srcBpp, 32, clrconv);
+       else
+               return freerdp_color_convert_rgb_bgr(srcColor, srcBpp, 32, clrconv);
+}
+
+uint8* freerdp_image_convert_8bpp(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       int i;
+       uint8 red;
+       uint8 green;
+       uint8 blue;
+       uint32 pixel;
+       uint8 *src8;
+       uint16 *dst16;
+       uint32 *dst32;
+
+       if (dstBpp == 8)
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height);
+
+               memcpy(dstData, srcData, width * height);
+               return dstData;
+       }
+       else if (dstBpp == 15 || (dstBpp == 16 && clrconv->rgb555))
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 2);
+               
+               dst16 = (uint16 *) dstData;
+               for (i = width * height; i > 0; i--)
+               {
+                       pixel = *srcData;
+                       srcData++;
+                       red = clrconv->palette->entries[pixel].red;
+                       green = clrconv->palette->entries[pixel].green;
+                       blue = clrconv->palette->entries[pixel].blue;
+                       pixel = (clrconv->invert) ? BGR15(red, green, blue) : RGB15(red, green, blue);
+                       *dst16 = pixel;
+                       dst16++;
+               }
+               return dstData;
+       }
+       else if (dstBpp == 16)
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 2);
+               
+               dst16 = (uint16 *) dstData;
+               for (i = width * height; i > 0; i--)
+               {
+                       pixel = *srcData;
+                       srcData++;
+                       red = clrconv->palette->entries[pixel].red;
+                       green = clrconv->palette->entries[pixel].green;
+                       blue = clrconv->palette->entries[pixel].blue;
+                       pixel = (clrconv->invert) ? BGR16(red, green, blue) : RGB16(red, green, blue);
+                       *dst16 = pixel;
+                       dst16++;
+               }
+               return dstData;
+       }
+       else if (dstBpp == 32)
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 4);
+               
+               src8 = (uint8*) srcData;
+               dst32 = (uint32*) dstData;
+               for (i = width * height; i > 0; i--)
+               {
+                       pixel = *src8;
+                       src8++;
+                       red = clrconv->palette->entries[pixel].red;
+                       green = clrconv->palette->entries[pixel].green;
+                       blue = clrconv->palette->entries[pixel].blue;
+                       pixel = (clrconv->invert) ? RGB32(red, green, blue) : BGR32(red, green, blue);
+                       *dst32 = pixel;
+                       dst32++;
+               }
+               return dstData;
+       }
+
+       return srcData;
+}
+
+uint8* freerdp_image_convert_15bpp(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       int i;
+       uint8 red;
+       uint8 green;
+       uint8 blue;
+       uint32 pixel;
+       uint16 *src16;
+       uint16 *dst16;
+       uint32 *dst32;
+
+       if (dstBpp == 15 || (dstBpp == 16 && clrconv->rgb555))
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 2);
+
+               memcpy(dstData, srcData, width * height * 2);
+
+               return dstData;
+       }
+       else if (dstBpp == 32)
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 4);
+               
+               src16 = (uint16 *) srcData;
+               dst32 = (uint32 *) dstData;
+               for (i = width * height; i > 0; i--)
+               {
+                       pixel = *src16;
+                       src16++;
+                       GetBGR15(red, green, blue, pixel);
+                       pixel = (clrconv->invert) ? RGB32(red, green, blue) : BGR32(red, green, blue);
+                       *dst32 = pixel;
+                       dst32++;
+               }
+               return dstData;
+       }
+       else if (dstBpp == 16)
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 2);
+       
+               src16 = (uint16 *) srcData;
+               dst16 = (uint16 *) dstData;
+               for (i = width * height; i > 0; i--)
+               {
+                       pixel = *src16;
+                       src16++;
+                       GetRGB_555(red, green, blue, pixel);
+                       RGB_555_565(red, green, blue);
+                       pixel = (clrconv->invert) ? BGR565(red, green, blue) : RGB565(red, green, blue);
+                       *dst16 = pixel;
+                       dst16++;
+               }
+               return dstData;
+       }
+
+       return srcData;
+}
+
+uint8* freerdp_image_convert_16bpp(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       if (srcBpp == 15)
+               return freerdp_image_convert_15bpp(srcData, dstData, width, height, srcBpp, dstBpp, clrconv);
+
+       if (dstBpp == 16)
+       {
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 2);
+
+               if (clrconv->rgb555)
+               {
+                       int i;
+                       uint8 red, green, blue;
+                       uint16* src16 = (uint16 *) srcData;
+                       uint16* dst16 = (uint16 *) dstData;
+
+                       for (i = width * height; i > 0; i--)
+                       {
+                               GetRGB_565(red, green, blue, (*src16));
+                               RGB_565_555(red, green, blue);
+                               (*dst16) = (clrconv->invert) ? BGR555(red, green, blue) : RGB555(red, green, blue);
+                               src16++;
+                               dst16++;
+                       }
+               }
+               else
+               {
+                       memcpy(dstData, srcData, width * height * 2);
+               }
+
+               return dstData;
+       }
+       else if (dstBpp == 24)
+       {
+               int i;
+               uint8 *dst8;
+               uint16 *src16;
+               uint8 red, green, blue;
+
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 3);
+
+               dst8 = (uint8*) dstData;
+               src16 = (uint16*) srcData;
+
+               for (i = width * height; i > 0; i--)
+               {
+                       GetBGR16(red, green, blue, *src16);
+                       src16++;
+
+                       if (clrconv->invert)
+                       {
+                               *dst8++ = blue;
+                               *dst8++ = green;
+                               *dst8++ = red;
+                       }
+                       else
+                       {
+                               *dst8++ = red;
+                               *dst8++ = green;
+                               *dst8++ = blue;
+                       }
+               }
+               return dstData;
+       }
+       else if (dstBpp == 32)
+       {
+               int i;
+               uint32 pixel;
+               uint16* src16;
+               uint32* dst32;
+               uint8 red, green, blue;
+
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 4);
+
+               src16 = (uint16*) srcData;
+               dst32 = (uint32*) dstData;
+
+               for (i = width * height; i > 0; i--)
+               {
+                       pixel = *src16;
+                       src16++;
+                       GetBGR16(red, green, blue, pixel);
+                       pixel = (clrconv->invert) ? RGB32(red, green, blue) : BGR32(red, green, blue);
+                       *dst32 = pixel;
+                       dst32++;
+               }
+               return dstData;
+       }
+
+       return srcData;
+}
+
+uint8* freerdp_image_convert_24bpp(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       int i;
+
+       if (dstBpp == 32)
+       {
+               uint8 *dstp;
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 4);
+               
+               dstp = dstData;
+               for (i = width * height; i > 0; i--)
+               {
+                       *(dstp++) = *(srcData++);
+                       *(dstp++) = *(srcData++);
+                       *(dstp++) = *(srcData++);
+                       *(dstp++) = 0xFF;
+               }
+               return dstData;
+       }
+
+       return srcData;
+}
+
+uint8* freerdp_image_convert_32bpp(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       if (dstBpp == 16)
+       {
+               int index;
+               uint16 *dst16;
+               uint32 *src32;
+               uint8 red, green, blue;
+
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 2);
+
+               dst16 = (uint16*) dstData;
+               src32 = (uint32*) srcData;
+
+               for (index = 0; index < width * height; index++)
+               {
+                       GetBGR32(blue, green, red, *src32);
+                       *dst16 = (clrconv->invert) ? BGR16(red, green, blue) : RGB16(red, green, blue);
+                       src32++;
+                       dst16++;
+               }
+               return dstData;
+       }
+       else if (dstBpp == 24)
+       {
+               uint8 *dstp;
+               int index;
+               uint8 red, green, blue;
+
+               if (dstData == NULL)
+                       dstData = (uint8*) malloc(width * height * 3);
+
+               dstp = dstData;
+               for (index = 0; index < width * height; index++)
+               {
+                       red = *(srcData++);
+                       green = *(srcData++);
+                       blue = *(srcData++);
+
+                       if (clrconv->invert)
+                       {
+                               *dstp++ = blue;
+                               *dstp++ = green;
+                               *dstp++ = red;
+                       }
+                       else
+                       {
+                               *dstp++ = red;
+                               *dstp++ = green;
+                               *dstp++ = blue;
+                       }
+
+                       srcData++;
+               }
+               return dstData;
+       }
+       else if (dstBpp == 32)
+       {
+               if (clrconv->alpha)
+               {
+                       int x, y;
+                       uint8 *dstp;
+
+                       if (dstData == NULL)
+                               dstData = (uint8*) malloc(width * height * 4);
+
+                       memcpy(dstData, srcData, width * height * 4);
+
+                       dstp = dstData;
+                       for (y = 0; y < height; y++)
+                       {
+                               for (x = 0; x < width * 4; x += 4)
+                               {
+                                       dstp += 3;
+                                       *dstp = 0xFF;
+                                       dstp++;
+                               }
+                       }
+               }
+               else
+               {
+                       if (dstData == NULL)
+                               dstData = (uint8*) malloc(width * height * 4);
+
+                       memcpy(dstData, srcData, width * height * 4);
+               }
+               
+               return dstData;
+       }
+
+       return srcData;
+}
+
+p_freerdp_image_convert freerdp_image_convert_[5] =
+{
+       NULL,
+       freerdp_image_convert_8bpp,
+       freerdp_image_convert_16bpp,
+       freerdp_image_convert_24bpp,
+       freerdp_image_convert_32bpp
+};
+
+uint8* freerdp_image_convert(uint8* srcData, uint8* dstData, int width, int height, int srcBpp, int dstBpp, HCLRCONV clrconv)
+{
+       p_freerdp_image_convert _p_freerdp_image_convert = freerdp_image_convert_[IBPP(srcBpp)];
+
+       if (_p_freerdp_image_convert != NULL)
+               return _p_freerdp_image_convert(srcData, dstData, width, height, srcBpp, dstBpp, clrconv);
+       else
+               return 0;
+}
+
+void   freerdp_bitmap_flip(uint8 * src, uint8 * dst, int scanLineSz, int height)
+{
+       int i;
+
+       uint8 * bottomLine = dst + (scanLineSz * (height - 1));
+       uint8 * topLine = src;
+
+       /* Special processing if called for flip-in-place. */
+       if (src == dst)
+       {
+               /* Allocate a scanline buffer.
+                * (FIXME: xmalloc / xfree below should be replaced by "get/put
+                * scanline buffer from a pool/Q of fixed buffers" to reuse
+                * fixed size buffers (of max scanline size (or adaptative?) )
+                * -- would be much faster).
+                */
+               uint8 * tmpBfr = xmalloc(scanLineSz);
+               int half = height / 2;
+               /* Flip buffer in place by line permutations through the temp
+                * scan line buffer.
+                * Not that if height has an odd number of line, we don't need
+                * to move the center scanline anyway.
+                * Also note that in place flipping takes three memcpy() calls
+                * to process two scanlines while src to distinct dest would
+                * only requires two memcpy() calls for two scanlines.
+                */
+               height--;
+               for (i = 0; i < half ; i++)
+               {
+                       memcpy(tmpBfr, topLine, scanLineSz);
+                       memcpy(topLine, bottomLine, scanLineSz);
+                       memcpy(bottomLine, tmpBfr, scanLineSz);
+                       topLine += scanLineSz;
+                       bottomLine -= scanLineSz;
+                       height--;
+               }
+               xfree(tmpBfr);
+       }
+       /* Flip from source buffer to destination buffer. */
+       else
+       {
+
+               for (i = 0; i < height; i++)
+               {
+                       memcpy(bottomLine, topLine, scanLineSz);
+                       topLine += scanLineSz;
+                       bottomLine -= scanLineSz;
+               }
+       }
+
+}
+
+uint8* freerdp_image_flip(uint8* srcData, uint8* dstData, int width, int height, int bpp)
+{
+       int scanline;
+
+       scanline = width * (bpp / 8);
+
+       if (dstData == NULL)
+               dstData = (uint8*) xmalloc(width * height * (bpp / 8));
+
+       freerdp_bitmap_flip(srcData, dstData, scanline, height);
+       return dstData;
+}
+
+uint8* freerdp_icon_convert(uint8* srcData, uint8* dstData, uint8* mask, int width, int height, int bpp, HCLRCONV clrconv)
+{
+       int x, y;
+       int pixel;
+       uint8* data;
+       uint8 bmask;
+       uint32 pmask;
+       uint32* icon;
+
+       pixel = 0;
+       data = freerdp_image_flip(srcData, dstData, width, height, bpp);
+       dstData = freerdp_image_convert(data, NULL, width, height, bpp, 32, clrconv);
+
+       free(data);
+       bmask = mask[pixel];
+       icon = (uint32*) dstData;
+
+       if (bpp < 32)
+       {
+               for (y = 0; y < height; y++)
+               {
+                       for (x = 0; x < width; x++)
+                       {
+                               if (pixel % 8 == 0)
+                                       bmask = mask[pixel / 8];
+                               else
+                                       bmask <<= 1;
+
+                               pmask = (bmask & 0x80) ? 0x00000000 : 0xFF000000;
+
+                               *icon++ |= pmask;
+
+                               pixel++;
+                       }
+               }
+       }
+
+       free(mask);
+
+       return dstData;
+}
+
+uint8* freerdp_glyph_convert(int width, int height, uint8* data)
+{
+       int x, y;
+       uint8 *srcp;
+       uint8 *dstp;
+       uint8 *dstData;
+       int scanline;
+
+       /*
+        * converts a 1-bit-per-pixel glyph to a one-byte-per-pixel glyph:
+        * this approach uses a little more memory, but provides faster
+        * means of accessing individual pixels in blitting operations
+        */
+
+       scanline = (width + 7) / 8;
+       dstData = (uint8*) malloc(width * height);
+       memset(dstData, 0, width * height);
+       dstp = dstData;
+
+       for (y = 0; y < height; y++)
+       {
+               srcp = data + (y * scanline);
+
+               for (x = 0; x < width; x++)
+               {
+                       if ((*srcp & (0x80 >> (x % 8))) != 0)
+                               *dstp = 0xFF;
+                       dstp++;
+
+                       if (((x + 1) % 8 == 0) && x != 0)
+                               srcp++;
+               }
+       }
+
+       return dstData;
+}
+
+uint8* freerdp_mono_image_convert(uint8* srcData, int width, int height, int srcBpp, int dstBpp, uint32 bgcolor, uint32 fgcolor, HCLRCONV clrconv)
+{
+       int index;
+       uint16* dst16;
+       uint32* dst32;
+       uint8* dstData;
+       uint8 bitMask;
+       int bitIndex;
+       uint8 redBg, greenBg, blueBg;
+       uint8 redFg, greenFg, blueFg;
+
+       switch (srcBpp)
+       {
+               case 8:
+                       bgcolor &= 0xFF;
+                       redBg = clrconv->palette->entries[bgcolor].red;
+                       greenBg = clrconv->palette->entries[bgcolor].green;
+                       blueBg = clrconv->palette->entries[bgcolor].blue;
+
+                       fgcolor &= 0xFF;
+                       redFg = clrconv->palette->entries[fgcolor].red;
+                       greenFg = clrconv->palette->entries[fgcolor].green;
+                       blueFg = clrconv->palette->entries[fgcolor].blue;
+                       break;
+
+               case 16:
+                       GetRGB16(redBg, greenBg, blueBg, bgcolor);
+                       GetRGB16(redFg, greenFg, blueFg, fgcolor);
+                       break;
+
+               case 15:
+                       GetRGB15(redBg, greenBg, blueBg, bgcolor);
+                       GetRGB15(redFg, greenFg, blueFg, fgcolor);
+                       break;
+
+               default:
+                       GetRGB32(redBg, greenBg, blueBg, bgcolor);
+                       GetRGB32(redFg, greenFg, blueFg, fgcolor);
+                       break;
+       }
+
+       if (dstBpp == 16)
+       {
+               if (clrconv->rgb555)
+               {
+                       if (srcBpp == 16)
+                       {
+                               /* convert 15-bit colors to 16-bit colors */
+                               RGB16_RGB15(redBg, greenBg, blueBg, bgcolor);
+                               RGB16_RGB15(redFg, greenFg, blueFg, fgcolor);
+                       }
+               }
+               else
+               {
+                       if (srcBpp == 15)
+                       {
+                               /* convert 15-bit colors to 16-bit colors */
+                               RGB15_RGB16(redBg, greenBg, blueBg, bgcolor);
+                               RGB15_RGB16(redFg, greenFg, blueFg, fgcolor);
+                       }
+               }
+
+               dstData = (uint8*) malloc(width * height * 2);
+               dst16 = (uint16*) dstData;
+
+               for (index = height; index > 0; index--)
+               {
+                       /* each bit encodes a pixel */
+                       bitMask = *srcData;
+                       for (bitIndex = 7; bitIndex >= 0; bitIndex--)
+                       {
+                               if ((bitMask >> bitIndex) & 0x01)
+                               {
+                                       *dst16 = bgcolor;
+                               }
+                               else
+                               {
+                                       *dst16 = fgcolor;
+                               }
+                               dst16++;
+                       }
+                       srcData++;
+               }
+               return dstData;
+       }
+       else if (dstBpp == 32)
+       {
+               dstData = (uint8*) malloc(width * height * 4);
+               dst32 = (uint32*) dstData;
+
+               for (index = height; index > 0; index--)
+               {
+                       /* each bit encodes a pixel */
+                       bitMask = *srcData;
+
+                       for (bitIndex = 7; bitIndex >= 0; bitIndex--)
+                       {
+                               if ((bitMask >> bitIndex) & 0x01)
+                               {
+                                       *dst32 = (clrconv->invert) ? BGR32(redBg, greenBg, blueBg) : RGB32(redBg, greenBg, blueBg);
+                               }
+                               else
+                               {
+                                       *dst32 = (clrconv->invert) ? BGR32(redFg, greenFg, blueFg) : RGB32(redFg, greenFg, blueFg);
+                               }
+                               dst32++;
+                       }
+                       srcData++;
+               }
+               return dstData;
+       }
+
+       return srcData;
+}
+
+void freerdp_alpha_cursor_convert(uint8* alphaData, uint8* xorMask, uint8* andMask, int width, int height, int bpp, HCLRCONV clrconv)
+{
+       int xpixel;
+       int apixel;
+       int i, j, jj;
+
+       for (j = 0; j < height; j++)
+       {
+               jj = (bpp == 1) ? j : (height - 1) - j;
+               for (i = 0; i < width; i++)
+               {
+                       xpixel = freerdp_get_pixel(xorMask, i, jj, width, height, bpp);
+                       xpixel = freerdp_color_convert_rgb(xpixel, bpp, 32, clrconv);
+                       apixel = freerdp_get_pixel(andMask, i, jj, width, height, 1);
+
+                       if (apixel != 0)
+                       {
+                               if ((xpixel & 0xffffff) == 0xffffff)
+                               {
+                                       /* use pattern (not solid black) for xor area */
+                                       xpixel = (i & 1) == (j & 1);
+                                       xpixel = xpixel ? 0xFFFFFF : 0;
+                                       xpixel |= 0xFF000000;
+                               }
+                               else if (xpixel == 0xFF000000)
+                               {
+                                       xpixel = 0;
+                               }
+                       }
+
+                       freerdp_set_pixel(alphaData, i, j, width, height, 32, xpixel);
+               }
+       }
+}
+
+void freerdp_image_swap_color_order(uint8* data, int width, int height)
+{
+       int x, y;
+       uint32* pixel;
+       uint8 a, r, g, b;
+
+       pixel = (uint32*) data;
+
+       for (y = 0; y < height; y++)
+       {
+               for (x = 0; x < width; x++)
+               {
+                       GetARGB32(a, r, g, b, *pixel);
+                       *pixel = ABGR32(a, r, g, b);
+                       pixel++;
+               }
+       }
+}
+
+HCLRCONV freerdp_clrconv_new(uint32 flags)
+{
+       HCLRCONV clrconv = xnew(CLRCONV);
+
+       clrconv->alpha = (flags & CLRCONV_ALPHA) ? true : false;
+       clrconv->invert = (flags & CLRCONV_INVERT) ? true : false;
+       clrconv->rgb555 = (flags & CLRCONV_RGB555) ? true : false;
+       clrconv->palette = xnew(rdpPalette);
+
+       return clrconv;
+}
+
+void freerdp_clrconv_free(HCLRCONV clrconv)
+{
+       if (clrconv != NULL)
+       {
+               if (clrconv->palette != NULL)
+                       xfree(clrconv->palette);
+
+               xfree(clrconv);
+       }
+}
diff --git a/libfreerdp-codec/include/bitmap.c b/libfreerdp-codec/include/bitmap.c
new file mode 100644 (file)
index 0000000..23f021a
--- /dev/null
@@ -0,0 +1,567 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RLE Compressed Bitmap Stream
+ *
+ * Copyright 2011 Jay Sorg <jay.sorg@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* do not compile the file directly */
+
+/**
+ * Write a foreground/background image to a destination buffer.
+ */
+static uint8* WRITEFGBGIMAGE(uint8* pbDest, uint32 rowDelta,
+       uint8 bitmask, PIXEL fgPel, uint32 cBits)
+{
+       PIXEL xorPixel;
+
+       DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+       if (bitmask & g_MaskBit0)
+       {
+               DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+       }
+       else
+       {
+               DESTWRITEPIXEL(pbDest, xorPixel);
+       }
+       DESTNEXTPIXEL(pbDest);
+       cBits = cBits - 1;
+       if (cBits > 0)
+       {
+               DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+               if (bitmask & g_MaskBit1)
+               {
+                       DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+               }
+               else
+               {
+                       DESTWRITEPIXEL(pbDest, xorPixel);
+               }
+               DESTNEXTPIXEL(pbDest);
+               cBits = cBits - 1;
+               if (cBits > 0)
+               {
+                       DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+                       if (bitmask & g_MaskBit2)
+                       {
+                               DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+                       }
+                       else
+                       {
+                               DESTWRITEPIXEL(pbDest, xorPixel);
+                       }
+                       DESTNEXTPIXEL(pbDest);
+                       cBits = cBits - 1;
+                       if (cBits > 0)
+                       {
+                               DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+                               if (bitmask & g_MaskBit3)
+                               {
+                                       DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+                               }
+                               else
+                               {
+                                       DESTWRITEPIXEL(pbDest, xorPixel);
+                               }
+                               DESTNEXTPIXEL(pbDest);
+                               cBits = cBits - 1;
+                               if (cBits > 0)
+                               {
+                                       DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+                                       if (bitmask & g_MaskBit4)
+                                       {
+                                               DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+                                       }
+                                       else
+                                       {
+                                               DESTWRITEPIXEL(pbDest, xorPixel);
+                                       }
+                                       DESTNEXTPIXEL(pbDest);
+                                       cBits = cBits - 1;
+                                       if (cBits > 0)
+                                       {
+                                               DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+                                               if (bitmask & g_MaskBit5)
+                                               {
+                                                       DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+                                               }
+                                               else
+                                               {
+                                                       DESTWRITEPIXEL(pbDest, xorPixel);
+                                               }
+                                               DESTNEXTPIXEL(pbDest);
+                                               cBits = cBits - 1;
+                                               if (cBits > 0)
+                                               {
+                                                       DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+                                                       if (bitmask & g_MaskBit6)
+                                                       {
+                                                               DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+                                                       }
+                                                       else
+                                                       {
+                                                               DESTWRITEPIXEL(pbDest, xorPixel);
+                                                       }
+                                                       DESTNEXTPIXEL(pbDest);
+                                                       cBits = cBits - 1;
+                                                       if (cBits > 0)
+                                                       {
+                                                               DESTREADPIXEL(xorPixel, pbDest - rowDelta);
+                                                               if (bitmask & g_MaskBit7)
+                                                               {
+                                                                       DESTWRITEPIXEL(pbDest, xorPixel ^ fgPel);
+                                                               }
+                                                               else
+                                                               {
+                                                                       DESTWRITEPIXEL(pbDest, xorPixel);
+                                                               }
+                                                               DESTNEXTPIXEL(pbDest);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       return pbDest;
+}
+
+/**
+ * Write a foreground/background image to a destination buffer
+ * for the first line of compressed data.
+ */
+static uint8* WRITEFIRSTLINEFGBGIMAGE(uint8* pbDest, uint8 bitmask,
+       PIXEL fgPel, uint32 cBits)
+{
+       if (bitmask & g_MaskBit0)
+       {
+               DESTWRITEPIXEL(pbDest, fgPel);
+       }
+       else
+       {
+               DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+       }
+       DESTNEXTPIXEL(pbDest);
+       cBits = cBits - 1;
+       if (cBits > 0)
+       {
+               if (bitmask & g_MaskBit1)
+               {
+                       DESTWRITEPIXEL(pbDest, fgPel);
+               }
+               else
+               {
+                       DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+               }
+               DESTNEXTPIXEL(pbDest);
+               cBits = cBits - 1;
+               if (cBits > 0)
+               {
+                       if (bitmask & g_MaskBit2)
+                       {
+                               DESTWRITEPIXEL(pbDest, fgPel);
+                       }
+                       else
+                       {
+                               DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                       }
+                       DESTNEXTPIXEL(pbDest);
+                       cBits = cBits - 1;
+                       if (cBits > 0)
+                       {
+                               if (bitmask & g_MaskBit3)
+                               {
+                                       DESTWRITEPIXEL(pbDest, fgPel);
+                               }
+                               else
+                               {
+                                       DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                               }
+                               DESTNEXTPIXEL(pbDest);
+                               cBits = cBits - 1;
+                               if (cBits > 0)
+                               {
+                                       if (bitmask & g_MaskBit4)
+                                       {
+                                               DESTWRITEPIXEL(pbDest, fgPel);
+                                       }
+                                       else
+                                       {
+                                               DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                                       }
+                                       DESTNEXTPIXEL(pbDest);
+                                       cBits = cBits - 1;
+                                       if (cBits > 0)
+                                       {
+                                               if (bitmask & g_MaskBit5)
+                                               {
+                                                       DESTWRITEPIXEL(pbDest, fgPel);
+                                               }
+                                               else
+                                               {
+                                                       DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                                               }
+                                               DESTNEXTPIXEL(pbDest);
+                                               cBits = cBits - 1;
+                                               if (cBits > 0)
+                                               {
+                                                       if (bitmask & g_MaskBit6)
+                                                       {
+                                                               DESTWRITEPIXEL(pbDest, fgPel);
+                                                       }
+                                                       else
+                                                       {
+                                                               DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                                                       }
+                                                       DESTNEXTPIXEL(pbDest);
+                                                       cBits = cBits - 1;
+                                                       if (cBits > 0)
+                                                       {
+                                                               if (bitmask & g_MaskBit7)
+                                                               {
+                                                                       DESTWRITEPIXEL(pbDest, fgPel);
+                                                               }
+                                                               else
+                                                               {
+                                                                       DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                                                               }
+                                                               DESTNEXTPIXEL(pbDest);
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       return pbDest;
+}
+
+/**
+ * Decompress an RLE compressed bitmap.
+ */
+void RLEDECOMPRESS(uint8* pbSrcBuffer, uint32 cbSrcBuffer, uint8* pbDestBuffer,
+       uint32 rowDelta, uint32 width, uint32 height)
+{
+       uint8* pbSrc = pbSrcBuffer;
+       uint8* pbEnd = pbSrcBuffer + cbSrcBuffer;
+       uint8* pbDest = pbDestBuffer;
+
+       PIXEL temp;
+       PIXEL fgPel = WHITE_PIXEL;
+       boolean fInsertFgPel = false;
+       boolean fFirstLine = true;
+
+       uint8 bitmask;
+       PIXEL pixelA, pixelB;
+
+       uint32 runLength;
+       uint32 code;
+
+       uint32 advance;
+
+       RLEEXTRA
+
+       while (pbSrc < pbEnd)
+       {
+               /* Watch out for the end of the first scanline. */
+               if (fFirstLine)
+               {
+                       if ((uint32)(pbDest - pbDestBuffer) >= rowDelta)
+                       {
+                               fFirstLine = false;
+                               fInsertFgPel = false;
+                       }
+               }
+
+               /*
+                  Extract the compression order code ID from the compression
+                  order header.
+               */
+               code = ExtractCodeId(*pbSrc);
+
+               /* Handle Background Run Orders. */
+               if (code == REGULAR_BG_RUN || code == MEGA_MEGA_BG_RUN)
+               {
+                       runLength = ExtractRunLength(code, pbSrc, &advance);
+                       pbSrc = pbSrc + advance;
+                       if (fFirstLine)
+                       {
+                               if (fInsertFgPel)
+                               {
+                                       DESTWRITEPIXEL(pbDest, fgPel);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                               while (runLength >= UNROLL_COUNT)
+                               {
+                                       UNROLL(
+                                               DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                                               DESTNEXTPIXEL(pbDest); );
+                                       runLength = runLength - UNROLL_COUNT;
+                               }
+                               while (runLength > 0)
+                               {
+                                       DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                       }
+                       else
+                       {
+                               if (fInsertFgPel)
+                               {
+                                       DESTREADPIXEL(temp, pbDest - rowDelta);
+                                       DESTWRITEPIXEL(pbDest, temp ^ fgPel);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                               while (runLength >= UNROLL_COUNT)
+                               {
+                                       UNROLL(
+                                               DESTREADPIXEL(temp, pbDest - rowDelta);
+                                               DESTWRITEPIXEL(pbDest, temp);
+                                               DESTNEXTPIXEL(pbDest); );
+                                       runLength = runLength - UNROLL_COUNT;
+                               }
+                               while (runLength > 0)
+                               {
+                                       DESTREADPIXEL(temp, pbDest - rowDelta);
+                                       DESTWRITEPIXEL(pbDest, temp);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                       }
+                       /* A follow-on background run order will need a foreground pel inserted. */
+                       fInsertFgPel = true;
+                       continue;
+               }
+
+               /* For any of the other run-types a follow-on background run
+                       order does not need a foreground pel inserted. */
+               fInsertFgPel = false;
+
+               switch (code)
+               {
+                       /* Handle Foreground Run Orders. */
+                       case REGULAR_FG_RUN:
+                       case MEGA_MEGA_FG_RUN:
+                       case LITE_SET_FG_FG_RUN:
+                       case MEGA_MEGA_SET_FG_RUN:
+                               runLength = ExtractRunLength(code, pbSrc, &advance);
+                               pbSrc = pbSrc + advance;
+                               if (code == LITE_SET_FG_FG_RUN || code == MEGA_MEGA_SET_FG_RUN)
+                               {
+                                       SRCREADPIXEL(fgPel, pbSrc);
+                                       SRCNEXTPIXEL(pbSrc);
+                               }
+                               if (fFirstLine)
+                               {
+                                       while (runLength >= UNROLL_COUNT)
+                                       {
+                                               UNROLL(
+                                                       DESTWRITEPIXEL(pbDest, fgPel);
+                                                       DESTNEXTPIXEL(pbDest); );
+                                               runLength = runLength - UNROLL_COUNT;
+                                       }
+                                       while (runLength > 0)
+                                       {
+                                               DESTWRITEPIXEL(pbDest, fgPel);
+                                               DESTNEXTPIXEL(pbDest);
+                                               runLength = runLength - 1;
+                                       }
+                               }
+                               else
+                               {
+                                       while (runLength >= UNROLL_COUNT)
+                                       {
+                                               UNROLL(
+                                                       DESTREADPIXEL(temp, pbDest - rowDelta);
+                                                       DESTWRITEPIXEL(pbDest, temp ^ fgPel);
+                                                       DESTNEXTPIXEL(pbDest); );
+                                               runLength = runLength - UNROLL_COUNT;
+                                       }
+                                       while (runLength > 0)
+                                       {
+                                               DESTREADPIXEL(temp, pbDest - rowDelta);
+                                               DESTWRITEPIXEL(pbDest, temp ^ fgPel);
+                                               DESTNEXTPIXEL(pbDest);
+                                               runLength = runLength - 1;
+                                       }
+                               }
+                               break;
+
+                       /* Handle Dithered Run Orders. */
+                       case LITE_DITHERED_RUN:
+                       case MEGA_MEGA_DITHERED_RUN:
+                               runLength = ExtractRunLength(code, pbSrc, &advance);
+                               pbSrc = pbSrc + advance;
+                               SRCREADPIXEL(pixelA, pbSrc);
+                               SRCNEXTPIXEL(pbSrc);
+                               SRCREADPIXEL(pixelB, pbSrc);
+                               SRCNEXTPIXEL(pbSrc);
+                               while (runLength >= UNROLL_COUNT)
+                               {
+                                       UNROLL(
+                                               DESTWRITEPIXEL(pbDest, pixelA);
+                                               DESTNEXTPIXEL(pbDest);
+                                               DESTWRITEPIXEL(pbDest, pixelB);
+                                               DESTNEXTPIXEL(pbDest); );
+                                       runLength = runLength - UNROLL_COUNT;
+                               }
+                               while (runLength > 0)
+                               {
+                                       DESTWRITEPIXEL(pbDest, pixelA);
+                                       DESTNEXTPIXEL(pbDest);
+                                       DESTWRITEPIXEL(pbDest, pixelB);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                               break;
+
+                       /* Handle Color Run Orders. */
+                       case REGULAR_COLOR_RUN:
+                       case MEGA_MEGA_COLOR_RUN:
+                               runLength = ExtractRunLength(code, pbSrc, &advance);
+                               pbSrc = pbSrc + advance;
+                               SRCREADPIXEL(pixelA, pbSrc);
+                               SRCNEXTPIXEL(pbSrc);
+                               while (runLength >= UNROLL_COUNT)
+                               {
+                                       UNROLL(
+                                               DESTWRITEPIXEL(pbDest, pixelA);
+                                               DESTNEXTPIXEL(pbDest); );
+                                       runLength = runLength - UNROLL_COUNT;
+                               }
+                               while (runLength > 0)
+                               {
+                                       DESTWRITEPIXEL(pbDest, pixelA);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                               break;
+
+                       /* Handle Foreground/Background Image Orders. */
+                       case REGULAR_FGBG_IMAGE:
+                       case MEGA_MEGA_FGBG_IMAGE:
+                       case LITE_SET_FG_FGBG_IMAGE:
+                       case MEGA_MEGA_SET_FGBG_IMAGE:
+                               runLength = ExtractRunLength(code, pbSrc, &advance);
+                               pbSrc = pbSrc + advance;
+                               if (code == LITE_SET_FG_FGBG_IMAGE || code == MEGA_MEGA_SET_FGBG_IMAGE)
+                               {
+                                       SRCREADPIXEL(fgPel, pbSrc);
+                                       SRCNEXTPIXEL(pbSrc);
+                               }
+                               if (fFirstLine)
+                               {
+                                       while (runLength > 8)
+                                       {
+                                               bitmask = *pbSrc;
+                                               pbSrc = pbSrc + 1;
+                                               pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, bitmask, fgPel, 8);
+                                               runLength = runLength - 8;
+                                       }
+                               }
+                               else
+                               {
+                                       while (runLength > 8)
+                                       {
+                                               bitmask = *pbSrc;
+                                               pbSrc = pbSrc + 1;
+                                               pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, bitmask, fgPel, 8);
+                                               runLength = runLength - 8;
+                                       }
+                               }
+                               if (runLength > 0)
+                               {
+                                       bitmask = *pbSrc;
+                                       pbSrc = pbSrc + 1;
+                                       if (fFirstLine)
+                                       {
+                                               pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, bitmask, fgPel, runLength);
+                                       }
+                                       else
+                                       {
+                                               pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, bitmask, fgPel, runLength);
+                                       }
+                               }
+                               break;
+
+                       /* Handle Color Image Orders. */
+                       case REGULAR_COLOR_IMAGE:
+                       case MEGA_MEGA_COLOR_IMAGE:
+                               runLength = ExtractRunLength(code, pbSrc, &advance);
+                               pbSrc = pbSrc + advance;
+                               while (runLength >= UNROLL_COUNT)
+                               {
+                                       UNROLL(
+                                               SRCREADPIXEL(temp, pbSrc);
+                                               SRCNEXTPIXEL(pbSrc);
+                                               DESTWRITEPIXEL(pbDest, temp);
+                                               DESTNEXTPIXEL(pbDest); );
+                                       runLength = runLength - UNROLL_COUNT;
+                               }
+                               while (runLength > 0)
+                               {
+                                       SRCREADPIXEL(temp, pbSrc);
+                                       SRCNEXTPIXEL(pbSrc);
+                                       DESTWRITEPIXEL(pbDest, temp);
+                                       DESTNEXTPIXEL(pbDest);
+                                       runLength = runLength - 1;
+                               }
+                               break;
+
+                       /* Handle Special Order 1. */
+                       case SPECIAL_FGBG_1:
+                               pbSrc = pbSrc + 1;
+                               if (fFirstLine)
+                               {
+                                       pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, g_MaskSpecialFgBg1, fgPel, 8);
+                               }
+                               else
+                               {
+                                       pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, g_MaskSpecialFgBg1, fgPel, 8);
+                               }
+                               break;
+
+                       /* Handle Special Order 2. */
+                       case SPECIAL_FGBG_2:
+                               pbSrc = pbSrc + 1;
+                               if (fFirstLine)
+                               {
+                                       pbDest = WRITEFIRSTLINEFGBGIMAGE(pbDest, g_MaskSpecialFgBg2, fgPel, 8);
+                               }
+                               else
+                               {
+                                       pbDest = WRITEFGBGIMAGE(pbDest, rowDelta, g_MaskSpecialFgBg2, fgPel, 8);
+                               }
+                               break;
+
+                               /* Handle White Order. */
+                       case SPECIAL_WHITE:
+                               pbSrc = pbSrc + 1;
+                               DESTWRITEPIXEL(pbDest, WHITE_PIXEL);
+                               DESTNEXTPIXEL(pbDest);
+                               break;
+
+                       /* Handle Black Order. */
+                       case SPECIAL_BLACK:
+                               pbSrc = pbSrc + 1;
+                               DESTWRITEPIXEL(pbDest, BLACK_PIXEL);
+                               DESTNEXTPIXEL(pbDest);
+                               break;
+               }
+       }
+}
diff --git a/libfreerdp-codec/nsc.c b/libfreerdp-codec/nsc.c
new file mode 100644 (file)
index 0000000..a39bdd3
--- /dev/null
@@ -0,0 +1,380 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * NSCodec Codec
+ *
+ * Copyright 2011 Samsung, Author Jiten Pathy
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <freerdp/codec/nsc.h>
+#include <freerdp/utils/memory.h>
+
+/* we store the 9th bits at the end of stream as bitstream */
+void nsc_cl_expand(STREAM* stream, uint8 shiftcount, uint32 origsz)
+{
+       uint8* sbitstream;
+       uint8* temptr;
+       uint8 sign,bitoff;
+       uint32 bitno;
+       sbitstream = stream->data + origsz;
+
+       do
+       {
+               sign = (*(stream->p) << (shiftcount - 1)) & 0x80;
+               bitno = stream->p - stream->data;
+               *(stream->p++) <<= shiftcount;
+               temptr = sbitstream + ((bitno) >> 3);
+               bitoff = bitno % 0x8; 
+               (*temptr) |= (sign >> bitoff);
+       }
+       while (((uint32)(stream->p - stream->data)) < origsz);
+
+       stream->p = stream->data;
+}
+
+void nsc_chroma_supersample(NSC_CONTEXT* context)
+{
+       int i;
+       uint8* cur;
+       uint8* tptr;
+       uint8* nbitstream;
+       uint8* sbitstream;
+       uint8 val, bitoff, sign;
+       uint16 w, h, pw, row;
+       uint32 alloclen, orglen, bytno;
+       STREAM* new_s;
+       STREAM* temp;
+
+       w = context->width;
+       h = context->height;
+       alloclen = orglen = w * h;
+       pw = ROUND_UP_TO(context->width, 8);
+       temp = stream_new(0);
+
+       for (i = 0; i < 3; i++)
+       {
+               if (i != 0)
+                       alloclen = orglen + ((orglen & 0x7) ? (orglen >> 3) + 0x1 : (orglen >> 3));
+
+               new_s = stream_new(alloclen);
+               stream_attach(temp, context->org_buf[i]->data, context->org_buf[i]->size);
+
+               sbitstream = temp->data + context->OrgByteCount[i];
+               nbitstream = new_s->data + orglen;
+               cur  = new_s->p;
+
+               if (i == 1)
+                       pw >>= 1;
+
+               while (((uint32)(temp->p - temp->data)) < context->OrgByteCount[i])
+               {
+                       bytno = temp->p - temp->data;
+                       bitoff = bytno % 0x8; 
+                       stream_read_uint8(temp, val);
+                       *cur = val;
+                       row = (temp->p - temp->data) % pw;
+
+                       if (i == 0)
+                       {
+                               cur++;
+                               if (row >= w)
+                                       stream_seek(temp, pw-row);
+                       }
+                       else
+                       {
+                               tptr = sbitstream + ((bytno) >> 3);
+                               sign = ((*tptr) << bitoff) & 0x80;
+                               bytno = cur - new_s->data;
+                               bitoff = bytno % 8;
+                               *(nbitstream + (bytno >> 3)) |= (sign >> bitoff);
+
+                               if ((bytno+w) < orglen)
+                               {
+                                       *(cur + w) = val;
+                                       bitoff = (bytno + w) % 8;
+                                       *(nbitstream + ((bytno + w) >> 3)) |= (sign >> bitoff);
+                               }
+
+                               if ((bytno+1) % w)
+                               {
+                                       *(cur+1) = val;
+                                       bitoff = (bytno + 1) % 8;
+                                       *(nbitstream + ((bytno + 1) >> 3)) |= (sign >> bitoff);
+                                       if ((bytno+w) < orglen)
+                                       {
+                                               *(cur+w+1) = val;
+                                               bitoff = (bytno + w + 1) % 8;
+                                               *(nbitstream + ((bytno + w + 1) >> 3)) |= (sign >> bitoff);
+                                       }
+                               }
+
+                               cur += 2;
+                               bytno = cur - new_s->data;
+
+                               if (((bytno/w) < h) && ((bytno) % w) < 2 )
+                               {
+                                       if (w % 2)
+                                               cur += w-1;
+                                       else
+                                               cur += w;
+                               }
+
+                               if ((row*2) >= w)
+                                       stream_seek(temp, pw-row);
+                       }
+               }
+
+               xfree(temp->data);
+               stream_detach(temp);
+               stream_attach(context->org_buf[i], new_s->data, new_s->size);
+               context->OrgByteCount[i] = orglen;
+       }
+}
+
+void nsc_ycocg_rgb(NSC_CONTEXT* context)
+{
+       uint8* sbitstream[2];
+       uint8 bitoff, sign[2], i, val, tmp;
+       sint16 rgb[3], ycocg[3];
+       uint32 bytno, size;
+       size = context->OrgByteCount[0];
+
+       for (i = 1; i < 3; i++)
+               sbitstream[i-1] = context->org_buf[i]->data + context->OrgByteCount[i];
+
+       do
+       {
+               for (i = 0; i < 3; i++)
+                       ycocg[i] = *(context->org_buf[i]->p);
+
+               for (i = 1; i < 3; i++)
+               {
+                       bytno = context->OrgByteCount[i] - size;
+                       bitoff = bytno % 8;
+                       sign[i-1] = (*(sbitstream[i-1] + (bytno >> 3)) >> (7 - bitoff)) & 0x1;
+                       ycocg[i] = (((sint16)(0 - sign[i-1])) << 8) | ycocg[i];
+               }
+
+               rgb[0] = ycocg[0] + (ycocg[1] >> 1) - (ycocg[2] >> 1);
+               rgb[1] = ycocg[0] + (ycocg[2] >> 1);
+               rgb[2] = ycocg[0] - (ycocg[1] >> 1) - (ycocg[2] >> 1);
+
+               for (i = 0; i < 3; i++)
+               {
+                       tmp = (rgb[i] >> 8) & 0xff;
+                       if (tmp == 0xff)
+                               val = 0x00;
+                       else if (tmp == 0x1)
+                               val = 0xff;
+                       else
+                               val = (uint8) rgb[i];
+
+                       stream_write_uint8(context->org_buf[i], val);
+               }
+
+               size--;
+       }
+       while (size);
+
+       for (i = 0; i < 3; i++)
+               context->org_buf[i]->p = context->org_buf[i]->data;
+}
+
+void nsc_colorloss_recover(NSC_CONTEXT* context)
+{
+       int i;
+       uint8 cllvl;
+       cllvl = context->nsc_stream->colorLossLevel;
+
+       for (i = 1; i < 3; i++)
+               nsc_cl_expand(context->org_buf[i], cllvl, context->OrgByteCount[i]);
+}
+
+void nsc_rle_decode(STREAM* in, STREAM* out, uint32 origsz)
+{
+       uint32 i;
+       uint8 value;
+       i = origsz;
+
+       while (i > 4)
+       {
+               stream_read_uint8(in, value);
+
+               if (i == 5)
+               {
+                       stream_write_uint8(out,value);
+                       i-=1;
+               }
+               else if (value == *(in->p))
+               {
+                       stream_seek(in, 1);
+
+                       if (*(in->p) < 0xFF)
+                       {
+                               uint8 len;
+                               stream_read_uint8(in, len);
+                               stream_set_byte(out, value, len+2);
+                               i -= (len+2);
+                       }
+                       else
+                       {
+                               uint32 len;
+                               stream_seek(in, 1);
+                               stream_read_uint32(in, len);
+                               stream_set_byte(out, value, len);
+                               i -= len;
+                       }
+               }
+               else
+               {
+                       stream_write_uint8(out, value);
+                       i -= 1;
+               }
+       }
+
+       stream_copy(out, in, 4);
+}
+
+void nsc_rle_decompress_data(NSC_CONTEXT* context)
+{
+       STREAM* rles;
+       uint16 i;
+       uint32 origsize;
+       rles = stream_new(0);
+       rles->p = rles->data = context->nsc_stream->pdata->p;
+       rles->size = context->nsc_stream->pdata->size;
+
+       for (i = 0; i < 4; i++)
+       {
+               origsize = context->OrgByteCount[i];
+
+               if (i == 3 && context->nsc_stream->PlaneByteCount[i] == 0)
+                       stream_set_byte(context->org_buf[i], 0xff, origsize);
+               else if (context->nsc_stream->PlaneByteCount[i] < origsize)
+                       nsc_rle_decode(rles, context->org_buf[i], origsize);
+               else
+                       stream_copy(context->org_buf[i], rles, origsize);
+
+               context->org_buf[i]->p = context->org_buf[i]->data;
+       }
+}
+
+void nsc_combine_argb(NSC_CONTEXT* context)
+{
+       int i;
+       uint8* bmp;
+       bmp = context->bmpdata;
+
+       for (i = 0; i < (context->width * context->height); i++)
+       {
+               stream_read_uint8(context->org_buf[2], *bmp++);
+               stream_read_uint8(context->org_buf[1], *bmp++);
+               stream_read_uint8(context->org_buf[0], *bmp++);
+               stream_read_uint8(context->org_buf[3], *bmp++);
+       }
+}
+
+void nsc_stream_initialize(NSC_CONTEXT* context, STREAM* s)
+{
+       int i;
+
+       for (i = 0; i < 4; i++)
+               stream_read_uint32(s, context->nsc_stream->PlaneByteCount[i]);
+
+       stream_read_uint8(s, context->nsc_stream->colorLossLevel);
+       stream_read_uint8(s, context->nsc_stream->ChromaSubSamplingLevel);
+       stream_seek(s, 2);
+
+       context->nsc_stream->pdata = stream_new(0);
+       stream_attach(context->nsc_stream->pdata, s->p, BYTESUM(context->nsc_stream->PlaneByteCount));
+}
+
+void nsc_context_initialize(NSC_CONTEXT* context, STREAM* s)
+{
+       int i;
+       uint32 tempsz;
+       nsc_stream_initialize(context, s);
+       context->bmpdata = xzalloc(context->width * context->height * 4);
+
+       for (i = 0; i < 4; i++)
+               context->OrgByteCount[i]=context->width * context->height;
+
+       if (context->nsc_stream->ChromaSubSamplingLevel > 0)    /* [MS-RDPNSC] 2.2 */
+       {
+               uint32 tempWidth,tempHeight;
+               tempWidth = ROUND_UP_TO(context->width, 8);
+               context->OrgByteCount[0] = tempWidth * context->height;
+               tempWidth = tempWidth >> 1 ;
+               tempHeight = ROUND_UP_TO(context->height, 2);
+               tempHeight = tempHeight >> 1;
+               context->OrgByteCount[1] = tempWidth * tempHeight;
+               context->OrgByteCount[2] = tempWidth * tempHeight;
+       }
+       for (i = 0; i < 4; i++)
+       {
+               tempsz = context->OrgByteCount[i];
+
+               if (i == 1 || i == 2)
+                       tempsz += (tempsz & 0x7) ? (tempsz >> 3) + 0x1 : (tempsz >> 3); /* extra bytes/8 bytes for bitstream to store the 9th bit after colorloss recover */
+
+               context->org_buf[i] = stream_new(tempsz);
+       }
+}
+
+void nsc_context_destroy(NSC_CONTEXT* context)
+{
+       int i;
+
+       for (i = 0;i < 4; i++)
+               stream_free(context->org_buf[i]);
+
+       stream_detach(context->nsc_stream->pdata);
+       xfree(context->bmpdata);
+}
+
+NSC_CONTEXT* nsc_context_new(void)
+{
+       NSC_CONTEXT* nsc_context;
+       nsc_context = xnew(NSC_CONTEXT);
+       nsc_context->nsc_stream = xnew(NSC_STREAM);
+       return nsc_context;
+}
+
+void nsc_process_message(NSC_CONTEXT* context, uint8* data, uint32 length)
+{
+       STREAM* s;
+       s = stream_new(0);
+       stream_attach(s, data, length);
+       nsc_context_initialize(context, s);
+
+       /* RLE decode */
+       nsc_rle_decompress_data(context);
+
+       /* colorloss recover */
+       nsc_colorloss_recover(context);
+
+       /* Chroma supersample */
+       if (context->nsc_stream->ChromaSubSamplingLevel > 0)
+               nsc_chroma_supersample(context);
+       
+       /* YCoCg to RGB Convert */
+       nsc_ycocg_rgb(context);
+
+       /* Combine ARGB planes */
+       nsc_combine_argb(context);
+}
diff --git a/libfreerdp-codec/rfx.c b/libfreerdp-codec/rfx.c
new file mode 100644 (file)
index 0000000..9a62ddb
--- /dev/null
@@ -0,0 +1,894 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/constants.h>
+
+#include "rfx_constants.h"
+#include "rfx_types.h"
+#include "rfx_pool.h"
+#include "rfx_decode.h"
+#include "rfx_encode.h"
+#include "rfx_quantization.h"
+#include "rfx_dwt.h"
+
+#ifdef WITH_SSE2
+#include "rfx_sse2.h"
+#endif
+
+#ifdef WITH_NEON
+#include "rfx_neon.h"
+#endif
+
+#ifndef RFX_INIT_SIMD
+#define RFX_INIT_SIMD(_rfx_context) do { } while (0)
+#endif
+
+/**
+ * The quantization values control the compression rate and quality. The value
+ * range is between 6 and 15. The higher value, the higher compression rate
+ * and lower quality.
+ *
+ * This is the default values being use by the MS RDP server, and we will also
+ * use it as our default values for the encoder. It can be overrided by setting
+ * the context->num_quants and context->quants member.
+ *
+ * The order of the values are:
+ * LL3, LH3, HL3, HH3, LH2, HL2, HH2, LH1, HL1, HH1
+ */
+static const uint32 rfx_default_quantization_values[] =
+{
+       6, 6, 6, 6, 7, 7, 8, 8, 8, 9
+};
+
+static void rfx_profiler_create(RFX_CONTEXT* context)
+{
+       PROFILER_CREATE(context->priv->prof_rfx_decode_rgb, "rfx_decode_rgb");
+       PROFILER_CREATE(context->priv->prof_rfx_decode_component, "rfx_decode_component");
+       PROFILER_CREATE(context->priv->prof_rfx_rlgr_decode, "rfx_rlgr_decode");
+       PROFILER_CREATE(context->priv->prof_rfx_differential_decode, "rfx_differential_decode");
+       PROFILER_CREATE(context->priv->prof_rfx_quantization_decode, "rfx_quantization_decode");
+       PROFILER_CREATE(context->priv->prof_rfx_dwt_2d_decode, "rfx_dwt_2d_decode");
+       PROFILER_CREATE(context->priv->prof_rfx_decode_ycbcr_to_rgb, "rfx_decode_ycbcr_to_rgb");
+       PROFILER_CREATE(context->priv->prof_rfx_decode_format_rgb, "rfx_decode_format_rgb");
+
+       PROFILER_CREATE(context->priv->prof_rfx_encode_rgb, "rfx_encode_rgb");
+       PROFILER_CREATE(context->priv->prof_rfx_encode_component, "rfx_encode_component");
+       PROFILER_CREATE(context->priv->prof_rfx_rlgr_encode, "rfx_rlgr_encode");
+       PROFILER_CREATE(context->priv->prof_rfx_differential_encode, "rfx_differential_encode");
+       PROFILER_CREATE(context->priv->prof_rfx_quantization_encode, "rfx_quantization_encode");
+       PROFILER_CREATE(context->priv->prof_rfx_dwt_2d_encode, "rfx_dwt_2d_encode");
+       PROFILER_CREATE(context->priv->prof_rfx_encode_rgb_to_ycbcr, "rfx_encode_rgb_to_ycbcr");
+       PROFILER_CREATE(context->priv->prof_rfx_encode_format_rgb, "rfx_encode_format_rgb");
+}
+
+static void rfx_profiler_free(RFX_CONTEXT* context)
+{
+       PROFILER_FREE(context->priv->prof_rfx_decode_rgb);
+       PROFILER_FREE(context->priv->prof_rfx_decode_component);
+       PROFILER_FREE(context->priv->prof_rfx_rlgr_decode);
+       PROFILER_FREE(context->priv->prof_rfx_differential_decode);
+       PROFILER_FREE(context->priv->prof_rfx_quantization_decode);
+       PROFILER_FREE(context->priv->prof_rfx_dwt_2d_decode);
+       PROFILER_FREE(context->priv->prof_rfx_decode_ycbcr_to_rgb);
+       PROFILER_FREE(context->priv->prof_rfx_decode_format_rgb);
+
+       PROFILER_FREE(context->priv->prof_rfx_encode_rgb);
+       PROFILER_FREE(context->priv->prof_rfx_encode_component);
+       PROFILER_FREE(context->priv->prof_rfx_rlgr_encode);
+       PROFILER_FREE(context->priv->prof_rfx_differential_encode);
+       PROFILER_FREE(context->priv->prof_rfx_quantization_encode);
+       PROFILER_FREE(context->priv->prof_rfx_dwt_2d_encode);
+       PROFILER_FREE(context->priv->prof_rfx_encode_rgb_to_ycbcr);
+       PROFILER_FREE(context->priv->prof_rfx_encode_format_rgb);
+}
+
+static void rfx_profiler_print(RFX_CONTEXT* context)
+{
+       PROFILER_PRINT_HEADER;
+
+       PROFILER_PRINT(context->priv->prof_rfx_decode_rgb);
+       PROFILER_PRINT(context->priv->prof_rfx_decode_component);
+       PROFILER_PRINT(context->priv->prof_rfx_rlgr_decode);
+       PROFILER_PRINT(context->priv->prof_rfx_differential_decode);
+       PROFILER_PRINT(context->priv->prof_rfx_quantization_decode);
+       PROFILER_PRINT(context->priv->prof_rfx_dwt_2d_decode);
+       PROFILER_PRINT(context->priv->prof_rfx_decode_ycbcr_to_rgb);
+       PROFILER_PRINT(context->priv->prof_rfx_decode_format_rgb);
+
+       PROFILER_PRINT(context->priv->prof_rfx_encode_rgb);
+       PROFILER_PRINT(context->priv->prof_rfx_encode_component);
+       PROFILER_PRINT(context->priv->prof_rfx_rlgr_encode);
+       PROFILER_PRINT(context->priv->prof_rfx_differential_encode);
+       PROFILER_PRINT(context->priv->prof_rfx_quantization_encode);
+       PROFILER_PRINT(context->priv->prof_rfx_dwt_2d_encode);
+       PROFILER_PRINT(context->priv->prof_rfx_encode_rgb_to_ycbcr);
+       PROFILER_PRINT(context->priv->prof_rfx_encode_format_rgb);
+
+       PROFILER_PRINT_FOOTER;
+}
+
+RFX_CONTEXT* rfx_context_new(void)
+{
+       RFX_CONTEXT* context;
+
+       context = xnew(RFX_CONTEXT);
+       context->priv = xnew(RFX_CONTEXT_PRIV);
+       context->priv->pool = rfx_pool_new();
+
+       /* initialize the default pixel format */
+       rfx_context_set_pixel_format(context, RFX_PIXEL_FORMAT_BGRA);
+
+       /* align buffers to 16 byte boundary (needed for SSE/SSE2 instructions) */
+       context->priv->y_r_buffer = (sint16*)(((uintptr_t)context->priv->y_r_mem + 16) & ~ 0x0F);
+       context->priv->cb_g_buffer = (sint16*)(((uintptr_t)context->priv->cb_g_mem + 16) & ~ 0x0F);
+       context->priv->cr_b_buffer = (sint16*)(((uintptr_t)context->priv->cr_b_mem + 16) & ~ 0x0F);
+
+       context->priv->dwt_buffer = (sint16*)(((uintptr_t)context->priv->dwt_mem + 16) & ~ 0x0F);
+
+       /* create profilers for default decoding routines */
+       rfx_profiler_create(context);
+       
+       /* set up default routines */
+       context->decode_ycbcr_to_rgb = rfx_decode_ycbcr_to_rgb;
+       context->encode_rgb_to_ycbcr = rfx_encode_rgb_to_ycbcr;
+       context->quantization_decode = rfx_quantization_decode; 
+       context->quantization_encode = rfx_quantization_encode; 
+       context->dwt_2d_decode = rfx_dwt_2d_decode;
+       context->dwt_2d_encode = rfx_dwt_2d_encode;
+
+       return context;
+}
+
+void rfx_context_set_cpu_opt(RFX_CONTEXT* context, uint32 cpu_opt)
+{
+       /* enable SIMD CPU acceleration if detected */
+       if (cpu_opt & CPU_SSE2)
+               RFX_INIT_SIMD(context);
+}
+
+void rfx_context_free(RFX_CONTEXT* context)
+{
+       xfree(context->quants);
+
+       rfx_pool_free(context->priv->pool);
+
+       rfx_profiler_print(context);
+       rfx_profiler_free(context);
+
+       xfree(context->priv);
+       xfree(context);
+}
+
+void rfx_context_set_pixel_format(RFX_CONTEXT* context, RFX_PIXEL_FORMAT pixel_format)
+{
+       context->pixel_format = pixel_format;
+       switch (pixel_format)
+       {
+               case RFX_PIXEL_FORMAT_BGRA:
+               case RFX_PIXEL_FORMAT_RGBA:
+                       context->bits_per_pixel = 32;
+                       break;
+               case RFX_PIXEL_FORMAT_BGR:
+               case RFX_PIXEL_FORMAT_RGB:
+                       context->bits_per_pixel = 24;
+                       break;
+               case RFX_PIXEL_FORMAT_BGR565_LE:
+               case RFX_PIXEL_FORMAT_RGB565_LE:
+                       context->bits_per_pixel = 16;
+                       break;
+               case RFX_PIXEL_FORMAT_PALETTE4_PLANER:
+                       context->bits_per_pixel = 4;
+                       break;
+               case RFX_PIXEL_FORMAT_PALETTE8:
+                       context->bits_per_pixel = 8;
+                       break;
+               default:
+                       context->bits_per_pixel = 0;
+                       break;
+       }
+}
+
+void rfx_context_reset(RFX_CONTEXT* context)
+{
+       context->header_processed = false;
+       context->frame_idx = 0;
+}
+
+static void rfx_process_message_sync(RFX_CONTEXT* context, STREAM* s)
+{
+       uint32 magic;
+
+       /* RFX_SYNC */
+       stream_read_uint32(s, magic); /* magic (4 bytes), 0xCACCACCA */
+
+       if (magic != WF_MAGIC)
+       {
+               DEBUG_WARN("invalid magic number 0x%X", magic);
+               return;
+       }
+
+       stream_read_uint16(s, context->version); /* version (2 bytes), WF_VERSION_1_0 (0x0100) */
+
+       if (context->version != WF_VERSION_1_0)
+       {
+               DEBUG_WARN("unknown version number 0x%X", context->version);
+               return;
+       }
+
+       DEBUG_RFX("version 0x%X", context->version);
+}
+
+static void rfx_process_message_codec_versions(RFX_CONTEXT* context, STREAM* s)
+{
+       uint8 numCodecs;
+
+       stream_read_uint8(s, numCodecs); /* numCodecs (1 byte), must be set to 0x01 */
+
+       if (numCodecs != 1)
+       {
+               DEBUG_WARN("numCodecs: %d, expected:1", numCodecs);
+               return;
+       }
+
+       /* RFX_CODEC_VERSIONT */
+       stream_read_uint8(s, context->codec_id); /* codecId (1 byte) */
+       stream_read_uint8(s, context->codec_version); /* version (2 bytes) */
+
+       DEBUG_RFX("id %d version 0x%X.", context->codec_id, context->codec_version);
+}
+
+static void rfx_process_message_channels(RFX_CONTEXT* context, STREAM* s)
+{
+       uint8 channelId;
+       uint8 numChannels;
+
+       stream_read_uint8(s, numChannels); /* numChannels (1 byte), must bet set to 0x01 */
+
+       /* In RDVH sessions, numChannels will represent the number of virtual monitors 
+        * configured and does not always be set to 0x01 as [MS-RDPRFX] said.
+        */
+       if (numChannels < 1)
+       {
+               DEBUG_WARN("numChannels:%d, expected:1", numChannels);
+               return;
+       }
+
+       /* RFX_CHANNELT */
+       stream_read_uint8(s, channelId); /* channelId (1 byte) */
+       stream_read_uint16(s, context->width); /* width (2 bytes) */
+       stream_read_uint16(s, context->height); /* height (2 bytes) */
+
+       /* Now, only the first monitor can be used, therefore the other channels will be ignored. */
+       stream_seek(s, 5 * (numChannels - 1));
+
+       DEBUG_RFX("numChannels %d id %d, %dx%d.",
+               numChannels, channelId, context->width, context->height);
+}
+
+static void rfx_process_message_context(RFX_CONTEXT* context, STREAM* s)
+{
+       uint8 ctxId;
+       uint16 tileSize;
+       uint16 properties;
+
+       stream_read_uint8(s, ctxId); /* ctxId (1 byte), must be set to 0x00 */
+       stream_read_uint16(s, tileSize); /* tileSize (2 bytes), must be set to CT_TILE_64x64 (0x0040) */
+       stream_read_uint16(s, properties); /* properties (2 bytes) */
+
+       DEBUG_RFX("ctxId %d tileSize %d properties 0x%X.", ctxId, tileSize, properties);
+
+       context->properties = properties;
+       context->flags = (properties & 0x0007);
+
+       if (context->flags == CODEC_MODE)
+               DEBUG_RFX("codec is in image mode.");
+       else
+               DEBUG_RFX("codec is in video mode.");
+
+       switch ((properties & 0x1E00) >> 9)
+       {
+               case CLW_ENTROPY_RLGR1:
+                       context->mode = RLGR1;
+                       DEBUG_RFX("RLGR1.");
+                       break;
+
+               case CLW_ENTROPY_RLGR3:
+                       context->mode = RLGR3;
+                       DEBUG_RFX("RLGR3.");
+                       break;
+
+               default:
+                       DEBUG_WARN("unknown RLGR algorithm.");
+                       break;
+       }
+}
+
+static void rfx_process_message_frame_begin(RFX_CONTEXT* context, RFX_MESSAGE* message, STREAM* s)
+{
+       uint32 frameIdx;
+       uint16 numRegions;
+
+       stream_read_uint32(s, frameIdx); /* frameIdx (4 bytes), if codec is in video mode, must be ignored */
+       stream_read_uint16(s, numRegions); /* numRegions (2 bytes) */
+
+       DEBUG_RFX("RFX_FRAME_BEGIN: frameIdx:%d numRegions:%d", frameIdx, numRegions);
+}
+
+static void rfx_process_message_frame_end(RFX_CONTEXT* context, RFX_MESSAGE* message, STREAM* s)
+{
+       DEBUG_RFX("RFX_FRAME_END");
+}
+
+static void rfx_process_message_region(RFX_CONTEXT* context, RFX_MESSAGE* message, STREAM* s)
+{
+       int i;
+
+       stream_seek_uint8(s); /* regionFlags (1 byte) */
+       stream_read_uint16(s, message->num_rects); /* numRects (2 bytes) */
+
+       if (message->num_rects < 1)
+       {
+               DEBUG_WARN("no rects.");
+               return;
+       }
+
+       if (message->rects != NULL)
+               message->rects = (RFX_RECT*) xrealloc(message->rects, message->num_rects * sizeof(RFX_RECT));
+       else
+               message->rects = (RFX_RECT*) xmalloc(message->num_rects * sizeof(RFX_RECT));
+
+       /* rects */
+       for (i = 0; i < message->num_rects; i++)
+       {
+               /* RFX_RECT */
+               stream_read_uint16(s, message->rects[i].x); /* x (2 bytes) */
+               stream_read_uint16(s, message->rects[i].y); /* y (2 bytes) */
+               stream_read_uint16(s, message->rects[i].width); /* width (2 bytes) */
+               stream_read_uint16(s, message->rects[i].height); /* height (2 bytes) */
+
+               DEBUG_RFX("rect %d (%d %d %d %d).",
+                       i, message->rects[i].x, message->rects[i].y, message->rects[i].width, message->rects[i].height);
+       }
+}
+
+static void rfx_process_message_tile(RFX_CONTEXT* context, RFX_TILE* tile, STREAM* s)
+{
+       uint8 quantIdxY;
+       uint8 quantIdxCb;
+       uint8 quantIdxCr;
+       uint16 xIdx, yIdx;
+       uint16 YLen, CbLen, CrLen;
+
+       /* RFX_TILE */
+       stream_read_uint8(s, quantIdxY); /* quantIdxY (1 byte) */
+       stream_read_uint8(s, quantIdxCb); /* quantIdxCb (1 byte) */
+       stream_read_uint8(s, quantIdxCr); /* quantIdxCr (1 byte) */
+       stream_read_uint16(s, xIdx); /* xIdx (2 bytes) */
+       stream_read_uint16(s, yIdx); /* yIdx (2 bytes) */
+       stream_read_uint16(s, YLen); /* YLen (2 bytes) */
+       stream_read_uint16(s, CbLen); /* CbLen (2 bytes) */
+       stream_read_uint16(s, CrLen); /* CrLen (2 bytes) */
+
+       DEBUG_RFX("quantIdxY:%d quantIdxCb:%d quantIdxCr:%d xIdx:%d yIdx:%d YLen:%d CbLen:%d CrLen:%d",
+               quantIdxY, quantIdxCb, quantIdxCr, xIdx, yIdx, YLen, CbLen, CrLen);
+
+       tile->x = xIdx * 64;
+       tile->y = yIdx * 64;
+
+       rfx_decode_rgb(context, s,
+               YLen, context->quants + (quantIdxY * 10),
+               CbLen, context->quants + (quantIdxCb * 10),
+               CrLen, context->quants + (quantIdxCr * 10),
+               tile->data);
+}
+
+static void rfx_process_message_tileset(RFX_CONTEXT* context, RFX_MESSAGE* message, STREAM* s)
+{
+       int i;
+       uint16 subtype;
+       uint32 blockLen;
+       uint32 blockType;
+       uint32 tilesDataSize;
+       uint32* quants;
+       uint8 quant;
+       int pos;
+
+       stream_read_uint16(s, subtype); /* subtype (2 bytes) must be set to CBT_TILESET (0xCAC2) */
+
+       if (subtype != CBT_TILESET)
+       {
+               DEBUG_WARN("invalid subtype, expected CBT_TILESET.");
+               return;
+       }
+
+       stream_seek_uint16(s); /* idx (2 bytes), must be set to 0x0000 */
+       stream_seek_uint16(s); /* properties (2 bytes) */
+
+       stream_read_uint8(s, context->num_quants); /* numQuant (1 byte) */
+       stream_seek_uint8(s); /* tileSize (1 byte), must be set to 0x40 */
+
+       if (context->num_quants < 1)
+       {
+               DEBUG_WARN("no quantization value.");
+               return;
+       }
+
+       stream_read_uint16(s, message->num_tiles); /* numTiles (2 bytes) */
+
+       if (message->num_tiles < 1)
+       {
+               DEBUG_WARN("no tiles.");
+               return;
+       }
+
+       stream_read_uint32(s, tilesDataSize); /* tilesDataSize (4 bytes) */
+
+       if (context->quants != NULL)
+               context->quants = (uint32*) xrealloc((void*) context->quants, context->num_quants * 10 * sizeof(uint32));
+       else
+               context->quants = (uint32*) xmalloc(context->num_quants * 10 * sizeof(uint32));
+       quants = context->quants;
+
+       /* quantVals */
+       for (i = 0; i < context->num_quants; i++)
+       {
+               /* RFX_CODEC_QUANT */
+               stream_read_uint8(s, quant);
+               *quants++ = (quant & 0x0F);
+               *quants++ = (quant >> 4);
+               stream_read_uint8(s, quant);
+               *quants++ = (quant & 0x0F);
+               *quants++ = (quant >> 4);
+               stream_read_uint8(s, quant);
+               *quants++ = (quant & 0x0F);
+               *quants++ = (quant >> 4);
+               stream_read_uint8(s, quant);
+               *quants++ = (quant & 0x0F);
+               *quants++ = (quant >> 4);
+               stream_read_uint8(s, quant);
+               *quants++ = (quant & 0x0F);
+               *quants++ = (quant >> 4);
+
+               DEBUG_RFX("quant %d (%d %d %d %d %d %d %d %d %d %d).",
+                       i, context->quants[i * 10], context->quants[i * 10 + 1],
+                       context->quants[i * 10 + 2], context->quants[i * 10 + 3],
+                       context->quants[i * 10 + 4], context->quants[i * 10 + 5],
+                       context->quants[i * 10 + 6], context->quants[i * 10 + 7],
+                       context->quants[i * 10 + 8], context->quants[i * 10 + 9]);
+       }
+
+       message->tiles = rfx_pool_get_tiles(context->priv->pool, message->num_tiles);
+
+       /* tiles */
+       for (i = 0; i < message->num_tiles; i++)
+       {
+               /* RFX_TILE */
+               stream_read_uint16(s, blockType); /* blockType (2 bytes), must be set to CBT_TILE (0xCAC3) */
+               stream_read_uint32(s, blockLen); /* blockLen (4 bytes) */
+
+               pos = stream_get_pos(s) - 6 + blockLen;
+
+               if (blockType != CBT_TILE)
+               {
+                       DEBUG_WARN("unknown block type 0x%X, expected CBT_TILE (0xCAC3).", blockType);
+                       break;
+               }
+
+               rfx_process_message_tile(context, message->tiles[i], s);
+
+               stream_set_pos(s, pos);
+       }
+}
+
+RFX_MESSAGE* rfx_process_message(RFX_CONTEXT* context, uint8* data, uint32 length)
+{
+       int pos;
+       STREAM* s;
+       uint32 blockLen;
+       uint32 blockType;
+       RFX_MESSAGE* message;
+
+       s = stream_new(0);
+       message = xnew(RFX_MESSAGE);
+       stream_attach(s, data, length);
+
+       while (stream_get_left(s) > 6)
+       {
+               /* RFX_BLOCKT */
+               stream_read_uint16(s, blockType); /* blockType (2 bytes) */
+               stream_read_uint32(s, blockLen); /* blockLen (4 bytes) */
+
+               DEBUG_RFX("blockType 0x%X blockLen %d", blockType, blockLen);
+
+               if (blockLen == 0)
+               {
+                       DEBUG_WARN("zero blockLen");
+                       break;
+               }
+
+               pos = stream_get_pos(s) - 6 + blockLen;
+
+               if (blockType >= WBT_CONTEXT && blockType <= WBT_EXTENSION)
+               {
+                       /* RFX_CODEC_CHANNELT */
+                       /* codecId (1 byte) must be set to 0x01 */
+                       /* channelId (1 byte) must be set to 0x00 */
+                       stream_seek(s, 2);
+               }
+
+               switch (blockType)
+               {
+                       case WBT_SYNC:
+                               rfx_process_message_sync(context, s);
+                               break;
+
+                       case WBT_CODEC_VERSIONS:
+                               rfx_process_message_codec_versions(context, s);
+                               break;
+
+                       case WBT_CHANNELS:
+                               rfx_process_message_channels(context, s);
+                               break;
+
+                       case WBT_CONTEXT:
+                               rfx_process_message_context(context, s);
+                               break;
+
+                       case WBT_FRAME_BEGIN:
+                               rfx_process_message_frame_begin(context, message, s);
+                               break;
+
+                       case WBT_FRAME_END:
+                               rfx_process_message_frame_end(context, message, s);
+                               break;
+
+                       case WBT_REGION:
+                               rfx_process_message_region(context, message, s);
+                               break;
+
+                       case WBT_EXTENSION:
+                               rfx_process_message_tileset(context, message, s);
+                               break;
+
+                       default:
+                               DEBUG_WARN("unknown blockType 0x%X", blockType);
+                               break;
+               }
+
+               stream_set_pos(s, pos);
+       }
+
+       stream_detach(s);
+       stream_free(s);
+
+       return message;
+}
+
+uint16 rfx_message_get_tile_count(RFX_MESSAGE* message)
+{
+       return message->num_tiles;
+}
+
+RFX_TILE* rfx_message_get_tile(RFX_MESSAGE* message, int index)
+{
+       return message->tiles[index];
+}
+
+uint16 rfx_message_get_rect_count(RFX_MESSAGE* message)
+{
+       return message->num_rects;
+}
+
+RFX_RECT* rfx_message_get_rect(RFX_MESSAGE* message, int index)
+{
+       return &message->rects[index];
+}
+
+void rfx_message_free(RFX_CONTEXT* context, RFX_MESSAGE* message)
+{
+       if (message != NULL)
+       {
+               xfree(message->rects);
+
+               if (message->tiles != NULL)
+               {
+                       rfx_pool_put_tiles(context->priv->pool, message->tiles, message->num_tiles);
+                       xfree(message->tiles);
+               }
+
+               xfree(message);
+       }
+}
+
+static void rfx_compose_message_sync(RFX_CONTEXT* context, STREAM* s)
+{
+       stream_write_uint16(s, WBT_SYNC); /* BlockT.blockType */
+       stream_write_uint32(s, 12); /* BlockT.blockLen */
+       stream_write_uint32(s, WF_MAGIC); /* magic */
+       stream_write_uint16(s, WF_VERSION_1_0); /* version */
+}
+
+static void rfx_compose_message_codec_versions(RFX_CONTEXT* context, STREAM* s)
+{
+       stream_write_uint16(s, WBT_CODEC_VERSIONS); /* BlockT.blockType */
+       stream_write_uint32(s, 10); /* BlockT.blockLen */
+       stream_write_uint8(s, 1); /* numCodecs */
+       stream_write_uint8(s, 1); /* codecs.codecId */
+       stream_write_uint16(s, WF_VERSION_1_0); /* codecs.version */
+}
+
+static void rfx_compose_message_channels(RFX_CONTEXT* context, STREAM* s)
+{
+       stream_write_uint16(s, WBT_CHANNELS); /* BlockT.blockType */
+       stream_write_uint32(s, 12); /* BlockT.blockLen */
+       stream_write_uint8(s, 1); /* numChannels */
+       stream_write_uint8(s, 0); /* Channel.channelId */
+       stream_write_uint16(s, context->width); /* Channel.width */
+       stream_write_uint16(s, context->height); /* Channel.height */
+}
+
+static void rfx_compose_message_context(RFX_CONTEXT* context, STREAM* s)
+{
+       uint16 properties;
+
+       stream_write_uint16(s, WBT_CONTEXT); /* CodecChannelT.blockType */
+       stream_write_uint32(s, 13); /* CodecChannelT.blockLen */
+       stream_write_uint8(s, 1); /* CodecChannelT.codecId */
+       stream_write_uint8(s, 0); /* CodecChannelT.channelId */
+       stream_write_uint8(s, 0); /* ctxId */
+       stream_write_uint16(s, CT_TILE_64x64); /* tileSize */
+
+       /* properties */
+       properties = context->flags; /* flags */
+       properties |= (COL_CONV_ICT << 3); /* cct */
+       properties |= (CLW_XFORM_DWT_53_A << 5); /* xft */
+       properties |= ((context->mode == RLGR1 ? CLW_ENTROPY_RLGR1 : CLW_ENTROPY_RLGR3) << 9); /* et */
+       properties |= (SCALAR_QUANTIZATION << 13); /* qt */
+       stream_write_uint16(s, properties);
+
+       /* properties in tilesets: note that this has different format from the one in TS_RFX_CONTEXT */
+       properties = 1; /* lt */
+       properties |= (context->flags << 1); /* flags */
+       properties |= (COL_CONV_ICT << 4); /* cct */
+       properties |= (CLW_XFORM_DWT_53_A << 6); /* xft */
+       properties |= ((context->mode == RLGR1 ? CLW_ENTROPY_RLGR1 : CLW_ENTROPY_RLGR3) << 10); /* et */
+       properties |= (SCALAR_QUANTIZATION << 14); /* qt */
+       context->properties = properties;
+}
+
+void rfx_compose_message_header(RFX_CONTEXT* context, STREAM* s)
+{
+       stream_check_size(s, 12 + 10 + 12 + 13);
+
+       rfx_compose_message_sync(context, s);
+       rfx_compose_message_context(context, s);
+       rfx_compose_message_codec_versions(context, s);
+       rfx_compose_message_channels(context, s);
+
+       context->header_processed = true;
+}
+
+static void rfx_compose_message_frame_begin(RFX_CONTEXT* context, STREAM* s)
+{
+       stream_check_size(s, 14);
+
+       stream_write_uint16(s, WBT_FRAME_BEGIN); /* CodecChannelT.blockType */
+       stream_write_uint32(s, 14); /* CodecChannelT.blockLen */
+       stream_write_uint8(s, 1); /* CodecChannelT.codecId */
+       stream_write_uint8(s, 0); /* CodecChannelT.channelId */
+       stream_write_uint32(s, context->frame_idx); /* frameIdx */
+       stream_write_uint16(s, 1); /* numRegions */
+
+       context->frame_idx++;
+}
+
+static void rfx_compose_message_region(RFX_CONTEXT* context, STREAM* s,
+       const RFX_RECT* rects, int num_rects)
+{
+       int size;
+       int i;
+
+       size = 15 + num_rects * 8;
+       stream_check_size(s, size);
+
+       stream_write_uint16(s, WBT_REGION); /* CodecChannelT.blockType */
+       stream_write_uint32(s, size); /* set CodecChannelT.blockLen later */
+       stream_write_uint8(s, 1); /* CodecChannelT.codecId */
+       stream_write_uint8(s, 0); /* CodecChannelT.channelId */
+       stream_write_uint8(s, 1); /* regionFlags */
+       stream_write_uint16(s, num_rects); /* numRects */
+
+       for (i = 0; i < num_rects; i++)
+       {
+               stream_write_uint16(s, rects[i].x);
+               stream_write_uint16(s, rects[i].y);
+               stream_write_uint16(s, rects[i].width);
+               stream_write_uint16(s, rects[i].height);
+       }
+
+       stream_write_uint16(s, CBT_REGION); /* regionType */
+       stream_write_uint16(s, 1); /* numTilesets */
+}
+
+static void rfx_compose_message_tile(RFX_CONTEXT* context, STREAM* s,
+       uint8* tile_data, int tile_width, int tile_height, int rowstride,
+       const uint32* quantVals, int quantIdxY, int quantIdxCb, int quantIdxCr,
+       int xIdx, int yIdx)
+{
+       int YLen = 0;
+       int CbLen = 0;
+       int CrLen = 0;
+       int start_pos, end_pos;
+
+       stream_check_size(s, 19);
+       start_pos = stream_get_pos(s);
+
+       stream_write_uint16(s, CBT_TILE); /* BlockT.blockType */
+       stream_seek_uint32(s); /* set BlockT.blockLen later */
+       stream_write_uint8(s, quantIdxY);
+       stream_write_uint8(s, quantIdxCb);
+       stream_write_uint8(s, quantIdxCr);
+       stream_write_uint16(s, xIdx);
+       stream_write_uint16(s, yIdx);
+
+       stream_seek(s, 6); /* YLen, CbLen, CrLen */
+
+       rfx_encode_rgb(context, tile_data, tile_width, tile_height, rowstride,
+               quantVals + quantIdxY * 10, quantVals + quantIdxCb * 10, quantVals + quantIdxCr * 10,
+               s, &YLen, &CbLen, &CrLen);
+
+       DEBUG_RFX("xIdx=%d yIdx=%d width=%d height=%d YLen=%d CbLen=%d CrLen=%d",
+               xIdx, yIdx, tile_width, tile_height, YLen, CbLen, CrLen);
+
+       end_pos = stream_get_pos(s);
+
+       stream_set_pos(s, start_pos + 2);
+       stream_write_uint32(s, 19 + YLen + CbLen + CrLen); /* BlockT.blockLen */
+       stream_set_pos(s, start_pos + 13);
+       stream_write_uint16(s, YLen);
+       stream_write_uint16(s, CbLen);
+       stream_write_uint16(s, CrLen);
+
+       stream_set_pos(s, end_pos);
+}
+
+static void rfx_compose_message_tileset(RFX_CONTEXT* context, STREAM* s,
+       uint8* image_data, int width, int height, int rowstride)
+{
+       int size;
+       int start_pos, end_pos;
+       int i;
+       int numQuants;
+       const uint32* quantVals;
+       const uint32* quantValsPtr;
+       int quantIdxY;
+       int quantIdxCb;
+       int quantIdxCr;
+       int numTiles;
+       int numTilesX;
+       int numTilesY;
+       int xIdx;
+       int yIdx;
+       int tilesDataSize;
+
+       if (context->num_quants == 0)
+       {
+               numQuants = 1;
+               quantVals = rfx_default_quantization_values;
+               quantIdxY = 0;
+               quantIdxCb = 0;
+               quantIdxCr = 0;
+       }
+       else
+       {
+               numQuants = context->num_quants;
+               quantVals = context->quants;
+               quantIdxY = context->quant_idx_y;
+               quantIdxCb = context->quant_idx_cb;
+               quantIdxCr = context->quant_idx_cr;
+       }
+
+       numTilesX = (width + 63) / 64;
+       numTilesY = (height + 63) / 64;
+       numTiles = numTilesX * numTilesY;
+
+       size = 22 + numQuants * 5;
+       stream_check_size(s, size);
+       start_pos = stream_get_pos(s);
+
+       stream_write_uint16(s, WBT_EXTENSION); /* CodecChannelT.blockType */
+       stream_seek_uint32(s); /* set CodecChannelT.blockLen later */
+       stream_write_uint8(s, 1); /* CodecChannelT.codecId */
+       stream_write_uint8(s, 0); /* CodecChannelT.channelId */
+       stream_write_uint16(s, CBT_TILESET); /* subtype */
+       stream_write_uint16(s, 0); /* idx */
+       stream_write_uint16(s, context->properties); /* properties */
+       stream_write_uint8(s, numQuants); /* numQuants */
+       stream_write_uint8(s, 0x40); /* tileSize */
+       stream_write_uint16(s, numTiles); /* numTiles */
+       stream_seek_uint32(s); /* set tilesDataSize later */
+
+       quantValsPtr = quantVals;
+       for (i = 0; i < numQuants * 5; i++)
+       {
+               stream_write_uint8(s, quantValsPtr[0] + (quantValsPtr[1] << 4));
+               quantValsPtr += 2;
+       }
+
+       DEBUG_RFX("width:%d height:%d rowstride:%d", width, height, rowstride);
+
+       end_pos = stream_get_pos(s);
+       for (yIdx = 0; yIdx < numTilesY; yIdx++)
+       {
+               for (xIdx = 0; xIdx < numTilesX; xIdx++)
+               {
+                       rfx_compose_message_tile(context, s,
+                               image_data + yIdx * 64 * rowstride + xIdx * 8 * context->bits_per_pixel,
+                               (xIdx < numTilesX - 1) ? 64 : width - xIdx * 64,
+                               (yIdx < numTilesY - 1) ? 64 : height - yIdx * 64,
+                               rowstride, quantVals, quantIdxY, quantIdxCb, quantIdxCr, xIdx, yIdx);
+               }
+       }
+       tilesDataSize = stream_get_pos(s) - end_pos;
+       size += tilesDataSize;
+       end_pos = stream_get_pos(s);
+
+       stream_set_pos(s, start_pos + 2);
+       stream_write_uint32(s, size); /* CodecChannelT.blockLen */
+       stream_set_pos(s, start_pos + 18);
+       stream_write_uint32(s, tilesDataSize);
+
+       stream_set_pos(s, end_pos);
+}
+
+static void rfx_compose_message_frame_end(RFX_CONTEXT* context, STREAM* s)
+{
+       stream_check_size(s, 8);
+
+       stream_write_uint16(s, WBT_FRAME_END); /* CodecChannelT.blockType */
+       stream_write_uint32(s, 8); /* CodecChannelT.blockLen */
+       stream_write_uint8(s, 1); /* CodecChannelT.codecId */
+       stream_write_uint8(s, 0); /* CodecChannelT.channelId */
+}
+
+static void rfx_compose_message_data(RFX_CONTEXT* context, STREAM* s,
+       const RFX_RECT* rects, int num_rects, uint8* image_data, int width, int height, int rowstride)
+{
+       rfx_compose_message_frame_begin(context, s);
+       rfx_compose_message_region(context, s, rects, num_rects);
+       rfx_compose_message_tileset(context, s, image_data, width, height, rowstride);
+       rfx_compose_message_frame_end(context, s);
+}
+
+FREERDP_API void rfx_compose_message(RFX_CONTEXT* context, STREAM* s,
+       const RFX_RECT* rects, int num_rects, uint8* image_data, int width, int height, int rowstride)
+{
+       /* Only the first frame should send the RemoteFX header */
+       if (context->frame_idx == 0 && !context->header_processed)
+               rfx_compose_message_header(context, s);
+
+       rfx_compose_message_data(context, s, rects, num_rects, image_data, width, height, rowstride);
+}
+
diff --git a/libfreerdp-codec/rfx_bitstream.h b/libfreerdp-codec/rfx_bitstream.h
new file mode 100644 (file)
index 0000000..29368f6
--- /dev/null
@@ -0,0 +1,86 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Bit Stream
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_BITSTREAM_H
+#define __RFX_BITSTREAM_H
+
+#include <freerdp/codec/rfx.h>
+
+struct _RFX_BITSTREAM
+{
+       uint8* buffer;
+       int nbytes;
+       int byte_pos;
+       int bits_left;
+};
+typedef struct _RFX_BITSTREAM RFX_BITSTREAM;
+
+#define rfx_bitstream_attach(bs, _buffer, _nbytes) do { \
+       bs->buffer = (uint8*) (_buffer); \
+       bs->nbytes = (_nbytes); \
+       bs->byte_pos = 0; \
+       bs->bits_left = 8; } while (0)
+
+#define rfx_bitstream_get_bits(bs, _nbits, _r) do { \
+       int nbits = _nbits; \
+       int b; \
+       uint16 n = 0; \
+       while (bs->byte_pos < bs->nbytes && nbits > 0) \
+       { \
+               b = nbits; \
+               if (b > bs->bits_left) \
+                       b = bs->bits_left; \
+               if (n) \
+                       n <<= b; \
+               n |= (bs->buffer[bs->byte_pos] >> (bs->bits_left - b)) & ((1 << b) - 1); \
+               bs->bits_left -= b; \
+               nbits -= b; \
+               if (bs->bits_left == 0) \
+               { \
+                       bs->bits_left = 8; \
+                       bs->byte_pos++; \
+               } \
+       } \
+       _r = n; } while (0)
+
+#define rfx_bitstream_put_bits(bs, _bits, _nbits) do { \
+       uint16 bits = (_bits); \
+       int nbits = (_nbits); \
+       int b; \
+       while (bs->byte_pos < bs->nbytes && nbits > 0) \
+       { \
+               b = nbits; \
+               if (b > bs->bits_left) \
+                       b = bs->bits_left; \
+               bs->buffer[bs->byte_pos] &= ~(((1 << b) - 1) << (bs->bits_left - b)); \
+               bs->buffer[bs->byte_pos] |= ((bits >> (nbits - b)) & ((1 << b) - 1)) << (bs->bits_left - b); \
+               bs->bits_left -= b; \
+               nbits -= b; \
+               if (bs->bits_left == 0) \
+               { \
+                       bs->bits_left = 8; \
+                       bs->byte_pos++; \
+               } \
+       } } while (0)
+
+#define rfx_bitstream_eos(_bs) ((_bs)->byte_pos >= (_bs)->nbytes)
+#define rfx_bitstream_left(_bs) ((_bs)->byte_pos >= (_bs)->nbytes ? 0 : ((_bs)->nbytes - (_bs)->byte_pos - 1) * 8 + (_bs)->bits_left)
+#define rfx_bitstream_get_processed_bytes(_bs) ((_bs)->bits_left < 8 ? (_bs)->byte_pos + 1 : (_bs)->byte_pos)
+
+#endif /* __RFX_BITSTREAM_H */
diff --git a/libfreerdp-codec/rfx_constants.h b/libfreerdp-codec/rfx_constants.h
new file mode 100644 (file)
index 0000000..bf12886
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - API Header
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_CONSTANTS_H
+#define __RFX_CONSTANTS_H
+
+/* sync */
+#define WF_MAGIC               0xCACCACCA
+#define WF_VERSION_1_0         0x0100
+
+/* blockType */
+#define WBT_SYNC               0xCCC0
+#define WBT_CODEC_VERSIONS     0xCCC1
+#define WBT_CHANNELS           0xCCC2
+#define WBT_CONTEXT            0xCCC3
+#define WBT_FRAME_BEGIN                0xCCC4
+#define WBT_FRAME_END          0xCCC5
+#define WBT_REGION             0xCCC6
+#define WBT_EXTENSION          0xCCC7
+#define CBT_REGION             0xCAC1
+#define CBT_TILESET            0xCAC2
+#define CBT_TILE               0xCAC3
+
+/* tileSize */
+#define CT_TILE_64x64          0x0040
+
+/* properties.flags */
+#define CODEC_MODE             0x02
+
+/* properties.cct */
+#define COL_CONV_ICT           0x1
+
+/* properties.xft */
+#define CLW_XFORM_DWT_53_A     0x1
+
+/* properties.et */
+#define CLW_ENTROPY_RLGR1      0x01
+#define CLW_ENTROPY_RLGR3      0x04
+
+/* properties.qt */
+#define SCALAR_QUANTIZATION    0x1
+
+#endif /* __RFX_CONSTANTS_H */
+
diff --git a/libfreerdp-codec/rfx_decode.c b/libfreerdp-codec/rfx_decode.c
new file mode 100644 (file)
index 0000000..f778661
--- /dev/null
@@ -0,0 +1,194 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Decode
+ *
+ * Copyright 2011 Vic Lee
+ * Copyright 2011 Norbert Federa <nfedera@thinstuff.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/stream.h>
+#include "rfx_types.h"
+#include "rfx_rlgr.h"
+#include "rfx_differential.h"
+#include "rfx_quantization.h"
+#include "rfx_dwt.h"
+
+#include "rfx_decode.h"
+
+static void rfx_decode_format_rgb(sint16* r_buf, sint16* g_buf, sint16* b_buf,
+       RFX_PIXEL_FORMAT pixel_format, uint8* dst_buf)
+{
+       sint16* r = r_buf;
+       sint16* g = g_buf;
+       sint16* b = b_buf;
+       uint8* dst = dst_buf;
+       int i;
+       
+       switch (pixel_format)
+       {
+               case RFX_PIXEL_FORMAT_BGRA:
+                       for (i = 0; i < 4096; i++)
+                       {
+                               *dst++ = (uint8) (*b++);
+                               *dst++ = (uint8) (*g++);
+                               *dst++ = (uint8) (*r++);
+                               *dst++ = 0xFF;
+                       }
+                       break;
+               case RFX_PIXEL_FORMAT_RGBA:
+                       for (i = 0; i < 4096; i++)
+                       {
+                               *dst++ = (uint8) (*r++);
+                               *dst++ = (uint8) (*g++);
+                               *dst++ = (uint8) (*b++);
+                               *dst++ = 0xFF;
+                       }
+                       break;
+               case RFX_PIXEL_FORMAT_BGR:
+                       for (i = 0; i < 4096; i++)
+                       {
+                               *dst++ = (uint8) (*b++);
+                               *dst++ = (uint8) (*g++);
+                               *dst++ = (uint8) (*r++);
+                       }
+                       break;
+               case RFX_PIXEL_FORMAT_RGB:
+                       for (i = 0; i < 4096; i++)
+                       {
+                               *dst++ = (uint8) (*r++);
+                               *dst++ = (uint8) (*g++);
+                               *dst++ = (uint8) (*b++);
+                       }
+                       break;
+               default:
+                       break;
+       }
+}
+
+#define MINMAX(_v,_l,_h) ((_v) < (_l) ? (_l) : ((_v) > (_h) ? (_h) : (_v)))
+
+void rfx_decode_ycbcr_to_rgb(sint16* y_r_buf, sint16* cb_g_buf, sint16* cr_b_buf)
+{
+       /* sint32 is used intentionally because we calculate with shifted factors! */
+       sint32 y, cb, cr;
+       sint32 r, g, b;
+       int i;
+
+       /**
+        * The decoded YCbCr coeffectients are represented as 11.5 fixed-point numbers:
+        *
+        * 1 sign bit + 10 integer bits + 5 fractional bits
+        *
+        * However only 7 integer bits will be actually used since the value range is [-128.0, 127.0].
+        * In other words, the decoded coeffectients is scaled by << 5 when intepreted as sint16.
+        * It was scaled in the quantization phase, so we must scale it back here.
+        */
+       for (i = 0; i < 4096; i++)
+       {
+               y = y_r_buf[i];
+               cb = cb_g_buf[i];
+               cr = cr_b_buf[i];
+
+#if 0
+               /**
+                * This is the slow floating point version kept here for reference
+                */
+
+               y = y + 4096; /* 128<<5=4096 so that we can scale the sum by >> 5 */
+
+               r = y + cr*1.403f;
+               g = y - cb*0.344f - cr*0.714f;
+               b = y + cb*1.770f;
+
+               y_r_buf[i]  = MINMAX(r>>5, 0, 255);
+               cb_g_buf[i] = MINMAX(g>>5, 0, 255);
+               cr_b_buf[i] = MINMAX(b>>5, 0, 255);
+#else
+               /**
+                * We scale the factors by << 16 into 32-bit integers in order to avoid slower
+                * floating point multiplications. Since the final result needs to be scaled
+                * by >> 5 we will extract only the upper 11 bits (>> 21) from the final sum.
+                * Hence we also have to scale the other terms of the sum by << 16.
+                *
+                * R: 1.403 << 16 = 91947
+                * G: 0.344 << 16 = 22544, 0.714 << 16 = 46792
+                * B: 1.770 << 16 = 115998
+                */
+
+               y = (y+4096)<<16;
+
+               r = y + cr*91947;
+               g = y - cb*22544 - cr*46792;
+               b = y + cb*115998;
+
+               y_r_buf[i]  = MINMAX(r>>21, 0, 255);
+               cb_g_buf[i] = MINMAX(g>>21, 0, 255);
+               cr_b_buf[i] = MINMAX(b>>21, 0, 255);
+#endif
+       }
+}
+
+static void rfx_decode_component(RFX_CONTEXT* context, const uint32* quantization_values,
+       const uint8* data, int size, sint16* buffer)
+{
+       PROFILER_ENTER(context->priv->prof_rfx_decode_component);
+
+       PROFILER_ENTER(context->priv->prof_rfx_rlgr_decode);
+               rfx_rlgr_decode(context->mode, data, size, buffer, 4096);
+       PROFILER_EXIT(context->priv->prof_rfx_rlgr_decode);
+
+       PROFILER_ENTER(context->priv->prof_rfx_differential_decode);
+               rfx_differential_decode(buffer + 4032, 64);
+       PROFILER_EXIT(context->priv->prof_rfx_differential_decode);
+
+       PROFILER_ENTER(context->priv->prof_rfx_quantization_decode);
+               context->quantization_decode(buffer, quantization_values);
+       PROFILER_EXIT(context->priv->prof_rfx_quantization_decode);
+
+       PROFILER_ENTER(context->priv->prof_rfx_dwt_2d_decode);
+               context->dwt_2d_decode(buffer, context->priv->dwt_buffer);
+       PROFILER_EXIT(context->priv->prof_rfx_dwt_2d_decode);
+
+       PROFILER_EXIT(context->priv->prof_rfx_decode_component);
+}
+
+void rfx_decode_rgb(RFX_CONTEXT* context, STREAM* data_in,
+       int y_size, const uint32 * y_quants,
+       int cb_size, const uint32 * cb_quants,
+       int cr_size, const uint32 * cr_quants, uint8* rgb_buffer)
+{
+       PROFILER_ENTER(context->priv->prof_rfx_decode_rgb);
+
+       rfx_decode_component(context, y_quants, stream_get_tail(data_in), y_size, context->priv->y_r_buffer); /* YData */
+       stream_seek(data_in, y_size);
+       rfx_decode_component(context, cb_quants, stream_get_tail(data_in), cb_size, context->priv->cb_g_buffer); /* CbData */
+       stream_seek(data_in, cb_size);
+       rfx_decode_component(context, cr_quants, stream_get_tail(data_in), cr_size, context->priv->cr_b_buffer); /* CrData */
+       stream_seek(data_in, cr_size);
+
+       PROFILER_ENTER(context->priv->prof_rfx_decode_ycbcr_to_rgb);
+               context->decode_ycbcr_to_rgb(context->priv->y_r_buffer, context->priv->cb_g_buffer, context->priv->cr_b_buffer);
+       PROFILER_EXIT(context->priv->prof_rfx_decode_ycbcr_to_rgb);
+
+       PROFILER_ENTER(context->priv->prof_rfx_decode_format_rgb);
+               rfx_decode_format_rgb(context->priv->y_r_buffer, context->priv->cb_g_buffer, context->priv->cr_b_buffer,
+                       context->pixel_format, rgb_buffer);
+       PROFILER_EXIT(context->priv->prof_rfx_decode_format_rgb);
+       
+       PROFILER_EXIT(context->priv->prof_rfx_decode_rgb);
+}
diff --git a/libfreerdp-codec/rfx_decode.h b/libfreerdp-codec/rfx_decode.h
new file mode 100644 (file)
index 0000000..874ad2e
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Decode
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_DECODE_H
+#define __RFX_DECODE_H
+
+#include <freerdp/codec/rfx.h>
+
+void rfx_decode_ycbcr_to_rgb(sint16* y_r_buf, sint16* cb_g_buf, sint16* cr_b_buf);
+
+void rfx_decode_rgb(RFX_CONTEXT* context, STREAM* data_in,
+       int y_size, const uint32 * y_quants,
+       int cb_size, const uint32 * cb_quants,
+       int cr_size, const uint32 * cr_quants, uint8* rgb_buffer);
+
+#endif /* __RFX_DECODE_H */
+
diff --git a/libfreerdp-codec/rfx_differential.c b/libfreerdp-codec/rfx_differential.c
new file mode 100644 (file)
index 0000000..7a1d49e
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Differential Encoding
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "rfx_differential.h"
+
+void rfx_differential_decode(sint16* buffer, int buffer_size)
+{
+       sint16* src;
+       sint16* dst;
+
+       for (src = buffer, dst = buffer + 1; buffer_size > 1; src++, dst++, buffer_size--)
+       {
+               *dst += *src;
+       }
+}
+
+void rfx_differential_encode(sint16* buffer, int buffer_size)
+{
+       sint16 n1, n2;
+       sint16* dst;
+
+       for (n1 = *buffer, dst = buffer + 1; buffer_size > 1; dst++, buffer_size--)
+       {
+               n2 = *dst;
+               *dst -= n1;
+               n1 = n2;
+       }
+}
diff --git a/libfreerdp-codec/rfx_differential.h b/libfreerdp-codec/rfx_differential.h
new file mode 100644 (file)
index 0000000..58b08b9
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Differential Encoding
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_DIFFERENTIAL_H
+#define __RFX_DIFFERENTIAL_H
+
+#include <freerdp/codec/rfx.h>
+
+void rfx_differential_decode(sint16* buffer, int buffer_size);
+void rfx_differential_encode(sint16* buffer, int buffer_size);
+
+#endif /* __RFX_DIFFERENTIAL_H */
diff --git a/libfreerdp-codec/rfx_dwt.c b/libfreerdp-codec/rfx_dwt.c
new file mode 100644 (file)
index 0000000..e870b18
--- /dev/null
@@ -0,0 +1,194 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - DWT
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "rfx_dwt.h"
+
+static void rfx_dwt_2d_decode_block(sint16* buffer, sint16* idwt, int subband_width)
+{
+       sint16 *dst, *l, *h;
+       sint16 *l_dst, *h_dst;
+       sint16 *hl, *lh, *hh, *ll;
+       int total_width;
+       int x, y;
+       int n;
+
+       total_width = subband_width << 1;
+
+       /* Inverse DWT in horizontal direction, results in 2 sub-bands in L, H order in tmp buffer idwt. */
+       /* The 4 sub-bands are stored in HL(0), LH(1), HH(2), LL(3) order. */
+       /* The lower part L uses LL(3) and HL(0). */
+       /* The higher part H uses LH(1) and HH(2). */
+
+       ll = buffer + subband_width * subband_width * 3;
+       hl = buffer;
+       l_dst = idwt;
+
+       lh = buffer + subband_width * subband_width;
+       hh = buffer + subband_width * subband_width * 2;
+       h_dst = idwt + subband_width * subband_width * 2;
+
+       for (y = 0; y < subband_width; y++)
+       {
+               /* Even coefficients */
+               l_dst[0] = ll[0] - ((hl[0] + hl[0] + 1) >> 1);
+               h_dst[0] = lh[0] - ((hh[0] + hh[0] + 1) >> 1);
+               for (n = 1; n < subband_width; n++)
+               {
+                       x = n << 1;
+                       l_dst[x] = ll[n] - ((hl[n-1] + hl[n] + 1) >> 1);
+                       h_dst[x] = lh[n] - ((hh[n-1] + hh[n] + 1) >> 1);
+               }
+
+               /* Odd coefficients */
+               for (n = 0; n < subband_width-1; n++)
+               {
+                       x = n << 1;
+                       l_dst[x + 1] = (hl[n] << 1) + ((l_dst[x] + l_dst[x + 2]) >> 1);
+                       h_dst[x + 1] = (hh[n] << 1) + ((h_dst[x] + h_dst[x + 2]) >> 1);
+               }
+               x = n << 1;
+               l_dst[x + 1] = (hl[n] << 1) + (l_dst[x]);
+               h_dst[x + 1] = (hh[n] << 1) + (h_dst[x]);               
+
+               ll += subband_width;
+               hl += subband_width;
+               l_dst += total_width;
+
+               lh += subband_width;
+               hh += subband_width;
+               h_dst += total_width;
+       }
+
+       /* Inverse DWT in vertical direction, results are stored in original buffer. */
+       for (x = 0; x < total_width; x++)
+       {
+               /* Even coefficients */
+               for (n = 0; n < subband_width; n++)
+               {
+                       y = n << 1;
+                       dst = buffer + y * total_width + x;
+                       l = idwt + n * total_width + x;
+                       h = l + subband_width * total_width;
+                       dst[0] = *l - (((n > 0 ? *(h - total_width) : *h) + (*h) + 1) >> 1);
+               }
+
+               /* Odd coefficients */
+               for (n = 0; n < subband_width; n++)
+               {
+                       y = n << 1;
+                       dst = buffer + y * total_width + x;
+                       l = idwt + n * total_width + x;
+                       h = l + subband_width * total_width;
+                       dst[total_width] = (*h << 1) + ((dst[0] + dst[n < subband_width - 1 ? 2 * total_width : 0]) >> 1);
+               }
+       }
+}
+
+void rfx_dwt_2d_decode(sint16* buffer, sint16* dwt_buffer)
+{
+       rfx_dwt_2d_decode_block(buffer + 3840, dwt_buffer, 8);
+       rfx_dwt_2d_decode_block(buffer + 3072, dwt_buffer, 16);
+       rfx_dwt_2d_decode_block(buffer, dwt_buffer, 32);
+}
+
+static void rfx_dwt_2d_encode_block(sint16* buffer, sint16* dwt, int subband_width)
+{
+       sint16 *src, *l, *h;
+       sint16 *l_src, *h_src;
+       sint16 *hl, *lh, *hh, *ll;
+       int total_width;
+       int x, y;
+       int n;
+
+       total_width = subband_width << 1;
+
+       /* DWT in vertical direction, results in 2 sub-bands in L, H order in tmp buffer dwt. */
+       for (x = 0; x < total_width; x++)
+       {
+               for (n = 0; n < subband_width; n++)
+               {
+                       y = n << 1;
+                       l = dwt + n * total_width + x;
+                       h = l + subband_width * total_width;
+                       src = buffer + y * total_width + x;
+
+                       /* H */
+                       *h = (src[total_width] - ((src[0] + src[n < subband_width - 1 ? 2 * total_width : 0]) >> 1)) >> 1;
+
+                       /* L */
+                       *l = src[0] + (n == 0 ? *h : (*(h - total_width) + *h) >> 1);
+               }
+       }
+
+       /* DWT in horizontal direction, results in 4 sub-bands in HL(0), LH(1), HH(2), LL(3) order, stored in original buffer. */
+       /* The lower part L generates LL(3) and HL(0). */
+       /* The higher part H generates LH(1) and HH(2). */
+
+       ll = buffer + subband_width * subband_width * 3;
+       hl = buffer;
+       l_src = dwt;
+
+       lh = buffer + subband_width * subband_width;
+       hh = buffer + subband_width * subband_width * 2;
+       h_src = dwt + subband_width * subband_width * 2;
+
+       for (y = 0; y < subband_width; y++)
+       {
+               /* L */
+               for (n = 0; n < subband_width; n++)
+               {
+                       x = n << 1;
+
+                       /* HL */
+                       hl[n] = (l_src[x + 1] - ((l_src[x] + l_src[n < subband_width - 1 ? x + 2 : x]) >> 1)) >> 1;
+                       /* LL */
+                       ll[n] = l_src[x] + (n == 0 ? hl[n] : (hl[n - 1] + hl[n]) >> 1);
+               }
+
+               /* H */
+               for (n = 0; n < subband_width; n++)
+               {
+                       x = n << 1;
+
+                       /* HH */
+                       hh[n] = (h_src[x + 1] - ((h_src[x] + h_src[n < subband_width - 1 ? x + 2 : x]) >> 1)) >> 1;
+                       /* LH */
+                       lh[n] = h_src[x] + (n == 0 ? hh[n] : (hh[n - 1] + hh[n]) >> 1);
+               }
+
+               ll += subband_width;
+               hl += subband_width;
+               l_src += total_width;
+
+               lh += subband_width;
+               hh += subband_width;
+               h_src += total_width;
+       }
+}
+
+void rfx_dwt_2d_encode(sint16* buffer, sint16* dwt_buffer)
+{
+       rfx_dwt_2d_encode_block(buffer, dwt_buffer, 32);
+       rfx_dwt_2d_encode_block(buffer + 3072, dwt_buffer, 16);
+       rfx_dwt_2d_encode_block(buffer + 3840, dwt_buffer, 8);
+}
diff --git a/libfreerdp-codec/rfx_dwt.h b/libfreerdp-codec/rfx_dwt.h
new file mode 100644 (file)
index 0000000..cfdc4bc
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - DWT
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_DWT_H
+#define __RFX_DWT_H
+
+#include <freerdp/codec/rfx.h>
+
+void rfx_dwt_2d_decode(sint16* buffer, sint16* dwt_buffer);
+void rfx_dwt_2d_encode(sint16* buffer, sint16* dwt_buffer);
+
+#endif /* __RFX_DWT_H */
diff --git a/libfreerdp-codec/rfx_encode.c b/libfreerdp-codec/rfx_encode.c
new file mode 100644 (file)
index 0000000..578866d
--- /dev/null
@@ -0,0 +1,280 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Encode
+ *
+ * Copyright 2011 Vic Lee
+ * Copyright 2011 Norbert Federa <nfedera@thinstuff.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "rfx_types.h"
+#include "rfx_rlgr.h"
+#include "rfx_differential.h"
+#include "rfx_quantization.h"
+#include "rfx_dwt.h"
+
+#include "rfx_encode.h"
+
+#define MINMAX(_v,_l,_h) ((_v) < (_l) ? (_l) : ((_v) > (_h) ? (_h) : (_v)))
+
+static void rfx_encode_format_rgb(const uint8* rgb_data, int width, int height, int rowstride,
+       RFX_PIXEL_FORMAT pixel_format, const uint8* palette, sint16* r_buf, sint16* g_buf, sint16* b_buf)
+{
+       int x, y;
+       int x_exceed;
+       int y_exceed;
+       const uint8* src;
+       sint16 r, g, b;
+       sint16 *r_last, *g_last, *b_last;
+
+       x_exceed = 64 - width;
+       y_exceed = 64 - height;
+
+       for (y = 0; y < height; y++)
+       {
+               src = rgb_data + y * rowstride;
+
+               switch (pixel_format)
+               {
+                       case RFX_PIXEL_FORMAT_BGRA:
+                               for (x = 0; x < width; x++)
+                               {
+                                       *b_buf++ = (sint16) (*src++);
+                                       *g_buf++ = (sint16) (*src++);
+                                       *r_buf++ = (sint16) (*src++);
+                                       src++;
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_RGBA:
+                               for (x = 0; x < width; x++)
+                               {
+                                       *r_buf++ = (sint16) (*src++);
+                                       *g_buf++ = (sint16) (*src++);
+                                       *b_buf++ = (sint16) (*src++);
+                                       src++;
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_BGR:
+                               for (x = 0; x < width; x++)
+                               {
+                                       *b_buf++ = (sint16) (*src++);
+                                       *g_buf++ = (sint16) (*src++);
+                                       *r_buf++ = (sint16) (*src++);
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_RGB:
+                               for (x = 0; x < width; x++)
+                               {
+                                       *r_buf++ = (sint16) (*src++);
+                                       *g_buf++ = (sint16) (*src++);
+                                       *b_buf++ = (sint16) (*src++);
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_BGR565_LE:
+                               for (x = 0; x < width; x++)
+                               {
+                                       *b_buf++ = (sint16) (((*(src + 1)) & 0xF8) | ((*(src + 1)) >> 5));
+                                       *g_buf++ = (sint16) ((((*(src + 1)) & 0x07) << 5) | (((*src) & 0xE0) >> 3));
+                                       *r_buf++ = (sint16) ((((*src) & 0x1F) << 3) | (((*src) >> 2) & 0x07));
+                                       src += 2;
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_RGB565_LE:
+                               for (x = 0; x < width; x++)
+                               {
+                                       *r_buf++ = (sint16) (((*(src + 1)) & 0xF8) | ((*(src + 1)) >> 5));
+                                       *g_buf++ = (sint16) ((((*(src + 1)) & 0x07) << 5) | (((*src) & 0xE0) >> 3));
+                                       *b_buf++ = (sint16) ((((*src) & 0x1F) << 3) | (((*src) >> 2) & 0x07));
+                                       src += 2;
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_PALETTE4_PLANER:
+                               if (!palette)
+                                       break;
+                               for (x = 0; x < width; x++)
+                               {
+                                       int shift;
+                                       uint8 idx;
+
+                                       shift = (7 - (x % 8));
+                                       idx = ((*src) >> shift) & 1;
+                                       idx |= (((*(src + 1)) >> shift) & 1) << 1;
+                                       idx |= (((*(src + 2)) >> shift) & 1) << 2;
+                                       idx |= (((*(src + 3)) >> shift) & 1) << 3;
+                                       idx *= 3;
+                                       *r_buf++ = (sint16) palette[idx];
+                                       *g_buf++ = (sint16) palette[idx + 1];
+                                       *b_buf++ = (sint16) palette[idx + 2];
+                                       if (shift == 0)
+                                               src += 4;
+                               }
+                               break;
+                       case RFX_PIXEL_FORMAT_PALETTE8:
+                               if (!palette)
+                                       break;
+                               for (x = 0; x < width; x++)
+                               {
+                                       int idx = (*src) * 3;
+
+                                       *r_buf++ = (sint16) palette[idx];
+                                       *g_buf++ = (sint16) palette[idx + 1];
+                                       *b_buf++ = (sint16) palette[idx + 2];
+                                       src++;
+                               }
+                               break;
+                       default:
+                               break;
+               }
+               /* Fill the horizontal region outside of 64x64 tile size with the right-most pixel for best quality */
+               if (x_exceed > 0)
+               {
+                       r = *(r_buf - 1);
+                       g = *(g_buf - 1);
+                       b = *(b_buf - 1);
+
+                       for (x = 0; x < x_exceed; x++)
+                       {
+                               *r_buf++ = r;
+                               *g_buf++ = g;
+                               *b_buf++ = b;
+                       }
+               }
+       }
+
+       /* Fill the vertical region outside of 64x64 tile size with the last line. */
+       if (y_exceed > 0)
+       {
+               r_last = r_buf - 64;
+               g_last = g_buf - 64;
+               b_last = b_buf - 64;
+
+               while (y_exceed > 0)
+               {
+                       memcpy(r_buf, r_last, 64 * sizeof(sint16));
+                       memcpy(g_buf, g_last, 64 * sizeof(sint16));
+                       memcpy(b_buf, b_last, 64 * sizeof(sint16));
+                       r_buf += 64;
+                       g_buf += 64;
+                       b_buf += 64;
+                       y_exceed--;
+               }
+       }
+}
+
+void rfx_encode_rgb_to_ycbcr(sint16* y_r_buf, sint16* cb_g_buf, sint16* cr_b_buf)
+{
+       /* sint32 is used intentionally because we calculate with shifted factors! */
+       int i;
+       sint32 r, g, b;
+       sint32 y, cb, cr;
+
+       /**
+        * The encoded YCbCr coefficients are represented as 11.5 fixed-point numbers:
+        *
+        * 1 sign bit + 10 integer bits + 5 fractional bits
+        *
+        * However only 7 integer bits will be actually used since the value range is [-128.0, 127.0].
+        * In other words, the encoded coefficients is scaled by << 5 when interpreted as sint16.
+        * It will be scaled down to original during the quantization phase.
+        */
+       for (i = 0; i < 4096; i++)
+       {
+               r = y_r_buf[i];
+               g = cb_g_buf[i];
+               b = cr_b_buf[i];
+
+               /*
+                * We scale the factors by << 15 into 32-bit integers in order to avoid slower
+                * floating point multiplications. Since the terms need to be scaled by << 5 we
+                * simply scale the final sum by >> 10
+                *
+                * Y:  0.299000 << 15 = 9798,  0.587000 << 15 = 19235, 0.114000 << 15 = 3735
+                * Cb: 0.168935 << 15 = 5535,  0.331665 << 15 = 10868, 0.500590 << 15 = 16403
+                * Cr: 0.499813 << 15 = 16377, 0.418531 << 15 = 13714, 0.081282 << 15 = 2663
+                */
+
+               y  = (r *  9798 + g *  19235 + b *  3735) >> 10;
+               cb = (r * -5535 + g * -10868 + b * 16403) >> 10;
+               cr = (r * 16377 + g * -13714 + b * -2663) >> 10;
+
+               y_r_buf[i] = MINMAX(y - 4096, -4096, 4095);
+               cb_g_buf[i] = MINMAX(cb, -4096, 4095);
+               cr_b_buf[i] = MINMAX(cr, -4096, 4095);
+       }
+}
+
+static void rfx_encode_component(RFX_CONTEXT* context, const uint32* quantization_values,
+       sint16* data, uint8* buffer, int buffer_size, int* size)
+{
+       PROFILER_ENTER(context->priv->prof_rfx_encode_component);
+
+       PROFILER_ENTER(context->priv->prof_rfx_dwt_2d_encode);
+               context->dwt_2d_encode(data, context->priv->dwt_buffer);
+       PROFILER_EXIT(context->priv->prof_rfx_dwt_2d_encode);
+
+       PROFILER_ENTER(context->priv->prof_rfx_quantization_encode);
+               context->quantization_encode(data, quantization_values);
+       PROFILER_EXIT(context->priv->prof_rfx_quantization_encode);
+
+       PROFILER_ENTER(context->priv->prof_rfx_differential_encode);
+               rfx_differential_encode(data + 4032, 64);
+       PROFILER_EXIT(context->priv->prof_rfx_differential_encode);
+
+       PROFILER_ENTER(context->priv->prof_rfx_rlgr_encode);
+               *size = rfx_rlgr_encode(context->mode, data, 4096, buffer, buffer_size);
+       PROFILER_EXIT(context->priv->prof_rfx_rlgr_encode);
+
+       PROFILER_EXIT(context->priv->prof_rfx_encode_component);
+}
+
+void rfx_encode_rgb(RFX_CONTEXT* context, const uint8* rgb_data, int width, int height, int rowstride,
+       const uint32* y_quants, const uint32* cb_quants, const uint32* cr_quants,
+       STREAM* data_out, int* y_size, int* cb_size, int* cr_size)
+{
+       sint16* y_r_buffer = context->priv->y_r_buffer;
+       sint16* cb_g_buffer = context->priv->cb_g_buffer;
+       sint16* cr_b_buffer = context->priv->cr_b_buffer;
+
+       PROFILER_ENTER(context->priv->prof_rfx_encode_rgb);
+
+       PROFILER_ENTER(context->priv->prof_rfx_encode_format_rgb);
+               rfx_encode_format_rgb(rgb_data, width, height, rowstride,
+                       context->pixel_format, context->palette, y_r_buffer, cb_g_buffer, cr_b_buffer);
+       PROFILER_EXIT(context->priv->prof_rfx_encode_format_rgb);
+
+       PROFILER_ENTER(context->priv->prof_rfx_encode_rgb_to_ycbcr);
+               context->encode_rgb_to_ycbcr(context->priv->y_r_buffer, context->priv->cb_g_buffer, context->priv->cr_b_buffer);
+       PROFILER_EXIT(context->priv->prof_rfx_encode_rgb_to_ycbcr);
+
+       /* Ensure the buffer is reasonably large enough */
+       stream_check_size(data_out, 4096);
+       rfx_encode_component(context, y_quants, context->priv->y_r_buffer,
+               stream_get_tail(data_out), stream_get_left(data_out), y_size);
+       stream_seek(data_out, *y_size);
+
+       stream_check_size(data_out, 4096);
+       rfx_encode_component(context, cb_quants, context->priv->cb_g_buffer,
+               stream_get_tail(data_out), stream_get_left(data_out), cb_size);
+       stream_seek(data_out, *cb_size);
+
+       stream_check_size(data_out, 4096);
+       rfx_encode_component(context, cr_quants, context->priv->cr_b_buffer,
+               stream_get_tail(data_out), stream_get_left(data_out), cr_size);
+       stream_seek(data_out, *cr_size);
+
+       PROFILER_EXIT(context->priv->prof_rfx_encode_rgb);
+}
diff --git a/libfreerdp-codec/rfx_encode.h b/libfreerdp-codec/rfx_encode.h
new file mode 100644 (file)
index 0000000..6fa1e95
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Encode
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_ENCODE_H
+#define __RFX_ENCODE_H
+
+#include <freerdp/codec/rfx.h>
+
+void rfx_encode_rgb_to_ycbcr(sint16* y_r_buf, sint16* cb_g_buf, sint16* cr_b_buf);
+
+void rfx_encode_rgb(RFX_CONTEXT* context, const uint8* rgb_data, int width, int height, int rowstride,
+       const uint32* y_quants, const uint32* cb_quants, const uint32* cr_quants,
+       STREAM* data_out, int* y_size, int* cb_size, int* cr_size);
+
+#endif
+
diff --git a/libfreerdp-codec/rfx_neon.c b/libfreerdp-codec/rfx_neon.c
new file mode 100644 (file)
index 0000000..5a57a2f
--- /dev/null
@@ -0,0 +1,352 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   RemoteFX Codec Library - NEON Optimizations
+
+   Copyright 2011 Martin Fleisz <mfleisz@thinstuff.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#if defined(__ARM_NEON__)
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <arm_neon.h>
+
+#include "rfx_types.h"
+#include "rfx_neon.h"
+
+#if defined(ANDROID)
+#include <cpu-features.h>
+#endif
+
+
+void rfx_decode_YCbCr_to_RGB_NEON(sint16 * y_r_buffer, sint16 * cb_g_buffer, sint16 * cr_b_buffer)
+{
+       int16x8_t zero = vdupq_n_s16(0);
+       int16x8_t max = vdupq_n_s16(255);
+       int16x8_t y_add = vdupq_n_s16(128);
+
+       int16x8_t* y_r_buf = (int16x8_t*)y_r_buffer;
+       int16x8_t* cb_g_buf = (int16x8_t*)cb_g_buffer;
+       int16x8_t* cr_b_buf = (int16x8_t*)cr_b_buffer;
+
+       int i;
+       for (i = 0; i < 4096 / 8; i++)
+       {
+               int16x8_t y = vld1q_s16((sint16*)&y_r_buf[i]);
+               y = vaddq_s16(y, y_add);
+
+               int16x8_t cr = vld1q_s16((sint16*)&cr_b_buf[i]);
+
+               // r = between((y + cr + (cr >> 2) + (cr >> 3) + (cr >> 5)), 0, 255);
+               int16x8_t r = vaddq_s16(y, cr);
+               r = vaddq_s16(r, vshrq_n_s16(cr, 2));
+               r = vaddq_s16(r, vshrq_n_s16(cr, 3));
+               r = vaddq_s16(r, vshrq_n_s16(cr, 5));
+               r = vminq_s16(vmaxq_s16(r, zero), max);
+               vst1q_s16((sint16*)&y_r_buf[i], r);
+
+               // cb = cb_g_buf[i];
+               int16x8_t cb = vld1q_s16((sint16*)&cb_g_buf[i]);
+
+               // g = between(y - (cb >> 2) - (cb >> 4) - (cb >> 5) - (cr >> 1) - (cr >> 3) - (cr >> 4) - (cr >> 5), 0, 255);
+               int16x8_t g = vsubq_s16(y, vshrq_n_s16(cb, 2));
+               g = vsubq_s16(g, vshrq_n_s16(cb, 4));
+               g = vsubq_s16(g, vshrq_n_s16(cb, 5));
+               g = vsubq_s16(g, vshrq_n_s16(cr, 1));
+               g = vsubq_s16(g, vshrq_n_s16(cr, 3));
+               g = vsubq_s16(g, vshrq_n_s16(cr, 4));
+               g = vsubq_s16(g, vshrq_n_s16(cr, 5));
+               g = vminq_s16(vmaxq_s16(g, zero), max);
+               vst1q_s16((sint16*)&cb_g_buf[i], g);
+
+               // b = between((y + cb + (cb >> 1) + (cb >> 2) + (cb >> 6)), 0, 255);
+               int16x8_t b = vaddq_s16(y, cb);
+               b = vaddq_s16(b, vshrq_n_s16(cb, 1));
+               b = vaddq_s16(b, vshrq_n_s16(cb, 2));
+               b = vaddq_s16(b, vshrq_n_s16(cb, 6));
+               b = vminq_s16(vmaxq_s16(b, zero), max);
+               vst1q_s16((sint16*)&cr_b_buf[i], b);
+       }
+
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_quantization_decode_block_NEON(sint16 * buffer, const int buffer_size, const uint32 factor)
+{
+       if (factor <= 6)
+               return;
+       int16x8_t quantFactors = vdupq_n_s16(factor - 6);
+       int16x8_t* buf = (int16x8_t*)buffer;
+       int16x8_t* buf_end = (int16x8_t*)(buffer + buffer_size);
+
+       do
+       {
+               int16x8_t val = vld1q_s16((sint16*)buf);
+               val = vshlq_s16(val, quantFactors);
+               vst1q_s16((sint16*)buf, val);
+               buf++;
+       }
+       while(buf < buf_end);
+}
+
+void
+rfx_quantization_decode_NEON(sint16 * buffer, const uint32 * quantization_values)
+{
+       rfx_quantization_decode_block_NEON(buffer, 1024, quantization_values[8]); /* HL1 */
+       rfx_quantization_decode_block_NEON(buffer + 1024, 1024, quantization_values[7]); /* LH1 */
+       rfx_quantization_decode_block_NEON(buffer + 2048, 1024, quantization_values[9]); /* HH1 */
+       rfx_quantization_decode_block_NEON(buffer + 3072, 256, quantization_values[5]); /* HL2 */
+       rfx_quantization_decode_block_NEON(buffer + 3328, 256, quantization_values[4]); /* LH2 */
+       rfx_quantization_decode_block_NEON(buffer + 3584, 256, quantization_values[6]); /* HH2 */
+       rfx_quantization_decode_block_NEON(buffer + 3840, 64, quantization_values[2]); /* HL3 */
+       rfx_quantization_decode_block_NEON(buffer + 3904, 64, quantization_values[1]); /* LH3 */
+       rfx_quantization_decode_block_NEON(buffer + 3968, 64, quantization_values[3]); /* HH3 */
+       rfx_quantization_decode_block_NEON(buffer + 4032, 64, quantization_values[0]); /* LL3 */
+}
+
+
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_decode_block_horiz_NEON(sint16 * l, sint16 * h, sint16 * dst, int subband_width)
+{
+       int y, n;
+       sint16 * l_ptr = l;
+       sint16 * h_ptr = h;
+       sint16 * dst_ptr = dst;
+
+       for (y = 0; y < subband_width; y++)
+       {
+               /* Even coefficients */
+               for (n = 0; n < subband_width; n+=8)
+               {
+                       // dst[2n] = l[n] - ((h[n-1] + h[n] + 1) >> 1);
+                       int16x8_t l_n = vld1q_s16(l_ptr);
+
+                       int16x8_t h_n = vld1q_s16(h_ptr);
+                       int16x8_t h_n_m = vld1q_s16(h_ptr - 1);
+
+                       if (n == 0)
+                       {
+                               int16_t first = vgetq_lane_s16(h_n_m, 1);
+                               h_n_m = vsetq_lane_s16(first, h_n_m, 0);
+                       }
+
+                       int16x8_t tmp_n = vaddq_s16(h_n, h_n_m);
+                       tmp_n = vaddq_s16(tmp_n, vdupq_n_s16(1));
+                       tmp_n = vshrq_n_s16(tmp_n, 1);
+
+                       int16x8_t dst_n = vsubq_s16(l_n, tmp_n);
+
+                       vst1q_s16(l_ptr, dst_n);
+
+                       l_ptr+=8;
+                       h_ptr+=8;
+               }
+               l_ptr -= subband_width;
+               h_ptr -= subband_width;
+
+               /* Odd coefficients */
+               for (n = 0; n < subband_width; n+=8)
+               {
+                       // dst[2n + 1] = (h[n] << 1) + ((dst[2n] + dst[2n + 2]) >> 1);
+
+                       int16x8_t h_n = vld1q_s16(h_ptr);
+
+                       h_n = vshlq_n_s16(h_n, 1);
+
+                       int16x8x2_t dst_n;
+                       dst_n.val[0] = vld1q_s16(l_ptr);
+                       int16x8_t dst_n_p = vld1q_s16(l_ptr + 1);
+                       if (n == subband_width - 8)
+                       {
+                               int16_t last = vgetq_lane_s16(dst_n_p, 6);
+                               dst_n_p = vsetq_lane_s16(last, dst_n_p, 7);
+                       }
+
+                       dst_n.val[1] = vaddq_s16(dst_n_p, dst_n.val[0]);
+                       dst_n.val[1] = vshrq_n_s16(dst_n.val[1], 1);
+
+                       dst_n.val[1] = vaddq_s16(dst_n.val[1], h_n);
+
+                       vst2q_s16(dst_ptr, dst_n);
+
+                       l_ptr+=8;
+                       h_ptr+=8;
+                       dst_ptr+=16;
+               }
+       }
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_decode_block_vert_NEON(sint16 * l, sint16 * h, sint16 * dst, int subband_width)
+{
+       int x, n;
+       sint16 * l_ptr = l;
+       sint16 * h_ptr = h;
+       sint16 * dst_ptr = dst;
+
+       int total_width = subband_width + subband_width;
+
+       /* Even coefficients */
+       for (n = 0; n < subband_width; n++)
+       {
+               for (x = 0; x < total_width; x+=8)
+               {
+                       // dst[2n] = l[n] - ((h[n-1] + h[n] + 1) >> 1);
+
+                       int16x8_t l_n = vld1q_s16(l_ptr);
+                       int16x8_t h_n = vld1q_s16(h_ptr);
+
+                       int16x8_t tmp_n = vaddq_s16(h_n, vdupq_n_s16(1));;
+                       if (n == 0)
+                               tmp_n = vaddq_s16(tmp_n, h_n);
+                       else
+                       {
+                               int16x8_t h_n_m = vld1q_s16((h_ptr - total_width));
+                               tmp_n = vaddq_s16(tmp_n, h_n_m);
+                       }
+                       tmp_n = vshrq_n_s16(tmp_n, 1);
+
+                       int16x8_t dst_n = vsubq_s16(l_n, tmp_n);
+                       vst1q_s16(dst_ptr, dst_n);
+
+                       l_ptr+=8;
+                       h_ptr+=8;
+                       dst_ptr+=8;
+               }
+               dst_ptr+=total_width;
+       }
+
+       h_ptr = h;
+       dst_ptr = dst + total_width;
+
+       /* Odd coefficients */
+       for (n = 0; n < subband_width; n++)
+       {
+               for (x = 0; x < total_width; x+=8)
+               {
+               // dst[2n + 1] = (h[n] << 1) + ((dst[2n] + dst[2n + 2]) >> 1);
+               int16x8_t h_n = vld1q_s16(h_ptr);
+               int16x8_t dst_n_m = vld1q_s16(dst_ptr - total_width);
+
+               h_n = vshlq_n_s16(h_n, 1);
+
+               int16x8_t tmp_n = dst_n_m;
+               if (n == subband_width - 1)
+                       tmp_n = vaddq_s16(tmp_n, dst_n_m);
+               else
+               {
+                       int16x8_t dst_n_p = vld1q_s16((dst_ptr + total_width));
+                       tmp_n = vaddq_s16(tmp_n, dst_n_p);
+               }
+               tmp_n = vshrq_n_s16(tmp_n, 1);
+
+               int16x8_t dst_n = vaddq_s16(tmp_n, h_n);
+               vst1q_s16(dst_ptr, dst_n);
+
+               h_ptr+=8;
+               dst_ptr+=8;
+       }
+       dst_ptr+=total_width;
+}
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_decode_block_NEON(sint16 * buffer, sint16 * idwt, int subband_width)
+{
+       sint16 * hl, * lh, * hh, * ll;
+       sint16 * l_dst, * h_dst;
+
+       /* Inverse DWT in horizontal direction, results in 2 sub-bands in L, H order in tmp buffer idwt. */
+       /* The 4 sub-bands are stored in HL(0), LH(1), HH(2), LL(3) order. */
+       /* The lower part L uses LL(3) and HL(0). */
+       /* The higher part H uses LH(1) and HH(2). */
+
+       ll = buffer + subband_width * subband_width * 3;
+       hl = buffer;
+       l_dst = idwt;
+
+       rfx_dwt_2d_decode_block_horiz_NEON(ll, hl, l_dst, subband_width);
+
+       lh = buffer + subband_width * subband_width;
+       hh = buffer + subband_width * subband_width * 2;
+       h_dst = idwt + subband_width * subband_width * 2;
+
+       rfx_dwt_2d_decode_block_horiz_NEON(lh, hh, h_dst, subband_width);
+
+       /* Inverse DWT in vertical direction, results are stored in original buffer. */
+       rfx_dwt_2d_decode_block_vert_NEON(l_dst, h_dst, buffer, subband_width);
+}
+
+void
+rfx_dwt_2d_decode_NEON(sint16 * buffer, sint16 * dwt_buffer)
+{
+       rfx_dwt_2d_decode_block_NEON(buffer + 3840, dwt_buffer, 8);
+       rfx_dwt_2d_decode_block_NEON(buffer + 3072, dwt_buffer, 16);
+       rfx_dwt_2d_decode_block_NEON(buffer, dwt_buffer, 32);
+}
+
+
+
+int isNeonSupported()
+{
+#if defined(ANDROID)
+       if (android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM)
+       {
+               DEBUG_RFX("NEON optimization disabled - No ARM CPU found");
+               return 0;
+       }
+
+       uint64_t features = android_getCpuFeatures();
+       if ((features & ANDROID_CPU_ARM_FEATURE_ARMv7))
+       {
+               if (features & ANDROID_CPU_ARM_FEATURE_NEON)
+               {
+                       DEBUG_RFX("NEON optimization enabled!");
+                       return 1;
+               }
+               DEBUG_RFX("NEON optimization disabled - CPU not NEON capable");
+       }
+       else
+               DEBUG_RFX("NEON optimization disabled - No ARMv7 CPU found");
+
+       return 0;
+#else
+       return 1;
+#endif
+}
+
+
+void rfx_init_neon(RFX_CONTEXT * context)
+{
+
+
+       if(isNeonSupported())
+       {
+               DEBUG_RFX("Using NEON optimizations");
+
+               IF_PROFILER(context->priv->prof_rfx_decode_ycbcr_to_rgb->name = "rfx_decode_YCbCr_to_RGB_NEON");
+               IF_PROFILER(context->priv->prof_rfx_quantization_decode->name = "rfx_quantization_decode_NEON");
+               IF_PROFILER(context->priv->prof_rfx_dwt_2d_decode->name = "rfx_dwt_2d_decode_NEON");
+
+               context->decode_ycbcr_to_rgb = rfx_decode_YCbCr_to_RGB_NEON;
+               context->quantization_decode = rfx_quantization_decode_NEON;
+               context->dwt_2d_decode = rfx_dwt_2d_decode_NEON;
+       }
+}
+
+#endif // __ARM_NEON__
+
diff --git a/libfreerdp-codec/rfx_neon.h b/libfreerdp-codec/rfx_neon.h
new file mode 100644 (file)
index 0000000..28dbc36
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+   FreeRDP: A Remote Desktop Protocol client.
+   RemoteFX Codec Library - NEON Optimizations
+
+   Copyright 2011 Martin Fleisz <mfleisz@thinstuff.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+#ifndef __RFX_NEON_H
+#define __RFX_NEON_H
+
+#include <freerdp/codec/rfx.h>
+
+#if defined(__ARM_NEON__)
+
+void rfx_init_neon(RFX_CONTEXT * context);
+
+#ifndef RFX_INIT_SIMD
+ #if defined(WITH_NEON)
+  #define RFX_INIT_SIMD(_rfx_context) rfx_init_neon(_rfx_context)
+ #endif
+#endif
+
+#endif // __ARM_NEON__
+
+#endif /* __RFX_NEON_H */
+
diff --git a/libfreerdp-codec/rfx_pool.c b/libfreerdp-codec/rfx_pool.c
new file mode 100644 (file)
index 0000000..12e703c
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Memory Pool
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+
+#include "rfx_pool.h"
+
+RFX_POOL* rfx_pool_new()
+{
+       RFX_POOL* pool;
+
+       pool = xnew(RFX_POOL);
+
+       pool->size = 64;
+       pool->tiles = (RFX_TILE**) xzalloc(sizeof(RFX_TILE*) * pool->size);
+
+       return pool;
+}
+
+void rfx_pool_free(RFX_POOL* pool)
+{
+       int i;
+       RFX_TILE* tile;
+
+       for (i = 0; i < pool->count; i++)
+       {
+               tile = pool->tiles[i];
+
+               if (tile != NULL)
+               {
+                       if (tile->data != NULL)
+                               xfree(tile->data);
+
+                       xfree(tile);
+               }
+       }
+
+       xfree(pool->tiles);
+       xfree(pool);
+}
+
+void rfx_pool_put_tile(RFX_POOL* pool, RFX_TILE* tile)
+{
+       if (pool->count >= pool->size)
+       {
+               pool->size *= 2;
+               pool->tiles = (RFX_TILE**) xrealloc((void*) pool->tiles, sizeof(RFX_TILE*) * pool->size);
+       }
+
+       pool->tiles[(pool->count)++] = tile;
+}
+
+RFX_TILE* rfx_pool_get_tile(RFX_POOL* pool)
+{
+       RFX_TILE* tile;
+
+       if (pool->count < 1)
+       {
+               tile = xnew(RFX_TILE);
+               tile->data = (uint8*) xmalloc(4096 * 4); /* 64x64 * 4 */
+       }
+       else
+       {
+               tile = pool->tiles[--(pool->count)];
+       }
+
+       return tile;
+}
+
+void rfx_pool_put_tiles(RFX_POOL* pool, RFX_TILE** tiles, int count)
+{
+       int i;
+
+       for (i = 0; i < count; i++)
+       {
+               rfx_pool_put_tile(pool, tiles[i]);
+       }
+}
+
+RFX_TILE** rfx_pool_get_tiles(RFX_POOL* pool, int count)
+{
+       int i;
+       RFX_TILE** tiles;
+
+       tiles = (RFX_TILE**) xmalloc(sizeof(RFX_TILE*) * count);
+
+       for (i = 0; i < count; i++)
+       {
+               tiles[i] = rfx_pool_get_tile(pool);
+       }
+
+       return tiles;
+}
diff --git a/libfreerdp-codec/rfx_pool.h b/libfreerdp-codec/rfx_pool.h
new file mode 100644 (file)
index 0000000..4f1ff81
--- /dev/null
@@ -0,0 +1,40 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Memory Pool
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_POOL_H
+#define __RFX_POOL_H
+
+#include <freerdp/codec/rfx.h>
+
+struct _RFX_POOL
+{
+       int size;
+       int count;
+       RFX_TILE** tiles;
+};
+typedef struct _RFX_POOL RFX_POOL;
+
+RFX_POOL* rfx_pool_new();
+void rfx_pool_free(RFX_POOL* pool);
+void rfx_pool_put_tile(RFX_POOL* pool, RFX_TILE* tile);
+RFX_TILE* rfx_pool_get_tile(RFX_POOL* pool);
+void rfx_pool_put_tiles(RFX_POOL* pool, RFX_TILE** tiles, int count);
+RFX_TILE** rfx_pool_get_tiles(RFX_POOL* pool, int count);
+
+#endif /* __RFX_POOL_H */
diff --git a/libfreerdp-codec/rfx_quantization.c b/libfreerdp-codec/rfx_quantization.c
new file mode 100644 (file)
index 0000000..617818f
--- /dev/null
@@ -0,0 +1,82 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Quantization
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rfx_quantization.h"
+
+static void rfx_quantization_decode_block(sint16* buffer, int buffer_size, uint32 factor)
+{
+       sint16* dst;
+
+       if (factor == 0)
+               return;
+
+       for (dst = buffer; buffer_size > 0; dst++, buffer_size--)
+       {
+               *dst <<= factor;
+       }
+}
+
+void rfx_quantization_decode(sint16* buffer, const uint32* quantization_values)
+{
+       /* Scale the values so that they are represented as 11.5 fixed-point number */
+       rfx_quantization_decode_block(buffer, 4096, 5);
+
+       rfx_quantization_decode_block(buffer, 1024, quantization_values[8] - 6); /* HL1 */
+       rfx_quantization_decode_block(buffer + 1024, 1024, quantization_values[7] - 6); /* LH1 */
+       rfx_quantization_decode_block(buffer + 2048, 1024, quantization_values[9] - 6); /* HH1 */
+       rfx_quantization_decode_block(buffer + 3072, 256, quantization_values[5] - 6); /* HL2 */
+       rfx_quantization_decode_block(buffer + 3328, 256, quantization_values[4] - 6); /* LH2 */
+       rfx_quantization_decode_block(buffer + 3584, 256, quantization_values[6] - 6); /* HH2 */
+       rfx_quantization_decode_block(buffer + 3840, 64, quantization_values[2] - 6); /* HL3 */
+       rfx_quantization_decode_block(buffer + 3904, 64, quantization_values[1] - 6); /* LH3 */
+       rfx_quantization_decode_block(buffer + 3968, 64, quantization_values[3] - 6); /* HH3 */
+       rfx_quantization_decode_block(buffer + 4032, 64, quantization_values[0] - 6); /* LL3 */
+}
+
+static void rfx_quantization_encode_block(sint16* buffer, int buffer_size, uint32 factor)
+{
+       sint16* dst;
+       sint16 half;
+
+       if (factor == 0)
+               return;
+
+       half = (1 << (factor - 1));
+       for (dst = buffer; buffer_size > 0; dst++, buffer_size--)
+       {
+               *dst = (*dst + half) >> factor;
+       }
+}
+
+void rfx_quantization_encode(sint16* buffer, const uint32* quantization_values)
+{
+       rfx_quantization_encode_block(buffer, 1024, quantization_values[8] - 6); /* HL1 */
+       rfx_quantization_encode_block(buffer + 1024, 1024, quantization_values[7] - 6); /* LH1 */
+       rfx_quantization_encode_block(buffer + 2048, 1024, quantization_values[9] - 6); /* HH1 */
+       rfx_quantization_encode_block(buffer + 3072, 256, quantization_values[5] - 6); /* HL2 */
+       rfx_quantization_encode_block(buffer + 3328, 256, quantization_values[4] - 6); /* LH2 */
+       rfx_quantization_encode_block(buffer + 3584, 256, quantization_values[6] - 6); /* HH2 */
+       rfx_quantization_encode_block(buffer + 3840, 64, quantization_values[2] - 6); /* HL3 */
+       rfx_quantization_encode_block(buffer + 3904, 64, quantization_values[1] - 6); /* LH3 */
+       rfx_quantization_encode_block(buffer + 3968, 64, quantization_values[3] - 6); /* HH3 */
+       rfx_quantization_encode_block(buffer + 4032, 64, quantization_values[0] - 6); /* LL3 */
+
+       /* The coefficients are scaled by << 5 at RGB->YCbCr phase, so we round it back here */
+       rfx_quantization_encode_block(buffer, 4096, 5);
+}
diff --git a/libfreerdp-codec/rfx_quantization.h b/libfreerdp-codec/rfx_quantization.h
new file mode 100644 (file)
index 0000000..9fbfa51
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - Quantization
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_QUANTIZATION_H
+#define __RFX_QUANTIZATION_H
+
+#include <freerdp/codec/rfx.h>
+
+void rfx_quantization_decode(sint16* buffer, const uint32* quantization_values);
+void rfx_quantization_encode(sint16* buffer, const uint32* quantization_values);
+
+#endif /* __RFX_QUANTIZATION_H */
diff --git a/libfreerdp-codec/rfx_rlgr.c b/libfreerdp-codec/rfx_rlgr.c
new file mode 100644 (file)
index 0000000..b20c89b
--- /dev/null
@@ -0,0 +1,431 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - RLGR
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * This implementation of RLGR refers to
+ * [MS-RDPRFX] 3.1.8.1.7.3 RLGR1/RLGR3 Pseudocode
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include "rfx_bitstream.h"
+
+#include "rfx_rlgr.h"
+
+/* Constants used within the RLGR1/RLGR3 algorithm */
+#define KPMAX  (80)  /* max value for kp or krp */
+#define LSGR   (3)   /* shift count to convert kp to k */
+#define UP_GR  (4)   /* increase in kp after a zero run in RL mode */
+#define DN_GR  (6)   /* decrease in kp after a nonzero symbol in RL mode */
+#define UQ_GR  (3)   /* increase in kp after nonzero symbol in GR mode */
+#define DQ_GR  (3)   /* decrease in kp after zero symbol in GR mode */
+
+/* Gets (returns) the next nBits from the bitstream */
+#define GetBits(nBits, r) rfx_bitstream_get_bits(bs, nBits, r)
+
+/* From current output pointer, write "value", check and update buffer_size */
+#define WriteValue(value) \
+{ \
+       if (buffer_size > 0) \
+               *dst++ = (value); \
+       buffer_size--; \
+}
+
+/* From current output pointer, write next nZeroes terms with value 0, check and update buffer_size */
+#define WriteZeroes(nZeroes) \
+{ \
+       int nZeroesWritten = (nZeroes); \
+       if (nZeroesWritten > buffer_size) \
+               nZeroesWritten = buffer_size; \
+       if (nZeroesWritten > 0) \
+       { \
+               memset(dst, 0, nZeroesWritten * sizeof(sint16)); \
+               dst += nZeroesWritten; \
+       } \
+       buffer_size -= (nZeroes); \
+}
+
+/* Returns the least number of bits required to represent a given value */
+#define GetMinBits(_val, _nbits) \
+{ \
+       uint32 _v = _val; \
+       _nbits = 0; \
+       while (_v) \
+       { \
+               _v >>= 1; \
+               _nbits++; \
+       } \
+}
+
+/* Converts from (2 * magnitude - sign) to integer */
+#define GetIntFrom2MagSign(twoMs) (((twoMs) & 1) ? -1 * (sint16)(((twoMs) + 1) >> 1) : (sint16)((twoMs) >> 1))
+
+/*
+ * Update the passed parameter and clamp it to the range [0, KPMAX]
+ * Return the value of parameter right-shifted by LSGR
+ */
+#define UpdateParam(_param, _deltaP, _k) \
+{ \
+       _param += _deltaP; \
+       if (_param > KPMAX) \
+               _param = KPMAX; \
+       if (_param < 0) \
+               _param = 0; \
+       _k = (_param >> LSGR); \
+}
+
+/* Outputs the Golomb/Rice encoding of a non-negative integer */
+#define GetGRCode(krp, kr, vk, _mag) \
+       vk = 0; \
+       _mag = 0; \
+       /* chew up/count leading 1s and escape 0 */ \
+       do { \
+               GetBits(1, r); \
+               if (r == 1) \
+                       vk++; \
+               else \
+                       break; \
+       } while (1); \
+       /* get next *kr bits, and combine with leading 1s */ \
+       GetBits(*kr, _mag); \
+       _mag |= (vk << *kr); \
+       /* adjust krp and kr based on vk */ \
+       if (!vk) { \
+               UpdateParam(*krp, -2, *kr); \
+       } \
+       else if (vk != 1) { \
+               UpdateParam(*krp, vk, *kr); /* at 1, no change! */ \
+       }
+
+int rfx_rlgr_decode(RLGR_MODE mode, const uint8* data, int data_size, sint16* buffer, int buffer_size)
+{
+       int k;
+       int kp;
+       int kr;
+       int krp;
+       uint16 r;
+       sint16* dst;
+       RFX_BITSTREAM* bs;
+
+       int vk;
+       uint16 mag16;
+
+       bs = xnew(RFX_BITSTREAM);
+       rfx_bitstream_attach(bs, data, data_size);
+       dst = buffer;
+
+       /* initialize the parameters */
+       k = 1;
+       kp = k << LSGR;
+       kr = 1;
+       krp = kr << LSGR;
+
+       while (!rfx_bitstream_eos(bs) && buffer_size > 0)
+       {
+               int run;
+               if (k)
+               {
+                       int mag;
+                       uint32 sign;
+
+                       /* RL MODE */
+                       while (!rfx_bitstream_eos(bs))
+                       {
+                               GetBits(1, r);
+                               if (r)
+                                       break;
+                               /* we have an RL escape "0", which translates to a run (1<<k) of zeros */
+                               WriteZeroes(1 << k);
+                               UpdateParam(kp, UP_GR, k); /* raise k and kp up because of zero run */
+                       }
+
+                       /* next k bits will contain remaining run or zeros */
+                       GetBits(k, run);
+                       WriteZeroes(run);
+
+                       /* get nonzero value, starting with sign bit and then GRCode for magnitude -1 */
+                       GetBits(1, sign);
+
+                       /* magnitude - 1 was coded (because it was nonzero) */
+                       GetGRCode(&krp, &kr, vk, mag16)
+                       mag = (int) (mag16 + 1);
+
+                       WriteValue(sign ? -mag : mag);
+                       UpdateParam(kp, -DN_GR, k); /* lower k and kp because of nonzero term */
+               }
+               else
+               {
+                       uint32 mag;
+                       uint32 nIdx;
+                       uint32 val1;
+                       uint32 val2;
+
+                       /* GR (GOLOMB-RICE) MODE */
+                       GetGRCode(&krp, &kr, vk, mag16) /* values coded are 2 * magnitude - sign */
+                       mag = (uint32) mag16;
+
+                       if (mode == RLGR1)
+                       {
+                               if (!mag)
+                               {
+                                       WriteValue(0);
+                                       UpdateParam(kp, UQ_GR, k); /* raise k and kp due to zero */
+                               }
+                               else
+                               {
+                                       WriteValue(GetIntFrom2MagSign(mag));
+                                       UpdateParam(kp, -DQ_GR, k); /* lower k and kp due to nonzero */
+                               }
+                       }
+                       else /* mode == RLGR3 */
+                       {
+                               /*
+                                * In GR mode FOR RLGR3, we have encoded the
+                                * sum of two (2 * mag - sign) values
+                                */
+
+                               /* maximum possible bits for first term */
+                               GetMinBits(mag, nIdx);
+
+                               /* decode val1 is first term's (2 * mag - sign) value */
+                               GetBits(nIdx, val1);
+
+                               /* val2 is second term's (2 * mag - sign) value */
+                               val2 = mag - val1;
+
+                               if (val1 && val2)
+                               {
+                                       /* raise k and kp if both terms nonzero */
+                                       UpdateParam(kp, -2 * DQ_GR, k);
+                               }
+                               else if (!val1 && !val2)
+                               {
+                                       /* lower k and kp if both terms zero */
+                                       UpdateParam(kp, 2 * UQ_GR, k);
+                               }
+
+                               WriteValue(GetIntFrom2MagSign(val1));
+                               WriteValue(GetIntFrom2MagSign(val2));
+                       }
+               }
+       }
+
+       xfree(bs);
+
+       return (dst - buffer);
+}
+
+/* Returns the next coefficient (a signed int) to encode, from the input stream */
+#define GetNextInput(_n) \
+{ \
+       if (data_size > 0) \
+       { \
+               _n = *data++; \
+               data_size--; \
+       } \
+       else \
+       { \
+               _n = 0; \
+       } \
+}
+
+/* Emit bitPattern to the output bitstream */
+#define OutputBits(numBits, bitPattern) rfx_bitstream_put_bits(bs, bitPattern, numBits)
+
+/* Emit a bit (0 or 1), count number of times, to the output bitstream */
+#define OutputBit(count, bit) \
+{      \
+       uint16 _b = (bit ? 0xFFFF : 0); \
+       int _c = (count); \
+       for (; _c > 0; _c -= 16) \
+               rfx_bitstream_put_bits(bs, _b, (_c > 16 ? 16 : _c)); \
+}
+
+/* Converts the input value to (2 * abs(input) - sign(input)), where sign(input) = (input < 0 ? 1 : 0) and returns it */
+#define Get2MagSign(input) ((input) >= 0 ? 2 * (input) : -2 * (input) - 1)
+
+/* Outputs the Golomb/Rice encoding of a non-negative integer */
+#define CodeGR(krp, val) rfx_rlgr_code_gr(bs, krp, val)
+
+static void rfx_rlgr_code_gr(RFX_BITSTREAM* bs, int* krp, uint32 val)
+{
+       int kr = *krp >> LSGR;
+
+       /* unary part of GR code */
+
+       uint32 vk = (val) >> kr;
+       OutputBit(vk, 1);
+       OutputBit(1, 0);
+
+       /* remainder part of GR code, if needed */
+       if (kr)
+       {
+               OutputBits(kr, val & ((1 << kr) - 1));
+       }
+
+       /* update krp, only if it is not equal to 1 */
+       if (vk == 0)
+       {
+               UpdateParam(*krp, -2, kr);
+       }
+       else if (vk > 1)
+       {
+               UpdateParam(*krp, vk, kr);
+       }
+}
+
+int rfx_rlgr_encode(RLGR_MODE mode, const sint16* data, int data_size, uint8* buffer, int buffer_size)
+{
+       int k;
+       int kp;
+       int krp;
+       RFX_BITSTREAM* bs;
+       int processed_size;
+
+       bs = xnew(RFX_BITSTREAM);
+       rfx_bitstream_attach(bs, buffer, buffer_size);
+
+       /* initialize the parameters */
+       k = 1;
+       kp = 1 << LSGR;
+       krp = 1 << LSGR;
+
+       /* process all the input coefficients */
+       while (data_size > 0)
+       {
+               int input;
+
+               if (k)
+               {
+                       int numZeros;
+                       int runmax;
+                       int mag;
+                       int sign;
+
+                       /* RUN-LENGTH MODE */
+
+                       /* collect the run of zeros in the input stream */
+                       numZeros = 0;
+                       GetNextInput(input);
+                       while (input == 0 && data_size > 0)
+                       {
+                               numZeros++;
+                               GetNextInput(input);
+                       }
+
+                       // emit output zeros
+                       runmax = 1 << k;
+                       while (numZeros >= runmax)
+                       {
+                               OutputBit(1, 0); /* output a zero bit */
+                               numZeros -= runmax;
+                               UpdateParam(kp, UP_GR, k); /* update kp, k */
+                               runmax = 1 << k;
+                       }
+
+                       /* output a 1 to terminate runs */
+                       OutputBit(1, 1);
+
+                       /* output the remaining run length using k bits */
+                       OutputBits(k, numZeros);
+
+                       /* note: when we reach here and the last byte being encoded is 0, we still
+                          need to output the last two bits, otherwise mstsc will crash */
+
+                       /* encode the nonzero value using GR coding */
+                       mag = (input < 0 ? -input : input); /* absolute value of input coefficient */
+                       sign = (input < 0 ? 1 : 0);  /* sign of input coefficient */
+
+                       OutputBit(1, sign); /* output the sign bit */
+                       CodeGR(&krp, mag ? mag - 1 : 0); /* output GR code for (mag - 1) */
+
+                       UpdateParam(kp, -DN_GR, k);
+               }
+               else
+               {
+                       /* GOLOMB-RICE MODE */
+
+                       if (mode == RLGR1)
+                       {
+                               uint32 twoMs;
+
+                               /* RLGR1 variant */
+
+                               /* convert input to (2*magnitude - sign), encode using GR code */
+                               GetNextInput(input);
+                               twoMs = Get2MagSign(input);
+                               CodeGR(&krp, twoMs);
+
+                               /* update k, kp */
+                               /* NOTE: as of Aug 2011, the algorithm is still wrongly documented
+                                  and the update direction is reversed */
+                               if (twoMs)
+                               {
+                                       UpdateParam(kp, -DQ_GR, k);
+                               }
+                               else
+                               {
+                                       UpdateParam(kp, UQ_GR, k);
+                               }
+                       }
+                       else /* mode == RLGR3 */
+                       {
+                               uint32 twoMs1;
+                               uint32 twoMs2;
+                               uint32 sum2Ms;
+                               uint32 nIdx;
+
+                               /* RLGR3 variant */
+
+                               /* convert the next two input values to (2*magnitude - sign) and */
+                               /* encode their sum using GR code */
+
+                               GetNextInput(input);
+                               twoMs1 = Get2MagSign(input);
+                               GetNextInput(input);
+                               twoMs2 = Get2MagSign(input);
+                               sum2Ms = twoMs1 + twoMs2;
+
+                               CodeGR(&krp, sum2Ms);
+
+                               /* encode binary representation of the first input (twoMs1). */
+                               GetMinBits(sum2Ms, nIdx);
+                               OutputBits(nIdx, twoMs1);
+
+                               /* update k,kp for the two input values */
+
+                               if (twoMs1 && twoMs2)
+                               {
+                                       UpdateParam(kp, -2 * DQ_GR, k);
+                               }
+                               else if (!twoMs1 && !twoMs2)
+                               {
+                                       UpdateParam(kp, 2 * UQ_GR, k);
+                               }
+                       }
+               }
+       }
+
+       processed_size = rfx_bitstream_get_processed_bytes(bs);
+       xfree(bs);
+
+       return processed_size;
+}
diff --git a/libfreerdp-codec/rfx_rlgr.h b/libfreerdp-codec/rfx_rlgr.h
new file mode 100644 (file)
index 0000000..b470bd5
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - RLGR
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_RLGR_H
+#define __RFX_RLGR_H
+
+#include <freerdp/codec/rfx.h>
+
+int rfx_rlgr_decode(RLGR_MODE mode, const uint8* data, int data_size, sint16* buffer, int buffer_size);
+int rfx_rlgr_encode(RLGR_MODE mode, const sint16* data, int data_size, uint8* buffer, int buffer_size);
+
+#endif /* __RFX_RLGR_H */
diff --git a/libfreerdp-codec/rfx_sse2.c b/libfreerdp-codec/rfx_sse2.c
new file mode 100644 (file)
index 0000000..cdf92ae
--- /dev/null
@@ -0,0 +1,669 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - SSE2 Optimizations
+ *
+ * Copyright 2011 Stephen Erisman
+ * Copyright 2011 Norbert Federa <nfedera@thinstuff.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xmmintrin.h>
+#include <emmintrin.h>
+
+#include "rfx_types.h"
+#include "rfx_sse2.h"
+
+#ifdef _MSC_VER
+#define        __attribute__(...)
+#endif
+
+#define CACHE_LINE_BYTES       64
+
+#define _mm_between_epi16(_val, _min, _max) \
+       do { _val = _mm_min_epi16(_max, _mm_max_epi16(_val, _min)); } while (0)
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_mm_prefetch_buffer(char * buffer, int num_bytes)
+{
+       __m128i * buf = (__m128i*) buffer;
+       int i;
+       for (i = 0; i < (num_bytes / sizeof(__m128i)); i+=(CACHE_LINE_BYTES / sizeof(__m128i)))
+       {
+               _mm_prefetch((char*)(&buf[i]), _MM_HINT_NTA);
+       }
+}
+
+static void rfx_decode_ycbcr_to_rgb_sse2(sint16* y_r_buffer, sint16* cb_g_buffer, sint16* cr_b_buffer)
+{      
+       __m128i zero = _mm_setzero_si128();
+       __m128i max = _mm_set1_epi16(255);
+
+       __m128i* y_r_buf = (__m128i*) y_r_buffer;
+       __m128i* cb_g_buf = (__m128i*) cb_g_buffer;
+       __m128i* cr_b_buf = (__m128i*) cr_b_buffer;
+
+       __m128i y;
+       __m128i cr;
+       __m128i cb;
+       __m128i r;
+       __m128i g;
+       __m128i b;
+
+       int i;
+
+       __m128i r_cr = _mm_set1_epi16(22986);   //  1.403 << 14
+       __m128i g_cb = _mm_set1_epi16(-5636);   // -0.344 << 14
+       __m128i g_cr = _mm_set1_epi16(-11698);  // -0.714 << 14
+       __m128i b_cb = _mm_set1_epi16(28999);   //  1.770 << 14
+       __m128i c4096 = _mm_set1_epi16(4096);
+
+       for (i = 0; i < (4096 * sizeof(sint16) / sizeof(__m128i)); i += (CACHE_LINE_BYTES / sizeof(__m128i)))
+       {
+               _mm_prefetch((char*)(&y_r_buf[i]), _MM_HINT_NTA);
+               _mm_prefetch((char*)(&cb_g_buf[i]), _MM_HINT_NTA);
+               _mm_prefetch((char*)(&cr_b_buf[i]), _MM_HINT_NTA);
+       }
+       for (i = 0; i < (4096 * sizeof(sint16) / sizeof(__m128i)); i++)
+       {
+               /*
+               In order to use SSE2 signed 16-bit integer multiplication we need to convert
+               the floating point factors to signed int without loosing information.
+               The result of this multiplication is 32 bit and we have two SSE instructions
+               that return either the hi or lo word.
+               Thus we will multiply the factors by the highest possible 2^n, take the 
+               upper 16 bits of the signed 32-bit result (_mm_mulhi_epi16) and correct this
+               result by multiplying it by 2^(16-n).
+               For the given factors in the conversion matrix the best possible n is 14.
+
+               Example for calculating r:
+               r = (y>>5) + 128 + (cr*1.403)>>5                       // our base formula
+               r = (y>>5) + 128 + (HIWORD(cr*(1.403<<14)<<2))>>5      // see above
+               r = (y+4096)>>5 + (HIWORD(cr*22986)<<2)>>5             // simplification
+               r = ((y+4096)>>2 + HIWORD(cr*22986)) >> 3
+               */
+
+               /* y = (y_r_buf[i] + 4096) >> 2 */
+               y = _mm_load_si128(&y_r_buf[i]);
+               y = _mm_add_epi16(y, c4096);
+               y = _mm_srai_epi16(y, 2);
+               /* cb = cb_g_buf[i]; */
+               cb = _mm_load_si128(&cb_g_buf[i]);
+               /* cr = cr_b_buf[i]; */
+               cr = _mm_load_si128(&cr_b_buf[i]);
+
+               /* (y + HIWORD(cr*22986)) >> 3 */
+               r = _mm_add_epi16(y, _mm_mulhi_epi16(cr, r_cr));
+               r = _mm_srai_epi16(r, 3);
+               /* y_r_buf[i] = MINMAX(r, 0, 255); */
+               _mm_between_epi16(r, zero, max);
+               _mm_store_si128(&y_r_buf[i], r);
+
+               /* (y + HIWORD(cb*-5636) + HIWORD(cr*-11698)) >> 3 */
+               g = _mm_add_epi16(y, _mm_mulhi_epi16(cb, g_cb));
+               g = _mm_add_epi16(g, _mm_mulhi_epi16(cr, g_cr));
+               g = _mm_srai_epi16(g, 3);
+               /* cb_g_buf[i] = MINMAX(g, 0, 255); */
+               _mm_between_epi16(g, zero, max);
+               _mm_store_si128(&cb_g_buf[i], g);
+
+               /* (y + HIWORD(cb*28999)) >> 3 */
+               b = _mm_add_epi16(y, _mm_mulhi_epi16(cb, b_cb));
+               b = _mm_srai_epi16(b, 3);
+               /* cr_b_buf[i] = MINMAX(b, 0, 255); */
+               _mm_between_epi16(b, zero, max);
+               _mm_store_si128(&cr_b_buf[i], b);
+       }
+}
+
+/* The encodec YCbCr coeffectients are represented as 11.5 fixed-point numbers. See rfx_encode.c */
+static void rfx_encode_rgb_to_ycbcr_sse2(sint16* y_r_buffer, sint16* cb_g_buffer, sint16* cr_b_buffer)
+{
+       __m128i min = _mm_set1_epi16(-128 << 5);
+       __m128i max = _mm_set1_epi16(127 << 5);
+
+       __m128i* y_r_buf = (__m128i*) y_r_buffer;
+       __m128i* cb_g_buf = (__m128i*) cb_g_buffer;
+       __m128i* cr_b_buf = (__m128i*) cr_b_buffer;
+
+       __m128i y;
+       __m128i cr;
+       __m128i cb;
+       __m128i r;
+       __m128i g;
+       __m128i b;
+
+       __m128i y_r  = _mm_set1_epi16(9798);   //  0.299000 << 15
+       __m128i y_g  = _mm_set1_epi16(19235);  //  0.587000 << 15
+       __m128i y_b  = _mm_set1_epi16(3735);   //  0.114000 << 15
+       __m128i cb_r = _mm_set1_epi16(-5535);  // -0.168935 << 15
+       __m128i cb_g = _mm_set1_epi16(-10868); // -0.331665 << 15
+       __m128i cb_b = _mm_set1_epi16(16403);  //  0.500590 << 15
+       __m128i cr_r = _mm_set1_epi16(16377);  //  0.499813 << 15
+       __m128i cr_g = _mm_set1_epi16(-13714); // -0.418531 << 15
+       __m128i cr_b = _mm_set1_epi16(-2663);  // -0.081282 << 15
+
+       int i;
+
+       for (i = 0; i < (4096 * sizeof(sint16) / sizeof(__m128i)); i += (CACHE_LINE_BYTES / sizeof(__m128i)))
+       {
+               _mm_prefetch((char*)(&y_r_buf[i]), _MM_HINT_NTA);
+               _mm_prefetch((char*)(&cb_g_buf[i]), _MM_HINT_NTA);
+               _mm_prefetch((char*)(&cr_b_buf[i]), _MM_HINT_NTA);
+       }
+       for (i = 0; i < (4096 * sizeof(sint16) / sizeof(__m128i)); i++)
+       {
+               /*
+               In order to use SSE2 signed 16-bit integer multiplication we need to convert
+               the floating point factors to signed int without loosing information.
+               The result of this multiplication is 32 bit and using SSE2 we get either the
+               product's hi or lo word.
+               Thus we will multiply the factors by the highest possible 2^n and take the
+               upper 16 bits of the signed 32-bit result (_mm_mulhi_epi16).
+               Since the final result needs to be scaled by << 5 and also in in order to keep
+               the precision within the upper 16 bits we will also have to scale the RGB
+               values used in the multiplication by << 5+(16-n).
+               */
+
+               /* r = y_r_buf[i]; */
+               r = _mm_load_si128(&y_r_buf[i]);
+
+               /* g = cb_g_buf[i]; */
+               g = _mm_load_si128(&cb_g_buf[i]);
+
+               /* b = cr_b_buf[i]; */
+               b = _mm_load_si128(&cr_b_buf[i]);
+
+               /* r<<6; g<<6; b<<6 */
+               r = _mm_slli_epi16(r, 6);
+               g = _mm_slli_epi16(g, 6);
+               b = _mm_slli_epi16(b, 6);
+
+               /* y = HIWORD(r*y_r) + HIWORD(g*y_g) + HIWORD(b*y_b) + min */
+               y = _mm_mulhi_epi16(r, y_r);
+               y = _mm_add_epi16(y, _mm_mulhi_epi16(g, y_g));
+               y = _mm_add_epi16(y, _mm_mulhi_epi16(b, y_b));
+               y = _mm_add_epi16(y, min);
+               /* y_r_buf[i] = MINMAX(y, 0, (255 << 5)) - (128 << 5); */
+               _mm_between_epi16(y, min, max);
+               _mm_store_si128(&y_r_buf[i], y);
+
+               /* cb = HIWORD(r*cb_r) + HIWORD(g*cb_g) + HIWORD(b*cb_b) */
+               cb = _mm_mulhi_epi16(r, cb_r);
+               cb = _mm_add_epi16(cb, _mm_mulhi_epi16(g, cb_g));
+               cb = _mm_add_epi16(cb, _mm_mulhi_epi16(b, cb_b));
+               /* cb_g_buf[i] = MINMAX(cb, (-128 << 5), (127 << 5)); */
+               _mm_between_epi16(cb, min, max);
+               _mm_store_si128(&cb_g_buf[i], cb);
+
+               /* cr = HIWORD(r*cr_r) + HIWORD(g*cr_g) + HIWORD(b*cr_b) */
+               cr = _mm_mulhi_epi16(r, cr_r);
+               cr = _mm_add_epi16(cr, _mm_mulhi_epi16(g, cr_g));
+               cr = _mm_add_epi16(cr, _mm_mulhi_epi16(b, cr_b));
+               /* cr_b_buf[i] = MINMAX(cr, (-128 << 5), (127 << 5)); */
+               _mm_between_epi16(cr, min, max);
+               _mm_store_si128(&cr_b_buf[i], cr);
+       }
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_quantization_decode_block_sse2(sint16* buffer, const int buffer_size, const uint32 factor)
+{
+       __m128i a;
+       __m128i * ptr = (__m128i*) buffer;
+       __m128i * buf_end = (__m128i*) (buffer + buffer_size);
+
+       if (factor == 0)
+               return;
+
+       do
+       {
+               a = _mm_load_si128(ptr);
+               a = _mm_slli_epi16(a, factor);
+               _mm_store_si128(ptr, a);
+
+               ptr++;
+       } while(ptr < buf_end);
+}
+
+static void rfx_quantization_decode_sse2(sint16* buffer, const uint32* quantization_values)
+{
+       _mm_prefetch_buffer((char*) buffer, 4096 * sizeof(sint16));
+
+       rfx_quantization_decode_block_sse2(buffer, 4096, 5);
+
+       rfx_quantization_decode_block_sse2(buffer, 1024, quantization_values[8] - 6); /* HL1 */
+       rfx_quantization_decode_block_sse2(buffer + 1024, 1024, quantization_values[7] - 6); /* LH1 */
+       rfx_quantization_decode_block_sse2(buffer + 2048, 1024, quantization_values[9] - 6); /* HH1 */
+       rfx_quantization_decode_block_sse2(buffer + 3072, 256, quantization_values[5] - 6); /* HL2 */
+       rfx_quantization_decode_block_sse2(buffer + 3328, 256, quantization_values[4] - 6); /* LH2 */
+       rfx_quantization_decode_block_sse2(buffer + 3584, 256, quantization_values[6] - 6); /* HH2 */
+       rfx_quantization_decode_block_sse2(buffer + 3840, 64, quantization_values[2] - 6); /* HL3 */
+       rfx_quantization_decode_block_sse2(buffer + 3904, 64, quantization_values[1] - 6); /* LH3 */
+       rfx_quantization_decode_block_sse2(buffer + 3968, 64, quantization_values[3] - 6); /* HH3 */
+       rfx_quantization_decode_block_sse2(buffer + 4032, 64, quantization_values[0] - 6); /* LL3 */
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_quantization_encode_block_sse2(sint16* buffer, const int buffer_size, const uint32 factor)
+{
+       __m128i a;
+       __m128i* ptr = (__m128i*) buffer;
+       __m128i* buf_end = (__m128i*) (buffer + buffer_size);
+       __m128i half;
+
+       if (factor == 0)
+               return;
+
+       half = _mm_set1_epi16(1 << (factor - 1));
+       do
+       {
+               a = _mm_load_si128(ptr);
+               a = _mm_add_epi16(a, half);
+               a = _mm_srai_epi16(a, factor);
+               _mm_store_si128(ptr, a);
+
+               ptr++;
+       } while(ptr < buf_end);
+}
+
+static void rfx_quantization_encode_sse2(sint16* buffer, const uint32* quantization_values)
+{
+       _mm_prefetch_buffer((char*) buffer, 4096 * sizeof(sint16));
+
+       rfx_quantization_encode_block_sse2(buffer, 1024, quantization_values[8] - 6); /* HL1 */
+       rfx_quantization_encode_block_sse2(buffer + 1024, 1024, quantization_values[7] - 6); /* LH1 */
+       rfx_quantization_encode_block_sse2(buffer + 2048, 1024, quantization_values[9] - 6); /* HH1 */
+       rfx_quantization_encode_block_sse2(buffer + 3072, 256, quantization_values[5] - 6); /* HL2 */
+       rfx_quantization_encode_block_sse2(buffer + 3328, 256, quantization_values[4] - 6); /* LH2 */
+       rfx_quantization_encode_block_sse2(buffer + 3584, 256, quantization_values[6] - 6); /* HH2 */
+       rfx_quantization_encode_block_sse2(buffer + 3840, 64, quantization_values[2] - 6); /* HL3 */
+       rfx_quantization_encode_block_sse2(buffer + 3904, 64, quantization_values[1] - 6); /* LH3 */
+       rfx_quantization_encode_block_sse2(buffer + 3968, 64, quantization_values[3] - 6); /* HH3 */
+       rfx_quantization_encode_block_sse2(buffer + 4032, 64, quantization_values[0] - 6); /* LL3 */
+
+       rfx_quantization_encode_block_sse2(buffer, 4096, 5);
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_decode_block_horiz_sse2(sint16* l, sint16* h, sint16* dst, int subband_width)
+{
+       int y, n;
+       sint16* l_ptr = l;
+       sint16* h_ptr = h;
+       sint16* dst_ptr = dst;
+       int first;
+       int last;
+       __m128i l_n;
+       __m128i h_n;
+       __m128i h_n_m;
+       __m128i tmp_n;
+       __m128i dst_n;
+       __m128i dst_n_p;
+       __m128i dst1;
+       __m128i dst2;
+
+       for (y = 0; y < subband_width; y++)
+       {
+               /* Even coefficients */
+               for (n = 0; n < subband_width; n+=8)
+               {
+                       /* dst[2n] = l[n] - ((h[n-1] + h[n] + 1) >> 1); */
+                       
+                       l_n = _mm_load_si128((__m128i*) l_ptr);
+
+                       h_n = _mm_load_si128((__m128i*) h_ptr);
+                       h_n_m = _mm_loadu_si128((__m128i*) (h_ptr - 1));
+                       if (n == 0)
+                       {
+                               first = _mm_extract_epi16(h_n_m, 1);
+                               h_n_m = _mm_insert_epi16(h_n_m, first, 0);
+                       }
+                       
+                       tmp_n = _mm_add_epi16(h_n, h_n_m);
+                       tmp_n = _mm_add_epi16(tmp_n, _mm_set1_epi16(1));
+                       tmp_n = _mm_srai_epi16(tmp_n, 1);
+                       
+                       dst_n = _mm_sub_epi16(l_n, tmp_n);
+                       
+                       _mm_store_si128((__m128i*) l_ptr, dst_n);
+                       
+                       l_ptr+=8;
+                       h_ptr+=8;
+               }
+               l_ptr -= subband_width;
+               h_ptr -= subband_width;
+               
+               /* Odd coefficients */
+               for (n = 0; n < subband_width; n+=8)
+               {
+                       /* dst[2n + 1] = (h[n] << 1) + ((dst[2n] + dst[2n + 2]) >> 1); */
+                       
+                       h_n = _mm_load_si128((__m128i*) h_ptr);
+                       
+                       h_n = _mm_slli_epi16(h_n, 1);
+                       
+                       dst_n = _mm_load_si128((__m128i*) (l_ptr));
+                       dst_n_p = _mm_loadu_si128((__m128i*) (l_ptr + 1));
+                       if (n == subband_width - 8)
+                       {
+                               last = _mm_extract_epi16(dst_n_p, 6);
+                               dst_n_p = _mm_insert_epi16(dst_n_p, last, 7);
+                       }
+                       
+                       tmp_n = _mm_add_epi16(dst_n_p, dst_n);
+                       tmp_n = _mm_srai_epi16(tmp_n, 1);
+                       
+                       tmp_n = _mm_add_epi16(tmp_n, h_n);
+                       
+                       dst1 = _mm_unpacklo_epi16(dst_n, tmp_n);
+                       dst2 = _mm_unpackhi_epi16(dst_n, tmp_n);
+                       
+                       _mm_store_si128((__m128i*) dst_ptr, dst1);
+                       _mm_store_si128((__m128i*) (dst_ptr + 8), dst2);
+                       
+                       l_ptr+=8;
+                       h_ptr+=8;
+                       dst_ptr+=16;
+               }
+       }
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_decode_block_vert_sse2(sint16* l, sint16* h, sint16* dst, int subband_width)
+{
+       int x, n;
+       sint16* l_ptr = l;
+       sint16* h_ptr = h;
+       sint16* dst_ptr = dst;
+       __m128i l_n;
+       __m128i h_n;
+       __m128i tmp_n;
+       __m128i h_n_m;
+       __m128i dst_n;
+       __m128i dst_n_m;
+       __m128i dst_n_p;
+       
+       int total_width = subband_width + subband_width;
+
+       /* Even coefficients */
+       for (n = 0; n < subband_width; n++)
+       {
+               for (x = 0; x < total_width; x+=8)
+               {
+                       /* dst[2n] = l[n] - ((h[n-1] + h[n] + 1) >> 1); */
+                       
+                       l_n = _mm_load_si128((__m128i*) l_ptr);
+                       h_n = _mm_load_si128((__m128i*) h_ptr);
+                       
+                       tmp_n = _mm_add_epi16(h_n, _mm_set1_epi16(1));;
+                       if (n == 0)
+                               tmp_n = _mm_add_epi16(tmp_n, h_n);
+                       else
+                       {
+                               h_n_m = _mm_loadu_si128((__m128i*) (h_ptr - total_width));
+                               tmp_n = _mm_add_epi16(tmp_n, h_n_m);
+                       }
+                       tmp_n = _mm_srai_epi16(tmp_n, 1);
+                       
+                       dst_n = _mm_sub_epi16(l_n, tmp_n);
+                       _mm_store_si128((__m128i*) dst_ptr, dst_n);
+                       
+                       l_ptr+=8;
+                       h_ptr+=8;
+                       dst_ptr+=8;
+               }
+               dst_ptr+=total_width;
+       }
+       
+       h_ptr = h;
+       dst_ptr = dst + total_width;
+       
+       /* Odd coefficients */
+       for (n = 0; n < subband_width; n++)
+       {
+               for (x = 0; x < total_width; x+=8)
+               {
+                       /* dst[2n + 1] = (h[n] << 1) + ((dst[2n] + dst[2n + 2]) >> 1); */
+                       
+                       h_n = _mm_load_si128((__m128i*) h_ptr);
+                       dst_n_m = _mm_load_si128((__m128i*) (dst_ptr - total_width));
+                       h_n = _mm_slli_epi16(h_n, 1);
+                       
+                       tmp_n = dst_n_m;
+                       if (n == subband_width - 1)
+                               tmp_n = _mm_add_epi16(tmp_n, dst_n_m);
+                       else
+                       {
+                               dst_n_p = _mm_loadu_si128((__m128i*) (dst_ptr + total_width));
+                               tmp_n = _mm_add_epi16(tmp_n, dst_n_p);
+                       }
+                       tmp_n = _mm_srai_epi16(tmp_n, 1);
+                       
+                       dst_n = _mm_add_epi16(tmp_n, h_n);
+                       _mm_store_si128((__m128i*) dst_ptr, dst_n);
+
+                       h_ptr+=8;
+                       dst_ptr+=8;
+               }
+               dst_ptr+=total_width;
+       }
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_decode_block_sse2(sint16* buffer, sint16* idwt, int subband_width)
+{
+       sint16 *hl, *lh, *hh, *ll;
+       sint16 *l_dst, *h_dst;
+
+       _mm_prefetch_buffer((char*) idwt, subband_width * 4 * sizeof(sint16));
+
+       /* Inverse DWT in horizontal direction, results in 2 sub-bands in L, H order in tmp buffer idwt. */
+       /* The 4 sub-bands are stored in HL(0), LH(1), HH(2), LL(3) order. */
+       /* The lower part L uses LL(3) and HL(0). */
+       /* The higher part H uses LH(1) and HH(2). */
+
+       ll = buffer + subband_width * subband_width * 3;
+       hl = buffer;
+       l_dst = idwt;
+
+       rfx_dwt_2d_decode_block_horiz_sse2(ll, hl, l_dst, subband_width);
+
+       lh = buffer + subband_width * subband_width;
+       hh = buffer + subband_width * subband_width * 2;
+       h_dst = idwt + subband_width * subband_width * 2;
+       
+       rfx_dwt_2d_decode_block_horiz_sse2(lh, hh, h_dst, subband_width);
+
+       /* Inverse DWT in vertical direction, results are stored in original buffer. */
+       rfx_dwt_2d_decode_block_vert_sse2(l_dst, h_dst, buffer, subband_width);
+}
+
+static void rfx_dwt_2d_decode_sse2(sint16* buffer, sint16* dwt_buffer)
+{
+       _mm_prefetch_buffer((char*) buffer, 4096 * sizeof(sint16));
+       
+       rfx_dwt_2d_decode_block_sse2(buffer + 3840, dwt_buffer, 8);
+       rfx_dwt_2d_decode_block_sse2(buffer + 3072, dwt_buffer, 16);
+       rfx_dwt_2d_decode_block_sse2(buffer, dwt_buffer, 32);
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_encode_block_vert_sse2(sint16* src, sint16* l, sint16* h, int subband_width)
+{
+       int total_width;
+       int x;
+       int n;
+       __m128i src_2n;
+       __m128i src_2n_1;
+       __m128i src_2n_2;
+       __m128i h_n;
+       __m128i h_n_m;
+       __m128i l_n;
+
+       total_width = subband_width << 1;
+
+       for (n = 0; n < subband_width; n++)
+       {
+               for (x = 0; x < total_width; x += 8)
+               {
+                       src_2n = _mm_load_si128((__m128i*) src);
+                       src_2n_1 = _mm_load_si128((__m128i*) (src + total_width));
+                       if (n < subband_width - 1)
+                               src_2n_2 = _mm_load_si128((__m128i*) (src + 2 * total_width));
+                       else
+                               src_2n_2 = src_2n;
+
+                       /* h[n] = (src[2n + 1] - ((src[2n] + src[2n + 2]) >> 1)) >> 1 */
+
+                       h_n = _mm_add_epi16(src_2n, src_2n_2);
+                       h_n = _mm_srai_epi16(h_n, 1);
+                       h_n = _mm_sub_epi16(src_2n_1, h_n);
+                       h_n = _mm_srai_epi16(h_n, 1);
+
+                       _mm_store_si128((__m128i*) h, h_n);
+
+                       if (n == 0)
+                               h_n_m = h_n;
+                       else
+                               h_n_m = _mm_load_si128((__m128i*) (h - total_width));
+
+                       /* l[n] = src[2n] + ((h[n - 1] + h[n]) >> 1) */
+
+                       l_n = _mm_add_epi16(h_n_m, h_n);
+                       l_n = _mm_srai_epi16(l_n, 1);
+                       l_n = _mm_add_epi16(l_n, src_2n);
+
+                       _mm_store_si128((__m128i*) l, l_n);
+
+                       src += 8;
+                       l += 8;
+                       h += 8;
+               }
+               src += total_width;
+       }
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_encode_block_horiz_sse2(sint16* src, sint16* l, sint16* h, int subband_width)
+{
+       int y;
+       int n;
+       int first;
+       __m128i src_2n;
+       __m128i src_2n_1;
+       __m128i src_2n_2;
+       __m128i h_n;
+       __m128i h_n_m;
+       __m128i l_n;
+
+       for (y = 0; y < subband_width; y++)
+       {
+               for (n = 0; n < subband_width; n += 8)
+               {
+                       /* The following 3 Set operations consumes more than half of the total DWT processing time! */
+                       src_2n = _mm_set_epi16(src[14], src[12], src[10], src[8], src[6], src[4], src[2], src[0]);
+                       src_2n_1 = _mm_set_epi16(src[15], src[13], src[11], src[9], src[7], src[5], src[3], src[1]);
+                       src_2n_2 = _mm_set_epi16(n == subband_width - 8 ? src[14] : src[16],
+                               src[14], src[12], src[10], src[8], src[6], src[4], src[2]);
+
+                       /* h[n] = (src[2n + 1] - ((src[2n] + src[2n + 2]) >> 1)) >> 1 */
+
+                       h_n = _mm_add_epi16(src_2n, src_2n_2);
+                       h_n = _mm_srai_epi16(h_n, 1);
+                       h_n = _mm_sub_epi16(src_2n_1, h_n);
+                       h_n = _mm_srai_epi16(h_n, 1);
+
+                       _mm_store_si128((__m128i*) h, h_n);
+
+                       h_n_m = _mm_loadu_si128((__m128i*) (h - 1));
+                       if (n == 0)
+                       {
+                               first = _mm_extract_epi16(h_n_m, 1);
+                               h_n_m = _mm_insert_epi16(h_n_m, first, 0);
+                       }
+
+                       /* l[n] = src[2n] + ((h[n - 1] + h[n]) >> 1) */
+
+                       l_n = _mm_add_epi16(h_n_m, h_n);
+                       l_n = _mm_srai_epi16(l_n, 1);
+                       l_n = _mm_add_epi16(l_n, src_2n);
+
+                       _mm_store_si128((__m128i*) l, l_n);
+
+                       src += 16;
+                       l += 8;
+                       h += 8;
+               }
+       }
+}
+
+static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+rfx_dwt_2d_encode_block_sse2(sint16* buffer, sint16* dwt, int subband_width)
+{
+       sint16 *hl, *lh, *hh, *ll;
+       sint16 *l_src, *h_src;
+
+       _mm_prefetch_buffer((char*) dwt, subband_width * 4 * sizeof(sint16));
+
+       /* DWT in vertical direction, results in 2 sub-bands in L, H order in tmp buffer dwt. */
+
+       l_src = dwt;
+       h_src = dwt + subband_width * subband_width * 2;
+
+       rfx_dwt_2d_encode_block_vert_sse2(buffer, l_src, h_src, subband_width);
+
+       /* DWT in horizontal direction, results in 4 sub-bands in HL(0), LH(1), HH(2), LL(3) order, stored in original buffer. */
+       /* The lower part L generates LL(3) and HL(0). */
+       /* The higher part H generates LH(1) and HH(2). */
+
+       ll = buffer + subband_width * subband_width * 3;
+       hl = buffer;
+
+       lh = buffer + subband_width * subband_width;
+       hh = buffer + subband_width * subband_width * 2;
+
+       rfx_dwt_2d_encode_block_horiz_sse2(l_src, ll, hl, subband_width);
+       rfx_dwt_2d_encode_block_horiz_sse2(h_src, lh, hh, subband_width);
+}
+
+static void rfx_dwt_2d_encode_sse2(sint16* buffer, sint16* dwt_buffer)
+{
+       _mm_prefetch_buffer((char*) buffer, 4096 * sizeof(sint16));
+       
+       rfx_dwt_2d_encode_block_sse2(buffer, dwt_buffer, 32);
+       rfx_dwt_2d_encode_block_sse2(buffer + 3072, dwt_buffer, 16);
+       rfx_dwt_2d_encode_block_sse2(buffer + 3840, dwt_buffer, 8);
+}
+
+void rfx_init_sse2(RFX_CONTEXT* context)
+{
+       DEBUG_RFX("Using SSE2 optimizations");
+
+       IF_PROFILER(context->priv->prof_rfx_decode_ycbcr_to_rgb->name = "rfx_decode_ycbcr_to_rgb_sse2");
+       IF_PROFILER(context->priv->prof_rfx_encode_rgb_to_ycbcr->name = "rfx_encode_rgb_to_ycbcr_sse2");
+       IF_PROFILER(context->priv->prof_rfx_quantization_decode->name = "rfx_quantization_decode_sse2");
+       IF_PROFILER(context->priv->prof_rfx_quantization_encode->name = "rfx_quantization_encode_sse2");
+       IF_PROFILER(context->priv->prof_rfx_dwt_2d_decode->name = "rfx_dwt_2d_decode_sse2");
+       IF_PROFILER(context->priv->prof_rfx_dwt_2d_encode->name = "rfx_dwt_2d_encode_sse2");
+
+       context->decode_ycbcr_to_rgb = rfx_decode_ycbcr_to_rgb_sse2;
+       context->encode_rgb_to_ycbcr = rfx_encode_rgb_to_ycbcr_sse2;
+       context->quantization_decode = rfx_quantization_decode_sse2;
+       context->quantization_encode = rfx_quantization_encode_sse2;
+       context->dwt_2d_decode = rfx_dwt_2d_decode_sse2;
+       context->dwt_2d_encode = rfx_dwt_2d_encode_sse2;
+}
diff --git a/libfreerdp-codec/rfx_sse2.h b/libfreerdp-codec/rfx_sse2.h
new file mode 100644 (file)
index 0000000..b9a9a2a
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library - SSE2 Optimizations
+ *
+ * Copyright 2011 Stephen Erisman
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_SSE2_H
+#define __RFX_SSE2_H
+
+#include <freerdp/codec/rfx.h>
+
+void rfx_init_sse2(RFX_CONTEXT* context);
+
+#ifndef RFX_INIT_SIMD
+#define RFX_INIT_SIMD(_rfx_context) rfx_init_sse2(_rfx_context)
+#endif
+
+#endif /* __RFX_SSE2_H */
diff --git a/libfreerdp-codec/rfx_types.h b/libfreerdp-codec/rfx_types.h
new file mode 100644 (file)
index 0000000..a18034e
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RemoteFX Codec Library
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RFX_TYPES_H
+#define __RFX_TYPES_H
+
+#include "config.h"
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/profiler.h>
+
+#ifdef WITH_DEBUG_RFX
+#define DEBUG_RFX(fmt, ...) DEBUG_CLASS(RFX, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_RFX(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#include "rfx_pool.h"
+
+struct _RFX_CONTEXT_PRIV
+{
+       /* pre-allocated buffers */
+
+       RFX_POOL* pool; /* memory pool */
+
+       sint16 y_r_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
+       sint16 cb_g_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
+       sint16 cr_b_mem[4096 + 8]; /* 4096 = 64x64 (+ 8x2 = 16 for mem align) */
+       sint16* y_r_buffer;
+       sint16* cb_g_buffer;
+       sint16* cr_b_buffer;
+       sint16 dwt_mem[32 * 32 * 2 * 2 + 8]; /* maximum sub-band width is 32 */
+
+       sint16* dwt_buffer;
+
+       /* profilers */
+       PROFILER_DEFINE(prof_rfx_decode_rgb);
+       PROFILER_DEFINE(prof_rfx_decode_component);
+       PROFILER_DEFINE(prof_rfx_rlgr_decode);
+       PROFILER_DEFINE(prof_rfx_differential_decode);
+       PROFILER_DEFINE(prof_rfx_quantization_decode);
+       PROFILER_DEFINE(prof_rfx_dwt_2d_decode);
+       PROFILER_DEFINE(prof_rfx_decode_ycbcr_to_rgb);
+       PROFILER_DEFINE(prof_rfx_decode_format_rgb);
+
+       PROFILER_DEFINE(prof_rfx_encode_rgb);
+       PROFILER_DEFINE(prof_rfx_encode_component);
+       PROFILER_DEFINE(prof_rfx_rlgr_encode);
+       PROFILER_DEFINE(prof_rfx_differential_encode);
+       PROFILER_DEFINE(prof_rfx_quantization_encode);
+       PROFILER_DEFINE(prof_rfx_dwt_2d_encode);
+       PROFILER_DEFINE(prof_rfx_encode_rgb_to_ycbcr);
+       PROFILER_DEFINE(prof_rfx_encode_format_rgb);
+};
+
+#endif /* __RFX_TYPES_H */
diff --git a/libfreerdp-core/CMakeLists.txt b/libfreerdp-core/CMakeLists.txt
new file mode 100644 (file)
index 0000000..939a9cf
--- /dev/null
@@ -0,0 +1,111 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-core cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+add_definitions(-DEXT_PATH="/usr/lib/freerdp/extensions")
+include_directories(${OPENSSL_INCLUDE_DIR})
+include_directories(${ZLIB_INCLUDE_DIRS})
+
+set(LIBFREERDP_CORE_SRCS
+       activation.c
+       activation.h
+       extension.c
+       extension.h
+       ber.c
+       ber.h
+       gcc.c
+       gcc.h
+       mcs.c
+       mcs.h
+       nego.c
+       nego.h
+       info.c
+       info.h
+       input.c
+       input.h
+       crypto.c
+       crypto.h
+       credssp.c
+       credssp.h
+       ntlmssp.c
+       ntlmssp.h
+       license.c
+       license.h
+       errinfo.c
+       errinfo.h
+       security.c
+       security.h
+       settings.c
+       orders.c
+       orders.h
+       freerdp.c
+       graphics.c
+       capabilities.c
+       capabilities.h
+       certificate.c
+       certificate.h
+       connection.c
+       connection.h
+       redirection.c
+       redirection.h
+       rdp.c
+       rdp.h
+       per.c
+       per.h
+       tcp.c
+       tcp.h
+       tls.c
+       tls.h
+       tpdu.c
+       tpdu.h
+       tpkt.c
+       tpkt.h
+       fastpath.c
+       fastpath.h
+       surface.c
+       surface.h
+       transport.c
+       transport.h
+       update.c
+       update.h
+       channel.c
+       channel.h
+       window.c
+       window.h
+       listener.c
+       listener.h
+       peer.c
+       peer.h
+    mppc.c
+)
+
+add_library(freerdp-core ${LIBFREERDP_CORE_SRCS})
+
+set_target_properties(freerdp-core PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+
+if(WIN32)
+       target_link_libraries(freerdp-core ws2_32)
+else()
+       target_link_libraries(freerdp-core ${ZLIB_LIBRARIES})   
+endif()
+
+target_link_libraries(freerdp-core ${OPENSSL_LIBRARIES})
+target_link_libraries(freerdp-core freerdp-utils)
+target_link_libraries(freerdp-core freerdp-codec)
+
+install(TARGETS freerdp-core DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/libfreerdp-core/activation.c b/libfreerdp-core/activation.c
new file mode 100644 (file)
index 0000000..f93e75d
--- /dev/null
@@ -0,0 +1,340 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Activation Sequence
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "activation.h"
+
+/*
+static const char* const CTRLACTION_STRINGS[] =
+{
+               "",
+               "CTRLACTION_REQUEST_CONTROL",
+               "CTRLACTION_GRANTED_CONTROL",
+               "CTRLACTION_DETACH",
+               "CTRLACTION_COOPERATE"
+};
+*/
+
+void rdp_write_synchronize_pdu(STREAM* s, rdpSettings* settings)
+{
+       stream_write_uint16(s, SYNCMSGTYPE_SYNC); /* messageType (2 bytes) */
+       stream_write_uint16(s, settings->pdu_source); /* targetUser (2 bytes) */
+}
+
+boolean rdp_recv_synchronize_pdu(rdpRdp* rdp, STREAM* s)
+{
+       if (rdp->settings->server_mode)
+               return rdp_recv_server_synchronize_pdu(rdp, s);
+       else
+               return rdp_recv_client_synchronize_pdu(rdp, s);
+}
+
+boolean rdp_recv_server_synchronize_pdu(rdpRdp* rdp, STREAM* s)
+{
+       rdp->finalize_sc_pdus |= FINALIZE_SC_SYNCHRONIZE_PDU;
+       return true;
+}
+
+boolean rdp_send_server_synchronize_pdu(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+
+       rdp_write_synchronize_pdu(s, rdp->settings);
+       rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SYNCHRONIZE, rdp->mcs->user_id);
+
+       return true;
+}
+
+boolean rdp_recv_client_synchronize_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 messageType;
+
+       rdp->finalize_sc_pdus |= FINALIZE_SC_SYNCHRONIZE_PDU;
+
+       if (stream_get_left(s) < 4)
+               return false;
+
+       stream_read_uint16(s, messageType); /* messageType (2 bytes) */
+
+       if (messageType != SYNCMSGTYPE_SYNC)
+               return false;
+
+       /* targetUser (2 bytes) */
+       stream_seek_uint16(s);
+
+       return true;
+}
+
+boolean rdp_send_client_synchronize_pdu(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+
+       rdp_write_synchronize_pdu(s, rdp->settings);
+
+       return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SYNCHRONIZE, rdp->mcs->user_id);
+}
+
+boolean rdp_recv_control_pdu(STREAM* s, uint16* action)
+{
+       if (stream_get_left(s) < 8)
+               return false;
+
+       stream_read_uint16(s, *action); /* action (2 bytes) */
+       stream_seek_uint16(s); /* grantId (2 bytes) */
+       stream_seek_uint32(s); /* controlId (4 bytes) */
+
+       return true;
+}
+
+void rdp_write_client_control_pdu(STREAM* s, uint16 action)
+{
+       stream_write_uint16(s, action); /* action (2 bytes) */
+       stream_write_uint16(s, 0); /* grantId (2 bytes) */
+       stream_write_uint32(s, 0); /* controlId (4 bytes) */
+}
+
+boolean rdp_recv_server_control_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 action;
+
+       rdp_recv_control_pdu(s, &action);
+
+       switch (action)
+       {
+               case CTRLACTION_COOPERATE:
+                       rdp->finalize_sc_pdus |= FINALIZE_SC_CONTROL_COOPERATE_PDU;
+                       break;
+
+               case CTRLACTION_GRANTED_CONTROL:
+                       rdp->finalize_sc_pdus |= FINALIZE_SC_CONTROL_GRANTED_PDU;
+                       break;
+       }
+
+       return true;
+}
+
+boolean rdp_send_server_control_cooperate_pdu(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+
+       stream_write_uint16(s, CTRLACTION_COOPERATE); /* action (2 bytes) */
+       stream_write_uint16(s, 0); /* grantId (2 bytes) */
+       stream_write_uint32(s, 0); /* controlId (4 bytes) */
+
+       rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_CONTROL, rdp->mcs->user_id);
+
+       return true;
+}
+
+boolean rdp_send_server_control_granted_pdu(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+
+       stream_write_uint16(s, CTRLACTION_GRANTED_CONTROL); /* action (2 bytes) */
+       stream_write_uint16(s, rdp->mcs->user_id); /* grantId (2 bytes) */
+       stream_write_uint32(s, 0x03EA); /* controlId (4 bytes) */
+
+       rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_CONTROL, rdp->mcs->user_id);
+
+       return true;
+}
+
+boolean rdp_send_client_control_pdu(rdpRdp* rdp, uint16 action)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+       rdp_write_client_control_pdu(s, action);
+
+       return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_CONTROL, rdp->mcs->user_id);
+}
+
+void rdp_write_persistent_list_entry(STREAM* s, uint32 key1, uint32 key2)
+{
+       stream_write_uint32(s, key1); /* key1 (4 bytes) */
+       stream_write_uint32(s, key2); /* key2 (4 bytes) */
+}
+
+void rdp_write_client_persistent_key_list_pdu(STREAM* s, rdpSettings* settings)
+{
+       stream_write_uint16(s, 0); /* numEntriesCache0 (2 bytes) */
+       stream_write_uint16(s, 0); /* numEntriesCache1 (2 bytes) */
+       stream_write_uint16(s, 0); /* numEntriesCache2 (2 bytes) */
+       stream_write_uint16(s, 0); /* numEntriesCache3 (2 bytes) */
+       stream_write_uint16(s, 0); /* numEntriesCache4 (2 bytes) */
+       stream_write_uint16(s, 0); /* totalEntriesCache0 (2 bytes) */
+       stream_write_uint16(s, 0); /* totalEntriesCache1 (2 bytes) */
+       stream_write_uint16(s, 0); /* totalEntriesCache2 (2 bytes) */
+       stream_write_uint16(s, 0); /* totalEntriesCache3 (2 bytes) */
+       stream_write_uint16(s, 0); /* totalEntriesCache4 (2 bytes) */
+       stream_write_uint8(s, PERSIST_FIRST_PDU | PERSIST_LAST_PDU); /* bBitMask (1 byte) */
+       stream_write_uint8(s, 0); /* pad1 (1 byte) */
+       stream_write_uint16(s, 0); /* pad3 (2 bytes) */
+
+       /* entries */
+}
+
+boolean rdp_send_client_persistent_key_list_pdu(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+       rdp_write_client_persistent_key_list_pdu(s, rdp->settings);
+
+       return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_BITMAP_CACHE_PERSISTENT_LIST, rdp->mcs->user_id);
+}
+
+boolean rdp_recv_client_font_list_pdu(STREAM* s)
+{
+       if (stream_get_left(s) < 8)
+               return false;
+
+       return true;
+}
+
+void rdp_write_client_font_list_pdu(STREAM* s, uint16 flags)
+{
+       stream_write_uint16(s, 0); /* numberFonts (2 bytes) */
+       stream_write_uint16(s, 0); /* totalNumFonts (2 bytes) */
+       stream_write_uint16(s, flags); /* listFlags (2 bytes) */
+       stream_write_uint16(s, 50); /* entrySize (2 bytes) */
+}
+
+boolean rdp_send_client_font_list_pdu(rdpRdp* rdp, uint16 flags)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+       rdp_write_client_font_list_pdu(s, flags);
+
+       return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FONT_LIST, rdp->mcs->user_id);
+}
+
+boolean rdp_recv_font_map_pdu(rdpRdp* rdp, STREAM* s)
+{
+       if (rdp->settings->server_mode)
+               return rdp_recv_server_font_map_pdu(rdp, s);
+       else
+               return rdp_recv_client_font_map_pdu(rdp, s);
+}
+
+boolean rdp_recv_server_font_map_pdu(rdpRdp* rdp, STREAM* s)
+{
+       rdp->finalize_sc_pdus |= FINALIZE_SC_FONT_MAP_PDU;
+       return true;
+}
+
+boolean rdp_recv_client_font_map_pdu(rdpRdp* rdp, STREAM* s)
+{
+       rdp->finalize_sc_pdus |= FINALIZE_SC_FONT_MAP_PDU;
+
+       stream_seek_uint16(s); /* numberEntries (2 bytes) */
+       stream_seek_uint16(s); /* totalNumEntries (2 bytes) */
+       stream_seek_uint16(s); /* mapFlags (2 bytes) */
+       stream_seek_uint16(s); /* entrySize (2 bytes) */
+
+       return true;
+}
+
+boolean rdp_send_server_font_map_pdu(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_data_pdu_init(rdp);
+
+       stream_write_uint16(s, 0); /* numberEntries (2 bytes) */
+       stream_write_uint16(s, 0); /* totalNumEntries (2 bytes) */
+       stream_write_uint16(s, FONTLIST_FIRST | FONTLIST_LAST); /* mapFlags (2 bytes) */
+       stream_write_uint16(s, 4); /* entrySize (2 bytes) */
+
+       return rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_FONT_MAP, rdp->mcs->user_id);
+}
+
+boolean rdp_recv_deactivate_all(rdpRdp* rdp, STREAM* s)
+{
+       uint16 lengthSourceDescriptor;
+
+       /*
+        * Windows XP can send short DEACTIVATE_ALL PDU that doesn't contain
+        * the following fields.
+        */
+       if (stream_get_left(s) > 0)
+       {
+               stream_read_uint32(s, rdp->settings->share_id); /* shareId (4 bytes) */
+               stream_read_uint16(s, lengthSourceDescriptor); /* lengthSourceDescriptor (2 bytes) */
+               stream_seek(s, lengthSourceDescriptor); /* sourceDescriptor (should be 0x00) */
+       }
+
+       rdp->state = CONNECTION_STATE_CAPABILITY;
+
+       while (rdp->state != CONNECTION_STATE_ACTIVE)
+       {
+               if (rdp_check_fds(rdp) < 0)
+                       return false;
+               if (rdp->disconnect)
+                       break;
+       }
+
+       return true;
+}
+
+boolean rdp_send_deactivate_all(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_pdu_init(rdp);
+
+       stream_write_uint32(s, rdp->settings->share_id); /* shareId (4 bytes) */
+       stream_write_uint16(s, 1); /* lengthSourceDescriptor (2 bytes) */
+       stream_write_uint8(s, 0); /* sourceDescriptor (should be 0x00) */
+
+       return rdp_send_pdu(rdp, s, PDU_TYPE_DEACTIVATE_ALL, rdp->mcs->user_id);
+}
+
+boolean rdp_server_accept_client_control_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 action;
+
+       if (!rdp_recv_control_pdu(s, &action))
+               return false;
+       if (action == CTRLACTION_REQUEST_CONTROL)
+       {
+               if (!rdp_send_server_control_granted_pdu(rdp))
+                       return false;
+       }
+       return true;
+}
+
+boolean rdp_server_accept_client_font_list_pdu(rdpRdp* rdp, STREAM* s)
+{
+       if (!rdp_recv_client_font_list_pdu(s))
+               return false;
+       if (!rdp_send_server_font_map_pdu(rdp))
+               return false;
+
+       return true;
+}
+
diff --git a/libfreerdp-core/activation.h b/libfreerdp-core/activation.h
new file mode 100644 (file)
index 0000000..2589171
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Activation Sequence
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ACTIVATION_H
+#define __ACTIVATION_H
+
+#include "rdp.h"
+
+#include <freerdp/settings.h>
+#include <freerdp/utils/memory.h>
+
+#define SYNCMSGTYPE_SYNC               0x0001
+
+#define CTRLACTION_REQUEST_CONTROL     0x0001
+#define CTRLACTION_GRANTED_CONTROL     0x0002
+#define CTRLACTION_DETACH              0x0003
+#define CTRLACTION_COOPERATE           0x0004
+
+#define PERSIST_FIRST_PDU              0x01
+#define PERSIST_LAST_PDU               0x02
+
+#define FONTLIST_FIRST                 0x0001
+#define FONTLIST_LAST                  0x0002
+
+boolean rdp_recv_deactivate_all(rdpRdp* rdp, STREAM* s);
+boolean rdp_send_deactivate_all(rdpRdp* rdp);
+
+boolean rdp_recv_synchronize_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_recv_server_synchronize_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_send_server_synchronize_pdu(rdpRdp* rdp);
+boolean rdp_recv_client_synchronize_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_send_client_synchronize_pdu(rdpRdp* rdp);
+boolean rdp_recv_control_pdu(STREAM* s, uint16* action);
+boolean rdp_recv_server_control_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_send_server_control_cooperate_pdu(rdpRdp* rdp);
+boolean rdp_send_server_control_granted_pdu(rdpRdp* rdp);
+boolean rdp_send_client_control_pdu(rdpRdp* rdp, uint16 action);
+boolean rdp_send_client_persistent_key_list_pdu(rdpRdp* rdp);
+boolean rdp_recv_client_font_list_pdu(STREAM* s);
+boolean rdp_send_client_font_list_pdu(rdpRdp* rdp, uint16 flags);
+boolean rdp_recv_font_map_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_recv_server_font_map_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_recv_client_font_map_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_send_server_font_map_pdu(rdpRdp* rdp);
+
+boolean rdp_server_accept_client_control_pdu(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_client_font_list_pdu(rdpRdp* rdp, STREAM* s);
+
+#endif /* __ACTIVATION_H */
diff --git a/libfreerdp-core/ber.c b/libfreerdp-core/ber.c
new file mode 100644 (file)
index 0000000..86b69f5
--- /dev/null
@@ -0,0 +1,432 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * ASN.1 Basic Encoding Rules (BER)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ber.h"
+
+void ber_read_length(STREAM* s, int* length)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte & 0x80)
+       {
+               byte &= ~(0x80);
+
+               if (byte == 1)
+                       stream_read_uint8(s, *length);
+               if (byte == 2)
+                       stream_read_uint16_be(s, *length);
+       }
+       else
+       {
+               *length = byte;
+       }
+}
+
+/**
+ * Write BER length.
+ * @param s stream
+ * @param length length
+ */
+
+int ber_write_length(STREAM* s, int length)
+{
+       if (length > 0x7F)
+       {
+               stream_write_uint8(s, 0x82);
+               stream_write_uint16_be(s, length);
+               return 3;
+       }
+       else
+       {
+               stream_write_uint8(s, length);
+               return 1;
+       }
+}
+
+int _ber_skip_length(int length)
+{
+       if (length > 0x7F)
+               return 3;
+       else
+               return 1;
+}
+
+int ber_get_content_length(int length)
+{
+       if (length - 1 > 0x7F)
+               return length - 4;
+       else
+               return length - 2;
+}
+
+/**
+ * Read BER Universal tag.
+ * @param s stream
+ * @param tag BER universally-defined tag
+ * @return
+ */
+
+boolean ber_read_universal_tag(STREAM* s, uint8 tag, boolean pc)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte != (BER_CLASS_UNIV | BER_PC(pc) | (BER_TAG_MASK & tag)))
+               return false;
+
+       return true;
+}
+
+/**
+ * Write BER Universal tag.
+ * @param s stream
+ * @param tag BER universally-defined tag
+ * @param pc primitive (false) or constructed (true)
+ */
+
+void ber_write_universal_tag(STREAM* s, uint8 tag, boolean pc)
+{
+       stream_write_uint8(s, (BER_CLASS_UNIV | BER_PC(pc)) | (BER_TAG_MASK & tag));
+}
+
+/**
+ * Read BER Application tag.
+ * @param s stream
+ * @param tag BER application-defined tag
+ * @param length length
+ */
+
+boolean ber_read_application_tag(STREAM* s, uint8 tag, int* length)
+{
+       uint8 byte;
+
+       if (tag > 30)
+       {
+               stream_read_uint8(s, byte);
+
+               if (byte != ((BER_CLASS_APPL | BER_CONSTRUCT) | BER_TAG_MASK))
+                       return false;
+
+               stream_read_uint8(s, byte);
+
+               if (byte != tag)
+                       return false;
+
+               ber_read_length(s, length);
+       }
+       else
+       {
+               stream_read_uint8(s, byte);
+
+               if (byte != ((BER_CLASS_APPL | BER_CONSTRUCT) | (BER_TAG_MASK & tag)))
+                       return false;
+
+               ber_read_length(s, length);
+       }
+
+       return true;
+}
+
+/**
+ * Write BER Application tag.
+ * @param s stream
+ * @param tag BER application-defined tag
+ * @param length length
+ */
+
+void ber_write_application_tag(STREAM* s, uint8 tag, int length)
+{
+       if (tag > 30)
+       {
+               stream_write_uint8(s, (BER_CLASS_APPL | BER_CONSTRUCT) | BER_TAG_MASK);
+               stream_write_uint8(s, tag);
+               ber_write_length(s, length);
+       }
+       else
+       {
+               stream_write_uint8(s, (BER_CLASS_APPL | BER_CONSTRUCT) | (BER_TAG_MASK & tag));
+               ber_write_length(s, length);
+       }
+}
+
+boolean ber_read_contextual_tag(STREAM* s, uint8 tag, int* length, boolean pc)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte != ((BER_CLASS_CTXT | BER_PC(pc)) | (BER_TAG_MASK & tag)))
+       {
+               stream_rewind(s, 1);
+               return false;
+       }
+
+       ber_read_length(s, length);
+
+       return true;
+}
+
+int ber_write_contextual_tag(STREAM* s, uint8 tag, int length, boolean pc)
+{
+       stream_write_uint8(s, (BER_CLASS_CTXT | BER_PC(pc)) | (BER_TAG_MASK & tag));
+       return ber_write_length(s, length) + 1;
+}
+
+int ber_skip_contextual_tag(int length)
+{
+       return _ber_skip_length(length) + 1;
+}
+
+boolean ber_read_sequence_tag(STREAM* s, int* length)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte != ((BER_CLASS_UNIV | BER_CONSTRUCT) | (BER_TAG_SEQUENCE_OF)))
+               return false;
+
+       ber_read_length(s, length);
+
+       return true;
+}
+
+/**
+ * Write BER SEQUENCE tag.
+ * @param s stream
+ * @param length length
+ */
+
+int ber_write_sequence_tag(STREAM* s, int length)
+{
+       stream_write_uint8(s, (BER_CLASS_UNIV | BER_CONSTRUCT) | (BER_TAG_MASK & BER_TAG_SEQUENCE));
+       return ber_write_length(s, length) + 1;
+}
+
+int ber_skip_sequence(int length)
+{
+       return 1 + _ber_skip_length(length) + length;
+}
+
+int ber_skip_sequence_tag(int length)
+{
+       return 1 + _ber_skip_length(length);
+}
+
+boolean ber_read_enumerated(STREAM* s, uint8* enumerated, uint8 count)
+{
+       int length;
+
+       ber_read_universal_tag(s, BER_TAG_ENUMERATED, false);
+       ber_read_length(s, &length);
+
+       if (length == 1)
+               stream_read_uint8(s, *enumerated);
+       else
+               return false;
+
+       /* check that enumerated value falls within expected range */
+       if (*enumerated + 1 > count)
+               return false;
+
+       return true;
+}
+
+void ber_write_enumerated(STREAM* s, uint8 enumerated, uint8 count)
+{
+       ber_write_universal_tag(s, BER_TAG_ENUMERATED, false);
+       ber_write_length(s, 1);
+       stream_write_uint8(s, enumerated);
+}
+
+boolean ber_read_bit_string(STREAM* s, int* length, uint8* padding)
+{
+       ber_read_universal_tag(s, BER_TAG_BIT_STRING, false);
+       ber_read_length(s, length);
+       stream_read_uint8(s, *padding);
+
+       return true;
+}
+
+boolean ber_read_octet_string(STREAM* s, int* length)
+{
+       ber_read_universal_tag(s, BER_TAG_OCTET_STRING, false);
+       ber_read_length(s, length);
+
+       return true;
+}
+
+/**
+ * Write a BER OCTET_STRING
+ * @param s stream
+ * @param oct_str octet string
+ * @param length string length
+ */
+
+void ber_write_octet_string(STREAM* s, const uint8* oct_str, int length)
+{
+       ber_write_universal_tag(s, BER_TAG_OCTET_STRING, false);
+       ber_write_length(s, length);
+       stream_write(s, oct_str, length);
+}
+
+int ber_write_octet_string_tag(STREAM* s, int length)
+{
+       ber_write_universal_tag(s, BER_TAG_OCTET_STRING, false);
+       ber_write_length(s, length);
+       return 1 + _ber_skip_length(length);
+}
+
+int ber_skip_octet_string(int length)
+{
+       return 1 + _ber_skip_length(length) + length;
+}
+
+/**
+ * Read a BER BOOLEAN
+ * @param s
+ * @param value
+ */
+
+boolean ber_read_boolean(STREAM* s, boolean* value)
+{
+       int length;
+       uint8 v;
+
+       if (!ber_read_universal_tag(s, BER_TAG_BOOLEAN, false))
+               return false;
+       ber_read_length(s, &length);
+       if (length != 1)
+               return false;
+       stream_read_uint8(s, v);
+       *value = (v ? true : false);
+       return true;
+}
+
+/**
+ * Write a BER BOOLEAN
+ * @param s
+ * @param value
+ */
+
+void ber_write_boolean(STREAM* s, boolean value)
+{
+       ber_write_universal_tag(s, BER_TAG_BOOLEAN, false);
+       ber_write_length(s, 1);
+       stream_write_uint8(s, (value == true) ? 0xFF : 0);
+}
+
+boolean ber_read_integer(STREAM* s, uint32* value)
+{
+       int length;
+
+       ber_read_universal_tag(s, BER_TAG_INTEGER, false);
+       ber_read_length(s, &length);
+
+       if (value == NULL)
+       {
+               stream_seek(s, length);
+               return true;
+       }
+
+       if (length == 1)
+               stream_read_uint8(s, *value);
+       else if (length == 2)
+               stream_read_uint16_be(s, *value);
+       else if (length == 3)
+       {
+               uint8 byte;
+               stream_read_uint8(s, byte);
+               stream_read_uint16_be(s, *value);
+               *value += (byte << 16);
+       }
+       else if (length == 4)
+               stream_read_uint32_be(s, *value);
+       else
+               return false;
+
+       return true;
+}
+
+/**
+ * Write a BER INTEGER
+ * @param s
+ * @param value
+ */
+
+int ber_write_integer(STREAM* s, uint32 value)
+{
+       ber_write_universal_tag(s, BER_TAG_INTEGER, false);
+
+       if (value <= 0xFF)
+       {
+               ber_write_length(s, 1);
+               stream_write_uint8(s, value);
+               return 2;
+       }
+       else if (value < 0xFF80)
+       {
+               ber_write_length(s, 2);
+               stream_write_uint16_be(s, value);
+               return 3;
+       }
+       else if (value < 0xFF8000)
+       {
+               ber_write_length(s, 3);
+               stream_write_uint8(s, (value >> 16));
+               stream_write_uint16_be(s, (value & 0xFFFF));
+               return 4;
+       }
+       else if (value <= 0xFFFFFFFF)
+       {
+               ber_write_length(s, 4);
+               stream_write_uint32_be(s, value);
+               return 5;
+       }
+
+       return 0;
+}
+
+int ber_skip_integer(uint32 value)
+{
+       if (value <= 0xFF)
+       {
+               return _ber_skip_length(1) + 2;
+       }
+       else if (value <= 0xFFFF)
+       {
+               return _ber_skip_length(2) + 3;
+       }
+       else if (value <= 0xFFFFFFFF)
+       {
+               return _ber_skip_length(4) + 5;
+       }
+
+       return 0;
+}
+
+boolean ber_read_integer_length(STREAM* s, int* length)
+{
+       ber_read_universal_tag(s, BER_TAG_INTEGER, false);
+       ber_read_length(s, length);
+       return true;
+}
diff --git a/libfreerdp-core/ber.h b/libfreerdp-core/ber.h
new file mode 100644 (file)
index 0000000..5b2e1e9
--- /dev/null
@@ -0,0 +1,83 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * ASN.1 Basic Encoding Rules (BER)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __BER_H
+#define __BER_H
+
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+
+/* BER type */
+
+/* Class - bits 8 and 7 */
+#define BER_CLASS_MASK         0xC0
+#define BER_CLASS_UNIV         0x00 /* 0 0 */
+#define BER_CLASS_APPL         0x40 /* 0 1 */
+#define BER_CLASS_CTXT         0x80 /* 1 0 */
+#define BER_CLASS_PRIV         0xC0 /* 1 1 */
+
+/* P/C - bit 6 */
+#define BER_PC_MASK            0x20
+#define BER_PRIMITIVE          0x00 /* 0 */
+#define BER_CONSTRUCT          0x20 /* 1 */
+
+/* Tag - bits 5 to 1 */
+#define BER_TAG_MASK           0x1F
+#define BER_TAG_BOOLEAN                0x01
+#define BER_TAG_INTEGER                0x02
+#define BER_TAG_BIT_STRING     0x03
+#define BER_TAG_OCTET_STRING   0x04
+#define BER_TAG_OBJECT_IDENFIER        0x06
+#define BER_TAG_ENUMERATED     0x0A
+#define BER_TAG_SEQUENCE       0x10
+#define BER_TAG_SEQUENCE_OF    0x10
+
+#define BER_PC(_pc)    (_pc ? BER_CONSTRUCT : BER_PRIMITIVE)
+
+void ber_read_length(STREAM* s, int* length);
+int ber_write_length(STREAM* s, int length);
+int _ber_skip_length(int length);
+int ber_get_content_length(int length);
+boolean ber_read_universal_tag(STREAM* s, uint8 tag, boolean pc);
+void ber_write_universal_tag(STREAM* s, uint8 tag, boolean pc);
+boolean ber_read_application_tag(STREAM* s, uint8 tag, int* length);
+void ber_write_application_tag(STREAM* s, uint8 tag, int length);
+boolean ber_read_application_tag(STREAM* s, uint8 tag, int* length);
+boolean ber_read_enumerated(STREAM* s, uint8* enumerated, uint8 count);
+void ber_write_enumerated(STREAM* s, uint8 enumerated, uint8 count);
+boolean ber_read_contextual_tag(STREAM* s, uint8 tag, int* length, boolean pc);
+int ber_write_contextual_tag(STREAM* s, uint8 tag, int length, boolean pc);
+int ber_skip_contextual_tag(int length);
+boolean ber_read_sequence_tag(STREAM* s, int* length);
+int ber_write_sequence_tag(STREAM* s, int length);
+int ber_skip_sequence(int length);
+int ber_skip_sequence_tag(int length);
+boolean ber_read_bit_string(STREAM* s, int* length, uint8* padding);
+boolean ber_read_octet_string(STREAM* s, int* length);
+void ber_write_octet_string(STREAM* s, const uint8* oct_str, int length);
+int ber_write_octet_string_tag(STREAM* s, int length);
+int ber_skip_octet_string(int length);
+boolean ber_read_boolean(STREAM* s, boolean* value);
+void ber_write_boolean(STREAM* s, boolean value);
+boolean ber_read_integer(STREAM* s, uint32* value);
+int ber_write_integer(STREAM* s, uint32 value);
+boolean ber_read_integer_length(STREAM* s, int* length);
+int ber_skip_integer(uint32 value);
+
+#endif /* __BER_H */
diff --git a/libfreerdp-core/capabilities.c b/libfreerdp-core/capabilities.c
new file mode 100644 (file)
index 0000000..6db2411
--- /dev/null
@@ -0,0 +1,2086 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Capability Sets
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "capabilities.h"
+
+/*
+static const char* const CAPSET_TYPE_STRINGS[] =
+{
+               "Unknown",
+               "General",
+               "Bitmap",
+               "Order",
+               "Bitmap Cache",
+               "Control",
+               "Unknown",
+               "Window Activation",
+               "Pointer",
+               "Share",
+               "Color Cache",
+               "Unknown",
+               "Sound",
+               "Input",
+               "Font",
+               "Brush",
+               "Glyph Cache",
+               "Offscreen Bitmap Cache",
+               "Bitmap Cache Host Support",
+               "Bitmap Cache v2",
+               "Virtual Channel",
+               "DrawNineGrid Cache",
+               "Draw GDI+ Cache",
+               "Remote Programs",
+               "Window List",
+               "Desktop Composition",
+               "Multifragment Update",
+               "Large Pointer",
+               "Surface Commands",
+               "Bitmap Codecs",
+               "Frame Acknowledge"
+};
+*/
+
+/* CODEC_GUID_REMOTEFX 0x76772F12BD724463AFB3B73C9C6F7886 */
+#define CODEC_GUID_REMOTEFX "\x12\x2F\x77\x76\x72\xBD\x63\x44\xAF\xB3\xB7\x3C\x9C\x6F\x78\x86"
+
+/* CODEC_GUID_NSCODEC  0xCA8D1BB9000F154F589FAE2D1A87E2D6 */
+#define CODEC_GUID_NSCODEC "\xb9\x1b\x8d\xca\x0f\x00\x4f\x15\x58\x9f\xae\x2d\x1a\x87\xe2\xd6"
+
+void rdp_read_capability_set_header(STREAM* s, uint16* length, uint16* type)
+{
+       stream_read_uint16(s, *type); /* capabilitySetType */
+       stream_read_uint16(s, *length); /* lengthCapability */
+}
+
+void rdp_write_capability_set_header(STREAM* s, uint16 length, uint16 type)
+{
+       stream_write_uint16(s, type); /* capabilitySetType */
+       stream_write_uint16(s, length); /* lengthCapability */
+}
+
+uint8* rdp_capability_set_start(STREAM* s)
+{
+       uint8* header;
+
+       stream_get_mark(s, header);
+       stream_write_zero(s, CAPSET_HEADER_LENGTH);
+
+       return header;
+}
+
+void rdp_capability_set_finish(STREAM* s, uint8* header, uint16 type)
+{
+       uint16 length;
+       uint8* footer;
+
+       footer = s->p;
+       length = footer - header;
+       stream_set_mark(s, header);
+
+       rdp_write_capability_set_header(s, length, type);
+       stream_set_mark(s, footer);
+}
+
+/**
+ * Read general capability set.\n
+ * @msdn{cc240549}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_general_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint16 extraFlags;
+       uint8 refreshRectSupport;
+       uint8 suppressOutputSupport;
+
+       if (settings->server_mode)
+       {
+               stream_read_uint16(s, settings->os_major_type); /* osMajorType (2 bytes) */
+               stream_read_uint16(s, settings->os_minor_type); /* osMinorType (2 bytes) */
+       }
+       else
+       {
+               stream_seek_uint16(s); /* osMajorType (2 bytes) */
+               stream_seek_uint16(s); /* osMinorType (2 bytes) */
+       }
+       stream_seek_uint16(s); /* protocolVersion (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */
+       stream_seek_uint16(s); /* generalCompressionTypes (2 bytes) */
+       stream_read_uint16(s, extraFlags); /* extraFlags (2 bytes) */
+       stream_seek_uint16(s); /* updateCapabilityFlag (2 bytes) */
+       stream_seek_uint16(s); /* remoteUnshareFlag (2 bytes) */
+       stream_seek_uint16(s); /* generalCompressionLevel (2 bytes) */
+       stream_read_uint8(s, refreshRectSupport); /* refreshRectSupport (1 byte) */
+       stream_read_uint8(s, suppressOutputSupport); /* suppressOutputSupport (1 byte) */
+
+       if (!(extraFlags & FASTPATH_OUTPUT_SUPPORTED))
+               settings->fastpath_output = false;
+
+       if (refreshRectSupport == false)
+               settings->refresh_rect = false;
+
+       if (suppressOutputSupport == false)
+               settings->suppress_output = false;
+}
+
+/**
+ * Write general capability set.\n
+ * @msdn{cc240549}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_general_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 extraFlags;
+
+       header = rdp_capability_set_start(s);
+
+       extraFlags = LONG_CREDENTIALS_SUPPORTED | NO_BITMAP_COMPRESSION_HDR;
+
+       if (settings->auto_reconnection)
+               extraFlags |= AUTORECONNECT_SUPPORTED;
+
+       if (settings->fastpath_output)
+               extraFlags |= FASTPATH_OUTPUT_SUPPORTED;
+
+       if (settings->server_mode)
+       {
+               /* not yet supported server-side */
+               settings->refresh_rect = false;
+               settings->suppress_output = false;
+       }
+
+       stream_write_uint16(s, settings->os_major_type); /* osMajorType (2 bytes) */
+       stream_write_uint16(s, settings->os_minor_type); /* osMinorType (2 bytes) */
+       stream_write_uint16(s, CAPS_PROTOCOL_VERSION); /* protocolVersion (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsA (2 bytes) */
+       stream_write_uint16(s, 0); /* generalCompressionTypes (2 bytes) */
+       stream_write_uint16(s, extraFlags); /* extraFlags (2 bytes) */
+       stream_write_uint16(s, 0); /* updateCapabilityFlag (2 bytes) */
+       stream_write_uint16(s, 0); /* remoteUnshareFlag (2 bytes) */
+       stream_write_uint16(s, 0); /* generalCompressionLevel (2 bytes) */
+       stream_write_uint8(s, settings->refresh_rect); /* refreshRectSupport (1 byte) */
+       stream_write_uint8(s, settings->suppress_output); /* suppressOutputSupport (1 byte) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_GENERAL);
+}
+
+/**
+ * Read bitmap capability set.\n
+ * @msdn{cc240554}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_bitmap_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint8 drawingFlags;
+       uint16 desktopWidth;
+       uint16 desktopHeight;
+       uint16 desktopResizeFlag;
+       uint16 preferredBitsPerPixel;
+
+       stream_read_uint16(s, preferredBitsPerPixel); /* preferredBitsPerPixel (2 bytes) */
+       stream_seek_uint16(s); /* receive1BitPerPixel (2 bytes) */
+       stream_seek_uint16(s); /* receive4BitsPerPixel (2 bytes) */
+       stream_seek_uint16(s); /* receive8BitsPerPixel (2 bytes) */
+       stream_read_uint16(s, desktopWidth); /* desktopWidth (2 bytes) */
+       stream_read_uint16(s, desktopHeight); /* desktopHeight (2 bytes) */
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+       stream_read_uint16(s, desktopResizeFlag); /* desktopResizeFlag (2 bytes) */
+       stream_seek_uint16(s); /* bitmapCompressionFlag (2 bytes) */
+       stream_seek_uint8(s); /* highColorFlags (1 byte) */
+       stream_read_uint8(s, drawingFlags); /* drawingFlags (1 byte) */
+       stream_seek_uint16(s); /* multipleRectangleSupport (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsB (2 bytes) */
+
+       if (!settings->server_mode && preferredBitsPerPixel != settings->color_depth)
+       {
+               /* The client must respect the actual color depth used by the server */
+               settings->color_depth = preferredBitsPerPixel;
+       }
+
+       if (desktopResizeFlag == false)
+               settings->desktop_resize = false;
+
+       if (!settings->server_mode && settings->desktop_resize)
+       {
+               /* The server may request a different desktop size during Deactivation-Reactivation sequence */
+               settings->width = desktopWidth;
+               settings->height = desktopHeight;
+       }
+}
+
+/**
+ * Write bitmap capability set.\n
+ * @msdn{cc240554}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_bitmap_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint8 drawingFlags;
+       uint16 desktopResizeFlag;
+       uint16 preferredBitsPerPixel;
+
+       header = rdp_capability_set_start(s);
+
+       drawingFlags = 0;
+
+       if (settings->rdp_version > 5)
+               preferredBitsPerPixel = settings->color_depth;
+       else
+               preferredBitsPerPixel = 8;
+
+       desktopResizeFlag = settings->desktop_resize;
+
+       stream_write_uint16(s, preferredBitsPerPixel); /* preferredBitsPerPixel (2 bytes) */
+       stream_write_uint16(s, 1); /* receive1BitPerPixel (2 bytes) */
+       stream_write_uint16(s, 1); /* receive4BitsPerPixel (2 bytes) */
+       stream_write_uint16(s, 1); /* receive8BitsPerPixel (2 bytes) */
+       stream_write_uint16(s, settings->width); /* desktopWidth (2 bytes) */
+       stream_write_uint16(s, settings->height); /* desktopHeight (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+       stream_write_uint16(s, desktopResizeFlag); /* desktopResizeFlag (2 bytes) */
+       stream_write_uint16(s, 1); /* bitmapCompressionFlag (2 bytes) */
+       stream_write_uint8(s, 0); /* highColorFlags (1 byte) */
+       stream_write_uint8(s, drawingFlags); /* drawingFlags (1 byte) */
+       stream_write_uint16(s, 1); /* multipleRectangleSupport (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsB (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP);
+}
+
+/**
+ * Read order capability set.\n
+ * @msdn{cc240556}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_order_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       int i;
+       uint16 orderFlags;
+       uint8 orderSupport[32];
+       uint16 orderSupportExFlags;
+
+       stream_seek(s, 16); /* terminalDescriptor (16 bytes) */
+       stream_seek_uint32(s); /* pad4OctetsA (4 bytes) */
+       stream_seek_uint16(s); /* desktopSaveXGranularity (2 bytes) */
+       stream_seek_uint16(s); /* desktopSaveYGranularity (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */
+       stream_seek_uint16(s); /* maximumOrderLevel (2 bytes) */
+       stream_seek_uint16(s); /* numberFonts (2 bytes) */
+       stream_read_uint16(s, orderFlags); /* orderFlags (2 bytes) */
+       stream_read(s, orderSupport, 32); /* orderSupport (32 bytes) */
+       stream_seek_uint16(s); /* textFlags (2 bytes) */
+       stream_read_uint16(s, orderSupportExFlags); /* orderSupportExFlags (2 bytes) */
+       stream_seek_uint32(s); /* pad4OctetsB (4 bytes) */
+       stream_seek_uint32(s); /* desktopSaveSize (4 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsC (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsD (2 bytes) */
+       stream_seek_uint16(s); /* textANSICodePage (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsE (2 bytes) */
+
+       for (i = 0; i < 32; i++)
+       {
+               if (orderSupport[i] == false)
+                       settings->order_support[i] = false;
+       }
+}
+
+/**
+ * Write order capability set.\n
+ * @msdn{cc240556}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_order_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 orderFlags;
+       uint16 orderSupportExFlags;
+       uint16 textANSICodePage;
+
+       header = rdp_capability_set_start(s);
+
+       /* see [MSDN-CP]: http://msdn.microsoft.com/en-us/library/dd317756 */
+       textANSICodePage = 65001; /* Unicode (UTF-8) */
+
+       orderSupportExFlags = 0;
+       orderFlags = NEGOTIATE_ORDER_SUPPORT | ZERO_BOUNDS_DELTA_SUPPORT | COLOR_INDEX_SUPPORT;
+
+       if (settings->bitmap_cache_v3)
+       {
+               orderSupportExFlags |= CACHE_BITMAP_V3_SUPPORT;
+               orderFlags |= ORDER_FLAGS_EXTRA_SUPPORT;
+       }
+
+       if (settings->frame_marker)
+       {
+               orderSupportExFlags |= ALTSEC_FRAME_MARKER_SUPPORT;
+               orderFlags |= ORDER_FLAGS_EXTRA_SUPPORT;
+       }
+
+       stream_write_zero(s, 16); /* terminalDescriptor (16 bytes) */
+       stream_write_uint32(s, 0); /* pad4OctetsA (4 bytes) */
+       stream_write_uint16(s, 1); /* desktopSaveXGranularity (2 bytes) */
+       stream_write_uint16(s, 20); /* desktopSaveYGranularity (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsA (2 bytes) */
+       stream_write_uint16(s, 1); /* maximumOrderLevel (2 bytes) */
+       stream_write_uint16(s, 0); /* numberFonts (2 bytes) */
+       stream_write_uint16(s, orderFlags); /* orderFlags (2 bytes) */
+       stream_write(s, settings->order_support, 32); /* orderSupport (32 bytes) */
+       stream_write_uint16(s, 0); /* textFlags (2 bytes) */
+       stream_write_uint16(s, orderSupportExFlags); /* orderSupportExFlags (2 bytes) */
+       stream_write_uint32(s, 0); /* pad4OctetsB (4 bytes) */
+       stream_write_uint32(s, 230400); /* desktopSaveSize (4 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsC (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsD (2 bytes) */
+       stream_write_uint16(s, 0); /* textANSICodePage (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsE (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_ORDER);
+}
+
+/**
+ * Read bitmap cache capability set.\n
+ * @msdn{cc240559}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_bitmap_cache_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint32(s); /* pad1 (4 bytes) */
+       stream_seek_uint32(s); /* pad2 (4 bytes) */
+       stream_seek_uint32(s); /* pad3 (4 bytes) */
+       stream_seek_uint32(s); /* pad4 (4 bytes) */
+       stream_seek_uint32(s); /* pad5 (4 bytes) */
+       stream_seek_uint32(s); /* pad6 (4 bytes) */
+       stream_seek_uint16(s); /* Cache0Entries (2 bytes) */
+       stream_seek_uint16(s); /* Cache0MaximumCellSize (2 bytes) */
+       stream_seek_uint16(s); /* Cache1Entries (2 bytes) */
+       stream_seek_uint16(s); /* Cache1MaximumCellSize (2 bytes) */
+       stream_seek_uint16(s); /* Cache2Entries (2 bytes) */
+       stream_seek_uint16(s); /* Cache2MaximumCellSize (2 bytes) */
+}
+
+/**
+ * Write bitmap cache capability set.\n
+ * @msdn{cc240559}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings)
+{
+       int bpp;
+       uint16 size;
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       bpp = (settings->color_depth + 7) / 8;
+
+       stream_write_uint32(s, 0); /* pad1 (4 bytes) */
+       stream_write_uint32(s, 0); /* pad2 (4 bytes) */
+       stream_write_uint32(s, 0); /* pad3 (4 bytes) */
+       stream_write_uint32(s, 0); /* pad4 (4 bytes) */
+       stream_write_uint32(s, 0); /* pad5 (4 bytes) */
+       stream_write_uint32(s, 0); /* pad6 (4 bytes) */
+
+       size = bpp * 256;
+       stream_write_uint16(s, 200); /* Cache0Entries (2 bytes) */
+       stream_write_uint16(s, size); /* Cache0MaximumCellSize (2 bytes) */
+
+       size = bpp * 1024;
+       stream_write_uint16(s, 600); /* Cache1Entries (2 bytes) */
+       stream_write_uint16(s, size); /* Cache1MaximumCellSize (2 bytes) */
+
+       size = bpp * 4096;
+       stream_write_uint16(s, 1000); /* Cache2Entries (2 bytes) */
+       stream_write_uint16(s, size); /* Cache2MaximumCellSize (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP_CACHE);
+}
+
+/**
+ * Read control capability set.\n
+ * @msdn{cc240568}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_control_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* controlFlags (2 bytes) */
+       stream_seek_uint16(s); /* remoteDetachFlag (2 bytes) */
+       stream_seek_uint16(s); /* controlInterest (2 bytes) */
+       stream_seek_uint16(s); /* detachInterest (2 bytes) */
+}
+
+/**
+ * Write control capability set.\n
+ * @msdn{cc240568}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_control_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint16(s, 0); /* controlFlags (2 bytes) */
+       stream_write_uint16(s, 0); /* remoteDetachFlag (2 bytes) */
+       stream_write_uint16(s, 2); /* controlInterest (2 bytes) */
+       stream_write_uint16(s, 2); /* detachInterest (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_CONTROL);
+}
+
+/**
+ * Read window activation capability set.\n
+ * @msdn{cc240569}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_window_activation_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* helpKeyFlag (2 bytes) */
+       stream_seek_uint16(s); /* helpKeyIndexFlag (2 bytes) */
+       stream_seek_uint16(s); /* helpExtendedKeyFlag (2 bytes) */
+       stream_seek_uint16(s); /* windowManagerKeyFlag (2 bytes) */
+}
+
+/**
+ * Write window activation capability set.\n
+ * @msdn{cc240569}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_window_activation_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint16(s, 0); /* helpKeyFlag (2 bytes) */
+       stream_write_uint16(s, 0); /* helpKeyIndexFlag (2 bytes) */
+       stream_write_uint16(s, 0); /* helpExtendedKeyFlag (2 bytes) */
+       stream_write_uint16(s, 0); /* windowManagerKeyFlag (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_ACTIVATION);
+}
+
+/**
+ * Read pointer capability set.\n
+ * @msdn{cc240562}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_pointer_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint16 colorPointerFlag;
+       uint16 colorPointerCacheSize;
+       uint16 pointerCacheSize;
+
+       stream_read_uint16(s, colorPointerFlag); /* colorPointerFlag (2 bytes) */
+       stream_read_uint16(s, colorPointerCacheSize); /* colorPointerCacheSize (2 bytes) */
+       stream_read_uint16(s, pointerCacheSize); /* pointerCacheSize (2 bytes) */
+
+       if (colorPointerFlag == false)
+               settings->color_pointer = false;
+
+       if (settings->server_mode)
+       {
+               settings->pointer_cache_size = pointerCacheSize;
+       }
+}
+
+/**
+ * Write pointer capability set.\n
+ * @msdn{cc240562}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_pointer_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 colorPointerFlag;
+
+       header = rdp_capability_set_start(s);
+
+       colorPointerFlag = (settings->color_pointer) ? 1 : 0;
+
+       stream_write_uint16(s, colorPointerFlag); /* colorPointerFlag (2 bytes) */
+       stream_write_uint16(s, settings->pointer_cache_size); /* colorPointerCacheSize (2 bytes) */
+
+       if (settings->large_pointer)
+       {
+               stream_write_uint16(s, settings->pointer_cache_size); /* pointerCacheSize (2 bytes) */
+       }
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_POINTER);
+}
+
+/**
+ * Read share capability set.\n
+ * @msdn{cc240570}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_share_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* nodeId (2 bytes) */
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+}
+
+/**
+ * Write share capability set.\n
+ * @msdn{cc240570}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_share_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 nodeId;
+
+       header = rdp_capability_set_start(s);
+
+       nodeId = (settings->server_mode) ? 0x03EA : 0;
+
+       stream_write_uint16(s, nodeId); /* nodeId (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_SHARE);
+}
+
+/**
+ * Read color cache capability set.\n
+ * @msdn{cc241564}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_color_cache_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* colorTableCacheSize (2 bytes) */
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+}
+
+/**
+ * Write color cache capability set.\n
+ * @msdn{cc241564}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_color_cache_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint16(s, 6); /* colorTableCacheSize (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_COLOR_CACHE);
+}
+
+/**
+ * Read sound capability set.\n
+ * @msdn{cc240552}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_sound_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint16 soundFlags;
+
+       stream_read_uint16(s, soundFlags); /* soundFlags (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */
+
+       settings->sound_beeps = (soundFlags & SOUND_BEEPS_FLAG) ? true : false;
+}
+
+/**
+ * Write sound capability set.\n
+ * @msdn{cc240552}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_sound_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 soundFlags;
+
+       header = rdp_capability_set_start(s);
+
+       soundFlags = (settings->sound_beeps) ? SOUND_BEEPS_FLAG : 0;
+
+       stream_write_uint16(s, soundFlags); /* soundFlags (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsA (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_SOUND);
+}
+
+/**
+ * Read input capability set.\n
+ * @msdn{cc240563}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_input_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint16 inputFlags;
+
+       stream_read_uint16(s, inputFlags); /* inputFlags (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */
+
+       if (settings->server_mode)
+       {
+               stream_read_uint32(s, settings->kbd_layout); /* keyboardLayout (4 bytes) */
+               stream_read_uint32(s, settings->kbd_type); /* keyboardType (4 bytes) */
+               stream_read_uint32(s, settings->kbd_subtype); /* keyboardSubType (4 bytes) */
+               stream_read_uint32(s, settings->kbd_fn_keys); /* keyboardFunctionKeys (4 bytes) */
+       }
+       else
+       {
+               stream_seek_uint32(s); /* keyboardLayout (4 bytes) */
+               stream_seek_uint32(s); /* keyboardType (4 bytes) */
+               stream_seek_uint32(s); /* keyboardSubType (4 bytes) */
+               stream_seek_uint32(s); /* keyboardFunctionKeys (4 bytes) */
+       }
+
+       stream_seek(s, 64); /* imeFileName (64 bytes) */
+
+       if (settings->server_mode != true)
+       {
+               if (inputFlags & INPUT_FLAG_FASTPATH_INPUT)
+               {
+                       /* advertised by RDP 5.0 and 5.1 servers */
+               }
+               else if (inputFlags & INPUT_FLAG_FASTPATH_INPUT2)
+               {
+                       /* avertised by RDP 5.2, 6.0, 6.1 and 7.0 servers */
+               }
+               else
+               {
+                       /* server does not support fastpath input */
+                       settings->fastpath_input = false;
+               }
+       }
+}
+
+/**
+ * Write input capability set.\n
+ * @msdn{cc240563}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_input_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 inputFlags;
+
+       header = rdp_capability_set_start(s);
+
+       inputFlags = INPUT_FLAG_SCANCODES | INPUT_FLAG_MOUSEX | INPUT_FLAG_UNICODE;
+
+       if (settings->fastpath_input)
+       {
+               inputFlags |= INPUT_FLAG_FASTPATH_INPUT;
+               inputFlags |= INPUT_FLAG_FASTPATH_INPUT2;
+       }
+
+       stream_write_uint16(s, inputFlags); /* inputFlags (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2OctetsA (2 bytes) */
+       stream_write_uint32(s, settings->kbd_layout); /* keyboardLayout (4 bytes) */
+       stream_write_uint32(s, settings->kbd_type); /* keyboardType (4 bytes) */
+       stream_write_uint32(s, settings->kbd_subtype); /* keyboardSubType (4 bytes) */
+       stream_write_uint32(s, settings->kbd_fn_keys); /* keyboardFunctionKeys (4 bytes) */
+       stream_write_zero(s, 64); /* imeFileName (64 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_INPUT);
+}
+
+/**
+ * Read font capability set.\n
+ * @msdn{cc240571}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_font_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       if (length > 4)
+               stream_seek_uint16(s); /* fontSupportFlags (2 bytes) */
+
+       if (length > 6)
+               stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+}
+
+/**
+ * Write font capability set.\n
+ * @msdn{cc240571}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_font_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint16(s, FONTSUPPORT_FONTLIST); /* fontSupportFlags (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_FONT);
+}
+
+/**
+ * Read brush capability set.\n
+ * @msdn{cc240564}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_brush_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint32(s); /* brushSupportLevel (4 bytes) */
+}
+
+/**
+ * Write brush capability set.\n
+ * @msdn{cc240564}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_brush_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint32(s, BRUSH_COLOR_FULL); /* brushSupportLevel (4 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_BRUSH);
+}
+
+/**
+ * Read cache definition (glyph).\n
+ * @msdn{cc240566}
+ * @param s stream
+ */
+void rdp_read_cache_definition(STREAM* s, GLYPH_CACHE_DEFINITION* cache_definition)
+{
+       stream_read_uint16(s, cache_definition->cacheEntries); /* cacheEntries (2 bytes) */
+       stream_read_uint16(s, cache_definition->cacheMaximumCellSize); /* cacheMaximumCellSize (2 bytes) */
+}
+
+/**
+ * Write cache definition (glyph).\n
+ * @msdn{cc240566}
+ * @param s stream
+ */
+void rdp_write_cache_definition(STREAM* s, GLYPH_CACHE_DEFINITION* cache_definition)
+{
+       stream_write_uint16(s, cache_definition->cacheEntries); /* cacheEntries (2 bytes) */
+       stream_write_uint16(s, cache_definition->cacheMaximumCellSize); /* cacheMaximumCellSize (2 bytes) */
+}
+
+/**
+ * Read glyph cache capability set.\n
+ * @msdn{cc240565}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_glyph_cache_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint16 glyphSupportLevel;
+
+       stream_seek(s, 40); /* glyphCache (40 bytes) */
+       stream_seek_uint32(s); /* fragCache (4 bytes) */
+       stream_read_uint16(s, glyphSupportLevel); /* glyphSupportLevel (2 bytes) */
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+
+       settings->glyphSupportLevel = glyphSupportLevel;
+}
+
+/**
+ * Write glyph cache capability set.\n
+ * @msdn{cc240565}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_glyph_cache_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       /* glyphCache (40 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[0])); /* glyphCache0 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[1])); /* glyphCache1 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[2])); /* glyphCache2 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[3])); /* glyphCache3 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[4])); /* glyphCache4 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[5])); /* glyphCache5 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[6])); /* glyphCache6 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[7])); /* glyphCache7 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[8])); /* glyphCache8 (4 bytes) */
+       rdp_write_cache_definition(s, &(settings->glyphCache[9])); /* glyphCache9 (4 bytes) */
+
+       rdp_write_cache_definition(s, settings->fragCache);  /* fragCache (4 bytes) */
+
+       stream_write_uint16(s, settings->glyphSupportLevel); /* glyphSupportLevel (2 bytes) */
+
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_GLYPH_CACHE);
+}
+
+/**
+ * Read offscreen bitmap cache capability set.\n
+ * @msdn{cc240550}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_offscreen_bitmap_cache_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint32 offscreenSupportLevel;
+
+       stream_read_uint32(s, offscreenSupportLevel); /* offscreenSupportLevel (4 bytes) */
+       stream_read_uint16(s, settings->offscreen_bitmap_cache_size); /* offscreenCacheSize (2 bytes) */
+       stream_read_uint16(s, settings->offscreen_bitmap_cache_entries); /* offscreenCacheEntries (2 bytes) */
+
+       if (offscreenSupportLevel & true)
+               settings->offscreen_bitmap_cache = true;
+}
+
+/**
+ * Write offscreen bitmap cache capability set.\n
+ * @msdn{cc240550}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_offscreen_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 offscreenSupportLevel = false;
+
+       header = rdp_capability_set_start(s);
+
+       if (settings->offscreen_bitmap_cache)
+               offscreenSupportLevel = true;
+
+       stream_write_uint32(s, offscreenSupportLevel); /* offscreenSupportLevel (4 bytes) */
+       stream_write_uint16(s, settings->offscreen_bitmap_cache_size); /* offscreenCacheSize (2 bytes) */
+       stream_write_uint16(s, settings->offscreen_bitmap_cache_entries); /* offscreenCacheEntries (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_OFFSCREEN_CACHE);
+}
+
+/**
+ * Read bitmap cache host support capability set.\n
+ * @msdn{cc240557}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_bitmap_cache_host_support_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint8 cacheVersion;
+
+       stream_read_uint8(s, cacheVersion); /* cacheVersion (1 byte) */
+       stream_seek_uint8(s); /* pad1 (1 byte) */
+       stream_seek_uint16(s); /* pad2 (2 bytes) */
+
+       if (cacheVersion & BITMAP_CACHE_V2)
+               settings->persistent_bitmap_cache = true;
+}
+
+/**
+ * Write bitmap cache host support capability set.\n
+ * @msdn{cc240557}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint8(s, BITMAP_CACHE_V2); /* cacheVersion (1 byte) */
+       stream_write_uint8(s, 0); /* pad1 (1 byte) */
+       stream_write_uint16(s, 0); /* pad2 (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP_CACHE_HOST_SUPPORT);
+}
+
+void rdp_write_bitmap_cache_cell_info(STREAM* s, BITMAP_CACHE_V2_CELL_INFO* cellInfo)
+{
+       uint32 info;
+
+       /**
+        * numEntries is in the first 31 bits, while the last bit (k)
+        * is used to indicate a persistent bitmap cache.
+        */
+
+       info = (cellInfo->numEntries | (cellInfo->persistent << 31));
+       stream_write_uint32(s, info);
+}
+
+/**
+ * Read bitmap cache v2 capability set.\n
+ * @msdn{cc240560}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_bitmap_cache_v2_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* cacheFlags (2 bytes) */
+       stream_seek_uint8(s); /* pad2 (1 byte) */
+       stream_seek_uint8(s); /* numCellCaches (1 byte) */
+       stream_seek(s, 4); /* bitmapCache0CellInfo (4 bytes) */
+       stream_seek(s, 4); /* bitmapCache1CellInfo (4 bytes) */
+       stream_seek(s, 4); /* bitmapCache2CellInfo (4 bytes) */
+       stream_seek(s, 4); /* bitmapCache3CellInfo (4 bytes) */
+       stream_seek(s, 4); /* bitmapCache4CellInfo (4 bytes) */
+       stream_seek(s, 12); /* pad3 (12 bytes) */
+}
+
+/**
+ * Write bitmap cache v2 capability set.\n
+ * @msdn{cc240560}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 cacheFlags;
+
+       header = rdp_capability_set_start(s);
+
+       cacheFlags = ALLOW_CACHE_WAITING_LIST_FLAG;
+
+       if (settings->persistent_bitmap_cache)
+               cacheFlags |= PERSISTENT_KEYS_EXPECTED_FLAG;
+
+       stream_write_uint16(s, cacheFlags); /* cacheFlags (2 bytes) */
+       stream_write_uint8(s, 0); /* pad2 (1 byte) */
+       stream_write_uint8(s, settings->bitmapCacheV2NumCells); /* numCellCaches (1 byte) */
+       rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[0]); /* bitmapCache0CellInfo (4 bytes) */
+       rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[1]); /* bitmapCache1CellInfo (4 bytes) */
+       rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[2]); /* bitmapCache2CellInfo (4 bytes) */
+       rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[3]); /* bitmapCache3CellInfo (4 bytes) */
+       rdp_write_bitmap_cache_cell_info(s, &settings->bitmapCacheV2CellInfo[4]); /* bitmapCache4CellInfo (4 bytes) */
+       stream_write_zero(s, 12); /* pad3 (12 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP_CACHE_V2);
+}
+
+/**
+ * Read virtual channel capability set.\n
+ * @msdn{cc240551}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_virtual_channel_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint32 flags;
+       uint32 VCChunkSize;
+
+       stream_read_uint32(s, flags); /* flags (4 bytes) */
+
+       if (length > 8)
+               stream_read_uint32(s, VCChunkSize); /* VCChunkSize (4 bytes) */
+       else
+               VCChunkSize = 1600;
+
+       if (settings->server_mode != true)
+               settings->vc_chunk_size = VCChunkSize;
+}
+
+/**
+ * Write virtual channel capability set.\n
+ * @msdn{cc240551}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_virtual_channel_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 flags;
+
+       header = rdp_capability_set_start(s);
+
+       flags = (settings->server_mode) ? VCCAPS_COMPR_CS_8K : VCCAPS_NO_COMPR;
+
+       stream_write_uint32(s, flags); /* flags (4 bytes) */
+       stream_write_uint32(s, settings->vc_chunk_size); /* VCChunkSize (4 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_VIRTUAL_CHANNEL);
+}
+
+/**
+ * Read drawn nine grid cache capability set.\n
+ * @msdn{cc241565}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_draw_nine_grid_cache_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint32 drawNineGridSupportLevel;
+
+       stream_read_uint32(s, drawNineGridSupportLevel); /* drawNineGridSupportLevel (4 bytes) */
+       stream_read_uint16(s, settings->draw_nine_grid_cache_size); /* drawNineGridCacheSize (2 bytes) */
+       stream_read_uint16(s, settings->draw_nine_grid_cache_entries); /* drawNineGridCacheEntries (2 bytes) */
+
+       if ((drawNineGridSupportLevel & DRAW_NINEGRID_SUPPORTED) ||
+                       (drawNineGridSupportLevel & DRAW_NINEGRID_SUPPORTED_V2))
+               settings->draw_nine_grid = true;
+}
+
+/**
+ * Write drawn nine grid cache capability set.\n
+ * @msdn{cc241565}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 drawNineGridSupportLevel;
+
+       header = rdp_capability_set_start(s);
+
+       drawNineGridSupportLevel = (settings->draw_nine_grid) ? DRAW_NINEGRID_SUPPORTED : DRAW_NINEGRID_NO_SUPPORT;
+
+       stream_write_uint32(s, drawNineGridSupportLevel); /* drawNineGridSupportLevel (4 bytes) */
+       stream_write_uint16(s, settings->draw_nine_grid_cache_size); /* drawNineGridCacheSize (2 bytes) */
+       stream_write_uint16(s, settings->draw_nine_grid_cache_entries); /* drawNineGridCacheEntries (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_DRAW_NINE_GRID_CACHE);
+}
+
+void rdp_write_gdiplus_cache_entries(STREAM* s, uint16 gce, uint16 bce, uint16 pce, uint16 ice, uint16 ace)
+{
+       stream_write_uint16(s, gce); /* gdipGraphicsCacheEntries (2 bytes) */
+       stream_write_uint16(s, bce); /* gdipBrushCacheEntries (2 bytes) */
+       stream_write_uint16(s, pce); /* gdipPenCacheEntries (2 bytes) */
+       stream_write_uint16(s, ice); /* gdipImageCacheEntries (2 bytes) */
+       stream_write_uint16(s, ace); /* gdipImageAttributesCacheEntries (2 bytes) */
+}
+
+void rdp_write_gdiplus_cache_chunk_size(STREAM* s, uint16 gccs, uint16 obccs, uint16 opccs, uint16 oiaccs)
+{
+       stream_write_uint16(s, gccs); /* gdipGraphicsCacheChunkSize (2 bytes) */
+       stream_write_uint16(s, obccs); /* gdipObjectBrushCacheChunkSize (2 bytes) */
+       stream_write_uint16(s, opccs); /* gdipObjectPenCacheChunkSize (2 bytes) */
+       stream_write_uint16(s, oiaccs); /* gdipObjectImageAttributesCacheChunkSize (2 bytes) */
+}
+
+void rdp_write_gdiplus_image_cache_properties(STREAM* s, uint16 oiccs, uint16 oicts, uint16 oicms)
+{
+       stream_write_uint16(s, oiccs); /* gdipObjectImageCacheChunkSize (2 bytes) */
+       stream_write_uint16(s, oicts); /* gdipObjectImageCacheTotalSize (2 bytes) */
+       stream_write_uint16(s, oicms); /* gdipObjectImageCacheMaxSize (2 bytes) */
+}
+
+/**
+ * Read GDI+ cache capability set.\n
+ * @msdn{cc241566}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_draw_gdiplus_cache_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint32 drawGDIPlusSupportLevel;
+       uint32 drawGdiplusCacheLevel;
+
+       stream_read_uint32(s, drawGDIPlusSupportLevel); /* drawGDIPlusSupportLevel (4 bytes) */
+       stream_seek_uint32(s); /* GdipVersion (4 bytes) */
+       stream_read_uint32(s, drawGdiplusCacheLevel); /* drawGdiplusCacheLevel (4 bytes) */
+       stream_seek(s, 10); /* GdipCacheEntries (10 bytes) */
+       stream_seek(s, 8); /* GdipCacheChunkSize (8 bytes) */
+       stream_seek(s, 6); /* GdipImageCacheProperties (6 bytes) */
+
+       if (drawGDIPlusSupportLevel & DRAW_GDIPLUS_SUPPORTED)
+               settings->draw_gdi_plus = true;
+
+       if (drawGdiplusCacheLevel & DRAW_GDIPLUS_CACHE_LEVEL_ONE)
+               settings->draw_gdi_plus_cache = true;
+}
+
+/**
+ * Write GDI+ cache capability set.\n
+ * @msdn{cc241566}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_draw_gdiplus_cache_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 drawGDIPlusSupportLevel;
+       uint32 drawGdiplusCacheLevel;
+
+       header = rdp_capability_set_start(s);
+
+       drawGDIPlusSupportLevel = (settings->draw_gdi_plus) ? DRAW_GDIPLUS_SUPPORTED : DRAW_GDIPLUS_DEFAULT;
+       drawGdiplusCacheLevel = (settings->draw_gdi_plus) ? DRAW_GDIPLUS_CACHE_LEVEL_ONE : DRAW_GDIPLUS_CACHE_LEVEL_DEFAULT;
+
+       stream_write_uint32(s, drawGDIPlusSupportLevel); /* drawGDIPlusSupportLevel (4 bytes) */
+       stream_write_uint32(s, 0); /* GdipVersion (4 bytes) */
+       stream_write_uint32(s, drawGdiplusCacheLevel); /* drawGdiplusCacheLevel (4 bytes) */
+       rdp_write_gdiplus_cache_entries(s, 10, 5, 5, 10, 2); /* GdipCacheEntries (10 bytes) */
+       rdp_write_gdiplus_cache_chunk_size(s, 512, 2048, 1024, 64); /* GdipCacheChunkSize (8 bytes) */
+       rdp_write_gdiplus_image_cache_properties(s, 4096, 256, 128); /* GdipImageCacheProperties (6 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_DRAW_GDI_PLUS);
+}
+
+/**
+ * Read remote programs capability set.\n
+ * @msdn{cc242518}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_remote_programs_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint32 railSupportLevel;
+
+       stream_read_uint32(s, railSupportLevel); /* railSupportLevel (4 bytes) */
+
+       if ((railSupportLevel & RAIL_LEVEL_SUPPORTED) == 0)
+       {
+               if (settings->remote_app == true)
+               {
+                       /* RemoteApp Failure! */
+                       settings->remote_app = false;
+               }
+       }
+}
+
+/**
+ * Write remote programs capability set.\n
+ * @msdn{cc242518}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_remote_programs_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 railSupportLevel;
+
+       header = rdp_capability_set_start(s);
+
+       railSupportLevel = RAIL_LEVEL_SUPPORTED;
+
+       if (settings->rail_langbar_supported)
+               railSupportLevel |= RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED;
+
+       stream_write_uint32(s, railSupportLevel); /* railSupportLevel (4 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_RAIL);
+}
+
+/**
+ * Read window list capability set.\n
+ * @msdn{cc242564}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_window_list_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint32(s); /* wndSupportLevel (4 bytes) */
+       stream_seek_uint8(s); /* numIconCaches (1 byte) */
+       stream_seek_uint16(s); /* numIconCacheEntries (2 bytes) */
+}
+
+/**
+ * Write window list capability set.\n
+ * @msdn{cc242564}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_window_list_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 wndSupportLevel;
+
+       header = rdp_capability_set_start(s);
+
+       wndSupportLevel = WINDOW_LEVEL_SUPPORTED_EX;
+
+       stream_write_uint32(s, wndSupportLevel); /* wndSupportLevel (4 bytes) */
+       stream_write_uint8(s, settings->num_icon_caches); /* numIconCaches (1 byte) */
+       stream_write_uint16(s, settings->num_icon_cache_entries); /* numIconCacheEntries (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_WINDOW);
+}
+
+/**
+ * Read desktop composition capability set.\n
+ * @msdn{cc240855}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_desktop_composition_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* compDeskSupportLevel (2 bytes) */
+}
+
+/**
+ * Write desktop composition capability set.\n
+ * @msdn{cc240855}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_desktop_composition_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 compDeskSupportLevel;
+
+       header = rdp_capability_set_start(s);
+
+       compDeskSupportLevel = (settings->desktop_composition) ? COMPDESK_SUPPORTED : COMPDESK_NOT_SUPPORTED;
+
+       stream_write_uint16(s, compDeskSupportLevel); /* compDeskSupportLevel (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_COMP_DESK);
+}
+
+/**
+ * Read multifragment update capability set.\n
+ * @msdn{cc240649}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_multifragment_update_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_read_uint32(s, settings->multifrag_max_request_size); /* MaxRequestSize (4 bytes) */
+}
+
+/**
+ * Write multifragment update capability set.\n
+ * @msdn{cc240649}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_multifragment_update_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint32(s, settings->multifrag_max_request_size); /* MaxRequestSize (4 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_MULTI_FRAGMENT_UPDATE);
+}
+
+/**
+ * Read large pointer capability set.\n
+ * @msdn{cc240650}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_large_pointer_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint16(s); /* largePointerSupportFlags (2 bytes) */
+}
+
+/**
+ * Write large pointer capability set.\n
+ * @msdn{cc240650}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_large_pointer_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint16 largePointerSupportFlags;
+
+       header = rdp_capability_set_start(s);
+
+       largePointerSupportFlags = (settings->large_pointer) ? LARGE_POINTER_FLAG_96x96 : 0;
+
+       stream_write_uint16(s, largePointerSupportFlags); /* largePointerSupportFlags (2 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_LARGE_POINTER);
+}
+
+/**
+ * Read surface commands capability set.\n
+ * @msdn{dd871563}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_surface_commands_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint32(s); /* cmdFlags (4 bytes) */
+       stream_seek_uint32(s); /* reserved (4 bytes) */
+
+       settings->surface_commands = true;
+}
+
+/**
+ * Write surface commands capability set.\n
+ * @msdn{dd871563}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_surface_commands_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint32 cmdFlags;
+
+       header = rdp_capability_set_start(s);
+
+       cmdFlags = SURFCMDS_FRAME_MARKER |
+                       SURFCMDS_SET_SURFACE_BITS |
+                       SURFCMDS_STREAM_SURFACE_BITS;
+
+       stream_write_uint32(s, cmdFlags); /* cmdFlags (4 bytes) */
+       stream_write_uint32(s, 0); /* reserved (4 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_SURFACE_COMMANDS);
+}
+
+/**
+ * Read bitmap codecs capability set.\n
+ * @msdn{dd891377}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_bitmap_codecs_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       uint8 bitmapCodecCount;
+       uint16 codecPropertiesLength;
+
+       stream_read_uint8(s, bitmapCodecCount); /* bitmapCodecCount (1 byte) */
+
+       if (settings->server_mode)
+       {
+               settings->rfx_codec = false;
+               settings->ns_codec = false;
+       }
+
+       while (bitmapCodecCount > 0)
+       {
+               if (settings->server_mode && strncmp((char*)stream_get_tail(s), CODEC_GUID_REMOTEFX, 16) == 0)
+               {
+                       stream_seek(s, 16); /* codecGUID (16 bytes) */
+                       stream_read_uint8(s, settings->rfx_codec_id);
+                       settings->rfx_codec = true;
+               }
+               else if (settings->server_mode && strncmp((char*)stream_get_tail(s),CODEC_GUID_NSCODEC, 16) == 0)
+               {
+                       stream_seek(s, 16); /*codec GUID (16 bytes) */
+                       stream_read_uint8(s, settings->ns_codec_id);
+                       settings->ns_codec = true;
+               }
+               else
+               {
+                       stream_seek(s, 16); /* codecGUID (16 bytes) */
+                       stream_seek_uint8(s); /* codecID (1 byte) */
+               }
+
+               stream_read_uint16(s, codecPropertiesLength); /* codecPropertiesLength (2 bytes) */
+               stream_seek(s, codecPropertiesLength); /* codecProperties */
+
+               bitmapCodecCount--;
+       }
+}
+
+/**
+ * Write RemoteFX Client Capability Container.\n
+ * @param s stream
+ * @param settings settings
+ */
+void rdp_write_rfx_client_capability_container(STREAM* s, rdpSettings* settings)
+{
+       uint32 captureFlags;
+       uint8 codecMode;
+
+       captureFlags = settings->dump_rfx ? 0 : CARDP_CAPS_CAPTURE_NON_CAC;
+       codecMode = settings->rfx_codec_mode;
+
+       stream_write_uint16(s, 49); /* codecPropertiesLength */
+
+       /* TS_RFX_CLNT_CAPS_CONTAINER */
+       stream_write_uint32(s, 49); /* length */
+       stream_write_uint32(s, captureFlags); /* captureFlags */
+       stream_write_uint32(s, 37); /* capsLength */
+
+       /* TS_RFX_CAPS */
+       stream_write_uint16(s, CBY_CAPS); /* blockType */
+       stream_write_uint32(s, 8); /* blockLen */
+       stream_write_uint16(s, 1); /* numCapsets */
+
+       /* TS_RFX_CAPSET */
+       stream_write_uint16(s, CBY_CAPSET); /* blockType */
+       stream_write_uint32(s, 29); /* blockLen */
+       stream_write_uint8(s, 0x01); /* codecId (MUST be set to 0x01) */
+       stream_write_uint16(s, CLY_CAPSET); /* capsetType */
+       stream_write_uint16(s, 2); /* numIcaps */
+       stream_write_uint16(s, 8); /* icapLen */
+
+       /* TS_RFX_ICAP (RLGR1) */
+       stream_write_uint16(s, CLW_VERSION_1_0); /* version */
+       stream_write_uint16(s, CT_TILE_64x64); /* tileSize */
+       stream_write_uint8(s, codecMode); /* flags */
+       stream_write_uint8(s, CLW_COL_CONV_ICT); /* colConvBits */
+       stream_write_uint8(s, CLW_XFORM_DWT_53_A); /* transformBits */
+       stream_write_uint8(s, CLW_ENTROPY_RLGR1); /* entropyBits */
+
+       /* TS_RFX_ICAP (RLGR3) */
+       stream_write_uint16(s, CLW_VERSION_1_0); /* version */
+       stream_write_uint16(s, CT_TILE_64x64); /* tileSize */
+       stream_write_uint8(s, codecMode); /* flags */
+       stream_write_uint8(s, CLW_COL_CONV_ICT); /* colConvBits */
+       stream_write_uint8(s, CLW_XFORM_DWT_53_A); /* transformBits */
+       stream_write_uint8(s, CLW_ENTROPY_RLGR3); /* entropyBits */
+}
+
+/**
+ * Write NSCODEC Client Capability Container.\n
+ * @param s stream
+ * @param settings settings
+ */
+void rdp_write_nsc_client_capability_container(STREAM* s, rdpSettings* settings)
+{
+       stream_write_uint16(s, 3); /* codecPropertiesLength */
+
+       /* TS_NSCODEC_CAPABILITYSET */
+       stream_write_uint8(s, 1);  /* fAllowDynamicFidelity */
+       stream_write_uint8(s, 1);  /* fAllowSubsampling */
+       stream_write_uint8(s, 3);  /* colorLossLevel */
+}
+
+/**
+ * Write RemoteFX Server Capability Container.\n
+ * @param s stream
+ * @param settings settings
+ */
+void rdp_write_rfx_server_capability_container(STREAM* s, rdpSettings* settings)
+{
+       stream_write_uint16(s, 4); /* codecPropertiesLength */
+       stream_write_uint32(s, 0); /* reserved */
+}
+
+/**
+ * Write NSCODEC Server Capability Container.\n
+ * @param s stream
+ * @param settings settings
+ */
+void rdp_write_nsc_server_capability_container(STREAM* s, rdpSettings* settings)
+{
+       stream_write_uint16(s, 4); /* codecPropertiesLength */
+       stream_write_uint32(s, 0); /* reserved */
+}
+
+
+/**
+ * Write bitmap codecs capability set.\n
+ * @msdn{dd891377}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_bitmap_codecs_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+       uint8 bitmapCodecCount;
+
+       header = rdp_capability_set_start(s);
+
+       bitmapCodecCount = 0;
+       if (settings->rfx_codec)
+               bitmapCodecCount++;
+       if (settings->ns_codec)
+               bitmapCodecCount++;
+
+       stream_write_uint8(s, bitmapCodecCount);
+
+       if (settings->rfx_codec)
+       {
+               stream_write(s, CODEC_GUID_REMOTEFX, 16); /* codecGUID */
+
+               if (settings->server_mode)
+               {
+                       stream_write_uint8(s, 0); /* codecID is defined by the client */
+                       rdp_write_rfx_server_capability_container(s, settings);
+               }
+               else
+               {
+                       stream_write_uint8(s, CODEC_ID_REMOTEFX); /* codecID */
+                       rdp_write_rfx_client_capability_container(s, settings);
+               }
+       }
+       if (settings->ns_codec)
+       {
+               stream_write(s, CODEC_GUID_NSCODEC, 16);
+               if (settings->server_mode)
+               {
+                       stream_write_uint8(s, 0); /* codecID is defined by the client */
+                       rdp_write_nsc_server_capability_container(s, settings);
+               }
+               else
+               {
+                       stream_write_uint8(s, CODEC_ID_NSCODEC); /* codecID */
+                       rdp_write_nsc_client_capability_container(s, settings);
+               }
+       }
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_BITMAP_CODECS);
+}
+
+/**
+ * Read frame acknowledge capability set.\n
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_frame_acknowledge_capability_set(STREAM* s, uint16 length, rdpSettings* settings)
+{
+       stream_seek_uint32(s); /* (4 bytes) */
+}
+
+/**
+ * Write frame acknowledge capability set.\n
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_frame_acknowledge_capability_set(STREAM* s, rdpSettings* settings)
+{
+       uint8* header;
+
+       header = rdp_capability_set_start(s);
+
+       stream_write_uint32(s, 2); /* (4 bytes) */
+
+       rdp_capability_set_finish(s, header, CAPSET_TYPE_FRAME_ACKNOWLEDGE);
+}
+
+boolean rdp_read_capability_sets(STREAM* s, rdpSettings* settings, uint16 numberCapabilities)
+{
+       uint16 type;
+       uint16 length;
+       uint8 *bm, *em;
+
+       while (numberCapabilities > 0)
+       {
+               stream_get_mark(s, bm);
+
+               rdp_read_capability_set_header(s, &length, &type);
+               //printf("%s Capability Set (0x%02X), length:%d\n", CAPSET_TYPE_STRINGS[type], type, length);
+               settings->received_caps[type] = true;
+               em = bm + length;
+
+               if (stream_get_left(s) < length - 4)
+               {
+                       printf("error processing stream\n");
+                       return false;
+               }
+
+               switch (type)
+               {
+                       case CAPSET_TYPE_GENERAL:
+                               rdp_read_general_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_BITMAP:
+                               rdp_read_bitmap_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_ORDER:
+                               rdp_read_order_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_BITMAP_CACHE:
+                               rdp_read_bitmap_cache_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_CONTROL:
+                               rdp_read_control_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_ACTIVATION:
+                               rdp_read_window_activation_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_POINTER:
+                               rdp_read_pointer_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_SHARE:
+                               rdp_read_share_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_COLOR_CACHE:
+                               rdp_read_color_cache_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_SOUND:
+                               rdp_read_sound_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_INPUT:
+                               rdp_read_input_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_FONT:
+                               rdp_read_font_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_BRUSH:
+                               rdp_read_brush_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_GLYPH_CACHE:
+                               rdp_read_glyph_cache_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_OFFSCREEN_CACHE:
+                               rdp_read_offscreen_bitmap_cache_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_BITMAP_CACHE_HOST_SUPPORT:
+                               rdp_read_bitmap_cache_host_support_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_BITMAP_CACHE_V2:
+                               rdp_read_bitmap_cache_v2_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_VIRTUAL_CHANNEL:
+                               rdp_read_virtual_channel_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_DRAW_NINE_GRID_CACHE:
+                               rdp_read_draw_nine_grid_cache_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_DRAW_GDI_PLUS:
+                               rdp_read_draw_gdiplus_cache_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_RAIL:
+                               rdp_read_remote_programs_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_WINDOW:
+                               rdp_read_window_list_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_COMP_DESK:
+                               rdp_read_desktop_composition_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_MULTI_FRAGMENT_UPDATE:
+                               rdp_read_multifragment_update_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_LARGE_POINTER:
+                               rdp_read_large_pointer_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_SURFACE_COMMANDS:
+                               rdp_read_surface_commands_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_BITMAP_CODECS:
+                               rdp_read_bitmap_codecs_capability_set(s, length, settings);
+                               break;
+
+                       case CAPSET_TYPE_FRAME_ACKNOWLEDGE:
+                               rdp_read_frame_acknowledge_capability_set(s, length, settings);
+                               break;
+
+                       default:
+                               printf("unknown capability type %d\n", type);
+                               break;
+               }
+
+               if (s->p != em)
+               {
+                       printf("incorrect offset, type:0x%02X actual:%d expected:%d\n",
+                               type, (int) (s->p - bm), (int) (em - bm));
+               }
+
+               stream_set_mark(s, em);
+               numberCapabilities--;
+       }
+
+       return true;
+}
+
+boolean rdp_recv_demand_active(rdpRdp* rdp, STREAM* s)
+{
+       uint16 length;
+       uint16 channelId;
+       uint16 pduType;
+       uint16 pduLength;
+       uint16 pduSource;
+       uint16 numberCapabilities;
+       uint16 lengthSourceDescriptor;
+       uint16 lengthCombinedCapabilities;
+       uint16 securityFlags;
+
+       if (!rdp_read_header(rdp, s, &length, &channelId))
+               return false;
+
+       if (rdp->disconnect)
+               return true;
+
+       if (rdp->settings->encryption)
+       {
+               rdp_read_security_header(s, &securityFlags);
+               if (securityFlags & SEC_ENCRYPT)
+               {
+                       if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
+                       {
+                               printf("rdp_decrypt failed\n");
+                               return false;
+                       }
+               }
+       }
+
+       if (channelId != MCS_GLOBAL_CHANNEL_ID)
+       {
+               printf("channelId bad\n");
+               return false;
+       }
+
+       if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))
+       {
+               printf("rdp_read_share_control_header failed\n");
+               return false;
+       }
+
+       rdp->settings->pdu_source = pduSource;
+
+       if (pduType != PDU_TYPE_DEMAND_ACTIVE)
+       {
+               printf("pduType bad\n");
+               return false;
+       }
+
+       stream_read_uint32(s, rdp->settings->share_id); /* shareId (4 bytes) */
+       stream_read_uint16(s, lengthSourceDescriptor); /* lengthSourceDescriptor (2 bytes) */
+       stream_read_uint16(s, lengthCombinedCapabilities); /* lengthCombinedCapabilities (2 bytes) */
+       stream_seek(s, lengthSourceDescriptor); /* sourceDescriptor */
+       stream_read_uint16(s, numberCapabilities); /* numberCapabilities (2 bytes) */
+       stream_seek(s, 2); /* pad2Octets (2 bytes) */
+
+       /* capabilitySets */
+       if (!rdp_read_capability_sets(s, rdp->settings, numberCapabilities))
+       {
+               printf("rdp_read_capability_sets failed\n");
+               return false;
+       }
+
+       rdp->update->secondary->glyph_v2 = (rdp->settings->glyphSupportLevel > GLYPH_SUPPORT_FULL) ? true : false;
+
+       return true;
+}
+
+void rdp_write_demand_active(STREAM* s, rdpSettings* settings)
+{
+       uint8 *bm, *em, *lm;
+       uint16 numberCapabilities;
+       uint16 lengthCombinedCapabilities;
+
+       stream_write_uint32(s, settings->share_id); /* shareId (4 bytes) */
+       stream_write_uint16(s, 4); /* lengthSourceDescriptor (2 bytes) */
+
+       stream_get_mark(s, lm);
+       stream_seek_uint16(s); /* lengthCombinedCapabilities (2 bytes) */
+       stream_write(s, "RDP", 4); /* sourceDescriptor */
+
+       stream_get_mark(s, bm);
+       stream_seek_uint16(s); /* numberCapabilities (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+
+       numberCapabilities = 14;
+       rdp_write_general_capability_set(s, settings);
+       rdp_write_bitmap_capability_set(s, settings);
+       rdp_write_order_capability_set(s, settings);
+       rdp_write_pointer_capability_set(s, settings);
+       rdp_write_input_capability_set(s, settings);
+       rdp_write_virtual_channel_capability_set(s, settings);
+       rdp_write_bitmap_cache_host_support_capability_set(s, settings);
+       rdp_write_share_capability_set(s, settings);
+       rdp_write_font_capability_set(s, settings);
+       rdp_write_multifragment_update_capability_set(s, settings);
+       rdp_write_large_pointer_capability_set(s, settings);
+       rdp_write_desktop_composition_capability_set(s, settings);
+       rdp_write_surface_commands_capability_set(s, settings);
+       rdp_write_bitmap_codecs_capability_set(s, settings);
+
+       stream_get_mark(s, em);
+
+       stream_set_mark(s, lm); /* go back to lengthCombinedCapabilities */
+       lengthCombinedCapabilities = (em - bm);
+       stream_write_uint16(s, lengthCombinedCapabilities); /* lengthCombinedCapabilities (2 bytes) */
+
+       stream_set_mark(s, bm); /* go back to numberCapabilities */
+       stream_write_uint16(s, numberCapabilities); /* numberCapabilities (2 bytes) */
+
+       stream_set_mark(s, em);
+
+       stream_write_uint32(s, 0); /* sessionId */
+}
+
+boolean rdp_send_demand_active(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_pdu_init(rdp);
+
+       rdp->settings->share_id = 0x10000 + rdp->mcs->user_id;
+
+       rdp_write_demand_active(s, rdp->settings);
+
+       rdp_send_pdu(rdp, s, PDU_TYPE_DEMAND_ACTIVE, rdp->mcs->user_id);
+
+       return true;
+}
+
+boolean rdp_recv_confirm_active(rdpRdp* rdp, STREAM* s)
+{
+       uint16 length;
+       uint16 channelId;
+       uint16 pduType;
+       uint16 pduLength;
+       uint16 pduSource;
+       uint16 lengthSourceDescriptor;
+       uint16 lengthCombinedCapabilities;
+       uint16 numberCapabilities;
+       uint16 securityFlags;
+
+       if (!rdp_read_header(rdp, s, &length, &channelId))
+               return false;
+
+       if (rdp->settings->encryption)
+       {
+               rdp_read_security_header(s, &securityFlags);
+               if (securityFlags & SEC_ENCRYPT)
+               {
+                       if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
+                       {
+                               printf("rdp_decrypt failed\n");
+                               return false;
+                       }
+               }
+       }
+
+       if (channelId != MCS_GLOBAL_CHANNEL_ID)
+               return false;
+
+       if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))
+               return false;
+
+       rdp->settings->pdu_source = pduSource;
+
+       if (pduType != PDU_TYPE_CONFIRM_ACTIVE)
+               return false;
+
+       stream_seek_uint32(s); /* shareId (4 bytes) */
+       stream_seek_uint16(s); /* originatorId (2 bytes) */
+       stream_read_uint16(s, lengthSourceDescriptor); /* lengthSourceDescriptor (2 bytes) */
+       stream_read_uint16(s, lengthCombinedCapabilities); /* lengthCombinedCapabilities (2 bytes) */
+       stream_seek(s, lengthSourceDescriptor); /* sourceDescriptor */
+       stream_read_uint16(s, numberCapabilities); /* numberCapabilities (2 bytes) */
+       stream_seek(s, 2); /* pad2Octets (2 bytes) */
+
+       if (!rdp_read_capability_sets(s, rdp->settings, numberCapabilities))
+               return false;
+
+       return true;
+}
+
+void rdp_write_confirm_active(STREAM* s, rdpSettings* settings)
+{
+       uint8 *bm, *em, *lm;
+       uint16 numberCapabilities;
+       uint16 lengthSourceDescriptor;
+       uint16 lengthCombinedCapabilities;
+
+       lengthSourceDescriptor = sizeof(SOURCE_DESCRIPTOR);
+
+       stream_write_uint32(s, settings->share_id); /* shareId (4 bytes) */
+       stream_write_uint16(s, 0x03EA); /* originatorId (2 bytes) */
+       stream_write_uint16(s, lengthSourceDescriptor);/* lengthSourceDescriptor (2 bytes) */
+
+       stream_get_mark(s, lm);
+       stream_seek_uint16(s); /* lengthCombinedCapabilities (2 bytes) */
+       stream_write(s, SOURCE_DESCRIPTOR, lengthSourceDescriptor); /* sourceDescriptor */
+
+       stream_get_mark(s, bm);
+       stream_seek_uint16(s); /* numberCapabilities (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+
+       /* Capability Sets */
+       numberCapabilities = 15;
+       rdp_write_general_capability_set(s, settings);
+       rdp_write_bitmap_capability_set(s, settings);
+       rdp_write_order_capability_set(s, settings);
+
+       if (settings->rdp_version >= 5)
+               rdp_write_bitmap_cache_v2_capability_set(s, settings);
+       else
+               rdp_write_bitmap_cache_capability_set(s, settings);
+
+       rdp_write_pointer_capability_set(s, settings);
+       rdp_write_input_capability_set(s, settings);
+       rdp_write_brush_capability_set(s, settings);
+       rdp_write_glyph_cache_capability_set(s, settings);
+       rdp_write_virtual_channel_capability_set(s, settings);
+       rdp_write_sound_capability_set(s, settings);
+       rdp_write_share_capability_set(s, settings);
+       rdp_write_font_capability_set(s, settings);
+       rdp_write_control_capability_set(s, settings);
+       rdp_write_color_cache_capability_set(s, settings);
+       rdp_write_window_activation_capability_set(s, settings);
+
+       if (settings->offscreen_bitmap_cache)
+       {
+               numberCapabilities++;
+               rdp_write_offscreen_bitmap_cache_capability_set(s, settings);
+       }
+
+       if (settings->received_caps[CAPSET_TYPE_LARGE_POINTER])
+       {
+               if (settings->large_pointer)
+               {
+                       numberCapabilities++;
+                       rdp_write_large_pointer_capability_set(s, settings);
+               }
+       }
+
+       if (settings->remote_app)
+       {
+               numberCapabilities += 2;
+               rdp_write_remote_programs_capability_set(s, settings);
+               rdp_write_window_list_capability_set(s, settings);
+       }
+
+       if (settings->received_caps[CAPSET_TYPE_MULTI_FRAGMENT_UPDATE])
+       {
+               numberCapabilities++;
+               rdp_write_multifragment_update_capability_set(s, settings);
+       }
+
+       if (settings->received_caps[CAPSET_TYPE_SURFACE_COMMANDS])
+       {
+               numberCapabilities++;
+               rdp_write_surface_commands_capability_set(s, settings);
+       }
+
+       if (settings->received_caps[CAPSET_TYPE_BITMAP_CODECS])
+       {
+               numberCapabilities++;
+               rdp_write_bitmap_codecs_capability_set(s, settings);
+       }
+
+       if (settings->received_caps[CAPSET_TYPE_FRAME_ACKNOWLEDGE])
+       {
+               if (settings->frame_acknowledge)
+               {
+                       numberCapabilities++;
+                       rdp_write_frame_acknowledge_capability_set(s, settings);
+               }
+       }
+
+       stream_get_mark(s, em);
+
+       stream_set_mark(s, lm); /* go back to lengthCombinedCapabilities */
+       lengthCombinedCapabilities = (em - bm);
+       stream_write_uint16(s, lengthCombinedCapabilities); /* lengthCombinedCapabilities (2 bytes) */
+
+       stream_set_mark(s, bm); /* go back to numberCapabilities */
+       stream_write_uint16(s, numberCapabilities); /* numberCapabilities (2 bytes) */
+
+       stream_set_mark(s, em);
+}
+
+boolean rdp_send_confirm_active(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = rdp_pdu_init(rdp);
+
+       rdp_write_confirm_active(s, rdp->settings);
+
+       return rdp_send_pdu(rdp, s, PDU_TYPE_CONFIRM_ACTIVE, rdp->mcs->user_id);
+}
+
diff --git a/libfreerdp-core/capabilities.h b/libfreerdp-core/capabilities.h
new file mode 100644 (file)
index 0000000..420d69c
--- /dev/null
@@ -0,0 +1,173 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Capability Sets
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CAPABILITIES_H
+#define __CAPABILITIES_H
+
+#include "rdp.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/stream.h>
+
+/* Capability Set Types */
+#define CAPSET_TYPE_GENERAL                    0x0001
+#define CAPSET_TYPE_BITMAP                     0x0002
+#define CAPSET_TYPE_ORDER                      0x0003
+#define CAPSET_TYPE_BITMAP_CACHE               0x0004
+#define CAPSET_TYPE_CONTROL                    0x0005
+#define CAPSET_TYPE_ACTIVATION                 0x0007
+#define CAPSET_TYPE_POINTER                    0x0008
+#define CAPSET_TYPE_SHARE                      0x0009
+#define CAPSET_TYPE_COLOR_CACHE                        0x000A
+#define CAPSET_TYPE_SOUND                      0x000C
+#define CAPSET_TYPE_INPUT                      0x000D
+#define CAPSET_TYPE_FONT                       0x000E
+#define CAPSET_TYPE_BRUSH                      0x000F
+#define CAPSET_TYPE_GLYPH_CACHE                        0x0010
+#define CAPSET_TYPE_OFFSCREEN_CACHE            0x0011
+#define CAPSET_TYPE_BITMAP_CACHE_HOST_SUPPORT  0x0012
+#define CAPSET_TYPE_BITMAP_CACHE_V2            0x0013
+#define CAPSET_TYPE_VIRTUAL_CHANNEL            0x0014
+#define CAPSET_TYPE_DRAW_NINE_GRID_CACHE       0x0015
+#define CAPSET_TYPE_DRAW_GDI_PLUS              0x0016
+#define CAPSET_TYPE_RAIL                       0x0017
+#define CAPSET_TYPE_WINDOW                     0x0018
+#define CAPSET_TYPE_COMP_DESK                  0x0019
+#define CAPSET_TYPE_MULTI_FRAGMENT_UPDATE      0x001A
+#define CAPSET_TYPE_LARGE_POINTER              0x001B
+#define CAPSET_TYPE_SURFACE_COMMANDS           0x001C
+#define CAPSET_TYPE_BITMAP_CODECS              0x001D
+#define CAPSET_TYPE_FRAME_ACKNOWLEDGE           0x001E
+
+#define CAPSET_HEADER_LENGTH                   4
+
+#define SOURCE_DESCRIPTOR                      "FREERDP"
+
+/* Capabilities Protocol Version */
+#define CAPS_PROTOCOL_VERSION                  0x0200
+
+/* General Capability Flags */
+#define FASTPATH_OUTPUT_SUPPORTED              0x0001
+#define NO_BITMAP_COMPRESSION_HDR              0x0400
+#define LONG_CREDENTIALS_SUPPORTED             0x0004
+#define AUTORECONNECT_SUPPORTED                        0x0008
+#define ENC_SALTED_CHECKSUM                    0x0010
+
+/* Drawing Flags */
+#define DRAW_ALLOW_DYNAMIC_COLOR_FIDELITY      0x02
+#define DRAW_ALLOW_COLOR_SUBSAMPLING           0x04
+#define DRAW_ALLOW_SKIP_ALPHA                  0x08
+
+/* Order Flags */
+#define NEGOTIATE_ORDER_SUPPORT                        0x0002
+#define ZERO_BOUNDS_DELTA_SUPPORT              0x0008
+#define COLOR_INDEX_SUPPORT                    0x0020
+#define SOLID_PATTERN_BRUSH_ONLY               0x0040
+#define ORDER_FLAGS_EXTRA_SUPPORT              0x0080
+
+/* Extended Order Flags */
+#define CACHE_BITMAP_V3_SUPPORT                        0x0002
+#define ALTSEC_FRAME_MARKER_SUPPORT            0x0004
+
+/* Sound Flags */
+#define SOUND_BEEPS_FLAG                       0x0001
+
+/* Input Flags */
+#define INPUT_FLAG_SCANCODES                   0x0001
+#define INPUT_FLAG_MOUSEX                      0x0004
+#define INPUT_FLAG_FASTPATH_INPUT              0x0008
+#define INPUT_FLAG_UNICODE                     0x0010
+#define INPUT_FLAG_FASTPATH_INPUT2             0x0020
+
+/* Font Support Flags */
+#define FONTSUPPORT_FONTLIST                   0x0001
+
+/* Brush Support Level */
+#define BRUSH_DEFAULT                          0x00000000
+#define BRUSH_COLOR_8x8                                0x00000001
+#define BRUSH_COLOR_FULL                       0x00000002
+
+/* Bitmap Cache Version */
+#define BITMAP_CACHE_V2                                0x01
+
+/* Bitmap Cache V2 Flags */
+#define PERSISTENT_KEYS_EXPECTED_FLAG          0x0001
+#define ALLOW_CACHE_WAITING_LIST_FLAG          0x0002
+
+/* Virtual Channel Flags */
+#define VCCAPS_NO_COMPR                                0x00000000
+#define VCCAPS_COMPR_SC                                0x00000001
+#define VCCAPS_COMPR_CS_8K                     0x00000002
+
+/* Draw Nine Grid Support Level */
+#define DRAW_NINEGRID_NO_SUPPORT               0x00000000
+#define DRAW_NINEGRID_SUPPORTED                        0x00000001
+#define DRAW_NINEGRID_SUPPORTED_V2             0x00000002
+
+/* Draw GDI+ Support Level */
+#define DRAW_GDIPLUS_DEFAULT                   0x00000000
+#define DRAW_GDIPLUS_SUPPORTED                 0x00000001
+
+/* Draw GDI+ Cache Level */
+#define DRAW_GDIPLUS_CACHE_LEVEL_DEFAULT       0x00000000
+#define DRAW_GDIPLUS_CACHE_LEVEL_ONE           0x00000001
+
+/* RAIL Support Level */
+#define RAIL_LEVEL_SUPPORTED                   0x00000001
+#define RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED    0x00000002
+
+/* Window Support Level */
+#define WINDOW_LEVEL_NOT_SUPPORTED             0x00000000
+#define WINDOW_LEVEL_SUPPORTED                 0x00000001
+#define WINDOW_LEVEL_SUPPORTED_EX              0x00000002
+
+/* Desktop Composition Support Level */
+#define COMPDESK_NOT_SUPPORTED                 0x0000
+#define COMPDESK_SUPPORTED                     0x0001
+
+/* Large Pointer Support Flags */
+#define LARGE_POINTER_FLAG_96x96               0x00000001
+
+/* Surface Commands Flags */
+#define SURFCMDS_SET_SURFACE_BITS              0x00000002
+#define SURFCMDS_FRAME_MARKER                  0x00000010
+#define SURFCMDS_STREAM_SURFACE_BITS           0x00000040
+
+/* Bitmap Codec Constants */
+#define CARDP_CAPS_CAPTURE_NON_CAC             0x00000001
+#define CBY_CAPS                               0xCBC0
+#define CBY_CAPSET                             0xCBC1
+#define CLY_CAPSET                             0xCFC0
+#define CLW_VERSION_1_0                                0x0100
+#define CT_TILE_64x64                          0x0040
+#define CLW_COL_CONV_ICT                       0x1
+#define CLW_XFORM_DWT_53_A                     0x1
+#define CLW_ENTROPY_RLGR1                      0x01
+#define CLW_ENTROPY_RLGR3                      0x04
+
+boolean rdp_recv_demand_active(rdpRdp* rdp, STREAM* s);
+void rdp_write_demand_active(STREAM* s, rdpSettings* settings);
+boolean rdp_send_demand_active(rdpRdp* rdp);
+boolean rdp_recv_confirm_active(rdpRdp* rdp, STREAM* s);
+void rdp_write_confirm_active(STREAM* s, rdpSettings* settings);
+boolean rdp_send_confirm_active(rdpRdp* rdp);
+
+#endif /* __CAPABILITIES_H */
diff --git a/libfreerdp-core/certificate.c b/libfreerdp-core/certificate.c
new file mode 100644 (file)
index 0000000..69fcf1d
--- /dev/null
@@ -0,0 +1,760 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Certificate Handling
+ *
+ * Copyright 2011 Jiten Pathy
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <openssl/pem.h>
+#include <openssl/rsa.h>
+
+#include <freerdp/utils/file.h>
+
+static const char certificate_store_dir[] = "certs";
+static const char certificate_known_hosts_file[] = "known_hosts";
+
+#include "certificate.h"
+
+/**
+ *
+ * X.509 Certificate Structure
+ *
+ * Certificate ::= SEQUENCE
+ * {
+ *     tbsCertificate                  TBSCertificate,
+ *     signatureAlgorithm              AlgorithmIdentifier,
+ *     signatureValue                  BIT_STRING
+ * }
+ *
+ * TBSCertificate ::= SEQUENCE
+ * {
+ *     version                 [0]     EXPLICIT Version DEFAULT v1,
+ *     serialNumber                    CertificateSerialNumber,
+ *     signature                       AlgorithmIdentifier,
+ *     issuer                          Name,
+ *     validity                        Validity,
+ *     subject                         Name,
+ *     subjectPublicKeyInfo            SubjectPublicKeyInfo,
+ *     issuerUniqueID          [1]     IMPLICIT UniqueIdentifier OPTIONAL,
+ *     subjectUniqueId         [2]     IMPLICIT UniqueIdentifier OPTIONAL,
+ *     extensions              [3]     EXPLICIT Extensions OPTIONAL
+ * }
+ *
+ * Version ::= INTEGER { v1(0), v2(1), v3(2) }
+ *
+ * CertificateSerialNumber ::= INTEGER
+ *
+ * AlgorithmIdentifier ::= SEQUENCE
+ * {
+ *     algorithm                       OBJECT_IDENTIFIER,
+ *     parameters                      ANY DEFINED BY algorithm OPTIONAL
+ * }
+ *
+ * Name ::= CHOICE { RDNSequence }
+ *
+ * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
+ *
+ * RelativeDistinguishedName ::= SET OF AttributeTypeAndValue
+ *
+ * AttributeTypeAndValue ::= SEQUENCE
+ * {
+ *     type                            AttributeType,
+ *     value                           AttributeValue
+ * }
+ *
+ * AttributeType ::= OBJECT_IDENTIFIER
+ *
+ * AttributeValue ::= ANY DEFINED BY AttributeType
+ *
+ * Validity ::= SEQUENCE
+ * {
+ *     notBefore                       Time,
+ *     notAfter                        Time
+ * }
+ *
+ * Time ::= CHOICE
+ * {
+ *     utcTime                         UTCTime,
+ *     generalTime                     GeneralizedTime
+ * }
+ *
+ * UniqueIdentifier ::= BIT_STRING
+ *
+ * SubjectPublicKeyInfo ::= SEQUENCE
+ * {
+ *     algorithm                       AlgorithmIdentifier,
+ *     subjectPublicKey                BIT_STRING
+ * }
+ *
+ * RSAPublicKey ::= SEQUENCE
+ * {
+ *     modulus                         INTEGER
+ *     publicExponent                  INTEGER
+ * }
+ *
+ * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
+ *
+ * Extension ::= SEQUENCE
+ * {
+ *     extnID                          OBJECT_IDENTIFIER
+ *     critical                        BOOLEAN DEFAULT FALSE,
+ *     extnValue                       OCTET_STRING
+ * }
+ *
+ */
+
+/**
+ * Read X.509 Certificate
+ * @param certificate certificate module
+ * @param cert X.509 certificate
+ */
+
+void certificate_read_x509_certificate(rdpCertBlob* cert, rdpCertInfo* info)
+{
+       STREAM* s;
+       int length;
+       uint8 padding;
+       uint32 version;
+       int modulus_length;
+       int exponent_length;
+
+       s = stream_new(0);
+       stream_attach(s, cert->data, cert->length);
+
+       ber_read_sequence_tag(s, &length); /* Certificate (SEQUENCE) */
+
+       ber_read_sequence_tag(s, &length); /* TBSCertificate (SEQUENCE) */
+
+       /* Explicit Contextual Tag [0] */
+       ber_read_contextual_tag(s, 0, &length, true);
+       ber_read_integer(s, &version); /* version (INTEGER) */
+       version++;
+
+       /* serialNumber */
+       ber_read_integer(s, NULL); /* CertificateSerialNumber (INTEGER) */
+
+       /* signature */
+       ber_read_sequence_tag(s, &length); /* AlgorithmIdentifier (SEQUENCE) */
+       stream_seek(s, length);
+
+       /* issuer */
+       ber_read_sequence_tag(s, &length); /* Name (SEQUENCE) */
+       stream_seek(s, length);
+
+       /* validity */
+       ber_read_sequence_tag(s, &length); /* Validity (SEQUENCE) */
+       stream_seek(s, length);
+
+       /* subject */
+       ber_read_sequence_tag(s, &length); /* Name (SEQUENCE) */
+       stream_seek(s, length);
+
+       /* subjectPublicKeyInfo */
+       ber_read_sequence_tag(s, &length); /* SubjectPublicKeyInfo (SEQUENCE) */
+
+       /* subjectPublicKeyInfo::AlgorithmIdentifier */
+       ber_read_sequence_tag(s, &length); /* AlgorithmIdentifier (SEQUENCE) */
+       stream_seek(s, length);
+
+       /* subjectPublicKeyInfo::subjectPublicKey */
+       ber_read_bit_string(s, &length, &padding); /* BIT_STRING */
+
+       /* RSAPublicKey (SEQUENCE) */
+       ber_read_sequence_tag(s, &length); /* SEQUENCE */
+
+       ber_read_integer_length(s, &modulus_length); /* modulus (INTEGER) */
+
+       /* skip zero padding, if any */
+       do
+       {
+               stream_peek_uint8(s, padding);
+
+               if (padding == 0)
+               {
+                       stream_seek(s, 1);
+                       modulus_length--;
+               }
+       }
+       while (padding == 0);
+
+       freerdp_blob_alloc(&info->modulus, modulus_length);
+       stream_read(s, info->modulus.data, modulus_length);
+
+       ber_read_integer_length(s, &exponent_length); /* publicExponent (INTEGER) */
+       stream_read(s, &info->exponent[4 - exponent_length], exponent_length);
+       crypto_reverse(info->modulus.data, modulus_length);
+       crypto_reverse(info->exponent, 4);
+
+       stream_detach(s);
+       stream_free(s);
+}
+
+/**
+ * Instantiate new X.509 Certificate Chain.
+ * @param count certificate chain count
+ * @return new X.509 certificate chain
+ */
+
+rdpX509CertChain* certificate_new_x509_certificate_chain(uint32 count)
+{
+       rdpX509CertChain* x509_cert_chain;
+
+       x509_cert_chain = (rdpX509CertChain*) xmalloc(sizeof(rdpX509CertChain));
+
+       x509_cert_chain->count = count;
+       x509_cert_chain->array = (rdpCertBlob*) xzalloc(sizeof(rdpCertBlob) * count);
+
+       return x509_cert_chain;
+}
+
+/**
+ * Free X.509 Certificate Chain.
+ * @param x509_cert_chain X.509 certificate chain to be freed
+ */
+
+void certificate_free_x509_certificate_chain(rdpX509CertChain* x509_cert_chain)
+{
+       int i;
+
+       if (x509_cert_chain != NULL)
+       {
+               for (i = 0; i < (int) x509_cert_chain->count; i++)
+               {
+                       if (x509_cert_chain->array[i].data != NULL)
+                               xfree(x509_cert_chain->array[i].data);
+               }
+
+               xfree(x509_cert_chain->array);
+               xfree(x509_cert_chain);
+       }
+}
+
+static boolean certificate_process_server_public_key(rdpCertificate* certificate, STREAM* s, uint32 length)
+{
+       uint8 magic[4];
+       uint32 keylen;
+       uint32 bitlen;
+       uint32 datalen;
+       uint32 modlen;
+
+       stream_read(s, magic, 4);
+       if (memcmp(magic, "RSA1", 4) != 0)
+       {
+               printf("gcc_process_server_public_key: magic error\n");
+               return false;
+       }
+
+       stream_read_uint32(s, keylen);
+       stream_read_uint32(s, bitlen);
+       stream_read_uint32(s, datalen);
+       stream_read(s, certificate->cert_info.exponent, 4);
+       modlen = keylen - 8;
+       freerdp_blob_alloc(&(certificate->cert_info.modulus), modlen);
+       stream_read(s, certificate->cert_info.modulus.data, modlen);
+       /* 8 bytes of zero padding */
+       stream_seek(s, 8);
+
+       return true;
+}
+
+static boolean certificate_process_server_public_signature(rdpCertificate* certificate, uint8* sigdata, int sigdatalen, STREAM* s, uint32 siglen)
+{
+       uint8 md5hash[CRYPTO_MD5_DIGEST_LENGTH];
+       uint8 encsig[TSSK_KEY_LENGTH + 8];
+       uint8 sig[TSSK_KEY_LENGTH];
+       CryptoMd5 md5ctx;
+       int i, sum;
+
+       md5ctx = crypto_md5_init();
+       crypto_md5_update(md5ctx, sigdata, sigdatalen);
+       crypto_md5_final(md5ctx, md5hash);
+
+       stream_read(s, encsig, siglen);
+
+       /* Last 8 bytes shall be all zero. */
+
+       for (sum = 0, i = sizeof(encsig) - 8; i < sizeof(encsig); i++)
+               sum += encsig[i];
+
+       if (sum != 0)
+       {
+               printf("certificate_process_server_public_signature: invalid signature\n");
+               //return false;
+       }
+
+       siglen -= 8;
+
+       crypto_rsa_public_decrypt(encsig, siglen, TSSK_KEY_LENGTH, tssk_modulus, tssk_exponent, sig);
+
+       /* Verify signature. */
+       if (memcmp(md5hash, sig, sizeof(md5hash)) != 0)
+       {
+               printf("certificate_process_server_public_signature: invalid signature\n");
+               //return false;
+       }
+
+       /*
+        * Verify rest of decrypted data:
+        * The 17th byte is 0x00.
+        * The 18th through 62nd bytes are each 0xFF.
+        * The 63rd byte is 0x01.
+        */
+
+       for (sum = 0, i = 17; i < 62; i++)
+               sum += sig[i];
+
+       if (sig[16] != 0x00 || sum != 0xFF * (62 - 17) || sig[62] != 0x01)
+       {
+               printf("certificate_process_server_public_signature: invalid signature\n");
+               //return false;
+       }
+
+       return true;
+}
+
+/**
+ * Read a Server Proprietary Certificate.\n
+ * @param certificate certificate module
+ * @param s stream
+ */
+
+boolean certificate_read_server_proprietary_certificate(rdpCertificate* certificate, STREAM* s)
+{
+       uint32 dwSigAlgId;
+       uint32 dwKeyAlgId;
+       uint32 wPublicKeyBlobType;
+       uint32 wPublicKeyBlobLen;
+       uint32 wSignatureBlobType;
+       uint32 wSignatureBlobLen;
+       uint8* sigdata;
+       int sigdatalen;
+
+       /* -4, because we need to include dwVersion */
+       sigdata = stream_get_tail(s) - 4;
+       stream_read_uint32(s, dwSigAlgId);
+       stream_read_uint32(s, dwKeyAlgId);
+       if (!(dwSigAlgId == SIGNATURE_ALG_RSA && dwKeyAlgId == KEY_EXCHANGE_ALG_RSA))
+       {
+               printf("certificate_read_server_proprietary_certificate: parse error 1\n");
+               return false;
+       }
+       stream_read_uint16(s, wPublicKeyBlobType);
+       if (wPublicKeyBlobType != BB_RSA_KEY_BLOB)
+       {
+               printf("certificate_read_server_proprietary_certificate: parse error 2\n");
+               return false;
+       }
+       stream_read_uint16(s, wPublicKeyBlobLen);
+       if (!certificate_process_server_public_key(certificate, s, wPublicKeyBlobLen))
+       {
+               printf("certificate_read_server_proprietary_certificate: parse error 3\n");
+               return false;
+       }
+       sigdatalen = stream_get_tail(s) - sigdata;
+       stream_read_uint16(s, wSignatureBlobType);
+       if (wSignatureBlobType != BB_RSA_SIGNATURE_BLOB)
+       {
+               printf("certificate_read_server_proprietary_certificate: parse error 4\n");
+               return false;
+       }
+       stream_read_uint16(s, wSignatureBlobLen);
+       if (wSignatureBlobLen != 72)
+       {
+               printf("certificate_process_server_public_signature: invalid signature length (got %d, expected %d)\n", wSignatureBlobLen, 64);
+               return false;
+       }
+       if (!certificate_process_server_public_signature(certificate, sigdata, sigdatalen, s, wSignatureBlobLen))
+       {
+               printf("certificate_read_server_proprietary_certificate: parse error 5\n");
+               return false;
+       }
+
+       return true;
+}
+
+/**
+ * Read an X.509 Certificate Chain.\n
+ * @param certificate certificate module
+ * @param s stream
+ */
+
+boolean certificate_read_server_x509_certificate_chain(rdpCertificate* certificate, STREAM* s)
+{
+       int i;
+       uint32 certLength;
+       uint32 numCertBlobs;
+
+       DEBUG_CERTIFICATE("Server X.509 Certificate Chain");
+
+       stream_read_uint32(s, numCertBlobs); /* numCertBlobs */
+
+       certificate->x509_cert_chain = certificate_new_x509_certificate_chain(numCertBlobs);
+
+       for (i = 0; i < (int) numCertBlobs; i++)
+       {
+               stream_read_uint32(s, certLength);
+
+               DEBUG_CERTIFICATE("\nX.509 Certificate #%d, length:%d", i + 1, certLength);
+
+               certificate->x509_cert_chain->array[i].data = (uint8*) xmalloc(certLength);
+               stream_read(s, certificate->x509_cert_chain->array[i].data, certLength);
+               certificate->x509_cert_chain->array[i].length = certLength;
+
+               if (numCertBlobs - i == 2)
+               {
+                       rdpCertInfo cert_info;
+                       DEBUG_CERTIFICATE("License Server Certificate");
+                       certificate_read_x509_certificate(&certificate->x509_cert_chain->array[i], &cert_info);
+                       DEBUG_LICENSE("modulus length:%d", cert_info.modulus.length);
+                       freerdp_blob_free(&cert_info.modulus);
+               }
+               else if (numCertBlobs - i == 1)
+               {
+                       DEBUG_CERTIFICATE("Terminal Server Certificate");
+                       certificate_read_x509_certificate(&certificate->x509_cert_chain->array[i], &certificate->cert_info);
+                       DEBUG_CERTIFICATE("modulus length:%d", certificate->cert_info.modulus.length);
+               }
+       }
+
+       return true;
+}
+
+/**
+ * Read a Server Certificate.\n
+ * @param certificate certificate module
+ * @param server_cert server certificate
+ * @param length certificate length
+ */
+
+boolean certificate_read_server_certificate(rdpCertificate* certificate, uint8* server_cert, int length)
+{
+       STREAM* s;
+       uint32 dwVersion;
+
+       s = stream_new(0);
+       stream_attach(s, server_cert, length);
+
+       if (length < 1)
+       {
+               printf("null server certificate\n");
+               return false;
+       }
+
+       stream_read_uint32(s, dwVersion); /* dwVersion (4 bytes) */
+
+       switch (dwVersion & CERT_CHAIN_VERSION_MASK)
+       {
+               case CERT_CHAIN_VERSION_1:
+                       certificate_read_server_proprietary_certificate(certificate, s);
+                       break;
+
+               case CERT_CHAIN_VERSION_2:
+                       certificate_read_server_x509_certificate_chain(certificate, s);
+                       break;
+
+               default:
+                       printf("invalid certificate chain version:%d\n", dwVersion & CERT_CHAIN_VERSION_MASK);
+                       break;
+       }
+
+       xfree(s);
+       return true;
+}
+
+rdpKey* key_new(const char* keyfile)
+{
+       rdpKey* key;
+       RSA *rsa;
+       FILE *fp;
+
+       key = (rdpKey*) xzalloc(sizeof(rdpKey));
+
+       if (key == NULL)
+               return NULL;
+
+       fp = fopen(keyfile, "r");
+
+       if (fp == NULL)
+       {
+               printf("unable to load RSA key from %s: %s.", keyfile, strerror(errno));
+               return NULL;
+       }
+
+       rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
+
+       if (rsa == NULL)
+       {
+               ERR_print_errors_fp(stdout);
+               fclose(fp);
+               return NULL;
+       }
+
+       fclose(fp);
+
+       switch (RSA_check_key(rsa))
+       {
+               case 0:
+                       RSA_free(rsa);
+                       printf("invalid RSA key in %s", keyfile);
+                       return NULL;
+
+               case 1:
+                       /* Valid key. */
+                       break;
+
+               default:
+                       ERR_print_errors_fp(stdout);
+                       RSA_free(rsa);
+                       return NULL;
+       }
+
+       if (BN_num_bytes(rsa->e) > 4)
+       {
+               RSA_free(rsa);
+               printf("RSA public exponent too large in %s", keyfile);
+               return NULL;
+       }
+
+       freerdp_blob_alloc(&key->modulus, BN_num_bytes(rsa->n));
+       BN_bn2bin(rsa->n, key->modulus.data);
+       crypto_reverse(key->modulus.data, key->modulus.length);
+       freerdp_blob_alloc(&key->private_exponent, BN_num_bytes(rsa->d));
+       BN_bn2bin(rsa->d, key->private_exponent.data);
+       crypto_reverse(key->private_exponent.data, key->private_exponent.length);
+       memset(key->exponent, 0, sizeof(key->exponent));
+       BN_bn2bin(rsa->e, key->exponent + sizeof(key->exponent) - BN_num_bytes(rsa->e));
+       crypto_reverse(key->exponent, sizeof(key->exponent));
+
+       RSA_free(rsa);
+
+       return key;
+}
+
+void key_free(rdpKey* key)
+{
+       if (key != NULL)
+       {
+               freerdp_blob_free(&key->modulus);
+               freerdp_blob_free(&key->private_exponent);
+               xfree(key);
+       }
+}
+
+void certificate_store_init(rdpCertificateStore* certificate_store)
+{
+       char* config_path;
+       rdpSettings* settings;
+
+       settings = certificate_store->settings;
+
+       config_path = freerdp_get_config_path(settings);
+       certificate_store->path = freerdp_construct_path(config_path, (char*) certificate_store_dir);
+
+       if (freerdp_check_file_exists(certificate_store->path) == false)
+       {
+               freerdp_mkdir(certificate_store->path);
+               printf("creating directory %s\n", certificate_store->path);
+       }
+
+       certificate_store->file = freerdp_construct_path(config_path, (char*) certificate_known_hosts_file);
+
+       if (freerdp_check_file_exists(certificate_store->file) == false)
+       {
+               certificate_store->fp = fopen((char*) certificate_store->file, "w+");
+
+               if (certificate_store->fp == NULL)
+               {
+                       printf("certificate_store_open: error opening [%s] for writing\n", certificate_store->file);
+                       return;
+               }
+
+               fflush(certificate_store->fp);
+       }
+       else
+       {
+               certificate_store->fp = fopen((char*) certificate_store->file, "r+");
+       }
+}
+
+int certificate_data_match(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data)
+{
+       FILE* fp;
+       int length;
+       char* data;
+       char* pline;
+       int match = 1;
+       long int size;
+
+       fp = certificate_store->fp;
+
+       if (!fp)
+               return match;
+
+       fseek(fp, 0, SEEK_END);
+       size = ftell(fp);
+       fseek(fp, 0, SEEK_SET);
+
+       if (size < 1)
+               return match;
+
+       data = (char*) xmalloc(size + 2);
+
+       if (fread(data, size, 1, fp) != 1)
+       {
+               xfree(data);
+               return match;
+       }
+
+       data[size] = '\n';
+       data[size + 1] = '\0';
+       pline = strtok(data, "\n");
+
+       while (pline != NULL)
+       {
+               length = strlen(pline);
+
+               if (length > 0)
+               {
+                       length = strcspn(pline, " \t");
+                       pline[length] = '\0';
+
+                       if (strcmp(pline, certificate_data->hostname) == 0)
+                       {
+                               pline = &pline[length + 1];
+
+                               if (strcmp(pline, certificate_data->fingerprint) == 0)
+                                       match = 0;
+                               else
+                                       match = -1;
+                               break;
+                       }
+               }
+
+               pline = strtok(NULL, "\n");
+       }
+       xfree(data);
+
+       return match;
+}
+
+void certificate_data_print(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data)
+{
+       FILE* fp;
+
+       /* reopen in append mode */
+       fp = fopen(certificate_store->file, "a");
+
+       if (!fp)
+               return;
+
+       fprintf(certificate_store->fp,"%s %s\n", certificate_data->hostname, certificate_data->fingerprint);
+       fclose(fp);
+}
+
+rdpCertificateData* certificate_data_new(char* hostname, char* fingerprint)
+{
+       rdpCertificateData* certdata;
+
+       certdata = (rdpCertificateData*) xzalloc(sizeof(rdpCertificateData));
+
+       if (certdata != NULL)
+       {
+               certdata->hostname = xstrdup(hostname);
+               certdata->fingerprint = xstrdup(fingerprint);
+       }
+
+       return certdata;
+}
+
+void certificate_data_free(rdpCertificateData* certificate_data)
+{
+       if (certificate_data != NULL)
+       {
+               xfree(certificate_data->hostname);
+               xfree(certificate_data->fingerprint);
+               xfree(certificate_data);
+       }
+}
+
+rdpCertificateStore* certificate_store_new(rdpSettings* settings)
+{
+       rdpCertificateStore* certificate_store;
+
+       certificate_store = (rdpCertificateStore*) xzalloc(sizeof(rdpCertificateStore));
+
+       if (certificate_store != NULL)
+       {
+               certificate_store->settings = settings;
+               certificate_store_init(certificate_store);
+       }
+
+       return certificate_store;
+}
+
+void certificate_store_free(rdpCertificateStore* certstore)
+{
+       if (certstore != NULL)
+       {
+               if (certstore->fp != NULL)
+                       fclose(certstore->fp);
+
+               xfree(certstore->path);
+               xfree(certstore->file);
+               xfree(certstore);
+       }
+}
+
+/**
+ * Instantiate new certificate module.\n
+ * @param rdp RDP module
+ * @return new certificate module
+ */
+
+rdpCertificate* certificate_new()
+{
+       rdpCertificate* certificate;
+
+       certificate = (rdpCertificate*) xzalloc(sizeof(rdpCertificate));
+
+       if (certificate != NULL)
+       {
+               certificate->x509_cert_chain = NULL;
+       }
+
+       return certificate;
+}
+
+/**
+ * Free certificate module.
+ * @param certificate certificate module to be freed
+ */
+
+void certificate_free(rdpCertificate* certificate)
+{
+       if (certificate != NULL)
+       {
+               certificate_free_x509_certificate_chain(certificate->x509_cert_chain);
+
+               if (certificate->cert_info.modulus.data != NULL)
+                       freerdp_blob_free(&(certificate->cert_info.modulus));
+
+               xfree(certificate);
+       }
+}
diff --git a/libfreerdp-core/certificate.h b/libfreerdp-core/certificate.h
new file mode 100644 (file)
index 0000000..2451dd4
--- /dev/null
@@ -0,0 +1,98 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Certificate Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CERTIFICATE_H
+#define __CERTIFICATE_H
+
+typedef struct rdp_certificate_data rdpCertificateData;
+typedef struct rdp_certificate_store rdpCertificateStore;
+
+#include "rdp.h"
+#include "ber.h"
+#include "crypto.h"
+
+#include <freerdp/settings.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/hexdump.h>
+
+/* Certificate Version */
+#define CERT_CHAIN_VERSION_1           0x00000001
+#define CERT_CHAIN_VERSION_2           0x00000002
+#define CERT_CHAIN_VERSION_MASK                0x7FFFFFFF
+#define CERT_PERMANENTLY_ISSUED                0x00000000
+#define CERT_TEMPORARILY_ISSUED                0x80000000
+
+#define SIGNATURE_ALG_RSA              0x00000001
+#define KEY_EXCHANGE_ALG_RSA           0x00000001
+
+#define BB_RSA_KEY_BLOB                        6
+#define BB_RSA_SIGNATURE_BLOB                  8
+
+struct rdp_key
+{
+       rdpBlob modulus;
+       rdpBlob private_exponent;
+       uint8 exponent[4];
+};
+
+struct rdp_certificate_data
+{
+       char* hostname;
+       char* fingerprint;
+};
+
+struct rdp_certificate_store
+{
+       FILE* fp;
+       char* path;
+       char* file;
+       rdpSettings* settings;
+       rdpCertificateData* certificate_data;
+};
+
+rdpCertificateData* certificate_data_new(char* hostname, char* fingerprint);
+void certificate_data_free(rdpCertificateData* certificate_data);
+rdpCertificateStore* certificate_store_new(rdpSettings* settings);
+void certificate_store_free(rdpCertificateStore* certificate_store);
+int certificate_data_match(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data);
+void certificate_data_print(rdpCertificateStore* certificate_store, rdpCertificateData* certificate_data);
+
+void certificate_read_x509_certificate(rdpCertBlob* cert, rdpCertInfo* info);
+
+rdpX509CertChain* certificate_new_x509_certificate_chain(uint32 count);
+void certificate_free_x509_certificate_chain(rdpX509CertChain* x509_cert_chain);
+
+boolean certificate_read_server_proprietary_certificate(rdpCertificate* certificate, STREAM* s);
+boolean certificate_read_server_x509_certificate_chain(rdpCertificate* certificate, STREAM* s);
+boolean certificate_read_server_certificate(rdpCertificate* certificate, uint8* server_cert, int length);
+
+rdpCertificate* certificate_new();
+void certificate_free(rdpCertificate* certificate);
+
+rdpKey* key_new(const char *keyfile);
+void key_free(rdpKey* key);
+
+#ifdef WITH_DEBUG_CERTIFICATE
+#define DEBUG_CERTIFICATE(fmt, ...) DEBUG_CLASS(CERTIFICATE, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_CERTIFICATE(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __CERTIFICATE_H */
diff --git a/libfreerdp-core/channel.c b/libfreerdp-core/channel.c
new file mode 100644 (file)
index 0000000..e92a0a8
--- /dev/null
@@ -0,0 +1,116 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Virtual Channels
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/peer.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+
+#include "rdp.h"
+#include "channel.h"
+
+boolean freerdp_channel_send(rdpRdp* rdp, uint16 channel_id, uint8* data, int size)
+{
+       STREAM* s;
+       uint32 flags;
+       int i, left;
+       int chunk_size;
+       rdpChannel* channel = NULL;
+
+       for (i = 0; i < rdp->settings->num_channels; i++)
+       {
+               if (rdp->settings->channels[i].channel_id == channel_id)
+               {
+                       channel = &rdp->settings->channels[i];
+                       break;
+               }
+       }
+
+       if (channel == NULL)
+       {
+               printf("freerdp_channel_send: unknown channel_id %d\n", channel_id);
+               return false;
+       }
+
+       flags = CHANNEL_FLAG_FIRST;
+       left = size;
+       while (left > 0)
+       {
+               s = rdp_send_stream_init(rdp);
+
+               if (left > (int) rdp->settings->vc_chunk_size)
+               {
+                       chunk_size = rdp->settings->vc_chunk_size;
+               }
+               else
+               {
+                       chunk_size = left;
+                       flags |= CHANNEL_FLAG_LAST;
+               }
+               if ((channel->options & CHANNEL_OPTION_SHOW_PROTOCOL))
+               {
+                       flags |= CHANNEL_FLAG_SHOW_PROTOCOL;
+               }
+
+               stream_write_uint32(s, size);
+               stream_write_uint32(s, flags);
+               stream_check_size(s, chunk_size);
+               stream_write(s, data, chunk_size);
+
+               rdp_send(rdp, s, channel_id);
+
+               data += chunk_size;
+               left -= chunk_size;
+               flags = 0;
+       }
+
+       return true;
+}
+
+void freerdp_channel_process(freerdp* instance, STREAM* s, uint16 channel_id)
+{
+       uint32 length;
+       uint32 flags;
+       int chunk_length;
+
+       stream_read_uint32(s, length);
+       stream_read_uint32(s, flags);
+       chunk_length = stream_get_left(s);
+
+       IFCALL(instance->ReceiveChannelData, instance,
+               channel_id, stream_get_tail(s), chunk_length, flags, length);
+}
+
+void freerdp_channel_peer_process(freerdp_peer* client, STREAM* s, uint16 channel_id)
+{
+       uint32 length;
+       uint32 flags;
+       int chunk_length;
+
+       stream_read_uint32(s, length);
+       stream_read_uint32(s, flags);
+       chunk_length = stream_get_left(s);
+
+       IFCALL(client->ReceiveChannelData, client,
+               channel_id, stream_get_tail(s), chunk_length, flags, length);
+}
diff --git a/libfreerdp-core/channel.h b/libfreerdp-core/channel.h
new file mode 100644 (file)
index 0000000..3632247
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Virtual Channels
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CHANNEL_H
+#define __CHANNEL_H
+
+boolean freerdp_channel_send(rdpRdp* rdp, uint16 channel_id, uint8* data, int size);
+void freerdp_channel_process(freerdp* instance, STREAM* s, uint16 channel_id);
+void freerdp_channel_peer_process(freerdp_peer* client, STREAM* s, uint16 channel_id);
+
+#endif /* __CHANNEL_H */
diff --git a/libfreerdp-core/connection.c b/libfreerdp-core/connection.c
new file mode 100644 (file)
index 0000000..fb4fde3
--- /dev/null
@@ -0,0 +1,700 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Connection Sequence
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "per.h"
+#include "info.h"
+#include "input.h"
+
+#include "connection.h"
+
+/**
+ *                                      Connection Sequence
+ *     client                                                                    server
+ *        |                                                                         |
+ *        |-----------------------X.224 Connection Request PDU--------------------->|
+ *        |<----------------------X.224 Connection Confirm PDU----------------------|
+ *        |-------MCS Connect-Initial PDU with GCC Conference Create Request------->|
+ *        |<-----MCS Connect-Response PDU with GCC Conference Create Response-------|
+ *        |------------------------MCS Erect Domain Request PDU-------------------->|
+ *        |------------------------MCS Attach User Request PDU--------------------->|
+ *        |<-----------------------MCS Attach User Confirm PDU----------------------|
+ *        |------------------------MCS Channel Join Request PDU-------------------->|
+ *        |<-----------------------MCS Channel Join Confirm PDU---------------------|
+ *        |----------------------------Security Exchange PDU----------------------->|
+ *        |-------------------------------Client Info PDU-------------------------->|
+ *        |<---------------------License Error PDU - Valid Client-------------------|
+ *        |<-----------------------------Demand Active PDU--------------------------|
+ *        |------------------------------Confirm Active PDU------------------------>|
+ *        |-------------------------------Synchronize PDU-------------------------->|
+ *        |---------------------------Control PDU - Cooperate---------------------->|
+ *        |------------------------Control PDU - Request Control------------------->|
+ *        |--------------------------Persistent Key List PDU(s)-------------------->|
+ *        |--------------------------------Font List PDU--------------------------->|
+ *        |<------------------------------Synchronize PDU---------------------------|
+ *        |<--------------------------Control PDU - Cooperate-----------------------|
+ *        |<-----------------------Control PDU - Granted Control--------------------|
+ *        |<-------------------------------Font Map PDU-----------------------------|
+ *
+ */
+
+/**
+ * Establish RDP Connection.\n
+ * @msdn{cc240452}
+ * @param rdp RDP module
+ */
+
+boolean rdp_client_connect(rdpRdp* rdp)
+{
+       boolean status;
+       uint32 selectedProtocol;
+       rdpSettings* settings = rdp->settings;
+
+       nego_init(rdp->nego);
+       nego_set_target(rdp->nego, settings->hostname, settings->port);
+       nego_set_cookie(rdp->nego, settings->username);
+       nego_enable_rdp(rdp->nego, settings->rdp_security);
+       nego_enable_nla(rdp->nego, settings->nla_security);
+       nego_enable_tls(rdp->nego, settings->tls_security);
+
+       if (nego_connect(rdp->nego) != true)
+       {
+               printf("Error: protocol security negotiation failure\n");
+               return false;
+       }
+
+       selectedProtocol = rdp->nego->selected_protocol;
+
+       if ((selectedProtocol & PROTOCOL_TLS) || (selectedProtocol == PROTOCOL_RDP))
+       {
+               if ((settings->username != NULL) && ((settings->password != NULL) || (settings->password_cookie != NULL && settings->password_cookie->length > 0)))
+                       settings->autologon = true;
+       }
+
+       status = false;
+       if (selectedProtocol & PROTOCOL_NLA)
+               status = transport_connect_nla(rdp->transport);
+       else if (selectedProtocol & PROTOCOL_TLS)
+               status = transport_connect_tls(rdp->transport);
+       else if (selectedProtocol == PROTOCOL_RDP) /* 0 */
+               status = transport_connect_rdp(rdp->transport);
+
+       if (status != true)
+               return false;
+
+       rdp_set_blocking_mode(rdp, false);
+       rdp->state = CONNECTION_STATE_NEGO;
+       rdp->finalize_sc_pdus = 0;
+
+       if (mcs_send_connect_initial(rdp->mcs) != true)
+       {
+               printf("Error: unable to send MCS Connect Initial\n");
+               return false;
+       }
+
+       while (rdp->state != CONNECTION_STATE_ACTIVE)
+       {
+               if (rdp_check_fds(rdp) < 0)
+                       return false;
+       }
+
+       return true;
+}
+
+boolean rdp_client_disconnect(rdpRdp* rdp)
+{
+       return transport_disconnect(rdp->transport);
+}
+
+boolean rdp_client_redirect(rdpRdp* rdp)
+{
+       rdpSettings* settings = rdp->settings;
+       rdpRedirection* redirection = rdp->redirection;
+
+       rdp_client_disconnect(rdp);
+
+       mcs_free(rdp->mcs);
+       nego_free(rdp->nego);
+       license_free(rdp->license);
+       transport_free(rdp->transport);
+       rdp->transport = transport_new(settings);
+       rdp->license = license_new(rdp);
+       rdp->nego = nego_new(rdp->transport);
+       rdp->mcs = mcs_new(rdp->transport);
+
+       rdp->transport->layer = TRANSPORT_LAYER_TCP;
+       settings->redirected_session_id = redirection->sessionID;
+
+       if (redirection->flags & LB_LOAD_BALANCE_INFO)
+       {
+               nego_set_routing_token(rdp->nego, &redirection->loadBalanceInfo);
+       }
+       else
+       {
+               if (redirection->flags & LB_TARGET_NET_ADDRESS)
+               {
+                       xfree(settings->hostname);
+                       settings->hostname = xstrdup(redirection->targetNetAddress.ascii);
+               }
+               else if (redirection->flags & LB_TARGET_FQDN)
+               {
+                       xfree(settings->hostname);
+                       settings->hostname = xstrdup(redirection->targetFQDN.ascii);
+               }
+               else if (redirection->flags & LB_TARGET_NETBIOS_NAME)
+               {
+                       xfree(settings->hostname);
+                       settings->hostname = xstrdup(redirection->targetNetBiosName.ascii);
+               }
+       }
+
+       if (redirection->flags & LB_USERNAME)
+       {
+               xfree(settings->username);
+               settings->username = xstrdup(redirection->username.ascii);
+       }
+
+       if (redirection->flags & LB_DOMAIN)
+       {
+               xfree(settings->domain);
+               settings->domain = xstrdup(redirection->domain.ascii);
+       }
+
+       if (redirection->flags & LB_PASSWORD)
+       {
+               settings->password_cookie = &redirection->password_cookie;
+       }
+
+       return rdp_client_connect(rdp);
+}
+
+static boolean rdp_client_establish_keys(rdpRdp* rdp)
+{
+       uint8 client_random[CLIENT_RANDOM_LENGTH];
+       uint8 crypt_client_random[256 + 8];
+       uint32 key_len;
+       uint8* mod;
+       uint8* exp;
+       uint32 length;
+       STREAM* s;
+
+       if (rdp->settings->encryption == false)
+       {
+               /* no RDP encryption */
+               return true;
+       }
+
+       /* encrypt client random */
+       memset(crypt_client_random, 0, sizeof(crypt_client_random));
+       crypto_nonce(client_random, sizeof(client_random));
+       key_len = rdp->settings->server_cert->cert_info.modulus.length;
+       mod = rdp->settings->server_cert->cert_info.modulus.data;
+       exp = rdp->settings->server_cert->cert_info.exponent;
+       crypto_rsa_public_encrypt(client_random, sizeof(client_random), key_len, mod, exp, crypt_client_random);
+
+       /* send crypt client random to server */
+       length = RDP_PACKET_HEADER_MAX_LENGTH + RDP_SECURITY_HEADER_LENGTH + 4 + key_len + 8;
+       s = transport_send_stream_init(rdp->mcs->transport, length);
+       rdp_write_header(rdp, s, length, MCS_GLOBAL_CHANNEL_ID);
+       rdp_write_security_header(s, SEC_EXCHANGE_PKT);
+       length = key_len + 8;
+       stream_write_uint32(s, length);
+       stream_write(s, crypt_client_random, length);
+       if (transport_write(rdp->mcs->transport, s) < 0)
+       {
+               return false;
+       }
+
+       /* now calculate encrypt / decrypt and update keys */
+       if (!security_establish_keys(client_random, rdp))
+       {
+               return false;
+       }
+
+       rdp->do_crypt = true;
+       if (rdp->settings->secure_checksum)
+               rdp->do_secure_checksum = true;
+
+       if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+       {
+               uint8 fips_ivec[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
+               rdp->fips_encrypt = crypto_des3_encrypt_init(rdp->fips_encrypt_key, fips_ivec);
+               rdp->fips_decrypt = crypto_des3_decrypt_init(rdp->fips_decrypt_key, fips_ivec);
+
+               rdp->fips_hmac = crypto_hmac_new();
+               return true;
+       }
+
+       rdp->rc4_decrypt_key = crypto_rc4_init(rdp->decrypt_key, rdp->rc4_key_len);
+       rdp->rc4_encrypt_key = crypto_rc4_init(rdp->encrypt_key, rdp->rc4_key_len);
+
+       return true;
+}
+
+static boolean rdp_server_establish_keys(rdpRdp* rdp, STREAM* s)
+{
+       uint8 client_random[64]; /* Should be only 32 after successfull decryption, but on failure might take up to 64 bytes. */
+       uint8 crypt_client_random[256 + 8];
+       uint32 rand_len, key_len;
+       uint16 channel_id, length, sec_flags;
+       uint8* mod;
+       uint8* priv_exp;
+
+       if (rdp->settings->encryption == false)
+       {
+               /* No RDP Security. */
+               return true;
+       }
+
+       if (!rdp_read_header(rdp, s, &length, &channel_id))
+       {
+               printf("rdp_server_establish_keys: invalid RDP header\n");
+               return false;
+       }
+       rdp_read_security_header(s, &sec_flags);
+       if ((sec_flags & SEC_EXCHANGE_PKT) == 0)
+       {
+               printf("rdp_server_establish_keys: missing SEC_EXCHANGE_PKT in security header\n");
+               return false;
+       }
+       stream_read_uint32(s, rand_len);
+       key_len = rdp->settings->server_key->modulus.length;
+       if (rand_len != key_len + 8)
+       {
+               printf("rdp_server_establish_keys: invalid encrypted client random length\n");
+               return false;
+       }
+       memset(crypt_client_random, 0, sizeof(crypt_client_random));
+       stream_read(s, crypt_client_random, rand_len);
+       /* 8 zero bytes of padding */
+       stream_seek(s, 8);
+       mod = rdp->settings->server_key->modulus.data;
+       priv_exp = rdp->settings->server_key->private_exponent.data;
+       crypto_rsa_private_decrypt(crypt_client_random, rand_len - 8, key_len, mod, priv_exp, client_random);
+
+       /* now calculate encrypt / decrypt and update keys */
+       if (!security_establish_keys(client_random, rdp))
+       {
+               return false;
+       }
+
+       rdp->do_crypt = true;
+       if (rdp->settings->secure_checksum)
+               rdp->do_secure_checksum = true;
+
+       if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+       {
+               uint8 fips_ivec[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
+               rdp->fips_encrypt = crypto_des3_encrypt_init(rdp->fips_encrypt_key, fips_ivec);
+               rdp->fips_decrypt = crypto_des3_decrypt_init(rdp->fips_decrypt_key, fips_ivec);
+
+               rdp->fips_hmac = crypto_hmac_new();
+               return true;
+       }
+
+       rdp->rc4_decrypt_key = crypto_rc4_init(rdp->decrypt_key, rdp->rc4_key_len);
+       rdp->rc4_encrypt_key = crypto_rc4_init(rdp->encrypt_key, rdp->rc4_key_len);
+
+       return true;
+}
+
+boolean rdp_client_connect_mcs_connect_response(rdpRdp* rdp, STREAM* s)
+{
+       if (!mcs_recv_connect_response(rdp->mcs, s))
+       {
+               printf("rdp_client_connect_mcs_connect_response: mcs_recv_connect_response failed\n");
+               return false;
+       }
+       if (!mcs_send_erect_domain_request(rdp->mcs))
+               return false;
+       if (!mcs_send_attach_user_request(rdp->mcs))
+               return false;
+
+       rdp->state = CONNECTION_STATE_MCS_ATTACH_USER;
+
+       return true;
+}
+
+boolean rdp_client_connect_mcs_attach_user_confirm(rdpRdp* rdp, STREAM* s)
+{
+       if (!mcs_recv_attach_user_confirm(rdp->mcs, s))
+               return false;
+
+       if (!mcs_send_channel_join_request(rdp->mcs, rdp->mcs->user_id))
+               return false;
+
+       rdp->state = CONNECTION_STATE_MCS_CHANNEL_JOIN;
+
+       return true;
+}
+
+boolean rdp_client_connect_mcs_channel_join_confirm(rdpRdp* rdp, STREAM* s)
+{
+       int i;
+       uint16 channel_id;
+       boolean all_joined = true;
+
+       if (!mcs_recv_channel_join_confirm(rdp->mcs, s, &channel_id))
+               return false;
+
+       if (!rdp->mcs->user_channel_joined)
+       {
+               if (channel_id != rdp->mcs->user_id)
+                       return false;
+               rdp->mcs->user_channel_joined = true;
+
+               if (!mcs_send_channel_join_request(rdp->mcs, MCS_GLOBAL_CHANNEL_ID))
+                       return false;
+       }
+       else if (!rdp->mcs->global_channel_joined)
+       {
+               if (channel_id != MCS_GLOBAL_CHANNEL_ID)
+                       return false;
+               rdp->mcs->global_channel_joined = true;
+
+               if (rdp->settings->num_channels > 0)
+               {
+                       if (!mcs_send_channel_join_request(rdp->mcs, rdp->settings->channels[0].channel_id))
+                               return false;
+
+                       all_joined = false;
+               }
+       }
+       else
+       {
+               for (i = 0; i < rdp->settings->num_channels; i++)
+               {
+                       if (rdp->settings->channels[i].joined)
+                               continue;
+
+                       if (rdp->settings->channels[i].channel_id != channel_id)
+                               return false;
+
+                       rdp->settings->channels[i].joined = true;
+                       break;
+               }
+               if (i + 1 < rdp->settings->num_channels)
+               {
+                       if (!mcs_send_channel_join_request(rdp->mcs, rdp->settings->channels[i + 1].channel_id))
+                               return false;
+
+                       all_joined = false;
+               }
+       }
+
+       if (rdp->mcs->user_channel_joined && rdp->mcs->global_channel_joined && all_joined)
+       {
+               if (!rdp_client_establish_keys(rdp))
+                       return false;
+               if (!rdp_send_client_info(rdp))
+                       return false;
+               rdp->state = CONNECTION_STATE_LICENSE;
+       }
+
+       return true;
+}
+
+boolean rdp_client_connect_license(rdpRdp* rdp, STREAM* s)
+{
+       if (!license_recv(rdp->license, s))
+               return false;
+
+       if (rdp->license->state == LICENSE_STATE_ABORTED)
+       {
+               printf("license connection sequence aborted.\n");
+               return false;
+       }
+
+       if (rdp->license->state == LICENSE_STATE_COMPLETED)
+       {
+               rdp->state = CONNECTION_STATE_CAPABILITY;
+       }
+
+       return true;
+}
+
+boolean rdp_client_connect_demand_active(rdpRdp* rdp, STREAM* s)
+{
+       uint8* mark;
+       uint16 width;
+       uint16 height;
+
+       width = rdp->settings->width;
+       height = rdp->settings->height;
+
+       stream_get_mark(s, mark);
+
+       if (!rdp_recv_demand_active(rdp, s))
+       {
+               stream_set_mark(s, mark);
+               stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
+
+               if (rdp_recv_out_of_sequence_pdu(rdp, s) != true)
+                       return false;
+
+               return true;
+       }
+
+       if (rdp->disconnect)
+               return true;
+
+       if (!rdp_send_confirm_active(rdp))
+               return false;
+
+       input_register_client_callbacks(rdp->input);
+
+       /**
+        * The server may request a different desktop size during Deactivation-Reactivation sequence.
+        * In this case, the UI should be informed and do actual window resizing at this point.
+        */
+       if (width != rdp->settings->width || height != rdp->settings->height)
+       {
+               IFCALL(rdp->update->DesktopResize, rdp->update->context);
+       }
+
+       rdp->state = CONNECTION_STATE_FINALIZATION;
+       update_reset_state(rdp->update);
+
+       rdp_client_connect_finalize(rdp);
+
+       return true;
+}
+
+boolean rdp_client_connect_finalize(rdpRdp* rdp)
+{
+       /**
+        * [MS-RDPBCGR] 1.3.1.1 - 8.
+        * The client-to-server PDUs sent during this phase have no dependencies on any of the server-to-
+        * client PDUs; they may be sent as a single batch, provided that sequencing is maintained.
+        */
+
+       if (!rdp_send_client_synchronize_pdu(rdp))
+               return false;
+       if (!rdp_send_client_control_pdu(rdp, CTRLACTION_COOPERATE))
+               return false;
+       if (!rdp_send_client_control_pdu(rdp, CTRLACTION_REQUEST_CONTROL))
+               return false;
+
+       rdp->input->SynchronizeEvent(rdp->input, 0);
+
+       if (!rdp_send_client_persistent_key_list_pdu(rdp))
+               return false;
+       if (!rdp_send_client_font_list_pdu(rdp, FONTLIST_FIRST | FONTLIST_LAST))
+               return false;
+
+       return true;
+}
+
+boolean rdp_server_accept_nego(rdpRdp* rdp, STREAM* s)
+{
+       boolean ret;
+
+       transport_set_blocking_mode(rdp->transport, true);
+
+       if (!nego_read_request(rdp->nego, s))
+               return false;
+
+       rdp->nego->selected_protocol = 0;
+
+       printf("Requested protocols:");
+       if ((rdp->nego->requested_protocols & PROTOCOL_TLS))
+       {
+               printf(" TLS");
+               if (rdp->settings->tls_security)
+               {
+                       printf("(Y)");
+                       rdp->nego->selected_protocol |= PROTOCOL_TLS;
+               }
+               else
+                       printf("(n)");
+       }
+       if ((rdp->nego->requested_protocols & PROTOCOL_NLA))
+       {
+               printf(" NLA");
+               if (rdp->settings->nla_security)
+               {
+                       printf("(Y)");
+                       rdp->nego->selected_protocol |= PROTOCOL_NLA;
+               }
+               else
+                       printf("(n)");
+       }
+       printf(" RDP");
+       if (rdp->settings->rdp_security && rdp->nego->selected_protocol == 0)
+       {
+               printf("(Y)");
+               rdp->nego->selected_protocol = PROTOCOL_RDP;
+       }
+       else
+               printf("(n)");
+       printf("\n");
+
+       if (!nego_send_negotiation_response(rdp->nego))
+               return false;
+
+       ret = false;
+       if (rdp->nego->selected_protocol & PROTOCOL_NLA)
+               ret = transport_accept_nla(rdp->transport);
+       else if (rdp->nego->selected_protocol & PROTOCOL_TLS)
+               ret = transport_accept_tls(rdp->transport);
+       else if (rdp->nego->selected_protocol == PROTOCOL_RDP) /* 0 */
+               ret = transport_accept_rdp(rdp->transport);
+
+       if (!ret)
+               return false;
+
+       transport_set_blocking_mode(rdp->transport, false);
+
+       rdp->state = CONNECTION_STATE_NEGO;
+
+       return true;
+}
+
+boolean rdp_server_accept_mcs_connect_initial(rdpRdp* rdp, STREAM* s)
+{
+       int i;
+
+       if (!mcs_recv_connect_initial(rdp->mcs, s))
+               return false;
+
+       printf("Accepted client: %s\n", rdp->settings->client_hostname);
+       printf("Accepted channels:");
+       for (i = 0; i < rdp->settings->num_channels; i++)
+       {
+               printf(" %s", rdp->settings->channels[i].name);
+       }
+       printf("\n");
+
+       if (!mcs_send_connect_response(rdp->mcs))
+               return false;
+
+       rdp->state = CONNECTION_STATE_MCS_CONNECT;
+
+       return true;
+}
+
+boolean rdp_server_accept_mcs_erect_domain_request(rdpRdp* rdp, STREAM* s)
+{
+       if (!mcs_recv_erect_domain_request(rdp->mcs, s))
+               return false;
+
+       rdp->state = CONNECTION_STATE_MCS_ERECT_DOMAIN;
+
+       return true;
+}
+
+boolean rdp_server_accept_mcs_attach_user_request(rdpRdp* rdp, STREAM* s)
+{
+       if (!mcs_recv_attach_user_request(rdp->mcs, s))
+               return false;
+
+       if (!mcs_send_attach_user_confirm(rdp->mcs))
+               return false;
+
+       rdp->state = CONNECTION_STATE_MCS_ATTACH_USER;
+
+       return true;
+}
+
+boolean rdp_server_accept_mcs_channel_join_request(rdpRdp* rdp, STREAM* s)
+{
+       int i;
+       uint16 channel_id;
+       boolean all_joined = true;
+
+       if (!mcs_recv_channel_join_request(rdp->mcs, s, &channel_id))
+               return false;
+
+       if (!mcs_send_channel_join_confirm(rdp->mcs, channel_id))
+               return false;
+
+       if (channel_id == rdp->mcs->user_id)
+               rdp->mcs->user_channel_joined = true;
+       else if (channel_id == MCS_GLOBAL_CHANNEL_ID)
+               rdp->mcs->global_channel_joined = true;
+
+       for (i = 0; i < rdp->settings->num_channels; i++)
+       {
+               if (rdp->settings->channels[i].channel_id == channel_id)
+                       rdp->settings->channels[i].joined = true;
+
+               if (!rdp->settings->channels[i].joined)
+                       all_joined = false;
+       }
+
+       if (rdp->mcs->user_channel_joined && rdp->mcs->global_channel_joined && all_joined)
+               rdp->state = CONNECTION_STATE_MCS_CHANNEL_JOIN;
+
+       return true;
+}
+
+boolean rdp_server_accept_client_keys(rdpRdp* rdp, STREAM* s)
+{
+
+       if (!rdp_server_establish_keys(rdp, s))
+               return false;
+
+       rdp->state = CONNECTION_STATE_ESTABLISH_KEYS;
+
+       return true;
+}
+
+boolean rdp_server_accept_client_info(rdpRdp* rdp, STREAM* s)
+{
+
+       if (!rdp_recv_client_info(rdp, s))
+               return false;
+
+       if (!license_send_valid_client_error_packet(rdp->license))
+               return false;
+
+       rdp->state = CONNECTION_STATE_LICENSE;
+
+       return true;
+}
+
+boolean rdp_server_accept_confirm_active(rdpRdp* rdp, STREAM* s)
+{
+       if (!rdp_recv_confirm_active(rdp, s))
+               return false;
+
+       rdp->state = CONNECTION_STATE_ACTIVE;
+       update_reset_state(rdp->update);
+
+       if (!rdp_send_server_synchronize_pdu(rdp))
+               return false;
+
+       if (!rdp_send_server_control_cooperate_pdu(rdp))
+               return false;
+
+       return true;
+}
+
+boolean rdp_server_reactivate(rdpRdp* rdp)
+{
+       if (!rdp_send_deactivate_all(rdp))
+               return false;
+
+       rdp->state = CONNECTION_STATE_LICENSE;
+
+       if (!rdp_send_demand_active(rdp))
+               return false;
+
+       return true;
+}
+
diff --git a/libfreerdp-core/connection.h b/libfreerdp-core/connection.h
new file mode 100644 (file)
index 0000000..eb5c046
--- /dev/null
@@ -0,0 +1,68 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Connection Sequence
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONNECTION_H
+#define __CONNECTION_H
+
+#include "rdp.h"
+#include "tpkt.h"
+#include "tpdu.h"
+#include "nego.h"
+#include "mcs.h"
+#include "transport.h"
+#include "activation.h"
+
+#include <freerdp/settings.h>
+#include <freerdp/utils/memory.h>
+
+enum CONNECTION_STATE
+{
+       CONNECTION_STATE_INITIAL = 0,
+       CONNECTION_STATE_NEGO,
+       CONNECTION_STATE_MCS_CONNECT,
+       CONNECTION_STATE_MCS_ERECT_DOMAIN,
+       CONNECTION_STATE_MCS_ATTACH_USER,
+       CONNECTION_STATE_MCS_CHANNEL_JOIN,
+       CONNECTION_STATE_ESTABLISH_KEYS,
+       CONNECTION_STATE_LICENSE,
+       CONNECTION_STATE_CAPABILITY,
+       CONNECTION_STATE_FINALIZATION,
+       CONNECTION_STATE_ACTIVE
+};
+
+boolean rdp_client_connect(rdpRdp* rdp);
+boolean rdp_client_redirect(rdpRdp* rdp);
+boolean rdp_client_connect_mcs_connect_response(rdpRdp* rdp, STREAM* s);
+boolean rdp_client_connect_mcs_attach_user_confirm(rdpRdp* rdp, STREAM* s);
+boolean rdp_client_connect_mcs_channel_join_confirm(rdpRdp* rdp, STREAM* s);
+boolean rdp_client_connect_license(rdpRdp* rdp, STREAM* s);
+boolean rdp_client_connect_demand_active(rdpRdp* rdp, STREAM* s);
+boolean rdp_client_connect_finalize(rdpRdp* rdp);
+
+boolean rdp_server_accept_nego(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_mcs_connect_initial(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_mcs_erect_domain_request(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_mcs_attach_user_request(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_mcs_channel_join_request(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_client_keys(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_client_info(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_accept_confirm_active(rdpRdp* rdp, STREAM* s);
+boolean rdp_server_reactivate(rdpRdp* rdp);
+
+#endif /* __CONNECTION_H */
diff --git a/libfreerdp-core/credssp.c b/libfreerdp-core/credssp.c
new file mode 100644 (file)
index 0000000..e269a21
--- /dev/null
@@ -0,0 +1,670 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Credential Security Support Provider (CredSSP)
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *              http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#include <time.h>
+#include "ntlmssp.h"
+
+#include "credssp.h"
+/**
+ * TSRequest ::= SEQUENCE {
+ *     version    [0] INTEGER,
+ *     negoTokens [1] NegoData OPTIONAL,
+ *     authInfo   [2] OCTET STRING OPTIONAL,
+ *     pubKeyAuth [3] OCTET STRING OPTIONAL
+ * }
+ *
+ * NegoData ::= SEQUENCE OF NegoDataItem
+ *
+ * NegoDataItem ::= SEQUENCE {
+ *     negoToken [0] OCTET STRING
+ * }
+ *
+ * TSCredentials ::= SEQUENCE {
+ *     credType    [0] INTEGER,
+ *     credentials [1] OCTET STRING
+ * }
+ *
+ * TSPasswordCreds ::= SEQUENCE {
+ *     domainName  [0] OCTET STRING,
+ *     userName    [1] OCTET STRING,
+ *     password    [2] OCTET STRING
+ * }
+ *
+ * TSSmartCardCreds ::= SEQUENCE {
+ *     pin        [0] OCTET STRING,
+ *     cspData    [1] TSCspDataDetail,
+ *     userHint   [2] OCTET STRING OPTIONAL,
+ *     domainHint [3] OCTET STRING OPTIONAL
+ * }
+ *
+ * TSCspDataDetail ::= SEQUENCE {
+ *     keySpec       [0] INTEGER,
+ *     cardName      [1] OCTET STRING OPTIONAL,
+ *     readerName    [2] OCTET STRING OPTIONAL,
+ *     containerName [3] OCTET STRING OPTIONAL,
+ *     cspName       [4] OCTET STRING OPTIONAL
+ * }
+ *
+ */
+
+/**
+ * Initialize NTLMSSP authentication module.
+ * @param credssp
+ */
+
+int credssp_ntlmssp_init(rdpCredssp* credssp)
+{
+       freerdp* instance;
+       NTLMSSP* ntlmssp = credssp->ntlmssp;
+       rdpSettings* settings = credssp->transport->settings;
+       instance = (freerdp*) settings->instance;
+
+       if ((settings->password == NULL) || (settings->username == NULL))
+       {
+               if(instance->Authenticate)
+               {
+                       boolean proceed = instance->Authenticate(instance,
+                                       &settings->username, &settings->password, &settings->domain);
+                       if (!proceed)
+                               return 0;
+               }
+       }
+
+       if (settings->ntlm_version == 2)
+               ntlmssp->ntlm_v2 = 1;
+
+       ntlmssp_set_password(ntlmssp, settings->password);
+       ntlmssp_set_username(ntlmssp, settings->username);
+
+       if (ntlmssp->ntlm_v2)
+       {
+               ntlmssp_set_workstation(ntlmssp, "WORKSTATION");
+       }
+
+       if (settings->domain != NULL)
+       {
+               if (strlen(settings->domain) > 0)
+                       ntlmssp_set_domain(ntlmssp, settings->domain);
+       }
+       else
+       {
+               ntlmssp_set_domain(ntlmssp, NULL);
+       }
+
+       ntlmssp_generate_client_challenge(ntlmssp);
+       ntlmssp_generate_random_session_key(ntlmssp);
+       ntlmssp_generate_exported_session_key(ntlmssp);
+
+       return 1;
+}
+
+/**
+ * Get TLS public key.
+ * @param credssp
+ */
+
+int credssp_get_public_key(rdpCredssp* credssp)
+{
+       int status;
+       CryptoCert cert;
+       
+       cert = tls_get_certificate(credssp->transport->tls);
+
+       if (cert == NULL)
+       {
+               printf("credssp_get_public_key: tls_get_certificate failed to return the server certificate.\n");
+               return 0;
+       }
+
+       if (!tls_verify_certificate(credssp->transport->tls, cert, credssp->transport->settings->hostname))
+               tls_disconnect(credssp->transport->tls);
+
+       status = crypto_cert_get_public_key(cert, &credssp->public_key);
+       crypto_cert_free(cert);
+
+       return status;
+}
+
+/**
+ * Authenticate with server using CredSSP.
+ * @param credssp
+ * @return 1 if authentication is successful
+ */
+
+int credssp_authenticate(rdpCredssp* credssp)
+{
+       NTLMSSP* ntlmssp = credssp->ntlmssp;
+       STREAM* s = stream_new(0);
+       uint8* negoTokenBuffer = (uint8*) xmalloc(2048);
+
+       if (credssp_ntlmssp_init(credssp) == 0)
+               return 0;
+
+       if (credssp_get_public_key(credssp) == 0)
+               return 0;
+
+       /* NTLMSSP NEGOTIATE MESSAGE */
+       stream_attach(s, negoTokenBuffer, 2048);
+       ntlmssp_send(ntlmssp, s);
+       credssp->negoToken.data = stream_get_head(s);
+       credssp->negoToken.length = stream_get_length(s);
+       credssp_send(credssp, &credssp->negoToken, NULL, NULL);
+
+       /* NTLMSSP CHALLENGE MESSAGE */
+       if (credssp_recv(credssp, &credssp->negoToken, NULL, NULL) < 0)
+               return -1;
+
+       stream_attach(s, credssp->negoToken.data, credssp->negoToken.length);
+       ntlmssp_recv(ntlmssp, s);
+
+       freerdp_blob_free(&credssp->negoToken);
+
+       /* NTLMSSP AUTHENTICATE MESSAGE */
+       stream_attach(s, negoTokenBuffer, 2048);
+       ntlmssp_send(ntlmssp, s);
+
+       /* The last NTLMSSP message is sent with the encrypted public key */
+       credssp->negoToken.data = stream_get_head(s);
+       credssp->negoToken.length = stream_get_length(s);
+       credssp_encrypt_public_key(credssp, &credssp->pubKeyAuth);
+       credssp_send(credssp, &credssp->negoToken, NULL, &credssp->pubKeyAuth);
+       freerdp_blob_free(&credssp->pubKeyAuth);
+
+       /* Encrypted Public Key +1 */
+       if (credssp_recv(credssp, &credssp->negoToken, NULL, &credssp->pubKeyAuth) < 0)
+               return -1;
+
+       if (credssp_verify_public_key(credssp, &credssp->pubKeyAuth) == 0)
+       {
+               /* Failed to verify server public key echo */
+               return 0; /* DO NOT SEND CREDENTIALS! */
+       }
+
+       freerdp_blob_free(&credssp->negoToken);
+       freerdp_blob_free(&credssp->pubKeyAuth);
+
+       /* Send encrypted credentials */
+       credssp_encode_ts_credentials(credssp);
+       credssp_encrypt_ts_credentials(credssp, &credssp->authInfo);
+       credssp_send(credssp, NULL, &credssp->authInfo, NULL);
+       freerdp_blob_free(&credssp->authInfo);
+
+       xfree(s);
+
+       return 1;
+}
+
+/**
+ * Encrypt TLS public key using CredSSP.
+ * @param credssp
+ * @param s
+ */
+
+void credssp_encrypt_public_key(rdpCredssp* credssp, rdpBlob* d)
+{
+       uint8* p;
+       uint8 signature[16];
+       rdpBlob encrypted_public_key;
+       NTLMSSP *ntlmssp = credssp->ntlmssp;
+
+       freerdp_blob_alloc(d, credssp->public_key.length + 16);
+       ntlmssp_encrypt_message(ntlmssp, &credssp->public_key, &encrypted_public_key, signature);
+
+#ifdef WITH_DEBUG_NLA
+       printf("Public Key (length = %d)\n", credssp->public_key.length);
+       freerdp_hexdump(credssp->public_key.data, credssp->public_key.length);
+       printf("\n");
+
+       printf("Encrypted Public Key (length = %d)\n", encrypted_public_key.length);
+       freerdp_hexdump(encrypted_public_key.data, encrypted_public_key.length);
+       printf("\n");
+
+       printf("Signature\n");
+       freerdp_hexdump(signature, 16);
+       printf("\n");
+#endif
+
+       p = (uint8*) d->data;
+       memcpy(p, signature, 16); /* Message Signature */
+       memcpy(&p[16], encrypted_public_key.data, encrypted_public_key.length); /* Encrypted Public Key */
+
+       freerdp_blob_free(&encrypted_public_key);
+}
+
+/**
+ * Verify TLS public key using CredSSP.
+ * @param credssp
+ * @param s
+ * @return 1 if verification is successful, 0 otherwise
+ */
+
+int credssp_verify_public_key(rdpCredssp* credssp, rdpBlob* d)
+{
+       uint8 *p1, *p2;
+       uint8* signature;
+       rdpBlob public_key;
+       rdpBlob encrypted_public_key;
+
+       signature = d->data;
+       encrypted_public_key.data = (void*) (signature + 16);
+       encrypted_public_key.length = d->length - 16;
+
+       ntlmssp_decrypt_message(credssp->ntlmssp, &encrypted_public_key, &public_key, signature);
+
+       p1 = (uint8*) credssp->public_key.data;
+       p2 = (uint8*) public_key.data;
+
+       p2[0]--;
+
+       if (memcmp(p1, p2, public_key.length) != 0)
+       {
+               printf("Could not verify server's public key echo\n");
+               return 0;
+       }
+
+       p2[0]++;
+       freerdp_blob_free(&public_key);
+       return 1;
+}
+
+/**
+ * Encrypt and sign TSCredentials structure.
+ * @param credssp
+ * @param s
+ */
+
+void credssp_encrypt_ts_credentials(rdpCredssp* credssp, rdpBlob* d)
+{
+       uint8* p;
+       uint8 signature[16];
+       rdpBlob encrypted_ts_credentials;
+       NTLMSSP* ntlmssp = credssp->ntlmssp;
+
+       freerdp_blob_alloc(d, credssp->ts_credentials.length + 16);
+       ntlmssp_encrypt_message(ntlmssp, &credssp->ts_credentials, &encrypted_ts_credentials, signature);
+
+#ifdef WITH_DEBUG_NLA
+       printf("TSCredentials (length = %d)\n", credssp->ts_credentials.length);
+       freerdp_hexdump(credssp->ts_credentials.data, credssp->ts_credentials.length);
+       printf("\n");
+
+       printf("Encrypted TSCredentials (length = %d)\n", encrypted_ts_credentials.length);
+       freerdp_hexdump(encrypted_ts_credentials.data, encrypted_ts_credentials.length);
+       printf("\n");
+
+       printf("Signature\n");
+       freerdp_hexdump(signature, 16);
+       printf("\n");
+#endif
+
+       p = (uint8*) d->data;
+       memcpy(p, signature, 16); /* Message Signature */
+       memcpy(&p[16], encrypted_ts_credentials.data, encrypted_ts_credentials.length); /* Encrypted TSCredentials */
+
+       freerdp_blob_free(&encrypted_ts_credentials);
+}
+
+int credssp_skip_ts_password_creds(rdpCredssp* credssp)
+{
+       int length;
+       int ts_password_creds_length = 0;
+
+       length = ber_skip_octet_string(credssp->ntlmssp->domain.length);
+       length += ber_skip_contextual_tag(length);
+       ts_password_creds_length += length;
+
+       length = ber_skip_octet_string(credssp->ntlmssp->username.length);
+       length += ber_skip_contextual_tag(length);
+       ts_password_creds_length += length;
+
+       length = ber_skip_octet_string(credssp->ntlmssp->password.length);
+       length += ber_skip_contextual_tag(length);
+       ts_password_creds_length += length;
+
+       length = ber_skip_sequence(ts_password_creds_length);
+
+       return length;
+}
+
+void credssp_write_ts_password_creds(rdpCredssp* credssp, STREAM* s)
+{
+       int length;
+
+       length = credssp_skip_ts_password_creds(credssp);
+
+       /* TSPasswordCreds (SEQUENCE) */
+       length = ber_get_content_length(length);
+       ber_write_sequence_tag(s, length);
+
+       /* [0] domainName (OCTET STRING) */
+       ber_write_contextual_tag(s, 0, credssp->ntlmssp->domain.length + 2, true);
+       ber_write_octet_string(s, credssp->ntlmssp->domain.data, credssp->ntlmssp->domain.length);
+
+       /* [1] userName (OCTET STRING) */
+       ber_write_contextual_tag(s, 1, credssp->ntlmssp->username.length + 2, true);
+       ber_write_octet_string(s, credssp->ntlmssp->username.data, credssp->ntlmssp->username.length);
+
+       /* [2] password (OCTET STRING) */
+       ber_write_contextual_tag(s, 2, credssp->ntlmssp->password.length + 2, true);
+       ber_write_octet_string(s, credssp->ntlmssp->password.data, credssp->ntlmssp->password.length);
+}
+
+int credssp_skip_ts_credentials(rdpCredssp* credssp)
+{
+       int length;
+       int ts_password_creds_length;
+       int ts_credentials_length = 0;
+
+       length = ber_skip_integer(0);
+       length += ber_skip_contextual_tag(length);
+       ts_credentials_length += length;
+
+       ts_password_creds_length = credssp_skip_ts_password_creds(credssp);
+       length = ber_skip_octet_string(ts_password_creds_length);
+       length += ber_skip_contextual_tag(length);
+       ts_credentials_length += length;
+
+       length = ber_skip_sequence(ts_credentials_length);
+
+       return length;
+}
+
+void credssp_write_ts_credentials(rdpCredssp* credssp, STREAM* s)
+{
+       int length;
+       int ts_password_creds_length;
+
+       length = credssp_skip_ts_credentials(credssp);
+       ts_password_creds_length = credssp_skip_ts_password_creds(credssp);
+
+       /* TSCredentials (SEQUENCE) */
+       length = ber_get_content_length(length);
+       length -= ber_write_sequence_tag(s, length);
+
+       /* [0] credType (INTEGER) */
+       length -= ber_write_contextual_tag(s, 0, 3, true);
+       length -= ber_write_integer(s, 1);
+
+       /* [1] credentials (OCTET STRING) */
+       length -= 1;
+       length -= ber_write_contextual_tag(s, 1, length, true);
+       length -= ber_write_octet_string_tag(s, ts_password_creds_length);
+
+       credssp_write_ts_password_creds(credssp, s);
+}
+
+/**
+ * Encode TSCredentials structure.
+ * @param credssp
+ */
+
+void credssp_encode_ts_credentials(rdpCredssp* credssp)
+{
+       STREAM* s;
+       int length;
+
+       s = stream_new(0);
+       length = credssp_skip_ts_credentials(credssp);
+       freerdp_blob_alloc(&credssp->ts_credentials, length);
+       stream_attach(s, credssp->ts_credentials.data, length);
+
+       credssp_write_ts_credentials(credssp, s);
+       stream_detach(s);
+       stream_free(s);
+}
+
+int credssp_skip_nego_token(int length)
+{
+       length = ber_skip_octet_string(length);
+       length += ber_skip_contextual_tag(length);
+       return length;
+}
+
+int credssp_skip_nego_tokens(int length)
+{
+       length = credssp_skip_nego_token(length);
+       length += ber_skip_sequence_tag(length);
+       length += ber_skip_sequence_tag(length);
+       length += ber_skip_contextual_tag(length);
+       return length;
+}
+
+int credssp_skip_pub_key_auth(int length)
+{
+       length = ber_skip_octet_string(length);
+       length += ber_skip_contextual_tag(length);
+       return length;
+}
+
+int credssp_skip_auth_info(int length)
+{
+       length = ber_skip_octet_string(length);
+       length += ber_skip_contextual_tag(length);
+       return length;
+}
+
+int credssp_skip_ts_request(int length)
+{
+       length += ber_skip_integer(2);
+       length += ber_skip_contextual_tag(3);
+       length += ber_skip_sequence_tag(length);
+       return length;
+}
+
+/**
+ * Send CredSSP message.
+ * @param credssp
+ * @param negoToken
+ * @param authInfo
+ * @param pubKeyAuth
+ */
+
+void credssp_send(rdpCredssp* credssp, rdpBlob* negoToken, rdpBlob* authInfo, rdpBlob* pubKeyAuth)
+{
+       STREAM* s;
+       int length;
+       int ts_request_length;
+       int nego_tokens_length;
+       int pub_key_auth_length;
+       int auth_info_length;
+
+       nego_tokens_length = (negoToken != NULL) ? credssp_skip_nego_tokens(negoToken->length) : 0;
+       pub_key_auth_length = (pubKeyAuth != NULL) ? credssp_skip_pub_key_auth(pubKeyAuth->length) : 0;
+       auth_info_length = (authInfo != NULL) ? credssp_skip_auth_info(authInfo->length) : 0;
+
+       length = nego_tokens_length + pub_key_auth_length + auth_info_length;
+       ts_request_length = credssp_skip_ts_request(length);
+
+       s = stream_new(ts_request_length);
+
+       /* TSRequest */
+       length = ber_get_content_length(ts_request_length);
+       ber_write_sequence_tag(s, length); /* SEQUENCE */
+       ber_write_contextual_tag(s, 0, 3, true); /* [0] version */
+       ber_write_integer(s, 2); /* INTEGER */
+
+       /* [1] negoTokens (NegoData) */
+       if (nego_tokens_length > 0)
+       {
+               length = ber_get_content_length(nego_tokens_length);
+               length -= ber_write_contextual_tag(s, 1, length, true); /* NegoData */
+               length -= ber_write_sequence_tag(s, length); /* SEQUENCE OF NegoDataItem */
+               length -= ber_write_sequence_tag(s, length); /* NegoDataItem */
+               length -= ber_write_contextual_tag(s, 0, length, true); /* [0] negoToken */
+               ber_write_octet_string(s, negoToken->data, length); /* OCTET STRING */
+       }
+
+       /* [2] authInfo (OCTET STRING) */
+       if (auth_info_length > 0)
+       {
+               length = ber_get_content_length(auth_info_length);
+               length -= ber_write_contextual_tag(s, 2, length, true);
+               ber_write_octet_string(s, authInfo->data, authInfo->length);
+       }
+
+       /* [3] pubKeyAuth (OCTET STRING) */
+       if (pub_key_auth_length > 0)
+       {
+               length = ber_get_content_length(pub_key_auth_length);
+               length -= ber_write_contextual_tag(s, 3, length, true);
+               ber_write_octet_string(s, pubKeyAuth->data, length);
+       }
+
+       transport_write(credssp->transport, s);
+       stream_free(s);
+}
+
+/**
+ * Receive CredSSP message.
+ * @param credssp
+ * @param negoToken
+ * @param authInfo
+ * @param pubKeyAuth
+ * @return
+ */
+
+int credssp_recv(rdpCredssp* credssp, rdpBlob* negoToken, rdpBlob* authInfo, rdpBlob* pubKeyAuth)
+{
+       STREAM* s;
+       int length;
+       int status;
+       uint32 version;
+
+       s = transport_recv_stream_init(credssp->transport, 2048);
+       status = transport_read(credssp->transport, s);
+
+       if (status < 0)
+               return -1;
+
+       /* TSRequest */
+       ber_read_sequence_tag(s, &length);
+       ber_read_contextual_tag(s, 0, &length, true);
+       ber_read_integer(s, &version);
+
+       /* [1] negoTokens (NegoData) */
+       if (ber_read_contextual_tag(s, 1, &length, true) != false)
+       {
+               ber_read_sequence_tag(s, &length); /* SEQUENCE OF NegoDataItem */
+               ber_read_sequence_tag(s, &length); /* NegoDataItem */
+               ber_read_contextual_tag(s, 0, &length, true); /* [0] negoToken */
+               ber_read_octet_string(s, &length); /* OCTET STRING */
+               freerdp_blob_alloc(negoToken, length);
+               stream_read(s, negoToken->data, length);
+       }
+
+       /* [2] authInfo (OCTET STRING) */
+       if (ber_read_contextual_tag(s, 2, &length, true) != false)
+       {
+               ber_read_octet_string(s, &length); /* OCTET STRING */
+               freerdp_blob_alloc(authInfo, length);
+               stream_read(s, authInfo->data, length);
+       }
+
+       /* [3] pubKeyAuth (OCTET STRING) */
+       if (ber_read_contextual_tag(s, 3, &length, true) != false)
+       {
+               ber_read_octet_string(s, &length); /* OCTET STRING */
+               freerdp_blob_alloc(pubKeyAuth, length);
+               stream_read(s, pubKeyAuth->data, length);
+       }
+
+       return 0;
+}
+
+/**
+ * Encrypt the given plain text using RC4 and the given key.
+ * @param key RC4 key
+ * @param length text length
+ * @param plaintext plain text
+ * @param ciphertext cipher text
+ */
+
+void credssp_rc4k(uint8* key, int length, uint8* plaintext, uint8* ciphertext)
+{
+       CryptoRc4 rc4;
+
+       /* Initialize RC4 cipher with key */
+       rc4 = crypto_rc4_init((void*) key, 16);
+
+       /* Encrypt plaintext with key */
+       crypto_rc4(rc4, length, (void*) plaintext, (void*) ciphertext);
+
+       /* Free RC4 Cipher */
+       crypto_rc4_free(rc4);
+}
+
+/**
+ * Get current time, in tenths of microseconds since midnight of January 1, 1601.
+ * @param[out] timestamp 64-bit little-endian timestamp
+ */
+
+void credssp_current_time(uint8* timestamp)
+{
+       uint64 time64;
+
+       /* Timestamp (8 bytes), represented as the number of tenths of microseconds since midnight of January 1, 1601 */
+       time64 = time(NULL) + 11644473600LL; /* Seconds since January 1, 1601 */
+       time64 *= 10000000; /* Convert timestamp to tenths of a microsecond */
+
+       memcpy(timestamp, &time64, 8); /* Copy into timestamp in little-endian */
+}
+
+/**
+ * Create new CredSSP state machine.
+ * @param transport
+ * @return new CredSSP state machine.
+ */
+
+rdpCredssp* credssp_new(rdpTransport* transport)
+{
+       rdpCredssp* self;
+
+       self = (rdpCredssp*) xzalloc(sizeof(rdpCredssp));
+
+       if (self != NULL)
+       {
+               self->transport = transport;
+               self->send_seq_num = 0;
+               self->ntlmssp = ntlmssp_new();
+               self->settings = transport->settings;
+       }
+
+       return self;
+}
+
+/**
+ * Free CredSSP state machine.
+ * @param credssp
+ */
+
+void credssp_free(rdpCredssp* credssp)
+{
+       if (credssp != NULL)
+       {
+               freerdp_blob_free(&credssp->public_key);
+               freerdp_blob_free(&credssp->ts_credentials);
+
+               ntlmssp_free(credssp->ntlmssp);
+               xfree(credssp);
+       }
+}
diff --git a/libfreerdp-core/credssp.h b/libfreerdp-core/credssp.h
new file mode 100644 (file)
index 0000000..3277425
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Credential Security Support Provider (CredSSP)
+ *
+ * Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CREDSSP_H
+#define __CREDSSP_H
+
+typedef struct rdp_credssp rdpCredssp;
+
+#include "tls.h"
+#include "ber.h"
+#include "crypto.h"
+#include "transport.h"
+#include <freerdp/settings.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/hexdump.h>
+
+#include "ntlmssp.h"
+
+struct rdp_credssp
+{
+       rdpBlob negoToken;
+       rdpBlob pubKeyAuth;
+       rdpBlob authInfo;
+       int send_seq_num;
+       rdpBlob public_key;
+       rdpBlob ts_credentials;
+       rdpSettings* settings;
+       CryptoRc4 rc4_seal_state;
+       struct _NTLMSSP *ntlmssp;
+       struct rdp_transport* transport;
+};
+
+int credssp_authenticate(rdpCredssp* credssp);
+
+void credssp_send(rdpCredssp* credssp, rdpBlob* negoToken, rdpBlob* authInfo, rdpBlob* pubKeyAuth);
+int credssp_recv(rdpCredssp* credssp, rdpBlob* negoToken, rdpBlob* authInfo, rdpBlob* pubKeyAuth);
+
+void credssp_encrypt_public_key(rdpCredssp* credssp, rdpBlob* d);
+void credssp_encrypt_ts_credentials(rdpCredssp* credssp, rdpBlob* d);
+int credssp_verify_public_key(rdpCredssp* credssp, rdpBlob* d);
+void credssp_encode_ts_credentials(rdpCredssp* credssp);
+
+void credssp_current_time(uint8* timestamp);
+void credssp_rc4k(uint8* key, int length, uint8* plaintext, uint8* ciphertext);
+
+rdpCredssp* credssp_new(rdpTransport* transport);
+void credssp_free(rdpCredssp* credssp);
+
+#endif /* __CREDSSP_H */
diff --git a/libfreerdp-core/crypto.c b/libfreerdp-core/crypto.c
new file mode 100644 (file)
index 0000000..2d24da5
--- /dev/null
@@ -0,0 +1,541 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Cryptographic Abstraction Layer
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "crypto.h"
+
+CryptoSha1 crypto_sha1_init(void)
+{
+       CryptoSha1 sha1 = xmalloc(sizeof(*sha1));
+       SHA1_Init(&sha1->sha_ctx);
+       return sha1;
+}
+
+void crypto_sha1_update(CryptoSha1 sha1, const uint8* data, uint32 length)
+{
+       SHA1_Update(&sha1->sha_ctx, data, length);
+}
+
+void crypto_sha1_final(CryptoSha1 sha1, uint8* out_data)
+{
+       SHA1_Final(out_data, &sha1->sha_ctx);
+       xfree(sha1);
+}
+
+CryptoMd5 crypto_md5_init(void)
+{
+       CryptoMd5 md5 = xmalloc(sizeof(*md5));
+       MD5_Init(&md5->md5_ctx);
+       return md5;
+}
+
+void crypto_md5_update(CryptoMd5 md5, const uint8* data, uint32 length)
+{
+       MD5_Update(&md5->md5_ctx, data, length);
+}
+
+void crypto_md5_final(CryptoMd5 md5, uint8* out_data)
+{
+       MD5_Final(out_data, &md5->md5_ctx);
+       xfree(md5);
+}
+
+CryptoRc4 crypto_rc4_init(const uint8* key, uint32 length)
+{
+       CryptoRc4 rc4 = xmalloc(sizeof(*rc4));
+       RC4_set_key(&rc4->rc4_key, length, key);
+       return rc4;
+}
+
+void crypto_rc4(CryptoRc4 rc4, uint32 length, const uint8* in_data, uint8* out_data)
+{
+       RC4(&rc4->rc4_key, length, in_data, out_data);
+}
+
+void crypto_rc4_free(CryptoRc4 rc4)
+{
+       xfree(rc4);
+}
+
+CryptoDes3 crypto_des3_encrypt_init(const uint8* key, const uint8* ivec)
+{
+       CryptoDes3 des3 = xmalloc(sizeof(*des3));
+       EVP_CIPHER_CTX_init(&des3->des3_ctx);
+       EVP_EncryptInit_ex(&des3->des3_ctx, EVP_des_ede3_cbc(), NULL, key, ivec);
+       EVP_CIPHER_CTX_set_padding(&des3->des3_ctx, 0);
+       return des3;
+}
+
+CryptoDes3 crypto_des3_decrypt_init(const uint8* key, const uint8* ivec)
+{
+       CryptoDes3 des3 = xmalloc(sizeof(*des3));
+       EVP_CIPHER_CTX_init(&des3->des3_ctx);
+       EVP_DecryptInit_ex(&des3->des3_ctx, EVP_des_ede3_cbc(), NULL, key, ivec);
+       EVP_CIPHER_CTX_set_padding(&des3->des3_ctx, 0);
+       return des3;
+}
+
+void crypto_des3_encrypt(CryptoDes3 des3, uint32 length, const uint8* in_data, uint8* out_data)
+{
+       int len;
+       EVP_EncryptUpdate(&des3->des3_ctx, out_data, &len, in_data, length);
+}
+
+void crypto_des3_decrypt(CryptoDes3 des3, uint32 length, const uint8* in_data, uint8* out_data)
+{
+       int len;
+       EVP_DecryptUpdate(&des3->des3_ctx, out_data, &len, in_data, length);
+
+       if (length != len)
+               abort(); /* TODO */
+}
+
+void crypto_des3_free(CryptoDes3 des3)
+{
+       EVP_CIPHER_CTX_cleanup(&des3->des3_ctx);
+       xfree(des3);
+}
+
+CryptoHmac crypto_hmac_new(void)
+{
+       CryptoHmac hmac = xmalloc(sizeof(*hmac));
+       HMAC_CTX_init(&hmac->hmac_ctx);
+       return hmac;
+}
+
+void crypto_hmac_sha1_init(CryptoHmac hmac, const uint8* data, uint32 length)
+{
+       HMAC_Init_ex(&hmac->hmac_ctx, data, length, EVP_sha1(), NULL);
+}
+
+void crypto_hmac_update(CryptoHmac hmac, const uint8* data, uint32 length)
+{
+       HMAC_Update(&hmac->hmac_ctx, data, length);
+}
+
+void crypto_hmac_final(CryptoHmac hmac, uint8* out_data, uint32 length)
+{
+       HMAC_Final(&hmac->hmac_ctx, out_data, &length);
+}
+
+void crypto_hmac_free(CryptoHmac hmac)
+{
+       HMAC_CTX_cleanup(&hmac->hmac_ctx);
+       xfree(hmac);
+}
+
+CryptoCert crypto_cert_read(uint8* data, uint32 length)
+{
+       CryptoCert cert = xmalloc(sizeof(*cert));
+       /* this will move the data pointer but we don't care, we don't use it again */
+       cert->px509 = d2i_X509(NULL, (D2I_X509_CONST uint8 **) &data, length);
+       return cert;
+}
+
+void crypto_cert_free(CryptoCert cert)
+{
+       X509_free(cert->px509);
+       xfree(cert);
+}
+
+boolean crypto_cert_get_public_key(CryptoCert cert, rdpBlob* public_key)
+{
+       uint8* p;
+       int length;
+       boolean status = true;
+       EVP_PKEY* pkey = NULL;
+
+       pkey = X509_get_pubkey(cert->px509);
+
+       if (!pkey)
+       {
+               printf("crypto_cert_get_public_key: X509_get_pubkey() failed\n");
+               status = false;
+               goto exit;
+       }
+
+       length = i2d_PublicKey(pkey, NULL);
+
+       if (length < 1)
+       {
+               printf("crypto_cert_get_public_key: i2d_PublicKey() failed\n");
+               status = false;
+               goto exit;
+       }
+
+       freerdp_blob_alloc(public_key, length);
+       p = (uint8*) public_key->data;
+       i2d_PublicKey(pkey, &p);
+
+exit:
+       if (pkey)
+               EVP_PKEY_free(pkey);
+
+       return status;
+}
+
+/*
+ * Terminal Services Signing Keys.
+ * Yes, Terminal Services Private Key is publicly available.
+ */
+
+const uint8 tssk_modulus[] =
+{
+       0x3d, 0x3a, 0x5e, 0xbd, 0x72, 0x43, 0x3e, 0xc9,
+       0x4d, 0xbb, 0xc1, 0x1e, 0x4a, 0xba, 0x5f, 0xcb,
+       0x3e, 0x88, 0x20, 0x87, 0xef, 0xf5, 0xc1, 0xe2,
+       0xd7, 0xb7, 0x6b, 0x9a, 0xf2, 0x52, 0x45, 0x95,
+       0xce, 0x63, 0x65, 0x6b, 0x58, 0x3a, 0xfe, 0xef,
+       0x7c, 0xe7, 0xbf, 0xfe, 0x3d, 0xf6, 0x5c, 0x7d,
+       0x6c, 0x5e, 0x06, 0x09, 0x1a, 0xf5, 0x61, 0xbb,
+       0x20, 0x93, 0x09, 0x5f, 0x05, 0x6d, 0xea, 0x87
+};
+
+const uint8 tssk_privateExponent[] =
+{
+       0x87, 0xa7, 0x19, 0x32, 0xda, 0x11, 0x87, 0x55,
+       0x58, 0x00, 0x16, 0x16, 0x25, 0x65, 0x68, 0xf8,
+       0x24, 0x3e, 0xe6, 0xfa, 0xe9, 0x67, 0x49, 0x94,
+       0xcf, 0x92, 0xcc, 0x33, 0x99, 0xe8, 0x08, 0x60,
+       0x17, 0x9a, 0x12, 0x9f, 0x24, 0xdd, 0xb1, 0x24,
+       0x99, 0xc7, 0x3a, 0xb8, 0x0a, 0x7b, 0x0d, 0xdd,
+       0x35, 0x07, 0x79, 0x17, 0x0b, 0x51, 0x9b, 0xb3,
+       0xc7, 0x10, 0x01, 0x13, 0xe7, 0x3f, 0xf3, 0x5f
+};
+
+const uint8 tssk_exponent[] =
+{
+       0x5b, 0x7b, 0x88, 0xc0
+};
+
+static void crypto_rsa_common(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* exponent, int exponent_size, uint8* output)
+{
+       BN_CTX* ctx;
+       int output_length;
+       uint8* input_reverse;
+       uint8* modulus_reverse;
+       uint8* exponent_reverse;
+       BIGNUM mod, exp, x, y;
+
+       input_reverse = (uint8*) xmalloc(2 * key_length + exponent_size);
+       modulus_reverse = input_reverse + key_length;
+       exponent_reverse = modulus_reverse + key_length;
+
+       memcpy(modulus_reverse, modulus, key_length);
+       crypto_reverse(modulus_reverse, key_length);
+       memcpy(exponent_reverse, exponent, exponent_size);
+       crypto_reverse(exponent_reverse, exponent_size);
+       memcpy(input_reverse, input, length);
+       crypto_reverse(input_reverse, length);
+
+       ctx = BN_CTX_new();
+       BN_init(&mod);
+       BN_init(&exp);
+       BN_init(&x);
+       BN_init(&y);
+
+       BN_bin2bn(modulus_reverse, key_length, &mod);
+       BN_bin2bn(exponent_reverse, exponent_size, &exp);
+       BN_bin2bn(input_reverse, length, &x);
+       BN_mod_exp(&y, &x, &exp, &mod, ctx);
+
+       output_length = BN_bn2bin(&y, output);
+       crypto_reverse(output, output_length);
+
+       if (output_length < (int) key_length)
+               memset(output + output_length, 0, key_length - output_length);
+
+       BN_free(&y);
+       BN_clear_free(&x);
+       BN_free(&exp);
+       BN_free(&mod);
+       BN_CTX_free(ctx);
+       xfree(input_reverse);
+}
+
+static void crypto_rsa_public(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* exponent, uint8* output)
+{
+       crypto_rsa_common(input, length, key_length, modulus, exponent, EXPONENT_MAX_SIZE, output);
+}
+
+static void crypto_rsa_private(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* private_exponent, uint8* output)
+{
+
+       crypto_rsa_common(input, length, key_length, modulus, private_exponent, key_length, output);
+}
+
+void crypto_rsa_public_encrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* exponent, uint8* output)
+{
+
+       crypto_rsa_public(input, length, key_length, modulus, exponent, output);
+}
+
+void crypto_rsa_public_decrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* exponent, uint8* output)
+{
+
+       crypto_rsa_public(input, length, key_length, modulus, exponent, output);
+}
+
+void crypto_rsa_private_encrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* private_exponent, uint8* output)
+{
+
+       crypto_rsa_private(input, length, key_length, modulus, private_exponent, output);
+}
+
+void crypto_rsa_private_decrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* private_exponent, uint8* output)
+{
+
+       crypto_rsa_private(input, length, key_length, modulus, private_exponent, output);
+}
+
+void crypto_rsa_decrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* private_exponent, uint8* output)
+{
+
+       crypto_rsa_common(input, length, key_length, modulus, private_exponent, key_length, output);
+}
+
+void crypto_reverse(uint8* data, int length)
+{
+       int i, j;
+       uint8 temp;
+
+       for (i = 0, j = length - 1; i < j; i++, j--)
+       {
+               temp = data[i];
+               data[i] = data[j];
+               data[j] = temp;
+       }
+}
+
+void crypto_nonce(uint8* nonce, int size)
+{
+       RAND_bytes((void*) nonce, size);
+}
+
+char* crypto_cert_fingerprint(X509* xcert)
+{
+       int i = 0;
+       char* p;
+       char* fp_buffer;
+       uint32 fp_len;
+       uint8 fp[EVP_MAX_MD_SIZE];
+
+       X509_digest(xcert, EVP_sha1(), fp, &fp_len);
+
+       fp_buffer = (char*) xzalloc(3 * fp_len);
+       p = fp_buffer;
+
+       for (i = 0; i < (int) (fp_len - 1); i++)
+       {
+               sprintf(p, "%02x:", fp[i]);
+               p = &fp_buffer[i * 3];
+       }
+       sprintf(p, "%02x", fp[i]);
+
+       return fp_buffer;
+}
+
+char* crypto_print_name(X509_NAME* name)
+{
+       char* buffer = NULL;
+       BIO* outBIO = BIO_new(BIO_s_mem());
+       
+       if (X509_NAME_print_ex(outBIO, name, 0, XN_FLAG_ONELINE) > 0)
+       {
+               unsigned long size = BIO_number_written(outBIO);
+               buffer = xzalloc(size + 1);
+               memset(buffer, 0, size + 1);
+               BIO_read(outBIO, buffer, size);
+       }
+
+       BIO_free(outBIO);
+       return buffer;
+}
+
+
+char* crypto_cert_subject(X509* xcert)
+{
+       return crypto_print_name(X509_get_subject_name(xcert));
+}
+
+char* crypto_cert_subject_common_name(X509* xcert, int* length)
+{
+       int index;
+       uint8* common_name;
+       X509_NAME* subject_name;
+       X509_NAME_ENTRY* entry;
+       ASN1_STRING* entry_data;
+
+       subject_name = X509_get_subject_name(xcert);
+
+       if (subject_name == NULL)
+               return NULL;
+
+       index = X509_NAME_get_index_by_NID(subject_name, NID_commonName, -1);
+
+       if (index < 0)
+               return NULL;
+
+       entry = X509_NAME_get_entry(subject_name, index);
+
+       if (entry == NULL)
+               return NULL;
+
+       entry_data = X509_NAME_ENTRY_get_data(entry);
+
+       if (entry_data == NULL)
+               return NULL;
+
+       *length = ASN1_STRING_to_UTF8(&common_name, entry_data);
+
+       if (*length < 0)
+               return NULL;
+
+       return (char*) common_name;
+}
+
+char** crypto_cert_subject_alt_name(X509* xcert, int* count, int** lengths)
+{
+       int index;
+       int length;
+       char** strings;
+       uint8* string;
+       int num_subject_alt_names;
+       GENERAL_NAMES* subject_alt_names;
+       GENERAL_NAME* subject_alt_name;
+
+       *count = 0;
+       subject_alt_names = X509_get_ext_d2i(xcert, NID_subject_alt_name, 0, 0);
+
+       if (!subject_alt_names)
+               return NULL;
+
+       num_subject_alt_names = sk_GENERAL_NAME_num(subject_alt_names);
+       strings = (char**) malloc(sizeof(char*) * num_subject_alt_names);
+       *lengths = (int*) malloc(sizeof(int*) * num_subject_alt_names);
+
+       for (index = 0; index < num_subject_alt_names; ++index)
+       {
+               subject_alt_name = sk_GENERAL_NAME_value(subject_alt_names, index);
+
+               if (subject_alt_name->type == GEN_DNS)
+               {
+                       length = ASN1_STRING_to_UTF8(&string, subject_alt_name->d.dNSName);
+                       strings[*count] = (char*) string;
+                       *lengths[*count] = length;
+                       (*count)++;
+               }
+       }
+
+       if (*count < 1)
+               return NULL;
+
+       return strings;
+}
+
+char* crypto_cert_issuer(X509* xcert)
+{
+       return crypto_print_name(X509_get_issuer_name(xcert));
+}
+
+boolean x509_verify_certificate(CryptoCert cert, char* certificate_store_path)
+{
+       X509_STORE_CTX* csc;
+       boolean status = false;
+       X509_STORE* cert_ctx = NULL;
+       X509_LOOKUP* lookup = NULL;
+       X509* xcert = cert->px509;
+
+       cert_ctx = X509_STORE_new();
+
+       if (cert_ctx == NULL)
+               goto end;
+
+       OpenSSL_add_all_algorithms();
+       lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_file());
+
+       if (lookup == NULL)
+               goto end;
+
+       lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_hash_dir());
+
+       if (lookup == NULL)
+               goto end;
+
+       X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
+
+       if (certificate_store_path != NULL)
+       {
+               X509_LOOKUP_add_dir(lookup, certificate_store_path, X509_FILETYPE_ASN1);
+       }
+
+       csc = X509_STORE_CTX_new();
+
+       if (csc == NULL)
+               goto end;
+
+       X509_STORE_set_flags(cert_ctx, 0);
+
+       if (!X509_STORE_CTX_init(csc, cert_ctx, xcert, 0))
+               goto end;
+
+       if (X509_verify_cert(csc) == 1)
+               status = true;
+
+       X509_STORE_CTX_free(csc);
+       X509_STORE_free(cert_ctx);
+
+end:
+       return status;
+}
+
+rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname)
+{
+       char* fp;
+       rdpCertificateData* certdata;
+
+       fp = crypto_cert_fingerprint(xcert);
+       certdata = certificate_data_new(hostname, fp);
+       xfree(fp);
+
+       return certdata;
+}
+
+void crypto_cert_print_info(X509* xcert)
+{
+       char* fp;
+       char* issuer;
+       char* subject;
+
+       subject = crypto_cert_subject(xcert);
+       issuer = crypto_cert_issuer(xcert);
+       fp = crypto_cert_fingerprint(xcert);
+
+       printf("Certificate details:\n");
+       printf("\tSubject: %s\n", subject);
+       printf("\tIssuer: %s\n", issuer);
+       printf("\tThumbprint: %s\n", fp);
+       printf("The above X.509 certificate could not be verified, possibly because you do not have "
+                       "the CA certificate in your certificate store, or the certificate has expired. "
+                       "Please look at the documentation on how to create local certificate store for a private CA.\n");
+
+       xfree(subject);
+       xfree(issuer);
+       xfree(fp);
+}
+
diff --git a/libfreerdp-core/crypto.h b/libfreerdp-core/crypto.h
new file mode 100644 (file)
index 0000000..15afca8
--- /dev/null
@@ -0,0 +1,140 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Cryptographic Abstraction Layer
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CRYPTO_H
+#define __CRYPTO_H
+
+#ifdef _WIN32
+#include "tcp.h"
+#endif
+
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+#include <openssl/rc4.h>
+#include <openssl/md5.h>
+#include <openssl/sha.h>
+#include <openssl/hmac.h>
+#include <openssl/bn.h>
+#include <openssl/x509v3.h>
+#include <openssl/rand.h>
+
+#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x0090800f)
+#define D2I_X509_CONST const
+#else
+#define D2I_X509_CONST
+#endif
+
+#define EXPONENT_MAX_SIZE                      4
+#define MODULUS_MAX_SIZE                       256
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/memory.h>
+
+struct crypto_sha1_struct
+{
+       SHA_CTX sha_ctx;
+};
+
+struct crypto_md5_struct
+{
+       MD5_CTX md5_ctx;
+};
+
+struct crypto_rc4_struct
+{
+       RC4_KEY rc4_key;
+};
+
+struct crypto_des3_struct
+{
+       EVP_CIPHER_CTX des3_ctx;
+};
+
+struct crypto_hmac_struct
+{
+       HMAC_CTX hmac_ctx;
+};
+
+struct crypto_cert_struct
+{
+       X509 * px509;
+};
+
+#define        CRYPTO_SHA1_DIGEST_LENGTH       SHA_DIGEST_LENGTH
+typedef struct crypto_sha1_struct* CryptoSha1;
+CryptoSha1 crypto_sha1_init(void);
+void crypto_sha1_update(CryptoSha1 sha1, const uint8* data, uint32 length);
+void crypto_sha1_final(CryptoSha1 sha1, uint8* out_data);
+
+#define        CRYPTO_MD5_DIGEST_LENGTH        MD5_DIGEST_LENGTH
+typedef struct crypto_md5_struct* CryptoMd5;
+CryptoMd5 crypto_md5_init(void);
+void crypto_md5_update(CryptoMd5 md5, const uint8* data, uint32 length);
+void crypto_md5_final(CryptoMd5 md5, uint8* out_data);
+
+typedef struct crypto_rc4_struct* CryptoRc4;
+CryptoRc4 crypto_rc4_init(const uint8* key, uint32 length);
+void crypto_rc4(CryptoRc4 rc4, uint32 length, const uint8* in_data, uint8* out_data);
+void crypto_rc4_free(CryptoRc4 rc4);
+
+typedef struct crypto_des3_struct* CryptoDes3;
+CryptoDes3 crypto_des3_encrypt_init(const uint8* key, const uint8* ivec);
+CryptoDes3 crypto_des3_decrypt_init(const uint8* key, const uint8* ivec);
+void crypto_des3_encrypt(CryptoDes3 des3, uint32 length, const uint8 *in_data, uint8 *out_data);
+void crypto_des3_decrypt(CryptoDes3 des3, uint32 length, const uint8 *in_data, uint8* out_data);
+void crypto_des3_free(CryptoDes3 des3);
+
+typedef struct crypto_hmac_struct* CryptoHmac;
+CryptoHmac crypto_hmac_new(void);
+void crypto_hmac_sha1_init(CryptoHmac hmac, const uint8 *data, uint32 length);
+void crypto_hmac_update(CryptoHmac hmac, const uint8 *data, uint32 length);
+void crypto_hmac_final(CryptoHmac hmac, uint8 *out_data, uint32 length);
+void crypto_hmac_free(CryptoHmac hmac);
+
+typedef struct crypto_cert_struct* CryptoCert;
+
+#include "certificate.h"
+
+CryptoCert crypto_cert_read(uint8* data, uint32 length);
+char* crypto_cert_fingerprint(X509* xcert);
+char* crypto_cert_subject(X509* xcert);
+char* crypto_cert_subject_common_name(X509* xcert, int* length);
+char** crypto_cert_subject_alt_name(X509* xcert, int* count, int** lengths);
+char* crypto_cert_issuer(X509* xcert);
+void crypto_cert_print_info(X509* xcert);
+void crypto_cert_free(CryptoCert cert);
+
+boolean x509_verify_certificate(CryptoCert cert, char* certificate_store_path);
+rdpCertificateData* crypto_get_certificate_data(X509* xcert, char* hostname);
+boolean crypto_cert_get_public_key(CryptoCert cert, rdpBlob* public_key);
+
+#define        TSSK_KEY_LENGTH 64
+extern const uint8 tssk_modulus[];
+extern const uint8 tssk_privateExponent[];
+extern const uint8 tssk_exponent[];
+
+void crypto_rsa_public_encrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* exponent, uint8* output);
+void crypto_rsa_public_decrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* exponent, uint8* output);
+void crypto_rsa_private_encrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* private_exponent, uint8* output);
+void crypto_rsa_private_decrypt(const uint8* input, int length, uint32 key_length, const uint8* modulus, const uint8* private_exponent, uint8* output);
+void crypto_reverse(uint8* data, int length);
+void crypto_nonce(uint8* nonce, int size);
+
+#endif /* __CRYPTO_H */
diff --git a/libfreerdp-core/errinfo.c b/libfreerdp-core/errinfo.c
new file mode 100644 (file)
index 0000000..bd6899c
--- /dev/null
@@ -0,0 +1,453 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Error Info
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "errinfo.h"
+
+/* Protocol-independent codes */
+
+#define ERRINFO_RPC_INITIATED_DISCONNECT_STRING \
+               "The disconnection was initiated by an administrative tool on the server in another session."
+
+#define ERRINFO_RPC_INITIATED_LOGOFF_STRING \
+               "The disconnection was due to a forced logoff initiated by an administrative tool on the server in another session."
+
+#define ERRINFO_IDLE_TIMEOUT_STRING \
+               "The idle session limit timer on the server has elapsed."
+
+#define ERRINFO_LOGON_TIMEOUT_STRING \
+               "The active session limit timer on the server has elapsed."
+
+#define ERRINFO_DISCONNECTED_BY_OTHER_CONNECTION_STRING \
+               "Another user connected to the server, forcing the disconnection of the current connection."
+
+#define ERRINFO_OUT_OF_MEMORY_STRING \
+               "The server ran out of available memory resources."
+
+#define ERRINFO_SERVER_DENIED_CONNECTION_STRING \
+               "The server denied the connection."
+
+#define ERRINFO_SERVER_INSUFFICIENT_PRIVILEGES_STRING \
+               "The user cannot connect to the server due to insufficient access privileges."
+
+#define ERRINFO_SERVER_FRESH_CREDENTIALS_REQUIRED_STRING \
+               "The server does not accept saved user credentials and requires that the user enter their credentials for each connection."
+
+#define ERRINFO_RPC_INITIATED_DISCONNECT_BY_USER_STRING \
+               "The disconnection was initiated by an administrative tool on the server running in the user's session."
+
+/* Protocol-independent licensing codes */
+
+#define ERRINFO_LICENSE_INTERNAL_STRING \
+               "An internal error has occurred in the Terminal Services licensing component."
+
+#define ERRINFO_LICENSE_NO_LICENSE_SERVER_STRING \
+               "A Remote Desktop License Server ([MS-RDPELE] section 1.1) could not be found to provide a license."
+
+#define ERRINFO_LICENSE_NO_LICENSE_STRING \
+               "There are no Client Access Licenses ([MS-RDPELE] section 1.1) available for the target remote computer."
+
+#define ERRINFO_LICENSE_BAD_CLIENT_MSG_STRING \
+               "The remote computer received an invalid licensing message from the client."
+
+#define ERRINFO_LICENSE_HWID_DOESNT_MATCH_LICENSE_STRING \
+               "The Client Access License ([MS-RDPELE] section 1.1) stored by the client has been modified."
+
+#define ERRINFO_LICENSE_BAD_CLIENT_LICENSE_STRING \
+               "The Client Access License ([MS-RDPELE] section 1.1) stored by the client is in an invalid format."
+
+#define ERRINFO_LICENSE_CANT_FINISH_PROTOCOL_STRING \
+               "Network problems have caused the licensing protocol ([MS-RDPELE] section 1.3.3) to be terminated."
+
+#define ERRINFO_LICENSE_CLIENT_ENDED_PROTOCOL_STRING \
+               "The client prematurely ended the licensing protocol ([MS-RDPELE] section 1.3.3)."
+
+#define ERRINFO_LICENSE_BAD_CLIENT_ENCRYPTION_STRING \
+               "A licensing message ([MS-RDPELE] sections 2.2 and 5.1) was incorrectly encrypted."
+
+#define ERRINFO_LICENSE_CANT_UPGRADE_LICENSE_STRING \
+               "The Client Access License ([MS-RDPELE] section 1.1) stored by the client could not be upgraded or renewed."
+
+#define ERRINFO_LICENSE_NO_REMOTE_CONNECTIONS_STRING \
+               "The remote computer is not licensed to accept remote connections."
+
+/* RDP specific codes */
+
+#define ERRINFO_UNKNOWN_DATA_PDU_TYPE_STRING \
+               "Unknown pduType2 field in a received Share Data Header (section 2.2.8.1.1.1.2)."
+
+#define ERRINFO_UNKNOWN_PDU_TYPE_STRING \
+               "Unknown pduType field in a received Share Control Header (section 2.2.8.1.1.1.1)."
+
+#define ERRINFO_DATA_PDU_SEQUENCE_STRING \
+               "An out-of-sequence Slow-Path Data PDU (section 2.2.8.1.1.1.1) has been received."
+
+#define ERRINFO_CONTROL_PDU_SEQUENCE_STRING \
+               "An out-of-sequence Slow-Path Non-Data PDU (section 2.2.8.1.1.1.1) has been received."
+
+#define ERRINFO_INVALID_CONTROL_PDU_ACTION_STRING \
+               "A Control PDU (sections 2.2.1.15 and 2.2.1.16) has been received with an invalid action field."
+
+#define ERRINFO_INVALID_INPUT_PDU_TYPE_STRING \
+               "(a) A Slow-Path Input Event (section 2.2.8.1.1.3.1.1) has been received with an invalid messageType field.\n" \
+               "(b) A Fast-Path Input Event (section 2.2.8.1.2.2) has been received with an invalid eventCode field."
+
+#define ERRINFO_INVALID_INPUT_PDU_MOUSE_STRING \
+               "(a) A Slow-Path Mouse Event (section 2.2.8.1.1.3.1.1.3) or Extended Mouse Event " \
+               "(section 2.2.8.1.1.3.1.1.4) has been received with an invalid pointerFlags field.\n" \
+               "(b) A Fast-Path Mouse Event (section 2.2.8.1.2.2.3) or Fast-Path Extended Mouse Event " \
+               "(section 2.2.8.1.2.2.4) has been received with an invalid pointerFlags field."
+
+#define ERRINFO_INVALID_REFRESH_RECT_PDU_STRING \
+               "An invalid Refresh Rect PDU (section 2.2.11.2) has been received."
+
+#define ERRINFO_CREATE_USER_DATA_FAILED_STRING \
+               "The server failed to construct the GCC Conference Create Response user data (section 2.2.1.4)."
+
+#define ERRINFO_CONNECT_FAILED_STRING \
+               "Processing during the Channel Connection phase of the RDP Connection Sequence " \
+               "(see section 1.3.1.1 for an overview of the RDP Connection Sequence phases) has failed."
+
+#define ERRINFO_CONFIRM_ACTIVE_HAS_WRONG_SHAREID_STRING \
+               "A Confirm Active PDU (section 2.2.1.13.2) was received from the client with an invalid shareId field."
+
+#define ERRINFO_CONFIRM_ACTIVE_HAS_WRONG_ORIGINATOR_STRING \
+               "A Confirm Active PDU (section 2.2.1.13.2) was received from the client with an invalid originatorId field."
+
+#define ERRINFO_PERSISTENT_KEY_PDU_BAD_LENGTH_STRING \
+               "There is not enough data to process a Persistent Key List PDU (section 2.2.1.17)."
+
+#define ERRINFO_PERSISTENT_KEY_PDU_ILLEGAL_FIRST_STRING \
+               "A Persistent Key List PDU (section 2.2.1.17) marked as PERSIST_PDU_FIRST (0x01) was received after the reception " \
+               "of a prior Persistent Key List PDU also marked as PERSIST_PDU_FIRST."
+
+#define ERRINFO_PERSISTENT_KEY_PDU_TOO_MANY_TOTAL_KEYS_STRING \
+               "A Persistent Key List PDU (section 2.2.1.17) was received which specified a total number of bitmap cache entries larger than 262144."
+
+#define ERRINFO_PERSISTENT_KEY_PDU_TOO_MANY_CACHE_KEYS_STRING \
+               "A Persistent Key List PDU (section 2.2.1.17) was received which specified an invalid total number of keys for a bitmap cache " \
+               "(the number of entries that can be stored within each bitmap cache is specified in the Revision 1 or 2 Bitmap Cache Capability Set " \
+               "(section 2.2.7.1.4) that is sent from client to server)."
+
+#define ERRINFO_INPUT_PDU_BAD_LENGTH_STRING \
+               "There is not enough data to process Input Event PDU Data (section 2.2.8.1.1.3.1) or a Fast-Path Input Event PDU (section 2.2.8.1.2)." \
+
+#define ERRINFO_BITMAP_CACHE_ERROR_PDU_BAD_LENGTH_STRING \
+               "There is not enough data to process the shareDataHeader, NumInfoBlocks, " \
+               "Pad1, and Pad2 fields of the Bitmap Cache Error PDU Data ([MS-RDPEGDI] section 2.2.2.3.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT_STRING \
+               "(a) The dataSignature field of the Fast-Path Input Event PDU (section 2.2.8.1.2) does not contain enough data.\n" \
+               "(b) The fipsInformation and dataSignature fields of the Fast-Path Input Event PDU (section 2.2.8.1.2) do not contain enough data."
+
+#define ERRINFO_VCHANNEL_DATA_TOO_SHORT_STRING \
+               "(a) There is not enough data in the Client Network Data (section 2.2.1.3.4) to read the virtual channel configuration data.\n" \
+               "(b) There is not enough data to read a complete Channel PDU Header (section 2.2.6.1.1)."
+
+#define ERRINFO_SHARE_DATA_TOO_SHORT_STRING \
+               "(a) There is not enough data to process Control PDU Data (section 2.2.1.15.1).\n" \
+               "(b) There is not enough data to read a complete Share Control Header (section 2.2.8.1.1.1.1).\n" \
+               "(c) There is not enough data to read a complete Share Data Header (section 2.2.8.1.1.1.2) of a Slow-Path Data PDU (section 2.2.8.1.1.1.1).\n" \
+               "(d) There is not enough data to process Font List PDU Data (section 2.2.1.18.1)."
+
+#define ERRINFO_BAD_SUPPRESS_OUTPUT_PDU_STRING \
+               "(a) There is not enough data to process Suppress Output PDU Data (section 2.2.11.3.1).\n" \
+               "(b) The allowDisplayUpdates field of the Suppress Output PDU Data (section 2.2.11.3.1) is invalid."
+
+#define ERRINFO_CONFIRM_ACTIVE_PDU_TOO_SHORT_STRING \
+               "(a) There is not enough data to read the shareControlHeader, shareId, originatorId, lengthSourceDescriptor, " \
+               "and lengthCombinedCapabilities fields of the Confirm Active PDU Data (section 2.2.1.13.2.1).\n" \
+               "(b) There is not enough data to read the sourceDescriptor, numberCapabilities, pad2Octets, and capabilitySets " \
+               "fields of the Confirm Active PDU Data (section 2.2.1.13.2.1)."
+
+#define ERRINFO_CAPABILITY_SET_TOO_SMALL_STRING \
+               "There is not enough data to read the capabilitySetType and the lengthCapability fields in a received Capability Set (section 2.2.1.13.1.1.1)."
+
+#define ERRINFO_CAPABILITY_SET_TOO_LARGE_STRING \
+               "A Capability Set (section 2.2.1.13.1.1.1) has been received with a lengthCapability " \
+               "field that contains a value greater than the total length of the data received."
+
+#define ERRINFO_NO_CURSOR_CACHE_STRING \
+               "(a) Both the colorPointerCacheSize and pointerCacheSize fields in the Pointer Capability Set (section 2.2.7.1.5) are set to zero.\n" \
+               "(b) The pointerCacheSize field in the Pointer Capability Set (section 2.2.7.1.5) is not present, and the colorPointerCacheSize field is set to zero."
+
+#define ERRINFO_BAD_CAPABILITIES_STRING \
+               "The capabilities received from the client in the Confirm Active PDU (section 2.2.1.13.2) were not accepted by the server."
+
+#define ERRINFO_VIRTUAL_CHANNEL_DECOMPRESSION_STRING \
+               "An error occurred while using the bulk compressor (section 3.1.8 and [MS-RDPEGDI] section 3.1.8) to decompress a Virtual Channel PDU (section 2.2.6.1)"
+
+#define ERRINFO_INVALID_VC_COMPRESSION_TYPE_STRING \
+               "An invalid bulk compression package was specified in the flags field of the Channel PDU Header (section 2.2.6.1.1)."
+
+#define ERRINFO_INVALID_CHANNEL_ID_STRING \
+               "An invalid MCS channel ID was specified in the mcsPdu field of the Virtual Channel PDU (section 2.2.6.1)."
+
+#define ERRINFO_VCHANNELS_TOO_MANY_STRING \
+               "The client requested more than the maximum allowed 31 static virtual channels in the Client Network Data (section 2.2.1.3.4)."
+
+#define ERRINFO_REMOTEAPP_NOT_ENABLED_STRING \
+               "The INFO_RAIL flag (0x00008000) MUST be set in the flags field of the Info Packet (section 2.2.1.11.1.1) " \
+               "as the session on the remote server can only host remote applications."
+
+#define ERRINFO_CACHE_CAP_NOT_SET_STRING \
+               "The client sent a Persistent Key List PDU (section 2.2.1.17) without including the prerequisite Revision 2 Bitmap Cache " \
+               "Capability Set (section 2.2.7.1.4.2) in the Confirm Active PDU (section 2.2.1.13.2)."
+
+#define ERRINFO_BITMAP_CACHE_ERROR_PDU_BAD_LENGTH2_STRING \
+               "The NumInfoBlocks field in the Bitmap Cache Error PDU Data is inconsistent with the amount of data in the " \
+               "Info field ([MS-RDPEGDI] section 2.2.2.3.1.1)."
+
+#define ERRINFO_OFFSCREEN_CACHE_ERROR_PDU_BAD_LENGTH_STRING \
+               "There is not enough data to process an Offscreen Bitmap Cache Error PDU ([MS-RDPEGDI] section 2.2.2.3.2)."
+
+#define ERRINFO_DRAWNINEGRID_CACHE_ERROR_PDU_BAD_LENGTH_STRING \
+               "There is not enough data to process a DrawNineGrid Cache Error PDU ([MS-RDPEGDI] section 2.2.2.3.3)."
+
+#define ERRINFO_GDIPLUS_PDU_BAD_LENGTH_STRING \
+               "There is not enough data to process a GDI+ Error PDU ([MS-RDPEGDI] section 2.2.2.3.4)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT2_STRING \
+               "There is not enough data to read a Basic Security Header (section 2.2.8.1.1.2.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT3_STRING \
+               "There is not enough data to read a Non-FIPS Security Header (section 2.2.8.1.1.2.2) or FIPS Security Header (section 2.2.8.1.1.2.3)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT4_STRING \
+               "There is not enough data to read the basicSecurityHeader and length fields of the Security Exchange PDU Data (section 2.2.1.10.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT5_STRING \
+               "There is not enough data to read the CodePage, flags, cbDomain, cbUserName, cbPassword, cbAlternateShell, " \
+               "cbWorkingDir, Domain, UserName, Password, AlternateShell, and WorkingDir fields in the Info Packet (section 2.2.1.11.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT6_STRING \
+               "There is not enough data to read the CodePage, flags, cbDomain, cbUserName, cbPassword, cbAlternateShell, " \
+               "and cbWorkingDir fields in the Info Packet (section 2.2.1.11.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT7_STRING \
+               "There is not enough data to read the clientAddressFamily and cbClientAddress fields in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT8_STRING \
+               "There is not enough data to read the clientAddress field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT9_STRING \
+               "There is not enough data to read the cbClientDir field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT10_STRING \
+               "There is not enough data to read the clientDir field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT11_STRING \
+               "There is not enough data to read the clientTimeZone field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT12_STRING \
+               "There is not enough data to read the clientSessionId field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT13_STRING \
+               "There is not enough data to read the performanceFlags field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT14_STRING \
+               "There is not enough data to read the cbAutoReconnectLen field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT15_STRING \
+               "There is not enough data to read the autoReconnectCookie field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT16_STRING \
+               "The cbAutoReconnectLen field in the Extended Info Packet (section 2.2.1.11.1.1.1) contains a value " \
+               "which is larger than the maximum allowed length of 128 bytes."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT17_STRING \
+               "There is not enough data to read the clientAddressFamily and cbClientAddress fields in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT18_STRING \
+               "There is not enough data to read the clientAddress field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT19_STRING \
+               "There is not enough data to read the cbClientDir field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT20_STRING \
+               "There is not enough data to read the clientDir field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT21_STRING \
+               "There is not enough data to read the clientTimeZone field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT22_STRING \
+               "There is not enough data to read the clientSessionId field in the Extended Info Packet (section 2.2.1.11.1.1.1)."
+
+#define ERRINFO_SECURITY_DATA_TOO_SHORT23_STRING \
+               "There is not enough data to read the Client Info PDU Data (section 2.2.1.11.1)."
+
+#define ERRINFO_BAD_MONITOR_DATA_STRING \
+               "The monitorCount field in the Client Monitor Data (section 2.2.1.3.6) is invalid."
+
+#define ERRINFO_VC_DECOMPRESSED_REASSEMBLE_FAILED_STRING \
+               "The server-side decompression buffer is invalid, or the size of the decompressed VC data exceeds " \
+               "the chunking size specified in the Virtual Channel Capability Set (section 2.2.7.1.10)."
+
+#define ERRINFO_VC_DATA_TOO_LONG_STRING \
+               "The size of a received Virtual Channel PDU (section 2.2.6.1) exceeds the chunking size specified " \
+               "in the Virtual Channel Capability Set (section 2.2.7.1.10)."
+
+#define ERRINFO_GRAPHICS_MODE_NOT_SUPPORTED_STRING \
+               "The graphics mode requested by the client is not supported by the server."
+
+#define ERRINFO_GRAPHICS_SUBSYSTEM_RESET_FAILED_STRING \
+               "The server-side graphics subsystem failed to reset."
+
+#define ERRINFO_UPDATE_SESSION_KEY_FAILED_STRING \
+               "An attempt to update the session keys while using Standard RDP Security mechanisms (section 5.3.7) failed."
+
+#define ERRINFO_DECRYPT_FAILED_STRING \
+               "(a) Decryption using Standard RDP Security mechanisms (section 5.3.6) failed.\n" \
+               "(b) Session key creation using Standard RDP Security mechanisms (section 5.3.5) failed."
+
+#define ERRINFO_ENCRYPT_FAILED_STRING \
+               "Encryption using Standard RDP Security mechanisms (section 5.3.6) failed."
+
+#define ERRINFO_ENCRYPTION_PACKAGE_MISMATCH_STRING \
+               "Failed to find a usable Encryption Method (section 5.3.2) in the encryptionMethods field of the Client Security Data (section 2.2.1.4.3)."
+
+#define ERRINFO_DECRYPT_FAILED2_STRING \
+               "Unencrypted data was encountered in a protocol stream which is meant to be encrypted with Standard RDP Security mechanisms (section 5.3.6)."
+
+/* Special codes */
+#define ERRINFO_SUCCESS_STRING "Success."
+#define ERRINFO_NONE_STRING ""
+
+static const ERRINFO ERRINFO_CODES[] =
+{
+               ERRINFO_DEFINE(SUCCESS),
+
+               /* Protocol-independent codes */
+               ERRINFO_DEFINE(RPC_INITIATED_DISCONNECT),
+               ERRINFO_DEFINE(RPC_INITIATED_LOGOFF),
+               ERRINFO_DEFINE(IDLE_TIMEOUT),
+               ERRINFO_DEFINE(LOGON_TIMEOUT),
+               ERRINFO_DEFINE(DISCONNECTED_BY_OTHER_CONNECTION),
+               ERRINFO_DEFINE(OUT_OF_MEMORY),
+               ERRINFO_DEFINE(SERVER_DENIED_CONNECTION),
+               ERRINFO_DEFINE(SERVER_INSUFFICIENT_PRIVILEGES),
+               ERRINFO_DEFINE(SERVER_FRESH_CREDENTIALS_REQUIRED),
+               ERRINFO_DEFINE(RPC_INITIATED_DISCONNECT_BY_USER),
+
+               /* Protocol-independent licensing codes */
+               ERRINFO_DEFINE(LICENSE_INTERNAL),
+               ERRINFO_DEFINE(LICENSE_NO_LICENSE_SERVER),
+               ERRINFO_DEFINE(LICENSE_NO_LICENSE),
+               ERRINFO_DEFINE(LICENSE_BAD_CLIENT_MSG),
+               ERRINFO_DEFINE(LICENSE_HWID_DOESNT_MATCH_LICENSE),
+               ERRINFO_DEFINE(LICENSE_BAD_CLIENT_LICENSE),
+               ERRINFO_DEFINE(LICENSE_CANT_FINISH_PROTOCOL),
+               ERRINFO_DEFINE(LICENSE_CLIENT_ENDED_PROTOCOL),
+               ERRINFO_DEFINE(LICENSE_BAD_CLIENT_ENCRYPTION),
+               ERRINFO_DEFINE(LICENSE_CANT_UPGRADE_LICENSE),
+               ERRINFO_DEFINE(LICENSE_NO_REMOTE_CONNECTIONS),
+
+               /* RDP specific codes */
+               ERRINFO_DEFINE(UNKNOWN_DATA_PDU_TYPE),
+               ERRINFO_DEFINE(UNKNOWN_PDU_TYPE),
+               ERRINFO_DEFINE(DATA_PDU_SEQUENCE),
+               ERRINFO_DEFINE(CONTROL_PDU_SEQUENCE),
+               ERRINFO_DEFINE(INVALID_CONTROL_PDU_ACTION),
+               ERRINFO_DEFINE(INVALID_INPUT_PDU_TYPE),
+               ERRINFO_DEFINE(INVALID_INPUT_PDU_MOUSE),
+               ERRINFO_DEFINE(INVALID_REFRESH_RECT_PDU),
+               ERRINFO_DEFINE(CREATE_USER_DATA_FAILED),
+               ERRINFO_DEFINE(CONNECT_FAILED),
+               ERRINFO_DEFINE(CONFIRM_ACTIVE_HAS_WRONG_SHAREID),
+               ERRINFO_DEFINE(CONFIRM_ACTIVE_HAS_WRONG_ORIGINATOR),
+               ERRINFO_DEFINE(PERSISTENT_KEY_PDU_BAD_LENGTH),
+               ERRINFO_DEFINE(PERSISTENT_KEY_PDU_ILLEGAL_FIRST),
+               ERRINFO_DEFINE(PERSISTENT_KEY_PDU_TOO_MANY_TOTAL_KEYS),
+               ERRINFO_DEFINE(PERSISTENT_KEY_PDU_TOO_MANY_CACHE_KEYS),
+               ERRINFO_DEFINE(INPUT_PDU_BAD_LENGTH),
+               ERRINFO_DEFINE(BITMAP_CACHE_ERROR_PDU_BAD_LENGTH),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT),
+               ERRINFO_DEFINE(VCHANNEL_DATA_TOO_SHORT  ),
+               ERRINFO_DEFINE(SHARE_DATA_TOO_SHORT),
+               ERRINFO_DEFINE(BAD_SUPPRESS_OUTPUT_PDU),
+               ERRINFO_DEFINE(CONFIRM_ACTIVE_PDU_TOO_SHORT),
+               ERRINFO_DEFINE(CAPABILITY_SET_TOO_SMALL),
+               ERRINFO_DEFINE(CAPABILITY_SET_TOO_LARGE),
+               ERRINFO_DEFINE(NO_CURSOR_CACHE),
+               ERRINFO_DEFINE(BAD_CAPABILITIES),
+               ERRINFO_DEFINE(VIRTUAL_CHANNEL_DECOMPRESSION),
+               ERRINFO_DEFINE(INVALID_VC_COMPRESSION_TYPE),
+               ERRINFO_DEFINE(INVALID_CHANNEL_ID),
+               ERRINFO_DEFINE(VCHANNELS_TOO_MANY),
+               ERRINFO_DEFINE(REMOTEAPP_NOT_ENABLED),
+               ERRINFO_DEFINE(CACHE_CAP_NOT_SET),
+               ERRINFO_DEFINE(BITMAP_CACHE_ERROR_PDU_BAD_LENGTH2),
+               ERRINFO_DEFINE(OFFSCREEN_CACHE_ERROR_PDU_BAD_LENGTH),
+               ERRINFO_DEFINE(DRAWNINEGRID_CACHE_ERROR_PDU_BAD_LENGTH),
+               ERRINFO_DEFINE(GDIPLUS_PDU_BAD_LENGTH),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT2),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT3),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT4),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT5),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT6),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT7),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT8),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT9),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT10),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT11),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT12),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT13),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT14),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT15),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT16),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT17),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT18),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT19),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT20),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT21),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT22),
+               ERRINFO_DEFINE(SECURITY_DATA_TOO_SHORT23),
+               ERRINFO_DEFINE(BAD_MONITOR_DATA),
+               ERRINFO_DEFINE(VC_DECOMPRESSED_REASSEMBLE_FAILED),
+               ERRINFO_DEFINE(VC_DATA_TOO_LONG),
+               ERRINFO_DEFINE(GRAPHICS_MODE_NOT_SUPPORTED),
+               ERRINFO_DEFINE(GRAPHICS_SUBSYSTEM_RESET_FAILED),
+               ERRINFO_DEFINE(UPDATE_SESSION_KEY_FAILED),
+               ERRINFO_DEFINE(DECRYPT_FAILED),
+               ERRINFO_DEFINE(ENCRYPT_FAILED),
+               ERRINFO_DEFINE(ENCRYPTION_PACKAGE_MISMATCH),
+               ERRINFO_DEFINE(DECRYPT_FAILED2),
+
+               ERRINFO_DEFINE(NONE)
+};
+
+void rdp_print_errinfo(uint32 code)
+{
+       const ERRINFO* errInfo;
+
+       errInfo = &ERRINFO_CODES[0];
+
+       while (errInfo->code != ERRINFO_NONE)
+       {
+               if (code == errInfo->code)
+               {
+                       printf("%s (0x%08X):\n%s\n", errInfo->name, code, errInfo->info);
+                       return;
+               }
+
+               errInfo++;
+       }
+
+       printf("ERRINFO_UNKNOWN 0x%08X: Unknown error.\n", code);
+}
+
diff --git a/libfreerdp-core/errinfo.h b/libfreerdp-core/errinfo.h
new file mode 100644 (file)
index 0000000..d63f078
--- /dev/null
@@ -0,0 +1,136 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Error Info
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ERRINFO_H
+#define __ERRINFO_H
+
+#include <freerdp/freerdp.h>
+
+/* Protocol-independent codes */
+#define ERRINFO_RPC_INITIATED_DISCONNECT                       0x00000001
+#define ERRINFO_RPC_INITIATED_LOGOFF                           0x00000002
+#define ERRINFO_IDLE_TIMEOUT                                   0x00000003
+#define ERRINFO_LOGON_TIMEOUT                                  0x00000004
+#define ERRINFO_DISCONNECTED_BY_OTHER_CONNECTION               0x00000005
+#define ERRINFO_OUT_OF_MEMORY                                  0x00000006
+#define ERRINFO_SERVER_DENIED_CONNECTION                       0x00000007
+#define ERRINFO_SERVER_INSUFFICIENT_PRIVILEGES                 0x00000009
+#define ERRINFO_SERVER_FRESH_CREDENTIALS_REQUIRED              0x0000000A
+#define ERRINFO_RPC_INITIATED_DISCONNECT_BY_USER               0x0000000B
+
+/* Protocol-independent licensing codes */
+#define        ERRINFO_LICENSE_INTERNAL                                0x00000100
+#define ERRINFO_LICENSE_NO_LICENSE_SERVER                      0x00000101
+#define ERRINFO_LICENSE_NO_LICENSE                             0x00000102
+#define ERRINFO_LICENSE_BAD_CLIENT_MSG                         0x00000103
+#define ERRINFO_LICENSE_HWID_DOESNT_MATCH_LICENSE              0x00000104
+#define ERRINFO_LICENSE_BAD_CLIENT_LICENSE                     0x00000105
+#define ERRINFO_LICENSE_CANT_FINISH_PROTOCOL                   0x00000106
+#define ERRINFO_LICENSE_CLIENT_ENDED_PROTOCOL                  0x00000107
+#define ERRINFO_LICENSE_BAD_CLIENT_ENCRYPTION                  0x00000108
+#define ERRINFO_LICENSE_CANT_UPGRADE_LICENSE                   0x00000109
+#define ERRINFO_LICENSE_NO_REMOTE_CONNECTIONS                  0x0000010A
+
+/* RDP specific codes */
+#define ERRINFO_UNKNOWN_DATA_PDU_TYPE                          0x000010C9
+#define ERRINFO_UNKNOWN_PDU_TYPE                               0x000010CA
+#define ERRINFO_DATA_PDU_SEQUENCE                              0x000010CB
+#define ERRINFO_CONTROL_PDU_SEQUENCE                           0x000010CD
+#define ERRINFO_INVALID_CONTROL_PDU_ACTION                     0x000010CE
+#define ERRINFO_INVALID_INPUT_PDU_TYPE                         0x000010CF
+#define ERRINFO_INVALID_INPUT_PDU_MOUSE                                0x000010D0
+#define ERRINFO_INVALID_REFRESH_RECT_PDU                       0x000010D1
+#define ERRINFO_CREATE_USER_DATA_FAILED                                0x000010D2
+#define ERRINFO_CONNECT_FAILED                                 0x000010D3
+#define ERRINFO_CONFIRM_ACTIVE_HAS_WRONG_SHAREID               0x000010D4
+#define ERRINFO_CONFIRM_ACTIVE_HAS_WRONG_ORIGINATOR            0x000010D5
+#define ERRINFO_PERSISTENT_KEY_PDU_BAD_LENGTH                  0x000010DA
+#define ERRINFO_PERSISTENT_KEY_PDU_ILLEGAL_FIRST               0x000010DB
+#define ERRINFO_PERSISTENT_KEY_PDU_TOO_MANY_TOTAL_KEYS         0x000010DC
+#define ERRINFO_PERSISTENT_KEY_PDU_TOO_MANY_CACHE_KEYS         0x000010DD
+#define ERRINFO_INPUT_PDU_BAD_LENGTH                           0x000010DE
+#define ERRINFO_BITMAP_CACHE_ERROR_PDU_BAD_LENGTH              0x000010DF
+#define ERRINFO_SECURITY_DATA_TOO_SHORT                                0x000010E0
+#define ERRINFO_VCHANNEL_DATA_TOO_SHORT                                0x000010E1
+#define ERRINFO_SHARE_DATA_TOO_SHORT                           0x000010E2
+#define ERRINFO_BAD_SUPPRESS_OUTPUT_PDU                                0x000010E3
+#define ERRINFO_CONFIRM_ACTIVE_PDU_TOO_SHORT                   0x000010E5
+#define ERRINFO_CAPABILITY_SET_TOO_SMALL                       0x000010E7
+#define ERRINFO_CAPABILITY_SET_TOO_LARGE                       0x000010E8
+#define ERRINFO_NO_CURSOR_CACHE                                        0x000010E9
+#define ERRINFO_BAD_CAPABILITIES                               0x000010EA
+#define ERRINFO_VIRTUAL_CHANNEL_DECOMPRESSION                  0x000010EC
+#define ERRINFO_INVALID_VC_COMPRESSION_TYPE                    0x000010ED
+#define ERRINFO_INVALID_CHANNEL_ID                             0x000010EF
+#define ERRINFO_VCHANNELS_TOO_MANY                             0x000010F0
+#define ERRINFO_REMOTEAPP_NOT_ENABLED                          0x000010F3
+#define ERRINFO_CACHE_CAP_NOT_SET                              0x000010F4
+#define ERRINFO_BITMAP_CACHE_ERROR_PDU_BAD_LENGTH2             0x000010F5
+#define ERRINFO_OFFSCREEN_CACHE_ERROR_PDU_BAD_LENGTH           0x000010F6
+#define ERRINFO_DRAWNINEGRID_CACHE_ERROR_PDU_BAD_LENGTH                0x000010F7
+#define ERRINFO_GDIPLUS_PDU_BAD_LENGTH                         0x000010F8
+#define ERRINFO_SECURITY_DATA_TOO_SHORT2                       0x00001111
+#define ERRINFO_SECURITY_DATA_TOO_SHORT3                       0x00001112
+#define ERRINFO_SECURITY_DATA_TOO_SHORT4                       0x00001113
+#define ERRINFO_SECURITY_DATA_TOO_SHORT5                       0x00001114
+#define ERRINFO_SECURITY_DATA_TOO_SHORT6                       0x00001115
+#define ERRINFO_SECURITY_DATA_TOO_SHORT7                       0x00001116
+#define ERRINFO_SECURITY_DATA_TOO_SHORT8                       0x00001117
+#define ERRINFO_SECURITY_DATA_TOO_SHORT9                       0x00001118
+#define ERRINFO_SECURITY_DATA_TOO_SHORT10                      0x00001119
+#define ERRINFO_SECURITY_DATA_TOO_SHORT11                      0x0000111A
+#define ERRINFO_SECURITY_DATA_TOO_SHORT12                      0x0000111B
+#define ERRINFO_SECURITY_DATA_TOO_SHORT13                      0x0000111C
+#define ERRINFO_SECURITY_DATA_TOO_SHORT14                      0x0000111D
+#define ERRINFO_SECURITY_DATA_TOO_SHORT15                      0x0000111E
+#define ERRINFO_SECURITY_DATA_TOO_SHORT16                      0x0000111F
+#define ERRINFO_SECURITY_DATA_TOO_SHORT17                      0x00001120
+#define ERRINFO_SECURITY_DATA_TOO_SHORT18                      0x00001121
+#define ERRINFO_SECURITY_DATA_TOO_SHORT19                      0x00001122
+#define ERRINFO_SECURITY_DATA_TOO_SHORT20                      0x00001123
+#define ERRINFO_SECURITY_DATA_TOO_SHORT21                      0x00001124
+#define ERRINFO_SECURITY_DATA_TOO_SHORT22                      0x00001125
+#define ERRINFO_SECURITY_DATA_TOO_SHORT23                      0x00001126
+#define ERRINFO_BAD_MONITOR_DATA                               0x00001129
+#define ERRINFO_VC_DECOMPRESSED_REASSEMBLE_FAILED              0x0000112A
+#define ERRINFO_VC_DATA_TOO_LONG                               0x0000112B
+#define ERRINFO_GRAPHICS_MODE_NOT_SUPPORTED                    0x0000112D
+#define ERRINFO_GRAPHICS_SUBSYSTEM_RESET_FAILED                        0x0000112E
+#define ERRINFO_UPDATE_SESSION_KEY_FAILED                      0x00001191
+#define ERRINFO_DECRYPT_FAILED                                 0x00001192
+#define ERRINFO_ENCRYPT_FAILED                                 0x00001193
+#define ERRINFO_ENCRYPTION_PACKAGE_MISMATCH                    0x00001194
+#define ERRINFO_DECRYPT_FAILED2                                        0x00001195
+
+#define ERRINFO_SUCCESS                                                0x00000000
+#define ERRINFO_NONE                                           0xFFFFFFFF
+
+struct _ERRINFO
+{
+       uint32 code;
+       char* name;
+       char* info;
+};
+typedef struct _ERRINFO ERRINFO;
+
+#define ERRINFO_DEFINE(_code)  { ERRINFO_##_code , "ERRINFO_" #_code , ERRINFO_##_code##_STRING }
+
+void rdp_print_errinfo(uint32 code);
+
+#endif
diff --git a/libfreerdp-core/extension.c b/libfreerdp-core/extension.c
new file mode 100644 (file)
index 0000000..3aa0088
--- /dev/null
@@ -0,0 +1,214 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Extension Plugin Interface
+ *
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/print.h>
+#include <freerdp/utils/memory.h>
+
+#include "extension.h"
+
+#ifdef _WIN32
+#define DLOPEN(f) LoadLibraryA(f)
+#define DLSYM(f, n) GetProcAddress(f, n)
+#define DLCLOSE(f) FreeLibrary(f)
+#define PATH_SEPARATOR '\\'
+#define PLUGIN_EXT "dll"
+#else
+#include <dlfcn.h>
+#define DLOPEN(f) dlopen(f, RTLD_LOCAL | RTLD_LAZY)
+#define DLSYM(f, n) dlsym(f, n)
+#define DLCLOSE(f) dlclose(f)
+#define PATH_SEPARATOR '/'
+
+#ifdef __APPLE__
+#define PLUGIN_EXT "dylib"
+#else
+#define PLUGIN_EXT "so"
+#endif 
+
+#endif
+
+static uint32 FREERDP_CC extension_register_plugin(rdpExtPlugin* plugin)
+{
+       rdpExtension* ext = (rdpExtension*) plugin->ext;
+
+       if (ext->num_plugins >= FREERDP_EXT_MAX_COUNT)
+       {
+               printf("extension_register_extension: maximum number of plugins reached.\n");
+               return 1;
+       }
+
+       ext->plugins[ext->num_plugins++] = plugin;
+       return 0;
+}
+
+static uint32 FREERDP_CC extension_register_pre_connect_hook(rdpExtPlugin* plugin, PFREERDP_EXTENSION_HOOK hook)
+{
+       rdpExtension* ext = (rdpExtension*) plugin->ext;
+
+       if (ext->num_pre_connect_hooks >= FREERDP_EXT_MAX_COUNT)
+       {
+               printf("extension_register_pre_connect_hook: maximum plugin reached.\n");
+               return 1;
+       }
+
+       ext->pre_connect_hooks[ext->num_pre_connect_hooks] = hook;
+       ext->pre_connect_hooks_instances[ext->num_pre_connect_hooks] = plugin;
+       ext->num_pre_connect_hooks++;
+       return 0;
+}
+
+static uint32 FREERDP_CC extension_register_post_connect_hook(rdpExtPlugin* plugin, PFREERDP_EXTENSION_HOOK hook)
+{
+       rdpExtension* ext = (rdpExtension*) plugin->ext;
+
+       if (ext->num_post_connect_hooks >= FREERDP_EXT_MAX_COUNT)
+       {
+               printf("extension_register_post_connect_hook: maximum plugin reached.\n");
+               return 1;
+       }
+
+       ext->post_connect_hooks[ext->num_post_connect_hooks] = hook;
+       ext->post_connect_hooks_instances[ext->num_post_connect_hooks] = plugin;
+       ext->num_post_connect_hooks++;
+
+       return 0;
+}
+
+static int extension_load_plugins(rdpExtension* extension)
+{
+       int i;
+       void* han;
+       char path[256];
+       rdpSettings* settings;
+       PFREERDP_EXTENSION_ENTRY entry;
+       FREERDP_EXTENSION_ENTRY_POINTS entryPoints;
+
+       settings = extension->instance->settings;
+
+       entryPoints.ext = extension;
+       entryPoints.pRegisterExtension = extension_register_plugin;
+       entryPoints.pRegisterPreConnectHook = extension_register_pre_connect_hook;
+       entryPoints.pRegisterPostConnectHook = extension_register_post_connect_hook;
+
+       for (i = 0; settings->extensions[i].name[0]; i++)
+       {
+               if (strchr(settings->extensions[i].name, PATH_SEPARATOR) == NULL)
+                       snprintf(path, sizeof(path), EXT_PATH "/%s." PLUGIN_EXT, settings->extensions[i].name);
+               else
+                       snprintf(path, sizeof(path), "%s", settings->extensions[i].name);
+
+               han = DLOPEN(path);
+               printf("extension_load_plugins: %s\n", path);
+               if (han == NULL)
+               {
+                       printf("extension_load_plugins: failed to load %s\n", path);
+                       continue;
+               }
+
+               entry = (PFREERDP_EXTENSION_ENTRY) DLSYM(han, FREERDP_EXT_EXPORT_FUNC_NAME);
+               if (entry == NULL)
+               {
+                       DLCLOSE(han);
+                       printf("extension_load_plugins: failed to find export function in %s\n", path);
+                       continue;
+               }
+
+               entryPoints.data = extension->instance->settings->extensions[i].data;
+               if (entry(&entryPoints) != 0)
+               {
+                       DLCLOSE(han);
+                       printf("extension_load_plugins: %s entry returns error.\n", path);
+                       continue;
+               }
+       }
+
+       return 0;
+}
+
+static int extension_init_plugins(rdpExtension* extension)
+{
+       int i;
+
+       for (i = 0; i < extension->num_plugins; i++)
+               extension->plugins[i]->init(extension->plugins[i], extension->instance);
+
+       return 0;
+}
+
+static int extension_uninit_plugins(rdpExtension* extension)
+{
+       int i;
+
+       for (i = 0; i < extension->num_plugins; i++)
+               extension->plugins[i]->uninit(extension->plugins[i], extension->instance);
+
+       return 0;
+}
+
+
+int extension_pre_connect(rdpExtension* extension)
+{
+       int i;
+
+       for (i = 0; i < extension->num_pre_connect_hooks; i++)
+               extension->pre_connect_hooks[i](extension->pre_connect_hooks_instances[i], extension->instance);
+
+       return 0;
+}
+
+int extension_post_connect(rdpExtension* ext)
+{
+       int i;
+
+       for (i = 0; i < ext->num_post_connect_hooks; i++)
+               ext->post_connect_hooks[i](ext->post_connect_hooks_instances[i], ext->instance);
+
+       return 0;
+}
+
+rdpExtension* extension_new(freerdp* instance)
+{
+       rdpExtension* extension = NULL;
+
+       if (instance != NULL)
+       {
+               extension = xnew(rdpExtension);
+
+               extension->instance = instance;
+
+               extension_load_plugins(extension);
+               extension_init_plugins(extension);
+       }
+
+       return extension;
+}
+
+void extension_free(rdpExtension* extension)
+{
+       if (extension != NULL)
+       {
+               extension_uninit_plugins(extension);
+               xfree(extension);
+       }
+}
diff --git a/libfreerdp-core/extension.h b/libfreerdp-core/extension.h
new file mode 100644 (file)
index 0000000..35f34cb
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Extension Plugin Interface
+ *
+ * Copyright 2010-2011 Vic Lee
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EXTENSION_H
+#define __EXTENSION_H
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/extension.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#define FREERDP_EXT_MAX_COUNT 16
+
+struct rdp_extension
+{
+       freerdp* instance;
+       rdpExtPlugin* plugins[FREERDP_EXT_MAX_COUNT];
+       int num_plugins;
+       PFREERDP_EXTENSION_HOOK pre_connect_hooks[FREERDP_EXT_MAX_COUNT];
+       rdpExtPlugin* pre_connect_hooks_instances[FREERDP_EXT_MAX_COUNT];
+       int num_pre_connect_hooks;
+       PFREERDP_EXTENSION_HOOK post_connect_hooks[FREERDP_EXT_MAX_COUNT];
+       rdpExtPlugin* post_connect_hooks_instances[FREERDP_EXT_MAX_COUNT];
+       int num_post_connect_hooks;
+};
+typedef struct rdp_extension rdpExtension;
+
+FREERDP_API int extension_pre_connect(rdpExtension* extension);
+FREERDP_API int extension_post_connect(rdpExtension* extension);
+
+FREERDP_API rdpExtension* extension_new(freerdp* instance);
+FREERDP_API void extension_free(rdpExtension* extension);
+
+#endif /* __EXTENSION_H */
+
diff --git a/libfreerdp-core/fastpath.c b/libfreerdp-core/fastpath.c
new file mode 100644 (file)
index 0000000..c915666
--- /dev/null
@@ -0,0 +1,680 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Fast Path
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/api.h>
+#include <freerdp/utils/stream.h>
+
+#include "orders.h"
+#include "per.h"
+#include "update.h"
+#include "surface.h"
+
+#include "fastpath.h"
+
+/**
+ * Fast-Path packet format is defined in [MS-RDPBCGR] 2.2.9.1.2, which revises
+ * server output packets from the first byte with the goal of improving
+ * bandwidth.
+ * 
+ * Slow-Path packet always starts with TPKT header, which has the first
+ * byte 0x03, while Fast-Path packet starts with 2 zero bits in the first
+ * two less significant bits of the first byte.
+ */
+
+#define FASTPATH_MAX_PACKET_SIZE 0x3FFF
+
+/*
+ * The fastpath header may be two or three bytes long.
+ * This function assumes that at least two bytes are available in the stream
+ * and doesn't touch third byte.
+ */
+uint16 fastpath_header_length(STREAM* s)
+{
+       uint8 length1;
+
+       stream_seek_uint8(s);
+       stream_read_uint8(s, length1);
+       stream_rewind(s, 2);
+
+       return ((length1 & 0x80) != 0 ? 3 : 2);
+}
+
+/**
+ * Read a Fast-Path packet header.\n
+ * @param s stream
+ * @param encryptionFlags
+ * @return length
+ */
+uint16 fastpath_read_header(rdpFastPath* fastpath, STREAM* s)
+{
+       uint8 header;
+       uint16 length;
+
+       stream_read_uint8(s, header);
+
+       if (fastpath != NULL)
+       {
+               fastpath->encryptionFlags = (header & 0xC0) >> 6;
+               fastpath->numberEvents = (header & 0x3C) >> 2;
+       }
+
+       per_read_length(s, &length);
+
+       return length;
+}
+
+INLINE void fastpath_read_update_header(STREAM* s, uint8* updateCode, uint8* fragmentation, uint8* compression)
+{
+       uint8 updateHeader;
+
+       stream_read_uint8(s, updateHeader);
+       *updateCode = updateHeader & 0x0F;
+       *fragmentation = (updateHeader >> 4) & 0x03;
+       *compression = (updateHeader >> 6) & 0x03;
+}
+
+INLINE void fastpath_write_update_header(STREAM* s, uint8 updateCode, uint8 fragmentation, uint8 compression)
+{
+       uint8 updateHeader = 0;
+
+       updateHeader |= updateCode & 0x0F;
+       updateHeader |= (fragmentation & 0x03) << 4;
+       updateHeader |= (compression & 0x03) << 6;
+       stream_write_uint8(s, updateHeader);
+}
+
+uint16 fastpath_read_header_rdp(rdpFastPath* fastpath, STREAM* s)
+{
+       uint8 header;
+       uint16 length;
+
+       stream_read_uint8(s, header);
+
+       if (fastpath != NULL)
+       {
+               fastpath->encryptionFlags = (header & 0xC0) >> 6;
+               fastpath->numberEvents = (header & 0x3C) >> 2;
+       }
+
+       per_read_length(s, &length);
+
+       return length - stream_get_length(s);
+}
+
+static void fastpath_recv_orders(rdpFastPath* fastpath, STREAM* s)
+{
+       rdpUpdate* update = fastpath->rdp->update;
+       uint16 numberOrders;
+
+       stream_read_uint16(s, numberOrders); /* numberOrders (2 bytes) */
+
+       while (numberOrders > 0)
+       {
+               update_recv_order(update, s);
+               numberOrders--;
+       }
+}
+
+static void fastpath_recv_update_common(rdpFastPath* fastpath, STREAM* s)
+{
+       uint16 updateType;
+       rdpUpdate* update = fastpath->rdp->update;
+       rdpContext* context = update->context;
+
+       stream_read_uint16(s, updateType); /* updateType (2 bytes) */
+
+       switch (updateType)
+       {
+               case UPDATE_TYPE_BITMAP:
+                       update_read_bitmap(update, s, &update->bitmap_update);
+                       IFCALL(update->BitmapUpdate, context, &update->bitmap_update);
+                       break;
+
+               case UPDATE_TYPE_PALETTE:
+                       update_read_palette(update, s, &update->palette_update);
+                       IFCALL(update->Palette, context, &update->palette_update);
+                       break;
+       }
+}
+
+static void fastpath_recv_update_synchronize(rdpFastPath* fastpath, STREAM* s)
+{
+       stream_seek_uint16(s); /* size (2 bytes), must be set to zero */
+}
+
+static void fastpath_recv_update(rdpFastPath* fastpath, uint8 updateCode, uint32 size, STREAM* s)
+{
+       rdpUpdate* update = fastpath->rdp->update;
+       rdpContext* context = fastpath->rdp->update->context;
+       rdpPointerUpdate* pointer = update->pointer;
+
+       switch (updateCode)
+       {
+               case FASTPATH_UPDATETYPE_ORDERS:
+                       fastpath_recv_orders(fastpath, s);
+                       break;
+
+               case FASTPATH_UPDATETYPE_BITMAP:
+               case FASTPATH_UPDATETYPE_PALETTE:
+                       fastpath_recv_update_common(fastpath, s);
+                       break;
+
+               case FASTPATH_UPDATETYPE_SYNCHRONIZE:
+                       fastpath_recv_update_synchronize(fastpath, s);
+                       IFCALL(update->Synchronize, context);
+                       break;
+
+               case FASTPATH_UPDATETYPE_SURFCMDS:
+                       update_recv_surfcmds(update, size, s);
+                       break;
+
+               case FASTPATH_UPDATETYPE_PTR_NULL:
+                       pointer->pointer_system.type = SYSPTR_NULL;
+                       IFCALL(pointer->PointerSystem, context, &pointer->pointer_system);
+                       break;
+
+               case FASTPATH_UPDATETYPE_PTR_DEFAULT:
+                       update->pointer->pointer_system.type = SYSPTR_DEFAULT;
+                       IFCALL(pointer->PointerSystem, context, &pointer->pointer_system);
+                       break;
+
+               case FASTPATH_UPDATETYPE_PTR_POSITION:
+                       update_read_pointer_position(s, &pointer->pointer_position);
+                       IFCALL(pointer->PointerPosition, context, &pointer->pointer_position);
+                       break;
+
+               case FASTPATH_UPDATETYPE_COLOR:
+                       update_read_pointer_color(s, &pointer->pointer_color);
+                       IFCALL(pointer->PointerColor, context, &pointer->pointer_color);
+                       break;
+
+               case FASTPATH_UPDATETYPE_CACHED:
+                       update_read_pointer_cached(s, &pointer->pointer_cached);
+                       IFCALL(pointer->PointerCached, context, &pointer->pointer_cached);
+                       break;
+
+               case FASTPATH_UPDATETYPE_POINTER:
+                       update_read_pointer_new(s, &pointer->pointer_new);
+                       IFCALL(pointer->PointerNew, context, &pointer->pointer_new);
+                       break;
+
+               default:
+                       DEBUG_WARN("unknown updateCode 0x%X", updateCode);
+                       break;
+       }
+}
+
+static void fastpath_recv_update_data(rdpFastPath* fastpath, STREAM* s)
+{
+       uint16 size;
+       int next_pos;
+       uint32 totalSize;
+       uint8 updateCode;
+       uint8 fragmentation;
+       uint8 compression;
+       uint8 compressionFlags;
+       STREAM* update_stream;
+       STREAM* comp_stream;
+       rdpRdp  *rdp;
+       uint32 roff;
+       uint32 rlen;
+
+       rdp = fastpath->rdp;
+
+       fastpath_read_update_header(s, &updateCode, &fragmentation, &compression);
+
+       if (compression == FASTPATH_OUTPUT_COMPRESSION_USED)
+               stream_read_uint8(s, compressionFlags);
+       else
+               compressionFlags = 0;
+
+       stream_read_uint16(s, size);
+       next_pos = stream_get_pos(s) + size;
+       comp_stream = s;
+
+       if (compressionFlags & PACKET_COMPRESSED)
+       {
+               if (decompress_rdp(rdp, s->p, size, compressionFlags, &roff, &rlen))
+               {
+                       comp_stream = stream_new(0);
+                       comp_stream->data = rdp->mppc->history_buf + roff;
+                       comp_stream->p = comp_stream->data;
+                       comp_stream->size = rlen;
+                       size = comp_stream->size;
+               }
+               else
+               {
+                       printf("decompress_rdp() failed\n");
+                       stream_seek(s, size);
+               }
+       }
+
+       update_stream = NULL;
+       if (fragmentation == FASTPATH_FRAGMENT_SINGLE)
+       {
+               totalSize = size;
+               update_stream = comp_stream;
+       }
+       else
+       {
+               if (fragmentation == FASTPATH_FRAGMENT_FIRST)
+                       stream_set_pos(fastpath->updateData, 0);
+
+               stream_check_size(fastpath->updateData, size);
+               stream_copy(fastpath->updateData, comp_stream, size);
+
+               if (fragmentation == FASTPATH_FRAGMENT_LAST)
+               {
+                       update_stream = fastpath->updateData;
+                       totalSize = stream_get_length(update_stream);
+                       stream_set_pos(update_stream, 0);
+               }
+       }
+
+       if (update_stream)
+               fastpath_recv_update(fastpath, updateCode, totalSize, update_stream);
+
+       stream_set_pos(s, next_pos);
+
+       if (comp_stream != s)
+               xfree(comp_stream);
+}
+
+boolean fastpath_recv_updates(rdpFastPath* fastpath, STREAM* s)
+{
+       rdpUpdate* update = fastpath->rdp->update;
+
+       IFCALL(update->BeginPaint, update->context);
+
+       while (stream_get_left(s) >= 3)
+       {
+               fastpath_recv_update_data(fastpath, s);
+       }
+
+       IFCALL(update->EndPaint, update->context);
+
+       return true;
+}
+
+static boolean fastpath_read_input_event_header(STREAM* s, uint8* eventFlags, uint8* eventCode)
+{
+       uint8 eventHeader;
+
+       if (stream_get_left(s) < 1)
+               return false;
+
+       stream_read_uint8(s, eventHeader); /* eventHeader (1 byte) */
+
+       *eventFlags = (eventHeader & 0x1F);
+       *eventCode = (eventHeader >> 5);
+
+       return true;
+}
+
+static boolean fastpath_recv_input_event_scancode(rdpFastPath* fastpath, STREAM* s, uint8 eventFlags)
+{
+       uint16 flags;
+       uint16 code;
+
+       if (stream_get_left(s) < 1)
+               return false;
+
+       stream_read_uint8(s, code); /* keyCode (1 byte) */
+
+       flags = 0;
+       if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
+               flags |= KBD_FLAGS_RELEASE;
+       else
+               flags |= KBD_FLAGS_DOWN;
+
+       if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_EXTENDED))
+               flags |= KBD_FLAGS_EXTENDED;
+
+       IFCALL(fastpath->rdp->input->KeyboardEvent, fastpath->rdp->input, flags, code);
+
+       return true;
+}
+
+static boolean fastpath_recv_input_event_mouse(rdpFastPath* fastpath, STREAM* s, uint8 eventFlags)
+{
+       uint16 pointerFlags;
+       uint16 xPos;
+       uint16 yPos;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_read_uint16(s, pointerFlags); /* pointerFlags (2 bytes) */
+       stream_read_uint16(s, xPos); /* xPos (2 bytes) */
+       stream_read_uint16(s, yPos); /* yPos (2 bytes) */
+
+       IFCALL(fastpath->rdp->input->MouseEvent, fastpath->rdp->input, pointerFlags, xPos, yPos);
+
+       return true;
+}
+
+static boolean fastpath_recv_input_event_mousex(rdpFastPath* fastpath, STREAM* s, uint8 eventFlags)
+{
+       uint16 pointerFlags;
+       uint16 xPos;
+       uint16 yPos;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_read_uint16(s, pointerFlags); /* pointerFlags (2 bytes) */
+       stream_read_uint16(s, xPos); /* xPos (2 bytes) */
+       stream_read_uint16(s, yPos); /* yPos (2 bytes) */
+
+       IFCALL(fastpath->rdp->input->ExtendedMouseEvent, fastpath->rdp->input, pointerFlags, xPos, yPos);
+
+       return true;
+}
+
+static boolean fastpath_recv_input_event_sync(rdpFastPath* fastpath, STREAM* s, uint8 eventFlags)
+{
+       IFCALL(fastpath->rdp->input->SynchronizeEvent, fastpath->rdp->input, eventFlags);
+
+       return true;
+}
+
+static boolean fastpath_recv_input_event_unicode(rdpFastPath* fastpath, STREAM* s, uint8 eventFlags)
+{
+       uint16 unicodeCode;
+       uint16 flags;
+
+       if (stream_get_left(s) < 2)
+               return false;
+
+       stream_read_uint16(s, unicodeCode); /* unicodeCode (2 bytes) */
+
+       flags = 0;
+       if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
+               flags |= KBD_FLAGS_RELEASE;
+       else
+               flags |= KBD_FLAGS_DOWN;
+
+       IFCALL(fastpath->rdp->input->UnicodeKeyboardEvent, fastpath->rdp->input, flags, unicodeCode);
+
+       return true;
+}
+
+static boolean fastpath_recv_input_event(rdpFastPath* fastpath, STREAM* s)
+{
+       uint8 eventFlags;
+       uint8 eventCode;
+
+       if (!fastpath_read_input_event_header(s, &eventFlags, &eventCode))
+               return false;
+
+       switch (eventCode)
+       {
+               case FASTPATH_INPUT_EVENT_SCANCODE:
+                       if (!fastpath_recv_input_event_scancode(fastpath, s, eventFlags))
+                               return false;
+                       break;
+
+               case FASTPATH_INPUT_EVENT_MOUSE:
+                       if (!fastpath_recv_input_event_mouse(fastpath, s, eventFlags))
+                               return false;
+                       break;
+
+               case FASTPATH_INPUT_EVENT_MOUSEX:
+                       if (!fastpath_recv_input_event_mousex(fastpath, s, eventFlags))
+                               return false;
+                       break;
+
+               case FASTPATH_INPUT_EVENT_SYNC:
+                       if (!fastpath_recv_input_event_sync(fastpath, s, eventFlags))
+                               return false;
+                       break;
+
+               case FASTPATH_INPUT_EVENT_UNICODE:
+                       if (!fastpath_recv_input_event_unicode(fastpath, s, eventFlags))
+                               return false;
+                       break;
+
+               default:
+                       printf("Unknown eventCode %d\n", eventCode);
+                       break;
+       }
+
+       return true;
+}
+
+boolean fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s)
+{
+       uint8 i;
+
+       if (fastpath->numberEvents == 0)
+       {
+               /**
+                * If numberEvents is not provided in fpInputHeader, it will be provided
+                * as one additional byte here.
+                */
+
+               if (stream_get_left(s) < 1)
+                       return false;
+
+               stream_read_uint8(s, fastpath->numberEvents); /* eventHeader (1 byte) */
+       }
+
+       for (i = 0; i < fastpath->numberEvents; i++)
+       {
+               if (!fastpath_recv_input_event(fastpath, s))
+                       return false;
+       }
+
+       return true;
+}
+
+static uint32 fastpath_get_sec_bytes(rdpRdp* rdp)
+{
+       uint32 sec_bytes;
+
+       if (rdp->do_crypt)
+       {
+               sec_bytes = 8;
+               if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+                       sec_bytes += 4;
+       }
+       else
+               sec_bytes = 0;
+       return sec_bytes;
+}
+
+STREAM* fastpath_input_pdu_init(rdpFastPath* fastpath, uint8 eventFlags, uint8 eventCode)
+{
+       rdpRdp *rdp;
+       STREAM* s;
+
+       rdp = fastpath->rdp;
+
+       s = transport_send_stream_init(rdp->transport, 256);
+       stream_seek(s, 3); /* fpInputHeader, length1 and length2 */
+       if (rdp->do_crypt) {
+               rdp->sec_flags |= SEC_ENCRYPT;
+               if (rdp->do_secure_checksum)
+                       rdp->sec_flags |= SEC_SECURE_CHECKSUM;
+       }
+       stream_seek(s, fastpath_get_sec_bytes(rdp));
+       stream_write_uint8(s, eventFlags | (eventCode << 5)); /* eventHeader (1 byte) */
+       return s;
+}
+
+boolean fastpath_send_input_pdu(rdpFastPath* fastpath, STREAM* s)
+{
+       rdpRdp *rdp;
+       uint16 length;
+       uint8 eventHeader;
+       int sec_bytes;
+
+       rdp = fastpath->rdp;
+
+       length = stream_get_length(s);
+       if (length > 127)
+       {
+               printf("Maximum FastPath PDU length is 127\n");
+               return false;
+       }
+
+       eventHeader = FASTPATH_INPUT_ACTION_FASTPATH;
+       eventHeader |= (1 << 2); /* numberEvents */
+       if (rdp->sec_flags & SEC_ENCRYPT)
+               eventHeader |= (FASTPATH_INPUT_ENCRYPTED << 6);
+       if (rdp->sec_flags & SEC_SECURE_CHECKSUM)
+               eventHeader |= (FASTPATH_INPUT_SECURE_CHECKSUM << 6);
+
+       stream_set_pos(s, 0);
+       stream_write_uint8(s, eventHeader);
+       sec_bytes = fastpath_get_sec_bytes(fastpath->rdp);
+       /*
+        * We always encode length in two bytes, eventhough we could use
+        * only one byte if length <= 0x7F. It is just easier that way,
+        * because we can leave room for fixed-length header, store all
+        * the data first and then store the header.
+        */
+       stream_write_uint16_be(s, 0x8000 | (length + sec_bytes));
+
+       if (sec_bytes > 0)
+       {
+               uint8* ptr;
+
+               ptr = stream_get_tail(s) + sec_bytes;
+               if (rdp->sec_flags & SEC_SECURE_CHECKSUM)
+                       security_salted_mac_signature(rdp, ptr, length - 3, true, stream_get_tail(s));
+               else
+                       security_mac_signature(rdp, ptr, length - 3, stream_get_tail(s));
+               security_encrypt(ptr, length - 3, rdp);
+       }
+
+       rdp->sec_flags = 0;
+
+       stream_set_pos(s, length + sec_bytes);
+       if (transport_write(fastpath->rdp->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+STREAM* fastpath_update_pdu_init(rdpFastPath* fastpath)
+{
+       STREAM* s;
+       s = transport_send_stream_init(fastpath->rdp->transport, FASTPATH_MAX_PACKET_SIZE);
+       stream_seek(s, 3); /* fpOutputHeader, length1 and length2 */
+       stream_seek(s, fastpath_get_sec_bytes(fastpath->rdp));
+       stream_seek(s, 3); /* updateHeader, size */
+       return s;
+}
+
+boolean fastpath_send_update_pdu(rdpFastPath* fastpath, uint8 updateCode, STREAM* s)
+{
+       rdpRdp *rdp;
+       uint8* bm;
+       uint8* ptr;
+       int fragment;
+       int sec_bytes;
+       uint16 length;
+       boolean result;
+       uint16 pduLength;
+       uint16 maxLength;
+       uint32 totalLength;
+       uint8 fragmentation;
+       uint8 header;
+       STREAM* update;
+
+       result = true;
+
+       rdp = fastpath->rdp;
+       sec_bytes = fastpath_get_sec_bytes(rdp);
+       maxLength = FASTPATH_MAX_PACKET_SIZE - 6 - sec_bytes;
+       totalLength = stream_get_length(s) - 6 - sec_bytes;
+       stream_set_pos(s, 0);
+       update = stream_new(0);
+
+       for (fragment = 0; totalLength > 0; fragment++)
+       {
+               length = MIN(maxLength, totalLength);
+               totalLength -= length;
+               pduLength = length + 6 + sec_bytes;
+
+               if (totalLength == 0)
+                       fragmentation = (fragment == 0) ? FASTPATH_FRAGMENT_SINGLE : FASTPATH_FRAGMENT_LAST;
+               else
+                       fragmentation = (fragment == 0) ? FASTPATH_FRAGMENT_FIRST : FASTPATH_FRAGMENT_NEXT;
+
+               stream_get_mark(s, bm);
+               header = 0;
+               if (sec_bytes > 0)
+                       header |= (FASTPATH_OUTPUT_ENCRYPTED << 6);
+               stream_write_uint8(s, header); /* fpOutputHeader (1 byte) */
+               stream_write_uint8(s, 0x80 | (pduLength >> 8)); /* length1 */
+               stream_write_uint8(s, pduLength & 0xFF); /* length2 */
+               if (sec_bytes > 0)
+                       stream_seek(s, sec_bytes);
+               fastpath_write_update_header(s, updateCode, fragmentation, 0);
+               stream_write_uint16(s, length);
+
+               stream_attach(update, bm, pduLength);
+               stream_seek(update, pduLength);
+               if (sec_bytes > 0)
+               {
+                       ptr = bm + 3 + sec_bytes;
+                       if (rdp->sec_flags & SEC_SECURE_CHECKSUM)
+                               security_salted_mac_signature(rdp, ptr, length + 3, true, bm + 3);
+                       else
+                               security_mac_signature(rdp, ptr, length + 3, bm + 3);
+                       security_encrypt(ptr, length + 3, rdp);
+               }
+               if (transport_write(fastpath->rdp->transport, update) < 0)
+               {
+                       stream_detach(update);
+                       result = false;
+                       break;
+               }
+               stream_detach(update);
+
+               /* Reserve 6+sec_bytes bytes for the next fragment header, if any. */
+               stream_seek(s, length - 6 - sec_bytes);
+       }
+
+       stream_free(update);
+
+       return result;
+}
+
+rdpFastPath* fastpath_new(rdpRdp* rdp)
+{
+       rdpFastPath* fastpath;
+
+       fastpath = xnew(rdpFastPath);
+       fastpath->rdp = rdp;
+       fastpath->updateData = stream_new(4096);
+
+       return fastpath;
+}
+
+void fastpath_free(rdpFastPath* fastpath)
+{
+       stream_free(fastpath->updateData);
+       xfree(fastpath);
+}
diff --git a/libfreerdp-core/fastpath.h b/libfreerdp-core/fastpath.h
new file mode 100644 (file)
index 0000000..428ce55
--- /dev/null
@@ -0,0 +1,122 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Fast Path
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __FASTPATH_H
+#define __FASTPATH_H
+
+#include "rdp.h"
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_fastpath rdpFastPath;
+
+enum FASTPATH_INPUT_ACTION_TYPE
+{
+       FASTPATH_INPUT_ACTION_FASTPATH = 0x0,
+       FASTPATH_INPUT_ACTION_X224 = 0x3
+};
+
+enum FASTPATH_OUTPUT_ACTION_TYPE
+{
+       FASTPATH_OUTPUT_ACTION_FASTPATH = 0x0,
+       FASTPATH_OUTPUT_ACTION_X224 = 0x3
+};
+
+enum FASTPATH_INPUT_ENCRYPTION_FLAGS
+{
+       FASTPATH_INPUT_SECURE_CHECKSUM = 0x1,
+       FASTPATH_INPUT_ENCRYPTED = 0x2
+};
+
+enum FASTPATH_OUTPUT_ENCRYPTION_FLAGS
+{
+       FASTPATH_OUTPUT_SECURE_CHECKSUM = 0x1,
+       FASTPATH_OUTPUT_ENCRYPTED = 0x2
+};
+
+enum FASTPATH_UPDATETYPE
+{
+       FASTPATH_UPDATETYPE_ORDERS = 0x0,
+       FASTPATH_UPDATETYPE_BITMAP = 0x1,
+       FASTPATH_UPDATETYPE_PALETTE = 0x2,
+       FASTPATH_UPDATETYPE_SYNCHRONIZE = 0x3,
+       FASTPATH_UPDATETYPE_SURFCMDS = 0x4,
+       FASTPATH_UPDATETYPE_PTR_NULL = 0x5,
+       FASTPATH_UPDATETYPE_PTR_DEFAULT = 0x6,
+       FASTPATH_UPDATETYPE_PTR_POSITION = 0x8,
+       FASTPATH_UPDATETYPE_COLOR = 0x9,
+       FASTPATH_UPDATETYPE_CACHED = 0xA,
+       FASTPATH_UPDATETYPE_POINTER = 0xB
+};
+
+enum FASTPATH_FRAGMENT
+{
+       FASTPATH_FRAGMENT_SINGLE = 0x0,
+       FASTPATH_FRAGMENT_LAST = 0x1,
+       FASTPATH_FRAGMENT_FIRST = 0x2,
+       FASTPATH_FRAGMENT_NEXT = 0x3
+};
+
+enum FASTPATH_OUTPUT_COMPRESSION
+{
+       FASTPATH_OUTPUT_COMPRESSION_USED = 0x2
+};
+
+/* FastPath Input Events */
+enum FASTPATH_INPUT_EVENT_CODE
+{
+       FASTPATH_INPUT_EVENT_SCANCODE = 0x0,
+       FASTPATH_INPUT_EVENT_MOUSE = 0x1,
+       FASTPATH_INPUT_EVENT_MOUSEX = 0x2,
+       FASTPATH_INPUT_EVENT_SYNC = 0x3,
+       FASTPATH_INPUT_EVENT_UNICODE = 0x4
+};
+
+/* FastPath Keyboard Event Flags */
+enum FASTPATH_INPUT_KBDFLAGS
+{
+       FASTPATH_INPUT_KBDFLAGS_RELEASE = 0x01,
+       FASTPATH_INPUT_KBDFLAGS_EXTENDED = 0x02
+};
+
+struct rdp_fastpath
+{
+       rdpRdp* rdp;
+       uint8 encryptionFlags;
+       uint8 numberEvents;
+       STREAM* updateData;
+};
+
+uint16 fastpath_header_length(STREAM* s);
+uint16 fastpath_read_header(rdpFastPath* fastpath, STREAM* s);
+uint16 fastpath_read_header_rdp(rdpFastPath* fastpath, STREAM* s);
+boolean fastpath_recv_updates(rdpFastPath* fastpath, STREAM* s);
+boolean fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s);
+
+STREAM* fastpath_input_pdu_init(rdpFastPath* fastpath, uint8 eventFlags, uint8 eventCode);
+boolean fastpath_send_input_pdu(rdpFastPath* fastpath, STREAM* s);
+
+STREAM* fastpath_update_pdu_init(rdpFastPath* fastpath);
+boolean fastpath_send_update_pdu(rdpFastPath* fastpath, uint8 updateCode, STREAM* s);
+
+boolean fastpath_send_surfcmd_frame_marker(rdpFastPath* fastpath, uint16 frameAction, uint32 frameId);
+
+rdpFastPath* fastpath_new(rdpRdp* rdp);
+void fastpath_free(rdpFastPath* fastpath);
+
+#endif
diff --git a/libfreerdp-core/freerdp.c b/libfreerdp-core/freerdp.c
new file mode 100644 (file)
index 0000000..3109822
--- /dev/null
@@ -0,0 +1,229 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Core
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rdp.h"
+#include "input.h"
+#include "update.h"
+#include "surface.h"
+#include "transport.h"
+#include "connection.h"
+#include "extension.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/memory.h>
+
+boolean freerdp_connect(freerdp* instance)
+{
+       rdpRdp* rdp;
+       boolean status = false;
+
+       rdp = instance->context->rdp;
+
+       extension_pre_connect(rdp->extension);
+
+       IFCALLRET(instance->PreConnect, status, instance);
+
+       if (status != true)
+       {
+               printf("freerdp_pre_connect failed\n");
+               return false;
+       }
+
+       status = rdp_client_connect(rdp);
+
+       if (status)
+       {
+               if (instance->settings->dump_rfx)
+               {
+                       instance->update->pcap_rfx = pcap_open(instance->settings->dump_rfx_file, true);
+                       if (instance->update->pcap_rfx)
+                               instance->update->dump_rfx = true;
+               }
+
+               extension_post_connect(rdp->extension);
+
+               IFCALLRET(instance->PostConnect, status, instance);
+
+               if (status != true)
+               {
+                       printf("freerdp_post_connect failed\n");
+                       return false;
+               }
+
+               if (instance->settings->play_rfx)
+               {
+                       STREAM* s;
+                       rdpUpdate* update;
+                       pcap_record record;
+
+                       s = stream_new(1024);
+                       instance->update->pcap_rfx = pcap_open(instance->settings->play_rfx_file, false);
+                       if (instance->update->pcap_rfx)
+                               instance->update->play_rfx = true;
+                       update = instance->update;
+
+                       while (instance->update->play_rfx && pcap_has_next_record(update->pcap_rfx))
+                       {
+                               pcap_get_next_record_header(update->pcap_rfx, &record);
+
+                               s->data = xrealloc(s->data, record.length);
+                               record.data = s->data;
+                               s->size = record.length;
+
+                               pcap_get_next_record_content(update->pcap_rfx, &record);
+                               stream_set_pos(s, 0);
+
+                               update->BeginPaint(update->context);
+                               update_recv_surfcmds(update, s->size, s);
+                               update->EndPaint(update->context);
+                       }
+
+                       xfree(s->data);
+                       return true;
+               }
+       }
+
+       return status;
+}
+
+boolean freerdp_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount)
+{
+       rdpRdp* rdp;
+
+       rdp = instance->context->rdp;
+       transport_get_fds(rdp->transport, rfds, rcount);
+
+       return true;
+}
+
+boolean freerdp_check_fds(freerdp* instance)
+{
+       int status;
+       rdpRdp* rdp;
+
+       rdp = instance->context->rdp;
+
+       status = rdp_check_fds(rdp);
+
+       if (status < 0)
+               return false;
+
+       return true;
+}
+
+void freerdp_send_keep_alive(freerdp* instance)
+{
+       input_send_synchronize_event(instance->context->rdp->input, 0);
+}
+
+static int freerdp_send_channel_data(freerdp* instance, int channel_id, uint8* data, int size)
+{
+       return rdp_send_channel_data(instance->context->rdp, channel_id, data, size);
+}
+
+boolean freerdp_disconnect(freerdp* instance)
+{
+       rdpRdp* rdp;
+
+       rdp = instance->context->rdp;
+       transport_disconnect(rdp->transport);
+
+       return true;
+}
+
+boolean freerdp_shall_disconnect(freerdp* instance)
+{
+
+       return instance->context->rdp->disconnect;
+}
+
+void freerdp_get_version(int* major, int* minor, int* revision)
+{
+       if (major != NULL)
+               *major = FREERDP_VERSION_MAJOR;
+
+       if (minor != NULL)
+               *minor = FREERDP_VERSION_MINOR;
+
+       if (revision != NULL)
+               *revision = FREERDP_VERSION_REVISION;
+}
+
+void freerdp_context_new(freerdp* instance)
+{
+       rdpRdp* rdp;
+
+       rdp = rdp_new(instance);
+       instance->input = rdp->input;
+       instance->update = rdp->update;
+       instance->settings = rdp->settings;
+
+       instance->context = (rdpContext*) xzalloc(instance->context_size);
+       instance->context->graphics = graphics_new(instance->context);
+       instance->context->instance = instance;
+       instance->context->rdp = rdp;
+
+       instance->update->context = instance->context;
+       instance->update->pointer->context = instance->context;
+       instance->update->primary->context = instance->context;
+       instance->update->secondary->context = instance->context;
+       instance->update->altsec->context = instance->context;
+
+       instance->input->context = instance->context;
+
+       IFCALL(instance->ContextNew, instance, instance->context);
+}
+
+void freerdp_context_free(freerdp* instance)
+{
+       IFCALL(instance->ContextFree, instance, instance->context);
+
+       rdp_free(instance->context->rdp);
+       graphics_free(instance->context->graphics);
+       xfree(instance->context);
+}
+
+uint32 freerdp_error_info(freerdp* instance)
+{
+       return instance->context->rdp->errorInfo;
+}
+
+freerdp* freerdp_new()
+{
+       freerdp* instance;
+
+       instance = xzalloc(sizeof(freerdp));
+
+       if (instance != NULL)
+       {
+               instance->context_size = sizeof(rdpContext);
+               instance->SendChannelData = freerdp_send_channel_data;
+       }
+
+       return instance;
+}
+
+void freerdp_free(freerdp* freerdp)
+{
+       if (freerdp)
+       {
+               freerdp_context_free(freerdp);
+               xfree(freerdp);
+       }
+}
diff --git a/libfreerdp-core/gcc.c b/libfreerdp-core/gcc.c
new file mode 100644 (file)
index 0000000..ebea2d4
--- /dev/null
@@ -0,0 +1,1169 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.124 Generic Conference Control (GCC)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/print.h>
+
+#include "gcc.h"
+#include "certificate.h"
+
+/**
+ * T.124 GCC is defined in:
+ *
+ * http://www.itu.int/rec/T-REC-T.124-199802-S/en
+ * ITU-T T.124 (02/98): Generic Conference Control
+ */
+
+/**
+ * ConnectData ::= SEQUENCE
+ * {
+ *     t124Identifier  Key,
+ *     connectPDU      OCTET_STRING
+ * }
+ *
+ * Key ::= CHOICE
+ * {
+ *     object                          OBJECT_IDENTIFIER,
+ *     h221NonStandard                 H221NonStandardIdentifier
+ * }
+ *
+ * ConnectGCCPDU ::= CHOICE
+ * {
+ *     conferenceCreateRequest         ConferenceCreateRequest,
+ *     conferenceCreateResponse        ConferenceCreateResponse,
+ *     conferenceQueryRequest          ConferenceQueryRequest,
+ *     conferenceQueryResponse         ConferenceQueryResponse,
+ *     conferenceJoinRequest           ConferenceJoinRequest,
+ *     conferenceJoinResponse          ConferenceJoinResponse,
+ *     conferenceInviteRequest         ConferenceInviteRequest,
+ *     conferenceInviteResponse        ConferenceInviteResponse,
+ *     ...
+ * }
+ *
+ * ConferenceCreateRequest ::= SEQUENCE
+ * {
+ *     conferenceName                  ConferenceName,
+ *     convenerPassword                Password OPTIONAL,
+ *     password                        Password OPTIONAL,
+ *     lockedConference                BOOLEAN,
+ *     listedConference                BOOLEAN,
+ *     conductibleConference           BOOLEAN,
+ *     terminationMethod               TerminationMethod,
+ *     conductorPrivileges             SET OF Privilege OPTIONAL,
+ *     conductedPrivileges             SET OF Privilege OPTIONAL,
+ *     nonConductedPrivileges          SET OF Privilege OPTIONAL,
+ *     conferenceDescription           TextString OPTIONAL,
+ *     callerIdentifier                TextString OPTIONAL,
+ *     userData                        UserData OPTIONAL,
+ *     ...,
+ *     conferencePriority              ConferencePriority OPTIONAL,
+ *     conferenceMode                  ConferenceMode OPTIONAL
+ * }
+ *
+ * ConferenceCreateResponse ::= SEQUENCE
+ * {
+ *     nodeID                          UserID,
+ *     tag                             INTEGER,
+ *     result                          ENUMERATED
+ *     {
+ *             success                         (0),
+ *             userRejected                    (1),
+ *             resourcesNotAvailable           (2),
+ *             rejectedForSymmetryBreaking     (3),
+ *             lockedConferenceNotSupported    (4)
+ *     },
+ *     userData                        UserData OPTIONAL,
+ *     ...
+ * }
+ *
+ * ConferenceName ::= SEQUENCE
+ * {
+ *     numeric                         SimpleNumericString
+ *     text                            SimpleTextString OPTIONAL,
+ *     ...
+ * }
+ *
+ * SimpleNumericString ::= NumericString (SIZE (1..255)) (FROM ("0123456789"))
+ *
+ * UserData ::= SET OF SEQUENCE
+ * {
+ *     key                             Key,
+ *     value                           OCTET_STRING OPTIONAL
+ * }
+ *
+ * H221NonStandardIdentifier ::= OCTET STRING (SIZE (4..255))
+ *
+ * UserID ::= DynamicChannelID
+ *
+ * ChannelID ::= INTEGER (1..65535)
+ * StaticChannelID ::= INTEGER (1..1000)
+ * DynamicChannelID ::= INTEGER (1001..65535)
+ *
+ */
+
+/*
+ * OID = 0.0.20.124.0.1
+ * { itu-t(0) recommendation(0) t(20) t124(124) version(0) 1 }
+ * v.1 of ITU-T Recommendation T.124 (Feb 1998): "Generic Conference Control"
+ */
+uint8 t124_02_98_oid[6] = { 0, 0, 20, 124, 0, 1 };
+
+uint8 h221_cs_key[4] = "Duca";
+uint8 h221_sc_key[4] = "McDn";
+
+/**
+ * Read a GCC Conference Create Request.\n
+ * @msdn{cc240836}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+boolean gcc_read_conference_create_request(STREAM* s, rdpSettings* settings)
+{
+       uint16 length;
+       uint8 choice;
+       uint8 number;
+       uint8 selection;
+
+       /* ConnectData */
+       if (!per_read_choice(s, &choice))
+               return false;
+       if (!per_read_object_identifier(s, t124_02_98_oid))
+               return false;
+
+       /* ConnectData::connectPDU (OCTET_STRING) */
+       if (!per_read_length(s, &length))
+               return false;
+
+       /* ConnectGCCPDU */
+       if (!per_read_choice(s, &choice))
+               return false;
+       if (!per_read_selection(s, &selection))
+               return false;
+
+       /* ConferenceCreateRequest::conferenceName */
+       if (!per_read_numeric_string(s, 1)) /* ConferenceName::numeric */
+               return false;
+       if (!per_read_padding(s, 1)) /* padding */
+               return false;
+
+       /* UserData (SET OF SEQUENCE) */
+       if (!per_read_number_of_sets(s, &number) || number != 1) /* one set of UserData */
+               return false;
+       if (!per_read_choice(s, &choice) || choice != 0xC0) /* UserData::value present + select h221NonStandard (1) */
+               return false;
+
+       /* h221NonStandard */
+       if (!per_read_octet_string(s, h221_cs_key, 4, 4)) /* h221NonStandard, client-to-server H.221 key, "Duca" */
+               return false;
+
+       /* userData::value (OCTET_STRING) */
+       if (!per_read_length(s, &length))
+               return false;
+       if (stream_get_left(s) < length)
+               return false;
+       if (!gcc_read_client_data_blocks(s, settings, length))
+               return false;
+
+       return true;
+}
+
+/**
+ * Write a GCC Conference Create Request.\n
+ * @msdn{cc240836}
+ * @param s stream
+ * @param user_data client data blocks
+ */
+
+void gcc_write_conference_create_request(STREAM* s, STREAM* user_data)
+{
+       /* ConnectData */
+       per_write_choice(s, 0); /* From Key select object (0) of type OBJECT_IDENTIFIER */
+       per_write_object_identifier(s, t124_02_98_oid); /* ITU-T T.124 (02/98) OBJECT_IDENTIFIER */
+
+       /* ConnectData::connectPDU (OCTET_STRING) */
+       per_write_length(s, stream_get_length(user_data) + 14); /* connectPDU length */
+
+       /* ConnectGCCPDU */
+       per_write_choice(s, 0); /* From ConnectGCCPDU select conferenceCreateRequest (0) of type ConferenceCreateRequest */
+       per_write_selection(s, 0x08); /* select optional userData from ConferenceCreateRequest */
+
+       /* ConferenceCreateRequest::conferenceName */
+       per_write_numeric_string(s, (uint8*)"1", 1, 1); /* ConferenceName::numeric */
+       per_write_padding(s, 1); /* padding */
+
+       /* UserData (SET OF SEQUENCE) */
+       per_write_number_of_sets(s, 1); /* one set of UserData */
+       per_write_choice(s, 0xC0); /* UserData::value present + select h221NonStandard (1) */
+
+       /* h221NonStandard */
+       per_write_octet_string(s, h221_cs_key, 4, 4); /* h221NonStandard, client-to-server H.221 key, "Duca" */
+
+       /* userData::value (OCTET_STRING) */
+       per_write_octet_string(s, user_data->data, stream_get_length(user_data), 0); /* array of client data blocks */
+}
+
+boolean gcc_read_conference_create_response(STREAM* s, rdpSettings* settings)
+{
+       uint16 length;
+       uint32 tag;
+       uint16 nodeID;
+       uint8 result;
+       uint8 choice;
+       uint8 number;
+
+       /* ConnectData */
+       per_read_choice(s, &choice);
+       per_read_object_identifier(s, t124_02_98_oid);
+
+       /* ConnectData::connectPDU (OCTET_STRING) */
+       per_read_length(s, &length);
+
+       /* ConnectGCCPDU */
+       per_read_choice(s, &choice);
+
+       /* ConferenceCreateResponse::nodeID (UserID) */
+       per_read_integer16(s, &nodeID, 1001);
+
+       /* ConferenceCreateResponse::tag (INTEGER) */
+       per_read_integer(s, &tag);
+
+       /* ConferenceCreateResponse::result (ENUMERATED) */
+       per_read_enumerated(s, &result, MCS_Result_enum_length);
+
+       /* number of UserData sets */
+       per_read_number_of_sets(s, &number);
+
+       /* UserData::value present + select h221NonStandard (1) */
+       per_read_choice(s, &choice);
+
+       /* h221NonStandard */
+       if (!per_read_octet_string(s, h221_sc_key, 4, 4)) /* h221NonStandard, server-to-client H.221 key, "McDn" */
+               return false;
+
+       /* userData (OCTET_STRING) */
+       per_read_length(s, &length);
+       if (!gcc_read_server_data_blocks(s, settings, length))
+       {
+               printf("gcc_read_conference_create_response: gcc_read_server_data_blocks failed\n");
+               return false;
+       }
+
+       return true;
+}
+
+void gcc_write_conference_create_response(STREAM* s, STREAM* user_data)
+{
+       /* ConnectData */
+       per_write_choice(s, 0);
+       per_write_object_identifier(s, t124_02_98_oid);
+
+       /* ConnectData::connectPDU (OCTET_STRING) */
+       per_write_length(s, stream_get_length(user_data) + 2);
+
+       /* ConnectGCCPDU */
+       per_write_choice(s, 0x14);
+
+       /* ConferenceCreateResponse::nodeID (UserID) */
+       per_write_integer16(s, 0x79F3, 1001);
+
+       /* ConferenceCreateResponse::tag (INTEGER) */
+       per_write_integer(s, 1);
+
+       /* ConferenceCreateResponse::result (ENUMERATED) */
+       per_write_enumerated(s, 0, MCS_Result_enum_length);
+
+       /* number of UserData sets */
+       per_write_number_of_sets(s, 1);
+
+       /* UserData::value present + select h221NonStandard (1) */
+       per_write_choice(s, 0xC0);
+
+       /* h221NonStandard */
+       per_write_octet_string(s, h221_sc_key, 4, 4); /* h221NonStandard, server-to-client H.221 key, "McDn" */
+
+       /* userData (OCTET_STRING) */
+       per_write_octet_string(s, user_data->data, stream_get_length(user_data), 0); /* array of server data blocks */
+}
+
+boolean gcc_read_client_data_blocks(STREAM* s, rdpSettings* settings, int length)
+{
+       uint16 type;
+       uint16 blockLength;
+       int pos;
+
+       while (length > 0)
+       {
+               pos = stream_get_pos(s);
+               gcc_read_user_data_header(s, &type, &blockLength);
+
+               switch (type)
+               {
+                       case CS_CORE:
+                               if (!gcc_read_client_core_data(s, settings, blockLength - 4))
+                                       return false;
+                               break;
+
+                       case CS_SECURITY:
+                               if (!gcc_read_client_security_data(s, settings, blockLength - 4))
+                                       return false;
+                               break;
+
+                       case CS_NET:
+                               if (!gcc_read_client_network_data(s, settings, blockLength - 4))
+                                       return false;
+                               break;
+
+                       case CS_CLUSTER:
+                               if (!gcc_read_client_cluster_data(s, settings, blockLength - 4))
+                                       return false;
+                               break;
+
+                       case CS_MONITOR:
+                               if (!gcc_read_client_monitor_data(s, settings, blockLength - 4))
+                                       return false;
+                               break;
+
+                       default:
+                               break;
+               }
+
+               length -= blockLength;
+               stream_set_pos(s, pos + blockLength);
+       }
+
+       return true;
+}
+
+void gcc_write_client_data_blocks(STREAM* s, rdpSettings* settings)
+{
+       gcc_write_client_core_data(s, settings);
+       gcc_write_client_cluster_data(s, settings);
+       gcc_write_client_security_data(s, settings);
+       gcc_write_client_network_data(s, settings);
+
+       /* extended client data supported */
+
+       if (settings->negotiationFlags)
+               gcc_write_client_monitor_data(s, settings);
+}
+
+boolean gcc_read_server_data_blocks(STREAM* s, rdpSettings* settings, int length)
+{
+       uint16 type;
+       uint16 offset = 0;
+       uint16 blockLength;
+       uint8* holdp;
+
+       while (offset < length)
+       {
+               holdp = s->p;
+
+               if (!gcc_read_user_data_header(s, &type, &blockLength))
+               {
+                       printf("gcc_read_server_data_blocks: gcc_read_user_data_header failed\n");
+                       return false;
+               }
+
+               switch (type)
+               {
+                       case SC_CORE:
+                               if (!gcc_read_server_core_data(s, settings))
+                               {
+                                       printf("gcc_read_server_data_blocks: gcc_read_server_core_data failed\n");
+                                       return false;
+                               }
+                               break;
+
+                       case SC_SECURITY:
+                               if (!gcc_read_server_security_data(s, settings))
+                               {
+                                       printf("gcc_read_server_data_blocks: gcc_read_server_security_data failed\n");
+                                       return false;
+                               }
+                               break;
+
+                       case SC_NET:
+                               if (!gcc_read_server_network_data(s, settings))
+                               {
+                                       printf("gcc_read_server_data_blocks: gcc_read_server_network_data failed\n");
+                                       return false;
+                               }
+                               break;
+
+                       default:
+                               printf("gcc_read_server_data_blocks: ignoring type=%hu\n", type);
+                               break;
+               }
+               offset += blockLength;
+               s->p = holdp + blockLength;
+       }
+
+       return true;
+}
+
+void gcc_write_server_data_blocks(STREAM* s, rdpSettings* settings)
+{
+       gcc_write_server_core_data(s, settings);
+       gcc_write_server_network_data(s, settings);
+       gcc_write_server_security_data(s, settings);
+}
+
+boolean gcc_read_user_data_header(STREAM* s, uint16* type, uint16* length)
+{
+       stream_read_uint16(s, *type); /* type */
+       stream_read_uint16(s, *length); /* length */
+
+       if (*length < 4)
+               return false;
+
+       if (stream_get_left(s) < *length - 4)
+               return false;
+
+       return true;
+}
+
+/**
+ * Write a user data header (TS_UD_HEADER).\n
+ * @msdn{cc240509}
+ * @param s stream
+ * @param type data block type
+ * @param length data block length
+ */
+
+void gcc_write_user_data_header(STREAM* s, uint16 type, uint16 length)
+{
+       stream_write_uint16(s, type); /* type */
+       stream_write_uint16(s, length); /* length */
+}
+
+/**
+ * Read a client core data block (TS_UD_CS_CORE).\n
+ * @msdn{cc240510}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+boolean gcc_read_client_core_data(STREAM* s, rdpSettings* settings, uint16 blockLength)
+{
+       uint32 version;
+       uint16 colorDepth = 0;
+       uint16 postBeta2ColorDepth = 0;
+       uint16 highColorDepth = 0;
+       uint16 supportedColorDepths = 0;
+       uint16 earlyCapabilityFlags = 0;
+       uint32 serverSelectedProtocol = 0;
+       char* str;
+
+       /* Length of all required fields, until imeFileName */
+       if (blockLength < 128)
+               return false;
+
+       stream_read_uint32(s, version); /* version */
+       settings->rdp_version = (version == RDP_VERSION_4 ? 4 : 7);
+
+       stream_read_uint16(s, settings->width); /* desktopWidth */
+       stream_read_uint16(s, settings->height); /* desktopHeight */
+       stream_read_uint16(s, colorDepth); /* colorDepth */
+       stream_seek_uint16(s); /* SASSequence (Secure Access Sequence) */
+       stream_read_uint32(s, settings->kbd_layout); /* keyboardLayout */
+       stream_read_uint32(s, settings->client_build); /* clientBuild */
+       
+       /* clientName (32 bytes, null-terminated unicode, truncated to 15 characters) */
+       str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 32);
+       stream_seek(s, 32);
+       snprintf(settings->client_hostname, sizeof(settings->client_hostname), "%s", str);
+       xfree(str);
+
+       stream_read_uint32(s, settings->kbd_type); /* keyboardType */
+       stream_read_uint32(s, settings->kbd_subtype); /* keyboardSubType */
+       stream_read_uint32(s, settings->kbd_fn_keys); /* keyboardFunctionKey */
+
+       stream_seek(s, 64); /* imeFileName */
+
+       blockLength -= 128;
+
+       /**
+        * The following fields are all optional. If one field is present, all of the preceding
+        * fields MUST also be present. If one field is not present, all of the subsequent fields
+        * MUST NOT be present.
+        * We must check the bytes left before reading each field.
+        */
+
+       do
+       {
+               if (blockLength < 2)
+                       break;
+               stream_read_uint16(s, postBeta2ColorDepth); /* postBeta2ColorDepth */
+               blockLength -= 2;
+
+               if (blockLength < 2)
+                       break;
+               stream_seek_uint16(s); /* clientProductID */
+               blockLength -= 2;
+
+               if (blockLength < 4)
+                       break;
+               stream_seek_uint32(s); /* serialNumber */
+               blockLength -= 4;
+
+               if (blockLength < 2)
+                       break;
+               stream_read_uint16(s, highColorDepth); /* highColorDepth */
+               blockLength -= 2;
+
+               if (blockLength < 2)
+                       break;
+               stream_read_uint16(s, supportedColorDepths); /* supportedColorDepths */
+               blockLength -= 2;
+
+               if (blockLength < 2)
+                       break;
+               stream_read_uint16(s, earlyCapabilityFlags); /* earlyCapabilityFlags */
+               blockLength -= 2;
+
+               if (blockLength < 64)
+                       break;
+               str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64);
+               stream_seek(s, 64);
+               snprintf(settings->client_product_id, sizeof(settings->client_product_id), "%s", str);
+               xfree(str);
+               blockLength -= 64;
+
+               if (blockLength < 1)
+                       break;
+               stream_read_uint8(s, settings->performance_flags); /* connectionType */
+               blockLength -= 1;
+
+               if (blockLength < 1)
+                       break;
+               stream_seek_uint8(s); /* pad1octet */
+               blockLength -= 1;
+
+               if (blockLength < 4)
+                       break;
+               stream_read_uint32(s, serverSelectedProtocol); /* serverSelectedProtocol */
+               blockLength -= 4;
+
+               if (settings->selected_protocol != serverSelectedProtocol)
+                       return false;
+       } while (0);
+
+       if (highColorDepth > 0)
+               settings->color_depth = highColorDepth;
+       else if (postBeta2ColorDepth > 0)
+       {
+               switch (postBeta2ColorDepth)
+               {
+                       case RNS_UD_COLOR_4BPP:
+                               settings->color_depth = 4;
+                               break;
+                       case RNS_UD_COLOR_8BPP:
+                               settings->color_depth = 8;
+                               break;
+                       case RNS_UD_COLOR_16BPP_555:
+                               settings->color_depth = 15;
+                               break;
+                       case RNS_UD_COLOR_16BPP_565:
+                               settings->color_depth = 16;
+                               break;
+                       case RNS_UD_COLOR_24BPP:
+                               settings->color_depth = 24;
+                               break;
+                       default:
+                               return false;
+               }
+       }
+       else
+       {
+               switch (colorDepth)
+               {
+                       case RNS_UD_COLOR_4BPP:
+                               settings->color_depth = 4;
+                               break;
+                       case RNS_UD_COLOR_8BPP:
+                               settings->color_depth = 8;
+                               break;
+                       default:
+                               return false;
+               }
+       }
+
+       return true;
+}
+
+/**
+ * Write a client core data block (TS_UD_CS_CORE).\n
+ * @msdn{cc240510}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+void gcc_write_client_core_data(STREAM* s, rdpSettings* settings)
+{
+       uint32 version;
+       char* clientName;
+       size_t clientNameLength;
+       uint8 connectionType;
+       uint16 highColorDepth;
+       uint16 supportedColorDepths;
+       uint16 earlyCapabilityFlags;
+       char* clientDigProductId;
+       size_t clientDigProductIdLength;
+
+       gcc_write_user_data_header(s, CS_CORE, 216);
+
+       version = settings->rdp_version >= 5 ? RDP_VERSION_5_PLUS : RDP_VERSION_4;
+       clientName = freerdp_uniconv_out(settings->uniconv, settings->client_hostname, &clientNameLength);
+       clientDigProductId = freerdp_uniconv_out(settings->uniconv, settings->client_product_id, &clientDigProductIdLength);
+
+       stream_write_uint32(s, version); /* version */
+       stream_write_uint16(s, settings->width); /* desktopWidth */
+       stream_write_uint16(s, settings->height); /* desktopHeight */
+       stream_write_uint16(s, RNS_UD_COLOR_8BPP); /* colorDepth, ignored because of postBeta2ColorDepth */
+       stream_write_uint16(s, RNS_UD_SAS_DEL); /* SASSequence (Secure Access Sequence) */
+       stream_write_uint32(s, settings->kbd_layout); /* keyboardLayout */
+       stream_write_uint32(s, settings->client_build); /* clientBuild */
+
+       /* clientName (32 bytes, null-terminated unicode, truncated to 15 characters) */
+       if (clientNameLength > 30)
+       {
+               clientNameLength = 30;
+               clientName[clientNameLength] = 0;
+               clientName[clientNameLength + 1] = 0;
+       }
+       stream_write(s, clientName, clientNameLength + 2);
+       stream_write_zero(s, 32 - clientNameLength - 2);
+       xfree(clientName);
+
+       stream_write_uint32(s, settings->kbd_type); /* keyboardType */
+       stream_write_uint32(s, settings->kbd_subtype); /* keyboardSubType */
+       stream_write_uint32(s, settings->kbd_fn_keys); /* keyboardFunctionKey */
+
+       stream_write_zero(s, 64); /* imeFileName */
+
+       stream_write_uint16(s, RNS_UD_COLOR_8BPP); /* postBeta2ColorDepth */
+       stream_write_uint16(s, 1); /* clientProductID */
+       stream_write_uint32(s, 0); /* serialNumber (should be initialized to 0) */
+
+       highColorDepth = MIN(settings->color_depth, 24);
+
+       supportedColorDepths =
+                       RNS_UD_24BPP_SUPPORT |
+                       RNS_UD_16BPP_SUPPORT |
+                       RNS_UD_15BPP_SUPPORT;
+
+       connectionType = settings->connection_type;
+       earlyCapabilityFlags = RNS_UD_CS_SUPPORT_ERRINFO_PDU;
+
+       if (settings->rfx_codec)
+               connectionType = CONNECTION_TYPE_LAN;
+
+       if (connectionType != 0)
+               earlyCapabilityFlags |= RNS_UD_CS_VALID_CONNECTION_TYPE;
+
+       if (settings->color_depth == 32)
+       {
+               supportedColorDepths |= RNS_UD_32BPP_SUPPORT;
+               earlyCapabilityFlags |= RNS_UD_CS_WANT_32BPP_SESSION;
+       }
+
+       stream_write_uint16(s, highColorDepth); /* highColorDepth */
+       stream_write_uint16(s, supportedColorDepths); /* supportedColorDepths */
+
+       stream_write_uint16(s, earlyCapabilityFlags); /* earlyCapabilityFlags */
+
+       /* clientDigProductId (64 bytes, null-terminated unicode, truncated to 30 characters) */
+       if (clientDigProductIdLength > 62)
+       {
+               clientDigProductIdLength = 62;
+               clientDigProductId[clientDigProductIdLength] = 0;
+               clientDigProductId[clientDigProductIdLength + 1] = 0;
+       }
+       stream_write(s, clientDigProductId, clientDigProductIdLength + 2);
+       stream_write_zero(s, 64 - clientDigProductIdLength - 2);
+       xfree(clientDigProductId);
+
+       stream_write_uint8(s, connectionType); /* connectionType */
+       stream_write_uint8(s, 0); /* pad1octet */
+
+       stream_write_uint32(s, settings->selected_protocol); /* serverSelectedProtocol */
+}
+
+boolean gcc_read_server_core_data(STREAM* s, rdpSettings* settings)
+{
+       uint32 version;
+       uint32 clientRequestedProtocols;
+
+       stream_read_uint32(s, version); /* version */
+       stream_read_uint32(s, clientRequestedProtocols); /* clientRequestedProtocols */
+
+       if (version == RDP_VERSION_4 && settings->rdp_version > 4)
+               settings->rdp_version = 4;
+       else if (version == RDP_VERSION_5_PLUS && settings->rdp_version < 5)
+               settings->rdp_version = 7;
+
+       return true;
+}
+
+void gcc_write_server_core_data(STREAM* s, rdpSettings* settings)
+{
+       gcc_write_user_data_header(s, SC_CORE, 12);
+
+       stream_write_uint32(s, settings->rdp_version == 4 ? RDP_VERSION_4 : RDP_VERSION_5_PLUS);
+       stream_write_uint32(s, settings->requested_protocols); /* clientRequestedProtocols */
+}
+
+/**
+ * Read a client security data block (TS_UD_CS_SEC).\n
+ * @msdn{cc240511}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+boolean gcc_read_client_security_data(STREAM* s, rdpSettings* settings, uint16 blockLength)
+{
+       if (blockLength < 8)
+               return false;
+
+       if (settings->encryption)
+       {
+               stream_read_uint32(s, settings->encryption_method); /* encryptionMethods */
+               if (settings->encryption_method == 0)
+                       stream_read_uint32(s, settings->encryption_method); /* extEncryptionMethods */
+       }
+       else
+       {
+               stream_seek(s, 8);
+       }
+       return true;
+}
+
+/**
+ * Write a client security data block (TS_UD_CS_SEC).\n
+ * @msdn{cc240511}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+void gcc_write_client_security_data(STREAM* s, rdpSettings* settings)
+{
+       gcc_write_user_data_header(s, CS_SECURITY, 12);
+
+       if (settings->encryption)
+       {
+               stream_write_uint32(s, settings->encryption_method); /* encryptionMethods */
+               stream_write_uint32(s, 0); /* extEncryptionMethods */
+       }
+       else
+       {
+               /* French locale, disable encryption */
+               stream_write_uint32(s, 0); /* encryptionMethods */
+               stream_write_uint32(s, settings->encryption_method); /* extEncryptionMethods */
+       }
+}
+
+boolean gcc_read_server_security_data(STREAM* s, rdpSettings* settings)
+{
+       uint8* data;
+       uint32 length;
+       uint32 serverRandomLen;
+       uint32 serverCertLen;
+
+       stream_read_uint32(s, settings->encryption_method); /* encryptionMethod */
+       stream_read_uint32(s, settings->encryption_level); /* encryptionLevel */
+
+       if (settings->encryption_method == 0 && settings->encryption_level == 0)
+       {
+               /* serverRandom and serverRandom must not be present */
+               settings->encryption = false;
+               settings->encryption_method = ENCRYPTION_METHOD_NONE;
+               settings->encryption_level = ENCRYPTION_LEVEL_NONE;
+               return true;
+       }
+
+       stream_read_uint32(s, serverRandomLen); /* serverRandomLen */
+       stream_read_uint32(s, serverCertLen); /* serverCertLen */
+
+       if (serverRandomLen > 0)
+       {
+               /* serverRandom */
+               freerdp_blob_alloc(settings->server_random, serverRandomLen);
+               stream_read(s, settings->server_random->data, serverRandomLen);
+       }
+       else
+       {
+               return false;
+       }
+
+       if (serverCertLen > 0)
+       {
+               /* serverCertificate */
+               freerdp_blob_alloc(settings->server_certificate, serverCertLen);
+               stream_read(s, settings->server_certificate->data, serverCertLen);
+               certificate_free(settings->server_cert);
+               settings->server_cert = certificate_new();
+               data = settings->server_certificate->data;
+               length = settings->server_certificate->length;
+
+               if (!certificate_read_server_certificate(settings->server_cert, data, length))
+                       return false;
+       }
+       else
+       {
+               return false;
+       }
+
+       return true;
+}
+
+static const uint8 initial_signature[] =
+{
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01
+};
+
+void gcc_write_server_security_data(STREAM* s, rdpSettings* settings)
+{
+       CryptoMd5 md5;
+       uint8* sigData;
+       int expLen, keyLen, sigDataLen;
+       uint8 encryptedSignature[TSSK_KEY_LENGTH];
+       uint8 signature[sizeof(initial_signature)];
+       uint32 headerLen, serverRandomLen, serverCertLen, wPublicKeyBlobLen;
+
+       if (!settings->encryption)
+       {
+               settings->encryption_method = ENCRYPTION_METHOD_NONE;
+               settings->encryption_level = ENCRYPTION_LEVEL_NONE;
+       }
+       else if ((settings->encryption_method & ENCRYPTION_METHOD_FIPS) != 0)
+       {
+               settings->encryption_method = ENCRYPTION_METHOD_FIPS;
+       }
+       else if ((settings->encryption_method & ENCRYPTION_METHOD_128BIT) != 0)
+       {
+               settings->encryption_method = ENCRYPTION_METHOD_128BIT;
+       }
+       else if ((settings->encryption_method & ENCRYPTION_METHOD_40BIT) != 0)
+       {
+               settings->encryption_method = ENCRYPTION_METHOD_40BIT;
+       }
+
+       if (settings->encryption_method != ENCRYPTION_METHOD_NONE)
+               settings->encryption_level = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE;
+
+       headerLen = 12;
+       keyLen = 0;
+       wPublicKeyBlobLen = 0;
+       serverRandomLen = 0;
+       serverCertLen = 0;
+
+       if (settings->encryption_method != ENCRYPTION_METHOD_NONE ||
+           settings->encryption_level != ENCRYPTION_LEVEL_NONE)
+       {
+               serverRandomLen = 32;
+
+               keyLen = settings->server_key->modulus.length;
+               expLen = sizeof(settings->server_key->exponent);
+               wPublicKeyBlobLen = 4; /* magic (RSA1) */
+               wPublicKeyBlobLen += 4; /* keylen */
+               wPublicKeyBlobLen += 4; /* bitlen */
+               wPublicKeyBlobLen += 4; /* datalen */
+               wPublicKeyBlobLen += expLen;
+               wPublicKeyBlobLen += keyLen;
+               wPublicKeyBlobLen += 8; /* 8 bytes of zero padding */
+
+               serverCertLen = 4; /* dwVersion */
+               serverCertLen += 4; /* dwSigAlgId */
+               serverCertLen += 4; /* dwKeyAlgId */
+               serverCertLen += 2; /* wPublicKeyBlobType */
+               serverCertLen += 2; /* wPublicKeyBlobLen */
+               serverCertLen += wPublicKeyBlobLen;
+               serverCertLen += 2; /* wSignatureBlobType */
+               serverCertLen += 2; /* wSignatureBlobLen */
+               serverCertLen += sizeof(encryptedSignature); /* SignatureBlob */
+               serverCertLen += 8; /* 8 bytes of zero padding */
+
+               headerLen += sizeof(serverRandomLen);
+               headerLen += sizeof(serverCertLen);
+               headerLen += serverRandomLen;
+               headerLen += serverCertLen;
+       }
+
+       gcc_write_user_data_header(s, SC_SECURITY, headerLen);
+
+       stream_write_uint32(s, settings->encryption_method); /* encryptionMethod */
+       stream_write_uint32(s, settings->encryption_level); /* encryptionLevel */
+
+       if (settings->encryption_method == ENCRYPTION_METHOD_NONE &&
+           settings->encryption_level == ENCRYPTION_LEVEL_NONE)
+       {
+               return;
+       }
+
+       stream_write_uint32(s, serverRandomLen); /* serverRandomLen */
+       stream_write_uint32(s, serverCertLen); /* serverCertLen */
+
+       freerdp_blob_alloc(settings->server_random, serverRandomLen);
+       crypto_nonce(settings->server_random->data, serverRandomLen);
+       stream_write(s, settings->server_random->data, serverRandomLen);
+
+       sigData = stream_get_tail(s);
+
+       stream_write_uint32(s, CERT_CHAIN_VERSION_1); /* dwVersion (4 bytes) */
+       stream_write_uint32(s, SIGNATURE_ALG_RSA); /* dwSigAlgId */
+       stream_write_uint32(s, KEY_EXCHANGE_ALG_RSA); /* dwKeyAlgId */
+       stream_write_uint16(s, BB_RSA_KEY_BLOB); /* wPublicKeyBlobType */
+
+       stream_write_uint16(s, wPublicKeyBlobLen); /* wPublicKeyBlobLen */
+       stream_write(s, "RSA1", 4); /* magic */
+       stream_write_uint32(s, keyLen + 8); /* keylen */
+       stream_write_uint32(s, keyLen * 8); /* bitlen */
+       stream_write_uint32(s, keyLen - 1); /* datalen */
+
+       stream_write(s, settings->server_key->exponent, expLen);
+       stream_write(s, settings->server_key->modulus.data, keyLen);
+       stream_write_zero(s, 8);
+
+       sigDataLen = stream_get_tail(s) - sigData;
+
+       stream_write_uint16(s, BB_RSA_SIGNATURE_BLOB); /* wSignatureBlobType */
+       stream_write_uint16(s, keyLen + 8); /* wSignatureBlobLen */
+
+       memcpy(signature, initial_signature, sizeof(initial_signature));
+
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, sigData, sigDataLen);
+       crypto_md5_final(md5, signature);
+
+       crypto_rsa_private_encrypt(signature, sizeof(signature), TSSK_KEY_LENGTH,
+               tssk_modulus, tssk_privateExponent, encryptedSignature);
+
+       stream_write(s, encryptedSignature, sizeof(encryptedSignature));
+       stream_write_zero(s, 8);
+}
+
+/**
+ * Read a client network data block (TS_UD_CS_NET).\n
+ * @msdn{cc240512}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+boolean gcc_read_client_network_data(STREAM* s, rdpSettings* settings, uint16 blockLength)
+{
+       int i;
+
+       if (blockLength < 4)
+               return false;
+
+       stream_read_uint32(s, settings->num_channels); /* channelCount */
+       if (blockLength < 4 + settings->num_channels * 12)
+               return false;
+       if (settings->num_channels > 16)
+               return false;
+
+       /* channelDefArray */
+       for (i = 0; i < settings->num_channels; i++)
+       {
+               /* CHANNEL_DEF */
+               stream_read(s, settings->channels[i].name, 8); /* name (8 bytes) */
+               stream_read_uint32(s, settings->channels[i].options); /* options (4 bytes) */
+               settings->channels[i].channel_id = MCS_GLOBAL_CHANNEL_ID + 1 + i;
+       }
+
+       return true;
+}
+
+/**
+ * Write a client network data block (TS_UD_CS_NET).\n
+ * @msdn{cc240512}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+void gcc_write_client_network_data(STREAM* s, rdpSettings* settings)
+{
+       int i;
+       uint16 length;
+
+       if (settings->num_channels > 0)
+       {
+               length = settings->num_channels * 12 + 8;
+               gcc_write_user_data_header(s, CS_NET, length);
+
+               stream_write_uint32(s, settings->num_channels); /* channelCount */
+
+               /* channelDefArray */
+               for (i = 0; i < settings->num_channels; i++)
+               {
+                       /* CHANNEL_DEF */
+                       stream_write(s, settings->channels[i].name, 8); /* name (8 bytes) */
+                       stream_write_uint32(s, settings->channels[i].options); /* options (4 bytes) */
+               }
+       }
+}
+
+boolean gcc_read_server_network_data(STREAM* s, rdpSettings* settings)
+{
+       int i;
+       uint16 MCSChannelId;
+       uint16 channelCount;
+       uint16 channelId;
+
+       stream_read_uint16(s, MCSChannelId); /* MCSChannelId */
+       stream_read_uint16(s, channelCount); /* channelCount */
+
+       if (channelCount != settings->num_channels)
+       {
+               printf("requested %d channels, got %d instead\n",
+                               settings->num_channels, channelCount);
+       }
+
+       for (i = 0; i < channelCount; i++)
+       {
+               stream_read_uint16(s, channelId); /* channelId */
+               settings->channels[i].channel_id = channelId;
+       }
+
+       if (channelCount % 2 == 1)
+               stream_seek(s, 2); /* padding */
+
+       return true;
+}
+
+void gcc_write_server_network_data(STREAM* s, rdpSettings* settings)
+{
+       int i;
+
+       gcc_write_user_data_header(s, SC_NET, 8 + settings->num_channels * 2 + (settings->num_channels % 2 == 1 ? 2 : 0));
+
+       stream_write_uint16(s, MCS_GLOBAL_CHANNEL_ID); /* MCSChannelId */
+       stream_write_uint16(s, settings->num_channels); /* channelCount */
+
+       for (i = 0; i < settings->num_channels; i++)
+       {
+               stream_write_uint16(s, settings->channels[i].channel_id);
+       }
+
+       if (settings->num_channels % 2 == 1)
+               stream_write_uint16(s, 0);
+}
+
+/**
+ * Read a client cluster data block (TS_UD_CS_CLUSTER).\n
+ * @msdn{cc240514}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+boolean gcc_read_client_cluster_data(STREAM* s, rdpSettings* settings, uint16 blockLength)
+{
+       uint32 flags;
+
+       if (blockLength < 8)
+               return false;
+
+       stream_read_uint32(s, flags); /* flags */
+
+       if ((flags | REDIRECTED_SESSIONID_FIELD_VALID))
+               stream_read_uint32(s, settings->redirected_session_id); /* redirectedSessionID */
+
+       return true;
+}
+
+/**
+ * Write a client cluster data block (TS_UD_CS_CLUSTER).\n
+ * @msdn{cc240514}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+void gcc_write_client_cluster_data(STREAM* s, rdpSettings* settings)
+{
+       uint32 flags;
+
+       gcc_write_user_data_header(s, CS_CLUSTER, 12);
+
+       flags = REDIRECTION_SUPPORTED | (REDIRECTION_VERSION4 << 2);
+
+       if (settings->console_session || settings->redirected_session_id)
+               flags |= REDIRECTED_SESSIONID_FIELD_VALID;
+
+       stream_write_uint32(s, flags); /* flags */
+       stream_write_uint32(s, settings->redirected_session_id); /* redirectedSessionID */
+}
+
+/**
+ * Read a client monitor data block (TS_UD_CS_MONITOR).\n
+ * @msdn{dd305336}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+boolean gcc_read_client_monitor_data(STREAM* s, rdpSettings* settings, uint16 blockLength)
+{
+       printf("CS_MONITOR\n");
+       return true;
+}
+
+/**
+ * Write a client monitor data block (TS_UD_CS_MONITOR).\n
+ * @msdn{dd305336}
+ * @param s stream
+ * @param settings rdp settings
+ */
+
+void gcc_write_client_monitor_data(STREAM* s, rdpSettings* settings)
+{
+       int i;
+       uint16 length;
+       uint32 left, top, right, bottom, flags;
+
+       if (settings->num_monitors > 1)
+       {
+               length = (20 * settings->num_monitors) + 12;
+               gcc_write_user_data_header(s, CS_MONITOR, length);
+
+               stream_write_uint32(s, 0); /* flags */
+               stream_write_uint32(s, settings->num_monitors); /* monitorCount */
+
+               for (i = 0; i < settings->num_monitors; i++)
+               {
+                       left = settings->monitors[i].x;
+                       top = settings->monitors[i].y;
+                       right = settings->monitors[i].x + settings->monitors[i].width - 1;
+                       bottom = settings->monitors[i].y + settings->monitors[i].height - 1;
+                       flags = settings->monitors[i].is_primary ? MONITOR_PRIMARY : 0;
+
+                       stream_write_uint32(s, left); /* left */
+                       stream_write_uint32(s, top); /* top */
+                       stream_write_uint32(s, right); /* right */
+                       stream_write_uint32(s, bottom); /* bottom */
+                       stream_write_uint32(s, flags); /* flags */
+               }
+       }
+}
+
diff --git a/libfreerdp-core/gcc.h b/libfreerdp-core/gcc.h
new file mode 100644 (file)
index 0000000..f93b337
--- /dev/null
@@ -0,0 +1,111 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.124 Generic Conference Control (GCC)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GCC_H
+#define __GCC_H
+
+#include "per.h"
+#include "mcs.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/stream.h>
+
+/* Client to Server (CS) data blocks */
+#define CS_CORE                0xC001
+#define CS_SECURITY    0xC002
+#define CS_NET         0xC003
+#define CS_CLUSTER     0xC004
+#define CS_MONITOR     0xC005
+
+/* Server to Client (SC) data blocks */
+#define SC_CORE                0x0C01
+#define SC_SECURITY    0x0C02
+#define SC_NET         0x0C03
+
+/* RDP version */
+#define RDP_VERSION_4          0x00080001
+#define RDP_VERSION_5_PLUS     0x00080004
+
+/* Color depth */
+#define RNS_UD_COLOR_4BPP      0xCA00
+#define RNS_UD_COLOR_8BPP      0xCA01
+#define RNS_UD_COLOR_16BPP_555 0xCA02
+#define RNS_UD_COLOR_16BPP_565 0xCA03
+#define RNS_UD_COLOR_24BPP     0xCA04
+
+/* Secure Access Sequence */
+#define RNS_UD_SAS_DEL         0xAA03
+
+/* Supported Color Depths */
+#define RNS_UD_24BPP_SUPPORT   0x0001
+#define RNS_UD_16BPP_SUPPORT   0x0002
+#define RNS_UD_15BPP_SUPPORT   0x0004
+#define RNS_UD_32BPP_SUPPORT   0x0008
+
+/* Early Capability Flags */
+#define RNS_UD_CS_SUPPORT_ERRINFO_PDU          0x0001
+#define RNS_UD_CS_WANT_32BPP_SESSION           0x0002
+#define RNS_UD_CS_SUPPORT_STATUSINFO_PDU       0x0004
+#define RNS_UD_CS_STRONG_ASYMMETRIC_KEYS       0x0008
+#define RNS_UD_CS_VALID_CONNECTION_TYPE                0x0020
+#define RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU   0x0040
+
+/* Cluster Information Flags */
+#define REDIRECTION_SUPPORTED                  0x00000001
+#define REDIRECTED_SESSIONID_FIELD_VALID       0x00000002
+#define REDIRECTED_SMARTCARD                   0x00000040
+
+#define REDIRECTION_VERSION1                   0x00
+#define REDIRECTION_VERSION2                   0x01
+#define REDIRECTION_VERSION3                   0x02
+#define REDIRECTION_VERSION4                   0x03
+#define REDIRECTION_VERSION5                   0x04
+
+/* Monitor Flags */
+#define MONITOR_PRIMARY                                0x00000001
+
+boolean gcc_read_conference_create_request(STREAM* s, rdpSettings* settings);
+void gcc_write_conference_create_request(STREAM* s, STREAM* user_data);
+boolean gcc_read_conference_create_response(STREAM* s, rdpSettings* settings);
+void gcc_write_conference_create_response(STREAM* s, STREAM* user_data);
+boolean gcc_read_client_data_blocks(STREAM* s, rdpSettings *settings, int length);
+void gcc_write_client_data_blocks(STREAM* s, rdpSettings *settings);
+boolean gcc_read_server_data_blocks(STREAM* s, rdpSettings *settings, int length);
+void gcc_write_server_data_blocks(STREAM* s, rdpSettings *settings);
+boolean gcc_read_user_data_header(STREAM* s, uint16* type, uint16* length);
+void gcc_write_user_data_header(STREAM* s, uint16 type, uint16 length);
+boolean gcc_read_client_core_data(STREAM* s, rdpSettings *settings, uint16 blockLength);
+void gcc_write_client_core_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_server_core_data(STREAM* s, rdpSettings *settings);
+void gcc_write_server_core_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_client_security_data(STREAM* s, rdpSettings *settings, uint16 blockLength);
+void gcc_write_client_security_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_server_security_data(STREAM* s, rdpSettings *settings);
+void gcc_write_server_security_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_client_network_data(STREAM* s, rdpSettings *settings, uint16 blockLength);
+void gcc_write_client_network_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_server_network_data(STREAM* s, rdpSettings *settings);
+void gcc_write_server_network_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_client_cluster_data(STREAM* s, rdpSettings *settings, uint16 blockLength);
+void gcc_write_client_cluster_data(STREAM* s, rdpSettings *settings);
+boolean gcc_read_client_monitor_data(STREAM* s, rdpSettings *settings, uint16 blockLength);
+void gcc_write_client_monitor_data(STREAM* s, rdpSettings *settings);
+
+#endif /* __GCC_H */
diff --git a/libfreerdp-core/graphics.c b/libfreerdp-core/graphics.c
new file mode 100644 (file)
index 0000000..f6b3bab
--- /dev/null
@@ -0,0 +1,224 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/graphics.h>
+
+/* Bitmap Class */
+
+rdpBitmap* Bitmap_Alloc(rdpContext* context)
+{
+       rdpBitmap* bitmap;
+       rdpGraphics* graphics;
+
+       graphics = context->graphics;
+       bitmap = (rdpBitmap*) xmalloc(graphics->Bitmap_Prototype->size);
+
+       if (bitmap != NULL)
+       {
+               memcpy(bitmap, context->graphics->Bitmap_Prototype, sizeof(rdpBitmap));
+               bitmap->data = NULL;
+       }
+
+       return bitmap;
+}
+
+void Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
+{
+
+}
+
+void Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
+{
+       if (bitmap != NULL)
+       {
+               bitmap->Free(context, bitmap);
+
+               if (bitmap->data != NULL)
+                       xfree(bitmap->data);
+
+               xfree(bitmap);
+       }
+}
+
+void Bitmap_SetRectangle(rdpContext* context, rdpBitmap* bitmap, uint16 left, uint16 top, uint16 right, uint16 bottom)
+{
+       bitmap->left = left;
+       bitmap->top = top;
+       bitmap->right = right;
+       bitmap->bottom = bottom;
+}
+
+void Bitmap_SetDimensions(rdpContext* context, rdpBitmap* bitmap, uint16 width, uint16 height)
+{
+       bitmap->width = width;
+       bitmap->height = height;
+}
+
+/* static method */
+void Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary)
+{
+       context->graphics->Bitmap_Prototype->SetSurface(context, bitmap, primary);
+}
+
+void graphics_register_bitmap(rdpGraphics* graphics, rdpBitmap* bitmap)
+{
+       memcpy(graphics->Bitmap_Prototype, bitmap, sizeof(rdpBitmap));
+}
+
+/* Pointer Class */
+
+rdpPointer* Pointer_Alloc(rdpContext* context)
+{
+       rdpPointer* pointer;
+       rdpGraphics* graphics;
+
+       graphics = context->graphics;
+       pointer = (rdpPointer*) xmalloc(graphics->Pointer_Prototype->size);
+
+       if (pointer != NULL)
+       {
+               memcpy(pointer, context->graphics->Pointer_Prototype, sizeof(rdpPointer));
+       }
+
+       return pointer;
+}
+
+void Pointer_New(rdpContext* context, rdpPointer* pointer)
+{
+
+}
+
+void Pointer_Free(rdpContext* context, rdpPointer* pointer)
+{
+       if (pointer != NULL)
+       {
+               pointer->Free(context, pointer);
+
+               if (pointer->xorMaskData)
+                       xfree(pointer->xorMaskData);
+
+               if (pointer->andMaskData)
+                       xfree(pointer->andMaskData);
+
+               xfree(pointer);
+       }
+}
+
+/* static method */
+void Pointer_Set(rdpContext* context, rdpPointer* pointer)
+{
+       context->graphics->Pointer_Prototype->Set(context, pointer);
+}
+
+void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer)
+{
+       memcpy(graphics->Pointer_Prototype, pointer, sizeof(rdpPointer));
+}
+
+/* Glyph Class */
+
+rdpGlyph* Glyph_Alloc(rdpContext* context)
+{
+       rdpGlyph* glyph;
+       rdpGraphics* graphics;
+
+       graphics = context->graphics;
+       glyph = (rdpGlyph*) xmalloc(graphics->Glyph_Prototype->size);
+
+       if (glyph != NULL)
+       {
+               memcpy(glyph, context->graphics->Glyph_Prototype, sizeof(rdpGlyph));
+       }
+
+       return glyph;
+}
+
+void Glyph_New(rdpContext* context, rdpGlyph* glyph)
+{
+       context->graphics->Glyph_Prototype->New(context, glyph);
+}
+
+void Glyph_Free(rdpContext* context, rdpGlyph* glyph)
+{
+       context->graphics->Glyph_Prototype->Free(context, glyph);
+}
+
+void Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y)
+{
+       context->graphics->Glyph_Prototype->Draw(context, glyph, x, y);
+}
+
+void Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
+{
+       context->graphics->Glyph_Prototype->BeginDraw(context, x, y, width, height, bgcolor, fgcolor);
+}
+
+void Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
+{
+       context->graphics->Glyph_Prototype->EndDraw(context, x, y, width, height, bgcolor, fgcolor);
+}
+
+void graphics_register_glyph(rdpGraphics* graphics, rdpGlyph* glyph)
+{
+       memcpy(graphics->Glyph_Prototype, glyph, sizeof(rdpGlyph));
+}
+
+/* Graphics Module */
+
+rdpGraphics* graphics_new(rdpContext* context)
+{
+       rdpGraphics* graphics;
+
+       graphics = (rdpGraphics*) xzalloc(sizeof(rdpGraphics));
+
+       if (graphics != NULL)
+       {
+               graphics->context = context;
+
+               graphics->Bitmap_Prototype = (rdpBitmap*) xzalloc(sizeof(rdpBitmap));
+               graphics->Bitmap_Prototype->size = sizeof(rdpBitmap);
+               graphics->Bitmap_Prototype->New = Bitmap_New;
+               graphics->Bitmap_Prototype->Free = Bitmap_Free;
+
+               graphics->Pointer_Prototype = (rdpPointer*) xzalloc(sizeof(rdpPointer));
+               graphics->Pointer_Prototype->size = sizeof(rdpPointer);
+               graphics->Pointer_Prototype->New = Pointer_New;
+               graphics->Pointer_Prototype->Free = Pointer_Free;
+
+               graphics->Glyph_Prototype = (rdpGlyph*) xzalloc(sizeof(rdpGlyph));
+               graphics->Glyph_Prototype->size = sizeof(rdpGlyph);
+               graphics->Glyph_Prototype->New = Glyph_New;
+               graphics->Glyph_Prototype->Free = Glyph_Free;
+       }
+
+       return graphics;
+}
+
+void graphics_free(rdpGraphics* graphics)
+{
+       if (graphics != NULL)
+       {
+               xfree(graphics->Bitmap_Prototype);
+               xfree(graphics->Pointer_Prototype);
+               xfree(graphics->Glyph_Prototype);
+               xfree(graphics);
+       }
+}
diff --git a/libfreerdp-core/info.c b/libfreerdp-core/info.c
new file mode 100644 (file)
index 0000000..21a7d4f
--- /dev/null
@@ -0,0 +1,726 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Client Info
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "info.h"
+
+#define INFO_TYPE_LOGON                        0x00000000
+#define INFO_TYPE_LOGON_LONG           0x00000001
+#define INFO_TYPE_LOGON_PLAIN_NOTIFY   0x00000002
+#define INFO_TYPE_LOGON_EXTENDED_INF   0x00000003
+
+/*
+static const char* const INFO_TYPE_LOGON_STRINGS[] =
+{
+       "Logon Info V1",
+       "Logon Info V2",
+       "Logon Plain Notify",
+       "Logon Extended Info"
+};
+*/
+
+/**
+ * Read SYSTEM_TIME structure (TS_SYSTEMTIME).\n
+ * @msdn{cc240478}
+ * @param s stream
+ * @param system_time system time structure
+ */
+
+void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time)
+{
+       stream_read_uint16(s, system_time->wYear); /* wYear, must be set to 0 */
+       stream_read_uint16(s, system_time->wMonth); /* wMonth */
+       stream_read_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */
+       stream_read_uint16(s, system_time->wDay); /* wDay */
+       stream_read_uint16(s, system_time->wHour); /* wHour */
+       stream_read_uint16(s, system_time->wMinute); /* wMinute */
+       stream_read_uint16(s, system_time->wSecond); /* wSecond */
+       stream_read_uint16(s, system_time->wMilliseconds); /* wMilliseconds */
+}
+
+/**
+ * Write SYSTEM_TIME structure (TS_SYSTEMTIME).\n
+ * @msdn{cc240478}
+ * @param s stream
+ * @param system_time system time structure
+ */
+
+void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time)
+{
+       stream_write_uint16(s, system_time->wYear); /* wYear, must be set to 0 */
+       stream_write_uint16(s, system_time->wMonth); /* wMonth */
+       stream_write_uint16(s, system_time->wDayOfWeek); /* wDayOfWeek */
+       stream_write_uint16(s, system_time->wDay); /* wDay */
+       stream_write_uint16(s, system_time->wHour); /* wHour */
+       stream_write_uint16(s, system_time->wMinute); /* wMinute */
+       stream_write_uint16(s, system_time->wSecond); /* wSecond */
+       stream_write_uint16(s, system_time->wMilliseconds); /* wMilliseconds */
+}
+
+/**
+ * Get client time zone information.\n
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings)
+{
+       time_t t;
+       struct tm* local_time;
+       TIME_ZONE_INFO* clientTimeZone;
+
+       time(&t);
+       local_time = localtime(&t);
+       clientTimeZone = settings->client_time_zone;
+
+#if defined(sun)
+       if(local_time->tm_isdst > 0)
+               clientTimeZone->bias = (uint32) (altzone / 3600);
+       else
+               clientTimeZone->bias = (uint32) (timezone / 3600);
+#elif defined(HAVE_TM_GMTOFF)
+       if(local_time->tm_gmtoff >= 0)
+               clientTimeZone->bias = (uint32) (local_time->tm_gmtoff / 60);
+       else
+               clientTimeZone->bias = (uint32) ((-1 * local_time->tm_gmtoff) / 60 + 720);
+#else
+       clientTimeZone->bias = 0;
+#endif
+
+       if(local_time->tm_isdst > 0)
+       {
+               clientTimeZone->standardBias = clientTimeZone->bias - 60;
+               clientTimeZone->daylightBias = clientTimeZone->bias;
+       }
+       else
+       {
+               clientTimeZone->standardBias = clientTimeZone->bias;
+               clientTimeZone->daylightBias = clientTimeZone->bias + 60;
+       }
+
+       strftime(clientTimeZone->standardName, 32, "%Z, Standard Time", local_time);
+       clientTimeZone->standardName[31] = 0;
+       strftime(clientTimeZone->daylightName, 32, "%Z, Summer Time", local_time);
+       clientTimeZone->daylightName[31] = 0;
+}
+
+/**
+ * Read client time zone information (TS_TIME_ZONE_INFORMATION).\n
+ * @msdn{cc240477}
+ * @param s stream
+ * @param settings settings
+ */
+
+boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings)
+{
+       char* str;
+       TIME_ZONE_INFO* clientTimeZone;
+
+       if (stream_get_left(s) < 172)
+               return false;
+
+       clientTimeZone = settings->client_time_zone;
+
+       stream_read_uint32(s, clientTimeZone->bias); /* Bias */
+
+       /* standardName (64 bytes) */
+       str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64);
+       stream_seek(s, 64);
+       strncpy(clientTimeZone->standardName, str, sizeof(clientTimeZone->standardName));
+       xfree(str);
+
+       rdp_read_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
+       stream_read_uint32(s, clientTimeZone->standardBias); /* StandardBias */
+
+       /* daylightName (64 bytes) */
+       str = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), 64);
+       stream_seek(s, 64);
+       strncpy(clientTimeZone->daylightName, str, sizeof(clientTimeZone->daylightName));
+       xfree(str);
+
+       rdp_read_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
+       stream_read_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */
+
+       return true;
+}
+
+/**
+ * Write client time zone information (TS_TIME_ZONE_INFORMATION).\n
+ * @msdn{cc240477}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings)
+{
+       size_t length;
+       uint8* standardName;
+       uint8* daylightName;
+       size_t standardNameLength;
+       size_t daylightNameLength;
+       TIME_ZONE_INFO* clientTimeZone;
+
+       rdp_get_client_time_zone(s, settings);
+       clientTimeZone = settings->client_time_zone;
+
+       standardName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->standardName, &length);
+       standardNameLength = length;
+
+       daylightName = (uint8*) freerdp_uniconv_out(settings->uniconv, clientTimeZone->daylightName, &length);
+       daylightNameLength = length;
+
+       if (standardNameLength > 62)
+               standardNameLength = 62;
+
+       if (daylightNameLength > 62)
+               daylightNameLength = 62;
+
+       stream_write_uint32(s, clientTimeZone->bias); /* Bias */
+
+       /* standardName (64 bytes) */
+       stream_write(s, standardName, standardNameLength);
+       stream_write_zero(s, 64 - standardNameLength);
+
+       rdp_write_system_time(s, &clientTimeZone->standardDate); /* StandardDate */
+       stream_write_uint32(s, clientTimeZone->standardBias); /* StandardBias */
+
+       /* daylightName (64 bytes) */
+       stream_write(s, daylightName, daylightNameLength);
+       stream_write_zero(s, 64 - daylightNameLength);
+
+       rdp_write_system_time(s, &clientTimeZone->daylightDate); /* DaylightDate */
+       stream_write_uint32(s, clientTimeZone->daylightBias); /* DaylightBias */
+
+       xfree(standardName);
+       xfree(daylightName);
+}
+
+/**
+ * Read Server Auto Reconnect Cookie (ARC_SC_PRIVATE_PACKET).\n
+ * @msdn{cc240540}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_read_server_auto_reconnect_cookie(STREAM* s, rdpSettings* settings)
+{
+       ARC_SC_PRIVATE_PACKET* autoReconnectCookie;
+       autoReconnectCookie = settings->server_auto_reconnect_cookie;
+
+       stream_read_uint32(s, autoReconnectCookie->cbLen); /* cbLen (4 bytes) */
+       stream_read_uint32(s, autoReconnectCookie->version); /* version (4 bytes) */
+       stream_read_uint32(s, autoReconnectCookie->logonId); /* LogonId (4 bytes) */
+       stream_read(s, autoReconnectCookie->arcRandomBits, 16); /* arcRandomBits (16 bytes) */
+}
+
+/**
+ * Read Client Auto Reconnect Cookie (ARC_CS_PRIVATE_PACKET).\n
+ * @msdn{cc240541}
+ * @param s stream
+ * @param settings settings
+ */
+
+boolean rdp_read_client_auto_reconnect_cookie(STREAM* s, rdpSettings* settings)
+{
+       ARC_CS_PRIVATE_PACKET* autoReconnectCookie;
+       autoReconnectCookie = settings->client_auto_reconnect_cookie;
+
+       if (stream_get_left(s) < 28)
+               return false;
+
+       stream_write_uint32(s, autoReconnectCookie->cbLen); /* cbLen (4 bytes) */
+       stream_write_uint32(s, autoReconnectCookie->version); /* version (4 bytes) */
+       stream_write_uint32(s, autoReconnectCookie->logonId); /* LogonId (4 bytes) */
+       stream_write(s, autoReconnectCookie->securityVerifier, 16); /* SecurityVerifier */
+
+       return true;
+}
+
+/**
+ * Write Client Auto Reconnect Cookie (ARC_CS_PRIVATE_PACKET).\n
+ * @msdn{cc240541}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_client_auto_reconnect_cookie(STREAM* s, rdpSettings* settings)
+{
+       ARC_CS_PRIVATE_PACKET* autoReconnectCookie;
+       autoReconnectCookie = settings->client_auto_reconnect_cookie;
+
+       stream_write_uint32(s, autoReconnectCookie->cbLen); /* cbLen (4 bytes) */
+       stream_write_uint32(s, autoReconnectCookie->version); /* version (4 bytes) */
+       stream_write_uint32(s, autoReconnectCookie->logonId); /* LogonId (4 bytes) */
+       stream_write(s, autoReconnectCookie->securityVerifier, 16); /* SecurityVerifier */
+}
+
+/**
+ * Read Extended Info Packet (TS_EXTENDED_INFO_PACKET).\n
+ * @msdn{cc240476}
+ * @param s stream
+ * @param settings settings
+ */
+
+boolean rdp_read_extended_info_packet(STREAM* s, rdpSettings* settings)
+{
+       uint16 clientAddressFamily;
+       uint16 cbClientAddress;
+       uint16 cbClientDir;
+       uint16 cbAutoReconnectLen;
+
+       stream_read_uint16(s, clientAddressFamily); /* clientAddressFamily */
+       stream_read_uint16(s, cbClientAddress); /* cbClientAddress */
+
+       settings->ipv6 = (clientAddressFamily == ADDRESS_FAMILY_INET6 ? true : false);
+       if (stream_get_left(s) < cbClientAddress)
+               return false;
+       settings->ip_address = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbClientAddress);
+       stream_seek(s, cbClientAddress);
+
+       stream_read_uint16(s, cbClientDir); /* cbClientDir */
+       if (stream_get_left(s) < cbClientDir)
+               return false;
+       if (settings->client_dir)
+               xfree(settings->client_dir);
+       settings->client_dir = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbClientDir);
+       stream_seek(s, cbClientDir);
+
+       if (!rdp_read_client_time_zone(s, settings))
+               return false;
+
+       stream_seek_uint32(s); /* clientSessionId, should be set to 0 */
+       stream_read_uint32(s, settings->performance_flags); /* performanceFlags */
+
+       stream_read_uint16(s, cbAutoReconnectLen); /* cbAutoReconnectLen */
+
+       if (cbAutoReconnectLen > 0)
+               return rdp_read_client_auto_reconnect_cookie(s, settings); /* autoReconnectCookie */
+
+       /* reserved1 (2 bytes) */
+       /* reserved2 (2 bytes) */
+
+       return true;
+}
+
+/**
+ * Write Extended Info Packet (TS_EXTENDED_INFO_PACKET).\n
+ * @msdn{cc240476}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_extended_info_packet(STREAM* s, rdpSettings* settings)
+{
+       size_t length;
+       uint16 clientAddressFamily;
+       uint8* clientAddress;
+       uint16 cbClientAddress;
+       uint8* clientDir;
+       uint16 cbClientDir;
+       uint16 cbAutoReconnectLen;
+
+       clientAddressFamily = settings->ipv6 ? ADDRESS_FAMILY_INET6 : ADDRESS_FAMILY_INET;
+
+       clientAddress = (uint8*) freerdp_uniconv_out(settings->uniconv, settings->ip_address, &length);
+       cbClientAddress = length;
+
+       clientDir = (uint8*) freerdp_uniconv_out(settings->uniconv, settings->client_dir, &length);
+       cbClientDir = length;
+
+       cbAutoReconnectLen = settings->client_auto_reconnect_cookie->cbLen;
+
+       stream_write_uint16(s, clientAddressFamily); /* clientAddressFamily */
+
+       stream_write_uint16(s, cbClientAddress + 2); /* cbClientAddress */
+
+       if (cbClientAddress > 0)
+               stream_write(s, clientAddress, cbClientAddress); /* clientAddress */
+       stream_write_uint16(s, 0);
+
+       stream_write_uint16(s, cbClientDir + 2); /* cbClientDir */
+
+       if (cbClientDir > 0)
+               stream_write(s, clientDir, cbClientDir); /* clientDir */
+       stream_write_uint16(s, 0);
+
+       rdp_write_client_time_zone(s, settings); /* clientTimeZone */
+
+       stream_write_uint32(s, 0); /* clientSessionId, should be set to 0 */
+       stream_write_uint32(s, settings->performance_flags); /* performanceFlags */
+
+       stream_write_uint16(s, cbAutoReconnectLen); /* cbAutoReconnectLen */
+
+       if (cbAutoReconnectLen > 0)
+               rdp_write_client_auto_reconnect_cookie(s, settings); /* autoReconnectCookie */
+
+       /* reserved1 (2 bytes) */
+       /* reserved2 (2 bytes) */
+
+       xfree(clientAddress);
+       xfree(clientDir);
+}
+
+/**
+ * Read Info Packet (TS_INFO_PACKET).\n
+ * @msdn{cc240475}
+ * @param s stream
+ * @param settings settings
+ */
+
+boolean rdp_read_info_packet(STREAM* s, rdpSettings* settings)
+{
+       uint32 flags;
+       uint16 cbDomain;
+       uint16 cbUserName;
+       uint16 cbPassword;
+       uint16 cbAlternateShell;
+       uint16 cbWorkingDir;
+
+       stream_seek_uint32(s); /* CodePage */
+       stream_read_uint32(s, flags); /* flags */
+
+       settings->autologon = ((flags & INFO_AUTOLOGON) ? true : false);
+       settings->remote_app = ((flags & INFO_RAIL) ? true : false);
+       settings->console_audio = ((flags & INFO_REMOTECONSOLEAUDIO) ? true : false);
+       settings->compression = ((flags & INFO_COMPRESSION) ? true : false);
+
+       stream_read_uint16(s, cbDomain); /* cbDomain */
+       stream_read_uint16(s, cbUserName); /* cbUserName */
+       stream_read_uint16(s, cbPassword); /* cbPassword */
+       stream_read_uint16(s, cbAlternateShell); /* cbAlternateShell */
+       stream_read_uint16(s, cbWorkingDir); /* cbWorkingDir */
+
+       if (stream_get_left(s) < cbDomain + 2)
+               return false;
+       if (cbDomain > 0)
+       {
+               settings->domain = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbDomain);
+               stream_seek(s, cbDomain);
+       }
+       stream_seek(s, 2);
+
+       if (stream_get_left(s) < cbUserName + 2)
+               return false;
+       if (cbUserName > 0)
+       {
+               settings->username = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbUserName);
+               stream_seek(s, cbUserName);
+       }
+       stream_seek(s, 2);
+
+       if (stream_get_left(s) < cbPassword + 2)
+               return false;
+       if (cbPassword > 0)
+       {
+               settings->password = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbPassword);
+               stream_seek(s, cbPassword);
+       }
+       stream_seek(s, 2);
+
+       if (stream_get_left(s) < cbAlternateShell + 2)
+               return false;
+       if (cbAlternateShell > 0)
+       {
+               settings->shell = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbAlternateShell);
+               stream_seek(s, cbAlternateShell);
+       }
+       stream_seek(s, 2);
+
+       if (stream_get_left(s) < cbWorkingDir + 2)
+               return false;
+       if (cbWorkingDir > 0)
+       {
+               settings->directory = freerdp_uniconv_in(settings->uniconv, stream_get_tail(s), cbWorkingDir);
+               stream_seek(s, cbWorkingDir);
+       }
+       stream_seek(s, 2);
+
+       if (settings->rdp_version >= 5)
+               return rdp_read_extended_info_packet(s, settings); /* extraInfo */
+
+       return true;
+}
+
+/**
+ * Write Info Packet (TS_INFO_PACKET).\n
+ * @msdn{cc240475}
+ * @param s stream
+ * @param settings settings
+ */
+
+void rdp_write_info_packet(STREAM* s, rdpSettings* settings)
+{
+       size_t length;
+       uint32 flags;
+       uint8* domain;
+       uint16 cbDomain;
+       uint8* userName;
+       uint16 cbUserName;
+       uint8* password;
+       uint16 cbPassword;
+       size_t passwordLength;
+       uint8* alternateShell;
+       uint16 cbAlternateShell;
+       uint8* workingDir;
+       uint16 cbWorkingDir;
+       boolean usedPasswordCookie = false;
+
+       flags = INFO_MOUSE |
+               INFO_UNICODE |
+               INFO_LOGONERRORS |
+               INFO_LOGONNOTIFY |
+               INFO_MAXIMIZESHELL |
+               INFO_ENABLEWINDOWSKEY |
+               INFO_DISABLECTRLALTDEL |
+               RNS_INFO_AUDIOCAPTURE;
+
+       if (settings->autologon)
+               flags |= INFO_AUTOLOGON;
+
+       if (settings->remote_app)
+               flags |= INFO_RAIL;
+
+       if (settings->console_audio)
+               flags |= INFO_REMOTECONSOLEAUDIO;
+
+       if (settings->compression)
+               flags |= INFO_COMPRESSION | INFO_PACKET_COMPR_TYPE_64K;
+
+       domain = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->domain, &length);
+       cbDomain = length;
+
+       userName = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->username, &length);
+       cbUserName = length;
+
+       if (settings->password_cookie && settings->password_cookie->length > 0)
+       {
+               usedPasswordCookie = true;
+               password = (uint8*)settings->password_cookie->data;
+               passwordLength = settings->password_cookie->length;
+               cbPassword = passwordLength - 2;
+       }
+       else
+       {
+               password = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->password, &passwordLength);
+               cbPassword = passwordLength;
+       }
+
+       alternateShell = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->shell, &length);
+       cbAlternateShell = length;
+
+       workingDir = (uint8*)freerdp_uniconv_out(settings->uniconv, settings->directory, &length);
+       cbWorkingDir = length;
+
+       stream_write_uint32(s, 0); /* CodePage */
+       stream_write_uint32(s, flags); /* flags */
+
+       stream_write_uint16(s, cbDomain); /* cbDomain */
+       stream_write_uint16(s, cbUserName); /* cbUserName */
+       stream_write_uint16(s, cbPassword); /* cbPassword */
+       stream_write_uint16(s, cbAlternateShell); /* cbAlternateShell */
+       stream_write_uint16(s, cbWorkingDir); /* cbWorkingDir */
+
+       if (cbDomain > 0)
+               stream_write(s, domain, cbDomain);
+       stream_write_uint16(s, 0);
+
+       if (cbUserName > 0)
+               stream_write(s, userName, cbUserName);
+       stream_write_uint16(s, 0);
+
+       if (cbPassword > 0)
+               stream_write(s, password, passwordLength);
+       stream_write_uint16(s, 0);
+
+       if (cbAlternateShell > 0)
+               stream_write(s, alternateShell, cbAlternateShell);
+       stream_write_uint16(s, 0);
+
+       if (cbWorkingDir > 0)
+               stream_write(s, workingDir, cbWorkingDir);
+       stream_write_uint16(s, 0);
+
+       xfree(domain);
+       xfree(userName);
+       xfree(alternateShell);
+       xfree(workingDir);
+
+       if (!usedPasswordCookie)
+               xfree(password);
+
+       if (settings->rdp_version >= 5)
+               rdp_write_extended_info_packet(s, settings); /* extraInfo */
+}
+
+/**
+ * Read Client Info PDU (CLIENT_INFO_PDU).\n
+ * @msdn{cc240474}
+ * @param rdp RDP module
+ * @param s stream
+ */
+
+boolean rdp_recv_client_info(rdpRdp* rdp, STREAM* s)
+{
+       uint16 length;
+       uint16 channelId;
+       uint16 securityFlags;
+
+       if (!rdp_read_header(rdp, s, &length, &channelId))
+               return false;
+
+       rdp_read_security_header(s, &securityFlags);
+       if ((securityFlags & SEC_INFO_PKT) == 0)
+               return false;
+
+       if (rdp->settings->encryption)
+       {
+               if (securityFlags & SEC_REDIRECTION_PKT)
+               {
+                       printf("Error: SEC_REDIRECTION_PKT unsupported\n");
+                       return false;
+               }
+               if (securityFlags & SEC_ENCRYPT)
+               {
+                       if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
+                       {
+                               printf("rdp_decrypt failed\n");
+                               return false;
+                       }
+               }
+       }
+
+       return rdp_read_info_packet(s, rdp->settings);
+}
+
+/**
+ * Send Client Info PDU (CLIENT_INFO_PDU).\n
+ * @msdn{cc240474}
+ * @param rdp RDP module
+ */
+
+boolean rdp_send_client_info(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       //rdp->settings->crypt_flags |= SEC_INFO_PKT;
+       rdp->sec_flags |= SEC_INFO_PKT;
+       s = rdp_send_stream_init(rdp);
+       rdp_write_info_packet(s, rdp->settings);
+       return rdp_send(rdp, s, MCS_GLOBAL_CHANNEL_ID);
+}
+
+void rdp_recv_logon_info_v1(rdpRdp* rdp, STREAM* s)
+{
+       uint32 cbDomain;
+       uint32 cbUserName;
+
+       stream_read_uint32(s, cbDomain); /* cbDomain (4 bytes) */
+       stream_seek(s, 52); /* domain (52 bytes) */
+       stream_read_uint32(s, cbUserName); /* cbUserName (4 bytes) */
+       stream_seek(s, 512); /* userName (512 bytes) */
+       stream_seek_uint32(s); /* sessionId (4 bytes) */
+}
+
+void rdp_recv_logon_info_v2(rdpRdp* rdp, STREAM* s)
+{
+       uint32 cbDomain;
+       uint32 cbUserName;
+
+       stream_seek_uint16(s); /* version (2 bytes) */
+       stream_seek_uint32(s); /* size (4 bytes) */
+       stream_seek_uint32(s); /* sessionId (4 bytes) */
+       stream_read_uint32(s, cbDomain); /* cbDomain (4 bytes) */
+       stream_read_uint32(s, cbUserName); /* cbUserName (4 bytes) */
+       stream_seek(s, 558); /* pad */
+       stream_seek(s, cbDomain); /* domain */
+       stream_seek(s, cbUserName); /* userName */
+}
+
+void rdp_recv_logon_plain_notify(rdpRdp* rdp, STREAM* s)
+{
+       stream_seek(s, 576); /* pad */
+}
+
+void rdp_recv_logon_error_info(rdpRdp* rdp, STREAM* s)
+{
+       uint32 errorNotificationType;
+       uint32 errorNotificationData;
+
+       stream_read_uint32(s, errorNotificationType); /* errorNotificationType (4 bytes) */
+       stream_read_uint32(s, errorNotificationData); /* errorNotificationData (4 bytes) */
+}
+
+void rdp_recv_logon_info_extended(rdpRdp* rdp, STREAM* s)
+{
+       uint32 cbFieldData;
+       uint32 fieldsPresent;
+       uint16 Length;
+
+       stream_read_uint16(s, Length); /* The total size in bytes of this structure */
+       stream_read_uint32(s, fieldsPresent); /* fieldsPresent (4 bytes) */
+
+       /* logonFields */
+
+       if (fieldsPresent & LOGON_EX_AUTORECONNECTCOOKIE)
+       {
+               stream_read_uint32(s, cbFieldData); /* cbFieldData (4 bytes) */
+               rdp_read_server_auto_reconnect_cookie(s, rdp->settings);
+       }
+
+       if (fieldsPresent & LOGON_EX_LOGONERRORS)
+       {
+               stream_read_uint32(s, cbFieldData); /* cbFieldData (4 bytes) */
+               rdp_recv_logon_error_info(rdp, s);
+       }
+
+       stream_seek(s, 570); /* pad */
+}
+
+boolean rdp_recv_save_session_info(rdpRdp* rdp, STREAM* s)
+{
+       uint32 infoType;
+
+       stream_read_uint32(s, infoType); /* infoType (4 bytes) */
+
+       //printf("%s\n", INFO_TYPE_LOGON_STRINGS[infoType]);
+
+       switch (infoType)
+       {
+               case INFO_TYPE_LOGON:
+                       rdp_recv_logon_info_v1(rdp, s);
+                       break;
+
+               case INFO_TYPE_LOGON_LONG:
+                       rdp_recv_logon_info_v2(rdp, s);
+                       break;
+
+               case INFO_TYPE_LOGON_PLAIN_NOTIFY:
+                       rdp_recv_logon_plain_notify(rdp, s);
+                       break;
+
+               case INFO_TYPE_LOGON_EXTENDED_INF:
+                       rdp_recv_logon_info_extended(rdp, s);
+                       break;
+
+               default:
+                       break;
+       }
+
+       return true;
+}
+
diff --git a/libfreerdp-core/info.h b/libfreerdp-core/info.h
new file mode 100644 (file)
index 0000000..e46582b
--- /dev/null
@@ -0,0 +1,90 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Client Info
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __INFO_H
+#define __INFO_H
+
+#include "rdp.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+
+/* Client Address Family */
+#define ADDRESS_FAMILY_INET            0x0002
+#define ADDRESS_FAMILY_INET6           0x0017
+
+/* Client Info Packet Flags */
+#define INFO_MOUSE                     0x00000001
+#define INFO_DISABLECTRLALTDEL         0x00000002
+#define INFO_AUTOLOGON                 0x00000008
+#define INFO_UNICODE                   0x00000010
+#define INFO_MAXIMIZESHELL             0x00000020
+#define INFO_LOGONNOTIFY               0x00000040
+#define INFO_COMPRESSION               0x00000080
+#define INFO_ENABLEWINDOWSKEY          0x00000100
+#define INFO_REMOTECONSOLEAUDIO                0x00002000
+#define INFO_FORCE_ENCRYPTED_CS_PDU    0x00004000
+#define INFO_RAIL                      0x00008000
+#define INFO_LOGONERRORS               0x00010000
+#define INFO_MOUSE_HAS_WHEEL           0x00020000
+#define INFO_PASSWORD_IS_SC_PIN                0x00040000
+#define INFO_NOAUDIOPLAYBACK           0x00080000
+#define INFO_USING_SAVED_CREDS         0x00100000
+#define RNS_INFO_AUDIOCAPTURE          0x00200000
+#define RNS_INFO_VIDEO_DISABLE         0x00400000
+#define INFO_CompressionTypeMask       0x00001E00
+#define INFO_PACKET_COMPR_TYPE_8K      0x00000100
+#define INFO_PACKET_COMPR_TYPE_64K     0x00000200
+#define INFO_PACKET_COMPR_TYPE_RDP6    0x00000400
+#define INFO_PACKET_COMPR_TYPE_RDP61   0x00000600
+
+/* Logon Information Types */
+#define INFO_TYPE_LOGON                        0x00000000
+#define INFO_TYPE_LOGON_LONG           0x00000001
+#define INFO_TYPE_LOGON_PLAIN_NOTIFY   0x00000002
+#define INFO_TYPE_LOGON_EXTENDED_INF   0x00000003
+
+/* Extended Logon Info */
+#define LOGON_EX_AUTORECONNECTCOOKIE   0x00000001
+#define LOGON_EX_LOGONERRORS           0x00000002
+
+/* Logon Error Info */
+#define LOGON_FAILED_BAD_PASSWORD      0x00000000
+#define LOGON_FAILED_UPDATE_PASSWORD   0x00000001
+#define LOGON_FAILED_OTHER             0x00000002
+#define LOGON_WARNING                  0x00000003
+
+void rdp_read_system_time(STREAM* s, SYSTEM_TIME* system_time);
+void rdp_write_system_time(STREAM* s, SYSTEM_TIME* system_time);
+void rdp_get_client_time_zone(STREAM* s, rdpSettings* settings);
+boolean rdp_read_client_time_zone(STREAM* s, rdpSettings* settings);
+void rdp_write_client_time_zone(STREAM* s, rdpSettings* settings);
+void rdp_read_server_auto_reconnect_cookie(STREAM* s, rdpSettings* settings);
+boolean rdp_read_client_auto_reconnect_cookie(STREAM* s, rdpSettings* settings);
+void rdp_write_client_auto_reconnect_cookie(STREAM* s, rdpSettings* settings);
+void rdp_write_auto_reconnect_cookie(STREAM* s, rdpSettings* settings);
+boolean rdp_read_extended_info_packet(STREAM* s, rdpSettings* settings);
+void rdp_write_extended_info_packet(STREAM* s, rdpSettings* settings);
+boolean rdp_read_info_packet(STREAM* s, rdpSettings* settings);
+void rdp_write_info_packet(STREAM* s, rdpSettings* settings);
+boolean rdp_recv_client_info(rdpRdp* rdp, STREAM* s);
+boolean rdp_send_client_info(rdpRdp* rdp);
+boolean rdp_recv_save_session_info(rdpRdp* rdp, STREAM* s);
+
+#endif /* __INFO_H */
diff --git a/libfreerdp-core/input.c b/libfreerdp-core/input.c
new file mode 100644 (file)
index 0000000..b7336ed
--- /dev/null
@@ -0,0 +1,403 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Input PDUs
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "input.h"
+
+void rdp_write_client_input_pdu_header(STREAM* s, uint16 number)
+{
+       stream_write_uint16(s, 1); /* numberEvents (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+}
+
+void rdp_write_input_event_header(STREAM* s, uint32 time, uint16 type)
+{
+       stream_write_uint32(s, time); /* eventTime (4 bytes) */
+       stream_write_uint16(s, type); /* messageType (2 bytes) */
+}
+
+STREAM* rdp_client_input_pdu_init(rdpRdp* rdp, uint16 type)
+{
+       STREAM* s;
+       s = rdp_data_pdu_init(rdp);
+       rdp_write_client_input_pdu_header(s, 1);
+       rdp_write_input_event_header(s, 0, type);
+       return s;
+}
+
+void rdp_send_client_input_pdu(rdpRdp* rdp, STREAM* s)
+{
+       rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_INPUT, rdp->mcs->user_id);
+}
+
+void input_write_synchronize_event(STREAM* s, uint32 flags)
+{
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+       stream_write_uint32(s, flags); /* toggleFlags (4 bytes) */
+}
+
+void input_send_synchronize_event(rdpInput* input, uint32 flags)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_SYNC);
+       input_write_synchronize_event(s, flags);
+       rdp_send_client_input_pdu(rdp, s);
+}
+
+void input_write_keyboard_event(STREAM* s, uint16 flags, uint16 code)
+{
+       stream_write_uint16(s, flags); /* keyboardFlags (2 bytes) */
+       stream_write_uint16(s, code); /* keyCode (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+}
+
+void input_send_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_SCANCODE);
+       input_write_keyboard_event(s, flags, code);
+       rdp_send_client_input_pdu(rdp, s);
+}
+
+void input_write_unicode_keyboard_event(STREAM* s, uint16 flags, uint16 code)
+{
+       stream_write_uint16(s, flags); /* keyboardFlags (2 bytes) */
+       stream_write_uint16(s, code); /* unicodeCode (2 bytes) */
+       stream_write_uint16(s, 0); /* pad2Octets (2 bytes) */
+}
+
+void input_send_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       STREAM* s;
+       uint16 keyboardFlags = 0;
+       rdpRdp* rdp = input->context->rdp;
+
+       /*
+        * According to the specification, the slow path Unicode Keyboard Event
+        * (TS_UNICODE_KEYBOARD_EVENT) contains KBD_FLAGS_RELEASE flag when key
+        * is released, but contains no flags when it is pressed.
+        * This is different from the slow path Keyboard Event
+        * (TS_KEYBOARD_EVENT) which does contain KBD_FLAGS_DOWN flag when the
+        * key is pressed.
+        * There is no KBD_FLAGS_EXTENDED flag in TS_UNICODE_KEYBOARD_EVENT.
+        */
+       keyboardFlags |= (flags & KBD_FLAGS_RELEASE) ? KBD_FLAGS_RELEASE : 0;
+
+       s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_UNICODE);
+       input_write_unicode_keyboard_event(s, flags, code);
+       rdp_send_client_input_pdu(rdp, s);
+}
+
+void input_write_mouse_event(STREAM* s, uint16 flags, uint16 x, uint16 y)
+{
+       stream_write_uint16(s, flags); /* pointerFlags (2 bytes) */
+       stream_write_uint16(s, x); /* xPos (2 bytes) */
+       stream_write_uint16(s, y); /* yPos (2 bytes) */
+}
+
+void input_send_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_MOUSE);
+       input_write_mouse_event(s, flags, x, y);
+       rdp_send_client_input_pdu(rdp, s);
+}
+
+void input_write_extended_mouse_event(STREAM* s, uint16 flags, uint16 x, uint16 y)
+{
+       stream_write_uint16(s, flags); /* pointerFlags (2 bytes) */
+       stream_write_uint16(s, x); /* xPos (2 bytes) */
+       stream_write_uint16(s, y); /* yPos (2 bytes) */
+}
+
+void input_send_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       s = rdp_client_input_pdu_init(rdp, INPUT_EVENT_MOUSEX);
+       input_write_extended_mouse_event(s, flags, x, y);
+       rdp_send_client_input_pdu(rdp, s);
+}
+
+void input_send_fastpath_synchronize_event(rdpInput* input, uint32 flags)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       /* The FastPath Synchronization eventFlags has identical values as SlowPath */
+       s = fastpath_input_pdu_init(rdp->fastpath, (uint8) flags, FASTPATH_INPUT_EVENT_SYNC);
+       fastpath_send_input_pdu(rdp->fastpath, s);
+}
+
+void input_send_fastpath_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       STREAM* s;
+       uint8 eventFlags = 0;
+       rdpRdp* rdp = input->context->rdp;
+
+       eventFlags |= (flags & KBD_FLAGS_RELEASE) ? FASTPATH_INPUT_KBDFLAGS_RELEASE : 0;
+       eventFlags |= (flags & KBD_FLAGS_EXTENDED) ? FASTPATH_INPUT_KBDFLAGS_EXTENDED : 0;
+       s = fastpath_input_pdu_init(rdp->fastpath, eventFlags, FASTPATH_INPUT_EVENT_SCANCODE);
+       stream_write_uint8(s, code); /* keyCode (1 byte) */
+       fastpath_send_input_pdu(rdp->fastpath, s);
+}
+
+void input_send_fastpath_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       STREAM* s;
+       uint8 eventFlags = 0;
+       rdpRdp* rdp = input->context->rdp;
+
+       eventFlags |= (flags & KBD_FLAGS_RELEASE) ? FASTPATH_INPUT_KBDFLAGS_RELEASE : 0;
+       s = fastpath_input_pdu_init(rdp->fastpath, eventFlags, FASTPATH_INPUT_EVENT_UNICODE);
+       stream_write_uint16(s, code); /* unicodeCode (2 bytes) */
+       fastpath_send_input_pdu(rdp->fastpath, s);
+}
+
+void input_send_fastpath_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_MOUSE);
+       input_write_mouse_event(s, flags, x, y);
+       fastpath_send_input_pdu(rdp->fastpath, s);
+}
+
+void input_send_fastpath_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       STREAM* s;
+       rdpRdp* rdp = input->context->rdp;
+
+       s = fastpath_input_pdu_init(rdp->fastpath, 0, FASTPATH_INPUT_EVENT_MOUSEX);
+       input_write_extended_mouse_event(s, flags, x, y);
+       fastpath_send_input_pdu(rdp->fastpath, s);
+}
+
+static boolean input_recv_sync_event(rdpInput* input, STREAM* s)
+{
+       uint32 toggleFlags;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_seek(s, 2); /* pad2Octets (2 bytes) */
+       stream_read_uint32(s, toggleFlags); /* toggleFlags (4 bytes) */
+
+       IFCALL(input->SynchronizeEvent, input, toggleFlags);
+
+       return true;
+}
+
+static boolean input_recv_keyboard_event(rdpInput* input, STREAM* s)
+{
+       uint16 keyboardFlags, keyCode;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_read_uint16(s, keyboardFlags); /* keyboardFlags (2 bytes) */
+       stream_read_uint16(s, keyCode); /* keyCode (2 bytes) */
+       stream_seek(s, 2); /* pad2Octets (2 bytes) */
+
+       IFCALL(input->KeyboardEvent, input, keyboardFlags, keyCode);
+
+       return true;
+}
+
+static boolean input_recv_unicode_keyboard_event(rdpInput* input, STREAM* s)
+{
+       uint16 keyboardFlags, unicodeCode;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_read_uint16(s, keyboardFlags); /* keyboardFlags (2 bytes) */
+       stream_read_uint16(s, unicodeCode); /* unicodeCode (2 bytes) */
+       stream_seek(s, 2); /* pad2Octets (2 bytes) */
+
+       /*
+        * According to the specification, the slow path Unicode Keyboard Event
+        * (TS_UNICODE_KEYBOARD_EVENT) contains KBD_FLAGS_RELEASE flag when key
+        * is released, but contains no flags when it is pressed.
+        * This is different from the slow path Keyboard Event
+        * (TS_KEYBOARD_EVENT) which does contain KBD_FLAGS_DOWN flag when the
+        * key is pressed.
+        * Set the KBD_FLAGS_DOWN flag if the KBD_FLAGS_RELEASE flag is missing.
+        */
+
+       if ((keyboardFlags & KBD_FLAGS_RELEASE) == 0)
+               keyboardFlags |= KBD_FLAGS_DOWN;
+
+       IFCALL(input->UnicodeKeyboardEvent, input, keyboardFlags, unicodeCode);
+
+       return true;
+}
+
+static boolean input_recv_mouse_event(rdpInput* input, STREAM* s)
+{
+       uint16 pointerFlags, xPos, yPos;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_read_uint16(s, pointerFlags); /* pointerFlags (2 bytes) */
+       stream_read_uint16(s, xPos); /* xPos (2 bytes) */
+       stream_read_uint16(s, yPos); /* yPos (2 bytes) */
+
+       IFCALL(input->MouseEvent, input, pointerFlags, xPos, yPos);
+
+       return true;
+}
+
+static boolean input_recv_extended_mouse_event(rdpInput* input, STREAM* s)
+{
+       uint16 pointerFlags, xPos, yPos;
+
+       if (stream_get_left(s) < 6)
+               return false;
+
+       stream_read_uint16(s, pointerFlags); /* pointerFlags (2 bytes) */
+       stream_read_uint16(s, xPos); /* xPos (2 bytes) */
+       stream_read_uint16(s, yPos); /* yPos (2 bytes) */
+
+       IFCALL(input->ExtendedMouseEvent, input, pointerFlags, xPos, yPos);
+
+       return true;
+}
+
+static boolean input_recv_event(rdpInput* input, STREAM* s)
+{
+       uint16 messageType;
+
+       if (stream_get_left(s) < 4)
+               return false;
+
+       stream_seek(s, 4); /* eventTime (4 bytes), ignored by the server */
+       stream_read_uint16(s, messageType); /* messageType (2 bytes) */
+
+       switch (messageType)
+       {
+               case INPUT_EVENT_SYNC:
+                       if (!input_recv_sync_event(input, s))
+                               return false;
+                       break;
+
+               case INPUT_EVENT_SCANCODE:
+                       if (!input_recv_keyboard_event(input, s))
+                               return false;
+                       break;
+
+               case INPUT_EVENT_UNICODE:
+                       if (!input_recv_unicode_keyboard_event(input, s))
+                               return false;
+                       break;
+
+               case INPUT_EVENT_MOUSE:
+                       if (!input_recv_mouse_event(input, s))
+                               return false;
+                       break;
+
+               case INPUT_EVENT_MOUSEX:
+                       if (!input_recv_extended_mouse_event(input, s))
+                               return false;
+                       break;
+
+               default:
+                       printf("Unknown messageType %u\n", messageType);
+                       /* Each input event uses 6 bytes. */
+                       stream_seek(s, 6);
+                       break;
+       }
+
+       return true;
+}
+
+boolean input_recv(rdpInput* input, STREAM* s)
+{
+       uint16 i, numberEvents;
+
+       if (stream_get_left(s) < 4)
+               return false;
+
+       stream_read_uint16(s, numberEvents); /* numberEvents (2 bytes) */
+       stream_seek(s, 2); /* pad2Octets (2 bytes) */
+
+       /* Each input event uses 6 exactly bytes. */
+       if (stream_get_left(s) < 6 * numberEvents)
+               return false;
+
+       for (i = 0; i < numberEvents; i++)
+       {
+               if (!input_recv_event(input, s))
+                       return false;
+       }
+
+       return true;
+}
+
+void input_register_client_callbacks(rdpInput* input)
+{
+       rdpRdp* rdp = input->context->rdp;
+
+       if (rdp->settings->fastpath_input)
+       {
+               input->SynchronizeEvent = input_send_fastpath_synchronize_event;
+               input->KeyboardEvent = input_send_fastpath_keyboard_event;
+               input->UnicodeKeyboardEvent = input_send_fastpath_unicode_keyboard_event;
+               input->MouseEvent = input_send_fastpath_mouse_event;
+               input->ExtendedMouseEvent = input_send_fastpath_extended_mouse_event;
+       }
+       else
+       {
+               input->SynchronizeEvent = input_send_synchronize_event;
+               input->KeyboardEvent = input_send_keyboard_event;
+               input->UnicodeKeyboardEvent = input_send_unicode_keyboard_event;
+               input->MouseEvent = input_send_mouse_event;
+               input->ExtendedMouseEvent = input_send_extended_mouse_event;
+       }
+}
+
+rdpInput* input_new(rdpRdp* rdp)
+{
+       rdpInput* input;
+
+       input = (rdpInput*) xzalloc(sizeof(rdpInput));
+
+       if (input != NULL)
+       {
+
+       }
+
+       return input;
+}
+
+void input_free(rdpInput* input)
+{
+       if (input != NULL)
+       {
+               xfree(input);
+       }
+}
diff --git a/libfreerdp-core/input.h b/libfreerdp-core/input.h
new file mode 100644 (file)
index 0000000..41b8b67
--- /dev/null
@@ -0,0 +1,59 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Input PDUs
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __INPUT_H
+#define __INPUT_H
+
+#include "rdp.h"
+#include "fastpath.h"
+
+#include <freerdp/input.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+/* Input Events */
+#define INPUT_EVENT_SYNC               0x0000
+#define INPUT_EVENT_SCANCODE           0x0004
+#define INPUT_EVENT_UNICODE            0x0005
+#define INPUT_EVENT_MOUSE              0x8001
+#define INPUT_EVENT_MOUSEX             0x8002
+
+#define RDP_CLIENT_INPUT_PDU_HEADER_LENGTH     4
+
+void input_send_synchronize_event(rdpInput* input, uint32 flags);
+void input_send_keyboard_event(rdpInput* input, uint16 flags, uint16 code);
+void input_send_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code);
+void input_send_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+void input_send_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+
+void input_send_fastpath_synchronize_event(rdpInput* input, uint32 flags);
+void input_send_fastpath_keyboard_event(rdpInput* input, uint16 flags, uint16 code);
+void input_send_fastpath_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code);
+void input_send_fastpath_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+void input_send_fastpath_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+
+boolean input_recv(rdpInput* input, STREAM* s);
+
+void input_register_client_callbacks(rdpInput* input);
+
+rdpInput* input_new(rdpRdp* rdp);
+void input_free(rdpInput* input);
+
+#endif /* __INPUT_H */
diff --git a/libfreerdp-core/license.c b/libfreerdp-core/license.c
new file mode 100644 (file)
index 0000000..60b9f93
--- /dev/null
@@ -0,0 +1,938 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Licensing
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "redirection.h"
+
+#include "license.h"
+
+#ifdef WITH_DEBUG_LICENSE
+static const char* const LICENSE_MESSAGE_STRINGS[] =
+{
+               "",
+               "License Request",
+               "Platform Challenge",
+               "New License",
+               "Upgrade License",
+               "", "", "", "", "", "",
+               "", "", "", "", "", "",
+               "",
+               "License Info",
+               "New License Request",
+               "",
+               "Platform Challenge Response",
+               "", "", "", "", "", "", "", "", "",
+               "Error Alert"
+};
+
+static const char* const error_codes[] =
+{
+       "ERR_UNKNOWN",
+       "ERR_INVALID_SERVER_CERTIFICATE",
+       "ERR_NO_LICENSE",
+       "ERR_INVALID_MAC",
+       "ERR_INVALID_SCOPE",
+       "ERR_UNKNOWN",
+       "ERR_NO_LICENSE_SERVER",
+       "STATUS_VALID_CLIENT",
+       "ERR_INVALID_CLIENT",
+       "ERR_UNKNOWN",
+       "ERR_UNKNOWN",
+       "ERR_INVALID_PRODUCT_ID",
+       "ERR_INVALID_MESSAGE_LENGTH"
+};
+
+static const char* const  state_transitions[] =
+{
+       "ST_UNKNOWN",
+       "ST_TOTAL_ABORT",
+       "ST_NO_TRANSITION",
+       "ST_RESET_PHASE_TO_START",
+       "ST_RESEND_LAST_MESSAGE"
+};
+#endif
+
+/**
+ * Read a licensing preamble.\n
+ * @msdn{cc240480}
+ * @param s stream
+ * @param bMsgType license message type
+ * @param flags message flags
+ * @param wMsgSize message size
+ */
+
+void license_read_preamble(STREAM* s, uint8* bMsgType, uint8* flags, uint16* wMsgSize)
+{
+       /* preamble (4 bytes) */
+       stream_read_uint8(s, *bMsgType); /* bMsgType (1 byte) */
+       stream_read_uint8(s, *flags); /* flags (1 byte) */
+       stream_read_uint16(s, *wMsgSize); /* wMsgSize (2 bytes) */
+}
+
+/**
+ * Write a licensing preamble.\n
+ * @msdn{cc240480}
+ * @param s stream
+ * @param bMsgType license message type
+ * @param flags message flags
+ * @param wMsgSize message size
+ */
+
+void license_write_preamble(STREAM* s, uint8 bMsgType, uint8 flags, uint16 wMsgSize)
+{
+       /* preamble (4 bytes) */
+       stream_write_uint8(s, bMsgType); /* bMsgType (1 byte) */
+       stream_write_uint8(s, flags); /* flags (1 byte) */
+       stream_write_uint16(s, wMsgSize); /* wMsgSize (2 bytes) */
+}
+
+/**
+ * Initialize a license packet stream.\n
+ * @param license license module
+ * @return stream
+ */
+
+STREAM* license_send_stream_init(rdpLicense* license)
+{
+       STREAM* s;
+       s = transport_send_stream_init(license->rdp->transport, 4096);
+       stream_seek(s, LICENSE_PACKET_HEADER_MAX_LENGTH);
+       return s;
+}
+
+/**
+ * Send an RDP licensing packet.\n
+ * @msdn{cc240479}
+ * @param license license module
+ * @param s stream
+ */
+
+boolean license_send(rdpLicense* license, STREAM* s, uint8 type)
+{
+       int length;
+       uint8 flags;
+       uint16 wMsgSize;
+       uint16 sec_flags;
+
+       DEBUG_LICENSE("Sending %s Packet", LICENSE_MESSAGE_STRINGS[type & 0x1F]);
+
+       length = stream_get_length(s);
+       stream_set_pos(s, 0);
+
+       sec_flags = SEC_LICENSE_PKT;
+       wMsgSize = length - LICENSE_PACKET_HEADER_MAX_LENGTH + 4;
+       /**
+        * Using EXTENDED_ERROR_MSG_SUPPORTED here would cause mstsc to crash when
+        * running in server mode! This flag seems to be incorrectly documented.
+        */
+       flags = PREAMBLE_VERSION_3_0;
+
+       rdp_write_header(license->rdp, s, length, MCS_GLOBAL_CHANNEL_ID);
+       rdp_write_security_header(s, sec_flags);
+       license_write_preamble(s, type, flags, wMsgSize);
+
+#ifdef WITH_DEBUG_LICENSE
+       printf("Sending %s Packet, length %d\n", LICENSE_MESSAGE_STRINGS[type & 0x1F], wMsgSize);
+       freerdp_hexdump(s->p - 4, wMsgSize);
+#endif
+
+       stream_set_pos(s, length);
+       if (transport_write(license->rdp->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+/**
+ * Receive an RDP licensing packet.\n
+ * @msdn{cc240479}
+ * @param license license module
+ * @param s stream
+ */
+
+boolean license_recv(rdpLicense* license, STREAM* s)
+{
+       uint16 length;
+       uint16 channelId;
+       uint16 sec_flags;
+       uint8 flags;
+       uint8 bMsgType;
+       uint16 wMsgSize;
+
+       if (!rdp_read_header(license->rdp, s, &length, &channelId))
+       {
+               printf("Incorrect RDP header.\n");
+               return false;
+       }
+
+       rdp_read_security_header(s, &sec_flags);
+       if (!(sec_flags & SEC_LICENSE_PKT))
+       {
+               stream_rewind(s, RDP_SECURITY_HEADER_LENGTH);
+               if (rdp_recv_out_of_sequence_pdu(license->rdp, s) != true)
+               {
+                       printf("Unexpected license packet.\n");
+                       return false;
+               }
+               return true;
+       }
+
+       license_read_preamble(s, &bMsgType, &flags, &wMsgSize); /* preamble (4 bytes) */
+
+       DEBUG_LICENSE("Receiving %s Packet", LICENSE_MESSAGE_STRINGS[bMsgType & 0x1F]);
+
+       switch (bMsgType)
+       {
+               case LICENSE_REQUEST:
+                       license_read_license_request_packet(license, s);
+                       license_send_new_license_request_packet(license);
+                       break;
+
+               case PLATFORM_CHALLENGE:
+                       license_read_platform_challenge_packet(license, s);
+                       license_send_platform_challenge_response_packet(license);
+                       break;
+
+               case NEW_LICENSE:
+                       license_read_new_license_packet(license, s);
+                       break;
+
+               case UPGRADE_LICENSE:
+                       license_read_upgrade_license_packet(license, s);
+                       break;
+
+               case ERROR_ALERT:
+                       license_read_error_alert_packet(license, s);
+                       break;
+
+               default:
+                       printf("invalid bMsgType:%d\n", bMsgType);
+                       return false;
+       }
+
+       return true;
+}
+
+void license_generate_randoms(rdpLicense* license)
+{
+#if 0
+       crypto_nonce(license->client_random, CLIENT_RANDOM_LENGTH); /* ClientRandom */
+       crypto_nonce(license->premaster_secret, PREMASTER_SECRET_LENGTH); /* PremasterSecret */
+#else
+       memset(license->client_random, 0, CLIENT_RANDOM_LENGTH); /* ClientRandom */
+       memset(license->premaster_secret, 0, PREMASTER_SECRET_LENGTH); /* PremasterSecret */
+#endif
+}
+
+/**
+ * Generate License Cryptographic Keys.
+ * @param license license module
+ */
+
+void license_generate_keys(rdpLicense* license)
+{
+       security_master_secret(license->premaster_secret, license->client_random,
+                       license->server_random, license->master_secret); /* MasterSecret */
+
+       security_session_key_blob(license->master_secret, license->client_random,
+                       license->server_random, license->session_key_blob); /* SessionKeyBlob */
+
+       security_mac_salt_key(license->session_key_blob, license->client_random,
+                       license->server_random, license->mac_salt_key); /* MacSaltKey */
+
+       security_licensing_encryption_key(license->session_key_blob, license->client_random,
+                       license->server_random, license->licensing_encryption_key); /* LicensingEncryptionKey */
+
+#ifdef WITH_DEBUG_LICENSE
+       printf("ClientRandom:\n");
+       freerdp_hexdump(license->client_random, CLIENT_RANDOM_LENGTH);
+
+       printf("ServerRandom:\n");
+       freerdp_hexdump(license->server_random, SERVER_RANDOM_LENGTH);
+
+       printf("PremasterSecret:\n");
+       freerdp_hexdump(license->premaster_secret, PREMASTER_SECRET_LENGTH);
+
+       printf("MasterSecret:\n");
+       freerdp_hexdump(license->master_secret, MASTER_SECRET_LENGTH);
+
+       printf("SessionKeyBlob:\n");
+       freerdp_hexdump(license->session_key_blob, SESSION_KEY_BLOB_LENGTH);
+
+       printf("MacSaltKey:\n");
+       freerdp_hexdump(license->mac_salt_key, MAC_SALT_KEY_LENGTH);
+
+       printf("LicensingEncryptionKey:\n");
+       freerdp_hexdump(license->licensing_encryption_key, LICENSING_ENCRYPTION_KEY_LENGTH);
+#endif
+}
+
+/**
+ * Generate Unique Hardware Identifier (CLIENT_HARDWARE_ID).\n
+ * @param license license module
+ */
+
+void license_generate_hwid(rdpLicense* license)
+{
+       CryptoMd5 md5;
+       uint8* mac_address;
+
+       memset(license->hwid, 0, HWID_LENGTH);
+       mac_address = license->rdp->transport->tcp->mac_address;
+
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, mac_address, 6);
+       crypto_md5_final(md5, &license->hwid[HWID_PLATFORM_ID_LENGTH]);
+}
+
+void license_encrypt_premaster_secret(rdpLicense* license)
+{
+       uint8* encrypted_premaster_secret;
+#if 0
+       int key_length;
+       uint8* modulus;
+       uint8* exponent;
+       rdpCertificate *certificate;
+
+       if (license->server_certificate->length)
+               certificate = license->certificate;
+       else
+               certificate = license->rdp->settings->server_cert;
+
+       exponent = certificate->cert_info.exponent;
+       modulus = certificate->cert_info.modulus.data;
+       key_length = certificate->cert_info.modulus.length;
+
+#ifdef WITH_DEBUG_LICENSE
+       printf("modulus (%d bits):\n", key_length * 8);
+       freerdp_hexdump(modulus, key_length);
+
+       printf("exponent:\n");
+       freerdp_hexdump(exponent, 4);
+#endif
+
+       encrypted_premaster_secret = (uint8*) xmalloc(MODULUS_MAX_SIZE);
+       memset(encrypted_premaster_secret, 0, MODULUS_MAX_SIZE);
+
+       crypto_rsa_public_encrypt(license->premaster_secret, PREMASTER_SECRET_LENGTH,
+                       key_length, modulus, exponent, encrypted_premaster_secret);
+
+       license->encrypted_premaster_secret->type = BB_RANDOM_BLOB;
+       license->encrypted_premaster_secret->length = PREMASTER_SECRET_LENGTH;
+       license->encrypted_premaster_secret->data = encrypted_premaster_secret;
+#else
+       encrypted_premaster_secret = (uint8*) xmalloc(MODULUS_MAX_SIZE);
+       memset(encrypted_premaster_secret, 0, MODULUS_MAX_SIZE);
+
+       license->encrypted_premaster_secret->type = BB_RANDOM_BLOB;
+       license->encrypted_premaster_secret->length = PREMASTER_SECRET_LENGTH;
+       license->encrypted_premaster_secret->data = encrypted_premaster_secret;
+#endif
+}
+
+void license_decrypt_platform_challenge(rdpLicense* license)
+{
+       CryptoRc4 rc4;
+
+       license->platform_challenge->data =
+                       (uint8*) xmalloc(license->encrypted_platform_challenge->length);
+       license->platform_challenge->length =
+                       license->encrypted_platform_challenge->length;
+
+       rc4 = crypto_rc4_init(license->licensing_encryption_key, LICENSING_ENCRYPTION_KEY_LENGTH);
+
+       crypto_rc4(rc4, license->encrypted_platform_challenge->length,
+                       license->encrypted_platform_challenge->data,
+                       license->platform_challenge->data);
+
+#ifdef WITH_DEBUG_LICENSE
+       printf("encrypted_platform challenge:\n");
+       freerdp_hexdump(license->encrypted_platform_challenge->data,
+                       license->encrypted_platform_challenge->length);
+
+       printf("platform challenge:\n");
+       freerdp_hexdump(license->platform_challenge->data, license->platform_challenge->length);
+#endif
+
+       crypto_rc4_free(rc4);
+}
+
+/**
+ * Read Product Information (PRODUCT_INFO).\n
+ * @msdn{cc241915}
+ * @param s stream
+ * @param productInfo product information
+ */
+
+void license_read_product_info(STREAM* s, PRODUCT_INFO* productInfo)
+{
+       stream_read_uint32(s, productInfo->dwVersion); /* dwVersion (4 bytes) */
+
+       stream_read_uint32(s, productInfo->cbCompanyName); /* cbCompanyName (4 bytes) */
+
+       productInfo->pbCompanyName = (uint8*) xmalloc(productInfo->cbCompanyName);
+       stream_read(s, productInfo->pbCompanyName, productInfo->cbCompanyName);
+
+       stream_read_uint32(s, productInfo->cbProductId); /* cbProductId (4 bytes) */
+
+       productInfo->pbProductId = (uint8*) xmalloc(productInfo->cbProductId);
+       stream_read(s, productInfo->pbProductId, productInfo->cbProductId);
+}
+
+/**
+ * Allocate New Product Information (PRODUCT_INFO).\n
+ * @msdn{cc241915}
+ * @return new product information
+ */
+
+PRODUCT_INFO* license_new_product_info()
+{
+       PRODUCT_INFO* productInfo;
+
+       productInfo = (PRODUCT_INFO*) xmalloc(sizeof(PRODUCT_INFO));
+
+       productInfo->dwVersion = 0;
+       productInfo->cbCompanyName = 0;
+       productInfo->pbCompanyName = NULL;
+       productInfo->cbProductId = 0;
+       productInfo->pbProductId = NULL;
+
+       return productInfo;
+}
+
+/**
+ * Free Product Information (PRODUCT_INFO).\n
+ * @msdn{cc241915}
+ * @param productInfo product information
+ */
+
+void license_free_product_info(PRODUCT_INFO* productInfo)
+{
+       if (productInfo->pbCompanyName != NULL)
+               xfree(productInfo->pbCompanyName);
+
+       if (productInfo->pbProductId != NULL)
+               xfree(productInfo->pbProductId);
+
+       xfree(productInfo);
+}
+
+/**
+ * Read License Binary Blob (LICENSE_BINARY_BLOB).\n
+ * @msdn{cc240481}
+ * @param s stream
+ * @param blob license binary blob
+ */
+
+void license_read_binary_blob(STREAM* s, LICENSE_BLOB* blob)
+{
+       uint16 wBlobType;
+
+       stream_read_uint16(s, wBlobType); /* wBlobType (2 bytes) */
+       stream_read_uint16(s, blob->length); /* wBlobLen (2 bytes) */
+
+       /*
+        * Server can choose to not send data by setting len to 0.
+        * If so, it may not bother to set the type, so shortcut the warning
+        */
+       if (blob->type != BB_ANY_BLOB && blob->length == 0)
+               return;
+
+       if (blob->type != wBlobType && blob->type != BB_ANY_BLOB)
+       {
+               printf("license binary blob type (%x) does not match expected type (%x).\n", wBlobType, blob->type);
+       }
+
+       blob->type = wBlobType;
+       blob->data = (uint8*) xmalloc(blob->length);
+
+       stream_read(s, blob->data, blob->length); /* blobData */
+}
+
+/**
+ * Write License Binary Blob (LICENSE_BINARY_BLOB).\n
+ * @msdn{cc240481}
+ * @param s stream
+ * @param blob license binary blob
+ */
+
+void license_write_binary_blob(STREAM* s, LICENSE_BLOB* blob)
+{
+       stream_write_uint16(s, blob->type); /* wBlobType (2 bytes) */
+       stream_write_uint16(s, blob->length); /* wBlobLen (2 bytes) */
+
+       if (blob->length > 0)
+               stream_write(s, blob->data, blob->length); /* blobData */
+}
+
+void license_write_padded_binary_blob(STREAM* s, LICENSE_BLOB* blob)
+{
+       uint16 pad_len;
+
+       pad_len = 72 % blob->length;
+       stream_write_uint16(s, blob->type); /* wBlobType (2 bytes) */
+       stream_write_uint16(s, blob->length + pad_len); /* wBlobLen (2 bytes) */
+
+       if (blob->length > 0)
+               stream_write(s, blob->data, blob->length); /* blobData */
+
+       stream_write_zero(s, pad_len);
+}
+
+/**
+ * Allocate New License Binary Blob (LICENSE_BINARY_BLOB).\n
+ * @msdn{cc240481}
+ * @return new license binary blob
+ */
+
+LICENSE_BLOB* license_new_binary_blob(uint16 type)
+{
+       LICENSE_BLOB* blob;
+
+       blob = (LICENSE_BLOB*) xmalloc(sizeof(LICENSE_BLOB));
+       blob->type = type;
+       blob->length = 0;
+       blob->data = NULL;
+
+       return blob;
+}
+
+/**
+ * Free License Binary Blob (LICENSE_BINARY_BLOB).\n
+ * @msdn{cc240481}
+ * @param blob license binary blob
+ */
+
+void license_free_binary_blob(LICENSE_BLOB* blob)
+{
+       if (blob->data != NULL)
+               xfree(blob->data);
+
+       xfree(blob);
+}
+
+/**
+ * Read License Scope List (SCOPE_LIST).\n
+ * @msdn{cc241916}
+ * @param s stream
+ * @param scopeList scope list
+ */
+
+void license_read_scope_list(STREAM* s, SCOPE_LIST* scopeList)
+{
+       uint32 i;
+       uint32 scopeCount;
+
+       stream_read_uint32(s, scopeCount); /* ScopeCount (4 bytes) */
+
+       scopeList->count = scopeCount;
+       scopeList->array = (LICENSE_BLOB*) xmalloc(sizeof(LICENSE_BLOB) * scopeCount);
+
+       /* ScopeArray */
+       for (i = 0; i < scopeCount; i++)
+       {
+               scopeList->array[i].type = BB_SCOPE_BLOB;
+               license_read_binary_blob(s, &scopeList->array[i]);
+       }
+}
+
+/**
+ * Allocate New License Scope List (SCOPE_LIST).\n
+ * @msdn{cc241916}
+ * @return new scope list
+ */
+
+SCOPE_LIST* license_new_scope_list()
+{
+       SCOPE_LIST* scopeList;
+
+       scopeList = (SCOPE_LIST*) xmalloc(sizeof(SCOPE_LIST));
+       scopeList->count = 0;
+       scopeList->array = NULL;
+
+       return scopeList;
+}
+
+/**
+ * Free License Scope List (SCOPE_LIST).\n
+ * @msdn{cc241916}
+ * @param scopeList scope list
+ */
+
+void license_free_scope_list(SCOPE_LIST* scopeList)
+{
+       uint32 i;
+
+       for (i = 0; i < scopeList->count; i++)
+       {
+               license_free_binary_blob(&scopeList->array[i]);
+       }
+
+       xfree(scopeList);
+}
+
+/**
+ * Read a LICENSE_REQUEST packet.\n
+ * @msdn{cc241914}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_read_license_request_packet(rdpLicense* license, STREAM* s)
+{
+       /* ServerRandom (32 bytes) */
+       stream_read(s, license->server_random, 32);
+
+       /* ProductInfo */
+       license_read_product_info(s, license->product_info);
+
+       /* KeyExchangeList */
+       license_read_binary_blob(s, license->key_exchange_list);
+
+       /* ServerCertificate */
+       license_read_binary_blob(s, license->server_certificate);
+
+       /* ScopeList */
+       license_read_scope_list(s, license->scope_list);
+
+       /* Parse Server Certificate */
+       certificate_read_server_certificate(license->certificate,
+                       license->server_certificate->data, license->server_certificate->length);
+
+       license_generate_keys(license);
+       license_generate_hwid(license);
+       license_encrypt_premaster_secret(license);
+}
+
+/**
+ * Read a PLATFORM_CHALLENGE packet.\n
+ * @msdn{cc241921}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_read_platform_challenge_packet(rdpLicense* license, STREAM* s)
+{
+       DEBUG_LICENSE("Receiving Platform Challenge Packet");
+
+       stream_seek(s, 4); /* ConnectFlags, Reserved (4 bytes) */
+
+       /* EncryptedPlatformChallenge */
+       license->encrypted_platform_challenge->type = BB_ANY_BLOB;
+       license_read_binary_blob(s, license->encrypted_platform_challenge);
+       license->encrypted_platform_challenge->type = BB_ENCRYPTED_DATA_BLOB;
+
+       /* MACData (16 bytes) */
+       stream_seek(s, 16);
+
+       license_decrypt_platform_challenge(license);
+}
+
+/**
+ * Read a NEW_LICENSE packet.\n
+ * @msdn{cc241926}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_read_new_license_packet(rdpLicense* license, STREAM* s)
+{
+       DEBUG_LICENSE("Receiving New License Packet");
+       license->state = LICENSE_STATE_COMPLETED;
+}
+
+/**
+ * Read an UPGRADE_LICENSE packet.\n
+ * @msdn{cc241924}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_read_upgrade_license_packet(rdpLicense* license, STREAM* s)
+{
+       DEBUG_LICENSE("Receiving Upgrade License Packet");
+       license->state = LICENSE_STATE_COMPLETED;
+}
+
+/**
+ * Read an ERROR_ALERT packet.\n
+ * @msdn{cc240482}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_read_error_alert_packet(rdpLicense* license, STREAM* s)
+{
+       uint32 dwErrorCode;
+       uint32 dwStateTransition;
+
+       stream_read_uint32(s, dwErrorCode); /* dwErrorCode (4 bytes) */
+       stream_read_uint32(s, dwStateTransition); /* dwStateTransition (4 bytes) */
+       license_read_binary_blob(s, license->error_info); /* bbErrorInfo */
+
+#ifdef WITH_DEBUG_LICENSE
+       printf("dwErrorCode: %s, dwStateTransition: %s\n",
+                       error_codes[dwErrorCode], state_transitions[dwStateTransition]);
+#endif
+
+       if (dwErrorCode == STATUS_VALID_CLIENT)
+       {
+               license->state = LICENSE_STATE_COMPLETED;
+               return;
+       }
+
+       switch (dwStateTransition)
+       {
+               case ST_TOTAL_ABORT:
+                       license->state = LICENSE_STATE_ABORTED;
+                       break;
+
+               case ST_NO_TRANSITION:
+                       license->state = LICENSE_STATE_COMPLETED;
+                       break;
+
+               case ST_RESET_PHASE_TO_START:
+                       license->state = LICENSE_STATE_AWAIT;
+                       break;
+
+               case ST_RESEND_LAST_MESSAGE:
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+/**
+ * Write Platform ID.\n
+ * @msdn{cc241918}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_write_platform_id(rdpLicense* license, STREAM* s)
+{
+       stream_write_uint8(s, 0); /* Client Operating System Version */
+       stream_write_uint8(s, 0); /* Independent Software Vendor (ISV) */
+       stream_write_uint16(s, 0); /* Client Software Build */
+}
+
+/**
+ * Write a NEW_LICENSE_REQUEST packet.\n
+ * @msdn{cc241918}
+ * @param license license module
+ * @param s stream
+ */
+
+void license_write_new_license_request_packet(rdpLicense* license, STREAM* s)
+{
+       stream_write_uint32(s, KEY_EXCHANGE_ALG_RSA); /* PreferredKeyExchangeAlg (4 bytes) */
+       license_write_platform_id(license, s); /* PlatformId (4 bytes) */
+       stream_write(s, license->client_random, 32); /* ClientRandom (32 bytes) */
+       license_write_padded_binary_blob(s, license->encrypted_premaster_secret); /* EncryptedPremasterSecret */
+       license_write_binary_blob(s, license->client_user_name); /* ClientUserName */
+       license_write_binary_blob(s, license->client_machine_name); /* ClientMachineName */
+}
+
+/**
+ * Send a NEW_LICENSE_REQUEST packet.\n
+ * @msdn{cc241918}
+ * @param license license module
+ */
+
+void license_send_new_license_request_packet(rdpLicense* license)
+{
+       STREAM* s;
+       char* username;
+
+       s = license_send_stream_init(license);
+
+       if (license->rdp->settings->username != NULL)
+               username = license->rdp->settings->username;
+       else
+               username = "username";
+
+       license->client_user_name->data = (uint8*) username;
+       license->client_user_name->length = strlen(username) + 1;
+
+       license->client_machine_name->data = (uint8*) license->rdp->settings->client_hostname;
+       license->client_machine_name->length = strlen(license->rdp->settings->client_hostname) + 1;
+
+       license_write_new_license_request_packet(license, s);
+
+       license_send(license, s, NEW_LICENSE_REQUEST);
+
+       license->client_user_name->data = NULL;
+       license->client_user_name->length = 0;
+
+       license->client_machine_name->data = NULL;
+       license->client_machine_name->length = 0;
+}
+
+/**
+ * Write Client Challenge Response Packet.\n
+ * @msdn{cc241922}
+ * @param license license module
+ * @param s stream
+ * @param mac_data signature
+ */
+
+void license_write_platform_challenge_response_packet(rdpLicense* license, STREAM* s, uint8* mac_data)
+{
+       /* EncryptedPlatformChallengeResponse */
+       license_write_binary_blob(s, license->encrypted_platform_challenge);
+
+       /* EncryptedHWID */
+       license_write_binary_blob(s, license->encrypted_hwid);
+
+       /* MACData */
+       stream_write(s, mac_data, 16);
+}
+
+/**
+ * Send Client Challenge Response Packet.\n
+ * @msdn{cc241922}
+ * @param license license module
+ */
+
+void license_send_platform_challenge_response_packet(rdpLicense* license)
+{
+       STREAM* s;
+       int length;
+       uint8* buffer;
+       CryptoRc4 rc4;
+       uint8 mac_data[16];
+
+       s = license_send_stream_init(license);
+       DEBUG_LICENSE("Sending Platform Challenge Response Packet");
+
+       license->encrypted_platform_challenge->type = BB_DATA_BLOB;
+       length = license->platform_challenge->length + HWID_LENGTH;
+       buffer = (uint8*) xmalloc(length);
+       memcpy(buffer, license->platform_challenge->data, license->platform_challenge->length);
+       memcpy(&buffer[license->platform_challenge->length], license->hwid, HWID_LENGTH);
+       security_mac_data(license->mac_salt_key, buffer, length, mac_data);
+       xfree(buffer);
+
+       buffer = (uint8*) xmalloc(HWID_LENGTH);
+       rc4 = crypto_rc4_init(license->licensing_encryption_key, LICENSING_ENCRYPTION_KEY_LENGTH);
+       crypto_rc4(rc4, HWID_LENGTH, license->hwid, buffer);
+       crypto_rc4_free(rc4);
+
+#ifdef WITH_DEBUG_LICENSE
+       printf("Licensing Encryption Key:\n");
+       freerdp_hexdump(license->licensing_encryption_key, 16);
+
+       printf("HardwareID:\n");
+       freerdp_hexdump(license->hwid, 20);
+
+       printf("Encrypted HardwareID:\n");
+       freerdp_hexdump(buffer, 20);
+#endif
+
+       license->encrypted_hwid->type = BB_DATA_BLOB;
+       license->encrypted_hwid->data = buffer;
+       license->encrypted_hwid->length = HWID_LENGTH;
+
+       license_write_platform_challenge_response_packet(license, s, mac_data);
+
+       license_send(license, s, PLATFORM_CHALLENGE_RESPONSE);
+}
+
+/**
+ * Send Server License Error - Valid Client Packet.\n
+ * @msdn{cc241922}
+ * @param license license module
+ */
+
+boolean license_send_valid_client_error_packet(rdpLicense* license)
+{
+       STREAM* s;
+
+       s = license_send_stream_init(license);
+
+       stream_write_uint32(s, STATUS_VALID_CLIENT); /* dwErrorCode */
+       stream_write_uint32(s, ST_NO_TRANSITION); /* dwStateTransition */
+
+       license_write_binary_blob(s, license->error_info);
+
+       license_send(license, s, ERROR_ALERT);
+
+       return true;
+}
+
+/**
+ * Instantiate new license module.
+ * @param rdp RDP module
+ * @return new license module
+ */
+
+rdpLicense* license_new(rdpRdp* rdp)
+{
+       rdpLicense* license;
+
+       license = (rdpLicense*) xzalloc(sizeof(rdpLicense));
+
+       if (license != NULL)
+       {
+               license->rdp = rdp;
+               license->state = LICENSE_STATE_AWAIT;
+               //license->certificate = certificate_new(rdp);
+               license->certificate = certificate_new();
+               license->product_info = license_new_product_info();
+               license->error_info = license_new_binary_blob(BB_ERROR_BLOB);
+               license->key_exchange_list = license_new_binary_blob(BB_KEY_EXCHG_ALG_BLOB);
+               license->server_certificate = license_new_binary_blob(BB_CERTIFICATE_BLOB);
+               license->client_user_name = license_new_binary_blob(BB_CLIENT_USER_NAME_BLOB);
+               license->client_machine_name = license_new_binary_blob(BB_CLIENT_MACHINE_NAME_BLOB);
+               license->platform_challenge = license_new_binary_blob(BB_ANY_BLOB);
+               license->encrypted_platform_challenge = license_new_binary_blob(BB_ANY_BLOB);
+               license->encrypted_premaster_secret = license_new_binary_blob(BB_ANY_BLOB);
+               license->encrypted_hwid = license_new_binary_blob(BB_ENCRYPTED_DATA_BLOB);
+               license->scope_list = license_new_scope_list();
+               license_generate_randoms(license);
+       }
+
+       return license;
+}
+
+/**
+ * Free license module.
+ * @param license license module to be freed
+ */
+
+void license_free(rdpLicense* license)
+{
+       if (license != NULL)
+       {
+               certificate_free(license->certificate);
+               license_free_product_info(license->product_info);
+               license_free_binary_blob(license->error_info);
+               license_free_binary_blob(license->key_exchange_list);
+               license_free_binary_blob(license->server_certificate);
+               license_free_binary_blob(license->client_user_name);
+               license_free_binary_blob(license->client_machine_name);
+               license_free_binary_blob(license->platform_challenge);
+               license_free_binary_blob(license->encrypted_platform_challenge);
+               license_free_binary_blob(license->encrypted_premaster_secret);
+               license_free_binary_blob(license->encrypted_hwid);
+               license_free_scope_list(license->scope_list);
+               xfree(license);
+       }
+}
+
diff --git a/libfreerdp-core/license.h b/libfreerdp-core/license.h
new file mode 100644 (file)
index 0000000..0fe1de6
--- /dev/null
@@ -0,0 +1,205 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Licensing
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LICENSE_H
+#define __LICENSE_H
+
+typedef struct rdp_license rdpLicense;
+
+#include "rdp.h"
+#include "crypto.h"
+#include "certificate.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+
+/* Licensing Packet Types */
+#define LICENSE_REQUEST                                0x01
+#define PLATFORM_CHALLENGE                     0x02
+#define NEW_LICENSE                            0x03
+#define UPGRADE_LICENSE                                0x04
+#define LICENSE_INFO                           0x12
+#define NEW_LICENSE_REQUEST                    0x13
+#define PLATFORM_CHALLENGE_RESPONSE            0x15
+#define ERROR_ALERT                            0xFF
+
+#define LICENSE_PKT_CS_MASK    (LICENSE_INFO | NEW_LICENSE_REQUEST | PLATFORM_CHALLENGE_RESPONSE | ERROR_ALERT)
+#define LICENSE_PKT_SC_MASK    (LICENSE_REQUEST | PLATFORM_CHALLENGE | NEW_LICENSE | UPGRADE_LICENSE | ERROR_ALERT)
+#define LICENSE_PKT_MASK       (LICENSE_PKT_CS_MASK | LICENSE_PKT_SC_MASK)
+
+#define LICENSE_PREAMBLE_LENGTH                        4
+#define LICENSE_PACKET_HEADER_MAX_LENGTH       (RDP_PACKET_HEADER_MAX_LENGTH + RDP_SECURITY_HEADER_LENGTH + LICENSE_PREAMBLE_LENGTH)
+
+/* Cryptographic Lengths */
+#define CLIENT_RANDOM_LENGTH                   32
+#define SERVER_RANDOM_LENGTH                   32
+#define MASTER_SECRET_LENGTH                   48
+#define PREMASTER_SECRET_LENGTH                        48
+#define SESSION_KEY_BLOB_LENGTH                        48
+#define MAC_SALT_KEY_LENGTH                    16
+#define LICENSING_ENCRYPTION_KEY_LENGTH                16
+#define HWID_PLATFORM_ID_LENGTH                        4
+#define HWID_UNIQUE_DATA_LENGTH                        16
+#define HWID_LENGTH                            20
+#define LICENSING_PADDING_SIZE                 8
+
+/* Licensing Preamble Flags */
+#define PREAMBLE_VERSION_2_0                   0x02
+#define PREAMBLE_VERSION_3_0                   0x03
+#define LicenseProtocolVersionMask             0x0F
+#define EXTENDED_ERROR_MSG_SUPPORTED           0x80
+
+/* Licensing Binary Blob Types */
+#define BB_ANY_BLOB                            0x0000
+#define BB_DATA_BLOB                           0x0001
+#define BB_RANDOM_BLOB                         0x0002
+#define BB_CERTIFICATE_BLOB                    0x0003
+#define BB_ERROR_BLOB                          0x0004
+#define BB_ENCRYPTED_DATA_BLOB                 0x0009
+#define BB_KEY_EXCHG_ALG_BLOB                  0x000D
+#define BB_SCOPE_BLOB                          0x000E
+#define BB_CLIENT_USER_NAME_BLOB               0x000F
+#define BB_CLIENT_MACHINE_NAME_BLOB            0x0010
+
+/* Key Exchange Algorithms */
+#define KEY_EXCHANGE_ALG_RSA                   0x00000001
+
+/* Licensing Error Codes */
+#define ERR_INVALID_SERVER_CERTIFICATE         0x00000001
+#define ERR_NO_LICENSE                         0x00000002
+#define ERR_INVALID_MAC                                0x00000003
+#define ERR_INVALID_SCOPE                      0x00000004
+#define ERR_NO_LICENSE_SERVER                  0x00000006
+#define STATUS_VALID_CLIENT                    0x00000007
+#define ERR_INVALID_CLIENT                     0x00000008
+#define ERR_INVALID_PRODUCT_ID                 0x0000000B
+#define ERR_INVALID_MESSAGE_LENGTH             0x0000000C
+
+/* Licensing State Transition Codes */
+#define ST_TOTAL_ABORT                         0x00000001
+#define ST_NO_TRANSITION                       0x00000002
+#define ST_RESET_PHASE_TO_START                        0x00000003
+#define ST_RESEND_LAST_MESSAGE                 0x00000004
+
+typedef struct
+{
+       uint32 dwVersion;
+       uint32 cbCompanyName;
+       uint8* pbCompanyName;
+       uint32 cbProductId;
+       uint8* pbProductId;
+} PRODUCT_INFO;
+
+typedef struct
+{
+       uint16 type;
+       uint16 length;
+       uint8* data;
+} LICENSE_BLOB;
+
+typedef struct
+{
+       uint32 count;
+       LICENSE_BLOB* array;
+} SCOPE_LIST;
+
+typedef enum
+{
+       LICENSE_STATE_AWAIT,
+       LICENSE_STATE_PROCESS,
+       LICENSE_STATE_ABORTED,
+       LICENSE_STATE_COMPLETED
+} LICENSE_STATE;
+
+struct rdp_license
+{
+       LICENSE_STATE state;
+       struct rdp_rdp* rdp;
+       struct rdp_certificate* certificate;
+       uint8 hwid[HWID_LENGTH];
+       uint8 modulus[MODULUS_MAX_SIZE];
+       uint8 exponent[EXPONENT_MAX_SIZE];
+       uint8 client_random[CLIENT_RANDOM_LENGTH];
+       uint8 server_random[SERVER_RANDOM_LENGTH];
+       uint8 master_secret[MASTER_SECRET_LENGTH];
+       uint8 premaster_secret[PREMASTER_SECRET_LENGTH];
+       uint8 session_key_blob[SESSION_KEY_BLOB_LENGTH];
+       uint8 mac_salt_key[MAC_SALT_KEY_LENGTH];
+       uint8 licensing_encryption_key[LICENSING_ENCRYPTION_KEY_LENGTH];
+       PRODUCT_INFO* product_info;
+       LICENSE_BLOB* error_info;
+       LICENSE_BLOB* key_exchange_list;
+       LICENSE_BLOB* server_certificate;
+       LICENSE_BLOB* client_user_name;
+       LICENSE_BLOB* client_machine_name;
+       LICENSE_BLOB* platform_challenge;
+       LICENSE_BLOB* encrypted_premaster_secret;
+       LICENSE_BLOB* encrypted_platform_challenge;
+       LICENSE_BLOB* encrypted_hwid;
+       SCOPE_LIST* scope_list;
+};
+
+boolean license_recv(rdpLicense* license, STREAM* s);
+boolean license_send(rdpLicense* license, STREAM* s, uint8 type);
+STREAM* license_send_stream_init(rdpLicense* license);
+
+void license_generate_randoms(rdpLicense* license);
+void license_generate_keys(rdpLicense* license);
+void license_generate_hwid(rdpLicense* license);
+void license_encrypt_premaster_secret(rdpLicense* license);
+void license_decrypt_platform_challenge(rdpLicense* license);
+
+PRODUCT_INFO* license_new_product_info();
+void license_free_product_info(PRODUCT_INFO* productInfo);
+void license_read_product_info(STREAM* s, PRODUCT_INFO* productInfo);
+
+LICENSE_BLOB* license_new_binary_blob(uint16 type);
+void license_free_binary_blob(LICENSE_BLOB* blob);
+void license_read_binary_blob(STREAM* s, LICENSE_BLOB* blob);
+void license_write_binary_blob(STREAM* s, LICENSE_BLOB* blob);
+
+SCOPE_LIST* license_new_scope_list();
+void license_free_scope_list(SCOPE_LIST* scopeList);
+void license_read_scope_list(STREAM* s, SCOPE_LIST* scopeList);
+
+void license_read_license_request_packet(rdpLicense* license, STREAM* s);
+void license_read_platform_challenge_packet(rdpLicense* license, STREAM* s);
+void license_read_new_license_packet(rdpLicense* license, STREAM* s);
+void license_read_upgrade_license_packet(rdpLicense* license, STREAM* s);
+void license_read_error_alert_packet(rdpLicense* license, STREAM* s);
+
+void license_write_new_license_request_packet(rdpLicense* license, STREAM* s);
+void license_send_new_license_request_packet(rdpLicense* license);
+
+void license_write_platform_challenge_response_packet(rdpLicense* license, STREAM* s, uint8* mac_data);
+void license_send_platform_challenge_response_packet(rdpLicense* license);
+
+boolean license_send_valid_client_error_packet(rdpLicense* license);
+
+rdpLicense* license_new(rdpRdp* rdp);
+void license_free(rdpLicense* license);
+
+#ifdef WITH_DEBUG_LICENSE
+#define DEBUG_LICENSE(fmt, ...) DEBUG_CLASS(LICENSE, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_LICENSE(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __LICENSE_H */
diff --git a/libfreerdp-core/listener.c b/libfreerdp-core/listener.c
new file mode 100644 (file)
index 0000000..ee3f98c
--- /dev/null
@@ -0,0 +1,230 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RDP Server Listener
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <freerdp/utils/print.h>
+
+#ifndef _WIN32
+#include <netdb.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#else
+#define close(_fd) closesocket(_fd)
+#endif
+
+#include "listener.h"
+
+static boolean freerdp_listener_open(freerdp_listener* instance, const char* bind_address, uint16 port)
+{
+       rdpListener* listener = (rdpListener*)instance->listener;
+       int status;
+       int sockfd;
+       char servname[10];
+       struct addrinfo hints = { 0 };
+       struct addrinfo* res;
+       struct addrinfo* ai;
+       int option_value;
+       void* sin_addr;
+       char buf[50];
+#ifdef _WIN32
+       u_long arg;
+#endif
+
+       hints.ai_family = AF_UNSPEC;
+       hints.ai_socktype = SOCK_STREAM;
+       if (bind_address == NULL)
+               hints.ai_flags = AI_PASSIVE;
+
+       snprintf(servname, sizeof(servname), "%d", port);
+       status = getaddrinfo(bind_address, servname, &hints, &res);
+       if (status != 0)
+       {
+               perror("getaddrinfo");
+               return false;
+       }
+
+       for (ai = res; ai && listener->num_sockfds < 5; ai = ai->ai_next)
+       {
+               if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
+                       continue;
+
+               sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+               if (sockfd == -1)
+               {
+                       perror("socket");
+                       continue;
+               }
+
+               option_value = 1;
+
+               if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void*) &option_value, sizeof(option_value)) == -1)
+                       perror("setsockopt");
+
+#ifndef _WIN32
+               fcntl(sockfd, F_SETFL, O_NONBLOCK);
+#else
+               arg = 1;
+               ioctlsocket(sockfd, FIONBIO, &arg);
+#endif
+
+               status = bind(sockfd, ai->ai_addr, ai->ai_addrlen);
+               if (status != 0)
+               {
+                       perror("bind");
+                       close(sockfd);
+                       continue;
+               }
+
+               status = listen(sockfd, 10);
+               if (status != 0)
+               {
+                       perror("listen");
+                       close(sockfd);
+                       continue;
+               }
+
+               listener->sockfds[listener->num_sockfds++] = sockfd;
+
+               if (ai->ai_family == AF_INET)
+                       sin_addr = &(((struct sockaddr_in*)ai->ai_addr)->sin_addr);
+               else
+                       sin_addr = &(((struct sockaddr_in6*)ai->ai_addr)->sin6_addr);
+
+               printf("Listening on %s port %s.\n", inet_ntop(ai->ai_family, sin_addr, buf, sizeof(buf)), servname);
+       }
+
+       freeaddrinfo(res);
+
+       return (listener->num_sockfds > 0 ? true : false);
+}
+
+static void freerdp_listener_close(freerdp_listener* instance)
+{
+       int i;
+
+       rdpListener* listener = (rdpListener*)instance->listener;
+
+       for (i = 0; i < listener->num_sockfds; i++)
+       {
+               close(listener->sockfds[i]);
+       }
+       listener->num_sockfds = 0;
+}
+
+static boolean freerdp_listener_get_fds(freerdp_listener* instance, void** rfds, int* rcount)
+{
+       rdpListener* listener = (rdpListener*)instance->listener;
+       int i;
+
+       if (listener->num_sockfds < 1)
+               return false;
+
+       for (i = 0; i < listener->num_sockfds; i++)
+       {
+               rfds[*rcount] = (void*)(long)(listener->sockfds[i]);
+               (*rcount)++;
+       }
+
+       return true;
+}
+
+static boolean freerdp_listener_check_fds(freerdp_listener* instance)
+{
+       rdpListener* listener = (rdpListener*)instance->listener;
+       struct sockaddr_storage peer_addr;
+       socklen_t peer_addr_size;
+       int peer_sockfd;
+       int i;
+       freerdp_peer* client;
+       void* sin_addr;
+
+       if (listener->num_sockfds < 1)
+               return false;
+
+       for (i = 0; i < listener->num_sockfds; i++)
+       {
+               peer_addr_size = sizeof(peer_addr);
+               peer_sockfd = accept(listener->sockfds[i], (struct sockaddr *)&peer_addr, &peer_addr_size);
+
+               if (peer_sockfd == -1)
+               {
+#ifdef _WIN32
+                       int wsa_error = WSAGetLastError();
+
+                       /* No data available */
+                       if (wsa_error == WSAEWOULDBLOCK)
+                               continue;
+#else
+                       if (errno == EAGAIN || errno == EWOULDBLOCK)
+                               continue;
+#endif
+                       perror("accept");
+                       return false;
+               }
+
+               client = freerdp_peer_new(peer_sockfd);
+
+               if (peer_addr.ss_family == AF_INET)
+                       sin_addr = &(((struct sockaddr_in*)&peer_addr)->sin_addr);
+               else
+                       sin_addr = &(((struct sockaddr_in6*)&peer_addr)->sin6_addr);
+               inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname));
+
+               IFCALL(instance->PeerAccepted, instance, client);
+       }
+
+       return true;
+}
+
+freerdp_listener* freerdp_listener_new(void)
+{
+       freerdp_listener* instance;
+       rdpListener* listener;
+
+       instance = xnew(freerdp_listener);
+       instance->Open = freerdp_listener_open;
+       instance->GetFileDescriptor = freerdp_listener_get_fds;
+       instance->CheckFileDescriptor = freerdp_listener_check_fds;
+       instance->Close = freerdp_listener_close;
+
+       listener = xnew(rdpListener);
+       listener->instance = instance;
+
+       instance->listener = (void*)listener;
+
+       return instance;
+}
+
+void freerdp_listener_free(freerdp_listener* instance)
+{
+       rdpListener* listener;
+
+       listener = (rdpListener*)instance->listener;
+       xfree(listener);
+
+       xfree(instance);
+}
+
diff --git a/libfreerdp-core/listener.h b/libfreerdp-core/listener.h
new file mode 100644 (file)
index 0000000..78a7552
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RDP Server Listener
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LISTENER_H
+#define __LISTENER_H
+
+typedef struct rdp_listener rdpListener;
+
+#include "rdp.h"
+#include <freerdp/listener.h>
+
+struct rdp_listener
+{
+       freerdp_listener* instance;
+
+       int sockfds[5];
+       int num_sockfds;
+};
+
+#endif
+
diff --git a/libfreerdp-core/mcs.c b/libfreerdp-core/mcs.c
new file mode 100644 (file)
index 0000000..b2524c6
--- /dev/null
@@ -0,0 +1,837 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.125 Multipoint Communication Service (MCS) Protocol
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gcc.h"
+
+#include "mcs.h"
+#include "tpdu.h"
+#include "tpkt.h"
+
+/**
+ * T.125 MCS is defined in:
+ *
+ * http://www.itu.int/rec/T-REC-T.125-199802-I/
+ * ITU-T T.125 Multipoint Communication Service Protocol Specification
+ */
+
+/**
+ * Connect-Initial ::= [APPLICATION 101] IMPLICIT SEQUENCE
+ * {
+ *     callingDomainSelector           OCTET_STRING,
+ *     calledDomainSelector            OCTET_STRING,
+ *     upwardFlag                      BOOLEAN,
+ *     targetParameters                DomainParameters,
+ *     minimumParameters               DomainParameters,
+ *     maximumParameters               DomainParameters,
+ *     userData                        OCTET_STRING
+ * }
+ *
+ * DomainParameters ::= SEQUENCE
+ * {
+ *     maxChannelIds                   INTEGER (0..MAX),
+ *     maxUserIds                      INTEGER (0..MAX),
+ *     maxTokenIds                     INTEGER (0..MAX),
+ *     numPriorities                   INTEGER (0..MAX),
+ *     minThroughput                   INTEGER (0..MAX),
+ *     maxHeight                       INTEGER (0..MAX),
+ *     maxMCSPDUsize                   INTEGER (0..MAX),
+ *     protocolVersion                 INTEGER (0..MAX)
+ * }
+ *
+ * Connect-Response ::= [APPLICATION 102] IMPLICIT SEQUENCE
+ * {
+ *     result                          Result,
+ *     calledConnectId                 INTEGER (0..MAX),
+ *     domainParameters                DomainParameters,
+ *     userData                        OCTET_STRING
+ * }
+ *
+ * Result ::= ENUMERATED
+ * {
+ *     rt-successful                   (0),
+ *     rt-domain-merging               (1),
+ *     rt-domain-not-hierarchical      (2),
+ *     rt-no-such-channel              (3),
+ *     rt-no-such-domain               (4),
+ *     rt-no-such-user                 (5),
+ *     rt-not-admitted                 (6),
+ *     rt-other-user-id                (7),
+ *     rt-parameters-unacceptable      (8),
+ *     rt-token-not-available          (9),
+ *     rt-token-not-possessed          (10),
+ *     rt-too-many-channels            (11),
+ *     rt-too-many-tokens              (12),
+ *     rt-too-many-users               (13),
+ *     rt-unspecified-failure          (14),
+ *     rt-user-rejected                (15)
+ * }
+ *
+ * ErectDomainRequest ::= [APPLICATION 1] IMPLICIT SEQUENCE
+ * {
+ *     subHeight                       INTEGER (0..MAX),
+ *     subInterval                     INTEGER (0..MAX)
+ * }
+ *
+ * AttachUserRequest ::= [APPPLICATION 10] IMPLICIT SEQUENCE
+ * {
+ * }
+ *
+ * AttachUserConfirm ::= [APPLICATION 11] IMPLICIT SEQUENCE
+ * {
+ *     result                          Result,
+ *     initiator                       UserId OPTIONAL
+ * }
+ *
+ * ChannelJoinRequest ::= [APPLICATION 14] IMPLICIT SEQUENCE
+ * {
+ *     initiator                       UserId,
+ *     channelId                       ChannelId
+ * }
+ *
+ * ChannelJoinConfirm ::= [APPLICATION 15] IMPLICIT SEQUENCE
+ * {
+ *     result                          Result,
+ *     initiator                       UserId,
+ *     requested                       ChannelId,
+ *     channelId                       ChannelId OPTIONAL
+ * }
+ *
+ * SendDataRequest ::= [APPLICATION 25] IMPLICIT SEQUENCE
+ * {
+ *     initiator                       UserId,
+ *     channelId                       ChannelId,
+ *     dataPriority                    DataPriority,
+ *     segmentation                    Segmentation,
+ *     userData                        OCTET_STRING
+ * }
+ *
+ * DataPriority ::= CHOICE
+ * {
+ *     top                             NULL,
+ *     high                            NULL,
+ *     medium                          NULL,
+ *     low                             NULL,
+ *     ...
+ * }
+ *
+ * Segmentation ::= BIT_STRING
+ * {
+ *     begin                           (0),
+ *     end                             (1)
+ * } (SIZE(2))
+ *
+ * SendDataIndication ::= SEQUENCE
+ * {
+ *     initiator                       UserId,
+ *     channelId                       ChannelId,
+ *     reliability                     BOOLEAN,
+ *     domainReferenceID               INTEGER (0..65535) OPTIONAL,
+ *     dataPriority                    DataPriority,
+ *     segmentation                    Segmentation,
+ *     userData                        OCTET_STRING,
+ *     totalDataSize                   INTEGER OPTIONAL,
+ *     nonStandard                     SEQUENCE OF NonStandardParameter OPTIONAL,
+ *     ...
+ * }
+ *
+ */
+
+static const uint8 callingDomainSelector[1] = "\x01";
+static const uint8 calledDomainSelector[1] = "\x01";
+
+/*
+static const char* const mcs_result_enumerated[] =
+{
+               "rt-successful",
+               "rt-domain-merging",
+               "rt-domain-not-hierarchical",
+               "rt-no-such-channel",
+               "rt-no-such-domain",
+               "rt-no-such-user",
+               "rt-not-admitted",
+               "rt-other-user-id",
+               "rt-parameters-unacceptable",
+               "rt-token-not-available",
+               "rt-token-not-possessed",
+               "rt-too-many-channels",
+               "rt-too-many-tokens",
+               "rt-too-many-users",
+               "rt-unspecified-failure",
+               "rt-user-rejected"
+};
+*/
+
+/**
+ * Read a DomainMCSPDU header.
+ * @param s stream
+ * @param domainMCSPDU DomainMCSPDU type
+ * @param length TPKT length
+ * @return
+ */
+
+boolean mcs_read_domain_mcspdu_header(STREAM* s, enum DomainMCSPDU* domainMCSPDU, uint16* length)
+{
+       uint8 choice;
+       enum DomainMCSPDU MCSPDU;
+
+       *length = tpkt_read_header(s);
+
+       if (tpdu_read_data(s) == 0)
+               return false;
+
+       MCSPDU = *domainMCSPDU;
+       per_read_choice(s, &choice);
+       *domainMCSPDU = (choice >> 2);
+
+       if (*domainMCSPDU != MCSPDU)
+               return false;
+
+       return true;
+}
+
+/**
+ * Write a DomainMCSPDU header.
+ * @param s stream
+ * @param domainMCSPDU DomainMCSPDU type
+ * @param length TPKT length
+ */
+
+void mcs_write_domain_mcspdu_header(STREAM* s, enum DomainMCSPDU domainMCSPDU, uint16 length, uint8 options)
+{
+       tpkt_write_header(s, length);
+       tpdu_write_data(s);
+       per_write_choice(s, (domainMCSPDU << 2) | options);
+}
+
+/**
+ * Initialize MCS Domain Parameters.
+ * @param domainParameters domain parameters
+ * @param maxChannelIds max channel ids
+ * @param maxUserIds max user ids
+ * @param maxTokenIds max token ids
+ * @param maxMCSPDUsize max MCS PDU size
+ */
+
+static void mcs_init_domain_parameters(DomainParameters* domainParameters,
+               uint32 maxChannelIds, uint32 maxUserIds, uint32 maxTokenIds, uint32 maxMCSPDUsize)
+{
+       domainParameters->maxChannelIds = maxChannelIds;
+       domainParameters->maxUserIds = maxUserIds;
+       domainParameters->maxTokenIds = maxTokenIds;
+       domainParameters->maxMCSPDUsize = maxMCSPDUsize;
+
+       domainParameters->numPriorities = 1;
+       domainParameters->minThroughput = 0;
+       domainParameters->maxHeight = 1;
+       domainParameters->protocolVersion = 2;
+}
+
+/**
+ * Read MCS Domain Parameters.
+ * @param s stream
+ * @param domainParameters domain parameters
+ */
+
+boolean mcs_read_domain_parameters(STREAM* s, DomainParameters* domainParameters)
+{
+       int length;
+       ber_read_sequence_tag(s, &length);
+       ber_read_integer(s, &(domainParameters->maxChannelIds));
+       ber_read_integer(s, &(domainParameters->maxUserIds));
+       ber_read_integer(s, &(domainParameters->maxTokenIds));
+       ber_read_integer(s, &(domainParameters->numPriorities));
+       ber_read_integer(s, &(domainParameters->minThroughput));
+       ber_read_integer(s, &(domainParameters->maxHeight));
+       ber_read_integer(s, &(domainParameters->maxMCSPDUsize));
+       ber_read_integer(s, &(domainParameters->protocolVersion));
+
+       return true;
+}
+
+/**
+ * Write MCS Domain Parameters.
+ * @param s stream
+ * @param domainParameters domain parameters
+ */
+
+void mcs_write_domain_parameters(STREAM* s, DomainParameters* domainParameters)
+{
+       int length;
+       STREAM* tmps;
+
+       tmps = stream_new(stream_get_size(s));
+       ber_write_integer(tmps, domainParameters->maxChannelIds);
+       ber_write_integer(tmps, domainParameters->maxUserIds);
+       ber_write_integer(tmps, domainParameters->maxTokenIds);
+       ber_write_integer(tmps, domainParameters->numPriorities);
+       ber_write_integer(tmps, domainParameters->minThroughput);
+       ber_write_integer(tmps, domainParameters->maxHeight);
+       ber_write_integer(tmps, domainParameters->maxMCSPDUsize);
+       ber_write_integer(tmps, domainParameters->protocolVersion);
+
+       length = stream_get_length(tmps);
+       ber_write_sequence_tag(s, length);
+       stream_write(s, stream_get_head(tmps), length);
+       stream_free(tmps);
+}
+
+/**
+ * Print MCS Domain Parameters.
+ * @param domainParameters domain parameters
+ */
+
+void mcs_print_domain_parameters(DomainParameters* domainParameters)
+{
+       printf("DomainParameters {\n");
+       printf("\tmaxChannelIds:%d\n", domainParameters->maxChannelIds);
+       printf("\tmaxUserIds:%d\n", domainParameters->maxUserIds);
+       printf("\tmaxTokenIds:%d\n", domainParameters->maxTokenIds);
+       printf("\tnumPriorities:%d\n", domainParameters->numPriorities);
+       printf("\tminThroughput:%d\n", domainParameters->minThroughput);
+       printf("\tmaxHeight:%d\n", domainParameters->maxHeight);
+       printf("\tmaxMCSPDUsize:%d\n", domainParameters->maxMCSPDUsize);
+       printf("\tprotocolVersion:%d\n", domainParameters->protocolVersion);
+       printf("}\n");
+}
+
+/**
+ * Read an MCS Connect Initial PDU.\n
+ * @msdn{cc240508}
+ * @param mcs MCS module
+ * @param s stream
+ */
+
+boolean mcs_recv_connect_initial(rdpMcs* mcs, STREAM* s)
+{
+       int length;
+       boolean upwardFlag;
+
+       tpkt_read_header(s);
+
+       if (tpdu_read_data(s) == 0)
+               return false;
+
+       if (!ber_read_application_tag(s, MCS_TYPE_CONNECT_INITIAL, &length))
+               return false;
+
+       /* callingDomainSelector (OCTET_STRING) */
+       if (!ber_read_octet_string(s, &length))
+               return false;
+       stream_seek(s, length);
+
+       /* calledDomainSelector (OCTET_STRING) */
+       if (!ber_read_octet_string(s, &length))
+               return false;
+       stream_seek(s, length);
+
+       /* upwardFlag (BOOLEAN) */
+       if (!ber_read_boolean(s, &upwardFlag))
+               return false;
+
+       /* targetParameters (DomainParameters) */
+       mcs_read_domain_parameters(s, &mcs->targetParameters);
+
+       /* minimumParameters (DomainParameters) */
+       mcs_read_domain_parameters(s, &mcs->minimumParameters);
+
+       /* maximumParameters (DomainParameters) */
+       mcs_read_domain_parameters(s, &mcs->maximumParameters);
+
+       if (!ber_read_octet_string(s, &length))
+               return false;
+
+       if (!gcc_read_conference_create_request(s, mcs->transport->settings))
+               return false;
+
+       return true;
+}
+
+/**
+ * Write an MCS Connect Initial PDU.\n
+ * @msdn{cc240508}
+ * @param s stream
+ * @param mcs MCS module
+ * @param user_data GCC Conference Create Request
+ */
+
+void mcs_write_connect_initial(STREAM* s, rdpMcs* mcs, STREAM* user_data)
+{
+       int length;
+       STREAM* tmps;
+
+       tmps = stream_new(stream_get_size(s));
+
+       /* callingDomainSelector (OCTET_STRING) */
+       ber_write_octet_string(tmps, callingDomainSelector, sizeof(callingDomainSelector));
+
+       /* calledDomainSelector (OCTET_STRING) */
+       ber_write_octet_string(tmps, calledDomainSelector, sizeof(calledDomainSelector));
+
+       /* upwardFlag (BOOLEAN) */
+       ber_write_boolean(tmps, true);
+
+       /* targetParameters (DomainParameters) */
+       mcs_write_domain_parameters(tmps, &mcs->targetParameters);
+
+       /* minimumParameters (DomainParameters) */
+       mcs_write_domain_parameters(tmps, &mcs->minimumParameters);
+
+       /* maximumParameters (DomainParameters) */
+       mcs_write_domain_parameters(tmps, &mcs->maximumParameters);
+
+       /* userData (OCTET_STRING) */
+       ber_write_octet_string(tmps, user_data->data, stream_get_length(user_data));
+
+       length = stream_get_length(tmps);
+       /* Connect-Initial (APPLICATION 101, IMPLICIT SEQUENCE) */
+       ber_write_application_tag(s, MCS_TYPE_CONNECT_INITIAL, length);
+       stream_write(s, stream_get_head(tmps), length);
+       stream_free(tmps);
+}
+
+/**
+ * Write an MCS Connect Response PDU.\n
+ * @msdn{cc240508}
+ * @param s stream
+ * @param mcs MCS module
+ * @param user_data GCC Conference Create Response
+ */
+
+void mcs_write_connect_response(STREAM* s, rdpMcs* mcs, STREAM* user_data)
+{
+       int length;
+       STREAM* tmps;
+
+       tmps = stream_new(stream_get_size(s));
+       ber_write_enumerated(tmps, 0, MCS_Result_enum_length);
+       ber_write_integer(tmps, 0); /* calledConnectId */
+       mcs->domainParameters = mcs->targetParameters;
+       mcs_write_domain_parameters(tmps, &(mcs->domainParameters));
+       /* userData (OCTET_STRING) */
+       ber_write_octet_string(tmps, user_data->data, stream_get_length(user_data));
+
+       length = stream_get_length(tmps);
+       ber_write_application_tag(s, MCS_TYPE_CONNECT_RESPONSE, length);
+       stream_write(s, stream_get_head(tmps), length);
+       stream_free(tmps);
+}
+
+/**
+ * Send MCS Connect Initial.\n
+ * @msdn{cc240508}
+ * @param mcs mcs module
+ */
+
+boolean mcs_send_connect_initial(rdpMcs* mcs)
+{
+       STREAM* s;
+       int length;
+       uint8 *bm, *em;
+       STREAM* gcc_CCrq;
+       STREAM* client_data;
+       int status;
+
+       client_data = stream_new(512);
+       gcc_write_client_data_blocks(client_data, mcs->transport->settings);
+
+       gcc_CCrq = stream_new(512);
+       gcc_write_conference_create_request(gcc_CCrq, client_data);
+       length = stream_get_length(gcc_CCrq) + 7;
+
+       s = transport_send_stream_init(mcs->transport, 1024);
+       stream_get_mark(s, bm);
+       stream_seek(s, 7);
+
+       mcs_write_connect_initial(s, mcs, gcc_CCrq);
+       stream_get_mark(s, em);
+       length = (em - bm);
+       stream_set_mark(s, bm);
+
+       tpkt_write_header(s, length);
+       tpdu_write_data(s);
+       stream_set_mark(s, em);
+
+       status = transport_write(mcs->transport, s);
+
+       stream_free(gcc_CCrq);
+       stream_free(client_data);
+
+       return (status < 0 ? false : true);
+}
+
+/**
+ * Read MCS Connect Response.\n
+ * @msdn{cc240501}
+ * @param mcs mcs module
+ */
+
+boolean mcs_recv_connect_response(rdpMcs* mcs, STREAM* s)
+{
+       int length;
+       uint8 result;
+       uint32 calledConnectId;
+
+       tpkt_read_header(s);
+
+       if (tpdu_read_data(s) == 0)
+               return false;
+
+       ber_read_application_tag(s, MCS_TYPE_CONNECT_RESPONSE, &length);
+       ber_read_enumerated(s, &result, MCS_Result_enum_length);
+       ber_read_integer(s, &calledConnectId);
+
+       if (!mcs_read_domain_parameters(s, &(mcs->domainParameters)))
+               return false;
+
+       ber_read_octet_string(s, &length);
+
+       if (!gcc_read_conference_create_response(s, mcs->transport->settings))
+       {
+               printf("mcs_recv_connect_response: gcc_read_conference_create_response failed\n");
+               return false;
+       }
+
+       return true;
+}
+
+/**
+ * Send MCS Connect Response.\n
+ * @msdn{cc240501}
+ * @param mcs mcs module
+ */
+
+boolean mcs_send_connect_response(rdpMcs* mcs)
+{
+       STREAM* s;
+       int length;
+       uint8 *bm, *em;
+       STREAM* gcc_CCrsp;
+       STREAM* server_data;
+
+       server_data = stream_new(512);
+       gcc_write_server_data_blocks(server_data, mcs->transport->settings);
+
+       gcc_CCrsp = stream_new(512);
+       gcc_write_conference_create_response(gcc_CCrsp, server_data);
+       length = stream_get_length(gcc_CCrsp) + 7;
+
+       s = transport_send_stream_init(mcs->transport, 1024);
+       stream_get_mark(s, bm);
+       stream_seek(s, 7);
+
+       mcs_write_connect_response(s, mcs, gcc_CCrsp);
+       stream_get_mark(s, em);
+       length = (em - bm);
+       stream_set_mark(s, bm);
+
+       tpkt_write_header(s, length);
+       tpdu_write_data(s);
+       stream_set_mark(s, em);
+
+       transport_write(mcs->transport, s);
+
+       stream_free(gcc_CCrsp);
+       stream_free(server_data);
+
+       return true;
+}
+
+/**
+ * Read MCS Erect Domain Request.\n
+ * @msdn{cc240523}
+ * @param mcs
+ * @param s stream
+ */
+
+boolean mcs_recv_erect_domain_request(rdpMcs* mcs, STREAM* s)
+{
+       uint16 length;
+       enum DomainMCSPDU MCSPDU;
+
+       MCSPDU = DomainMCSPDU_ErectDomainRequest;
+       if (!mcs_read_domain_mcspdu_header(s, &MCSPDU, &length))
+               return false;
+
+       return true;
+}
+
+/**
+ * Send MCS Erect Domain Request.\n
+ * @msdn{cc240523}
+ * @param mcs
+ */
+
+boolean mcs_send_erect_domain_request(rdpMcs* mcs)
+{
+       STREAM* s;
+       uint16 length = 12;
+       s = transport_send_stream_init(mcs->transport, length);
+
+       mcs_write_domain_mcspdu_header(s, DomainMCSPDU_ErectDomainRequest, length, 0);
+
+       per_write_integer(s, 0); /* subHeight (INTEGER) */
+       per_write_integer(s, 0); /* subInterval (INTEGER) */
+
+       if (transport_write(mcs->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+/**
+ * Read MCS Attach User Request.\n
+ * @msdn{cc240524}
+ * @param mcs mcs module
+ * @param s stream
+ */
+
+boolean mcs_recv_attach_user_request(rdpMcs* mcs, STREAM* s)
+{
+       uint16 length;
+       enum DomainMCSPDU MCSPDU;
+
+       MCSPDU = DomainMCSPDU_AttachUserRequest;
+       if (!mcs_read_domain_mcspdu_header(s, &MCSPDU, &length))
+               return false;
+
+       return true;
+}
+
+/**
+ * Send MCS Attach User Request.\n
+ * @msdn{cc240524}
+ * @param mcs mcs module
+ */
+
+boolean mcs_send_attach_user_request(rdpMcs* mcs)
+{
+       STREAM* s;
+       uint16 length = 8;
+       s = transport_send_stream_init(mcs->transport, length);
+
+       mcs_write_domain_mcspdu_header(s, DomainMCSPDU_AttachUserRequest, length, 0);
+
+       if (transport_write(mcs->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+/**
+ * Read MCS Attach User Confirm.\n
+ * @msdn{cc240525}
+ * @param mcs mcs module
+ */
+
+boolean mcs_recv_attach_user_confirm(rdpMcs* mcs, STREAM* s)
+{
+       uint16 length;
+       uint8 result;
+       enum DomainMCSPDU MCSPDU;
+
+       MCSPDU = DomainMCSPDU_AttachUserConfirm;
+       if (!mcs_read_domain_mcspdu_header(s, &MCSPDU, &length))
+               return false;
+
+       per_read_enumerated(s, &result, MCS_Result_enum_length); /* result */
+       per_read_integer16(s, &(mcs->user_id), MCS_BASE_CHANNEL_ID); /* initiator (UserId) */
+
+       return true;
+}
+
+/**
+ * Send MCS Attach User Confirm.\n
+ * @msdn{cc240525}
+ * @param mcs mcs module
+ */
+
+boolean mcs_send_attach_user_confirm(rdpMcs* mcs)
+{
+       STREAM* s;
+       uint16 length = 11;
+       
+       s = transport_send_stream_init(mcs->transport, length);
+
+       mcs_write_domain_mcspdu_header(s, DomainMCSPDU_AttachUserConfirm, length, 2);
+
+       per_write_enumerated(s, 0, MCS_Result_enum_length); /* result */
+       mcs->user_id = 1002;
+       per_write_integer16(s, mcs->user_id, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */
+
+       transport_write(mcs->transport, s);
+
+       return true;
+}
+
+/**
+ * Read MCS Channel Join Request.\n
+ * @msdn{cc240526}
+ * @param mcs mcs module
+ * @param s stream
+ */
+
+boolean mcs_recv_channel_join_request(rdpMcs* mcs, STREAM* s, uint16* channel_id)
+{
+       uint16 length;
+       enum DomainMCSPDU MCSPDU;
+       uint16 user_id;
+
+       MCSPDU = DomainMCSPDU_ChannelJoinRequest;
+       if (!mcs_read_domain_mcspdu_header(s, &MCSPDU, &length))
+               return false;
+
+       if (!per_read_integer16(s, &user_id, MCS_BASE_CHANNEL_ID))
+               return false;
+       if (user_id != mcs->user_id)
+               return false;
+       if (!per_read_integer16(s, channel_id, 0))
+               return false;
+
+       return true;
+}
+
+/**
+ * Send MCS Channel Join Request.\n
+ * @msdn{cc240526}
+ * @param mcs mcs module
+ * @param channel_id channel id
+ */
+
+boolean mcs_send_channel_join_request(rdpMcs* mcs, uint16 channel_id)
+{
+       STREAM* s;
+       uint16 length = 12;
+       s = transport_send_stream_init(mcs->transport, 12);
+
+       mcs_write_domain_mcspdu_header(s, DomainMCSPDU_ChannelJoinRequest, length, 0);
+
+       per_write_integer16(s, mcs->user_id, MCS_BASE_CHANNEL_ID);
+       per_write_integer16(s, channel_id, 0);
+
+       if (transport_write(mcs->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+/**
+ * Read MCS Channel Join Confirm.\n
+ * @msdn{cc240527}
+ * @param mcs mcs module
+ */
+
+boolean mcs_recv_channel_join_confirm(rdpMcs* mcs, STREAM* s, uint16* channel_id)
+{
+       uint16 length;
+       uint8 result;
+       uint16 initiator;
+       uint16 requested;
+       enum DomainMCSPDU MCSPDU;
+
+       MCSPDU = DomainMCSPDU_ChannelJoinConfirm;
+       if (!mcs_read_domain_mcspdu_header(s, &MCSPDU, &length))
+               return false;
+
+       per_read_enumerated(s, &result, MCS_Result_enum_length); /* result */
+       per_read_integer16(s, &initiator, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */
+       per_read_integer16(s, &requested, 0); /* requested (ChannelId) */
+       per_read_integer16(s, channel_id, 0); /* channelId */
+
+       return true;
+}
+
+/**
+ * Send MCS Channel Join Confirm.\n
+ * @msdn{cc240527}
+ * @param mcs mcs module
+ */
+
+boolean mcs_send_channel_join_confirm(rdpMcs* mcs, uint16 channel_id)
+{
+       STREAM* s;
+       uint16 length = 15;
+       s = transport_send_stream_init(mcs->transport, 15);
+
+       mcs_write_domain_mcspdu_header(s, DomainMCSPDU_ChannelJoinConfirm, length, 2);
+
+       per_write_enumerated(s, 0, MCS_Result_enum_length); /* result */
+       per_write_integer16(s, mcs->user_id, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */
+       per_write_integer16(s, channel_id, 0); /* requested (ChannelId) */
+       per_write_integer16(s, channel_id, 0); /* channelId */
+
+       transport_write(mcs->transport, s);
+
+       return true;
+}
+
+/**
+ * Send MCS Disconnect Provider Ultimatum PDU.\n
+ * @param mcs mcs module
+ */
+
+boolean mcs_send_disconnect_provider_ultimatum(rdpMcs* mcs)
+{
+       STREAM* s;
+       uint16 length = 9;
+       s = transport_send_stream_init(mcs->transport, 9);
+
+       mcs_write_domain_mcspdu_header(s, DomainMCSPDU_DisconnectProviderUltimatum, length, 1);
+
+       per_write_enumerated(s, 0, 0); /* reason */
+
+       transport_write(mcs->transport, s);
+
+       return true;
+}
+
+/**
+ * Instantiate new MCS module.
+ * @param transport transport
+ * @return new MCS module
+ */
+
+rdpMcs* mcs_new(rdpTransport* transport)
+{
+       rdpMcs* mcs;
+
+       mcs = (rdpMcs*) xzalloc(sizeof(rdpMcs));
+
+       if (mcs != NULL)
+       {
+               mcs->transport = transport;
+               mcs_init_domain_parameters(&mcs->targetParameters, 34, 2, 0, 0xFFFF);
+               mcs_init_domain_parameters(&mcs->minimumParameters, 1, 1, 1, 0x420);
+               mcs_init_domain_parameters(&mcs->maximumParameters, 0xFFFF, 0xFC17, 0xFFFF, 0xFFFF);
+       }
+
+       return mcs;
+}
+
+/**
+ * Free MCS module.
+ * @param mcs MCS module to be freed
+ */
+
+void mcs_free(rdpMcs* mcs)
+{
+       if (mcs != NULL)
+       {
+               xfree(mcs);
+       }
+}
diff --git a/libfreerdp-core/mcs.h b/libfreerdp-core/mcs.h
new file mode 100644 (file)
index 0000000..a92d9dc
--- /dev/null
@@ -0,0 +1,156 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * T.125 Multipoint Communication Service (MCS) Protocol
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MCS_H
+#define __MCS_H
+
+#include "ber.h"
+#include "transport.h"
+
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+
+#define MCS_BASE_CHANNEL_ID    1001
+#define MCS_GLOBAL_CHANNEL_ID  1003
+
+enum MCS_Result
+{
+       MCS_Result_successful = 0,
+       MCS_Result_domain_merging = 1,
+       MCS_Result_domain_not_hierarchical = 2,
+       MCS_Result_no_such_channel = 3,
+       MCS_Result_no_such_domain = 4,
+       MCS_Result_no_such_user = 5,
+       MCS_Result_not_admitted = 6,
+       MCS_Result_other_user_id = 7,
+       MCS_Result_parameters_unacceptable = 8,
+       MCS_Result_token_not_available = 9,
+       MCS_Result_token_not_possessed = 10,
+       MCS_Result_too_many_channels = 11,
+       MCS_Result_too_many_tokens = 12,
+       MCS_Result_too_many_users = 13,
+       MCS_Result_unspecified_failure = 14,
+       MCS_Result_user_rejected = 15,
+       MCS_Result_enum_length = 16
+};
+
+enum DomainMCSPDU
+{
+       DomainMCSPDU_PlumbDomainIndication = 0,
+       DomainMCSPDU_ErectDomainRequest = 1,
+       DomainMCSPDU_MergeChannelsRequest = 2,
+       DomainMCSPDU_MergeChannelsConfirm = 3,
+       DomainMCSPDU_PurgeChannelsIndication = 4,
+       DomainMCSPDU_MergeTokensRequest = 5,
+       DomainMCSPDU_MergeTokensConfirm = 6,
+       DomainMCSPDU_PurgeTokensIndication = 7,
+       DomainMCSPDU_DisconnectProviderUltimatum = 8,
+       DomainMCSPDU_RejectMCSPDUUltimatum = 9,
+       DomainMCSPDU_AttachUserRequest = 10,
+       DomainMCSPDU_AttachUserConfirm = 11,
+       DomainMCSPDU_DetachUserRequest = 12,
+       DomainMCSPDU_DetachUserIndication = 13,
+       DomainMCSPDU_ChannelJoinRequest = 14,
+       DomainMCSPDU_ChannelJoinConfirm = 15,
+       DomainMCSPDU_ChannelLeaveRequest = 16,
+       DomainMCSPDU_ChannelConveneRequest = 17,
+       DomainMCSPDU_ChannelConveneConfirm = 18,
+       DomainMCSPDU_ChannelDisbandRequest = 19,
+       DomainMCSPDU_ChannelDisbandIndication = 20,
+       DomainMCSPDU_ChannelAdmitRequest = 21,
+       DomainMCSPDU_ChannelAdmitIndication = 22,
+       DomainMCSPDU_ChannelExpelRequest = 23,
+       DomainMCSPDU_ChannelExpelIndication = 24,
+       DomainMCSPDU_SendDataRequest = 25,
+       DomainMCSPDU_SendDataIndication = 26,
+       DomainMCSPDU_UniformSendDataRequest = 27,
+       DomainMCSPDU_UniformSendDataIndication = 28,
+       DomainMCSPDU_TokenGrabRequest = 29,
+       DomainMCSPDU_TokenGrabConfirm = 30,
+       DomainMCSPDU_TokenInhibitRequest = 31,
+       DomainMCSPDU_TokenInhibitConfirm = 32,
+       DomainMCSPDU_TokenGiveRequest = 33,
+       DomainMCSPDU_TokenGiveIndication = 34,
+       DomainMCSPDU_TokenGiveResponse = 35,
+       DomainMCSPDU_TokenGiveConfirm = 36,
+       DomainMCSPDU_TokenPleaseRequest = 37,
+       DomainMCSPDU_TokenPleaseConfirm = 38,
+       DomainMCSPDU_TokenReleaseRequest = 39,
+       DomainMCSPDU_TokenReleaseConfirm = 40,
+       DomainMCSPDU_TokenTestRequest = 41,
+       DomainMCSPDU_TokenTestConfirm = 42,
+       DomainMCSPDU_enum_length = 43
+};
+
+typedef struct
+{
+       uint32 maxChannelIds;
+       uint32 maxUserIds;
+       uint32 maxTokenIds;
+       uint32 numPriorities;
+       uint32 minThroughput;
+       uint32 maxHeight;
+       uint32 maxMCSPDUsize;
+       uint32 protocolVersion;
+} DomainParameters;
+
+struct rdp_mcs
+{
+       uint16 user_id;
+       struct rdp_transport* transport;
+       DomainParameters domainParameters;
+       DomainParameters targetParameters;
+       DomainParameters minimumParameters;
+       DomainParameters maximumParameters;
+
+       boolean user_channel_joined;
+       boolean global_channel_joined;
+};
+typedef struct rdp_mcs rdpMcs;
+
+#define MCS_SEND_DATA_HEADER_MAX_LENGTH                8
+
+#define MCS_TYPE_CONNECT_INITIAL               0x65
+#define MCS_TYPE_CONNECT_RESPONSE              0x66
+
+void mcs_write_connect_initial(STREAM* s, rdpMcs* mcs, STREAM* user_data);
+void mcs_write_connect_response(STREAM* s, rdpMcs* mcs, STREAM* user_data);
+
+boolean mcs_recv_connect_initial(rdpMcs* mcs, STREAM* s);
+boolean mcs_send_connect_initial(rdpMcs* mcs);
+boolean mcs_recv_connect_response(rdpMcs* mcs, STREAM* s);
+boolean mcs_send_connect_response(rdpMcs* mcs);
+boolean mcs_recv_erect_domain_request(rdpMcs* mcs, STREAM* s);
+boolean mcs_send_erect_domain_request(rdpMcs* mcs);
+boolean mcs_recv_attach_user_request(rdpMcs* mcs, STREAM* s);
+boolean mcs_send_attach_user_request(rdpMcs* mcs);
+boolean mcs_recv_attach_user_confirm(rdpMcs* mcs, STREAM* s);
+boolean mcs_send_attach_user_confirm(rdpMcs* mcs);
+boolean mcs_recv_channel_join_request(rdpMcs* mcs, STREAM* s, uint16* channel_id);
+boolean mcs_send_channel_join_request(rdpMcs* mcs, uint16 channel_id);
+boolean mcs_recv_channel_join_confirm(rdpMcs* mcs, STREAM* s, uint16* channel_id);
+boolean mcs_send_channel_join_confirm(rdpMcs* mcs, uint16 channel_id);
+boolean mcs_send_disconnect_provider_ultimatum(rdpMcs* mcs);
+boolean mcs_read_domain_mcspdu_header(STREAM* s, enum DomainMCSPDU* domainMCSPDU, uint16* length);
+void mcs_write_domain_mcspdu_header(STREAM* s, enum DomainMCSPDU domainMCSPDU, uint16 length, uint8 options);
+
+rdpMcs* mcs_new(rdpTransport* transport);
+void mcs_free(rdpMcs* mcs);
+
+#endif /* __MCS_H */
diff --git a/libfreerdp-core/mppc.c b/libfreerdp-core/mppc.c
new file mode 100644 (file)
index 0000000..8e66eb3
--- /dev/null
@@ -0,0 +1,1292 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Implements Microsoft Point to Point Compression (MPPC) protocol
+ *
+ * Copyright 2011 Laxmikant Rashinkar <LK.Rashinkar@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rdp.h"
+
+#if 0
+static uint8 HuffLengthLEC[] =
+{
+       0x6, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8,
+       0x8, 0x8, 0x8, 0x9, 0x8, 0x9, 0x9, 0x9, 0x9, 0x8, 0x8, 0x9, 0x9, 0x9, 0x9, 0x9,
+       0x8, 0x9, 0x9, 0xa, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0xa, 0x9, 0xa, 0xa, 0xa,
+       0x9, 0x9, 0x9, 0xa, 0x9, 0xa, 0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0x9, 0xa, 0x9, 0x9,
+       0x8, 0x9, 0x9, 0x9, 0x9, 0xa, 0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0x9, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0x8, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9,
+       0x7, 0x9, 0x9, 0xa, 0x9, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xd, 0xa, 0xa, 0xa, 0xa,
+       0xa, 0xa, 0xb, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa,
+       0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+       0x9, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x9, 0xa,
+       0x8, 0x9, 0x9, 0xa, 0x9, 0xa, 0xa, 0xa, 0x9, 0xa, 0xa, 0xa, 0x9, 0x9, 0x8, 0x7,
+       0xd, 0xd, 0x7, 0x7, 0xa, 0x7, 0x7, 0x6, 0x6, 0x6, 0x6, 0x5, 0x6, 0x6, 0x6, 0x5,
+       0x6, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6,
+       0x8, 0x5, 0x6, 0x7, 0x7
+};
+#endif
+
+static uint16 HuffIndexLEC[512] =
+{
+       0x007b, 0xff1f, 0xff0d, 0xfe27, 0xfe00, 0xff05, 0xff17, 0xfe68, 0x00c5, 0xfe07, 0xff13, 0xfec0, 0xff08, 0xfe18, 0xff1b, 0xfeb3,
+       0xfe03, 0x00a2, 0xfe42, 0xff10, 0xfe0b, 0xfe02, 0xfe91, 0xff19, 0xfe80, 0x00e9, 0xfe3a, 0xff15, 0xfe12, 0x0057, 0xfed7, 0xff1d,
+       0xff0e, 0xfe35, 0xfe69, 0xff22, 0xff18, 0xfe7a, 0xfe01, 0xff23, 0xff14, 0xfef4, 0xfeb4, 0xfe09, 0xff1c, 0xfec4, 0xff09, 0xfe60,
+       0xfe70, 0xff12, 0xfe05, 0xfe92, 0xfea1, 0xff1a, 0xfe0f, 0xff07, 0xfe56, 0xff16, 0xff02, 0xfed8, 0xfee8, 0xff1e, 0xfe1d, 0x003b,
+       0xffff, 0xff06, 0xffff, 0xfe71, 0xfe89, 0xffff, 0xffff, 0xfe2c, 0xfe2b, 0xfe20, 0xffff, 0xfebb, 0xfecf, 0xfe08, 0xffff, 0xfee0,
+       0xfe0d, 0xffff, 0xfe99, 0xffff, 0xfe04, 0xfeaa, 0xfe49, 0xffff, 0xfe17, 0xfe61, 0xfedf, 0xffff, 0xfeff, 0xfef6, 0xfe4c, 0xffff,
+       0xffff, 0xfe87, 0xffff, 0xff24, 0xffff, 0xfe3c, 0xfe72, 0xffff, 0xffff, 0xfece, 0xffff, 0xfefe, 0xffff, 0xfe23, 0xfebc, 0xfe0a,
+       0xfea9, 0xffff, 0xfe11, 0xffff, 0xfe82, 0xffff, 0xfe06, 0xfe9a, 0xfef5, 0xffff, 0xfe22, 0xfe4d, 0xfe5f, 0xffff, 0xff03, 0xfee1,
+       0xffff, 0xfeca, 0xfecc, 0xffff, 0xfe19, 0xffff, 0xfeb7, 0xffff, 0xffff, 0xfe83, 0xfe29, 0xffff, 0xffff, 0xffff, 0xfe6c, 0xffff,
+       0xfeed, 0xffff, 0xffff, 0xfe46, 0xfe5c, 0xfe15, 0xffff, 0xfedb, 0xfea6, 0xffff, 0xffff, 0xfe44, 0xffff, 0xfe0c, 0xffff, 0xfe95,
+       0xfefc, 0xffff, 0xffff, 0xfeb8, 0x16c9, 0xffff, 0xfef0, 0xffff, 0xfe38, 0xffff, 0xffff, 0xfe6d, 0xfe7e, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xfe5b, 0xfedc, 0xffff, 0xffff, 0xfeec, 0xfe47, 0xfe1f, 0xffff, 0xfe7f, 0xfe96, 0xffff, 0xffff, 0xfea5, 0xffff, 0xfe10,
+       0xfe40, 0xfe32, 0xfebf, 0xffff, 0xffff, 0xfed4, 0xfef1, 0xffff, 0xffff, 0xffff, 0xfe75, 0xffff, 0xffff, 0xfe8d, 0xfe31, 0xffff,
+       0xfe65, 0xfe1b, 0xffff, 0xfee4, 0xfefb, 0xffff, 0xffff, 0xfe52, 0xffff, 0xfe0e, 0xffff, 0xfe9d, 0xfeaf, 0xffff, 0xffff, 0xfe51,
+       0xfed3, 0xffff, 0xff20, 0xffff, 0xfe2f, 0xffff, 0xffff, 0xfec1, 0xfe8c, 0xffff, 0xffff, 0xffff, 0xfe3f, 0xffff, 0xffff, 0xfe76,
+       0xffff, 0xfefa, 0xfe53, 0xfe25, 0xffff, 0xfe64, 0xfee5, 0xffff, 0xffff, 0xfeae, 0xffff, 0xfe13, 0xffff, 0xfe88, 0xfe9e, 0xffff,
+       0xfe43, 0xffff, 0xffff, 0xfea4, 0xfe93, 0xffff, 0xffff, 0xffff, 0xfe3d, 0xffff, 0xffff, 0xfeeb, 0xfed9, 0xffff, 0xfe14, 0xfe5a,
+       0xffff, 0xfe28, 0xfe7d, 0xffff, 0xffff, 0xfe6a, 0xffff, 0xffff, 0xff01, 0xfec6, 0xfec8, 0xffff, 0xffff, 0xfeb5, 0xffff, 0xffff,
+       0xffff, 0xfe94, 0xfe78, 0xffff, 0xffff, 0xffff, 0xfea3, 0xffff, 0xffff, 0xfeda, 0xfe58, 0xffff, 0xfe1e, 0xfe45, 0xfeea, 0xffff,
+       0xfe6b, 0xffff, 0xffff, 0xfe37, 0xffff, 0xffff, 0xffff, 0xfe7c, 0xfeb6, 0xffff, 0xffff, 0xfef8, 0xffff, 0xffff, 0xffff, 0xfec7,
+       0xfe9b, 0xffff, 0xffff, 0xffff, 0xfe50, 0xffff, 0xffff, 0xfead, 0xfee2, 0xffff, 0xfe1a, 0xfe63, 0xfe4e, 0xffff, 0xffff, 0xfef9,
+       0xffff, 0xfe73, 0xffff, 0xffff, 0xffff, 0xfe30, 0xfe8b, 0xffff, 0xffff, 0xfebd, 0xfe2e, 0x0100, 0xffff, 0xfeee, 0xfed2, 0xffff,
+       0xffff, 0xffff, 0xfeac, 0xffff, 0xffff, 0xfe9c, 0xfe84, 0xffff, 0xfe24, 0xfe4f, 0xfef7, 0xffff, 0xffff, 0xfee3, 0xfe62, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xfe8a, 0xfe74, 0xffff, 0xffff, 0xfe3e, 0xffff, 0xffff, 0xffff, 0xfed1, 0xfebe, 0xffff, 0xffff, 0xfe2d,
+       0xffff, 0xfe4a, 0xfef3, 0xffff, 0xffff, 0xfedd, 0xfe5e, 0xfe16, 0xffff, 0xfe48, 0xfea8, 0xffff, 0xfeab, 0xfe97, 0xffff, 0xffff,
+       0xfed0, 0xffff, 0xffff, 0xfecd, 0xfeb9, 0xffff, 0xffff, 0xffff, 0xfe2a, 0xffff, 0xffff, 0xfe86, 0xfe6e, 0xffff, 0xffff, 0xffff,
+       0xfede, 0xffff, 0xffff, 0xfe5d, 0xfe4b, 0xfe21, 0xffff, 0xfeef, 0xfe98, 0xffff, 0xffff, 0xfe81, 0xffff, 0xffff, 0xffff, 0xfea7,
+       0xffff, 0xfeba, 0xfefd, 0xffff, 0xffff, 0xffff, 0xfecb, 0xffff, 0xffff, 0xfe6f, 0xfe39, 0xffff, 0xffff, 0xffff, 0xfe85, 0xffff,
+       0x010c, 0xfee6, 0xfe67, 0xfe1c, 0xffff, 0xfe54, 0xfeb2, 0xffff, 0xffff, 0xfe9f, 0xffff, 0xffff, 0xffff, 0xfe59, 0xfeb1, 0xffff,
+       0xfec2, 0xffff, 0xffff, 0xfe36, 0xfef2, 0xffff, 0xffff, 0xfed6, 0xfe77, 0xffff, 0xffff, 0xffff, 0xfe33, 0xffff, 0xffff, 0xfe8f,
+       0xfe55, 0xfe26, 0x010a, 0xff04, 0xfee7, 0xffff, 0x0121, 0xfe66, 0xffff, 0xffff, 0xffff, 0xfeb0, 0xfea0, 0xffff, 0x010f, 0xfe90,
+       0xffff, 0xffff, 0xfed5, 0xffff, 0xffff, 0xfec3, 0xfe34, 0xffff, 0xffff, 0xffff, 0xfe8e, 0xffff, 0x0111, 0xfe79, 0xfe41, 0x010b
+};
+
+static uint16 LECHTab[] =
+{
+       511, 0, 508, 448, 494, 347, 486, 482
+};
+
+#if 0
+static uint8 HuffLenLOM[] =
+{
+       0x4, 0x2, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x6, 0x7, 0x7, 0x8,
+       0x7, 0x8, 0x8, 0x9, 0x9, 0x8, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9
+};
+#endif
+
+static uint16 HuffIndexLOM[] =
+{
+       0x0fe1, 0x0fe0, 0x0fe2, 0x0fe8, 0x000e, 0x0fe5, 0x0fe4, 0x0fea, 0x0ff1, 0x0fe3, 0x0015, 0x0fe7, 0x0fef, 0x0046, 0x0ff0, 0x0fed,
+       0x0fff, 0x0ff7, 0x0ffb, 0x0019, 0x0ffd, 0x0ff4, 0x012c, 0x0feb, 0x0ffe, 0x0ff6, 0x0ffa, 0x0089, 0x0ffc, 0x0ff3, 0x0ff8, 0x0ff2
+};
+
+static uint8 LOMHTab[] =
+{
+       0, 4, 10, 19
+};
+
+#if 0
+static uint8 CopyOffsetBitsLUT[] =
+{
+       0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15
+};
+
+static uint32 CopyOffsetBaseLUT[] =
+{
+       13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537,
+       2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153, 65537
+};
+
+static uint8 LoMBitsLUT[] =
+{
+       0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 8, 8, 14, 14
+};
+
+static uint16 LoMBaseLUT[] =
+{
+       2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 22, 26, 30,
+       34, 42, 50, 58, 66, 82, 98, 114, 130, 194, 258, 514, 2, 2
+};
+#endif
+
+uint16 LEChash(uint16 key)
+{
+       return ((key & 0x1ff) ^ (key  >> 9) ^ (key >> 4) ^ (key >> 7));
+}
+
+uint16 LOMhash(uint16 key)
+{
+       return ((key & 0x1f) ^ (key  >> 5) ^ (key >> 9));
+}
+                       
+uint16 miniLEChash(uint16 key)
+{
+       uint16 h;
+       h = ((((key >> 8) ^ (key & 0xff)) >> 2) & 0xf);
+       if(key >> 9)
+               h = ~h;
+       return (h % 12);
+}
+
+uint8 miniLOMhash(uint16 key)
+{
+       return ((key >> 4) ^ (key >> 6) ^ (key >> 7));
+}
+
+uint16 getLECindex(uint16 huff)
+{
+       uint16 h = HuffIndexLEC[LEChash(huff)];
+       if((h ^ huff) >> 9)
+               return h & 0x1ff;
+       else
+               return HuffIndexLEC[LECHTab[miniLEChash(huff)]];
+}
+
+uint16 getLOMindex(uint16 huff)
+{
+       uint16 h = HuffIndexLOM[LOMhash(huff)];
+       if((h ^ huff) >> 5)
+       {       
+               return h & 0x1f;
+       }       
+       else
+               return HuffIndexLOM[LOMHTab[miniLOMhash(huff)]];
+}
+
+int decompress_rdp(rdpRdp* rdp, uint8* cbuf, int len, int ctype, uint32* roff, uint32* rlen)
+{
+       int type = ctype & 0x0f;
+
+       switch (type)
+       {
+               case PACKET_COMPR_TYPE_8K:
+                       return decompress_rdp_4(rdp, cbuf, len, ctype, roff, rlen);
+                       break;
+
+               case PACKET_COMPR_TYPE_64K:
+                       return decompress_rdp_5(rdp, cbuf, len, ctype, roff, rlen);
+                       break;
+
+               case PACKET_COMPR_TYPE_RDP6:
+                       return decompress_rdp_6(rdp, cbuf, len, ctype, roff, rlen);
+                       break;
+
+               case PACKET_COMPR_TYPE_RDP61:
+                       return decompress_rdp_61(rdp, cbuf, len, ctype, roff, rlen);
+                       break;
+
+               default:
+                       printf("mppc.c: invalid RDP compression code 0x%2.2x\n", type);
+                       return false;
+       }
+}
+
+/**
+ * decompress RDP 4 data
+ *
+ * @param rdp     per session information
+ * @param cbuf    compressed data
+ * @param len     length of compressed data
+ * @param ctype   compression flags
+ * @param roff    starting offset of uncompressed data
+ * @param rlen    length of uncompressed data
+ *
+ * @return        True on success, False on failure
+ */
+
+int decompress_rdp_4(rdpRdp* rdp, uint8* cbuf, int len, int ctype, uint32* roff, uint32* rlen)
+{
+       uint8*    history_buf;    /* uncompressed data goes here */
+       uint8*    history_ptr;    /* points to next free slot in history_buf */
+       uint32    d32;            /* we process 4 compressed bytes at a time */
+       uint16    copy_offset;    /* location to copy data from */
+       uint16    lom;            /* length of match */
+       uint8*    src_ptr;        /* used while copying compressed data */
+       uint8*    cptr;           /* points to next byte in cbuf */
+       uint8     cur_byte;       /* last byte fetched from cbuf */
+       int       bits_left;      /* bits left in d34 for processing */
+       int       cur_bits_left;  /* bits left in cur_byte for processing */
+       int       tmp;
+       uint32    i32;
+
+       printf("decompress_rdp_4:\n");
+
+       if ((rdp->mppc == NULL) || (rdp->mppc->history_buf == NULL))
+       {
+               printf("decompress_rdp_4: null\n");
+               return false;
+       }
+
+       src_ptr = 0;
+       cptr = cbuf;
+       copy_offset = 0;
+       lom = 0;
+       bits_left = 0;
+       cur_bits_left = 0;
+       d32 = 0;
+       cur_byte = 0;
+       *rlen = 0;
+
+       /* get start of history buffer */
+       history_buf = rdp->mppc->history_buf;
+
+       /* get next free slot in history buffer */
+       history_ptr = rdp->mppc->history_ptr;
+       *roff = history_ptr - history_buf;
+
+       if (ctype & PACKET_AT_FRONT)
+       {
+               /* place compressed data at start of history buffer */
+               history_ptr = rdp->mppc->history_buf;
+               rdp->mppc->history_ptr = rdp->mppc->history_buf;
+               *roff = 0;
+       }
+
+       if (ctype & PACKET_FLUSHED)
+       {
+               /* re-init history buffer */
+               history_ptr = rdp->mppc->history_buf;
+               memset(history_buf, 0, RDP6_HISTORY_BUF_SIZE);
+               *roff = 0;
+       }
+
+       if ((ctype & PACKET_COMPRESSED) != PACKET_COMPRESSED)
+       {
+               /* data in cbuf is not compressed - copy to history buf as is */
+               memcpy(history_ptr, cbuf, len);
+               history_ptr += len;
+               *rlen = history_ptr - rdp->mppc->history_ptr;
+               rdp->mppc->history_ptr = history_ptr;
+               return true;
+       }
+
+       /* load initial data */
+       tmp = 24;
+       while (cptr < cbuf + len)
+       {
+               i32 = *cptr++;
+               d32  |= i32 << tmp;
+               bits_left += 8;
+               tmp -= 8;
+               if (tmp < 0)
+               {
+                       break;
+               }
+       }
+
+       if (cptr < cbuf + len)
+       {
+               cur_byte = *cptr++;
+               cur_bits_left = 8;
+       }
+       else
+       {
+               cur_bits_left = 0;
+       }
+
+       /*
+       ** start uncompressing data in cbuf
+       */
+
+       while (bits_left >= 8)
+       {
+               /*
+                  value 0xxxxxxx  = literal, not encoded
+                  value 10xxxxxx  = literal, encoded
+                  value 1111xxxx  = copy offset   0 - 63
+                  value 1110xxxx  = copy offset  64 - 319
+                  value 110xxxxx  = copy offset 320 - 8191
+               */
+
+               /*
+                  at this point, we are guaranteed that d32 has 32 bits to
+                  be processed, unless we have reached end of cbuf
+               */
+
+               copy_offset = 0;
+
+               if ((d32 & 0x80000000) == 0)
+               {
+                       /* got a literal */
+                       *history_ptr++ = d32 >> 24;
+                       d32 <<= 8;
+                       bits_left -= 8;
+               }
+               else if ((d32 & 0xc0000000) == 0x80000000)
+               {
+                       /* got encoded literal */
+                       d32 <<= 2;
+                       *history_ptr++ = (d32 >> 25) | 0x80;
+                       d32 <<= 7;
+                       bits_left -= 9;
+               }
+               else if ((d32 & 0xf0000000) == 0xf0000000)
+               {
+                       /* got copy offset in range 0 - 63, */
+                       /* with 6 bit copy offset */
+                       d32 <<= 4;
+                       copy_offset = d32 >> 26;
+                       d32 <<= 6;
+                       bits_left -= 10;
+               }
+               else if ((d32 & 0xf0000000) == 0xe0000000)
+               {
+                       /* got copy offset in range 64 - 319, */
+                       /* with 8 bit copy offset */
+                       d32 <<= 4;
+                       copy_offset = d32 >> 24;
+                       copy_offset += 64;
+                       d32 <<= 8;
+                       bits_left -= 12;
+               }
+               else if ((d32 & 0xe0000000) == 0xc0000000)
+               {
+                       /* got copy offset in range 320 - 8191, */
+                       /* with 13 bits copy offset */
+                       d32 <<= 3;
+                       copy_offset = d32 >> 19;
+                       copy_offset += 320;
+                       d32 <<= 13;
+                       bits_left -= 16;
+               }
+
+               /*
+               ** get more bits before we process length of match
+               */
+
+               /* how may bits do we need to get? */
+               tmp = 32 - bits_left;
+
+               while (tmp)
+               {
+                       if (cur_bits_left < tmp)
+                       {
+                               /* we have less bits than we need */
+                               i32 = cur_byte >> (8 - cur_bits_left);
+                               d32 |= i32 << ((32 - bits_left) - cur_bits_left);
+                               bits_left += cur_bits_left;
+                               tmp -= cur_bits_left;
+                               if (cptr < cbuf + len)
+                               {
+                                       /* more compressed data available */
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       /* no more compressed data available */
+                                       tmp = 0;
+                                       cur_bits_left = 0;
+                               }
+                       }
+                       else if (cur_bits_left > tmp)
+                       {
+                               /* we have more bits than we need */
+                               d32 |= cur_byte >> (8 - tmp);
+                               cur_byte <<= tmp;
+                               cur_bits_left -= tmp;
+                               bits_left = 32;
+                               break;
+                       }
+                       else
+                       {
+                               /* we have just the right amount of bits */
+                               d32 |= cur_byte >> (8 - tmp);
+                               bits_left = 32;
+                               if (cptr < cbuf + len)
+                               {
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       cur_bits_left = 0;
+                               }
+                               break;
+                       }
+               }
+
+               if (!copy_offset)
+               {
+                       continue;
+               }
+
+               /*
+               ** compute Length of Match
+               */
+
+               /*
+                  lengh of match  Encoding (binary header + LoM bits
+                  --------------  ----------------------------------
+                  3               0
+                  4...7           10 + 2 lower bits of L-o-M
+                  8...15          110 + 3 lower bits of L-o-M
+                  16...31         1110 + 4 lower bits of L-o-M
+                  32...63         11110 + 5 lower bits of L-o-M
+                  64...127        111110 + 6 lower bits of L-o-M
+                  128...255       1111110 + 7 lower bits of L-o-M
+                  256...511       11111110 + 8 lower bits of L-o-M
+                  512...1023      111111110 + 9 lower bits of L-o-M
+                  1024...2047     1111111110 + 10 lower bits of L-o-M
+                  2048...4095     11111111110 + 11 lower bits of L-o-M
+                  4096...8191     111111111110 + 12 lower bits of L-o-M
+               */
+
+               if ((d32 & 0x80000000) == 0)
+               {
+                       /* lom is fixed to 3 */
+                       lom = 3;
+                       d32 <<= 1;
+                       bits_left -= 1;
+               }
+               else if ((d32 & 0xc0000000) == 0x80000000)
+               {
+                       /* 2 lower bits of LoM */
+                       lom = ((d32 >> 28) & 0x03) + 4;
+                       d32 <<= 4;
+                       bits_left -= 4;
+               }
+               else if ((d32 & 0xe0000000) == 0xc0000000)
+               {
+                       /* 3 lower bits of LoM */
+                       lom = ((d32 >> 26) & 0x07) + 8;
+                       d32 <<= 6;
+                       bits_left -= 6;
+               }
+               else if ((d32 & 0xf0000000) == 0xe0000000)
+               {
+                       /* 4 lower bits of LoM */
+                       lom = ((d32 >> 24) & 0x0f) + 16;
+                       d32 <<= 8;
+                       bits_left -= 8;
+               }
+               else if ((d32 & 0xf8000000) == 0xf0000000)
+               {
+                       /* 5 lower bits of LoM */
+                       lom = ((d32 >> 22) & 0x1f) + 32;
+                       d32 <<= 10;
+                       bits_left -= 10;
+               }
+               else if ((d32 & 0xfc000000) == 0xf8000000)
+               {
+                       /* 6 lower bits of LoM */
+                       lom = ((d32 >> 20) & 0x3f) + 64;
+                       d32 <<= 12;
+                       bits_left -= 12;
+               }
+               else if ((d32 & 0xfe000000) == 0xfc000000)
+               {
+                       /* 7 lower bits of LoM */
+                       lom = ((d32 >> 18) & 0x7f) + 128;
+                       d32 <<= 14;
+                       bits_left -= 14;
+               }
+               else if ((d32 & 0xff000000) == 0xfe000000)
+               {
+                       /* 8 lower bits of LoM */
+                       lom = ((d32 >> 16) & 0xff) + 256;
+                       d32 <<= 16;
+                       bits_left -= 16;
+               }
+               else if ((d32 & 0xff800000) == 0xff000000)
+               {
+                       /* 9 lower bits of LoM */
+                       lom = ((d32 >> 14) & 0x1ff) + 512;
+                       d32 <<= 18;
+                       bits_left -= 18;
+               }
+               else if ((d32 & 0xffc00000) == 0xff800000)
+               {
+                       /* 10 lower bits of LoM */
+                       lom = ((d32 >> 12) & 0x3ff) + 1024;
+                       d32 <<= 20;
+                       bits_left -= 20;
+               }
+               else if ((d32 & 0xffe00000) == 0xffc00000)
+               {
+                       /* 11 lower bits of LoM */
+                       lom = ((d32 >> 10) & 0x7ff) + 2048;
+                       d32 <<= 22;
+                       bits_left -= 22;
+               }
+               else if ((d32 & 0xfff00000) == 0xffe00000)
+               {
+                       /* 12 lower bits of LoM */
+                       lom = ((d32 >> 8) & 0xfff) + 4096;
+                       d32 <<= 24;
+                       bits_left -= 24;
+               }
+
+               /* now that we have copy_offset and LoM, process them */
+
+               src_ptr = history_ptr - copy_offset;
+               if (src_ptr >= rdp->mppc->history_buf)
+               {
+                       /* data does not wrap around */
+                       while (lom > 0)
+                       {
+                               *history_ptr++ = *src_ptr++;
+                               lom--;
+                       }
+               }
+               else
+               {
+                       src_ptr = rdp->mppc->history_buf_end - (copy_offset - (history_ptr - rdp->mppc->history_buf));
+                       src_ptr++;
+                       while (lom && (src_ptr <= rdp->mppc->history_buf_end))
+                       {
+                               *history_ptr++ = *src_ptr++;
+                               lom--;
+                       }
+
+                       src_ptr = rdp->mppc->history_buf;
+                       while (lom > 0)
+                       {
+                               *history_ptr++ = *src_ptr++;
+                               lom--;
+                       }
+               }
+
+               /*
+               ** get more bits before we restart the loop
+               */
+
+               /* how may bits do we need to get? */
+               tmp = 32 - bits_left;
+
+               while (tmp)
+               {
+                       if (cur_bits_left < tmp)
+                       {
+                               /* we have less bits than we need */
+                               i32 = cur_byte >> (8 - cur_bits_left);
+                               d32 |= i32 << ((32 - bits_left) - cur_bits_left);
+                               bits_left += cur_bits_left;
+                               tmp -= cur_bits_left;
+                               if (cptr < cbuf + len)
+                               {
+                                       /* more compressed data available */
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       /* no more compressed data available */
+                                       tmp = 0;
+                                       cur_bits_left = 0;
+                               }
+                       }
+                       else if (cur_bits_left > tmp)
+                       {
+                               /* we have more bits than we need */
+                               d32 |= cur_byte >> (8 - tmp);
+                               cur_byte <<= tmp;
+                               cur_bits_left -= tmp;
+                               bits_left = 32;
+                               break;
+                       }
+                       else
+                       {
+                               /* we have just the right amount of bits */
+                               d32 |= cur_byte >> (8 - tmp);
+                               bits_left = 32;
+                               if (cptr < cbuf + len)
+                               {
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       cur_bits_left = 0;
+                               }
+                               break;
+                       }
+               }
+       } /* end while (bits_left >= 8) */
+
+       *rlen = history_ptr - rdp->mppc->history_ptr;
+
+       rdp->mppc->history_ptr = history_ptr;
+
+       return true;
+}
+
+/**
+ * decompress RDP 5 data
+ *
+ * @param rdp     per session information
+ * @param cbuf    compressed data
+ * @param len     length of compressed data
+ * @param ctype   compression flags
+ * @param roff    starting offset of uncompressed data
+ * @param rlen    length of uncompressed data
+ *
+ * @return        True on success, False on failure
+ */
+
+int decompress_rdp_5(rdpRdp* rdp, uint8* cbuf, int len, int ctype, uint32* roff, uint32* rlen)
+{
+       uint8*    history_buf;    /* uncompressed data goes here */
+       uint8*    history_ptr;    /* points to next free slot in bistory_buf */
+       uint32    d32;            /* we process 4 compressed bytes at a time */
+       uint16    copy_offset;    /* location to copy data from */
+       uint16    lom;            /* length of match */
+       uint8*    src_ptr;        /* used while copying compressed data */
+       uint8*    cptr;           /* points to next byte in cbuf */
+       uint8     cur_byte;       /* last byte fetched from cbuf */
+       int       bits_left;      /* bits left in d32 for processing */
+       int       cur_bits_left;  /* bits left in cur_byte for processing */
+       int       tmp;
+       uint32    i32;
+
+       if ((rdp->mppc == NULL) || (rdp->mppc->history_buf == NULL))
+       {
+               printf("decompress_rdp_5: null\n");
+               return false;
+       }
+
+       src_ptr = 0;
+       cptr = cbuf;
+       copy_offset = 0;
+       lom = 0;
+       bits_left = 0;
+       cur_bits_left = 0;
+       d32 = 0;
+       cur_byte = 0;
+       *rlen = 0;
+
+       /* get start of history buffer */
+       history_buf = rdp->mppc->history_buf;
+
+       /* get next free slot in history buffer */
+       history_ptr = rdp->mppc->history_ptr;
+       *roff = history_ptr - history_buf;
+
+       if (ctype & PACKET_AT_FRONT)
+       {
+               /* place compressed data at start of history buffer */
+               history_ptr = rdp->mppc->history_buf;
+               rdp->mppc->history_ptr = rdp->mppc->history_buf;
+               *roff = 0;
+       }
+
+       if (ctype & PACKET_FLUSHED)
+       {
+               /* re-init history buffer */
+               history_ptr = rdp->mppc->history_buf;
+               memset(history_buf, 0, RDP6_HISTORY_BUF_SIZE);
+               *roff = 0;
+       }
+
+       if ((ctype & PACKET_COMPRESSED) != PACKET_COMPRESSED)
+       {
+               /* data in cbuf is not compressed - copy to history buf as is */
+               memcpy(history_ptr, cbuf, len);
+               history_ptr += len;
+               *rlen = history_ptr - rdp->mppc->history_ptr;
+               rdp->mppc->history_ptr = history_ptr;
+               return true;
+       }
+
+       /* load initial data */
+       tmp = 24;
+       while (cptr < cbuf + len)
+       {
+               i32 = *cptr++;
+               d32  |= i32 << tmp;
+               bits_left += 8;
+               tmp -= 8;
+               if (tmp < 0)
+               {
+                       break;
+               }
+       }
+
+       if (cptr < cbuf + len)
+       {
+               cur_byte = *cptr++;
+               cur_bits_left = 8;
+       }
+       else
+       {
+               cur_bits_left = 0;
+       }
+
+       /*
+       ** start uncompressing data in cbuf
+       */
+
+       while (bits_left >= 8)
+       {
+               /*
+                  value 0xxxxxxx  = literal, not encoded
+                  value 10xxxxxx  = literal, encoded
+                  value 11111xxx  = copy offset     0 - 63
+                  value 11110xxx  = copy offset    64 - 319
+                  value 1110xxxx  = copy offset   320 - 2367
+                  value 110xxxxx  = copy offset  2368+
+               */
+
+               /*
+                  at this point, we are guaranteed that d32 has 32 bits to
+                  be processed, unless we have reached end of cbuf
+               */
+
+               copy_offset = 0;
+
+               if ((d32 & 0x80000000) == 0)
+               {
+                       /* got a literal */
+                       *history_ptr++ = d32 >> 24;
+                       d32 <<= 8;
+                       bits_left -= 8;
+               }
+               else if ((d32 & 0xc0000000) == 0x80000000)
+               {
+                       /* got encoded literal */
+                       d32 <<= 2;
+                       *history_ptr++ = (d32 >> 25) | 0x80;
+                       d32 <<= 7;
+                       bits_left -= 9;
+               }
+               else if ((d32 & 0xf8000000) == 0xf8000000)
+               {
+                       /* got copy offset in range 0 - 63, */
+                       /* with 6 bit copy offset */
+                       d32 <<= 5;
+                       copy_offset = d32 >> 26;
+                       d32 <<= 6;
+                       bits_left -= 11;
+               }
+               else if ((d32 & 0xf8000000) == 0xf0000000)
+               {
+                       /* got copy offset in range 64 - 319, */
+                       /* with 8 bit copy offset */
+                       d32 <<= 5;
+                       copy_offset = d32 >> 24;
+                       copy_offset += 64;
+                       d32 <<= 8;
+                       bits_left -= 13;
+               }
+               else if ((d32 & 0xf0000000) == 0xe0000000)
+               {
+                       /* got copy offset in range 320 - 2367, */
+                       /* with 11 bits copy offset */
+                       d32 <<= 4;
+                       copy_offset = d32 >> 21;
+                       copy_offset += 320;
+                       d32 <<= 11;
+                       bits_left -= 15;
+               }
+               else if ((d32 & 0xe0000000) == 0xc0000000)
+               {
+                       /* got copy offset in range 2368+, */
+                       /* with 16 bits copy offset */
+                       d32 <<= 3;
+                       copy_offset = d32 >> 16;
+                       copy_offset += 2368;
+                       d32 <<= 16;
+                       bits_left -= 19;
+               }
+
+               /*
+               ** get more bits before we process length of match
+               */
+
+               /* how may bits do we need to get? */
+               tmp = 32 - bits_left;
+
+               while (tmp)
+               {
+                       if (cur_bits_left < tmp)
+                       {
+                               /* we have less bits than we need */
+                               i32 = cur_byte >> (8 - cur_bits_left);
+                               d32 |= i32 << ((32 - bits_left) - cur_bits_left);
+                               bits_left += cur_bits_left;
+                               tmp -= cur_bits_left;
+                               if (cptr < cbuf + len)
+                               {
+                                       /* more compressed data available */
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       /* no more compressed data available */
+                                       tmp = 0;
+                                       cur_bits_left = 0;
+                               }
+                       }
+                       else if (cur_bits_left > tmp)
+                       {
+                               /* we have more bits than we need */
+                               d32 |= cur_byte >> (8 - tmp);
+                               cur_byte <<= tmp;
+                               cur_bits_left -= tmp;
+                               bits_left = 32;
+                               break;
+                       }
+                       else
+                       {
+                               /* we have just the right amount of bits */
+                               d32 |= cur_byte >> (8 - tmp);
+                               bits_left = 32;
+                               if (cptr < cbuf + len)
+                               {
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       cur_bits_left = 0;
+                               }
+                               break;
+                       }
+               }
+
+               if (!copy_offset)
+               {
+                       continue;
+               }
+
+               /*
+               ** compute Length of Match
+               */
+
+               /*
+                  lengh of match  Encoding (binary header + LoM bits
+                  --------------  ----------------------------------
+                  3               0
+                  4..7            10 + 2 lower bits of LoM
+                  8..15           110 + 3 lower bits of LoM
+                  16..31          1110 + 4 lower bits of LoM
+                  32..63          1111-0 + 5 lower bits of LoM
+                  64..127         1111-10 + 6 lower bits of LoM
+                  128..255        1111-110 + 7 lower bits of LoM
+                  256..511        1111-1110 + 8 lower bits of LoM
+                  512..1023       1111-1111-0 + 9 lower bits of LoM
+                  1024..2047      1111-1111-10 + 10 lower bits of LoM
+                  2048..4095      1111-1111-110 + 11 lower bits of LoM
+                  4096..8191      1111-1111-1110 + 12 lower bits of LoM
+                  8192..16383     1111-1111-1111-0 + 13 lower bits of LoM
+                  16384..32767    1111-1111-1111-10 + 14 lower bits of LoM
+                  32768..65535    1111-1111-1111-110 + 15 lower bits of LoM
+               */
+
+               if ((d32 & 0x80000000) == 0)
+               {
+                       /* lom is fixed to 3 */
+                       lom = 3;
+                       d32 <<= 1;
+                       bits_left -= 1;
+               }
+               else if ((d32 & 0xc0000000) == 0x80000000)
+               {
+                       /* 2 lower bits of LoM */
+                       lom = ((d32 >> 28) & 0x03) + 4;
+                       d32 <<= 4;
+                       bits_left -= 4;
+               }
+               else if ((d32 & 0xe0000000) == 0xc0000000)
+               {
+                       /* 3 lower bits of LoM */
+                       lom = ((d32 >> 26) & 0x07) + 8;
+                       d32 <<= 6;
+                       bits_left -= 6;
+               }
+               else if ((d32 & 0xf0000000) == 0xe0000000)
+               {
+                       /* 4 lower bits of LoM */
+                       lom = ((d32 >> 24) & 0x0f) + 16;
+                       d32 <<= 8;
+                       bits_left -= 8;
+               }
+               else if ((d32 & 0xf8000000) == 0xf0000000)
+               {
+                       /* 5 lower bits of LoM */
+                       lom = ((d32 >> 22) & 0x1f) + 32;
+                       d32 <<= 10;
+                       bits_left -= 10;
+               }
+               else if ((d32 & 0xfc000000) == 0xf8000000)
+               {
+                       /* 6 lower bits of LoM */
+                       lom = ((d32 >> 20) & 0x3f) + 64;
+                       d32 <<= 12;
+                       bits_left -= 12;
+               }
+               else if ((d32 & 0xfe000000) == 0xfc000000)
+               {
+                       /* 7 lower bits of LoM */
+                       lom = ((d32 >> 18) & 0x7f) + 128;
+                       d32 <<= 14;
+                       bits_left -= 14;
+               }
+               else if ((d32 & 0xff000000) == 0xfe000000)
+               {
+                       /* 8 lower bits of LoM */
+                       lom = ((d32 >> 16) & 0xff) + 256;
+                       d32 <<= 16;
+                       bits_left -= 16;
+               }
+               else if ((d32 & 0xff800000) == 0xff000000)
+               {
+                       /* 9 lower bits of LoM */
+                       lom = ((d32 >> 14) & 0x1ff) + 512;
+                       d32 <<= 18;
+                       bits_left -= 18;
+               }
+               else if ((d32 & 0xffc00000) == 0xff800000)
+               {
+                       /* 10 lower bits of LoM */
+                       lom = ((d32 >> 12) & 0x3ff) + 1024;
+                       d32 <<= 20;
+                       bits_left -= 20;
+               }
+               else if ((d32 & 0xffe00000) == 0xffc00000)
+               {
+                       /* 11 lower bits of LoM */
+                       lom = ((d32 >> 10) & 0x7ff) + 2048;
+                       d32 <<= 22;
+                       bits_left -= 22;
+               }
+               else if ((d32 & 0xfff00000) == 0xffe00000)
+               {
+                       /* 12 lower bits of LoM */
+                       lom = ((d32 >> 8) & 0xfff) + 4096;
+                       d32 <<= 24;
+                       bits_left -= 24;
+               }
+               else if ((d32 & 0xfff80000) == 0xfff00000)
+               {
+                       /* 13 lower bits of LoM */
+                       lom = ((d32 >> 6) & 0x1fff) + 8192;
+                       d32 <<= 26;
+                       bits_left -= 26;
+               }
+               else if ((d32 & 0xfffc0000) == 0xfff80000)
+               {
+                       /* 14 lower bits of LoM */
+                       lom = ((d32 >> 4) & 0x3fff) + 16384;
+                       d32 <<= 28;
+                       bits_left -= 28;
+               }
+               else if ((d32 & 0xfffe0000) == 0xfffc0000)
+               {
+                       /* 15 lower bits of LoM */
+                       lom = ((d32 >> 2) & 0x7fff) + 32768;
+                       d32 <<= 30;
+                       bits_left -= 30;
+               }
+
+               /* now that we have copy_offset and LoM, process them */
+
+               src_ptr = history_ptr - copy_offset;
+               if (src_ptr >= rdp->mppc->history_buf)
+               {
+                       /* data does not wrap around */
+                       while (lom > 0)
+                       {
+                               *history_ptr++ = *src_ptr++;
+                               lom--;
+                       }
+               }
+               else
+               {
+                       src_ptr = rdp->mppc->history_buf_end - (copy_offset - (history_ptr - rdp->mppc->history_buf));
+                       src_ptr++;
+                       while (lom && (src_ptr <= rdp->mppc->history_buf_end))
+                       {
+                               *history_ptr++ = *src_ptr++;
+                               lom--;
+                       }
+
+                       src_ptr = rdp->mppc->history_buf;
+                       while (lom > 0)
+                       {
+                               *history_ptr++ = *src_ptr++;
+                               lom--;
+                       }
+               }
+
+               /*
+               ** get more bits before we restart the loop
+               */
+
+               /* how may bits do we need to get? */
+               tmp = 32 - bits_left;
+
+               while (tmp)
+               {
+                       if (cur_bits_left < tmp)
+                       {
+                               /* we have less bits than we need */
+                               i32 = cur_byte >> (8 - cur_bits_left);
+                               d32 |= i32 << ((32 - bits_left) - cur_bits_left);
+                               bits_left += cur_bits_left;
+                               tmp -= cur_bits_left;
+                               if (cptr < cbuf + len)
+                               {
+                                       /* more compressed data available */
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       /* no more compressed data available */
+                                       tmp = 0;
+                                       cur_bits_left = 0;
+                               }
+                       }
+                       else if (cur_bits_left > tmp)
+                       {
+                               /* we have more bits than we need */
+                               d32 |= cur_byte >> (8 - tmp);
+                               cur_byte <<= tmp;
+                               cur_bits_left -= tmp;
+                               bits_left = 32;
+                               break;
+                       }
+                       else
+                       {
+                               /* we have just the right amount of bits */
+                               d32 |= cur_byte >> (8 - tmp);
+                               bits_left = 32;
+                               if (cptr < cbuf + len)
+                               {
+                                       cur_byte = *cptr++;
+                                       cur_bits_left = 8;
+                               }
+                               else
+                               {
+                                       cur_bits_left = 0;
+                               }
+                               break;
+                       }
+               }
+
+       } /* end while (cptr < cbuf + len) */
+
+       *rlen = history_ptr - rdp->mppc->history_ptr;
+
+       rdp->mppc->history_ptr = history_ptr;
+
+       return true;
+}
+
+/**
+ * decompress RDP 6 data
+ *
+ * @param rdp     per session information
+ * @param cbuf    compressed data
+ * @param len     length of compressed data
+ * @param ctype   compression flags
+ * @param roff    starting offset of uncompressed data
+ * @param rlen    length of uncompressed data
+ *
+ * @return        True on success, False on failure
+ */
+
+int decompress_rdp_6(rdpRdp* rdp, uint8* cbuf, int len, int ctype, uint32* roff, uint32* rlen)
+{
+       uint8*    history_buf;    /* uncompressed data goes here */
+       uint16*   offset_cache;   /* Copy Offset cache */
+       uint8*    history_ptr;    /* points to next free slot in bistory_buf */
+       uint32    d32;            /* we process 4 compressed bytes at a time */
+       uint16    copy_offset;    /* location to copy data from */
+       uint16    lom;            /* length of match */
+       uint8*    src_ptr;        /* used while copying compressed data */
+       uint8*    cptr;           /* points to next byte in cbuf */
+       uint8     cur_byte;       /* last byte fetched from cbuf */
+       int       bits_left;      /* bits left in d32 for processing */
+       int       cur_bits_left;  /* bits left in cur_byte for processing */
+       int       tmp;
+       uint32    i32;
+
+       if ((rdp->mppc == NULL) || (rdp->mppc->history_buf == NULL))
+       {
+               printf("decompress_rdp_6: null\n");
+               return false;
+       }
+
+       src_ptr = 0;
+       cptr = cbuf;
+       copy_offset = 0;
+       lom = 0;
+       bits_left = 0;
+       cur_bits_left = 0;
+       d32 = 0;
+       cur_byte = 0;
+       *rlen = 0;
+
+       /* get start of history buffer */
+       history_buf = rdp->mppc->history_buf;
+
+       /* get start of offset_cache */
+       offset_cache = rdp->mppc->offset_cache;
+
+       /* get next free slot in history buffer */
+       history_ptr = rdp->mppc->history_ptr;
+       *roff = history_ptr - history_buf;
+
+       if (ctype & PACKET_AT_FRONT)
+       {
+               printf("need to look later\n");
+               /* slid history_buf and reset history_buf to middle */
+               memcpy(history_buf, (history_buf + 32768), (history_ptr -history_buf - 32768));
+               memcpy((history_buf + (history_ptr - history_buf - 32768)), cbuf, len);
+               history_ptr = history_buf + 32768;
+               *roff = 32768;
+       }
+       
+       if (ctype & PACKET_FLUSHED)
+       {
+               /* re-init history buffer */
+               history_ptr = rdp->mppc->history_buf;
+               memset(history_buf, 0, RDP6_HISTORY_BUF_SIZE);
+               memset(offset_cache, 0, RDP6_OFFSET_CACHE_SIZE);
+               *roff = 0;
+       }
+
+       if ((ctype & PACKET_COMPRESSED) != PACKET_COMPRESSED)
+       {
+               /* data in cbuf is not compressed - copy to history buf as is */
+               memcpy(history_ptr, cbuf, len);
+               history_ptr += len;
+               *rlen = history_ptr - rdp->mppc->history_ptr;
+               rdp->mppc->history_ptr = history_ptr;
+               return true;
+       }
+
+       /* load initial data */
+       tmp = 24;
+       while (cptr < cbuf + len)
+       {
+               i32 = *cptr++;
+               d32  |= i32 << tmp;
+               bits_left += 8;
+               tmp -= 8;
+               if (tmp < 0)
+               {
+                       break;
+               }
+       }
+
+       if (cptr < cbuf + len)
+       {
+               cur_byte = *cptr++;
+               cur_bits_left = 8;
+       }
+       else
+       {
+               cur_bits_left = 0;
+       }
+
+       /*
+       ** start uncompressing data in cbuf
+       */
+
+
+       return true;
+}
+
+/**
+ * decompress RDP 6.1 data
+ *
+ * @param rdp     per session information
+ * @param cbuf    compressed data
+ * @param len     length of compressed data
+ * @param ctype   compression flags
+ * @param roff    starting offset of uncompressed data
+ * @param rlen    length of uncompressed data
+ *
+ * @return        True on success, False on failure
+ */
+
+int decompress_rdp_61(rdpRdp* rdp, uint8* cbuf, int len, int ctype, uint32* roff, uint32* rlen)
+{
+       return false;
+}
+
+/**
+ * allocate space to store history buffer
+ *
+ * @param rdp rdp struct that contains rdp_mppc struct
+ * @return pointer to new struct, or NULL on failure
+ */
+
+struct rdp_mppc* mppc_new(rdpRdp* rdp)
+{
+       struct rdp_mppc* ptr;
+
+       ptr = (struct rdp_mppc*) xmalloc(sizeof(struct rdp_mppc));
+
+       if (!ptr)
+       {
+               printf("mppc_new(): system out of memory\n");
+               return NULL;
+       }
+
+       ptr->history_buf = (uint8*) xmalloc(RDP6_HISTORY_BUF_SIZE);
+       ptr->offset_cache = (uint16*) xzalloc(RDP6_OFFSET_CACHE_SIZE);
+
+       if (!ptr->history_buf)
+       {
+               printf("mppc_new(): system out of memory\n");
+               xfree(ptr);
+               return NULL;
+       }
+
+       ptr->history_ptr = ptr->history_buf;
+       ptr->history_buf_end = ptr->history_buf + RDP6_HISTORY_BUF_SIZE - 1;
+
+       return ptr;
+}
+
+/**
+ * free history buffer
+ *
+ * @param rdp rdp struct that contains rdp_mppc struct
+ */
+
+void mppc_free(rdpRdp* rdp)
+{
+       if (!rdp->mppc)
+       {
+               return;
+       }
+
+       if (rdp->mppc->history_buf)
+       {
+               xfree(rdp->mppc->history_buf);
+               rdp->mppc->history_buf = NULL;
+               rdp->mppc->history_ptr = NULL;
+       }
+
+       if (rdp->mppc->offset_cache)
+       {
+               xfree(rdp->mppc->offset_cache);
+       }
+
+       xfree(rdp->mppc);
+}
diff --git a/libfreerdp-core/mppc.h b/libfreerdp-core/mppc.h
new file mode 100644 (file)
index 0000000..c3d00fa
--- /dev/null
@@ -0,0 +1,45 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Implements Microsoft Point to Point Compression (MPPC) protocol
+ *
+ * Copyright 2011 Laxmikant Rashinkar <LK.Rashinkar@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __MPPC_H
+#define __MPPC_H
+
+#include <stdint.h>
+
+#define RDP6_HISTORY_BUF_SIZE     65536
+#define RDP6_OFFSET_CACHE_SIZE     4
+
+struct rdp_mppc
+{
+       uint8 *history_buf;
+       uint16 *offset_cache;
+       uint8 *history_buf_end;
+       uint8 *history_ptr;
+};
+
+// forward declarations
+int decompress_rdp(rdpRdp *, uint8 *, int, int, uint32 *, uint32 *);
+int decompress_rdp_4(rdpRdp *, uint8 *, int, int, uint32 *, uint32 *);
+int decompress_rdp_5(rdpRdp *, uint8 *, int, int, uint32 *, uint32 *);
+int decompress_rdp_6(rdpRdp *, uint8 *, int, int, uint32 *, uint32 *);
+int decompress_rdp_61(rdpRdp *, uint8 *, int, int, uint32 *, uint32 *);
+struct rdp_mppc *mppc_new(rdpRdp *rdp);
+void mppc_free(rdpRdp *rdp);
+
+#endif
diff --git a/libfreerdp-core/nego.c b/libfreerdp-core/nego.c
new file mode 100644 (file)
index 0000000..7eb810b
--- /dev/null
@@ -0,0 +1,720 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Protocol Security Negotiation
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+
+#include "tpkt.h"
+
+#include "nego.h"
+
+static const char* const NEGO_STATE_STRINGS[] =
+{
+       "NEGO_STATE_INITIAL",
+       "NEGO_STATE_NLA",
+       "NEGO_STATE_TLS",
+       "NEGO_STATE_RDP",
+       "NEGO_STATE_FAIL",
+       "NEGO_STATE_FINAL"
+};
+
+static const char PROTOCOL_SECURITY_STRINGS[3][4] =
+{
+       "RDP",
+       "TLS",
+       "NLA"
+};
+
+/**
+ * Negotiate protocol security and connect.
+ * @param nego
+ * @return
+ */
+
+boolean nego_connect(rdpNego* nego)
+{
+       if (nego->state == NEGO_STATE_INITIAL)
+       {
+               if (nego->enabled_protocols[PROTOCOL_NLA] > 0)
+                       nego->state = NEGO_STATE_NLA;
+               else if (nego->enabled_protocols[PROTOCOL_TLS] > 0)
+                       nego->state = NEGO_STATE_TLS;
+               else if (nego->enabled_protocols[PROTOCOL_RDP] > 0)
+                       nego->state = NEGO_STATE_RDP;
+               else
+                       nego->state = NEGO_STATE_FAIL;
+       }
+
+       do
+       {
+               DEBUG_NEGO("state: %s", NEGO_STATE_STRINGS[nego->state]);
+
+               nego_send(nego);
+
+               if (nego->state == NEGO_STATE_FAIL)
+               {
+                       DEBUG_NEGO("Protocol Security Negotiation Failure");
+                       nego->state = NEGO_STATE_FINAL;
+                       return false;
+               }
+       }
+       while (nego->state != NEGO_STATE_FINAL);
+
+       DEBUG_NEGO("Negotiated %s security", PROTOCOL_SECURITY_STRINGS[nego->selected_protocol]);
+
+       /* update settings with negotiated protocol security */
+       nego->transport->settings->requested_protocols = nego->requested_protocols;
+       nego->transport->settings->selected_protocol = nego->selected_protocol;
+       nego->transport->settings->negotiationFlags = nego->flags;
+
+       if(nego->selected_protocol == PROTOCOL_RDP)
+       {
+               nego->transport->settings->encryption = true;
+               nego->transport->settings->encryption_method = ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS;
+               nego->transport->settings->encryption_level = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE;
+       }
+
+       return true;
+}
+
+/**
+ * Connect TCP layer.
+ * @param nego
+ * @return
+ */
+
+boolean nego_tcp_connect(rdpNego* nego)
+{
+       if (nego->tcp_connected == 0)
+       {
+               if (transport_connect(nego->transport, nego->hostname, nego->port) == false)
+               {
+                       nego->tcp_connected = 0;
+                       return false;
+               }
+               else
+               {
+                       nego->tcp_connected = 1;
+                       return true;
+               }
+       }
+
+       return true;
+}
+
+/**
+ * Disconnect TCP layer.
+ * @param nego
+ * @return
+ */
+
+int nego_tcp_disconnect(rdpNego* nego)
+{
+       if (nego->tcp_connected)
+               transport_disconnect(nego->transport);
+
+       nego->tcp_connected = 0;
+       return 1;
+}
+
+/**
+ * Attempt negotiating NLA + TLS security.
+ * @param nego
+ */
+
+void nego_attempt_nla(rdpNego* nego)
+{
+       nego->requested_protocols = PROTOCOL_NLA | PROTOCOL_TLS;
+
+       DEBUG_NEGO("Attempting NLA security");
+
+       if (!nego_tcp_connect(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (!nego_send_negotiation_request(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (!nego_recv_response(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (nego->state != NEGO_STATE_FINAL)
+       {
+               nego_tcp_disconnect(nego);
+
+               if (nego->enabled_protocols[PROTOCOL_TLS] > 0)
+                       nego->state = NEGO_STATE_TLS;
+               else if (nego->enabled_protocols[PROTOCOL_RDP] > 0)
+                       nego->state = NEGO_STATE_RDP;
+               else
+                       nego->state = NEGO_STATE_FAIL;
+       }
+}
+
+/**
+ * Attempt negotiating TLS security.
+ * @param nego
+ */
+
+void nego_attempt_tls(rdpNego* nego)
+{
+       nego->requested_protocols = PROTOCOL_TLS;
+
+       DEBUG_NEGO("Attempting TLS security");
+
+       if (!nego_tcp_connect(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (!nego_send_negotiation_request(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (!nego_recv_response(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (nego->state != NEGO_STATE_FINAL)
+       {
+               nego_tcp_disconnect(nego);
+
+               if (nego->enabled_protocols[PROTOCOL_RDP] > 0)
+                       nego->state = NEGO_STATE_RDP;
+               else
+                       nego->state = NEGO_STATE_FAIL;
+       }
+}
+
+/**
+ * Attempt negotiating standard RDP security.
+ * @param nego
+ */
+
+void nego_attempt_rdp(rdpNego* nego)
+{
+       nego->requested_protocols = PROTOCOL_RDP;
+
+       DEBUG_NEGO("Attempting RDP security");
+
+       if (!nego_tcp_connect(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (!nego_send_negotiation_request(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+
+       if (!nego_recv_response(nego))
+       {
+               nego->state = NEGO_STATE_FAIL;
+               return;
+       }
+}
+
+/**
+ * Wait to receive a negotiation response
+ * @param nego
+ */
+
+boolean nego_recv_response(rdpNego* nego)
+{
+       STREAM* s = transport_recv_stream_init(nego->transport, 1024);
+       if (transport_read(nego->transport, s) < 0)
+               return false;
+       return nego_recv(nego->transport, s, nego->transport->recv_extra);
+}
+
+/**
+ * Receive protocol security negotiation message.\n
+ * @msdn{cc240501}
+ * @param transport transport
+ * @param s stream
+ * @param extra nego pointer
+ */
+
+boolean nego_recv(rdpTransport* transport, STREAM* s, void* extra)
+{
+       uint8 li;
+       uint8 type;
+       rdpNego* nego = (rdpNego*) extra;
+
+       if (tpkt_read_header(s) == 0)
+               return false;
+
+       li = tpdu_read_connection_confirm(s);
+
+       if (li > 6)
+       {
+               /* rdpNegData (optional) */
+
+               stream_read_uint8(s, type); /* Type */
+
+               switch (type)
+               {
+                       case TYPE_RDP_NEG_RSP:
+                               nego_process_negotiation_response(nego, s);
+                               break;
+
+                       case TYPE_RDP_NEG_FAILURE:
+                               nego_process_negotiation_failure(nego, s);
+                               break;
+               }
+       }
+       else
+       {
+               nego->state = NEGO_STATE_FINAL;
+       }
+
+       return true;
+}
+
+/**
+ * Read protocol security negotiation request message.\n
+ * @param nego
+ * @param s stream
+ */
+
+boolean nego_read_request(rdpNego* nego, STREAM* s)
+{
+       uint8 li;
+       uint8 c;
+       uint8 type;
+
+       tpkt_read_header(s);
+       li = tpdu_read_connection_request(s);
+       if (li != stream_get_left(s) + 6)
+       {
+               printf("Incorrect TPDU length indicator.\n");
+               return false;
+       }
+
+       if (stream_get_left(s) > 8)
+       {
+               /* Optional routingToken or cookie, ending with CR+LF */
+               while (stream_get_left(s) > 0)
+               {
+                       stream_read_uint8(s, c);
+                       if (c != '\x0D')
+                               continue;
+                       stream_peek_uint8(s, c);
+                       if (c != '\x0A')
+                               continue;
+
+                       stream_seek_uint8(s);
+                       break;
+               }
+       }
+
+       if (stream_get_left(s) >= 8)
+       {
+               /* rdpNegData (optional) */
+
+               stream_read_uint8(s, type); /* Type */
+               if (type != TYPE_RDP_NEG_REQ)
+               {
+                       printf("Incorrect negotiation request type %d\n", type);
+                       return false;
+               }
+
+               nego_process_negotiation_request(nego, s);
+       }
+
+       return true;
+}
+
+/**
+ * Send protocol security negotiation message.
+ * @param nego
+ */
+
+void nego_send(rdpNego* nego)
+{
+       if (nego->state == NEGO_STATE_NLA)
+               nego_attempt_nla(nego);
+       else if (nego->state == NEGO_STATE_TLS)
+               nego_attempt_tls(nego);
+       else if (nego->state == NEGO_STATE_RDP)
+               nego_attempt_rdp(nego);
+       else
+               DEBUG_NEGO("invalid negotiation state for sending");
+}
+
+/**
+ * Send RDP Negotiation Request (RDP_NEG_REQ).\n
+ * @msdn{cc240500}\n
+ * @msdn{cc240470}
+ * @param nego
+ */
+
+boolean nego_send_negotiation_request(rdpNego* nego)
+{
+       STREAM* s;
+       int length;
+       uint8 *bm, *em;
+
+       s = transport_send_stream_init(nego->transport, 256);
+       length = TPDU_CONNECTION_REQUEST_LENGTH;
+       stream_get_mark(s, bm);
+       stream_seek(s, length);
+
+       if (nego->routing_token != NULL)
+       {
+               stream_write(s, nego->routing_token->data, nego->routing_token->length);
+               length += nego->routing_token->length;
+       }
+       else if (nego->cookie != NULL)
+       {
+               int cookie_length = strlen(nego->cookie);
+               stream_write(s, "Cookie: mstshash=", 17);
+               stream_write(s, (uint8*)nego->cookie, cookie_length);
+               stream_write_uint8(s, 0x0D); /* CR */
+               stream_write_uint8(s, 0x0A); /* LF */
+               length += cookie_length + 19;
+       }
+
+       if (nego->requested_protocols > PROTOCOL_RDP)
+       {
+               /* RDP_NEG_DATA must be present for TLS and NLA */
+               stream_write_uint8(s, TYPE_RDP_NEG_REQ);
+               stream_write_uint8(s, 0); /* flags, must be set to zero */
+               stream_write_uint16(s, 8); /* RDP_NEG_DATA length (8) */
+               stream_write_uint32(s, nego->requested_protocols); /* requestedProtocols */
+               length += 8;
+       }
+
+       stream_get_mark(s, em);
+       stream_set_mark(s, bm);
+       tpkt_write_header(s, length);
+       tpdu_write_connection_request(s, length - 5);
+       stream_set_mark(s, em);
+
+       if (transport_write(nego->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+/**
+ * Process Negotiation Request from Connection Request message.
+ * @param nego
+ * @param s
+ */
+
+void nego_process_negotiation_request(rdpNego* nego, STREAM* s)
+{
+       uint8 flags;
+       uint16 length;
+
+       DEBUG_NEGO("RDP_NEG_REQ");
+
+       stream_read_uint8(s, flags);
+       stream_read_uint16(s, length);
+       stream_read_uint32(s, nego->requested_protocols);
+
+       nego->state = NEGO_STATE_FINAL;
+}
+
+/**
+ * Process Negotiation Response from Connection Confirm message.
+ * @param nego
+ * @param s
+ */
+
+void nego_process_negotiation_response(rdpNego* nego, STREAM* s)
+{
+       uint16 length;
+
+       DEBUG_NEGO("RDP_NEG_RSP");
+
+       stream_read_uint8(s, nego->flags);
+       stream_read_uint16(s, length);
+       stream_read_uint32(s, nego->selected_protocol);
+
+       nego->state = NEGO_STATE_FINAL;
+}
+
+/**
+ * Process Negotiation Failure from Connection Confirm message.
+ * @param nego
+ * @param s
+ */
+
+void nego_process_negotiation_failure(rdpNego* nego, STREAM* s)
+{
+       uint8 flags;
+       uint16 length;
+       uint32 failureCode;
+
+       DEBUG_NEGO("RDP_NEG_FAILURE");
+
+       stream_read_uint8(s, flags);
+       stream_read_uint16(s, length);
+       stream_read_uint32(s, failureCode);
+
+       switch (failureCode)
+       {
+               case SSL_REQUIRED_BY_SERVER:
+                       DEBUG_NEGO("Error: SSL_REQUIRED_BY_SERVER");
+                       break;
+               case SSL_NOT_ALLOWED_BY_SERVER:
+                       DEBUG_NEGO("Error: SSL_NOT_ALLOWED_BY_SERVER");
+                       break;
+               case SSL_CERT_NOT_ON_SERVER:
+                       DEBUG_NEGO("Error: SSL_CERT_NOT_ON_SERVER");
+                       break;
+               case INCONSISTENT_FLAGS:
+                       DEBUG_NEGO("Error: INCONSISTENT_FLAGS");
+                       break;
+               case HYBRID_REQUIRED_BY_SERVER:
+                       DEBUG_NEGO("Error: HYBRID_REQUIRED_BY_SERVER");
+                       break;
+               default:
+                       DEBUG_NEGO("Error: Unknown protocol security error %d", failureCode);
+                       break;
+       }
+
+       nego->state = NEGO_STATE_FAIL;
+}
+
+/**
+ * Send RDP Negotiation Response (RDP_NEG_RSP).\n
+ * @param nego
+ */
+
+boolean nego_send_negotiation_response(rdpNego* nego)
+{
+       STREAM* s;
+       rdpSettings* settings;
+       int length;
+       uint8 *bm, *em;
+       boolean ret;
+
+       ret = true;
+       settings = nego->transport->settings;
+
+       s = transport_send_stream_init(nego->transport, 256);
+       length = TPDU_CONNECTION_CONFIRM_LENGTH;
+       stream_get_mark(s, bm);
+       stream_seek(s, length);
+
+       if (nego->selected_protocol > PROTOCOL_RDP)
+       {
+               /* RDP_NEG_DATA must be present for TLS and NLA */
+               stream_write_uint8(s, TYPE_RDP_NEG_RSP);
+               stream_write_uint8(s, EXTENDED_CLIENT_DATA_SUPPORTED); /* flags */
+               stream_write_uint16(s, 8); /* RDP_NEG_DATA length (8) */
+               stream_write_uint32(s, nego->selected_protocol); /* selectedProtocol */
+               length += 8;
+       }
+       else if (!settings->rdp_security)
+       {
+               stream_write_uint8(s, TYPE_RDP_NEG_FAILURE);
+               stream_write_uint8(s, 0); /* flags */
+               stream_write_uint16(s, 8); /* RDP_NEG_DATA length (8) */
+               /*
+                * TODO: Check for other possibilities,
+                *       like SSL_NOT_ALLOWED_BY_SERVER.
+                */
+               printf("nego_send_negotiation_response: client supports only Standard RDP Security\n");
+               stream_write_uint32(s, SSL_REQUIRED_BY_SERVER);
+               length += 8;
+               ret = false;
+       }
+
+       stream_get_mark(s, em);
+       stream_set_mark(s, bm);
+       tpkt_write_header(s, length);
+       tpdu_write_connection_confirm(s, length - 5);
+       stream_set_mark(s, em);
+
+       if (transport_write(nego->transport, s) < 0)
+               return false;
+
+       if (ret)
+       {
+               /* update settings with negotiated protocol security */
+               settings->requested_protocols = nego->requested_protocols;
+               settings->selected_protocol = nego->selected_protocol;
+
+               if (settings->selected_protocol == PROTOCOL_RDP)
+               {
+                       settings->tls_security = false;
+                       settings->nla_security = false;
+                       settings->rdp_security = true;
+                       settings->encryption = true;
+                       settings->encryption_method = ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS;
+                       settings->encryption_level = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE;
+               }
+               else if (settings->selected_protocol == PROTOCOL_TLS)
+               {
+                       settings->tls_security = true;
+                       settings->nla_security = false;
+                       settings->rdp_security = false;
+                       settings->encryption = false;
+                       settings->encryption_method = ENCRYPTION_METHOD_NONE;
+                       settings->encryption_level = ENCRYPTION_LEVEL_NONE;
+               }
+               else if (settings->selected_protocol == PROTOCOL_NLA)
+               {
+                       settings->tls_security = true;
+                       settings->nla_security = true;
+                       settings->rdp_security = false;
+                       settings->encryption = false;
+                       settings->encryption_method = ENCRYPTION_METHOD_NONE;
+                       settings->encryption_level = ENCRYPTION_LEVEL_NONE;
+               }
+       }
+
+       return ret;
+}
+
+/**
+ * Initialize NEGO state machine.
+ * @param nego
+ */
+
+void nego_init(rdpNego* nego)
+{
+       nego->state = NEGO_STATE_INITIAL;
+       nego->requested_protocols = PROTOCOL_RDP;
+       nego->transport->recv_callback = nego_recv;
+       nego->transport->recv_extra = (void*) nego;
+       nego->flags = 0;
+}
+
+/**
+ * Create a new NEGO state machine instance.
+ * @param transport
+ * @return
+ */
+
+rdpNego* nego_new(struct rdp_transport * transport)
+{
+       rdpNego* nego = (rdpNego*) xzalloc(sizeof(rdpNego));
+
+       if (nego != NULL)
+       {
+               nego->transport = transport;
+               nego_init(nego);
+       }
+
+       return nego;
+}
+
+/**
+ * Free NEGO state machine.
+ * @param nego
+ */
+
+void nego_free(rdpNego* nego)
+{
+       xfree(nego);
+}
+
+/**
+ * Set target hostname and port.
+ * @param nego
+ * @param hostname
+ * @param port
+ */
+
+void nego_set_target(rdpNego* nego, char* hostname, int port)
+{
+       nego->hostname = hostname;
+       nego->port = port;
+}
+
+/**
+ * Enable RDP security protocol.
+ * @param nego pointer to the negotiation structure
+ * @param enable_rdp whether to enable normal RDP protocol (true for enabled, false for disabled)
+ */
+
+void nego_enable_rdp(rdpNego* nego, boolean enable_rdp)
+{
+       DEBUG_NEGO("Enabling RDP security: %s", enable_rdp ? "true" : "false");
+       nego->enabled_protocols[PROTOCOL_RDP] = enable_rdp;
+}
+
+/**
+ * Enable TLS security protocol.
+ * @param nego pointer to the negotiation structure
+ * @param enable_tls whether to enable TLS + RDP protocol (true for enabled, false for disabled)
+ */
+void nego_enable_tls(rdpNego* nego, boolean enable_tls)
+{
+       DEBUG_NEGO("Enabling TLS security: %s", enable_tls ? "true" : "false");
+       nego->enabled_protocols[PROTOCOL_TLS] = enable_tls;
+}
+
+
+/**
+ * Enable NLA security protocol.
+ * @param nego pointer to the negotiation structure
+ * @param enable_nla whether to enable network level authentication protocol (true for enabled, false for disabled)
+ */
+
+void nego_enable_nla(rdpNego* nego, boolean enable_nla)
+{
+       DEBUG_NEGO("Enabling NLA security: %s", enable_nla ? "true" : "false");
+       nego->enabled_protocols[PROTOCOL_NLA] = enable_nla;
+}
+
+/**
+ * Set routing token.
+ * @param nego
+ * @param routing_token
+ */
+
+void nego_set_routing_token(rdpNego* nego, rdpBlob* routing_token)
+{
+       nego->routing_token = routing_token;
+}
+
+/**
+ * Set cookie.
+ * @param nego
+ * @param cookie
+ */
+
+void nego_set_cookie(rdpNego* nego, char* cookie)
+{
+       nego->cookie = cookie;
+}
diff --git a/libfreerdp-core/nego.h b/libfreerdp-core/nego.h
new file mode 100644 (file)
index 0000000..800b3b4
--- /dev/null
@@ -0,0 +1,120 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Protocol Security Negotiation
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NEGO_H
+#define __NEGO_H
+
+#include "transport.h"
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+
+/* Protocol Security Negotiation Protocols */
+enum RDP_NEG_PROTOCOLS
+{
+       PROTOCOL_RDP = 0x00000000,
+       PROTOCOL_TLS = 0x00000001,
+       PROTOCOL_NLA = 0x00000002
+};
+
+/* Protocol Security Negotiation Failure Codes */
+enum RDP_NEG_FAILURE_FAILURECODES
+{
+       SSL_REQUIRED_BY_SERVER = 0x00000001,
+       SSL_NOT_ALLOWED_BY_SERVER = 0x00000002,
+       SSL_CERT_NOT_ON_SERVER = 0x00000003,
+       INCONSISTENT_FLAGS = 0x00000004,
+       HYBRID_REQUIRED_BY_SERVER = 0x00000005
+};
+
+enum _NEGO_STATE
+{
+       NEGO_STATE_INITIAL,
+       NEGO_STATE_NLA, /* Network Level Authentication (TLS implicit) */
+       NEGO_STATE_TLS, /* TLS Encryption without NLA */
+       NEGO_STATE_RDP, /* Standard Legacy RDP Encryption */
+       NEGO_STATE_FAIL, /* Negotiation failure */
+       NEGO_STATE_FINAL
+};
+typedef enum _NEGO_STATE NEGO_STATE;
+
+/* RDP Negotiation Messages */
+enum RDP_NEG_MSG
+{
+       /* X224_TPDU_CONNECTION_REQUEST */
+       TYPE_RDP_NEG_REQ = 0x1,
+       /* X224_TPDU_CONNECTION_CONFIRM */
+       TYPE_RDP_NEG_RSP = 0x2,
+       TYPE_RDP_NEG_FAILURE = 0x3
+};
+
+#define EXTENDED_CLIENT_DATA_SUPPORTED 0x01
+
+struct rdp_nego
+{
+       int port;
+       uint32 flags;
+       char* hostname;
+       char* cookie;
+       NEGO_STATE state;
+       int tcp_connected;
+       rdpBlob* routing_token;
+       uint32 selected_protocol;
+       uint32 requested_protocols;
+       uint8 enabled_protocols[3];
+       rdpTransport* transport;
+};
+typedef struct rdp_nego rdpNego;
+
+boolean nego_connect(rdpNego* nego);
+
+void nego_attempt_nla(rdpNego* nego);
+void nego_attempt_tls(rdpNego* nego);
+void nego_attempt_rdp(rdpNego* nego);
+
+void nego_send(rdpNego* nego);
+boolean nego_recv(rdpTransport* transport, STREAM* s, void* extra);
+boolean nego_recv_response(rdpNego* nego);
+boolean nego_read_request(rdpNego* nego, STREAM* s);
+
+boolean nego_send_negotiation_request(rdpNego* nego);
+void nego_process_negotiation_request(rdpNego* nego, STREAM* s);
+void nego_process_negotiation_response(rdpNego* nego, STREAM* s);
+void nego_process_negotiation_failure(rdpNego* nego, STREAM* s);
+boolean nego_send_negotiation_response(rdpNego* nego);
+
+rdpNego* nego_new(struct rdp_transport * transport);
+void nego_free(rdpNego* nego);
+void nego_init(rdpNego* nego);
+void nego_set_target(rdpNego* nego, char* hostname, int port);
+void nego_enable_rdp(rdpNego* nego, boolean enable_rdp);
+void nego_enable_nla(rdpNego* nego, boolean enable_nla);
+void nego_enable_tls(rdpNego* nego, boolean enable_tls);
+void nego_set_routing_token(rdpNego* nego, rdpBlob* routing_token);
+void nego_set_cookie(rdpNego* nego, char* cookie);
+
+#ifdef WITH_DEBUG_NEGO
+#define DEBUG_NEGO(fmt, ...) DEBUG_CLASS(NEGO, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_NEGO(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __NEGO_H */
diff --git a/libfreerdp-core/ntlmssp.c b/libfreerdp-core/ntlmssp.c
new file mode 100644 (file)
index 0000000..e285836
--- /dev/null
@@ -0,0 +1,1897 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * NT LAN Manager Security Support Provider (NTLMSSP)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <time.h>
+#include <openssl/des.h>
+#include <openssl/md4.h>
+#include <openssl/hmac.h>
+#include <openssl/rand.h>
+#include <openssl/engine.h>
+#include <freerdp/utils/memory.h>
+
+#include "ntlmssp.h"
+
+#define NTLMSSP_NEGOTIATE_56                                   0x80000000 /* W   (0) */
+#define NTLMSSP_NEGOTIATE_KEY_EXCH                             0x40000000 /* V   (1) */
+#define NTLMSSP_NEGOTIATE_128                                  0x20000000 /* U   (2) */
+#define NTLMSSP_RESERVED1                                      0x10000000 /* r1  (3) */
+#define NTLMSSP_RESERVED2                                      0x08000000 /* r2  (4) */
+#define NTLMSSP_RESERVED3                                      0x04000000 /* r3  (5) */
+#define NTLMSSP_NEGOTIATE_VERSION                              0x02000000 /* T   (6) */
+#define NTLMSSP_RESERVED4                                      0x01000000 /* r4  (7) */
+#define NTLMSSP_NEGOTIATE_TARGET_INFO                          0x00800000 /* S   (8) */
+#define NTLMSSP_RESERVEDEQUEST_NON_NT_SESSION_KEY              0x00400000 /* R   (9) */
+#define NTLMSSP_RESERVED5                                      0x00200000 /* r5  (10) */
+#define NTLMSSP_NEGOTIATE_IDENTIFY                             0x00100000 /* Q   (11) */
+#define NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY            0x00080000 /* P   (12) */
+#define NTLMSSP_RESERVED6                                      0x00040000 /* r6  (13) */
+#define NTLMSSP_TARGET_TYPE_SERVER                             0x00020000 /* O   (14) */
+#define NTLMSSP_TARGET_TYPE_DOMAIN                             0x00010000 /* N   (15) */
+#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN                          0x00008000 /* M   (16) */
+#define NTLMSSP_RESERVED7                                      0x00004000 /* r7  (17) */
+#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED                 0x00002000 /* L   (18) */
+#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED                      0x00001000 /* K   (19) */
+#define NTLMSSP_NEGOTIATE_ANONYMOUS                            0x00000800 /* J   (20) */
+#define NTLMSSP_RESERVED8                                      0x00000400 /* r8  (21) */
+#define NTLMSSP_NEGOTIATE_NTLM                                 0x00000200 /* H   (22) */
+#define NTLMSSP_RESERVED9                                      0x00000100 /* r9  (23) */
+#define NTLMSSP_NEGOTIATE_LM_KEY                               0x00000080 /* G   (24) */
+#define NTLMSSP_NEGOTIATE_DATAGRAM                             0x00000040 /* F   (25) */
+#define NTLMSSP_NEGOTIATE_SEAL                                 0x00000020 /* E   (26) */
+#define NTLMSSP_NEGOTIATE_SIGN                                 0x00000010 /* D   (27) */
+#define NTLMSSP_RESERVED10                                     0x00000008 /* r10 (28) */
+#define NTLMSSP_REQUEST_TARGET                                 0x00000004 /* C   (29) */
+#define NTLMSSP_NEGOTIATE_OEM                                  0x00000002 /* B   (30) */
+#define NTLMSSP_NEGOTIATE_UNICODE                              0x00000001 /* A   (31) */
+
+#define WINDOWS_MAJOR_VERSION_5                0x05
+#define WINDOWS_MAJOR_VERSION_6                0x06
+#define WINDOWS_MINOR_VERSION_0                0x00
+#define WINDOWS_MINOR_VERSION_1                0x01
+#define WINDOWS_MINOR_VERSION_2                0x02
+#define NTLMSSP_REVISION_W2K3          0x0F
+
+static const char ntlm_signature[] = "NTLMSSP";
+static const char lm_magic[] = "KGS!@#$%";
+
+static const char client_sign_magic[] = "session key to client-to-server signing key magic constant";
+static const char server_sign_magic[] = "session key to server-to-client signing key magic constant";
+static const char client_seal_magic[] = "session key to client-to-server sealing key magic constant";
+static const char server_seal_magic[] = "session key to server-to-client sealing key magic constant";
+
+static const char* const NTLMSSP_NEGOTIATE_STRINGS[] =
+{
+       "NTLMSSP_NEGOTIATE_56",
+       "NTLMSSP_NEGOTIATE_KEY_EXCH",
+       "NTLMSSP_NEGOTIATE_128",
+       "NTLMSSP_RESERVED1",
+       "NTLMSSP_RESERVED2",
+       "NTLMSSP_RESERVED3",
+       "NTLMSSP_NEGOTIATE_VERSION",
+       "NTLMSSP_RESERVED4",
+       "NTLMSSP_NEGOTIATE_TARGET_INFO",
+       "NTLMSSP_REQUEST_NON_NT_SESSION_KEY",
+       "NTLMSSP_RESERVED5",
+       "NTLMSSP_NEGOTIATE_IDENTIFY",
+       "NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY",
+       "NTLMSSP_RESERVED6",
+       "NTLMSSP_TARGET_TYPE_SERVER",
+       "NTLMSSP_TARGET_TYPE_DOMAIN",
+       "NTLMSSP_NEGOTIATE_ALWAYS_SIGN",
+       "NTLMSSP_RESERVED7",
+       "NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED",
+       "NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED",
+       "NTLMSSP_NEGOTIATE_ANONYMOUS",
+       "NTLMSSP_RESERVED8",
+       "NTLMSSP_NEGOTIATE_NTLM",
+       "NTLMSSP_RESERVED9",
+       "NTLMSSP_NEGOTIATE_LM_KEY",
+       "NTLMSSP_NEGOTIATE_DATAGRAM",
+       "NTLMSSP_NEGOTIATE_SEAL",
+       "NTLMSSP_NEGOTIATE_SIGN",
+       "NTLMSSP_RESERVED10",
+       "NTLMSSP_REQUEST_TARGET",
+       "NTLMSSP_NEGOTIATE_OEM",
+       "NTLMSSP_NEGOTIATE_UNICODE"
+};
+
+static const char* const AV_PAIRS_STRINGS[] =
+{
+       "MsvAvEOL",
+       "MsvAvNbComputerName",
+       "MsvAvNbDomainName",
+       "MsvAvDnsComputerName",
+       "MsvAvDnsDomainName",
+       "MsvAvDnsTreeName",
+       "MsvAvFlags",
+       "MsvAvTimestamp",
+       "MsvAvRestrictions",
+       "MsvAvTargetName",
+       "MsvChannelBindings"
+};
+
+/**
+ * Set NTLMSSP username.
+ * @param ntlmssp
+ * @param username username
+ */
+
+void ntlmssp_set_username(NTLMSSP* ntlmssp, char* username)
+{
+       freerdp_blob_free(&ntlmssp->username);
+
+       if (username != NULL)
+       {
+               ntlmssp->username.data = freerdp_uniconv_out(ntlmssp->uniconv, username, (size_t*) &(ntlmssp->username.length));
+       }
+}
+
+/**
+ * Set NTLMSSP domain name.
+ * @param ntlmssp
+ * @param domain domain name
+ */
+
+void ntlmssp_set_domain(NTLMSSP* ntlmssp, char* domain)
+{
+       freerdp_blob_free(&ntlmssp->domain);
+
+       if (domain != NULL)
+       {
+               ntlmssp->domain.data = freerdp_uniconv_out(ntlmssp->uniconv, domain, (size_t*) &(ntlmssp->domain.length));
+       }
+}
+
+/**
+ * Set NTLMSSP password.
+ * @param ntlmssp
+ * @param password password
+ */
+
+void ntlmssp_set_password(NTLMSSP* ntlmssp, char* password)
+{
+       freerdp_blob_free(&ntlmssp->password);
+
+       if (password != NULL)
+       {
+               ntlmssp->password.data = freerdp_uniconv_out(ntlmssp->uniconv, password, (size_t*) &(ntlmssp->password.length));
+       }
+}
+
+/**
+ * Set NTLMSSP workstation.
+ * @param ntlmssp
+ * @param workstation workstation
+ */
+
+void ntlmssp_set_workstation(NTLMSSP* ntlmssp, char* workstation)
+{
+       freerdp_blob_free(&ntlmssp->workstation);
+
+       if (workstation != NULL)
+       {
+               ntlmssp->workstation.data = freerdp_uniconv_out(ntlmssp->uniconv, workstation, (size_t*) &(ntlmssp->workstation.length));
+       }
+}
+
+/**
+ * Generate client challenge (8-byte nonce).
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_client_challenge(NTLMSSP* ntlmssp)
+{
+       /* ClientChallenge in computation of LMv2 and NTLMv2 responses */
+       crypto_nonce(ntlmssp->client_challenge, 8);
+}
+
+/**
+ * Generate KeyExchangeKey (the 128-bit SessionBaseKey).\n
+ * @msdn{cc236710}
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_key_exchange_key(NTLMSSP* ntlmssp)
+{
+       /* In NTLMv2, KeyExchangeKey is the 128-bit SessionBaseKey */
+       memcpy(ntlmssp->key_exchange_key, ntlmssp->session_base_key, 16);
+}
+
+/**
+ * Generate RandomSessionKey (16-byte nonce).
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_random_session_key(NTLMSSP* ntlmssp)
+{
+       crypto_nonce(ntlmssp->random_session_key, 16);
+}
+
+/**
+ * Generate ExportedSessionKey (the RandomSessionKey, exported)
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_exported_session_key(NTLMSSP* ntlmssp)
+{
+       memcpy(ntlmssp->exported_session_key, ntlmssp->random_session_key, 16);
+}
+
+/**
+ * Encrypt RandomSessionKey (RC4-encrypted RandomSessionKey, using KeyExchangeKey as the key).
+ * @param ntlmssp
+ */
+
+void ntlmssp_encrypt_random_session_key(NTLMSSP* ntlmssp)
+{
+       /* In NTLMv2, EncryptedRandomSessionKey is the ExportedSessionKey RC4-encrypted with the KeyExchangeKey */
+       credssp_rc4k(ntlmssp->key_exchange_key, 16, ntlmssp->random_session_key, ntlmssp->encrypted_random_session_key);
+}
+
+/**
+ * Generate timestamp for AUTHENTICATE_MESSAGE.
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_timestamp(NTLMSSP* ntlmssp)
+{
+       credssp_current_time(ntlmssp->timestamp);
+
+       if (ntlmssp->ntlm_v2)
+       {
+               if (ntlmssp->av_pairs->Timestamp.length == 8)
+               {
+                       memcpy(ntlmssp->av_pairs->Timestamp.value, ntlmssp->timestamp, 8);
+                       return;
+               }
+       }
+       else
+       {
+               if (ntlmssp->av_pairs->Timestamp.length != 8)
+               {
+                       ntlmssp->av_pairs->Timestamp.length = 8;
+                       ntlmssp->av_pairs->Timestamp.value = xmalloc(ntlmssp->av_pairs->Timestamp.length);
+               }
+               memcpy(ntlmssp->av_pairs->Timestamp.value, ntlmssp->timestamp, 8);
+       }
+}
+
+/**
+ * Generate signing key.\n
+ * @msdn{cc236711}
+ * @param exported_session_key ExportedSessionKey
+ * @param sign_magic Sign magic string
+ * @param signing_key Destination signing key
+ */
+
+void ntlmssp_generate_signing_key(uint8* exported_session_key, rdpBlob* sign_magic, uint8* signing_key)
+{
+       int length;
+       uint8* value;
+       CryptoMd5 md5;
+
+       length = 16 + sign_magic->length;
+       value = (uint8*) xmalloc(length);
+
+       /* Concatenate ExportedSessionKey with sign magic */
+       memcpy(value, exported_session_key, 16);
+       memcpy(&value[16], sign_magic->data, sign_magic->length);
+
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, value, length);
+       crypto_md5_final(md5, signing_key);
+
+       xfree(value);
+}
+
+/**
+ * Generate client signing key (ClientSigningKey).\n
+ * @msdn{cc236711}
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_client_signing_key(NTLMSSP* ntlmssp)
+{
+       rdpBlob sign_magic;
+       sign_magic.data = (void*) client_sign_magic;
+       sign_magic.length = sizeof(client_sign_magic);
+       ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &sign_magic, ntlmssp->client_signing_key);
+}
+
+/**
+ * Generate server signing key (ServerSigningKey).\n
+ * @msdn{cc236711}
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_server_signing_key(NTLMSSP* ntlmssp)
+{
+       rdpBlob sign_magic;
+       sign_magic.data = (void*) server_sign_magic;
+       sign_magic.length = sizeof(server_sign_magic);
+       ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &sign_magic, ntlmssp->server_signing_key);
+}
+
+/**
+ * Generate sealing key.\n
+ * @msdn{cc236712}
+ * @param exported_session_key ExportedSessionKey
+ * @param seal_magic Seal magic string
+ * @param sealing_key Destination sealing key
+ */
+
+void ntlmssp_generate_sealing_key(uint8* exported_session_key, rdpBlob* seal_magic, uint8* sealing_key)
+{
+       uint8* p;
+       CryptoMd5 md5;
+       rdpBlob blob;
+
+       freerdp_blob_alloc(&blob, 16 + seal_magic->length);
+       p = (uint8*) blob.data;
+
+       /* Concatenate ExportedSessionKey with seal magic */
+       memcpy(p, exported_session_key, 16);
+       memcpy(&p[16], seal_magic->data, seal_magic->length);
+
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, blob.data, blob.length);
+       crypto_md5_final(md5, sealing_key);
+
+       freerdp_blob_free(&blob);
+}
+
+/**
+ * Generate client sealing key (ClientSealingKey).\n
+ * @msdn{cc236712}
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_client_sealing_key(NTLMSSP* ntlmssp)
+{
+       rdpBlob seal_magic;
+       seal_magic.data = (void*) client_seal_magic;
+       seal_magic.length = sizeof(client_seal_magic);
+       ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &seal_magic, ntlmssp->client_sealing_key);
+}
+
+/**
+ * Generate server sealing key (ServerSealingKey).\n
+ * @msdn{cc236712}
+ * @param ntlmssp
+ */
+
+void ntlmssp_generate_server_sealing_key(NTLMSSP* ntlmssp)
+{
+       rdpBlob seal_magic;
+       seal_magic.data = (void*) server_seal_magic;
+       seal_magic.length = sizeof(server_seal_magic);
+       ntlmssp_generate_signing_key(ntlmssp->exported_session_key, &seal_magic, ntlmssp->server_sealing_key);
+}
+
+/**
+ * Initialize RC4 stream cipher states for sealing.
+ * @param ntlmssp
+ */
+
+void ntlmssp_init_rc4_seal_states(NTLMSSP* ntlmssp)
+{
+       ntlmssp->send_rc4_seal = crypto_rc4_init(ntlmssp->client_sealing_key, 16);
+       ntlmssp->recv_rc4_seal = crypto_rc4_init(ntlmssp->server_sealing_key, 16);
+}
+
+/**
+ * Get bit from a byte buffer using a bit offset.
+ * @param buffer byte buffer
+ * @param bit bit offset
+ * @return bit value
+ */
+
+static int get_bit(char* buffer, int bit)
+{
+       return (buffer[(bit - (bit % 8)) / 8] >> (7 - bit % 8) & 1);
+}
+
+/**
+ * Set bit in a byte buffer using a bit offset.
+ * @param buffer byte buffer
+ * @param bit bit offset
+ * @param value bit value
+ */
+
+static void set_bit(char* buffer, int bit, int value)
+{
+       buffer[(bit - (bit % 8)) / 8] |= value << (7 - bit % 8);
+}
+
+static void ntlmssp_compute_des_key(char* text, char* des_key)
+{
+       int i, j;
+       int bit;
+       int nbits;
+
+       /* Convert the 7 bytes into a bit stream, and insert a parity-bit (odd parity) after every seven bits. */
+
+       memset(des_key, '\0', 8);
+
+       for (i = 0; i < 8; i++)
+       {
+               nbits = 0;
+
+               for (j = 0; j < 7; j++)
+               {
+                       /* copy 7 bits, and count the number of bits that are set */
+
+                       bit = get_bit(text, i*7 + j);
+                       set_bit(des_key, i*7 + i + j, bit);
+                       nbits += bit;
+               }
+
+               /* insert parity bit (odd parity) */
+
+               if (nbits % 2 == 0)
+                       set_bit(des_key, i*7 + i + j, 1);
+       }
+}
+
+void ntlmssp_compute_lm_hash(char* password, char* hash)
+{
+       int i;
+       int maxlen;
+       char text[14];
+       char des_key1[8];
+       char des_key2[8];
+       des_key_schedule ks;
+
+       /* LM("password") = E52CAC67419A9A224A3B108F3FA6CB6D */
+
+       maxlen = (strlen(password) < 14) ? strlen(password) : 14;
+
+       /* convert to uppercase */
+       for (i = 0; i < maxlen; i++)
+       {
+               if ((password[i] >= 'a') && (password[i] <= 'z'))
+                       text[i] = password[i] - 32;
+               else
+                       text[i] = password[i];
+       }
+
+       /* pad with nulls up to 14 bytes */
+       for (i = maxlen; i < 14; i++)
+               text[i] = '\0';
+
+       ntlmssp_compute_des_key(text, des_key1);
+       ntlmssp_compute_des_key(&text[7], des_key2);
+
+       DES_set_key((const_DES_cblock*)des_key1, &ks);
+       DES_ecb_encrypt((const_DES_cblock*) lm_magic, (DES_cblock*)hash, &ks, DES_ENCRYPT);
+
+       DES_set_key((const_DES_cblock*)des_key2, &ks);
+       DES_ecb_encrypt((const_DES_cblock*) lm_magic, (DES_cblock*)&hash[8], &ks, DES_ENCRYPT);
+}
+
+void ntlmssp_compute_ntlm_hash(rdpBlob* password, char* hash)
+{
+       /* NTLMv1("password") = 8846F7EAEE8FB117AD06BDD830B7586C */
+
+       MD4_CTX md4_ctx;
+
+       /* Password needs to be in unicode */
+
+       /* Apply the MD4 digest algorithm on the password in unicode, the result is the NTLM hash */
+
+       MD4_Init(&md4_ctx);
+       MD4_Update(&md4_ctx, password->data, password->length);
+       MD4_Final((void*) hash, &md4_ctx);
+}
+
+void ntlmssp_compute_ntlm_v2_hash(NTLMSSP* ntlmssp, char* hash)
+{
+       char* p;
+       rdpBlob blob;
+       char ntlm_hash[16];
+
+       freerdp_blob_alloc(&blob, ntlmssp->username.length + ntlmssp->domain.length);
+       p = (char*) blob.data;
+
+       /* First, compute the NTLMv1 hash of the password */
+       ntlmssp_compute_ntlm_hash(&ntlmssp->password, ntlm_hash);
+
+       /* Concatenate(Uppercase(username),domain)*/
+       memcpy(p, ntlmssp->username.data, ntlmssp->username.length);
+       freerdp_uniconv_uppercase(ntlmssp->uniconv, p, ntlmssp->username.length / 2);
+
+       memcpy(&p[ntlmssp->username.length], ntlmssp->domain.data, ntlmssp->domain.length);
+
+       /* Compute the HMAC-MD5 hash of the above value using the NTLMv1 hash as the key, the result is the NTLMv2 hash */
+       HMAC(EVP_md5(), (void*) ntlm_hash, 16, blob.data, blob.length, (void*) hash, NULL);
+
+       freerdp_blob_free(&blob);
+}
+
+void ntlmssp_compute_lm_response(char* password, char* challenge, char* response)
+{
+       char hash[21];
+       char des_key1[8];
+       char des_key2[8];
+       char des_key3[8];
+       des_key_schedule ks;
+
+       /* A LM hash is 16-bytes long, but the LM response uses a LM hash null-padded to 21 bytes */
+       memset(hash, '\0', 21);
+       ntlmssp_compute_lm_hash(password, hash);
+
+       /* Each 7-byte third of the 21-byte null-padded LM hash is used to create a DES key */
+       ntlmssp_compute_des_key(hash, des_key1);
+       ntlmssp_compute_des_key(&hash[7], des_key2);
+       ntlmssp_compute_des_key(&hash[14], des_key3);
+
+       /* Encrypt the LM challenge with each key, and concatenate the result. This is the LM response (24 bytes) */
+       DES_set_key((const_DES_cblock*)des_key1, &ks);
+       DES_ecb_encrypt((const_DES_cblock*)challenge, (DES_cblock*)response, &ks, DES_ENCRYPT);
+
+       DES_set_key((const_DES_cblock*)des_key2, &ks);
+       DES_ecb_encrypt((const_DES_cblock*)challenge, (DES_cblock*)&response[8], &ks, DES_ENCRYPT);
+
+       DES_set_key((const_DES_cblock*)des_key3, &ks);
+       DES_ecb_encrypt((const_DES_cblock*)challenge, (DES_cblock*)&response[16], &ks, DES_ENCRYPT);
+}
+
+void ntlmssp_compute_lm_v2_response(NTLMSSP* ntlmssp)
+{
+       char *response;
+       char value[16];
+       char ntlm_v2_hash[16];
+
+       /* Compute the NTLMv2 hash */
+       ntlmssp_compute_ntlm_v2_hash(ntlmssp, ntlm_v2_hash);
+
+       /* Concatenate the server and client challenges */
+       memcpy(value, ntlmssp->server_challenge, 8);
+       memcpy(&value[8], ntlmssp->client_challenge, 8);
+
+       freerdp_blob_alloc(&ntlmssp->lm_challenge_response, 24);
+       response = (char*) ntlmssp->lm_challenge_response.data;
+
+       /* Compute the HMAC-MD5 hash of the resulting value using the NTLMv2 hash as the key */
+       HMAC(EVP_md5(), (void*) ntlm_v2_hash, 16, (void*) value, 16, (void*) response, NULL);
+
+       /* Concatenate the resulting HMAC-MD5 hash and the client challenge, giving us the LMv2 response (24 bytes) */
+       memcpy(&response[16], ntlmssp->client_challenge, 8);
+}
+
+/**
+ * Compute NTLMv2 Response.\n
+ * NTLMv2_RESPONSE @msdn{cc236653}\n
+ * NTLMv2 Authentication @msdn{cc236700}
+ * @param ntlmssp
+ */
+
+void ntlmssp_compute_ntlm_v2_response(NTLMSSP* ntlmssp)
+{
+       uint8* blob;
+       uint8 ntlm_v2_hash[16];
+       uint8 nt_proof_str[16];
+       rdpBlob ntlm_v2_temp;
+       rdpBlob ntlm_v2_temp_chal;
+
+       freerdp_blob_alloc(&ntlm_v2_temp, ntlmssp->target_info.length + 28);
+
+       memset(ntlm_v2_temp.data, '\0', ntlm_v2_temp.length);
+       blob = (uint8*) ntlm_v2_temp.data;
+
+       /* Compute the NTLMv2 hash */
+       ntlmssp_compute_ntlm_v2_hash(ntlmssp, (char*) ntlm_v2_hash);
+
+#ifdef WITH_DEBUG_NLA
+       printf("Password (length = %d)\n", ntlmssp->password.length);
+       freerdp_hexdump(ntlmssp->password.data, ntlmssp->password.length);
+       printf("\n");
+
+       printf("Username (length = %d)\n", ntlmssp->username.length);
+       freerdp_hexdump(ntlmssp->username.data, ntlmssp->username.length);
+       printf("\n");
+
+       printf("Domain (length = %d)\n", ntlmssp->domain.length);
+       freerdp_hexdump(ntlmssp->domain.data, ntlmssp->domain.length);
+       printf("\n");
+
+       printf("Workstation (length = %d)\n", ntlmssp->workstation.length);
+       freerdp_hexdump(ntlmssp->workstation.data, ntlmssp->workstation.length);
+       printf("\n");
+
+       printf("NTOWFv2, NTLMv2 Hash\n");
+       freerdp_hexdump(ntlm_v2_hash, 16);
+       printf("\n");
+#endif
+
+       /* Construct temp */
+       blob[0] = 1; /* RespType (1 byte) */
+       blob[1] = 1; /* HighRespType (1 byte) */
+       /* Reserved1 (2 bytes) */
+       /* Reserved2 (4 bytes) */
+       memcpy(&blob[8], ntlmssp->av_pairs->Timestamp.value, 8); /* Timestamp (8 bytes) */
+       memcpy(&blob[16], ntlmssp->client_challenge, 8); /* ClientChallenge (8 bytes) */
+       /* Reserved3 (4 bytes) */
+       memcpy(&blob[28], ntlmssp->target_info.data, ntlmssp->target_info.length);
+
+#ifdef WITH_DEBUG_NLA
+       printf("NTLMv2 Response Temp Blob\n");
+       freerdp_hexdump(ntlm_v2_temp.data, ntlm_v2_temp.length);
+       printf("\n");
+#endif
+
+       /* Concatenate server challenge with temp */
+       freerdp_blob_alloc(&ntlm_v2_temp_chal, ntlm_v2_temp.length + 8);
+       blob = (uint8*) ntlm_v2_temp_chal.data;
+       memcpy(blob, ntlmssp->server_challenge, 8);
+       memcpy(&blob[8], ntlm_v2_temp.data, ntlm_v2_temp.length);
+
+       HMAC(EVP_md5(), (void*) ntlm_v2_hash, 16, (void*) ntlm_v2_temp_chal.data,
+               ntlm_v2_temp_chal.length, (void*) nt_proof_str, NULL);
+
+       /* NtChallengeResponse, Concatenate NTProofStr with temp */
+       freerdp_blob_alloc(&ntlmssp->nt_challenge_response, ntlm_v2_temp.length + 16);
+       blob = (uint8*) ntlmssp->nt_challenge_response.data;
+       memcpy(blob, nt_proof_str, 16);
+       memcpy(&blob[16], ntlm_v2_temp.data, ntlm_v2_temp.length);
+
+       /* Compute SessionBaseKey, the HMAC-MD5 hash of NTProofStr using the NTLMv2 hash as the key */
+       HMAC(EVP_md5(), (void*) ntlm_v2_hash, 16,
+               (void*) nt_proof_str, 16, (void*) ntlmssp->session_base_key, NULL);
+
+       freerdp_blob_free(&ntlm_v2_temp);
+       freerdp_blob_free(&ntlm_v2_temp_chal);
+}
+
+/**
+ * Input NegotiateFlags, a 4-byte bit map.
+ * @param s
+ * @param flags
+ */
+
+void ntlmssp_input_negotiate_flags(STREAM* s, uint32* flags)
+{
+       *flags = 0;
+       stream_read_uint32(s, *flags);
+}
+
+/**
+ * Output NegotiateFlags, a 4-byte bit map.
+ * @param s
+ * @param flags
+ */
+
+void ntlmssp_output_negotiate_flags(STREAM* s, uint32 flags)
+{
+       stream_write_uint32(s, flags);
+}
+
+void ntlmssp_print_negotiate_flags(uint32 flags)
+{
+       int i;
+       const char* str;
+
+       printf("negotiateFlags \"0x%08X\"{\n", flags);
+
+       for (i = 31; i >= 0; i--)
+       {
+               if ((flags >> i) & 1)
+               {
+                       str = NTLMSSP_NEGOTIATE_STRINGS[(31 - i)];
+                       printf("\t%s (%d),\n", str, (31 - i));
+               }
+       }
+
+       printf("}\n");
+}
+
+/**
+ * Output Restriction_Encoding.\n
+ * Restriction_Encoding @msdn{cc236647}
+ * @param ntlmssp
+ */
+
+static void ntlmssp_output_restriction_encoding(NTLMSSP* ntlmssp)
+{
+       AV_PAIR *restrictions = &ntlmssp->av_pairs->Restrictions;
+       STREAM* s = stream_new(0);
+
+       uint8 machineID[32] =
+               "\x3A\x15\x8E\xA6\x75\x82\xD8\xF7\x3E\x06\xFA\x7A\xB4\xDF\xFD\x43"
+               "\x84\x6C\x02\x3A\xFD\x5A\x94\xFE\xCF\x97\x0F\x3D\x19\x2C\x38\x20";
+
+       restrictions->value = xmalloc(48);
+       restrictions->length = 48;
+
+       s->data = restrictions->value;
+       s->size = restrictions->length;
+       s->p = s->data;
+
+       stream_write_uint32(s, 48); /* Size */
+       stream_write_zero(s, 4); /* Z4 (set to zero) */
+
+       /* IntegrityLevel (bit 31 set to 1) */
+       stream_write_uint8(s, 1);
+       stream_write_zero(s, 3);
+
+       stream_write_uint32(s, 0x00002000); /* SubjectIntegrityLevel */
+       stream_write(s, machineID, 32); /* MachineID */
+
+       xfree(s);
+}
+
+/**
+ * Output TargetName.\n
+ * @param ntlmssp
+ */
+
+void ntlmssp_output_target_name(NTLMSSP* ntlmssp)
+{
+       STREAM* s = stream_new(0);
+       AV_PAIR* target_name = &ntlmssp->av_pairs->TargetName;
+
+       /*
+        * TODO: No idea what should be set here (observed MsvAvTargetName = MsvAvDnsComputerName or
+        * MsvAvTargetName should be the name of the service be accessed after authentication)
+        * here used: "TERMSRV/192.168.0.123" in unicode (Dmitrij Jasnov)
+        */
+       uint8 name[42] =
+                       "\x54\x00\x45\x00\x52\x00\x4d\x00\x53\x00\x52\x00\x56\x00\x2f\x00\x31\x00\x39\x00\x32"
+                       "\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x30\x00\x2e\x00\x31\x00\x32\x00\x33\x00";
+
+       target_name->length = 42;
+       target_name->value = (uint8*) xmalloc(target_name->length);
+
+       s->data = target_name->value;
+       s->size = target_name->length;
+       s->p = s->data;
+
+       stream_write(s, name, target_name->length);
+
+       xfree(s);
+}
+
+/**
+ * Output ChannelBindings.\n
+ * @param ntlmssp
+ */
+
+void ntlmssp_output_channel_bindings(NTLMSSP* ntlmssp)
+{
+       STREAM* s = stream_new(0);
+       AV_PAIR* channel_bindings = &ntlmssp->av_pairs->ChannelBindings;
+
+       channel_bindings->value = (uint8*) xmalloc(48);
+       channel_bindings->length = 16;
+
+       s->data = channel_bindings->value;
+       s->size = channel_bindings->length;
+       s->p = s->data;
+
+       stream_write_zero(s, 16); /* an all-zero value of the hash is used to indicate absence of channel bindings */
+
+       xfree(s);
+}
+
+/**
+ * Populate array of AV_PAIRs.\n
+ * AV_PAIR @msdn{cc236646}
+ * @param ntlmssp
+ */
+
+void ntlmssp_populate_av_pairs(NTLMSSP* ntlmssp)
+{
+       STREAM* s;
+       rdpBlob target_info;
+       AV_PAIRS *av_pairs = ntlmssp->av_pairs;
+
+       /* MsvAvFlags */
+       av_pairs->Flags = 0x00000002; /* Indicates the present of a Message Integrity Check (MIC) */
+
+       /* Restriction_Encoding */
+       ntlmssp_output_restriction_encoding(ntlmssp);
+
+       /* TargetName */
+       ntlmssp_output_target_name(ntlmssp);
+
+       /* ChannelBindings */
+       ntlmssp_output_channel_bindings(ntlmssp);
+
+       s = stream_new(0);
+       s->data = xmalloc(ntlmssp->target_info.length + 512);
+       s->p = s->data;
+
+       ntlmssp_output_av_pairs(ntlmssp, s);
+       freerdp_blob_alloc(&target_info, s->p - s->data);
+       memcpy(target_info.data, s->data, target_info.length);
+
+       ntlmssp->target_info.data = target_info.data;
+       ntlmssp->target_info.length = target_info.length;
+}
+
+/**
+ * Input array of AV_PAIRs.\n
+ * AV_PAIR @msdn{cc236646}
+ * @param ntlmssp
+ * @param s
+ */
+
+void ntlmssp_input_av_pairs(NTLMSSP* ntlmssp, STREAM* s)
+{
+       AV_ID AvId;
+       uint16 AvLen;
+       uint8* value;
+       AV_PAIRS* av_pairs = ntlmssp->av_pairs;
+
+#ifdef WITH_DEBUG_NLA
+       printf("AV_PAIRS = {\n");
+#endif
+
+       do
+       {
+               value = NULL;
+               stream_read_uint16(s, AvId);
+               stream_read_uint16(s, AvLen);
+
+               if (AvLen > 0)
+               {
+                       if (AvId != MsvAvFlags)
+                       {
+                               value = xmalloc(AvLen);
+                               stream_read(s, value, AvLen);
+                       }
+                       else
+                       {
+                               stream_read_uint32(s, av_pairs->Flags);
+                       }
+               }
+
+               switch (AvId)
+               {
+                       case MsvAvNbComputerName:
+                               av_pairs->NbComputerName.length = AvLen;
+                               av_pairs->NbComputerName.value = value;
+                               break;
+
+                       case MsvAvNbDomainName:
+                               av_pairs->NbDomainName.length = AvLen;
+                               av_pairs->NbDomainName.value = value;
+                               break;
+
+                       case MsvAvDnsComputerName:
+                               av_pairs->DnsComputerName.length = AvLen;
+                               av_pairs->DnsComputerName.value = value;
+                               break;
+
+                       case MsvAvDnsDomainName:
+                               av_pairs->DnsDomainName.length = AvLen;
+                               av_pairs->DnsDomainName.value = value;
+                               break;
+
+                       case MsvAvDnsTreeName:
+                               av_pairs->DnsTreeName.length = AvLen;
+                               av_pairs->DnsTreeName.value = value;
+                               break;
+
+                       case MsvAvTimestamp:
+                               av_pairs->Timestamp.length = AvLen;
+                               av_pairs->Timestamp.value = value;
+                               break;
+
+                       case MsvAvRestrictions:
+                               av_pairs->Restrictions.length = AvLen;
+                               av_pairs->Restrictions.value = value;
+                               break;
+
+                       case MsvAvTargetName:
+                               av_pairs->TargetName.length = AvLen;
+                               av_pairs->TargetName.value = value;
+                               break;
+
+                       case MsvChannelBindings:
+                               av_pairs->ChannelBindings.length = AvLen;
+                               av_pairs->ChannelBindings.value = value;
+                               break;
+
+                       default:
+                               if (value != NULL)
+                                       xfree(value);
+                               break;
+               }
+
+#ifdef WITH_DEBUG_NLA
+               if (AvId < 10)
+                       printf("\tAvId: %s, AvLen: %d\n", AV_PAIRS_STRINGS[AvId], AvLen);
+               else
+                       printf("\tAvId: %s, AvLen: %d\n", "Unknown", AvLen);
+
+               freerdp_hexdump(value, AvLen);
+#endif
+       }
+       while (AvId != MsvAvEOL);
+
+#ifdef WITH_DEBUG_NLA
+       printf("}\n");
+#endif
+}
+
+/**
+ * Output array of AV_PAIRs.\n
+ * AV_PAIR @msdn{cc236646}
+ * @param ntlmssp
+ * @param s
+ */
+
+void ntlmssp_output_av_pairs(NTLMSSP* ntlmssp, STREAM* s)
+{
+       AV_PAIRS* av_pairs = ntlmssp->av_pairs;
+       
+       if (av_pairs->NbDomainName.length > 0)
+       {
+               stream_write_uint16(s, MsvAvNbDomainName); /* AvId */
+               stream_write_uint16(s, av_pairs->NbDomainName.length); /* AvLen */
+               stream_write(s, av_pairs->NbDomainName.value, av_pairs->NbDomainName.length); /* Value */
+       }
+
+       if (av_pairs->NbComputerName.length > 0)
+       {
+               stream_write_uint16(s, MsvAvNbComputerName); /* AvId */
+               stream_write_uint16(s, av_pairs->NbComputerName.length); /* AvLen */
+               stream_write(s, av_pairs->NbComputerName.value, av_pairs->NbComputerName.length); /* Value */
+       }
+
+       if (av_pairs->DnsDomainName.length > 0)
+       {
+               stream_write_uint16(s, MsvAvDnsDomainName); /* AvId */
+               stream_write_uint16(s, av_pairs->DnsDomainName.length); /* AvLen */
+               stream_write(s, av_pairs->DnsDomainName.value, av_pairs->DnsDomainName.length); /* Value */
+       }
+
+       if (av_pairs->DnsComputerName.length > 0)
+       {
+               stream_write_uint16(s, MsvAvDnsComputerName); /* AvId */
+               stream_write_uint16(s, av_pairs->DnsComputerName.length); /* AvLen */
+               stream_write(s, av_pairs->DnsComputerName.value, av_pairs->DnsComputerName.length); /* Value */
+       }
+
+       if (av_pairs->DnsTreeName.length > 0)
+       {
+               stream_write_uint16(s, MsvAvDnsTreeName); /* AvId */
+               stream_write_uint16(s, av_pairs->DnsTreeName.length); /* AvLen */
+               stream_write(s, av_pairs->DnsTreeName.value, av_pairs->DnsTreeName.length); /* Value */
+       }
+
+       if (av_pairs->Timestamp.length > 0)
+       {
+               stream_write_uint16(s, MsvAvTimestamp); /* AvId */
+               stream_write_uint16(s, av_pairs->Timestamp.length); /* AvLen */
+               stream_write(s, av_pairs->Timestamp.value, av_pairs->Timestamp.length); /* Value */
+       }
+
+       if (av_pairs->Flags > 0)
+       {
+               stream_write_uint16(s, MsvAvFlags); /* AvId */
+               stream_write_uint16(s, 4); /* AvLen */
+               stream_write_uint32(s, av_pairs->Flags); /* Value */
+       }
+
+       if (av_pairs->Restrictions.length > 0)
+       {
+               stream_write_uint16(s, MsvAvRestrictions); /* AvId */
+               stream_write_uint16(s, av_pairs->Restrictions.length); /* AvLen */
+               stream_write(s, av_pairs->Restrictions.value, av_pairs->Restrictions.length); /* Value */
+       }
+
+       if (av_pairs->ChannelBindings.length > 0)
+       {
+               stream_write_uint16(s, MsvChannelBindings); /* AvId */
+               stream_write_uint16(s, av_pairs->ChannelBindings.length); /* AvLen */
+               stream_write(s, av_pairs->ChannelBindings.value, av_pairs->ChannelBindings.length); /* Value */
+       }
+
+       if (av_pairs->TargetName.length > 0)
+       {
+               stream_write_uint16(s, MsvAvTargetName); /* AvId */
+               stream_write_uint16(s, av_pairs->TargetName.length); /* AvLen */
+               stream_write(s, av_pairs->TargetName.value, av_pairs->TargetName.length); /* Value */
+       }
+
+       /* This indicates the end of the AV_PAIR array */
+       stream_write_uint16(s, MsvAvEOL); /* AvId */
+       stream_write_uint16(s, 0); /* AvLen */
+
+       if (ntlmssp->ntlm_v2)
+       {
+               stream_write_zero(s, 8);
+       }
+}
+
+/**
+ * Print array of AV_PAIRs.\n
+ * AV_PAIR @msdn{cc236646}
+ * @param ntlmssp
+ * @param s
+ */
+
+void ntlmssp_print_av_pairs(NTLMSSP* ntlmssp)
+{
+       AV_PAIRS* av_pairs = ntlmssp->av_pairs;
+
+       printf("AV_PAIRS = {\n");
+
+       if (av_pairs->NbDomainName.length > 0)
+       {
+               printf("\tAvId: MsvAvNbDomainName AvLen: %d\n", av_pairs->NbDomainName.length);
+               freerdp_hexdump(av_pairs->NbDomainName.value, av_pairs->NbDomainName.length);
+       }
+
+       if (av_pairs->NbComputerName.length > 0)
+       {
+               printf("\tAvId: MsvAvNbComputerName AvLen: %d\n", av_pairs->NbComputerName.length);
+               freerdp_hexdump(av_pairs->NbComputerName.value, av_pairs->NbComputerName.length);
+       }
+
+       if (av_pairs->DnsDomainName.length > 0)
+       {
+               printf("\tAvId: MsvAvDnsDomainName AvLen: %d\n", av_pairs->DnsDomainName.length);
+               freerdp_hexdump(av_pairs->DnsDomainName.value, av_pairs->DnsDomainName.length);
+       }
+
+       if (av_pairs->DnsComputerName.length > 0)
+       {
+               printf("\tAvId: MsvAvDnsComputerName AvLen: %d\n", av_pairs->DnsComputerName.length);
+               freerdp_hexdump(av_pairs->DnsComputerName.value, av_pairs->DnsComputerName.length);
+       }
+
+       if (av_pairs->DnsTreeName.length > 0)
+       {
+               printf("\tAvId: MsvAvDnsTreeName AvLen: %d\n", av_pairs->DnsTreeName.length);
+               freerdp_hexdump(av_pairs->DnsTreeName.value, av_pairs->DnsTreeName.length);
+       }
+
+       if (av_pairs->Timestamp.length > 0)
+       {
+               printf("\tAvId: MsvAvTimestamp AvLen: %d\n", av_pairs->Timestamp.length);
+               freerdp_hexdump(av_pairs->Timestamp.value, av_pairs->Timestamp.length);
+       }
+
+       if (av_pairs->Flags > 0)
+       {
+               printf("\tAvId: MsvAvFlags AvLen: %d\n", 4);
+               printf("0x%08X\n", av_pairs->Flags);
+       }
+
+       if (av_pairs->Restrictions.length > 0)
+       {
+               printf("\tAvId: MsvAvRestrictions AvLen: %d\n", av_pairs->Restrictions.length);
+               freerdp_hexdump(av_pairs->Restrictions.value, av_pairs->Restrictions.length);
+       }
+
+       if (av_pairs->ChannelBindings.length > 0)
+       {
+               printf("\tAvId: MsvChannelBindings AvLen: %d\n", av_pairs->ChannelBindings.length);
+               freerdp_hexdump(av_pairs->ChannelBindings.value, av_pairs->ChannelBindings.length);
+       }
+
+       if (av_pairs->TargetName.length > 0)
+       {
+               printf("\tAvId: MsvAvTargetName AvLen: %d\n", av_pairs->TargetName.length);
+               freerdp_hexdump(av_pairs->TargetName.value, av_pairs->TargetName.length);
+       }
+
+       printf("}\n");
+}
+
+/**
+ * Free array of AV_PAIRs.\n
+ * AV_PAIR @msdn{cc236646}
+ * @param ntlmssp
+ */
+
+void ntlmssp_free_av_pairs(NTLMSSP* ntlmssp)
+{
+       AV_PAIRS *av_pairs = ntlmssp->av_pairs;
+       
+       if (av_pairs != NULL)
+       {
+               if (av_pairs->NbComputerName.value != NULL)
+                       xfree(av_pairs->NbComputerName.value);
+               if (av_pairs->NbDomainName.value != NULL)
+                       xfree(av_pairs->NbDomainName.value);
+               if (av_pairs->DnsComputerName.value != NULL)
+                       xfree(av_pairs->DnsComputerName.value);
+               if (av_pairs->DnsDomainName.value != NULL)
+                       xfree(av_pairs->DnsDomainName.value);
+               if (av_pairs->DnsTreeName.value != NULL)
+                       xfree(av_pairs->DnsTreeName.value);
+               if (av_pairs->Timestamp.value != NULL)
+                       xfree(av_pairs->Timestamp.value);
+               if (av_pairs->Restrictions.value != NULL)
+                       xfree(av_pairs->Restrictions.value);
+               if (av_pairs->TargetName.value != NULL)
+                       xfree(av_pairs->TargetName.value);
+               if (av_pairs->ChannelBindings.value != NULL)
+                       xfree(av_pairs->ChannelBindings.value);
+
+               xfree(av_pairs);
+       }
+
+       ntlmssp->av_pairs = NULL;
+}
+
+/**
+ * Output VERSION structure.\n
+ * VERSION @msdn{cc236654}
+ * @param s
+ */
+
+static void ntlmssp_output_version(STREAM* s)
+{
+       /* The following version information was observed with Windows 7 */
+
+       stream_write_uint8(s, WINDOWS_MAJOR_VERSION_6); /* ProductMajorVersion (1 byte) */
+       stream_write_uint8(s, WINDOWS_MINOR_VERSION_1); /* ProductMinorVersion (1 byte) */
+       stream_write_uint16(s, 7600); /* ProductBuild (2 bytes) */
+       stream_write_zero(s, 3); /* Reserved (3 bytes) */
+       stream_write_uint8(s, NTLMSSP_REVISION_W2K3); /* NTLMRevisionCurrent (1 byte) */
+}
+
+void ntlmssp_compute_message_integrity_check(NTLMSSP* ntlmssp)
+{
+       HMAC_CTX hmac_ctx;
+
+       /* 
+        * Compute the HMAC-MD5 hash of ConcatenationOf(NEGOTIATE_MESSAGE,
+        * CHALLENGE_MESSAGE, AUTHENTICATE_MESSAGE) using the ExportedSessionKey
+        */
+
+       HMAC_CTX_init(&hmac_ctx);
+       HMAC_Init_ex(&hmac_ctx, ntlmssp->exported_session_key, 16, EVP_md5(), NULL);
+       HMAC_Update(&hmac_ctx, ntlmssp->negotiate_message.data, ntlmssp->negotiate_message.length);
+       HMAC_Update(&hmac_ctx, ntlmssp->challenge_message.data, ntlmssp->challenge_message.length);
+       HMAC_Update(&hmac_ctx, ntlmssp->authenticate_message.data, ntlmssp->authenticate_message.length);
+       HMAC_Final(&hmac_ctx, ntlmssp->message_integrity_check, NULL);
+}
+
+/**
+ * Encrypt and sign message using NTLMSSP.\n
+ * GSS_WrapEx() @msdn{cc236718}\n
+ * EncryptMessage() @msdn{aa375378}
+ * @param ntlmssp
+ * @param[in] msg message to encrypt
+ * @param[out] encrypted_msg encrypted message
+ * @param[out] signature destination signature
+ */
+
+void ntlmssp_encrypt_message(NTLMSSP* ntlmssp, rdpBlob* msg, rdpBlob* encrypted_msg, uint8* signature)
+{
+       HMAC_CTX hmac_ctx;
+       uint8 digest[16];
+       uint8 checksum[8];
+       uint32 version = 1;
+
+       /* Compute the HMAC-MD5 hash of ConcatenationOf(seq_num,msg) using the client signing key */
+       HMAC_CTX_init(&hmac_ctx);
+       HMAC_Init_ex(&hmac_ctx, ntlmssp->client_signing_key, 16, EVP_md5(), NULL);
+       HMAC_Update(&hmac_ctx, (void*) &ntlmssp->send_seq_num, 4);
+       HMAC_Update(&hmac_ctx, msg->data, msg->length);
+       HMAC_Final(&hmac_ctx, digest, NULL);
+
+       /* Allocate space for encrypted message */
+       freerdp_blob_alloc(encrypted_msg, msg->length);
+
+       /* Encrypt message using with RC4 */
+       crypto_rc4(ntlmssp->send_rc4_seal, msg->length, msg->data, encrypted_msg->data);
+
+       /* RC4-encrypt first 8 bytes of digest */
+       crypto_rc4(ntlmssp->send_rc4_seal, 8, digest, checksum);
+
+       /* Concatenate version, ciphertext and sequence number to build signature */
+       memcpy(signature, (void*) &version, 4);
+       memcpy(&signature[4], (void*) checksum, 8);
+       memcpy(&signature[12], (void*) &(ntlmssp->send_seq_num), 4);
+
+       HMAC_CTX_cleanup(&hmac_ctx);
+
+       ntlmssp->send_seq_num++;
+}
+
+/**
+ * Decrypt message and verify signature using NTLMSSP.\n
+ * GSS_UnwrapEx() @msdn{cc236703}\n
+ * DecryptMessage() @msdn{aa375211}
+ * @param ntlmssp
+ * @param[in] encrypted_msg encrypted message
+ * @param[out] msg decrypted message
+ * @param[in] signature signature
+ * @return
+ */
+
+int ntlmssp_decrypt_message(NTLMSSP* ntlmssp, rdpBlob* encrypted_msg, rdpBlob* msg, uint8* signature)
+{
+       HMAC_CTX hmac_ctx;
+       uint8 digest[16];
+       uint8 checksum[8];
+       uint32 version = 1;
+       uint8 expected_signature[16];
+
+       /* Allocate space for encrypted message */
+       freerdp_blob_alloc(msg, encrypted_msg->length);
+
+       /* Encrypt message using with RC4 */
+       crypto_rc4(ntlmssp->recv_rc4_seal, encrypted_msg->length, encrypted_msg->data, msg->data);
+
+       /* Compute the HMAC-MD5 hash of ConcatenationOf(seq_num,msg) using the client signing key */
+       HMAC_CTX_init(&hmac_ctx);
+       HMAC_Init_ex(&hmac_ctx, ntlmssp->server_signing_key, 16, EVP_md5(), NULL);
+       HMAC_Update(&hmac_ctx, (void*) &ntlmssp->recv_seq_num, 4);
+       HMAC_Update(&hmac_ctx, msg->data, msg->length);
+       HMAC_Final(&hmac_ctx, digest, NULL);
+
+       /* RC4-encrypt first 8 bytes of digest */
+       crypto_rc4(ntlmssp->recv_rc4_seal, 8, digest, checksum);
+
+       /* Concatenate version, ciphertext and sequence number to build signature */
+       memcpy(expected_signature, (void*) &version, 4);
+       memcpy(&expected_signature[4], (void*) checksum, 8);
+       memcpy(&expected_signature[12], (void*) &(ntlmssp->recv_seq_num), 4);
+
+       if (memcmp(signature, expected_signature, 16) != 0)
+       {
+               /* signature verification failed! */
+               printf("signature verification failed, something nasty is going on!\n");
+               return 0;
+       }
+
+       HMAC_CTX_cleanup(&hmac_ctx);
+
+       ntlmssp->recv_seq_num++;
+       return 1;
+}
+
+/**
+ * Send NTLMSSP NEGOTIATE_MESSAGE.\n
+ * NEGOTIATE_MESSAGE @msdn{cc236641}
+ * @param ntlmssp
+ * @param s
+ */
+
+void ntlmssp_send_negotiate_message(NTLMSSP* ntlmssp, STREAM* s)
+{
+       int length;
+       uint32 negotiateFlags = 0;
+
+       stream_write(s, ntlm_signature, 8); /* Signature (8 bytes) */
+       stream_write_uint32(s, 1); /* MessageType */
+
+       if (ntlmssp->ntlm_v2)
+       {
+               DEBUG_NLA("Negotiating NTLMv2");
+               /* observed: B7 82 08 E2 (0xE20882B7) (Dmitrij Jasnov) */
+               negotiateFlags |= NTLMSSP_NEGOTIATE_56;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_KEY_EXCH;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_128;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_VERSION;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_NTLM;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_LM_KEY;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SEAL;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SIGN;
+               negotiateFlags |= NTLMSSP_REQUEST_TARGET;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_OEM;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_UNICODE;
+       }
+       else
+       {
+               negotiateFlags |= NTLMSSP_NEGOTIATE_KEY_EXCH;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_128;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_NTLM;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SEAL;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SIGN;
+               negotiateFlags |= NTLMSSP_REQUEST_TARGET;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_UNICODE;
+       }
+
+       ntlmssp_output_negotiate_flags(s, negotiateFlags); /* NegotiateFlags (4 bytes) */
+
+#ifdef WITH_DEBUG_NLA
+       ntlmssp_print_negotiate_flags(negotiateFlags);
+#endif
+
+       /* only set if NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED is set */
+
+       /* DomainNameFields (8 bytes) */
+       stream_write_uint16(s, 0); /* DomainNameLen */
+       stream_write_uint16(s, 0); /* DomainNameMaxLen */
+       stream_write_uint32(s, 0); /* DomainNameBufferOffset */
+
+       /* only set if NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED is set */
+
+       /* WorkstationFields (8 bytes) */
+       stream_write_uint16(s, 0); /* WorkstationLen */
+       stream_write_uint16(s, 0); /* WorkstationMaxLen */
+       stream_write_uint32(s, 0); /* WorkstationBufferOffset */
+
+       if (negotiateFlags & NTLMSSP_NEGOTIATE_VERSION)
+       {
+               /* Only present if NTLMSSP_NEGOTIATE_VERSION is set */
+               ntlmssp_output_version(s);
+
+#ifdef WITH_DEBUG_NLA
+               printf("Version (length = 8)\n");
+               freerdp_hexdump((s->p - 8), 8);
+               printf("\n");
+#endif
+       }
+
+       length = s->p - s->data;
+       freerdp_blob_alloc(&ntlmssp->negotiate_message, length);
+       memcpy(ntlmssp->negotiate_message.data, s->data, length);
+
+#ifdef WITH_DEBUG_NLA
+       printf("NEGOTIATE_MESSAGE (length = %d)\n", length);
+       freerdp_hexdump(s->data, length);
+       printf("\n");
+#endif
+
+       ntlmssp->state = NTLMSSP_STATE_CHALLENGE;
+}
+
+/**
+ * Receive NTLMSSP CHALLENGE_MESSAGE.\n
+ * CHALLENGE_MESSAGE @msdn{cc236642}
+ * @param ntlmssp
+ * @param s
+ */
+
+void ntlmssp_recv_challenge_message(NTLMSSP* ntlmssp, STREAM* s)
+{
+       uint8* p;
+       int length;
+       uint8* start_offset;
+       uint8* payload_offset;
+       uint16 targetNameLen;
+       uint16 targetNameMaxLen;
+       uint32 targetNameBufferOffset;
+       uint16 targetInfoLen;
+       uint16 targetInfoMaxLen;
+       uint32 targetInfoBufferOffset;
+
+       start_offset = s->p - 12;
+
+       /* TargetNameFields (8 bytes) */
+       stream_read_uint16(s, targetNameLen); /* TargetNameLen (2 bytes) */
+       stream_read_uint16(s, targetNameMaxLen); /* TargetNameMaxLen (2 bytes) */
+       stream_read_uint32(s, targetNameBufferOffset); /* TargetNameBufferOffset (4 bytes) */
+
+       ntlmssp_input_negotiate_flags(s, &(ntlmssp->negotiate_flags)); /* NegotiateFlags (4 bytes) */
+
+#ifdef WITH_DEBUG_NLA
+       ntlmssp_print_negotiate_flags(ntlmssp->negotiate_flags);
+#endif
+
+       stream_read(s, ntlmssp->server_challenge, 8); /* ServerChallenge (8 bytes) */
+       stream_seek(s, 8); /* Reserved (8 bytes), should be ignored */
+
+       /* TargetInfoFields (8 bytes) */
+       stream_read_uint16(s, targetInfoLen); /* TargetInfoLen (2 bytes) */
+       stream_read_uint16(s, targetInfoMaxLen); /* TargetInfoMaxLen (2 bytes) */
+       stream_read_uint32(s, targetInfoBufferOffset); /* TargetInfoBufferOffset (4 bytes) */
+
+       /* only present if NTLMSSP_NEGOTIATE_VERSION is set */
+
+       if (ntlmssp->negotiate_flags & NTLMSSP_NEGOTIATE_VERSION)
+       {
+               stream_seek(s, 8); /* Version (8 bytes), can be ignored */
+       }
+
+       /* Payload (variable) */
+       payload_offset = s->p;
+
+       if (targetNameLen > 0)
+       {
+               p = start_offset + targetNameBufferOffset;
+               freerdp_blob_alloc(&ntlmssp->target_name, targetNameLen);
+               memcpy(ntlmssp->target_name.data, p, targetNameLen);
+
+#ifdef WITH_DEBUG_NLA
+               printf("targetName (length = %d, offset = %d)\n", targetNameLen, targetNameBufferOffset);
+               freerdp_hexdump(ntlmssp->target_name.data, ntlmssp->target_name.length);
+               printf("\n");
+#endif
+       }
+
+       if (targetInfoLen > 0)
+       {
+               p = start_offset + targetInfoBufferOffset;
+               freerdp_blob_alloc(&ntlmssp->target_info, targetInfoLen);
+               memcpy(ntlmssp->target_info.data, p, targetInfoLen);
+
+#ifdef WITH_DEBUG_NLA
+               printf("targetInfo (length = %d, offset = %d)\n", targetInfoLen, targetInfoBufferOffset);
+               freerdp_hexdump(ntlmssp->target_info.data, ntlmssp->target_info.length);
+               printf("\n");
+#endif
+
+               if (ntlmssp->ntlm_v2)
+               {
+                       s->p = p;
+                       ntlmssp_input_av_pairs(ntlmssp, s);
+               }
+       }
+
+       length = (payload_offset - start_offset) + targetNameLen + targetInfoLen;
+
+       freerdp_blob_alloc(&ntlmssp->challenge_message, length);
+       memcpy(ntlmssp->challenge_message.data, start_offset, length);
+
+#ifdef WITH_DEBUG_NLA
+       printf("CHALLENGE_MESSAGE (length = %d)\n", length);
+       freerdp_hexdump(start_offset, length);
+       printf("\n");
+#endif
+
+       /* AV_PAIRs */
+       if (ntlmssp->ntlm_v2)
+               ntlmssp_populate_av_pairs(ntlmssp);
+
+       /* Timestamp */
+       ntlmssp_generate_timestamp(ntlmssp);
+
+       /* LmChallengeResponse */
+       ntlmssp_compute_lm_v2_response(ntlmssp);
+
+       if (ntlmssp->ntlm_v2)
+               memset(ntlmssp->lm_challenge_response.data, '\0', 24);
+
+       /* NtChallengeResponse */
+       ntlmssp_compute_ntlm_v2_response(ntlmssp);
+
+       /* KeyExchangeKey */
+       ntlmssp_generate_key_exchange_key(ntlmssp);
+
+       /* EncryptedRandomSessionKey */
+       ntlmssp_encrypt_random_session_key(ntlmssp);
+
+       /* Generate signing keys */
+       ntlmssp_generate_client_signing_key(ntlmssp);
+       ntlmssp_generate_server_signing_key(ntlmssp);
+
+       /* Generate sealing keys */
+       ntlmssp_generate_client_sealing_key(ntlmssp);
+       ntlmssp_generate_server_sealing_key(ntlmssp);
+
+       /* Initialize RC4 seal state using client sealing key */
+       ntlmssp_init_rc4_seal_states(ntlmssp);
+
+#ifdef WITH_DEBUG_NLA
+       printf("ClientChallenge\n");
+       freerdp_hexdump(ntlmssp->client_challenge, 8);
+       printf("\n");
+
+       printf("ServerChallenge\n");
+       freerdp_hexdump(ntlmssp->server_challenge, 8);
+       printf("\n");
+
+       printf("SessionBaseKey\n");
+       freerdp_hexdump(ntlmssp->session_base_key, 16);
+       printf("\n");
+
+       printf("KeyExchangeKey\n");
+       freerdp_hexdump(ntlmssp->key_exchange_key, 16);
+       printf("\n");
+
+       printf("ExportedSessionKey\n");
+       freerdp_hexdump(ntlmssp->exported_session_key, 16);
+       printf("\n");
+
+       printf("RandomSessionKey\n");
+       freerdp_hexdump(ntlmssp->random_session_key, 16);
+       printf("\n");
+
+       printf("ClientSignKey\n");
+       freerdp_hexdump(ntlmssp->client_signing_key, 16);
+       printf("\n");
+
+       printf("ClientSealingKey\n");
+       freerdp_hexdump(ntlmssp->client_sealing_key, 16);
+       printf("\n");
+
+       printf("Timestamp\n");
+       freerdp_hexdump(ntlmssp->timestamp, 8);
+       printf("\n");
+#endif
+
+       ntlmssp->state = NTLMSSP_STATE_AUTHENTICATE;
+}
+
+/**
+ * Send NTLMSSP AUTHENTICATE_MESSAGE.\n
+ * AUTHENTICATE_MESSAGE @msdn{cc236643}
+ * @param ntlmssp
+ * @param s
+ */
+
+void ntlmssp_send_authenticate_message(NTLMSSP* ntlmssp, STREAM* s)
+{
+       int length;
+       uint32 negotiateFlags = 0;
+       uint8* mic_offset = NULL;
+
+       uint16 DomainNameLen;
+       uint16 UserNameLen;
+       uint16 WorkstationLen;
+       uint16 LmChallengeResponseLen;
+       uint16 NtChallengeResponseLen;
+       uint16 EncryptedRandomSessionKeyLen;
+
+       uint32 PayloadBufferOffset;
+       uint32 DomainNameBufferOffset;
+       uint32 UserNameBufferOffset;
+       uint32 WorkstationBufferOffset;
+       uint32 LmChallengeResponseBufferOffset;
+       uint32 NtChallengeResponseBufferOffset;
+       uint32 EncryptedRandomSessionKeyBufferOffset;
+
+       uint8* UserNameBuffer;
+       uint8* DomainNameBuffer;
+       uint8* WorkstationBuffer;
+       uint8* EncryptedRandomSessionKeyBuffer;
+
+       WorkstationLen = ntlmssp->workstation.length;
+       WorkstationBuffer = ntlmssp->workstation.data;
+
+       if (ntlmssp->ntlm_v2 < 1)
+               WorkstationLen = 0;
+
+       DomainNameLen = ntlmssp->domain.length;
+       DomainNameBuffer = ntlmssp->domain.data;
+
+       UserNameLen = ntlmssp->username.length;
+       UserNameBuffer = ntlmssp->username.data;
+
+       LmChallengeResponseLen = ntlmssp->lm_challenge_response.length;
+       NtChallengeResponseLen = ntlmssp->nt_challenge_response.length;
+
+       EncryptedRandomSessionKeyLen = 16;
+       EncryptedRandomSessionKeyBuffer = ntlmssp->encrypted_random_session_key;
+
+       if (ntlmssp->ntlm_v2)
+       {
+               /* observed: 35 82 88 e2 (0xE2888235) */
+               negotiateFlags |= NTLMSSP_NEGOTIATE_56;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_KEY_EXCH;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_128;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_VERSION;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_TARGET_INFO;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_NTLM;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SEAL;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SIGN;
+               negotiateFlags |= NTLMSSP_REQUEST_TARGET;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_UNICODE;
+       }
+       else
+       {
+               negotiateFlags |= NTLMSSP_NEGOTIATE_KEY_EXCH;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_128;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_NTLM;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SEAL;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_SIGN;
+               negotiateFlags |= NTLMSSP_REQUEST_TARGET;
+               negotiateFlags |= NTLMSSP_NEGOTIATE_UNICODE;
+       }
+
+       if (ntlmssp->ntlm_v2)
+               PayloadBufferOffset = 80; /* starting buffer offset */
+       else
+               PayloadBufferOffset = 64; /* starting buffer offset */
+
+       if (negotiateFlags & NTLMSSP_NEGOTIATE_VERSION)
+               PayloadBufferOffset += 8;
+
+       DomainNameBufferOffset = PayloadBufferOffset;
+       UserNameBufferOffset = DomainNameBufferOffset + DomainNameLen;
+       WorkstationBufferOffset = UserNameBufferOffset + UserNameLen;
+       LmChallengeResponseBufferOffset = WorkstationBufferOffset + WorkstationLen;
+       NtChallengeResponseBufferOffset = LmChallengeResponseBufferOffset + LmChallengeResponseLen;
+       EncryptedRandomSessionKeyBufferOffset = NtChallengeResponseBufferOffset + NtChallengeResponseLen;
+
+       stream_write(s, ntlm_signature, 8); /* Signature (8 bytes) */
+       stream_write_uint32(s, 3); /* MessageType */
+
+       /* LmChallengeResponseFields (8 bytes) */
+       stream_write_uint16(s, LmChallengeResponseLen); /* LmChallengeResponseLen */
+       stream_write_uint16(s, LmChallengeResponseLen); /* LmChallengeResponseMaxLen */
+       stream_write_uint32(s, LmChallengeResponseBufferOffset); /* LmChallengeResponseBufferOffset */
+
+       /* NtChallengeResponseFields (8 bytes) */
+       stream_write_uint16(s, NtChallengeResponseLen); /* NtChallengeResponseLen */
+       stream_write_uint16(s, NtChallengeResponseLen); /* NtChallengeResponseMaxLen */
+       stream_write_uint32(s, NtChallengeResponseBufferOffset); /* NtChallengeResponseBufferOffset */
+
+       /* only set if NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED is set */
+
+       /* DomainNameFields (8 bytes) */
+       stream_write_uint16(s, DomainNameLen); /* DomainNameLen */
+       stream_write_uint16(s, DomainNameLen); /* DomainNameMaxLen */
+       stream_write_uint32(s, DomainNameBufferOffset); /* DomainNameBufferOffset */
+
+       /* UserNameFields (8 bytes) */
+       stream_write_uint16(s, UserNameLen); /* UserNameLen */
+       stream_write_uint16(s, UserNameLen); /* UserNameMaxLen */
+       stream_write_uint32(s, UserNameBufferOffset); /* UserNameBufferOffset */
+
+       /* only set if NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED is set */
+
+       /* WorkstationFields (8 bytes) */
+       stream_write_uint16(s, WorkstationLen); /* WorkstationLen */
+       stream_write_uint16(s, WorkstationLen); /* WorkstationMaxLen */
+       stream_write_uint32(s, WorkstationBufferOffset); /* WorkstationBufferOffset */
+
+       /* EncryptedRandomSessionKeyFields (8 bytes) */
+       stream_write_uint16(s, EncryptedRandomSessionKeyLen); /* EncryptedRandomSessionKeyLen */
+       stream_write_uint16(s, EncryptedRandomSessionKeyLen); /* EncryptedRandomSessionKeyMaxLen */
+       stream_write_uint32(s, EncryptedRandomSessionKeyBufferOffset); /* EncryptedRandomSessionKeyBufferOffset */
+
+       ntlmssp_output_negotiate_flags(s, negotiateFlags); /* NegotiateFlags (4 bytes) */
+
+#ifdef WITH_DEBUG_NLA
+       ntlmssp_print_negotiate_flags(negotiateFlags);
+#endif
+       
+       if (negotiateFlags & NTLMSSP_NEGOTIATE_VERSION)
+       {
+               /* Only present if NTLMSSP_NEGOTIATE_VERSION is set */
+               ntlmssp_output_version(s);
+
+#ifdef WITH_DEBUG_NLA
+               printf("Version (length = 8)\n");
+               freerdp_hexdump((s->p - 8), 8);
+               printf("\n");
+#endif
+       }
+
+       if (ntlmssp->ntlm_v2)
+       {
+               /* Message Integrity Check */
+               mic_offset = s->p;
+               stream_write_zero(s, 16);
+       }
+
+       /* DomainName */
+       if (DomainNameLen > 0)
+       {
+               stream_write(s, DomainNameBuffer, DomainNameLen);
+#ifdef WITH_DEBUG_NLA
+               printf("DomainName (length = %d, offset = %d)\n", DomainNameLen, DomainNameBufferOffset);
+               freerdp_hexdump(DomainNameBuffer, DomainNameLen);
+               printf("\n");
+#endif
+       }
+
+       /* UserName */
+       stream_write(s, UserNameBuffer, UserNameLen);
+
+#ifdef WITH_DEBUG_NLA
+       printf("UserName (length = %d, offset = %d)\n", UserNameLen, UserNameBufferOffset);
+       freerdp_hexdump(UserNameBuffer, UserNameLen);
+       printf("\n");
+#endif
+
+       /* Workstation */
+       if (WorkstationLen > 0)
+       {
+               stream_write(s, WorkstationBuffer, WorkstationLen);
+#ifdef WITH_DEBUG_NLA
+               printf("Workstation (length = %d, offset = %d)\n", WorkstationLen, WorkstationBufferOffset);
+               freerdp_hexdump(WorkstationBuffer, WorkstationLen);
+               printf("\n");
+#endif
+       }
+
+       /* LmChallengeResponse */
+       stream_write(s, ntlmssp->lm_challenge_response.data, LmChallengeResponseLen);
+
+#ifdef WITH_DEBUG_NLA
+       printf("LmChallengeResponse (length = %d, offset = %d)\n", LmChallengeResponseLen, LmChallengeResponseBufferOffset);
+       freerdp_hexdump(ntlmssp->lm_challenge_response.data, LmChallengeResponseLen);
+       printf("\n");
+#endif
+
+       /* NtChallengeResponse */
+       stream_write(s, ntlmssp->nt_challenge_response.data, NtChallengeResponseLen);
+
+#ifdef WITH_DEBUG_NLA
+       if (ntlmssp->ntlm_v2)
+       {
+               ntlmssp_print_av_pairs(ntlmssp);
+
+               printf("targetInfo (length = %d)\n", ntlmssp->target_info.length);
+               freerdp_hexdump(ntlmssp->target_info.data, ntlmssp->target_info.length);
+               printf("\n");
+       }
+#endif
+
+#ifdef WITH_DEBUG_NLA
+       printf("NtChallengeResponse (length = %d, offset = %d)\n", NtChallengeResponseLen, NtChallengeResponseBufferOffset);
+       freerdp_hexdump(ntlmssp->nt_challenge_response.data, NtChallengeResponseLen);
+       printf("\n");
+#endif
+
+       /* EncryptedRandomSessionKey */
+       stream_write(s, EncryptedRandomSessionKeyBuffer, EncryptedRandomSessionKeyLen);
+
+#ifdef WITH_DEBUG_NLA
+       printf("EncryptedRandomSessionKey (length = %d, offset = %d)\n", EncryptedRandomSessionKeyLen, EncryptedRandomSessionKeyBufferOffset);
+       freerdp_hexdump(EncryptedRandomSessionKeyBuffer, EncryptedRandomSessionKeyLen);
+       printf("\n");
+#endif
+
+       length = s->p - s->data;
+       freerdp_blob_alloc(&ntlmssp->authenticate_message, length);
+       memcpy(ntlmssp->authenticate_message.data, s->data, length);
+
+       if (ntlmssp->ntlm_v2)
+       {
+               /* Message Integrity Check */
+               ntlmssp_compute_message_integrity_check(ntlmssp);
+               
+               s->p = mic_offset;
+               stream_write(s, ntlmssp->message_integrity_check, 16);
+               s->p = s->data + length;
+
+#ifdef WITH_DEBUG_NLA
+               printf("MessageIntegrityCheck (length = 16)\n");
+               freerdp_hexdump(mic_offset, 16);
+               printf("\n");
+#endif
+       }
+
+#ifdef WITH_DEBUG_NLA
+       printf("AUTHENTICATE_MESSAGE (length = %d)\n", length);
+       freerdp_hexdump(s->data, length);
+       printf("\n");
+#endif
+
+       ntlmssp->state = NTLMSSP_STATE_FINAL;
+}
+
+/**
+ * Send NTLMSSP message.
+ * @param ntlmssp
+ * @param s
+ * @return
+ */
+
+int ntlmssp_send(NTLMSSP* ntlmssp, STREAM* s)
+{
+       if (ntlmssp->state == NTLMSSP_STATE_INITIAL)
+               ntlmssp->state = NTLMSSP_STATE_NEGOTIATE;
+
+       if (ntlmssp->state == NTLMSSP_STATE_NEGOTIATE)
+               ntlmssp_send_negotiate_message(ntlmssp, s);
+       else if (ntlmssp->state == NTLMSSP_STATE_AUTHENTICATE)
+               ntlmssp_send_authenticate_message(ntlmssp, s);
+
+       return (ntlmssp->state == NTLMSSP_STATE_FINAL) ? 0 : 1;
+}
+
+/**
+ * Receive NTLMSSP message.
+ * @param ntlmssp
+ * @param s
+ * @return
+ */
+
+int ntlmssp_recv(NTLMSSP* ntlmssp, STREAM* s)
+{
+       char signature[8]; /* Signature, "NTLMSSP" */
+       uint32 messageType; /* MessageType */
+
+       stream_read(s, signature, 8);
+       stream_read_uint32(s, messageType);
+
+       if (messageType == 2 && ntlmssp->state == NTLMSSP_STATE_CHALLENGE)
+               ntlmssp_recv_challenge_message(ntlmssp, s);
+
+       return 1;
+}
+
+/**
+ * Create new NTLMSSP state machine instance.
+ * @return
+ */
+
+NTLMSSP* ntlmssp_new()
+{
+       NTLMSSP* ntlmssp = (NTLMSSP*) xmalloc(sizeof(NTLMSSP));
+
+       if (ntlmssp != NULL)
+       {
+               memset(ntlmssp, '\0', sizeof(NTLMSSP));
+               ntlmssp->av_pairs = (AV_PAIRS*) xmalloc(sizeof(AV_PAIRS));
+               memset(ntlmssp->av_pairs, 0, sizeof(AV_PAIRS));
+               ntlmssp_init(ntlmssp);
+       }
+
+       return ntlmssp;
+}
+
+/**
+ * Initialize NTLMSSP state machine.
+ * @param ntlmssp
+ */
+
+void ntlmssp_init(NTLMSSP* ntlmssp)
+{
+       ntlmssp->state = NTLMSSP_STATE_INITIAL;
+       ntlmssp->uniconv = freerdp_uniconv_new();
+}
+
+/**
+ * Finalize NTLMSSP state machine.
+ * @param ntlmssp
+ */
+
+void ntlmssp_uninit(NTLMSSP* ntlmssp)
+{
+       freerdp_blob_free(&ntlmssp->username);
+       freerdp_blob_free(&ntlmssp->password);
+       freerdp_blob_free(&ntlmssp->domain);
+
+       freerdp_blob_free(&ntlmssp->spn);
+       freerdp_blob_free(&ntlmssp->workstation);
+       freerdp_blob_free(&ntlmssp->target_info);
+       freerdp_blob_free(&ntlmssp->target_name);
+
+       freerdp_blob_free(&ntlmssp->negotiate_message);
+       freerdp_blob_free(&ntlmssp->challenge_message);
+       freerdp_blob_free(&ntlmssp->authenticate_message);
+
+       freerdp_blob_free(&ntlmssp->lm_challenge_response);
+       freerdp_blob_free(&ntlmssp->nt_challenge_response);
+
+       ntlmssp_free_av_pairs(ntlmssp);
+       freerdp_uniconv_free(ntlmssp->uniconv);
+
+       ntlmssp->state = NTLMSSP_STATE_FINAL;
+}
+
+/**
+ * Free NTLMSSP state machine.
+ * @param ntlmssp
+ */
+
+void ntlmssp_free(NTLMSSP* ntlmssp)
+{
+       ntlmssp_uninit(ntlmssp);
+
+       if (ntlmssp->send_rc4_seal)
+               crypto_rc4_free(ntlmssp->send_rc4_seal);
+       if (ntlmssp->recv_rc4_seal)
+               crypto_rc4_free(ntlmssp->recv_rc4_seal);
+       xfree(ntlmssp);
+}
diff --git a/libfreerdp-core/ntlmssp.h b/libfreerdp-core/ntlmssp.h
new file mode 100644 (file)
index 0000000..a9dce67
--- /dev/null
@@ -0,0 +1,166 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * NT LAN Manager Security Support Provider (NTLMSSP)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __NTLMSSP_H
+#define __NTLMSSP_H
+
+#include "credssp.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/unicode.h>
+
+struct _AV_PAIR
+{
+       uint16 length;
+       uint8* value;
+};
+typedef struct _AV_PAIR AV_PAIR;
+
+struct _AV_PAIRS
+{
+       AV_PAIR NbComputerName;
+       AV_PAIR NbDomainName;
+       AV_PAIR DnsComputerName;
+       AV_PAIR DnsDomainName;
+       AV_PAIR DnsTreeName;
+       AV_PAIR Timestamp;
+       AV_PAIR Restrictions;
+       AV_PAIR TargetName;
+       AV_PAIR ChannelBindings;
+       uint32 Flags;
+};
+typedef struct _AV_PAIRS AV_PAIRS;
+
+enum _AV_ID
+{
+       MsvAvEOL,
+       MsvAvNbComputerName,
+       MsvAvNbDomainName,
+       MsvAvDnsComputerName,
+       MsvAvDnsDomainName,
+       MsvAvDnsTreeName,
+       MsvAvFlags,
+       MsvAvTimestamp,
+       MsvAvRestrictions,
+       MsvAvTargetName,
+       MsvChannelBindings
+};
+typedef enum _AV_ID AV_ID;
+
+enum _NTLMSSP_STATE
+{
+       NTLMSSP_STATE_INITIAL,
+       NTLMSSP_STATE_NEGOTIATE,
+       NTLMSSP_STATE_CHALLENGE,
+       NTLMSSP_STATE_AUTHENTICATE,
+       NTLMSSP_STATE_FINAL
+};
+typedef enum _NTLMSSP_STATE NTLMSSP_STATE;
+
+struct _NTLMSSP
+{
+       NTLMSSP_STATE state;
+       rdpBlob password;
+       rdpBlob username;
+       rdpBlob domain;
+       rdpBlob workstation;
+       rdpBlob target_info;
+       rdpBlob target_name;
+       rdpBlob spn;
+       UNICONV *uniconv;
+       uint32 negotiate_flags;
+       uint8 timestamp[8];
+       uint8 server_challenge[8];
+       uint8 client_challenge[8];
+       uint8 session_base_key[16];
+       uint8 key_exchange_key[16];
+       uint8 random_session_key[16];
+       uint8 exported_session_key[16];
+       uint8 encrypted_random_session_key[16];
+       uint8 client_signing_key[16];
+       uint8 client_sealing_key[16];
+       uint8 server_signing_key[16];
+       uint8 server_sealing_key[16];
+       uint8 message_integrity_check[16];
+       rdpBlob nt_challenge_response;
+       rdpBlob lm_challenge_response;
+       rdpBlob negotiate_message;
+       rdpBlob challenge_message;
+       rdpBlob authenticate_message;
+       CryptoRc4 send_rc4_seal;
+       CryptoRc4 recv_rc4_seal;
+       AV_PAIRS *av_pairs;
+       int send_seq_num;
+       int recv_seq_num;
+       int ntlm_v2;
+};
+typedef struct _NTLMSSP NTLMSSP;
+
+void ntlmssp_set_username(NTLMSSP* ntlmssp, char* username);
+void ntlmssp_set_domain(NTLMSSP* ntlmssp, char* domain);
+void ntlmssp_set_password(NTLMSSP* ntlmssp, char* password);
+void ntlmssp_set_workstation(NTLMSSP* ntlmssp, char* workstation);
+
+void ntlmssp_generate_client_challenge(NTLMSSP* ntlmssp);
+void ntlmssp_generate_key_exchange_key(NTLMSSP* ntlmssp);
+void ntlmssp_generate_random_session_key(NTLMSSP* ntlmssp);
+void ntlmssp_generate_exported_session_key(NTLMSSP* ntlmssp);
+void ntlmssp_encrypt_random_session_key(NTLMSSP* ntlmssp);
+
+void ntlmssp_generate_timestamp(NTLMSSP* ntlmssp);
+void ntlmssp_generate_client_signing_key(NTLMSSP* ntlmssp);
+void ntlmssp_generate_server_signing_key(NTLMSSP* ntlmssp);
+void ntlmssp_generate_client_sealing_key(NTLMSSP* ntlmssp);
+void ntlmssp_generate_server_sealing_key(NTLMSSP* ntlmssp);
+void ntlmssp_init_rc4_seal_states(NTLMSSP* ntlmssp);
+
+void ntlmssp_compute_lm_hash(char* password, char* hash);
+void ntlmssp_compute_ntlm_hash(rdpBlob* password, char* hash);
+void ntlmssp_compute_ntlm_v2_hash(NTLMSSP* ntlmssp, char* hash);
+
+void ntlmssp_compute_lm_response(char* password, char* challenge, char* response);
+void ntlmssp_compute_lm_v2_response(NTLMSSP* ntlmssp);
+void ntlmssp_compute_ntlm_v2_response(NTLMSSP* ntlmssp);
+
+void ntlmssp_populate_av_pairs(NTLMSSP* ntlmssp);
+void ntlmssp_input_av_pairs(NTLMSSP* ntlmssp, STREAM* s);
+void ntlmssp_output_av_pairs(NTLMSSP* ntlmssp, STREAM* s);
+void ntlmssp_free_av_pairs(NTLMSSP* ntlmssp);
+
+void ntlmssp_compute_message_integrity_check(NTLMSSP* ntlmssp);
+
+void ntlmssp_encrypt_message(NTLMSSP* ntlmssp, rdpBlob* msg, rdpBlob* encrypted_msg, uint8* signature);
+int ntlmssp_decrypt_message(NTLMSSP* ntlmssp, rdpBlob* encrypted_msg, rdpBlob* msg, uint8* signature);
+
+int ntlmssp_recv(NTLMSSP* ntlmssp, STREAM* s);
+int ntlmssp_send(NTLMSSP* ntlmssp, STREAM* s);
+
+NTLMSSP* ntlmssp_new();
+void ntlmssp_init(NTLMSSP* ntlmssp);
+void ntlmssp_free(NTLMSSP* ntlmssp);
+
+#ifdef WITH_DEBUG_NLA
+#define DEBUG_NLA(fmt, ...) DEBUG_CLASS(NLA, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_NLA(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __NTLMSSP_H */
diff --git a/libfreerdp-core/orders.c b/libfreerdp-core/orders.c
new file mode 100644 (file)
index 0000000..c555fab
--- /dev/null
@@ -0,0 +1,2020 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Drawing Orders
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "window.h"
+#include <freerdp/api.h>
+#include <freerdp/graphics.h>
+#include <freerdp/codec/bitmap.h>
+
+#include "orders.h"
+
+#ifdef WITH_DEBUG_ORDERS
+
+static const char* const PRIMARY_DRAWING_ORDER_STRINGS[] =
+{
+       "DstBlt",
+       "PatBlt",
+       "ScrBlt",
+       "", "", "", "",
+       "DrawNineGrid",
+       "MultiDrawNineGrid",
+       "LineTo",
+       "OpaqueRect",
+       "SaveBitmap",
+       "",
+       "MemBlt",
+       "Mem3Blt",
+       "MultiDstBlt",
+       "MultiPatBlt",
+       "MultiScrBlt",
+       "MultiOpaqueRect",
+       "FastIndex",
+       "PolygonSC",
+       "PolygonCB",
+       "Polyline",
+       "",
+       "FastGlyph",
+       "EllipseSC",
+       "EllipseCB",
+       "GlyphIndex"
+};
+
+#define PRIMARY_DRAWING_ORDER_COUNT    (sizeof(PRIMARY_DRAWING_ORDER_STRINGS) / sizeof(PRIMARY_DRAWING_ORDER_STRINGS[0]))
+
+static const char* const SECONDARY_DRAWING_ORDER_STRINGS[] =
+{
+       "Cache Bitmap",
+       "Cache Color Table",
+       "Cache Bitmap (Compressed)",
+       "Cache Glyph",
+       "Cache Bitmap V2",
+       "Cache Bitmap V2 (Compressed)",
+       "",
+       "Cache Brush",
+       "Cache Bitmap V3"
+};
+
+#define SECONDARY_DRAWING_ORDER_COUNT  (sizeof(SECONDARY_DRAWING_ORDER_STRINGS) / sizeof(SECONDARY_DRAWING_ORDER_STRINGS[0]))
+
+static const char* const ALTSEC_DRAWING_ORDER_STRINGS[] =
+{
+       "Switch Surface",
+       "Create Offscreen Bitmap",
+       "Stream Bitmap First",
+       "Stream Bitmap Next",
+       "Create NineGrid Bitmap",
+       "Draw GDI+ First",
+       "Draw GDI+ Next",
+       "Draw GDI+ End",
+       "Draw GDI+ Cache First",
+       "Draw GDI+ Cache Next",
+       "Draw GDI+ Cache End",
+       "Windowing",
+       "Desktop Composition",
+       "Frame Marker"
+};
+
+#define ALTSEC_DRAWING_ORDER_COUNT     (sizeof(ALTSEC_DRAWING_ORDER_STRINGS) / sizeof(ALTSEC_DRAWING_ORDER_STRINGS[0]))
+
+#endif /* WITH_DEBUG_ORDERS */
+
+static const uint8 PRIMARY_DRAWING_ORDER_FIELD_BYTES[] =
+{
+       DSTBLT_ORDER_FIELD_BYTES,
+       PATBLT_ORDER_FIELD_BYTES,
+       SCRBLT_ORDER_FIELD_BYTES,
+       0, 0, 0, 0,
+       DRAW_NINE_GRID_ORDER_FIELD_BYTES,
+       MULTI_DRAW_NINE_GRID_ORDER_FIELD_BYTES,
+       LINE_TO_ORDER_FIELD_BYTES,
+       OPAQUE_RECT_ORDER_FIELD_BYTES,
+       SAVE_BITMAP_ORDER_FIELD_BYTES,
+       0,
+       MEMBLT_ORDER_FIELD_BYTES,
+       MEM3BLT_ORDER_FIELD_BYTES,
+       MULTI_DSTBLT_ORDER_FIELD_BYTES,
+       MULTI_PATBLT_ORDER_FIELD_BYTES,
+       MULTI_SCRBLT_ORDER_FIELD_BYTES,
+       MULTI_OPAQUE_RECT_ORDER_FIELD_BYTES,
+       FAST_INDEX_ORDER_FIELD_BYTES,
+       POLYGON_SC_ORDER_FIELD_BYTES,
+       POLYGON_CB_ORDER_FIELD_BYTES,
+       POLYLINE_ORDER_FIELD_BYTES,
+       0,
+       FAST_GLYPH_ORDER_FIELD_BYTES,
+       ELLIPSE_SC_ORDER_FIELD_BYTES,
+       ELLIPSE_CB_ORDER_FIELD_BYTES,
+       GLYPH_INDEX_ORDER_FIELD_BYTES
+};
+
+static const uint8 CBR2_BPP[] =
+{
+               0, 0, 0, 8, 16, 24, 32
+};
+
+static const uint8 CBR23_BPP[] =
+{
+               0, 0, 0, 8, 16, 24, 32
+};
+
+static const uint8 BMF_BPP[] =
+{
+               0, 1, 0, 8, 16, 24, 32
+};
+
+INLINE void update_read_coord(STREAM* s, sint32* coord, boolean delta)
+{
+       sint8 lsi8;
+       sint16 lsi16;
+
+       if (delta)
+       {
+               stream_read_uint8(s, lsi8);
+               *coord += lsi8;
+       }
+       else
+       {
+               stream_read_uint16(s, lsi16);
+               *coord = lsi16;
+       }
+}
+
+INLINE void update_read_color(STREAM* s, uint32* color)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+       *color = byte;
+       stream_read_uint8(s, byte);
+       *color |= (byte << 8);
+       stream_read_uint8(s, byte);
+       *color |= (byte << 16);
+}
+
+INLINE void update_read_colorref(STREAM* s, uint32* color)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+       *color = byte;
+       stream_read_uint8(s, byte);
+       *color |= (byte << 8);
+       stream_read_uint8(s, byte);
+       *color |= (byte << 16);
+       stream_seek_uint8(s);
+}
+
+INLINE void update_read_color_quad(STREAM* s, uint32* color)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+       *color = (byte << 16);
+       stream_read_uint8(s, byte);
+       *color |= (byte << 8);
+       stream_read_uint8(s, byte);
+       *color |= byte;
+       stream_seek_uint8(s);
+}
+
+INLINE void update_read_2byte_unsigned(STREAM* s, uint32* value)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte & 0x80)
+       {
+               *value = (byte & 0x7F) << 8;
+               stream_read_uint8(s, byte);
+               *value |= byte;
+       }
+       else
+       {
+               *value = (byte & 0x7F);
+       }
+}
+
+INLINE void update_read_2byte_signed(STREAM* s, sint32* value)
+{
+       uint8 byte;
+       boolean negative;
+
+       stream_read_uint8(s, byte);
+
+       negative = (byte & 0x40) ? true : false;
+
+       *value = (byte & 0x3F);
+
+       if (byte & 0x80)
+       {
+               stream_read_uint8(s, byte);
+               *value = (*value << 8) | byte;
+       }
+
+       if (negative)
+               *value *= -1;
+}
+
+INLINE void update_read_4byte_unsigned(STREAM* s, uint32* value)
+{
+       uint8 byte;
+       uint8 count;
+
+       stream_read_uint8(s, byte);
+
+       count = (byte & 0xC0) >> 6;
+
+       switch (count)
+       {
+               case 0:
+                       *value = (byte & 0x3F);
+                       break;
+
+               case 1:
+                       *value = (byte & 0x3F) << 8;
+                       stream_read_uint8(s, byte);
+                       *value |= byte;
+                       break;
+
+               case 2:
+                       *value = (byte & 0x3F) << 16;
+                       stream_read_uint8(s, byte);
+                       *value |= (byte << 8);
+                       stream_read_uint8(s, byte);
+                       *value |= byte;
+                       break;
+
+               case 3:
+                       *value = (byte & 0x3F) << 24;
+                       stream_read_uint8(s, byte);
+                       *value |= (byte << 16);
+                       stream_read_uint8(s, byte);
+                       *value |= (byte << 8);
+                       stream_read_uint8(s, byte);
+                       *value |= byte;
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+INLINE void update_read_delta(STREAM* s, sint32* value)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte & 0x40)
+               *value = (byte | ~0x3F);
+       else
+               *value = (byte & 0x3F);
+
+       if (byte & 0x80)
+       {
+               stream_read_uint8(s, byte);
+               *value = (*value << 8) | byte;
+       }
+}
+
+INLINE void update_read_glyph_delta(STREAM* s, uint16* value)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte == 0x80)
+               stream_read_uint16(s, *value);
+       else
+               *value = (byte & 0x3F);
+}
+
+INLINE void update_seek_glyph_delta(STREAM* s)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte & 0x80)
+               stream_seek_uint8(s);
+}
+
+INLINE void update_read_brush(STREAM* s, rdpBrush* brush, uint8 fieldFlags)
+{
+       if (fieldFlags & ORDER_FIELD_01)
+               stream_read_uint8(s, brush->x);
+
+       if (fieldFlags & ORDER_FIELD_02)
+               stream_read_uint8(s, brush->y);
+
+       if (fieldFlags & ORDER_FIELD_03)
+               stream_read_uint8(s, brush->style);
+
+       if (fieldFlags & ORDER_FIELD_04)
+               stream_read_uint8(s, brush->hatch);
+
+       if (brush->style & CACHED_BRUSH)
+       {
+               brush->index = brush->hatch;
+
+               brush->bpp = BMF_BPP[brush->style & 0x0F];
+
+               if (brush->bpp == 0)
+                       brush->bpp = 1;
+       }
+
+       if (fieldFlags & ORDER_FIELD_05)
+       {
+               brush->data = (uint8*) brush->p8x8;
+               stream_read_uint8(s, brush->data[7]);
+               stream_read_uint8(s, brush->data[6]);
+               stream_read_uint8(s, brush->data[5]);
+               stream_read_uint8(s, brush->data[4]);
+               stream_read_uint8(s, brush->data[3]);
+               stream_read_uint8(s, brush->data[2]);
+               stream_read_uint8(s, brush->data[1]);
+               brush->data[0] = brush->hatch;
+       }
+}
+
+INLINE void update_read_delta_rects(STREAM* s, DELTA_RECT* rectangles, int number)
+{
+       int i;
+       uint8 flags = 0;
+       uint8* zeroBits;
+       int zeroBitsSize;
+
+       if (number > 45)
+               number = 45;
+
+       zeroBitsSize = ((number + 1) / 2);
+
+       stream_get_mark(s, zeroBits);
+       stream_seek(s, zeroBitsSize);
+
+       memset(rectangles, 0, sizeof(DELTA_RECT) * (number + 1));
+
+       for (i = 1; i < number + 1; i++)
+       {
+               if ((i - 1) % 2 == 0)
+                       flags = zeroBits[(i - 1) / 2];
+
+               if (~flags & 0x80)
+                       update_read_delta(s, &rectangles[i].left);
+
+               if (~flags & 0x40)
+                       update_read_delta(s, &rectangles[i].top);
+
+               if (~flags & 0x20)
+                       update_read_delta(s, &rectangles[i].width);
+               else
+                       rectangles[i].width = rectangles[i - 1].width;
+
+               if (~flags & 0x10)
+                       update_read_delta(s, &rectangles[i].height);
+               else
+                       rectangles[i].height = rectangles[i - 1].height;
+
+               rectangles[i].left = rectangles[i].left + rectangles[i - 1].left;
+               rectangles[i].top = rectangles[i].top + rectangles[i - 1].top;
+
+               flags <<= 4;
+       }
+}
+
+INLINE void update_read_delta_points(STREAM* s, DELTA_POINT* points, int number, sint16 x, sint16 y)
+{
+       int i;
+       uint8 flags = 0;
+       uint8* zeroBits;
+       int zeroBitsSize;
+
+       zeroBitsSize = ((number + 3) / 4);
+
+       stream_get_mark(s, zeroBits);
+       stream_seek(s, zeroBitsSize);
+
+       memset(points, 0, sizeof(DELTA_POINT) * number);
+
+       for (i = 0; i < number; i++)
+       {
+               if (i % 4 == 0)
+                       flags = zeroBits[i / 4];
+
+               if (~flags & 0x80)
+                       update_read_delta(s, &points[i].x);
+
+               if (~flags & 0x40)
+                       update_read_delta(s, &points[i].y);
+
+               flags <<= 2;
+       }
+}
+
+/* Primary Drawing Orders */
+
+void update_read_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &dstblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &dstblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &dstblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &dstblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, dstblt->bRop);
+}
+
+void update_read_patblt_order(STREAM* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &patblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &patblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &patblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &patblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, patblt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_color(s, &patblt->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_color(s, &patblt->foreColor);
+
+       update_read_brush(s, &patblt->brush, orderInfo->fieldFlags >> 7);
+}
+
+void update_read_scrblt_order(STREAM* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &scrblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &scrblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &scrblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &scrblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, scrblt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_coord(s, &scrblt->nXSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_coord(s, &scrblt->nYSrc, orderInfo->deltaCoordinates);
+}
+
+void update_read_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect)
+{
+       uint8 byte;
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &opaque_rect->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &opaque_rect->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &opaque_rect->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &opaque_rect->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+       {
+               stream_read_uint8(s, byte);
+               opaque_rect->color = (opaque_rect->color & 0xFFFFFF00) | byte;
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+       {
+               stream_read_uint8(s, byte);
+               opaque_rect->color = (opaque_rect->color & 0xFFFF00FF) | (byte << 8);
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+       {
+               stream_read_uint8(s, byte);
+               opaque_rect->color = (opaque_rect->color & 0xFF00FFFF) | (byte << 16);
+       }
+}
+
+void update_read_draw_nine_grid_order(STREAM* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &draw_nine_grid->srcLeft, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &draw_nine_grid->srcTop, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &draw_nine_grid->srcRight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &draw_nine_grid->srcBottom, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint16(s, draw_nine_grid->bitmapId);
+}
+
+void update_read_multi_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &multi_dstblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &multi_dstblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &multi_dstblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &multi_dstblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, multi_dstblt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, multi_dstblt->numRectangles);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+       {
+               stream_read_uint16(s, multi_dstblt->cbData);
+               update_read_delta_rects(s, multi_dstblt->rectangles, multi_dstblt->numRectangles);
+       }
+}
+
+void update_read_multi_patblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &multi_patblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &multi_patblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &multi_patblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &multi_patblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, multi_patblt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_color(s, &multi_patblt->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_color(s, &multi_patblt->foreColor);
+
+       update_read_brush(s, &multi_patblt->brush, orderInfo->fieldFlags >> 7);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_13)
+               stream_read_uint8(s, multi_patblt->numRectangles);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_14)
+       {
+               stream_read_uint16(s, multi_patblt->cbData);
+               update_read_delta_rects(s, multi_patblt->rectangles, multi_patblt->numRectangles);
+       }
+}
+
+void update_read_multi_scrblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &multi_scrblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &multi_scrblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &multi_scrblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &multi_scrblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, multi_scrblt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_coord(s, &multi_scrblt->nXSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_coord(s, &multi_scrblt->nYSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               stream_read_uint8(s, multi_scrblt->numRectangles);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+       {
+               stream_read_uint16(s, multi_scrblt->cbData);
+               update_read_delta_rects(s, multi_scrblt->rectangles, multi_scrblt->numRectangles);
+       }
+}
+
+void update_read_multi_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect)
+{
+       uint8 byte;
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &multi_opaque_rect->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &multi_opaque_rect->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &multi_opaque_rect->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &multi_opaque_rect->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+       {
+               stream_read_uint8(s, byte);
+               multi_opaque_rect->color = (multi_opaque_rect->color & 0xFFFFFF00) | byte;
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+       {
+               stream_read_uint8(s, byte);
+               multi_opaque_rect->color = (multi_opaque_rect->color & 0xFFFF00FF) | (byte << 8);
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+       {
+               stream_read_uint8(s, byte);
+               multi_opaque_rect->color = (multi_opaque_rect->color & 0xFF00FFFF) | (byte << 16);
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               stream_read_uint8(s, multi_opaque_rect->numRectangles);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+       {
+               stream_read_uint16(s, multi_opaque_rect->cbData);
+               update_read_delta_rects(s, multi_opaque_rect->rectangles, multi_opaque_rect->numRectangles);
+       }
+}
+
+void update_read_multi_draw_nine_grid_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &multi_draw_nine_grid->srcLeft, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &multi_draw_nine_grid->srcTop, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &multi_draw_nine_grid->srcRight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &multi_draw_nine_grid->srcBottom, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint16(s, multi_draw_nine_grid->bitmapId);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, multi_draw_nine_grid->nDeltaEntries);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+       {
+               stream_read_uint16(s, multi_draw_nine_grid->cbData);
+               stream_seek(s, multi_draw_nine_grid->cbData);
+       }
+}
+
+void update_read_line_to_order(STREAM* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint16(s, line_to->backMode);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &line_to->nXStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &line_to->nYStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &line_to->nXEnd, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_coord(s, &line_to->nYEnd, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_color(s, &line_to->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               stream_read_uint8(s, line_to->bRop2);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               stream_read_uint8(s, line_to->penStyle);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+               stream_read_uint8(s, line_to->penWidth);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_10)
+               update_read_color(s, &line_to->penColor);
+}
+
+void update_read_polyline_order(STREAM* s, ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &polyline->xStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &polyline->yStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               stream_read_uint8(s, polyline->bRop2);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               stream_seek_uint16(s);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_color(s, &polyline->penColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, polyline->numPoints);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+       {
+               stream_read_uint8(s, polyline->cbData);
+
+               if (polyline->points == NULL)
+                       polyline->points = (DELTA_POINT*) xmalloc(sizeof(DELTA_POINT) * polyline->numPoints);
+               else
+                       polyline->points = (DELTA_POINT*) xrealloc(polyline->points, sizeof(DELTA_POINT) * polyline->numPoints);
+
+               update_read_delta_points(s, polyline->points, polyline->numPoints, polyline->xStart, polyline->yStart);
+       }
+}
+
+void update_read_memblt_order(STREAM* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint16(s, memblt->cacheId);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &memblt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &memblt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &memblt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_coord(s, &memblt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, memblt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_coord(s, &memblt->nXSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               update_read_coord(s, &memblt->nYSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+               stream_read_uint16(s, memblt->cacheIndex);
+
+       memblt->colorIndex = (memblt->cacheId >> 8);
+       memblt->cacheId = (memblt->cacheId & 0xFF);
+}
+
+void update_read_mem3blt_order(STREAM* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint16(s, mem3blt->cacheId);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &mem3blt->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &mem3blt->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &mem3blt->nWidth, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_coord(s, &mem3blt->nHeight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, mem3blt->bRop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_coord(s, &mem3blt->nXSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               update_read_coord(s, &mem3blt->nYSrc, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+               update_read_color(s, &mem3blt->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_10)
+               update_read_color(s, &mem3blt->foreColor);
+
+       update_read_brush(s, &mem3blt->brush, orderInfo->fieldFlags >> 10);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_16)
+               stream_read_uint16(s, mem3blt->cacheIndex);
+
+       mem3blt->colorIndex = (mem3blt->cacheId >> 8);
+       mem3blt->cacheId = (mem3blt->cacheId & 0xFF);
+}
+
+void update_read_save_bitmap_order(STREAM* s, ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint32(s, save_bitmap->savedBitmapPosition);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &save_bitmap->nLeftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &save_bitmap->nTopRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &save_bitmap->nRightRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_coord(s, &save_bitmap->nBottomRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, save_bitmap->operation);
+}
+
+void update_read_glyph_index_order(STREAM* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint8(s, glyph_index->cacheId);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               stream_read_uint8(s, glyph_index->flAccel);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               stream_read_uint8(s, glyph_index->ulCharInc);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               stream_read_uint8(s, glyph_index->fOpRedundant);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_color(s, &glyph_index->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_color(s, &glyph_index->foreColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               stream_read_uint16(s, glyph_index->bkLeft);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               stream_read_uint16(s, glyph_index->bkTop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+               stream_read_uint16(s, glyph_index->bkRight);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_10)
+               stream_read_uint16(s, glyph_index->bkBottom);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_11)
+               stream_read_uint16(s, glyph_index->opLeft);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_12)
+               stream_read_uint16(s, glyph_index->opTop);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_13)
+               stream_read_uint16(s, glyph_index->opRight);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_14)
+               stream_read_uint16(s, glyph_index->opBottom);
+
+       update_read_brush(s, &glyph_index->brush, orderInfo->fieldFlags >> 14);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_20)
+               stream_read_uint16(s, glyph_index->x);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_21)
+               stream_read_uint16(s, glyph_index->y);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_22)
+       {
+               stream_read_uint8(s, glyph_index->cbData);
+               memcpy(glyph_index->data, s->p, glyph_index->cbData);
+               stream_seek(s, glyph_index->cbData);
+       }
+}
+
+void update_read_fast_index_order(STREAM* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint8(s, fast_index->cacheId);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+       {
+               stream_read_uint8(s, fast_index->ulCharInc);
+               stream_read_uint8(s, fast_index->flAccel);
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_color(s, &fast_index->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_color(s, &fast_index->foreColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_coord(s, &fast_index->bkLeft, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_coord(s, &fast_index->bkTop, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_coord(s, &fast_index->bkRight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               update_read_coord(s, &fast_index->bkBottom, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+               update_read_coord(s, &fast_index->opLeft, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_10)
+               update_read_coord(s, &fast_index->opTop, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_11)
+               update_read_coord(s, &fast_index->opRight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_12)
+               update_read_coord(s, &fast_index->opBottom, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_13)
+               update_read_coord(s, &fast_index->x, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_14)
+               update_read_coord(s, &fast_index->y, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_15)
+       {
+               stream_read_uint8(s, fast_index->cbData);
+               memcpy(fast_index->data, s->p, fast_index->cbData);
+               stream_seek(s, fast_index->cbData);
+       }
+}
+
+void update_read_fast_glyph_order(STREAM* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph)
+{
+       GLYPH_DATA_V2* glyph;
+       uint8* phold;
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               stream_read_uint8(s, fast_glyph->cacheId);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+       {
+               stream_read_uint8(s, fast_glyph->ulCharInc);
+               stream_read_uint8(s, fast_glyph->flAccel);
+       }
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_color(s, &fast_glyph->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_color(s, &fast_glyph->foreColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_coord(s, &fast_glyph->bkLeft, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_coord(s, &fast_glyph->bkTop, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_coord(s, &fast_glyph->bkRight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               update_read_coord(s, &fast_glyph->bkBottom, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_09)
+               update_read_coord(s, &fast_glyph->opLeft, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_10)
+               update_read_coord(s, &fast_glyph->opTop, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_11)
+               update_read_coord(s, &fast_glyph->opRight, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_12)
+               update_read_coord(s, &fast_glyph->opBottom, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_13)
+               update_read_coord(s, &fast_glyph->x, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_14)
+               update_read_coord(s, &fast_glyph->y, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_15)
+       {
+               stream_read_uint8(s, fast_glyph->cbData);
+               memcpy(fast_glyph->data, s->p, fast_glyph->cbData);
+               phold = s->p;
+               stream_seek(s, 1);
+               if ((fast_glyph->cbData > 1) && (fast_glyph->glyph_data == NULL))
+               {
+                       /* parse optional glyph data */
+                       glyph = (GLYPH_DATA_V2*) xmalloc(sizeof(GLYPH_DATA_V2));
+                       glyph->cacheIndex = fast_glyph->data[0];
+                       update_read_2byte_signed(s, &glyph->x);
+                       update_read_2byte_signed(s, &glyph->y);
+                       update_read_2byte_unsigned(s, &glyph->cx);
+                       update_read_2byte_unsigned(s, &glyph->cy);
+                       glyph->cb = ((glyph->cx + 7) / 8) * glyph->cy;
+                       glyph->cb += ((glyph->cb % 4) > 0) ? 4 - (glyph->cb % 4) : 0;
+                       glyph->aj = (uint8*) xmalloc(glyph->cb);
+                       stream_read(s, glyph->aj, glyph->cb);
+                       fast_glyph->glyph_data = glyph;
+               }
+               s->p = phold + fast_glyph->cbData;
+       }
+}
+
+void update_read_polygon_sc_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &polygon_sc->xStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &polygon_sc->yStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               stream_read_uint8(s, polygon_sc->bRop2);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               stream_read_uint8(s, polygon_sc->fillMode);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_color(s, &polygon_sc->brushColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, polygon_sc->nDeltaEntries);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+       {
+               stream_read_uint8(s, polygon_sc->cbData);
+               stream_seek(s, polygon_sc->cbData);
+       }
+}
+
+void update_read_polygon_cb_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &polygon_cb->xStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &polygon_cb->yStart, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               stream_read_uint8(s, polygon_cb->bRop2);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               stream_read_uint8(s, polygon_cb->fillMode);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               update_read_color(s, &polygon_cb->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               update_read_color(s, &polygon_cb->foreColor);
+
+       update_read_brush(s, &polygon_cb->brush, orderInfo->fieldFlags >> 6);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_12)
+               stream_read_uint8(s, polygon_cb->nDeltaEntries);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_13)
+       {
+               stream_read_uint8(s, polygon_cb->cbData);
+               stream_seek(s, polygon_cb->cbData);
+       }
+}
+
+void update_read_ellipse_sc_order(STREAM* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &ellipse_sc->leftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &ellipse_sc->topRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &ellipse_sc->rightRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &ellipse_sc->bottomRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, ellipse_sc->bRop2);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, ellipse_sc->fillMode);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_color(s, &ellipse_sc->color);
+}
+
+void update_read_ellipse_cb_order(STREAM* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb)
+{
+       if (orderInfo->fieldFlags & ORDER_FIELD_01)
+               update_read_coord(s, &ellipse_cb->leftRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_02)
+               update_read_coord(s, &ellipse_cb->topRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_03)
+               update_read_coord(s, &ellipse_cb->rightRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_04)
+               update_read_coord(s, &ellipse_cb->bottomRect, orderInfo->deltaCoordinates);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_05)
+               stream_read_uint8(s, ellipse_cb->bRop2);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_06)
+               stream_read_uint8(s, ellipse_cb->fillMode);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_07)
+               update_read_color(s, &ellipse_cb->backColor);
+
+       if (orderInfo->fieldFlags & ORDER_FIELD_08)
+               update_read_color(s, &ellipse_cb->foreColor);
+
+       update_read_brush(s, &ellipse_cb->brush, orderInfo->fieldFlags >> 8);
+}
+
+/* Secondary Drawing Orders */
+
+void update_read_cache_bitmap_order(STREAM* s, CACHE_BITMAP_ORDER* cache_bitmap_order, boolean compressed, uint16 flags)
+{
+       stream_read_uint8(s, cache_bitmap_order->cacheId); /* cacheId (1 byte) */
+       stream_seek_uint8(s); /* pad1Octet (1 byte) */
+       stream_read_uint8(s, cache_bitmap_order->bitmapWidth); /* bitmapWidth (1 byte) */
+       stream_read_uint8(s, cache_bitmap_order->bitmapHeight); /* bitmapHeight (1 byte) */
+       stream_read_uint8(s, cache_bitmap_order->bitmapBpp); /* bitmapBpp (1 byte) */
+       stream_read_uint16(s, cache_bitmap_order->bitmapLength); /* bitmapLength (2 bytes) */
+       stream_read_uint16(s, cache_bitmap_order->cacheIndex); /* cacheIndex (2 bytes) */
+
+       if (compressed)
+       {
+               if ((flags & NO_BITMAP_COMPRESSION_HDR) == 0)
+               {
+                       uint8* bitmapComprHdr = (uint8*) &(cache_bitmap_order->bitmapComprHdr);
+                       stream_read(s, bitmapComprHdr, 8); /* bitmapComprHdr (8 bytes) */
+                       cache_bitmap_order->bitmapLength -= 8;
+               }
+               stream_get_mark(s, cache_bitmap_order->bitmapDataStream);
+               stream_seek(s, cache_bitmap_order->bitmapLength);
+       }
+       else
+       {
+               stream_get_mark(s, cache_bitmap_order->bitmapDataStream);
+               stream_seek(s, cache_bitmap_order->bitmapLength); /* bitmapDataStream */
+       }
+       cache_bitmap_order->compressed = compressed;
+}
+
+void update_read_cache_bitmap_v2_order(STREAM* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order, boolean compressed, uint16 flags)
+{
+       uint8 bitsPerPixelId;
+
+       cache_bitmap_v2_order->cacheId = flags & 0x0003;
+       cache_bitmap_v2_order->flags = (flags & 0xFF80) >> 7;
+
+       bitsPerPixelId = (flags & 0x0078) >> 3;
+       cache_bitmap_v2_order->bitmapBpp = CBR2_BPP[bitsPerPixelId];
+
+       if (cache_bitmap_v2_order->flags & CBR2_PERSISTENT_KEY_PRESENT)
+       {
+               stream_read_uint32(s, cache_bitmap_v2_order->key1); /* key1 (4 bytes) */
+               stream_read_uint32(s, cache_bitmap_v2_order->key2); /* key2 (4 bytes) */
+       }
+
+       if (cache_bitmap_v2_order->flags & CBR2_HEIGHT_SAME_AS_WIDTH)
+       {
+               update_read_2byte_unsigned(s, &cache_bitmap_v2_order->bitmapWidth); /* bitmapWidth */
+               cache_bitmap_v2_order->bitmapHeight = cache_bitmap_v2_order->bitmapWidth;
+       }
+       else
+       {
+               update_read_2byte_unsigned(s, &cache_bitmap_v2_order->bitmapWidth); /* bitmapWidth */
+               update_read_2byte_unsigned(s, &cache_bitmap_v2_order->bitmapHeight); /* bitmapHeight */
+       }
+
+       update_read_4byte_unsigned(s, &cache_bitmap_v2_order->bitmapLength); /* bitmapLength */
+       update_read_2byte_unsigned(s, &cache_bitmap_v2_order->cacheIndex); /* cacheIndex */
+
+       if (cache_bitmap_v2_order->flags & CBR2_DO_NOT_CACHE)
+               cache_bitmap_v2_order->cacheIndex = BITMAP_CACHE_WAITING_LIST_INDEX;
+
+       if (compressed)
+       {
+               if (!(cache_bitmap_v2_order->flags & CBR2_NO_BITMAP_COMPRESSION_HDR))
+               {
+                       stream_read_uint16(s, cache_bitmap_v2_order->cbCompFirstRowSize); /* cbCompFirstRowSize (2 bytes) */
+                       stream_read_uint16(s, cache_bitmap_v2_order->cbCompMainBodySize); /* cbCompMainBodySize (2 bytes) */
+                       stream_read_uint16(s, cache_bitmap_v2_order->cbScanWidth); /* cbScanWidth (2 bytes) */
+                       stream_read_uint16(s, cache_bitmap_v2_order->cbUncompressedSize); /* cbUncompressedSize (2 bytes) */
+                       cache_bitmap_v2_order->bitmapLength = cache_bitmap_v2_order->cbCompMainBodySize;
+               }
+
+               stream_get_mark(s, cache_bitmap_v2_order->bitmapDataStream);
+               stream_seek(s, cache_bitmap_v2_order->bitmapLength);
+       }
+       else
+       {
+               stream_get_mark(s, cache_bitmap_v2_order->bitmapDataStream);
+               stream_seek(s, cache_bitmap_v2_order->bitmapLength);
+       }
+       cache_bitmap_v2_order->compressed = compressed;
+}
+
+void update_read_cache_bitmap_v3_order(STREAM* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order, boolean compressed, uint16 flags)
+{
+       uint8 bitsPerPixelId;
+       BITMAP_DATA_EX* bitmapData;
+
+       cache_bitmap_v3_order->cacheId = flags & 0x00000003;
+       cache_bitmap_v3_order->flags = (flags & 0x0000FF80) >> 7;
+
+       bitsPerPixelId = (flags & 0x00000078) >> 3;
+       cache_bitmap_v3_order->bpp = CBR23_BPP[bitsPerPixelId];
+
+       stream_read_uint16(s, cache_bitmap_v3_order->cacheIndex); /* cacheIndex (2 bytes) */
+       stream_read_uint32(s, cache_bitmap_v3_order->key1); /* key1 (4 bytes) */
+       stream_read_uint32(s, cache_bitmap_v3_order->key2); /* key2 (4 bytes) */
+
+       bitmapData = &cache_bitmap_v3_order->bitmapData;
+
+       stream_read_uint8(s, bitmapData->bpp);
+       stream_seek_uint8(s); /* reserved1 (1 byte) */
+       stream_seek_uint8(s); /* reserved2 (1 byte) */
+       stream_read_uint8(s, bitmapData->codecID); /* codecID (1 byte) */
+       stream_read_uint16(s, bitmapData->width); /* width (2 bytes) */
+       stream_read_uint16(s, bitmapData->height); /* height (2 bytes) */
+       stream_read_uint32(s, bitmapData->length); /* length (4 bytes) */
+
+       if (bitmapData->data == NULL)
+               bitmapData->data = (uint8*) xmalloc(bitmapData->length);
+       else
+               bitmapData->data = (uint8*) xrealloc(bitmapData->data, bitmapData->length);
+
+       stream_read(s, bitmapData->data, bitmapData->length);
+}
+
+void update_read_cache_color_table_order(STREAM* s, CACHE_COLOR_TABLE_ORDER* cache_color_table_order, uint16 flags)
+{
+       int i;
+       uint32* colorTable;
+
+       stream_read_uint8(s, cache_color_table_order->cacheIndex); /* cacheIndex (1 byte) */
+       stream_read_uint8(s, cache_color_table_order->numberColors); /* numberColors (2 bytes) */
+
+       colorTable = cache_color_table_order->colorTable;
+
+       if (colorTable == NULL)
+               colorTable = (uint32*) xmalloc(cache_color_table_order->numberColors * 4);
+       else
+               colorTable = (uint32*) xrealloc(colorTable, cache_color_table_order->numberColors * 4);
+
+       for (i = 0; i < (int) cache_color_table_order->numberColors; i++)
+       {
+               update_read_color_quad(s, &colorTable[i]);
+       }
+
+       cache_color_table_order->colorTable = colorTable;
+}
+
+void update_read_cache_glyph_order(STREAM* s, CACHE_GLYPH_ORDER* cache_glyph_order, uint16 flags)
+{
+       int i;
+       sint16 lsi16;
+       GLYPH_DATA* glyph;
+
+       stream_read_uint8(s, cache_glyph_order->cacheId); /* cacheId (1 byte) */
+       stream_read_uint8(s, cache_glyph_order->cGlyphs); /* cGlyphs (1 byte) */
+
+       for (i = 0; i < (int) cache_glyph_order->cGlyphs; i++)
+       {
+               if (cache_glyph_order->glyphData[i] == NULL)
+               {
+                       cache_glyph_order->glyphData[i] = (GLYPH_DATA*) xmalloc(sizeof(GLYPH_DATA));
+               }
+               glyph = cache_glyph_order->glyphData[i];
+
+               stream_read_uint16(s, glyph->cacheIndex);
+               stream_read_uint16(s, lsi16);
+               glyph->x = lsi16;
+               stream_read_uint16(s, lsi16);
+               glyph->y = lsi16;
+               stream_read_uint16(s, glyph->cx);
+               stream_read_uint16(s, glyph->cy);
+
+               glyph->cb = ((glyph->cx + 7) / 8) * glyph->cy;
+               glyph->cb += ((glyph->cb % 4) > 0) ? 4 - (glyph->cb % 4) : 0;
+
+               glyph->aj = (uint8*) xmalloc(glyph->cb);
+
+               stream_read(s, glyph->aj, glyph->cb);
+       }
+
+       if (flags & CG_GLYPH_UNICODE_PRESENT)
+               stream_seek(s, cache_glyph_order->cGlyphs * 2);
+}
+
+void update_read_cache_glyph_v2_order(STREAM* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order, uint16 flags)
+{
+       int i;
+       GLYPH_DATA_V2* glyph;
+
+       cache_glyph_v2_order->cacheId = (flags & 0x000F);
+       cache_glyph_v2_order->flags = (flags & 0x00F0) >> 4;
+       cache_glyph_v2_order->cGlyphs = (flags & 0xFF00) >> 8;
+
+       for (i = 0; i < (int) cache_glyph_v2_order->cGlyphs; i++)
+       {
+               if (cache_glyph_v2_order->glyphData[i] == NULL)
+               {
+                       cache_glyph_v2_order->glyphData[i] = (GLYPH_DATA_V2*) xmalloc(sizeof(GLYPH_DATA_V2));
+               }
+               glyph = cache_glyph_v2_order->glyphData[i];
+
+               stream_read_uint8(s, glyph->cacheIndex);
+               update_read_2byte_signed(s, &glyph->x);
+               update_read_2byte_signed(s, &glyph->y);
+               update_read_2byte_unsigned(s, &glyph->cx);
+               update_read_2byte_unsigned(s, &glyph->cy);
+
+               glyph->cb = ((glyph->cx + 7) / 8) * glyph->cy;
+               glyph->cb += ((glyph->cb % 4) > 0) ? 4 - (glyph->cb % 4) : 0;
+
+               glyph->aj = (uint8*) xmalloc(glyph->cb);
+
+               stream_read(s, glyph->aj, glyph->cb);
+       }
+
+       if (flags & CG_GLYPH_UNICODE_PRESENT)
+               stream_seek(s, cache_glyph_v2_order->cGlyphs * 2);
+}
+
+void update_decompress_brush(STREAM* s, uint8* output, uint8 bpp)
+{
+       int index;
+       int x, y, k;
+       uint8 byte = 0;
+       uint8* palette;
+       int bytesPerPixel;
+
+       palette = s->p + 16;
+       bytesPerPixel = ((bpp + 1) / 8);
+
+       for (y = 7; y >= 0; y--)
+       {
+               for (x = 0; x < 8; x++)
+               {
+                       if ((x % 4) == 0)
+                               stream_read_uint8(s, byte);
+
+                       index = ((byte >> ((3 - (x % 4)) * 2)) & 0x03);
+
+                       for (k = 0; k < bytesPerPixel; k++)
+                       {
+                               output[((y * 8 + x) * bytesPerPixel) + k] = palette[(index * bytesPerPixel) + k];
+                       }
+               }
+       }
+}
+
+void update_read_cache_brush_order(STREAM* s, CACHE_BRUSH_ORDER* cache_brush_order, uint16 flags)
+{
+       int i;
+       int size;
+       uint8 iBitmapFormat;
+       boolean compressed = false;
+
+       stream_read_uint8(s, cache_brush_order->index); /* cacheEntry (1 byte) */
+
+       stream_read_uint8(s, iBitmapFormat); /* iBitmapFormat (1 byte) */
+       cache_brush_order->bpp = BMF_BPP[iBitmapFormat];
+
+       stream_read_uint8(s, cache_brush_order->cx); /* cx (1 byte) */
+       stream_read_uint8(s, cache_brush_order->cy); /* cy (1 byte) */
+       stream_read_uint8(s, cache_brush_order->style); /* style (1 byte) */
+       stream_read_uint8(s, cache_brush_order->length); /* iBytes (1 byte) */
+
+       if ((cache_brush_order->cx == 8) && (cache_brush_order->cy == 8))
+       {
+               size = (cache_brush_order->bpp == 1) ? 8 : 8 * 8 * cache_brush_order->bpp;
+
+               cache_brush_order->data = (uint8*) xmalloc(size);
+
+               if (cache_brush_order->bpp == 1)
+               {
+                       if (cache_brush_order->length != 8)
+                       {
+                               printf("incompatible 1bpp brush of length:%d\n", cache_brush_order->length);
+                               return;
+                       }
+
+                       /* rows are encoded in reverse order */
+
+                       for (i = 7; i >= 0; i--)
+                       {
+                               stream_read_uint8(s, cache_brush_order->data[i]);
+                       }
+               }
+               else
+               {
+                       if ((iBitmapFormat == BMF_8BPP) && (cache_brush_order->length == 20))
+                               compressed = true;
+                       else if ((iBitmapFormat == BMF_16BPP) && (cache_brush_order->length == 24))
+                               compressed = true;
+                       else if ((iBitmapFormat == BMF_32BPP) && (cache_brush_order->length == 32))
+                               compressed = true;
+
+                       if (compressed != false)
+                       {
+                               /* compressed brush */
+                               update_decompress_brush(s, cache_brush_order->data, cache_brush_order->bpp);
+                       }
+                       else
+                       {
+                               /* uncompressed brush */
+                               int scanline = (cache_brush_order->bpp / 8) * 8;
+
+                               for (i = 7; i >= 0; i--)
+                               {
+                                       stream_read(s, &cache_brush_order->data[i * scanline], scanline);
+                               }
+                       }
+               }
+       }
+}
+
+/* Alternate Secondary Drawing Orders */
+
+void update_read_create_offscreen_bitmap_order(STREAM* s, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap)
+{
+       uint16 flags;
+       boolean deleteListPresent;
+       OFFSCREEN_DELETE_LIST* deleteList;
+
+       stream_read_uint16(s, flags); /* flags (2 bytes) */
+       create_offscreen_bitmap->id = flags & 0x7FFF;
+       deleteListPresent = (flags & 0x8000) ? true : false;
+
+       stream_read_uint16(s, create_offscreen_bitmap->cx); /* cx (2 bytes) */
+       stream_read_uint16(s, create_offscreen_bitmap->cy); /* cy (2 bytes) */
+
+       deleteList = &(create_offscreen_bitmap->deleteList);
+       if (deleteListPresent)
+       {
+               int i;
+
+               stream_read_uint16(s, deleteList->cIndices);
+
+               if (deleteList->cIndices > deleteList->sIndices)
+               {
+                       deleteList->sIndices = deleteList->cIndices;
+                       deleteList->indices = xrealloc(deleteList->indices, deleteList->sIndices * 2);
+               }
+
+               for (i = 0; i < (int) deleteList->cIndices; i++)
+               {
+                       stream_read_uint16(s, deleteList->indices[i]);
+               }
+       }
+       else
+       {
+               deleteList->cIndices = 0;
+       }
+}
+
+void update_read_switch_surface_order(STREAM* s, SWITCH_SURFACE_ORDER* switch_surface)
+{
+       stream_read_uint16(s, switch_surface->bitmapId); /* bitmapId (2 bytes) */
+}
+
+void update_read_create_nine_grid_bitmap_order(STREAM* s, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap)
+{
+       NINE_GRID_BITMAP_INFO* nineGridInfo;
+
+       stream_read_uint8(s, create_nine_grid_bitmap->bitmapBpp); /* bitmapBpp (1 byte) */
+       stream_read_uint16(s, create_nine_grid_bitmap->bitmapId); /* bitmapId (2 bytes) */
+
+       nineGridInfo = &(create_nine_grid_bitmap->nineGridInfo);
+       stream_read_uint32(s, nineGridInfo->flFlags); /* flFlags (4 bytes) */
+       stream_read_uint16(s, nineGridInfo->ulLeftWidth); /* ulLeftWidth (2 bytes) */
+       stream_read_uint16(s, nineGridInfo->ulRightWidth); /* ulRightWidth (2 bytes) */
+       stream_read_uint16(s, nineGridInfo->ulTopHeight); /* ulTopHeight (2 bytes) */
+       stream_read_uint16(s, nineGridInfo->ulBottomHeight); /* ulBottomHeight (2 bytes) */
+       update_read_colorref(s, &nineGridInfo->crTransparent); /* crTransparent (4 bytes) */
+}
+
+void update_read_frame_marker_order(STREAM* s, FRAME_MARKER_ORDER* frame_marker)
+{
+       stream_read_uint32(s, frame_marker->action); /* action (4 bytes) */
+}
+
+void update_read_stream_bitmap_first_order(STREAM* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first)
+{
+       stream_read_uint8(s, stream_bitmap_first->bitmapFlags); /* bitmapFlags (1 byte) */
+       stream_read_uint8(s, stream_bitmap_first->bitmapBpp); /* bitmapBpp (1 byte) */
+       stream_read_uint16(s, stream_bitmap_first->bitmapType); /* bitmapType (2 bytes) */
+       stream_read_uint16(s, stream_bitmap_first->bitmapWidth); /* bitmapWidth (2 bytes) */
+       stream_read_uint16(s, stream_bitmap_first->bitmapHeight); /* bitmapHeigth (2 bytes) */
+
+       if (stream_bitmap_first->bitmapFlags & STREAM_BITMAP_V2)
+               stream_read_uint32(s, stream_bitmap_first->bitmapSize); /* bitmapSize (4 bytes) */
+       else
+               stream_read_uint16(s, stream_bitmap_first->bitmapSize); /* bitmapSize (2 bytes) */
+
+       stream_read_uint16(s, stream_bitmap_first->bitmapBlockSize); /* bitmapBlockSize (2 bytes) */
+       stream_seek(s, stream_bitmap_first->bitmapBlockSize); /* bitmapBlock */
+}
+
+void update_read_stream_bitmap_next_order(STREAM* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_next)
+{
+       stream_read_uint8(s, stream_bitmap_next->bitmapFlags); /* bitmapFlags (1 byte) */
+       stream_read_uint16(s, stream_bitmap_next->bitmapType); /* bitmapType (2 bytes) */
+       stream_read_uint16(s, stream_bitmap_next->bitmapBlockSize); /* bitmapBlockSize (2 bytes) */
+       stream_seek(s, stream_bitmap_next->bitmapBlockSize); /* bitmapBlock */
+}
+
+void update_read_draw_gdiplus_first_order(STREAM* s, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first)
+{
+       stream_seek_uint8(s); /* pad1Octet (1 byte) */
+       stream_read_uint16(s, draw_gdiplus_first->cbSize); /* cbSize (2 bytes) */
+       stream_read_uint32(s, draw_gdiplus_first->cbTotalSize); /* cbTotalSize (4 bytes) */
+       stream_read_uint32(s, draw_gdiplus_first->cbTotalEmfSize); /* cbTotalEmfSize (4 bytes) */
+       stream_seek(s, draw_gdiplus_first->cbSize); /* emfRecords */
+}
+
+void update_read_draw_gdiplus_next_order(STREAM* s, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next)
+{
+       stream_seek_uint8(s); /* pad1Octet (1 byte) */
+       stream_read_uint16(s, draw_gdiplus_next->cbSize); /* cbSize (2 bytes) */
+       stream_seek(s, draw_gdiplus_next->cbSize); /* emfRecords */
+}
+
+void update_read_draw_gdiplus_end_order(STREAM* s, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end)
+{
+       stream_seek_uint8(s); /* pad1Octet (1 byte) */
+       stream_read_uint16(s, draw_gdiplus_end->cbSize); /* cbSize (2 bytes) */
+       stream_read_uint32(s, draw_gdiplus_end->cbTotalSize); /* cbTotalSize (4 bytes) */
+       stream_read_uint32(s, draw_gdiplus_end->cbTotalEmfSize); /* cbTotalEmfSize (4 bytes) */
+       stream_seek(s, draw_gdiplus_end->cbSize); /* emfRecords */
+}
+
+void update_read_draw_gdiplus_cache_first_order(STREAM* s, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first)
+{
+       stream_read_uint8(s, draw_gdiplus_cache_first->flags); /* flags (1 byte) */
+       stream_read_uint16(s, draw_gdiplus_cache_first->cacheType); /* cacheType (2 bytes) */
+       stream_read_uint16(s, draw_gdiplus_cache_first->cacheIndex); /* cacheIndex (2 bytes) */
+       stream_read_uint16(s, draw_gdiplus_cache_first->cbSize); /* cbSize (2 bytes) */
+       stream_read_uint32(s, draw_gdiplus_cache_first->cbTotalSize); /* cbTotalSize (4 bytes) */
+       stream_seek(s, draw_gdiplus_cache_first->cbSize); /* emfRecords */
+}
+
+void update_read_draw_gdiplus_cache_next_order(STREAM* s, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next)
+{
+       stream_read_uint8(s, draw_gdiplus_cache_next->flags); /* flags (1 byte) */
+       stream_read_uint16(s, draw_gdiplus_cache_next->cacheType); /* cacheType (2 bytes) */
+       stream_read_uint16(s, draw_gdiplus_cache_next->cacheIndex); /* cacheIndex (2 bytes) */
+       stream_read_uint16(s, draw_gdiplus_cache_next->cbSize); /* cbSize (2 bytes) */
+       stream_seek(s, draw_gdiplus_cache_next->cbSize); /* emfRecords */
+}
+
+void update_read_draw_gdiplus_cache_end_order(STREAM* s, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end)
+{
+       stream_read_uint8(s, draw_gdiplus_cache_end->flags); /* flags (1 byte) */
+       stream_read_uint16(s, draw_gdiplus_cache_end->cacheType); /* cacheType (2 bytes) */
+       stream_read_uint16(s, draw_gdiplus_cache_end->cacheIndex); /* cacheIndex (2 bytes) */
+       stream_read_uint16(s, draw_gdiplus_cache_end->cbSize); /* cbSize (2 bytes) */
+       stream_read_uint32(s, draw_gdiplus_cache_end->cbTotalSize); /* cbTotalSize (4 bytes) */
+       stream_seek(s, draw_gdiplus_cache_end->cbSize); /* emfRecords */
+}
+
+void update_read_field_flags(STREAM* s, uint32* fieldFlags, uint8 flags, uint8 fieldBytes)
+{
+       int i;
+       uint8 byte;
+
+       if (flags & ORDER_ZERO_FIELD_BYTE_BIT0)
+               fieldBytes--;
+
+       if (flags & ORDER_ZERO_FIELD_BYTE_BIT1)
+       {
+               if (fieldBytes > 1)
+                       fieldBytes -= 2;
+               else
+                       fieldBytes = 0;
+       }
+
+       *fieldFlags = 0;
+       for (i = 0; i < fieldBytes; i++)
+       {
+               stream_read_uint8(s, byte);
+               *fieldFlags |= byte << (i * 8);
+       }
+}
+
+void update_read_bounds(STREAM* s, rdpBounds* bounds)
+{
+       uint8 flags;
+
+       stream_read_uint8(s, flags); /* field flags */
+
+       if (flags & BOUND_LEFT)
+               update_read_coord(s, &bounds->left, false);
+       else if (flags & BOUND_DELTA_LEFT)
+               update_read_coord(s, &bounds->left, true);
+
+       if (flags & BOUND_TOP)
+               update_read_coord(s, &bounds->top, false);
+       else if (flags & BOUND_DELTA_TOP)
+               update_read_coord(s, &bounds->top, true);
+
+       if (flags & BOUND_RIGHT)
+               update_read_coord(s, &bounds->right, false);
+       else if (flags & BOUND_DELTA_RIGHT)
+               update_read_coord(s, &bounds->right, true);
+
+       if (flags & BOUND_BOTTOM)
+               update_read_coord(s, &bounds->bottom, false);
+       else if (flags & BOUND_DELTA_BOTTOM)
+               update_read_coord(s, &bounds->bottom, true);
+}
+
+void update_recv_primary_order(rdpUpdate* update, STREAM* s, uint8 flags)
+{
+       ORDER_INFO* orderInfo;
+       rdpContext* context = update->context;
+       rdpPrimaryUpdate* primary = update->primary;
+
+       orderInfo = &(primary->order_info);
+
+       if (flags & ORDER_TYPE_CHANGE)
+               stream_read_uint8(s, orderInfo->orderType); /* orderType (1 byte) */
+
+       update_read_field_flags(s, &(orderInfo->fieldFlags), flags,
+                       PRIMARY_DRAWING_ORDER_FIELD_BYTES[orderInfo->orderType]);
+
+       if (flags & ORDER_BOUNDS)
+       {
+               if (!(flags & ORDER_ZERO_BOUNDS_DELTAS))
+                       update_read_bounds(s, &orderInfo->bounds);
+
+               IFCALL(update->SetBounds, context, &orderInfo->bounds);
+       }
+
+       orderInfo->deltaCoordinates = (flags & ORDER_DELTA_COORDINATES) ? true : false;
+
+#ifdef WITH_DEBUG_ORDERS
+       if (orderInfo->orderType < PRIMARY_DRAWING_ORDER_COUNT)
+               printf("%s Primary Drawing Order (0x%02X)\n", PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType);
+       else
+               printf("Unknown Primary Drawing Order (0x%02X)\n", orderInfo->orderType);
+#endif
+
+       switch (orderInfo->orderType)
+       {
+               case ORDER_TYPE_DSTBLT:
+                       update_read_dstblt_order(s, orderInfo, &(primary->dstblt));
+                       IFCALL(primary->DstBlt, context, &primary->dstblt);
+                       break;
+
+               case ORDER_TYPE_PATBLT:
+                       update_read_patblt_order(s, orderInfo, &(primary->patblt));
+                       IFCALL(primary->PatBlt, context, &primary->patblt);
+                       break;
+
+               case ORDER_TYPE_SCRBLT:
+                       update_read_scrblt_order(s, orderInfo, &(primary->scrblt));
+                       IFCALL(primary->ScrBlt, context, &primary->scrblt);
+                       break;
+
+               case ORDER_TYPE_OPAQUE_RECT:
+                       update_read_opaque_rect_order(s, orderInfo, &(primary->opaque_rect));
+                       IFCALL(primary->OpaqueRect, context, &primary->opaque_rect);
+                       break;
+
+               case ORDER_TYPE_DRAW_NINE_GRID:
+                       update_read_draw_nine_grid_order(s, orderInfo, &(primary->draw_nine_grid));
+                       IFCALL(primary->DrawNineGrid, context, &primary->draw_nine_grid);
+                       break;
+
+               case ORDER_TYPE_MULTI_DSTBLT:
+                       update_read_multi_dstblt_order(s, orderInfo, &(primary->multi_dstblt));
+                       IFCALL(primary->MultiDstBlt, context, &primary->multi_dstblt);
+                       break;
+
+               case ORDER_TYPE_MULTI_PATBLT:
+                       update_read_multi_patblt_order(s, orderInfo, &(primary->multi_patblt));
+                       IFCALL(primary->MultiPatBlt, context, &primary->multi_patblt);
+                       break;
+
+               case ORDER_TYPE_MULTI_SCRBLT:
+                       update_read_multi_scrblt_order(s, orderInfo, &(primary->multi_scrblt));
+                       IFCALL(primary->MultiScrBlt, context, &primary->multi_scrblt);
+                       break;
+
+               case ORDER_TYPE_MULTI_OPAQUE_RECT:
+                       update_read_multi_opaque_rect_order(s, orderInfo, &(primary->multi_opaque_rect));
+                       IFCALL(primary->MultiOpaqueRect, context, &primary->multi_opaque_rect);
+                       break;
+
+               case ORDER_TYPE_MULTI_DRAW_NINE_GRID:
+                       update_read_multi_draw_nine_grid_order(s, orderInfo, &(primary->multi_draw_nine_grid));
+                       IFCALL(primary->MultiDrawNineGrid, context, &primary->multi_draw_nine_grid);
+                       break;
+
+               case ORDER_TYPE_LINE_TO:
+                       update_read_line_to_order(s, orderInfo, &(primary->line_to));
+                       IFCALL(primary->LineTo, context, &primary->line_to);
+                       break;
+
+               case ORDER_TYPE_POLYLINE:
+                       update_read_polyline_order(s, orderInfo, &(primary->polyline));
+                       IFCALL(primary->Polyline, context, &primary->polyline);
+                       break;
+
+               case ORDER_TYPE_MEMBLT:
+                       update_read_memblt_order(s, orderInfo, &(primary->memblt));
+                       IFCALL(primary->MemBlt, context, &primary->memblt);
+                       break;
+
+               case ORDER_TYPE_MEM3BLT:
+                       update_read_mem3blt_order(s, orderInfo, &(primary->mem3blt));
+                       IFCALL(primary->Mem3Blt, context, &primary->mem3blt);
+                       break;
+
+               case ORDER_TYPE_SAVE_BITMAP:
+                       update_read_save_bitmap_order(s, orderInfo, &(primary->save_bitmap));
+                       IFCALL(primary->SaveBitmap, context, &primary->save_bitmap);
+                       break;
+
+               case ORDER_TYPE_GLYPH_INDEX:
+                       update_read_glyph_index_order(s, orderInfo, &(primary->glyph_index));
+                       IFCALL(primary->GlyphIndex, context, &primary->glyph_index);
+                       break;
+
+               case ORDER_TYPE_FAST_INDEX:
+                       update_read_fast_index_order(s, orderInfo, &(primary->fast_index));
+                       IFCALL(primary->FastIndex, context, &primary->fast_index);
+                       break;
+
+               case ORDER_TYPE_FAST_GLYPH:
+                       update_read_fast_glyph_order(s, orderInfo, &(primary->fast_glyph));
+                       IFCALL(primary->FastGlyph, context, &primary->fast_glyph);
+                       break;
+
+               case ORDER_TYPE_POLYGON_SC:
+                       update_read_polygon_sc_order(s, orderInfo, &(primary->polygon_sc));
+                       IFCALL(primary->PolygonSC, context, &primary->polygon_sc);
+                       break;
+
+               case ORDER_TYPE_POLYGON_CB:
+                       update_read_polygon_cb_order(s, orderInfo, &(primary->polygon_cb));
+                       IFCALL(primary->PolygonCB, context, &primary->polygon_cb);
+                       break;
+
+               case ORDER_TYPE_ELLIPSE_SC:
+                       update_read_ellipse_sc_order(s, orderInfo, &(primary->ellipse_sc));
+                       IFCALL(primary->EllipseSC, context, &primary->ellipse_sc);
+                       break;
+
+               case ORDER_TYPE_ELLIPSE_CB:
+                       update_read_ellipse_cb_order(s, orderInfo, &(primary->ellipse_cb));
+                       IFCALL(primary->EllipseCB, context, &primary->ellipse_cb);
+                       break;
+
+               default:
+                       break;
+       }
+
+       if (flags & ORDER_BOUNDS)
+       {
+               IFCALL(update->SetBounds, context, NULL);
+       }
+}
+
+void update_recv_secondary_order(rdpUpdate* update, STREAM* s, uint8 flags)
+{
+       uint8* next;
+       uint8 orderType;
+       uint16 extraFlags;
+       uint16 orderLength;
+       rdpContext* context = update->context;
+       rdpSecondaryUpdate* secondary = update->secondary;
+
+       stream_read_uint16(s, orderLength); /* orderLength (2 bytes) */
+       stream_read_uint16(s, extraFlags); /* extraFlags (2 bytes) */
+       stream_read_uint8(s, orderType); /* orderType (1 byte) */
+
+       next = s->p + ((sint16) orderLength) + 7;
+
+#ifdef WITH_DEBUG_ORDERS
+       if (orderType < SECONDARY_DRAWING_ORDER_COUNT)
+               printf("%s Secondary Drawing Order (0x%02X)\n", SECONDARY_DRAWING_ORDER_STRINGS[orderType], orderType);
+       else
+               printf("Unknown Secondary Drawing Order (0x%02X)\n", orderType);
+#endif
+
+       switch (orderType)
+       {
+               case ORDER_TYPE_BITMAP_UNCOMPRESSED:
+                       update_read_cache_bitmap_order(s, &(secondary->cache_bitmap_order), false, extraFlags);
+                       IFCALL(secondary->CacheBitmap, context, &(secondary->cache_bitmap_order));
+                       break;
+
+               case ORDER_TYPE_CACHE_BITMAP_COMPRESSED:
+                       update_read_cache_bitmap_order(s, &(secondary->cache_bitmap_order), true, extraFlags);
+                       IFCALL(secondary->CacheBitmap, context, &(secondary->cache_bitmap_order));
+                       break;
+
+               case ORDER_TYPE_BITMAP_UNCOMPRESSED_V2:
+                       update_read_cache_bitmap_v2_order(s, &(secondary->cache_bitmap_v2_order), false, extraFlags);
+                       IFCALL(secondary->CacheBitmapV2, context, &(secondary->cache_bitmap_v2_order));
+                       break;
+
+               case ORDER_TYPE_BITMAP_COMPRESSED_V2:
+                       update_read_cache_bitmap_v2_order(s, &(secondary->cache_bitmap_v2_order), true, extraFlags);
+                       IFCALL(secondary->CacheBitmapV2, context, &(secondary->cache_bitmap_v2_order));
+                       break;
+
+               case ORDER_TYPE_BITMAP_COMPRESSED_V3:
+                       update_read_cache_bitmap_v3_order(s, &(secondary->cache_bitmap_v3_order), true, extraFlags);
+                       IFCALL(secondary->CacheBitmapV3, context, &(secondary->cache_bitmap_v3_order));
+                       break;
+
+               case ORDER_TYPE_CACHE_COLOR_TABLE:
+                       update_read_cache_color_table_order(s, &(secondary->cache_color_table_order), extraFlags);
+                       IFCALL(secondary->CacheColorTable, context, &(secondary->cache_color_table_order));
+                       break;
+
+               case ORDER_TYPE_CACHE_GLYPH:
+                       if (secondary->glyph_v2)
+                       {
+                               update_read_cache_glyph_v2_order(s, &(secondary->cache_glyph_v2_order), extraFlags);
+                               IFCALL(secondary->CacheGlyphV2, context, &(secondary->cache_glyph_v2_order));
+                       }
+                       else
+                       {
+                               update_read_cache_glyph_order(s, &(secondary->cache_glyph_order), extraFlags);
+                               IFCALL(secondary->CacheGlyph, context, &(secondary->cache_glyph_order));
+                       }
+                       break;
+
+               case ORDER_TYPE_CACHE_BRUSH:
+                       update_read_cache_brush_order(s, &(secondary->cache_brush_order), extraFlags);
+                       IFCALL(secondary->CacheBrush, context, &(secondary->cache_brush_order));
+                       break;
+
+               default:
+                       break;
+       }
+
+       s->p = next;
+}
+
+void update_recv_altsec_order(rdpUpdate* update, STREAM* s, uint8 flags)
+{
+       uint8 orderType;
+       rdpContext* context = update->context;
+       rdpAltSecUpdate* altsec = update->altsec;
+
+       orderType = flags >>= 2; /* orderType is in higher 6 bits of flags field */
+
+#ifdef WITH_DEBUG_ORDERS
+       if (orderType < ALTSEC_DRAWING_ORDER_COUNT)
+               printf("%s Alternate Secondary Drawing Order (0x%02X)\n", ALTSEC_DRAWING_ORDER_STRINGS[orderType], orderType);
+       else
+               printf("Unknown Alternate Secondary Drawing Order: 0x%02X\n", orderType);
+#endif
+
+       switch (orderType)
+       {
+               case ORDER_TYPE_CREATE_OFFSCREEN_BITMAP:
+                       update_read_create_offscreen_bitmap_order(s, &(altsec->create_offscreen_bitmap));
+                       IFCALL(altsec->CreateOffscreenBitmap, context, &(altsec->create_offscreen_bitmap));
+                       break;
+
+               case ORDER_TYPE_SWITCH_SURFACE:
+                       update_read_switch_surface_order(s, &(altsec->switch_surface));
+                       IFCALL(altsec->SwitchSurface, context, &(altsec->switch_surface));
+                       break;
+
+               case ORDER_TYPE_CREATE_NINE_GRID_BITMAP:
+                       update_read_create_nine_grid_bitmap_order(s, &(altsec->create_nine_grid_bitmap));
+                       IFCALL(altsec->CreateNineGridBitmap, context, &(altsec->create_nine_grid_bitmap));
+                       break;
+
+               case ORDER_TYPE_FRAME_MARKER:
+                       update_read_frame_marker_order(s, &(altsec->frame_marker));
+                       IFCALL(altsec->FrameMarker, context, &(altsec->frame_marker));
+                       break;
+
+               case ORDER_TYPE_STREAM_BITMAP_FIRST:
+                       update_read_stream_bitmap_first_order(s, &(altsec->stream_bitmap_first));
+                       IFCALL(altsec->StreamBitmapFirst, context, &(altsec->stream_bitmap_first));
+                       break;
+
+               case ORDER_TYPE_STREAM_BITMAP_NEXT:
+                       update_read_stream_bitmap_next_order(s, &(altsec->stream_bitmap_next));
+                       IFCALL(altsec->StreamBitmapNext, context, &(altsec->stream_bitmap_next));
+                       break;
+
+               case ORDER_TYPE_GDIPLUS_FIRST:
+                       update_read_draw_gdiplus_first_order(s, &(altsec->draw_gdiplus_first));
+                       IFCALL(altsec->DrawGdiPlusFirst, context, &(altsec->draw_gdiplus_first));
+                       break;
+
+               case ORDER_TYPE_GDIPLUS_NEXT:
+                       update_read_draw_gdiplus_next_order(s, &(altsec->draw_gdiplus_next));
+                       IFCALL(altsec->DrawGdiPlusNext, context, &(altsec->draw_gdiplus_next));
+                       break;
+
+               case ORDER_TYPE_GDIPLUS_END:
+                       update_read_draw_gdiplus_end_order(s, &(altsec->draw_gdiplus_end));
+                       IFCALL(altsec->DrawGdiPlusEnd, context, &(altsec->draw_gdiplus_end));
+                       break;
+
+               case ORDER_TYPE_GDIPLUS_CACHE_FIRST:
+                       update_read_draw_gdiplus_cache_first_order(s, &(altsec->draw_gdiplus_cache_first));
+                       IFCALL(altsec->DrawGdiPlusCacheFirst, context, &(altsec->draw_gdiplus_cache_first));
+                       break;
+
+               case ORDER_TYPE_GDIPLUS_CACHE_NEXT:
+                       update_read_draw_gdiplus_cache_next_order(s, &(altsec->draw_gdiplus_cache_next));
+                       IFCALL(altsec->DrawGdiPlusCacheNext, context, &(altsec->draw_gdiplus_cache_next));
+                       break;
+
+               case ORDER_TYPE_GDIPLUS_CACHE_END:
+                       update_read_draw_gdiplus_cache_end_order(s, &(altsec->draw_gdiplus_cache_end));
+                       IFCALL(altsec->DrawGdiPlusCacheEnd, context, &(altsec->draw_gdiplus_cache_end));
+                       break;
+
+               case ORDER_TYPE_WINDOW:
+                       update_recv_altsec_window_order(update, s);
+                       break;
+
+               case ORDER_TYPE_COMPDESK_FIRST:
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+void update_recv_order(rdpUpdate* update, STREAM* s)
+{
+       uint8 controlFlags;
+
+       stream_read_uint8(s, controlFlags); /* controlFlags (1 byte) */
+
+       if (!(controlFlags & ORDER_STANDARD))
+               update_recv_altsec_order(update, s, controlFlags);
+       else if (controlFlags & ORDER_SECONDARY)
+               update_recv_secondary_order(update, s, controlFlags);
+       else
+               update_recv_primary_order(update, s, controlFlags);
+}
+
diff --git a/libfreerdp-core/orders.h b/libfreerdp-core/orders.h
new file mode 100644 (file)
index 0000000..5e85024
--- /dev/null
@@ -0,0 +1,233 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Drawing Orders
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ORDERS_H
+#define __ORDERS_H
+
+#include "rdp.h"
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/utils/stream.h>
+
+/* Order Control Flags */
+#define ORDER_STANDARD                         0x01
+#define ORDER_SECONDARY                                0x02
+#define ORDER_BOUNDS                           0x04
+#define ORDER_TYPE_CHANGE                      0x08
+#define ORDER_DELTA_COORDINATES                        0x10
+#define ORDER_ZERO_BOUNDS_DELTAS               0x20
+#define ORDER_ZERO_FIELD_BYTE_BIT0             0x40
+#define ORDER_ZERO_FIELD_BYTE_BIT1             0x80
+
+/* Bound Field Flags */
+#define BOUND_LEFT                             0x01
+#define BOUND_TOP                              0x02
+#define BOUND_RIGHT                            0x04
+#define BOUND_BOTTOM                           0x08
+#define BOUND_DELTA_LEFT                       0x10
+#define BOUND_DELTA_TOP                                0x20
+#define BOUND_DELTA_RIGHT                      0x40
+#define BOUND_DELTA_BOTTOM                     0x80
+
+/* Field Presence Flags */
+#define ORDER_FIELD_01                         0x000001
+#define ORDER_FIELD_02                         0x000002
+#define ORDER_FIELD_03                         0x000004
+#define ORDER_FIELD_04                         0x000008
+#define ORDER_FIELD_05                         0x000010
+#define ORDER_FIELD_06                         0x000020
+#define ORDER_FIELD_07                         0x000040
+#define ORDER_FIELD_08                         0x000080
+#define ORDER_FIELD_09                         0x000100
+#define ORDER_FIELD_10                         0x000200
+#define ORDER_FIELD_11                         0x000400
+#define ORDER_FIELD_12                         0x000800
+#define ORDER_FIELD_13                         0x001000
+#define ORDER_FIELD_14                         0x002000
+#define ORDER_FIELD_15                         0x004000
+#define ORDER_FIELD_16                         0x008000
+#define ORDER_FIELD_17                         0x010000
+#define ORDER_FIELD_18                         0x020000
+#define ORDER_FIELD_19                         0x040000
+#define ORDER_FIELD_20                         0x080000
+#define ORDER_FIELD_21                         0x100000
+#define ORDER_FIELD_22                         0x200000
+#define ORDER_FIELD_23                         0x400000
+
+/* Bitmap Cache Flags */
+#define CBR2_8BPP                      0x3
+#define CBR2_16BPP                     0x4
+#define CBR2_24BPP                     0x5
+#define CBR2_32BPP                     0x6
+
+#define CBR23_8BPP                     0x3
+#define CBR23_16BPP                    0x4
+#define CBR23_24BPP                    0x5
+#define CBR23_32BPP                    0x6
+
+#define CBR3_IGNORABLE_FLAG            0x08
+#define CBR3_DO_NOT_CACHE              0x10
+
+/* Primary Drawing Orders */
+#define ORDER_TYPE_DSTBLT                      0x00
+#define ORDER_TYPE_PATBLT                      0x01
+#define ORDER_TYPE_SCRBLT                      0x02
+#define ORDER_TYPE_DRAW_NINE_GRID              0x07
+#define ORDER_TYPE_MULTI_DRAW_NINE_GRID                0x08
+#define ORDER_TYPE_LINE_TO                     0x09
+#define ORDER_TYPE_OPAQUE_RECT                 0x0A
+#define ORDER_TYPE_SAVE_BITMAP                 0x0B
+#define ORDER_TYPE_MEMBLT                      0x0D
+#define ORDER_TYPE_MEM3BLT                     0x0E
+#define ORDER_TYPE_MULTI_DSTBLT                        0x0F
+#define ORDER_TYPE_MULTI_PATBLT                        0x10
+#define ORDER_TYPE_MULTI_SCRBLT                        0x11
+#define ORDER_TYPE_MULTI_OPAQUE_RECT           0x12
+#define ORDER_TYPE_FAST_INDEX                  0x13
+#define ORDER_TYPE_POLYGON_SC                  0x14
+#define ORDER_TYPE_POLYGON_CB                  0x15
+#define ORDER_TYPE_POLYLINE                    0x16
+#define ORDER_TYPE_FAST_GLYPH                  0x18
+#define ORDER_TYPE_ELLIPSE_SC                  0x19
+#define ORDER_TYPE_ELLIPSE_CB                  0x1A
+#define ORDER_TYPE_GLYPH_INDEX                 0x1B
+
+/* Primary Drawing Orders Fields */
+#define DSTBLT_ORDER_FIELDS                    5
+#define PATBLT_ORDER_FIELDS                    12
+#define SCRBLT_ORDER_FIELDS                    7
+#define DRAW_NINE_GRID_ORDER_FIELDS            5
+#define MULTI_DRAW_NINE_GRID_ORDER_FIELDS      7
+#define LINE_TO_ORDER_FIELDS                   10
+#define OPAQUE_RECT_ORDER_FIELDS               7
+#define SAVE_BITMAP_ORDER_FIELDS               6
+#define MEMBLT_ORDER_FIELDS                    9
+#define MEM3BLT_ORDER_FIELDS                   16
+#define MULTI_DSTBLT_ORDER_FIELDS              7
+#define MULTI_PATBLT_ORDER_FIELDS              14
+#define MULTI_SCRBLT_ORDER_FIELDS              9
+#define MULTI_OPAQUE_RECT_ORDER_FIELDS         9
+#define FAST_INDEX_ORDER_FIELDS                        15
+#define POLYGON_SC_ORDER_FIELDS                        7
+#define POLYGON_CB_ORDER_FIELDS                        13
+#define POLYLINE_ORDER_FIELDS                  7
+#define FAST_GLYPH_ORDER_FIELDS                        15
+#define ELLIPSE_SC_ORDER_FIELDS                        7
+#define ELLIPSE_CB_ORDER_FIELDS                        13
+#define GLYPH_INDEX_ORDER_FIELDS               22
+
+/* Primary Drawing Orders Field Bytes */
+#define DSTBLT_ORDER_FIELD_BYTES               1
+#define PATBLT_ORDER_FIELD_BYTES               2
+#define SCRBLT_ORDER_FIELD_BYTES               1
+#define DRAW_NINE_GRID_ORDER_FIELD_BYTES       1
+#define MULTI_DRAW_NINE_GRID_ORDER_FIELD_BYTES 1
+#define LINE_TO_ORDER_FIELD_BYTES              2
+#define OPAQUE_RECT_ORDER_FIELD_BYTES          1
+#define SAVE_BITMAP_ORDER_FIELD_BYTES          1
+#define MEMBLT_ORDER_FIELD_BYTES               2
+#define MEM3BLT_ORDER_FIELD_BYTES              3
+#define MULTI_DSTBLT_ORDER_FIELD_BYTES         1
+#define MULTI_PATBLT_ORDER_FIELD_BYTES         2
+#define MULTI_SCRBLT_ORDER_FIELD_BYTES         2
+#define MULTI_OPAQUE_RECT_ORDER_FIELD_BYTES    2
+#define FAST_INDEX_ORDER_FIELD_BYTES           2
+#define POLYGON_SC_ORDER_FIELD_BYTES           1
+#define POLYGON_CB_ORDER_FIELD_BYTES           2
+#define POLYLINE_ORDER_FIELD_BYTES             1
+#define FAST_GLYPH_ORDER_FIELD_BYTES           2
+#define ELLIPSE_SC_ORDER_FIELD_BYTES           1
+#define ELLIPSE_CB_ORDER_FIELD_BYTES           2
+#define GLYPH_INDEX_ORDER_FIELD_BYTES          3
+
+/* Secondary Drawing Orders */
+#define ORDER_TYPE_BITMAP_UNCOMPRESSED         0x00
+#define ORDER_TYPE_CACHE_COLOR_TABLE           0x01
+#define ORDER_TYPE_CACHE_BITMAP_COMPRESSED     0x02
+#define ORDER_TYPE_CACHE_GLYPH                 0x03
+#define ORDER_TYPE_BITMAP_UNCOMPRESSED_V2      0x04
+#define ORDER_TYPE_BITMAP_COMPRESSED_V2                0x05
+#define ORDER_TYPE_CACHE_BRUSH                 0x07
+#define ORDER_TYPE_BITMAP_COMPRESSED_V3                0x08
+
+/* Alternate Secondary Drawing Orders */
+#define ORDER_TYPE_SWITCH_SURFACE              0x00
+#define ORDER_TYPE_CREATE_OFFSCREEN_BITMAP     0x01
+#define ORDER_TYPE_STREAM_BITMAP_FIRST         0x02
+#define ORDER_TYPE_STREAM_BITMAP_NEXT          0x03
+#define ORDER_TYPE_CREATE_NINE_GRID_BITMAP     0x04
+#define ORDER_TYPE_GDIPLUS_FIRST               0x05
+#define ORDER_TYPE_GDIPLUS_NEXT                        0x06
+#define ORDER_TYPE_GDIPLUS_END                 0x07
+#define ORDER_TYPE_GDIPLUS_CACHE_FIRST         0x08
+#define ORDER_TYPE_GDIPLUS_CACHE_NEXT          0x09
+#define ORDER_TYPE_GDIPLUS_CACHE_END           0x0A
+#define ORDER_TYPE_WINDOW                      0x0B
+#define ORDER_TYPE_COMPDESK_FIRST              0x0C
+#define ORDER_TYPE_FRAME_MARKER                        0x0D
+
+#define CG_GLYPH_UNICODE_PRESENT               0x0010
+
+void update_recv_order(rdpUpdate* update, STREAM* s);
+
+void update_read_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, DSTBLT_ORDER* dstblt);
+void update_read_patblt_order(STREAM* s, ORDER_INFO* orderInfo, PATBLT_ORDER* patblt);
+void update_read_scrblt_order(STREAM* s, ORDER_INFO* orderInfo, SCRBLT_ORDER* scrblt);
+void update_read_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, OPAQUE_RECT_ORDER* opaque_rect);
+void update_read_draw_nine_grid_order(STREAM* s, ORDER_INFO* orderInfo, DRAW_NINE_GRID_ORDER* draw_nine_grid);
+void update_read_multi_dstblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DSTBLT_ORDER* multi_dstblt);
+void update_read_multi_patblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_PATBLT_ORDER* multi_patblt);
+void update_read_multi_scrblt_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_SCRBLT_ORDER* multi_scrblt);
+void update_read_multi_opaque_rect_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect);
+void update_read_multi_draw_nine_grid_order(STREAM* s, ORDER_INFO* orderInfo, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid);
+void update_read_line_to_order(STREAM* s, ORDER_INFO* orderInfo, LINE_TO_ORDER* line_to);
+void update_read_polyline_order(STREAM* s, ORDER_INFO* orderInfo, POLYLINE_ORDER* polyline);
+void update_read_memblt_order(STREAM* s, ORDER_INFO* orderInfo, MEMBLT_ORDER* memblt);
+void update_read_mem3blt_order(STREAM* s, ORDER_INFO* orderInfo, MEM3BLT_ORDER* mem3blt);
+void update_read_save_bitmap_order(STREAM* s, ORDER_INFO* orderInfo, SAVE_BITMAP_ORDER* save_bitmap);
+void update_read_glyph_index_order(STREAM* s, ORDER_INFO* orderInfo, GLYPH_INDEX_ORDER* glyph_index);
+void update_read_fast_index_order(STREAM* s, ORDER_INFO* orderInfo, FAST_INDEX_ORDER* fast_index);
+void update_read_fast_glyph_order(STREAM* s, ORDER_INFO* orderInfo, FAST_GLYPH_ORDER* fast_glyph);
+void update_read_polygon_sc_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_SC_ORDER* polygon_sc);
+void update_read_polygon_cb_order(STREAM* s, ORDER_INFO* orderInfo, POLYGON_CB_ORDER* polygon_cb);
+void update_read_ellipse_sc_order(STREAM* s, ORDER_INFO* orderInfo, ELLIPSE_SC_ORDER* ellipse_sc);
+void update_read_ellipse_cb_order(STREAM* s, ORDER_INFO* orderInfo, ELLIPSE_CB_ORDER* ellipse_cb);
+
+void update_read_cache_bitmap_order(STREAM* s, CACHE_BITMAP_ORDER* cache_bitmap_order, boolean compressed, uint16 flags);
+void update_read_cache_bitmap_v2_order(STREAM* s, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2_order, boolean compressed, uint16 flags);
+void update_read_cache_bitmap_v3_order(STREAM* s, CACHE_BITMAP_V3_ORDER* cache_bitmap_v3_order, boolean compressed, uint16 flags);
+void update_read_cache_color_table_order(STREAM* s, CACHE_COLOR_TABLE_ORDER* cache_color_table_order, uint16 flags);
+void update_read_cache_glyph_order(STREAM* s, CACHE_GLYPH_ORDER* cache_glyph_order, uint16 flags);
+void update_read_cache_glyph_v2_order(STREAM* s, CACHE_GLYPH_V2_ORDER* cache_glyph_v2_order, uint16 flags);
+void update_read_cache_brush_order(STREAM* s, CACHE_BRUSH_ORDER* cache_brush_order, uint16 flags);
+
+void update_read_create_offscreen_bitmap_order(STREAM* s, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap);
+void update_read_switch_surface_order(STREAM* s, SWITCH_SURFACE_ORDER* switch_surface);
+void update_read_create_nine_grid_bitmap_order(STREAM* s, CREATE_NINE_GRID_BITMAP_ORDER* create_nine_grid_bitmap);
+void update_read_frame_marker_order(STREAM* s, FRAME_MARKER_ORDER* frame_marker);
+void update_read_stream_bitmap_first_order(STREAM* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_first);
+void update_read_stream_bitmap_next_order(STREAM* s, STREAM_BITMAP_FIRST_ORDER* stream_bitmap_next);
+void update_read_draw_gdiplus_first_order(STREAM* s, DRAW_GDIPLUS_FIRST_ORDER* draw_gdiplus_first);
+void update_read_draw_gdiplus_next_order(STREAM* s, DRAW_GDIPLUS_NEXT_ORDER* draw_gdiplus_next);
+void update_read_draw_gdiplus_end_order(STREAM* s, DRAW_GDIPLUS_END_ORDER* draw_gdiplus_end);
+void update_read_draw_gdiplus_cache_first_order(STREAM* s, DRAW_GDIPLUS_CACHE_FIRST_ORDER* draw_gdiplus_cache_first);
+void update_read_draw_gdiplus_cache_next_order(STREAM* s, DRAW_GDIPLUS_CACHE_NEXT_ORDER* draw_gdiplus_cache_next);
+void update_read_draw_gdiplus_cache_end_order(STREAM* s, DRAW_GDIPLUS_CACHE_END_ORDER* draw_gdiplus_cache_end);
+
+#endif /* __ORDERS_H */
diff --git a/libfreerdp-core/peer.c b/libfreerdp-core/peer.c
new file mode 100644 (file)
index 0000000..01253e5
--- /dev/null
@@ -0,0 +1,355 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RDP Server Peer
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "peer.h"
+
+static boolean freerdp_peer_initialize(freerdp_peer* client)
+{
+       client->context->rdp->settings->server_mode = true;
+       client->context->rdp->state = CONNECTION_STATE_INITIAL;
+       if (client->context->rdp->settings->rdp_key_file != NULL) {
+               client->context->rdp->settings->server_key =
+                   key_new(client->context->rdp->settings->rdp_key_file);
+       }
+
+       return true;
+}
+
+static boolean freerdp_peer_get_fds(freerdp_peer* client, void** rfds, int* rcount)
+{
+       rfds[*rcount] = (void*)(long)(client->context->rdp->transport->tcp->sockfd);
+       (*rcount)++;
+
+       return true;
+}
+
+static boolean freerdp_peer_check_fds(freerdp_peer* client)
+{
+       rdpRdp* rdp;
+       int status;
+
+       rdp = client->context->rdp;
+
+       status = rdp_check_fds(rdp);
+       if (status < 0)
+               return false;
+
+       return true;
+}
+
+static boolean peer_recv_data_pdu(freerdp_peer* client, STREAM* s)
+{
+       uint8 type;
+       uint16 length;
+       uint32 share_id;
+       uint8 compressed_type;
+       uint16 compressed_len;
+
+
+       if (!rdp_read_share_data_header(s, &length, &type, &share_id, &compressed_type, &compressed_len))
+               return false;
+
+       switch (type)
+       {
+               case DATA_PDU_TYPE_SYNCHRONIZE:
+                       if (!rdp_recv_client_synchronize_pdu(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case DATA_PDU_TYPE_CONTROL:
+                       if (!rdp_server_accept_client_control_pdu(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case DATA_PDU_TYPE_INPUT:
+                       if (!input_recv(client->context->rdp->input, s))
+                               return false;
+                       break;
+
+               case DATA_PDU_TYPE_BITMAP_CACHE_PERSISTENT_LIST:
+                       /* TODO: notify server bitmap cache data */
+                       break;
+
+               case DATA_PDU_TYPE_FONT_LIST:
+                       if (!rdp_server_accept_client_font_list_pdu(client->context->rdp, s))
+                               return false;
+                       if (client->PostConnect)
+                       {
+                               if (!client->PostConnect(client))
+                                       return false;
+                               /**
+                                * PostConnect should only be called once and should not be called
+                                * after a reactivation sequence.
+                                */
+                               client->PostConnect = NULL;
+                       }
+                       if (client->Activate)
+                       {
+                               /* Activate will be called everytime after the client is activated/reactivated. */
+                               if (!client->Activate(client))
+                                       return false;
+                       }
+                       break;
+
+               case DATA_PDU_TYPE_SHUTDOWN_REQUEST:
+                       mcs_send_disconnect_provider_ultimatum(client->context->rdp->mcs);
+                       return false;
+
+               default:
+                       printf("Data PDU type %d\n", type);
+                       break;
+       }
+
+       return true;
+}
+
+static boolean peer_recv_tpkt_pdu(freerdp_peer* client, STREAM* s)
+{
+       rdpRdp *rdp;
+       uint16 length;
+       uint16 pduType;
+       uint16 pduLength;
+       uint16 pduSource;
+       uint16 channelId;
+       uint16 securityFlags;
+
+       rdp = client->context->rdp;
+
+       if (!rdp_read_header(rdp, s, &length, &channelId))
+       {
+               printf("Incorrect RDP header.\n");
+               return false;
+       }
+
+       if (rdp->settings->encryption)
+       {
+               rdp_read_security_header(s, &securityFlags);
+               if (securityFlags & SEC_ENCRYPT)
+               {
+                       if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
+                       {
+                               printf("rdp_decrypt failed\n");
+                               return false;
+                       }
+               }
+       }
+
+       if (channelId != MCS_GLOBAL_CHANNEL_ID)
+       {
+               freerdp_channel_peer_process(client, s, channelId);
+       }
+       else
+       {
+               if (!rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource))
+                       return false;
+
+               client->settings->pdu_source = pduSource;
+
+               switch (pduType)
+               {
+                       case PDU_TYPE_DATA:
+                               if (!peer_recv_data_pdu(client, s))
+                                       return false;
+                               break;
+
+                       default:
+                               printf("Client sent pduType %d\n", pduType);
+                               return false;
+               }
+       }
+
+       return true;
+}
+
+static boolean peer_recv_fastpath_pdu(freerdp_peer* client, STREAM* s)
+{
+       uint16 length;
+       rdpRdp* rdp;
+       rdpFastPath* fastpath;
+
+       rdp = client->context->rdp;
+       fastpath = rdp->fastpath;
+       length = fastpath_read_header_rdp(fastpath, s);
+
+       if (length == 0 || length > stream_get_left(s))
+       {
+               printf("incorrect FastPath PDU header length %d\n", length);
+               return false;
+       }
+
+       if (fastpath->encryptionFlags & FASTPATH_OUTPUT_ENCRYPTED)
+       {
+               rdp_decrypt(rdp, s, length, (fastpath->encryptionFlags & FASTPATH_OUTPUT_SECURE_CHECKSUM) ? SEC_SECURE_CHECKSUM : 0);
+       }
+
+       return fastpath_recv_inputs(fastpath, s);
+}
+
+static boolean peer_recv_pdu(freerdp_peer* client, STREAM* s)
+{
+       if (tpkt_verify_header(s))
+               return peer_recv_tpkt_pdu(client, s);
+       else
+               return peer_recv_fastpath_pdu(client, s);
+}
+
+static boolean peer_recv_callback(rdpTransport* transport, STREAM* s, void* extra)
+{
+       freerdp_peer* client = (freerdp_peer*) extra;
+
+       switch (client->context->rdp->state)
+       {
+               case CONNECTION_STATE_INITIAL:
+                       if (!rdp_server_accept_nego(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_NEGO:
+                       if (!rdp_server_accept_mcs_connect_initial(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_MCS_CONNECT:
+                       if (!rdp_server_accept_mcs_erect_domain_request(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_MCS_ERECT_DOMAIN:
+                       if (!rdp_server_accept_mcs_attach_user_request(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_MCS_ATTACH_USER:
+                       if (!rdp_server_accept_mcs_channel_join_request(client->context->rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_MCS_CHANNEL_JOIN:
+                       if (client->context->rdp->settings->encryption) {
+                               if (!rdp_server_accept_client_keys(client->context->rdp, s))
+                                       return false;
+                               break;
+                       }
+                       client->context->rdp->state = CONNECTION_STATE_ESTABLISH_KEYS;
+                       /* FALLTHROUGH */
+
+               case CONNECTION_STATE_ESTABLISH_KEYS:
+                       if (!rdp_server_accept_client_info(client->context->rdp, s))
+                               return false;
+                       IFCALL(client->Capabilities, client);
+                       if (!rdp_send_demand_active(client->context->rdp))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_LICENSE:
+                       if (!rdp_server_accept_confirm_active(client->context->rdp, s))
+                       {
+                               /**
+                                * During reactivation sequence the client might sent some input or channel data
+                                * before receiving the Deactivate All PDU. We need to process them as usual.
+                                */
+                               stream_set_pos(s, 0);
+                               return peer_recv_pdu(client, s);
+                       }
+                       break;
+
+               case CONNECTION_STATE_ACTIVE:
+                       if (!peer_recv_pdu(client, s))
+                               return false;
+                       break;
+
+               default:
+                       printf("Invalid state %d\n", client->context->rdp->state);
+                       return false;
+       }
+
+       return true;
+}
+
+static void freerdp_peer_disconnect(freerdp_peer* client)
+{
+       transport_disconnect(client->context->rdp->transport);
+}
+
+static int freerdp_peer_send_channel_data(freerdp_peer* client, int channelId, uint8* data, int size)
+{
+       return rdp_send_channel_data(client->context->rdp, channelId, data, size);
+}
+
+void freerdp_peer_context_new(freerdp_peer* client)
+{
+       rdpRdp* rdp;
+
+       rdp = rdp_new(NULL);
+       client->input = rdp->input;
+       client->update = rdp->update;
+       client->settings = rdp->settings;
+
+       client->context = (rdpContext*) xzalloc(client->context_size);
+       client->context->rdp = rdp;
+       client->context->peer = client;
+
+       client->update->context = client->context;
+       client->input->context = client->context;
+
+       update_register_server_callbacks(client->update);
+
+       transport_attach(rdp->transport, client->sockfd);
+
+       rdp->transport->recv_callback = peer_recv_callback;
+       rdp->transport->recv_extra = client;
+       transport_set_blocking_mode(rdp->transport, false);
+
+       IFCALL(client->ContextNew, client, client->context);
+}
+
+void freerdp_peer_context_free(freerdp_peer* client)
+{
+       IFCALL(client->ContextFree, client, client->context);
+}
+
+freerdp_peer* freerdp_peer_new(int sockfd)
+{
+       freerdp_peer* client;
+
+       client = xnew(freerdp_peer);
+
+       if (client != NULL)
+       {
+               client->sockfd = sockfd;
+               client->context_size = sizeof(rdpContext);
+               client->Initialize = freerdp_peer_initialize;
+               client->GetFileDescriptor = freerdp_peer_get_fds;
+               client->CheckFileDescriptor = freerdp_peer_check_fds;
+               client->Disconnect = freerdp_peer_disconnect;
+               client->SendChannelData = freerdp_peer_send_channel_data;
+       }
+
+       return client;
+}
+
+void freerdp_peer_free(freerdp_peer* client)
+{
+       if (client)
+       {
+               rdp_free(client->context->rdp);
+               xfree(client);
+       }
+}
+
diff --git a/libfreerdp-core/peer.h b/libfreerdp-core/peer.h
new file mode 100644 (file)
index 0000000..eb9ed63
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * RDP Server Peer
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PEER
+#define __PEER
+
+#include "rdp.h"
+#include <freerdp/peer.h>
+
+#endif /* __PEER */
+
diff --git a/libfreerdp-core/per.c b/libfreerdp-core/per.c
new file mode 100644 (file)
index 0000000..aa4d1d0
--- /dev/null
@@ -0,0 +1,455 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * ASN.1 Packed Encoding Rules (BER)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "per.h"
+
+/**
+ * Read PER length.
+ * @param s stream
+ * @param length length
+ * @return
+ */
+
+boolean per_read_length(STREAM* s, uint16* length)
+{
+       uint8 byte;
+
+       stream_read_uint8(s, byte);
+
+       if (byte & 0x80)
+       {
+               byte &= ~(0x80);
+               *length = (byte << 8);
+               stream_read_uint8(s, byte);
+               *length += byte;
+       }
+       else
+       {
+               *length = byte;
+       }
+
+       return true;
+}
+
+/**
+ * Write PER length.
+ * @param s stream
+ * @param length length
+ */
+
+void per_write_length(STREAM* s, int length)
+{
+       if (length > 0x7F)
+               stream_write_uint16_be(s, (length | 0x8000));
+       else
+               stream_write_uint8(s, length);
+}
+
+/**
+ * Read PER choice.
+ * @param s stream
+ * @param choice choice
+ * @return
+ */
+
+boolean per_read_choice(STREAM* s, uint8* choice)
+{
+       stream_read_uint8(s, *choice);
+       return true;
+}
+
+/**
+ * Write PER CHOICE.
+ * @param s stream
+ * @param choice index of chosen field
+ */
+
+void per_write_choice(STREAM* s, uint8 choice)
+{
+       stream_write_uint8(s, choice);
+}
+
+/**
+ * Read PER selection.
+ * @param s stream
+ * @param selection selection
+ * @return
+ */
+
+boolean per_read_selection(STREAM* s, uint8* selection)
+{
+       stream_read_uint8(s, *selection);
+       return true;
+}
+
+/**
+ * Write PER selection for OPTIONAL fields.
+ * @param s stream
+ * @param selection bit map of selected fields
+ */
+
+void per_write_selection(STREAM* s, uint8 selection)
+{
+       stream_write_uint8(s, selection);
+}
+
+/**
+ * Read PER number of sets.
+ * @param s stream
+ * @param number number of sets
+ * @return
+ */
+
+boolean per_read_number_of_sets(STREAM* s, uint8* number)
+{
+       stream_read_uint8(s, *number);
+       return true;
+}
+
+/**
+ * Write PER number of sets for SET OF.
+ * @param s stream
+ * @param number number of sets
+ */
+
+void per_write_number_of_sets(STREAM* s, uint8 number)
+{
+       stream_write_uint8(s, number);
+}
+
+/**
+ * Read PER padding with zeros.
+ * @param s stream
+ * @param length
+ */
+
+boolean per_read_padding(STREAM* s, int length)
+{
+       stream_seek(s, length);
+
+       return true;
+}
+
+/**
+ * Write PER padding with zeros.
+ * @param s stream
+ * @param length
+ */
+
+void per_write_padding(STREAM* s, int length)
+{
+       int i;
+
+       for (i = 0; i < length; i++)
+               stream_write_uint8(s, 0);
+}
+
+/**
+ * Read PER INTEGER.
+ * @param s stream
+ * @param integer integer
+ * @return
+ */
+
+boolean per_read_integer(STREAM* s, uint32* integer)
+{
+       uint16 length;
+
+       per_read_length(s, &length);
+
+       if (length == 1)
+               stream_read_uint8(s, *integer);
+       else if (length == 2)
+               stream_read_uint16_be(s, *integer);
+       else
+               return false;
+
+       return true;
+}
+
+/**
+ * Write PER INTEGER.
+ * @param s stream
+ * @param integer integer
+ */
+
+void per_write_integer(STREAM* s, uint32 integer)
+{
+       if (integer <= 0xFF)
+       {
+               per_write_length(s, 1);
+               stream_write_uint8(s, integer);
+       }
+       else if (integer <= 0xFFFF)
+       {
+               per_write_length(s, 2);
+               stream_write_uint16_be(s, integer);
+       }
+       else if (integer <= 0xFFFFFFFF)
+       {
+               per_write_length(s, 4);
+               stream_write_uint32_be(s, integer);
+       }
+}
+
+/**
+ * Read PER INTEGER (uint16).
+ * @param s stream
+ * @param integer integer
+ * @param min minimum value
+ * @return
+ */
+
+boolean per_read_integer16(STREAM* s, uint16* integer, uint16 min)
+{
+       stream_read_uint16_be(s, *integer);
+
+       if (*integer + min > 0xFFFF)
+               return false;
+
+       *integer += min;
+
+       return true;
+}
+
+/**
+ * Write PER INTEGER (uint16).
+ * @param s stream
+ * @param integer integer
+ * @param min minimum value
+ */
+
+void per_write_integer16(STREAM* s, uint16 integer, uint16 min)
+{
+       stream_write_uint16_be(s, integer - min);
+}
+
+/**
+ * Read PER ENUMERATED.
+ * @param s stream
+ * @param enumerated enumerated
+ * @param count enumeration count
+ * @return
+ */
+
+boolean per_read_enumerated(STREAM* s, uint8* enumerated, uint8 count)
+{
+       stream_read_uint8(s, *enumerated);
+
+       /* check that enumerated value falls within expected range */
+       if (*enumerated + 1 > count)
+               return false;
+
+       return true;
+}
+
+/**
+ * Write PER ENUMERATED.
+ * @param s stream
+ * @param enumerated enumerated
+ * @param count enumeration count
+ * @return
+ */
+
+void per_write_enumerated(STREAM* s, uint8 enumerated, uint8 count)
+{
+       stream_write_uint8(s, enumerated);
+}
+
+/**
+ * Read PER OBJECT_IDENTIFIER (OID).
+ * @param s stream
+ * @param oid object identifier (OID)
+ * @return
+ */
+
+boolean per_read_object_identifier(STREAM* s, uint8 oid[6])
+{
+       uint8 t12;
+       uint16 length;
+       uint8 a_oid[6];
+
+
+       per_read_length(s, &length); /* length */
+
+       if (length != 5)
+               return false;
+
+       stream_read_uint8(s, t12); /* first two tuples */
+       a_oid[0] = (t12 >> 4);
+       a_oid[1] = (t12 & 0x0F);
+
+       stream_read_uint8(s, a_oid[2]); /* tuple 3 */
+       stream_read_uint8(s, a_oid[3]); /* tuple 4 */
+       stream_read_uint8(s, a_oid[4]); /* tuple 5 */
+       stream_read_uint8(s, a_oid[5]); /* tuple 6 */
+
+       if ((a_oid[0] == oid[0]) && (a_oid[1] == oid[1]) &&
+               (a_oid[2] == oid[2]) && (a_oid[3] == oid[3]) &&
+               (a_oid[4] == oid[4]) && (a_oid[5] == oid[5]))
+       {
+               return true;
+       }
+       else
+       {
+               return false;
+       }
+}
+
+/**
+ * Write PER OBJECT_IDENTIFIER (OID)
+ * @param s stream
+ * @param oid object identifier (oid)
+ */
+
+void per_write_object_identifier(STREAM* s, uint8 oid[6])
+{
+       uint8 t12 = (oid[0] << 4) & (oid[1] & 0x0F);
+       stream_write_uint8(s, 5); /* length */
+       stream_write_uint8(s, t12); /* first two tuples */
+       stream_write_uint8(s, oid[2]); /* tuple 3 */
+       stream_write_uint8(s, oid[3]); /* tuple 4 */
+       stream_write_uint8(s, oid[4]); /* tuple 5 */
+       stream_write_uint8(s, oid[5]); /* tuple 6 */
+}
+
+/**
+ * Write PER string.
+ * @param s stream
+ * @param str string
+ * @param length string length
+ */
+
+void per_write_string(STREAM* s, uint8* str, int length)
+{
+       int i;
+
+       for (i = 0; i < length; i++)
+               stream_write_uint8(s, str[i]);
+}
+
+/**
+ * Read PER OCTET_STRING.
+ * @param s stream
+ * @param oct_str octet string
+ * @param length string length
+ * @param min minimum length
+ * @return
+ */
+
+boolean per_read_octet_string(STREAM* s, uint8* oct_str, int length, int min)
+{
+       int i;
+       uint16 mlength;
+       uint8* a_oct_str;
+
+       per_read_length(s, &mlength);
+
+       if (mlength + min != length)
+               return false;
+
+       a_oct_str = s->p;
+       stream_seek(s, length);
+
+       for (i = 0; i < length; i++)
+       {
+               if (a_oct_str[i] != oct_str[i])
+                       return false;
+       }
+
+       return true;
+}
+
+/**
+ * Write PER OCTET_STRING
+ * @param s stream
+ * @param oct_str octet string
+ * @param length string length
+ * @param min minimum string length
+ */
+
+void per_write_octet_string(STREAM* s, uint8* oct_str, int length, int min)
+{
+       int i;
+       int mlength;
+
+       mlength = (length - min >= 0) ? length - min : min;
+
+       per_write_length(s, mlength);
+
+       for (i = 0; i < length; i++)
+               stream_write_uint8(s, oct_str[i]);
+}
+
+/**
+ * Read PER NumericString.
+ * @param s stream
+ * @param num_str numeric string
+ * @param length string length
+ * @param min minimum string length
+ */
+
+boolean per_read_numeric_string(STREAM* s, int min)
+{
+       int i;
+       int length;
+       uint16 mlength;
+
+       per_read_length(s, &mlength);
+
+       length = mlength + min;
+
+       for (i = 0; i < length; i += 2)
+       {
+               stream_seek(s, 1);
+       }
+
+       return true;
+}
+
+/**
+ * Write PER NumericString.
+ * @param s stream
+ * @param num_str numeric string
+ * @param length string length
+ * @param min minimum string length
+ */
+
+void per_write_numeric_string(STREAM* s, uint8* num_str, int length, int min)
+{
+       int i;
+       int mlength;
+       uint8 num, c1, c2;
+
+       mlength = (length - min >= 0) ? length - min : min;
+
+       per_write_length(s, mlength);
+
+       for (i = 0; i < length; i += 2)
+       {
+               c1 = num_str[i];
+               c2 = ((i + 1) < length) ? num_str[i + 1] : 0x30;
+
+               c1 = (c1 - 0x30) % 10;
+               c2 = (c2 - 0x30) % 10;
+               num = (c1 << 4) | c2;
+
+               stream_write_uint8(s, num); /* string */
+       }
+}
diff --git a/libfreerdp-core/per.h b/libfreerdp-core/per.h
new file mode 100644 (file)
index 0000000..f246cfe
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * ASN.1 Packed Encoding Rules (BER)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __PER_H
+#define __PER_H
+
+#include <freerdp/utils/stream.h>
+
+boolean per_read_length(STREAM* s, uint16* length);
+void per_write_length(STREAM* s, int length);
+boolean per_read_choice(STREAM* s, uint8* choice);
+void per_write_choice(STREAM* s, uint8 choice);
+boolean per_read_selection(STREAM* s, uint8* selection);
+void per_write_selection(STREAM* s, uint8 selection);
+boolean per_read_number_of_sets(STREAM* s, uint8* number);
+void per_write_number_of_sets(STREAM* s, uint8 number);
+boolean per_read_padding(STREAM* s, int length);
+void per_write_padding(STREAM* s, int length);
+boolean per_read_integer(STREAM* s, uint32* integer);
+boolean per_read_integer16(STREAM* s, uint16* integer, uint16 min);
+void per_write_integer(STREAM* s, uint32 integer);
+void per_write_integer16(STREAM* s, uint16 integer, uint16 min);
+boolean per_read_enumerated(STREAM* s, uint8* enumerated, uint8 count);
+void per_write_enumerated(STREAM* s, uint8 enumerated, uint8 count);
+void per_write_object_identifier(STREAM* s, uint8 oid[6]);
+boolean per_read_object_identifier(STREAM* s, uint8 oid[6]);
+boolean per_read_octet_string(STREAM* s, uint8* oct_str, int length, int min);
+void per_write_octet_string(STREAM* s, uint8* oct_str, int length, int min);
+boolean per_read_numeric_string(STREAM* s, int min);
+void per_write_numeric_string(STREAM* s, uint8* num_str, int length, int min);
+
+#endif /* __PER_H */
diff --git a/libfreerdp-core/rdp.c b/libfreerdp-core/rdp.c
new file mode 100644 (file)
index 0000000..8d499e8
--- /dev/null
@@ -0,0 +1,919 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Core
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rdp.h"
+
+#include "info.h"
+#include "per.h"
+#include "redirection.h"
+
+static const char* const DATA_PDU_TYPE_STRINGS[] =
+{
+               "", "", /* 0x00 - 0x01 */
+               "Update", /* 0x02 */
+               "", "", "", "", "", "", "", "", /* 0x03 - 0x0A */
+               "", "", "", "", "", "", "", "", "", /* 0x0B - 0x13 */
+               "Control", /* 0x14 */
+               "", "", "", "", "", "", /* 0x15 - 0x1A */
+               "Pointer", /* 0x1B */
+               "Input", /* 0x1C */
+               "", "", /* 0x1D - 0x1E */
+               "Synchronize", /* 0x1F */
+               "", /* 0x20 */
+               "Refresh Rect", /* 0x21 */
+               "Play Sound", /* 0x22 */
+               "Suppress Output", /* 0x23 */
+               "Shutdown Request", /* 0x24 */
+               "Shutdown Denied", /* 0x25 */
+               "Save Session Info", /* 0x26 */
+               "Font List", /* 0x27 */
+               "Font Map", /* 0x28 */
+               "Set Keyboard Indicators", /* 0x29 */
+               "", /* 0x2A */
+               "Bitmap Cache Persistent List", /* 0x2B */
+               "Bitmap Cache Error", /* 0x2C */
+               "Set Keyboard IME Status", /* 0x2D */
+               "Offscreen Cache Error", /* 0x2E */
+               "Set Error Info", /* 0x2F */
+               "Draw Nine Grid Error", /* 0x30 */
+               "Draw GDI+ Error", /* 0x31 */
+               "ARC Status", /* 0x32 */
+               "", "", "", /* 0x33 - 0x35 */
+               "Status Info", /* 0x36 */
+               "Monitor Layout" /* 0x37 */
+               "", "", "", /* 0x38 - 0x40 */
+               "", "", "", "", "", "" /* 0x41 - 0x46 */
+};
+
+/**
+ * Read RDP Security Header.\n
+ * @msdn{cc240579}
+ * @param s stream
+ * @param flags security flags
+ */
+
+void rdp_read_security_header(STREAM* s, uint16* flags)
+{
+       /* Basic Security Header */
+       stream_read_uint16(s, *flags); /* flags */
+       stream_seek(s, 2); /* flagsHi (unused) */
+}
+
+/**
+ * Write RDP Security Header.\n
+ * @msdn{cc240579}
+ * @param s stream
+ * @param flags security flags
+ */
+
+void rdp_write_security_header(STREAM* s, uint16 flags)
+{
+       /* Basic Security Header */
+       stream_write_uint16(s, flags); /* flags */
+       stream_write_uint16(s, 0); /* flagsHi (unused) */
+}
+
+boolean rdp_read_share_control_header(STREAM* s, uint16* length, uint16* type, uint16* channel_id)
+{
+       /* Share Control Header */
+       stream_read_uint16(s, *length); /* totalLength */
+
+       if (*length - 2 > stream_get_left(s))
+               return false;
+
+       stream_read_uint16(s, *type); /* pduType */
+       *type &= 0x0F; /* type is in the 4 least significant bits */
+
+       if (*length > 4)
+               stream_read_uint16(s, *channel_id); /* pduSource */
+       else /* Windows XP can send such short DEACTIVATE_ALL PDUs. */
+               *channel_id = 0;
+
+       return true;
+}
+
+void rdp_write_share_control_header(STREAM* s, uint16 length, uint16 type, uint16 channel_id)
+{
+       length -= RDP_PACKET_HEADER_MAX_LENGTH;
+
+       /* Share Control Header */
+       stream_write_uint16(s, length); /* totalLength */
+       stream_write_uint16(s, type | 0x10); /* pduType */
+       stream_write_uint16(s, channel_id); /* pduSource */
+}
+
+boolean rdp_read_share_data_header(STREAM* s, uint16* length, uint8* type, uint32* share_id,
+                                       uint8 *compressed_type, uint16 *compressed_len)
+{
+       if (stream_get_left(s) < 12)
+               return false;
+
+       /* Share Data Header */
+       stream_read_uint32(s, *share_id); /* shareId (4 bytes) */
+       stream_seek_uint8(s); /* pad1 (1 byte) */
+       stream_seek_uint8(s); /* streamId (1 byte) */
+       stream_read_uint16(s, *length); /* uncompressedLength (2 bytes) */
+       stream_read_uint8(s, *type); /* pduType2, Data PDU Type (1 byte) */
+
+       if (*type & 0x80)
+       {
+               stream_read_uint8(s, *compressed_type); /* compressedType (1 byte) */
+               stream_read_uint16(s, *compressed_len); /* compressedLength (2 bytes) */
+       }
+       else
+       {
+               stream_seek(s, 3);
+               *compressed_type = 0;
+               *compressed_len = 0;
+       }
+
+       return true;
+}
+
+void rdp_write_share_data_header(STREAM* s, uint16 length, uint8 type, uint32 share_id)
+{
+       length -= RDP_PACKET_HEADER_MAX_LENGTH;
+       length -= RDP_SHARE_CONTROL_HEADER_LENGTH;
+       length -= RDP_SHARE_DATA_HEADER_LENGTH;
+
+       /* Share Data Header */
+       stream_write_uint32(s, share_id); /* shareId (4 bytes) */
+       stream_write_uint8(s, 0); /* pad1 (1 byte) */
+       stream_write_uint8(s, STREAM_LOW); /* streamId (1 byte) */
+       stream_write_uint16(s, length); /* uncompressedLength (2 bytes) */
+       stream_write_uint8(s, type); /* pduType2, Data PDU Type (1 byte) */
+       stream_write_uint8(s, 0); /* compressedType (1 byte) */
+       stream_write_uint16(s, 0); /* compressedLength (2 bytes) */
+}
+
+static int rdp_security_stream_init(rdpRdp* rdp, STREAM* s)
+{
+       if (rdp->do_crypt)
+       {
+               stream_seek(s, 12);
+               if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+                       stream_seek(s, 4);
+               rdp->sec_flags |= SEC_ENCRYPT;
+               if (rdp->do_secure_checksum)
+                       rdp->sec_flags |= SEC_SECURE_CHECKSUM;
+       }
+       else if (rdp->sec_flags != 0)
+       {
+               stream_seek(s, 4);
+       }
+       return 0;
+}
+
+/**
+ * Initialize an RDP packet stream.\n
+ * @param rdp rdp module
+ * @return
+ */
+
+STREAM* rdp_send_stream_init(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = transport_send_stream_init(rdp->transport, 2048);
+       stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
+       rdp_security_stream_init(rdp, s);
+
+       return s;
+}
+
+STREAM* rdp_pdu_init(rdpRdp* rdp)
+{
+       STREAM* s;
+       s = transport_send_stream_init(rdp->transport, 2048);
+       stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
+       rdp_security_stream_init(rdp, s);
+       stream_seek(s, RDP_SHARE_CONTROL_HEADER_LENGTH);
+       return s;
+}
+
+STREAM* rdp_data_pdu_init(rdpRdp* rdp)
+{
+       STREAM* s;
+       s = transport_send_stream_init(rdp->transport, 2048);
+       stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH);
+       rdp_security_stream_init(rdp, s);
+       stream_seek(s, RDP_SHARE_CONTROL_HEADER_LENGTH);
+       stream_seek(s, RDP_SHARE_DATA_HEADER_LENGTH);
+       return s;
+}
+
+/**
+ * Read an RDP packet header.\n
+ * @param rdp rdp module
+ * @param s stream
+ * @param length RDP packet length
+ * @param channel_id channel id
+ */
+
+boolean rdp_read_header(rdpRdp* rdp, STREAM* s, uint16* length, uint16* channel_id)
+{
+       uint16 initiator;
+       enum DomainMCSPDU MCSPDU;
+
+       MCSPDU = (rdp->settings->server_mode) ? DomainMCSPDU_SendDataRequest : DomainMCSPDU_SendDataIndication;
+       mcs_read_domain_mcspdu_header(s, &MCSPDU, length);
+
+       if (*length - 8 > stream_get_left(s))
+               return false;
+
+       if (MCSPDU == DomainMCSPDU_DisconnectProviderUltimatum)
+       {
+               uint8 reason;
+
+               (void) per_read_enumerated(s, &reason, 0);
+
+               rdp->disconnect = true;
+
+               return true;
+       }
+
+       per_read_integer16(s, &initiator, MCS_BASE_CHANNEL_ID); /* initiator (UserId) */
+       per_read_integer16(s, channel_id, 0); /* channelId */
+       stream_seek(s, 1); /* dataPriority + Segmentation (0x70) */
+       per_read_length(s, length); /* userData (OCTET_STRING) */
+
+       if (*length > stream_get_left(s))
+               return false;
+
+       return true;
+}
+
+/**
+ * Write an RDP packet header.\n
+ * @param rdp rdp module
+ * @param s stream
+ * @param length RDP packet length
+ * @param channel_id channel id
+ */
+
+void rdp_write_header(rdpRdp* rdp, STREAM* s, uint16 length, uint16 channel_id)
+{
+       int body_length;
+       enum DomainMCSPDU MCSPDU;
+
+       MCSPDU = (rdp->settings->server_mode) ? DomainMCSPDU_SendDataIndication : DomainMCSPDU_SendDataRequest;
+
+       if ((rdp->sec_flags & SEC_ENCRYPT) && (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS))
+       {
+               int pad;
+
+               body_length = length - RDP_PACKET_HEADER_MAX_LENGTH - 16;
+               pad = 8 - (body_length % 8);
+               if (pad != 8)
+                       length += pad;
+       }
+
+       mcs_write_domain_mcspdu_header(s, MCSPDU, length, 0);
+       per_write_integer16(s, rdp->mcs->user_id, MCS_BASE_CHANNEL_ID); /* initiator */
+       per_write_integer16(s, channel_id, 0); /* channelId */
+       stream_write_uint8(s, 0x70); /* dataPriority + segmentation */
+       /*
+        * We always encode length in two bytes, eventhough we could use
+        * only one byte if length <= 0x7F. It is just easier that way,
+        * because we can leave room for fixed-length header, store all
+        * the data first and then store the header.
+        */
+       length = (length - RDP_PACKET_HEADER_MAX_LENGTH) | 0x8000;
+       stream_write_uint16_be(s, length); /* userData (OCTET_STRING) */
+}
+
+static uint32 rdp_security_stream_out(rdpRdp* rdp, STREAM* s, int length)
+{
+       uint8* data;
+       uint32 sec_flags;
+       uint32 pad = 0;
+
+       sec_flags = rdp->sec_flags;
+
+       if (sec_flags != 0)
+       {
+               rdp_write_security_header(s, sec_flags);
+
+               if (sec_flags & SEC_ENCRYPT)
+               {
+                       if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+                       {
+                               data = s->p + 12;
+
+                               length = length - (data - s->data);
+                               stream_write_uint16(s, 0x10); /* length */
+                               stream_write_uint8(s, 0x1); /* TSFIPS_VERSION 1*/
+
+                               /* handle padding */
+                               pad = 8 - (length % 8);
+
+                               if (pad == 8)
+                                       pad = 0;
+                               if (pad)
+                                       memset(data+length, 0, pad);
+
+                               stream_write_uint8(s, pad);
+
+                               security_hmac_signature(data, length, s->p, rdp);
+                               stream_seek(s, 8);
+                               security_fips_encrypt(data, length + pad, rdp);
+                       }
+                       else
+                       {
+                               data = s->p + 8;
+                               length = length - (data - s->data);
+                               if (sec_flags & SEC_SECURE_CHECKSUM)
+                                       security_salted_mac_signature(rdp, data, length, true, s->p);
+                               else
+                                       security_mac_signature(rdp, data, length, s->p);
+                               stream_seek(s, 8);
+                               security_encrypt(s->p, length, rdp);
+                       }
+               }
+
+               rdp->sec_flags = 0;
+       }
+
+       return pad;
+}
+
+static uint32 rdp_get_sec_bytes(rdpRdp* rdp)
+{
+       uint32 sec_bytes;
+
+       if (rdp->sec_flags & SEC_ENCRYPT)
+       {
+               sec_bytes = 12;
+
+               if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+                       sec_bytes += 4;
+       }
+       else if (rdp->sec_flags != 0)
+       {
+               sec_bytes = 4;
+       }
+       else
+       {
+               sec_bytes = 0;
+       }
+
+       return sec_bytes;
+}
+
+/**
+ * Send an RDP packet.\n
+ * @param rdp RDP module
+ * @param s stream
+ * @param channel_id channel id
+ */
+
+boolean rdp_send(rdpRdp* rdp, STREAM* s, uint16 channel_id)
+{
+       uint16 length;
+       uint32 sec_bytes;
+       uint8* sec_hold;
+
+       length = stream_get_length(s);
+       stream_set_pos(s, 0);
+
+       rdp_write_header(rdp, s, length, channel_id);
+
+       sec_bytes = rdp_get_sec_bytes(rdp);
+       sec_hold = s->p;
+       stream_seek(s, sec_bytes);
+
+       s->p = sec_hold;
+       length += rdp_security_stream_out(rdp, s, length);
+
+       stream_set_pos(s, length);
+       if (transport_write(rdp->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+boolean rdp_send_pdu(rdpRdp* rdp, STREAM* s, uint16 type, uint16 channel_id)
+{
+       uint16 length;
+       uint32 sec_bytes;
+       uint8* sec_hold;
+
+       length = stream_get_length(s);
+       stream_set_pos(s, 0);
+
+       rdp_write_header(rdp, s, length, MCS_GLOBAL_CHANNEL_ID);
+
+       sec_bytes = rdp_get_sec_bytes(rdp);
+       sec_hold = s->p;
+       stream_seek(s, sec_bytes);
+
+       rdp_write_share_control_header(s, length - sec_bytes, type, channel_id);
+
+       s->p = sec_hold;
+       length += rdp_security_stream_out(rdp, s, length);
+
+       stream_set_pos(s, length);
+       if (transport_write(rdp->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+boolean rdp_send_data_pdu(rdpRdp* rdp, STREAM* s, uint8 type, uint16 channel_id)
+{
+       uint16 length;
+       uint32 sec_bytes;
+       uint8* sec_hold;
+
+       length = stream_get_length(s);
+       stream_set_pos(s, 0);
+
+       rdp_write_header(rdp, s, length, MCS_GLOBAL_CHANNEL_ID);
+
+       sec_bytes = rdp_get_sec_bytes(rdp);
+       sec_hold = s->p;
+       stream_seek(s, sec_bytes);
+
+       rdp_write_share_control_header(s, length - sec_bytes, PDU_TYPE_DATA, channel_id);
+       rdp_write_share_data_header(s, length - sec_bytes, type, rdp->settings->share_id);
+
+       s->p = sec_hold;
+       length += rdp_security_stream_out(rdp, s, length);
+
+       stream_set_pos(s, length);
+       if (transport_write(rdp->transport, s) < 0)
+               return false;
+
+       return true;
+}
+
+void rdp_recv_set_error_info_data_pdu(rdpRdp* rdp, STREAM* s)
+{
+       stream_read_uint32(s, rdp->errorInfo); /* errorInfo (4 bytes) */
+
+       if (rdp->errorInfo != ERRINFO_SUCCESS)
+               rdp_print_errinfo(rdp->errorInfo);
+}
+
+void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint8 type;
+       uint16 length;
+       uint32 share_id;
+       uint8 compressed_type;
+       uint16 compressed_len;
+
+       rdp_read_share_data_header(s, &length, &type, &share_id, &compressed_type, &compressed_len);
+
+#ifdef WITH_DEBUG_RDP
+       if (type != DATA_PDU_TYPE_UPDATE)
+               printf("recv %s Data PDU (0x%02X), length:%d\n", DATA_PDU_TYPE_STRINGS[type], type, length);
+#endif
+
+       switch (type)
+       {
+               case DATA_PDU_TYPE_UPDATE:
+                       update_recv(rdp->update, s);
+                       break;
+
+               case DATA_PDU_TYPE_CONTROL:
+                       rdp_recv_server_control_pdu(rdp, s);
+                       break;
+
+               case DATA_PDU_TYPE_POINTER:
+                       update_recv_pointer(rdp->update, s);
+                       break;
+
+               case DATA_PDU_TYPE_INPUT:
+                       break;
+
+               case DATA_PDU_TYPE_SYNCHRONIZE:
+                       rdp_recv_synchronize_pdu(rdp, s);
+                       break;
+
+               case DATA_PDU_TYPE_REFRESH_RECT:
+                       break;
+
+               case DATA_PDU_TYPE_PLAY_SOUND:
+                       update_recv_play_sound(rdp->update, s);
+                       break;
+
+               case DATA_PDU_TYPE_SUPPRESS_OUTPUT:
+                       break;
+
+               case DATA_PDU_TYPE_SHUTDOWN_REQUEST:
+                       break;
+
+               case DATA_PDU_TYPE_SHUTDOWN_DENIED:
+                       break;
+
+               case DATA_PDU_TYPE_SAVE_SESSION_INFO:
+                       rdp_recv_save_session_info(rdp, s);
+                       break;
+
+               case DATA_PDU_TYPE_FONT_LIST:
+                       break;
+
+               case DATA_PDU_TYPE_FONT_MAP:
+                       rdp_recv_font_map_pdu(rdp, s);
+                       break;
+
+               case DATA_PDU_TYPE_SET_KEYBOARD_INDICATORS:
+                       break;
+
+               case DATA_PDU_TYPE_BITMAP_CACHE_PERSISTENT_LIST:
+                       break;
+
+               case DATA_PDU_TYPE_BITMAP_CACHE_ERROR:
+                       break;
+
+               case DATA_PDU_TYPE_SET_KEYBOARD_IME_STATUS:
+                       break;
+
+               case DATA_PDU_TYPE_OFFSCREEN_CACHE_ERROR:
+                       break;
+
+               case DATA_PDU_TYPE_SET_ERROR_INFO:
+                       rdp_recv_set_error_info_data_pdu(rdp, s);
+                       break;
+
+               case DATA_PDU_TYPE_DRAW_NINEGRID_ERROR:
+                       break;
+
+               case DATA_PDU_TYPE_DRAW_GDIPLUS_ERROR:
+                       break;
+
+               case DATA_PDU_TYPE_ARC_STATUS:
+                       break;
+
+               case DATA_PDU_TYPE_STATUS_INFO:
+                       break;
+
+               case DATA_PDU_TYPE_MONITOR_LAYOUT:
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+boolean rdp_recv_out_of_sequence_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 type;
+       uint16 length;
+       uint16 channelId;
+
+       rdp_read_share_control_header(s, &length, &type, &channelId);
+
+       if (type == PDU_TYPE_DATA)
+       {
+               rdp_recv_data_pdu(rdp, s);
+               return true;
+       }
+       else if (type == PDU_TYPE_SERVER_REDIRECTION)
+       {
+               rdp_recv_enhanced_security_redirection_packet(rdp, s);
+               return true;
+       }
+       else
+       {
+               return false;
+       }
+}
+
+/**
+ * Decrypt an RDP packet.\n
+ * @param rdp RDP module
+ * @param s stream
+ * @param length int
+ */
+
+boolean rdp_decrypt(rdpRdp* rdp, STREAM* s, int length, uint16 securityFlags)
+{
+       uint8 cmac[8], wmac[8];
+
+       if (rdp->settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+       {
+               uint16 len;
+               uint8 version, pad;
+               uint8 *sig;
+
+               stream_read_uint16(s, len); /* 0x10 */
+               stream_read_uint8(s, version); /* 0x1 */
+               stream_read_uint8(s, pad);
+
+               sig = s->p;
+               stream_seek(s, 8);      /* signature */
+
+               length -= 12;
+
+               if (!security_fips_decrypt(s->p, length, rdp))
+               {
+                       printf("FATAL: cannot decrypt\n");
+                       return false; /* TODO */
+               }
+
+               if (!security_fips_check_signature(s->p, length - pad, sig, rdp))
+               {
+                       printf("FATAL: invalid packet signature\n");
+                       return false; /* TODO */
+               }
+
+               /* is this what needs adjusting? */
+               s->size -= pad;
+               return true;
+       }
+
+       stream_read(s, wmac, sizeof(wmac));
+       length -= sizeof(wmac);
+       security_decrypt(s->p, length, rdp);
+       if (securityFlags & SEC_SECURE_CHECKSUM)
+               security_salted_mac_signature(rdp, s->p, length, false, cmac);
+       else
+               security_mac_signature(rdp, s->p, length, cmac);
+       if (memcmp(wmac, cmac, sizeof(wmac)) != 0)
+       {
+               printf("WARNING: invalid packet signature\n");
+               /*
+                * Because Standard RDP Security is totally broken,
+                * and cannot protect against MITM, don't treat signature
+                * verification failure as critical. This at least enables
+                * us to work with broken RDP clients and servers that
+                * generate invalid signatures.
+                */
+               //return false;
+       }
+       return true;
+}
+
+/**
+ * Process an RDP packet.\n
+ * @param rdp RDP module
+ * @param s stream
+ */
+
+static boolean rdp_recv_tpkt_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 length;
+       uint16 pduType;
+       uint16 pduLength;
+       uint16 pduSource;
+       uint16 channelId;
+       uint16 securityFlags;
+
+       if (!rdp_read_header(rdp, s, &length, &channelId))
+       {
+               printf("Incorrect RDP header.\n");
+               return false;
+       }
+
+       if (rdp->settings->encryption)
+       {
+               rdp_read_security_header(s, &securityFlags);
+               if (securityFlags & (SEC_ENCRYPT|SEC_REDIRECTION_PKT))
+               {
+                       if (!rdp_decrypt(rdp, s, length - 4, securityFlags))
+                       {
+                               printf("rdp_decrypt failed\n");
+                               return false;
+                       }
+               }
+               if (securityFlags & SEC_REDIRECTION_PKT)
+               {
+                       /*
+                        * [MS-RDPBCGR] 2.2.13.2.1
+                        *  - no share control header, nor the 2 byte pad
+                        */
+                       s->p -= 2;
+                       rdp_recv_enhanced_security_redirection_packet(rdp, s);
+                       return true;
+               }
+       }
+
+       if (channelId != MCS_GLOBAL_CHANNEL_ID)
+       {
+               freerdp_channel_process(rdp->instance, s, channelId);
+       }
+       else
+       {
+               rdp_read_share_control_header(s, &pduLength, &pduType, &pduSource);
+
+               rdp->settings->pdu_source = pduSource;
+
+               switch (pduType)
+               {
+                       case PDU_TYPE_DATA:
+                               rdp_recv_data_pdu(rdp, s);
+                               break;
+
+                       case PDU_TYPE_DEACTIVATE_ALL:
+                               if (!rdp_recv_deactivate_all(rdp, s))
+                                       return false;
+                               break;
+
+                       case PDU_TYPE_SERVER_REDIRECTION:
+                               rdp_recv_enhanced_security_redirection_packet(rdp, s);
+                               break;
+
+                       default:
+                               printf("incorrect PDU type: 0x%04X\n", pduType);
+                               break;
+               }
+       }
+
+       return true;
+}
+
+static boolean rdp_recv_fastpath_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 length;
+       rdpFastPath* fastpath;
+
+       fastpath = rdp->fastpath;
+       length = fastpath_read_header_rdp(fastpath, s);
+
+       if (length == 0 || length > stream_get_left(s))
+       {
+               printf("incorrect FastPath PDU header length %d\n", length);
+               return false;
+       }
+
+       if (fastpath->encryptionFlags & FASTPATH_OUTPUT_ENCRYPTED)
+       {
+               rdp_decrypt(rdp, s, length, (fastpath->encryptionFlags & FASTPATH_OUTPUT_SECURE_CHECKSUM) ? SEC_SECURE_CHECKSUM : 0);
+       }
+
+       return fastpath_recv_updates(rdp->fastpath, s);
+}
+
+static boolean rdp_recv_pdu(rdpRdp* rdp, STREAM* s)
+{
+       if (tpkt_verify_header(s))
+               return rdp_recv_tpkt_pdu(rdp, s);
+       else
+               return rdp_recv_fastpath_pdu(rdp, s);
+}
+
+/**
+ * Receive an RDP packet.\n
+ * @param rdp RDP module
+ */
+
+void rdp_recv(rdpRdp* rdp)
+{
+       STREAM* s;
+
+       s = transport_recv_stream_init(rdp->transport, 4096);
+       transport_read(rdp->transport, s);
+
+       rdp_recv_pdu(rdp, s);
+}
+
+static boolean rdp_recv_callback(rdpTransport* transport, STREAM* s, void* extra)
+{
+       rdpRdp* rdp = (rdpRdp*) extra;
+
+       switch (rdp->state)
+       {
+               case CONNECTION_STATE_NEGO:
+                       if (!rdp_client_connect_mcs_connect_response(rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_MCS_ATTACH_USER:
+                       if (!rdp_client_connect_mcs_attach_user_confirm(rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_MCS_CHANNEL_JOIN:
+                       if (!rdp_client_connect_mcs_channel_join_confirm(rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_LICENSE:
+                       if (!rdp_client_connect_license(rdp, s))
+                               return false;
+                       break;
+
+               case CONNECTION_STATE_CAPABILITY:
+                       if (!rdp_client_connect_demand_active(rdp, s))
+                       {
+                               printf("rdp_client_connect_demand_active failed\n");
+                               return false;
+                       }
+                       break;
+
+               case CONNECTION_STATE_FINALIZATION:
+                       if (!rdp_recv_pdu(rdp, s))
+                               return false;
+                       if (rdp->finalize_sc_pdus == FINALIZE_SC_COMPLETE)
+                               rdp->state = CONNECTION_STATE_ACTIVE;
+                       break;
+
+               case CONNECTION_STATE_ACTIVE:
+                       if (!rdp_recv_pdu(rdp, s))
+                               return false;
+                       break;
+
+               default:
+                       printf("Invalid state %d\n", rdp->state);
+                       return false;
+       }
+
+       return true;
+}
+
+int rdp_send_channel_data(rdpRdp* rdp, int channel_id, uint8* data, int size)
+{
+       return freerdp_channel_send(rdp, channel_id, data, size);
+}
+
+/**
+ * Set non-blocking mode information.
+ * @param rdp RDP module
+ * @param blocking blocking mode
+ */
+void rdp_set_blocking_mode(rdpRdp* rdp, boolean blocking)
+{
+       rdp->transport->recv_callback = rdp_recv_callback;
+       rdp->transport->recv_extra = rdp;
+       transport_set_blocking_mode(rdp->transport, blocking);
+}
+
+int rdp_check_fds(rdpRdp* rdp)
+{
+       return transport_check_fds(rdp->transport);
+}
+
+/**
+ * Instantiate new RDP module.
+ * @return new RDP module
+ */
+
+rdpRdp* rdp_new(freerdp* instance)
+{
+       rdpRdp* rdp;
+
+       rdp = (rdpRdp*) xzalloc(sizeof(rdpRdp));
+
+       if (rdp != NULL)
+       {
+               rdp->instance = instance;
+               rdp->settings = settings_new((void*) instance);
+               if (instance != NULL)
+                       instance->settings = rdp->settings;
+               rdp->extension = extension_new(instance);
+               rdp->transport = transport_new(rdp->settings);
+               rdp->license = license_new(rdp);
+               rdp->input = input_new(rdp);
+               rdp->update = update_new(rdp);
+               rdp->fastpath = fastpath_new(rdp);
+               rdp->nego = nego_new(rdp->transport);
+               rdp->mcs = mcs_new(rdp->transport);
+               rdp->redirection = redirection_new();
+               rdp->mppc = mppc_new(rdp);
+       }
+
+       return rdp;
+}
+
+/**
+ * Free RDP module.
+ * @param rdp RDP module to be freed
+ */
+
+void rdp_free(rdpRdp* rdp)
+{
+       if (rdp != NULL)
+       {
+               extension_free(rdp->extension);
+               settings_free(rdp->settings);
+               transport_free(rdp->transport);
+               license_free(rdp->license);
+               input_free(rdp->input);
+               update_free(rdp->update);
+               fastpath_free(rdp->fastpath);
+               nego_free(rdp->nego);
+               mcs_free(rdp->mcs);
+               redirection_free(rdp->redirection);
+               mppc_free(rdp);
+               xfree(rdp);
+       }
+}
+
diff --git a/libfreerdp-core/rdp.h b/libfreerdp-core/rdp.h
new file mode 100644 (file)
index 0000000..4a295f1
--- /dev/null
@@ -0,0 +1,205 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Core
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __RDP_H
+#define __RDP_H
+
+#include "mcs.h"
+#include "tpkt.h"
+#include "fastpath.h"
+#include "tpdu.h"
+#include "nego.h"
+#include "input.h"
+#include "update.h"
+#include "license.h"
+#include "errinfo.h"
+#include "extension.h"
+#include "security.h"
+#include "transport.h"
+#include "connection.h"
+#include "redirection.h"
+#include "capabilities.h"
+#include "channel.h"
+#include "mppc.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+
+/* Security Header Flags */
+#define SEC_EXCHANGE_PKT               0x0001
+#define SEC_ENCRYPT                    0x0008
+#define SEC_RESET_SEQNO                        0x0010
+#define        SEC_IGNORE_SEQNO                0x0020
+#define        SEC_INFO_PKT                    0x0040
+#define        SEC_LICENSE_PKT                 0x0080
+#define SEC_LICENSE_ENCRYPT_CS         0x0200
+#define SEC_LICENSE_ENCRYPT_SC         0x0200
+#define SEC_REDIRECTION_PKT            0x0400
+#define SEC_SECURE_CHECKSUM            0x0800
+#define SEC_FLAGSHI_VALID              0x8000
+
+#define SEC_PKT_CS_MASK                        (SEC_EXCHANGE_PKT | SEC_INFO_PKT)
+#define SEC_PKT_SC_MASK                        (SEC_LICENSE_PKT | SEC_REDIRECTION_PKT)
+#define SEC_PKT_MASK                   (SEC_PKT_CS_MASK | SEC_PKT_SC_MASK)
+
+#define RDP_SECURITY_HEADER_LENGTH     4
+#define RDP_SHARE_CONTROL_HEADER_LENGTH        6
+#define RDP_SHARE_DATA_HEADER_LENGTH   12
+#define RDP_PACKET_HEADER_MAX_LENGTH   (TPDU_DATA_LENGTH + MCS_SEND_DATA_HEADER_MAX_LENGTH)
+
+#define PDU_TYPE_DEMAND_ACTIVE         0x1
+#define PDU_TYPE_CONFIRM_ACTIVE                0x3
+#define PDU_TYPE_DEACTIVATE_ALL                0x6
+#define PDU_TYPE_DATA                  0x7
+#define PDU_TYPE_SERVER_REDIRECTION    0xA
+
+#define FINALIZE_SC_SYNCHRONIZE_PDU            0x01
+#define FINALIZE_SC_CONTROL_COOPERATE_PDU      0x02
+#define FINALIZE_SC_CONTROL_GRANTED_PDU                0x04
+#define FINALIZE_SC_FONT_MAP_PDU               0x08
+#define FINALIZE_SC_COMPLETE                   0x0F
+
+/* Data PDU Types */
+#define DATA_PDU_TYPE_UPDATE                                   0x02
+#define DATA_PDU_TYPE_CONTROL                                  0x14
+#define DATA_PDU_TYPE_POINTER                                  0x1B
+#define DATA_PDU_TYPE_INPUT                                    0x1C
+#define DATA_PDU_TYPE_SYNCHRONIZE                              0x1F
+#define DATA_PDU_TYPE_REFRESH_RECT                             0x21
+#define DATA_PDU_TYPE_PLAY_SOUND                               0x22
+#define DATA_PDU_TYPE_SUPPRESS_OUTPUT                          0x23
+#define DATA_PDU_TYPE_SHUTDOWN_REQUEST                         0x24
+#define DATA_PDU_TYPE_SHUTDOWN_DENIED                          0x25
+#define DATA_PDU_TYPE_SAVE_SESSION_INFO                                0x26
+#define DATA_PDU_TYPE_FONT_LIST                                        0x27
+#define DATA_PDU_TYPE_FONT_MAP                                 0x28
+#define DATA_PDU_TYPE_SET_KEYBOARD_INDICATORS                  0x29
+#define DATA_PDU_TYPE_BITMAP_CACHE_PERSISTENT_LIST             0x2B
+#define DATA_PDU_TYPE_BITMAP_CACHE_ERROR                       0x2C
+#define DATA_PDU_TYPE_SET_KEYBOARD_IME_STATUS                  0x2D
+#define DATA_PDU_TYPE_OFFSCREEN_CACHE_ERROR                    0x2E
+#define DATA_PDU_TYPE_SET_ERROR_INFO                           0x2F
+#define DATA_PDU_TYPE_DRAW_NINEGRID_ERROR                      0x30
+#define DATA_PDU_TYPE_DRAW_GDIPLUS_ERROR                       0x31
+#define DATA_PDU_TYPE_ARC_STATUS                               0x32
+#define DATA_PDU_TYPE_STATUS_INFO                              0x36
+#define DATA_PDU_TYPE_MONITOR_LAYOUT                           0x37
+
+/* Compression Types */
+#define PACKET_COMPRESSED              0x20
+#define PACKET_AT_FRONT                        0x40
+#define PACKET_FLUSHED                 0x80
+#define PACKET_COMPR_TYPE_8K           0x00
+#define PACKET_COMPR_TYPE_64K          0x01
+#define PACKET_COMPR_TYPE_RDP6         0x02
+#define PACKET_COMPR_TYPE_RDP61                0x03
+#define CompressionTypeMask            0x0F
+
+/* Stream Identifiers */
+#define STREAM_UNDEFINED               0x00
+#define STREAM_LOW                     0x01
+#define STREAM_MED                     0x02
+#define STREAM_HI                      0x04
+
+struct rdp_rdp
+{
+       int state;
+       freerdp* instance;
+       struct rdp_mcs* mcs;
+       struct rdp_nego* nego;
+       struct rdp_input* input;
+       struct rdp_update* update;
+       struct rdp_fastpath* fastpath;
+       struct rdp_license* license;
+       struct rdp_redirection* redirection;
+       struct rdp_settings* settings;
+       struct rdp_transport* transport;
+       struct rdp_extension* extension;
+       struct rdp_mppc* mppc;
+       struct crypto_rc4_struct* rc4_decrypt_key;
+       int decrypt_use_count;
+       struct crypto_rc4_struct* rc4_encrypt_key;
+       int encrypt_use_count;
+       struct crypto_des3_struct* fips_encrypt;
+       struct crypto_des3_struct* fips_decrypt;
+       struct crypto_hmac_struct* fips_hmac;
+       uint32 sec_flags;
+       boolean do_crypt;
+       boolean do_secure_checksum;
+       uint8 sign_key[16];
+       uint8 decrypt_key[16];
+       uint8 encrypt_key[16];
+       uint8 decrypt_update_key[16];
+       uint8 encrypt_update_key[16];
+       int rc4_key_len;
+       uint8 fips_sign_key[20];
+       uint8 fips_encrypt_key[24];
+       uint8 fips_decrypt_key[24];
+       uint32 errorInfo;
+       uint32 finalize_sc_pdus;
+       boolean disconnect;
+};
+
+void rdp_read_security_header(STREAM* s, uint16* flags);
+void rdp_write_security_header(STREAM* s, uint16 flags);
+
+boolean rdp_read_share_control_header(STREAM* s, uint16* length, uint16* type, uint16* channel_id);
+void rdp_write_share_control_header(STREAM* s, uint16 length, uint16 type, uint16 channel_id);
+
+boolean rdp_read_share_data_header(STREAM* s, uint16* length, uint8* type, uint32* share_id, 
+                       uint8 *compressed_type, uint16 *compressed_len);
+
+void rdp_write_share_data_header(STREAM* s, uint16 length, uint8 type, uint32 share_id);
+
+STREAM* rdp_send_stream_init(rdpRdp* rdp);
+
+boolean rdp_read_header(rdpRdp* rdp, STREAM* s, uint16* length, uint16* channel_id);
+void rdp_write_header(rdpRdp* rdp, STREAM* s, uint16 length, uint16 channel_id);
+
+STREAM* rdp_pdu_init(rdpRdp* rdp);
+boolean rdp_send_pdu(rdpRdp* rdp, STREAM* s, uint16 type, uint16 channel_id);
+
+STREAM* rdp_data_pdu_init(rdpRdp* rdp);
+boolean rdp_send_data_pdu(rdpRdp* rdp, STREAM* s, uint8 type, uint16 channel_id);
+void rdp_recv_data_pdu(rdpRdp* rdp, STREAM* s);
+
+boolean rdp_send(rdpRdp* rdp, STREAM* s, uint16 channel_id);
+void rdp_recv(rdpRdp* rdp);
+
+int rdp_send_channel_data(rdpRdp* rdp, int channel_id, uint8* data, int size);
+
+boolean rdp_recv_out_of_sequence_pdu(rdpRdp* rdp, STREAM* s);
+
+void rdp_set_blocking_mode(rdpRdp* rdp, boolean blocking);
+int rdp_check_fds(rdpRdp* rdp);
+
+rdpRdp* rdp_new(freerdp* instance);
+void rdp_free(rdpRdp* rdp);
+
+#ifdef WITH_DEBUG_RDP
+#define DEBUG_RDP(fmt, ...) DEBUG_CLASS(RDP, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_RDP(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+boolean rdp_decrypt(rdpRdp* rdp, STREAM* s, int length, uint16 securityFlags);
+
+#endif /* __RDP_H */
diff --git a/libfreerdp-core/redirection.c b/libfreerdp-core/redirection.c
new file mode 100644 (file)
index 0000000..113c65a
--- /dev/null
@@ -0,0 +1,225 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Server Redirection
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "connection.h"
+
+#include "redirection.h"
+
+void rdp_print_redirection_flags(uint32 flags)
+{
+       printf("redirectionFlags = {\n");
+
+       if (flags & LB_TARGET_NET_ADDRESS)
+               printf("\tLB_TARGET_NET_ADDRESS\n");
+       if (flags & LB_LOAD_BALANCE_INFO)
+               printf("\tLB_LOAD_BALANCE_INFO\n");
+       if (flags & LB_USERNAME)
+               printf("\tLB_USERNAME\n");
+       if (flags & LB_DOMAIN)
+               printf("\tLB_DOMAIN\n");
+       if (flags & LB_PASSWORD)
+               printf("\tLB_PASSWORD\n");
+       if (flags & LB_DONTSTOREUSERNAME)
+               printf("\tLB_DONTSTOREUSERNAME\n");
+       if (flags & LB_SMARTCARD_LOGON)
+               printf("\tLB_SMARTCARD_LOGON\n");
+       if (flags & LB_NOREDIRECT)
+               printf("\tLB_NOREDIRECT\n");
+       if (flags & LB_TARGET_FQDN)
+               printf("\tLB_TARGET_FQDN\n");
+       if (flags & LB_TARGET_NETBIOS_NAME)
+               printf("\tLB_TARGET_NETBIOS_NAME\n");
+       if (flags & LB_TARGET_NET_ADDRESSES)
+               printf("\tLB_TARGET_NET_ADDRESSES\n");
+       if (flags & LB_CLIENT_TSV_URL)
+               printf("\tLB_CLIENT_TSV_URL\n");
+       if (flags & LB_SERVER_TSV_CAPABLE)
+               printf("\tLB_SERVER_TSV_CAPABLE\n");
+
+       printf("}\n");
+}
+
+boolean rdp_recv_server_redirection_pdu(rdpRdp* rdp, STREAM* s)
+{
+       uint16 flags;
+       uint16 length;
+       rdpRedirection* redirection = rdp->redirection;
+
+       stream_read_uint16(s, flags); /* flags (2 bytes) */
+       stream_read_uint16(s, length); /* length (2 bytes) */
+       stream_read_uint32(s, redirection->sessionID); /* sessionID (4 bytes) */
+       stream_read_uint32(s, redirection->flags); /* redirFlags (4 bytes) */
+
+       DEBUG_REDIR("flags: 0x%04X, length:%d, sessionID:0x%08X", flags, length, redirection->sessionID);
+
+#ifdef WITH_DEBUG_REDIR
+       rdp_print_redirection_flags(redirection->flags);
+#endif
+
+       if (redirection->flags & LB_TARGET_NET_ADDRESS)
+       {
+               freerdp_string_read_length32(s, &redirection->targetNetAddress, rdp->settings->uniconv);
+               DEBUG_REDIR("targetNetAddress: %s", redirection->targetNetAddress.ascii);
+       }
+
+       if (redirection->flags & LB_LOAD_BALANCE_INFO)
+       {
+               uint32 loadBalanceInfoLength;
+               stream_read_uint32(s, loadBalanceInfoLength);
+               freerdp_blob_alloc(&redirection->loadBalanceInfo, loadBalanceInfoLength);
+               stream_read(s, redirection->loadBalanceInfo.data, loadBalanceInfoLength);
+#ifdef WITH_DEBUG_REDIR
+               DEBUG_REDIR("loadBalanceInfo:");
+               freerdp_hexdump(redirection->loadBalanceInfo.data, redirection->loadBalanceInfo.length);
+#endif
+       }
+
+       if (redirection->flags & LB_USERNAME)
+       {
+               freerdp_string_read_length32(s, &redirection->username, rdp->settings->uniconv);
+               DEBUG_REDIR("username: %s", redirection->username.ascii);
+       }
+
+       if (redirection->flags & LB_DOMAIN)
+       {
+               freerdp_string_read_length32(s, &redirection->domain, rdp->settings->uniconv);
+               DEBUG_REDIR("domain: %s", redirection->domain.ascii);
+       }
+
+       if (redirection->flags & LB_PASSWORD)
+       {
+               uint32 passwordLength;
+               stream_read_uint32(s, passwordLength);
+               freerdp_blob_alloc(&redirection->password_cookie, passwordLength);
+               stream_read(s, redirection->password_cookie.data, passwordLength);
+
+#ifdef WITH_DEBUG_REDIR
+               DEBUG_REDIR("password_cookie:");
+               freerdp_hexdump(redirection->password_cookie.data, redirection->password_cookie.length);
+#endif
+       }
+
+       if (redirection->flags & LB_TARGET_FQDN)
+       {
+               freerdp_string_read_length32(s, &redirection->targetFQDN, rdp->settings->uniconv);
+               DEBUG_REDIR("targetFQDN: %s", redirection->targetFQDN.ascii);
+       }
+
+       if (redirection->flags & LB_TARGET_NETBIOS_NAME)
+       {
+               freerdp_string_read_length32(s, &redirection->targetNetBiosName, rdp->settings->uniconv);
+               DEBUG_REDIR("targetNetBiosName: %s", redirection->targetNetBiosName.ascii);
+       }
+
+       if (redirection->flags & LB_CLIENT_TSV_URL)
+       {
+               freerdp_string_read_length32(s, &redirection->tsvUrl, rdp->settings->uniconv);
+               DEBUG_REDIR("tsvUrl: %s", redirection->tsvUrl.ascii);
+       }
+
+       if (redirection->flags & LB_TARGET_NET_ADDRESSES)
+       {
+               int i;
+               uint32 count;
+               uint32 targetNetAddressesLength;
+
+               stream_read_uint32(s, targetNetAddressesLength);
+
+               stream_read_uint32(s, redirection->targetNetAddressesCount);
+               count = redirection->targetNetAddressesCount;
+
+               redirection->targetNetAddresses = (rdpString*) xzalloc(count * sizeof(rdpString));
+
+               for (i = 0; i < (int) count; i++)
+               {
+                       freerdp_string_read_length32(s, &redirection->targetNetAddresses[i], rdp->settings->uniconv);
+                       DEBUG_REDIR("targetNetAddresses: %s", (&redirection->targetNetAddresses[i])->ascii);
+               }
+       }
+
+       stream_seek(s, 8); /* pad (8 bytes) */
+
+       if (redirection->flags & LB_NOREDIRECT)
+               return true;
+       else
+               return rdp_client_redirect(rdp);
+}
+
+boolean rdp_recv_redirection_packet(rdpRdp* rdp, STREAM* s)
+{
+       rdp_recv_server_redirection_pdu(rdp, s);
+       return true;
+}
+
+boolean rdp_recv_enhanced_security_redirection_packet(rdpRdp* rdp, STREAM* s)
+{
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+       rdp_recv_server_redirection_pdu(rdp, s);
+       stream_seek_uint8(s); /* pad2Octets (1 byte) */
+       return true;
+}
+
+rdpRedirection* redirection_new()
+{
+       rdpRedirection* redirection;
+
+       redirection = (rdpRedirection*) xzalloc(sizeof(rdpRedirection));
+
+       if (redirection != NULL)
+       {
+
+       }
+
+       return redirection;
+}
+
+void redirection_free(rdpRedirection* redirection)
+{
+       if (redirection != NULL)
+       {
+               //these four have already been freed in settings_free() and freerdp_string_free() checks for NULL
+               redirection->username.ascii = NULL;
+               redirection->domain.ascii = NULL;
+               redirection->targetNetAddress.ascii = NULL;
+               redirection->targetNetBiosName.ascii = NULL;
+
+               freerdp_string_free(&redirection->tsvUrl);
+               freerdp_string_free(&redirection->username);
+               freerdp_string_free(&redirection->domain);
+               freerdp_blob_free(&redirection->password_cookie);
+               freerdp_string_free(&redirection->targetFQDN);
+               freerdp_string_free(&redirection->targetNetBiosName);
+               freerdp_string_free(&redirection->targetNetAddress);
+               freerdp_blob_free(&redirection->loadBalanceInfo);
+
+               if (redirection->targetNetAddresses != NULL)
+               {
+                       int i;
+
+                       for (i = 0; i < (int) redirection->targetNetAddressesCount; i++)
+                               freerdp_string_free(&redirection->targetNetAddresses[i]);
+
+                       xfree(redirection->targetNetAddresses);
+               }
+
+               xfree(redirection);
+       }
+}
+
+
diff --git a/libfreerdp-core/redirection.h b/libfreerdp-core/redirection.h
new file mode 100644 (file)
index 0000000..efbb13d
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Server Redirection
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __REDIRECTION_H
+#define __REDIRECTION_H
+
+#include "rdp.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/blob.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/string.h>
+
+/* Redirection Flags */
+#define LB_TARGET_NET_ADDRESS          0x00000001
+#define LB_LOAD_BALANCE_INFO           0x00000002
+#define LB_USERNAME                    0x00000004
+#define LB_DOMAIN                      0x00000008
+#define LB_PASSWORD                    0x00000010
+#define LB_DONTSTOREUSERNAME           0x00000020
+#define LB_SMARTCARD_LOGON             0x00000040
+#define LB_NOREDIRECT                  0x00000080
+#define LB_TARGET_FQDN                 0x00000100
+#define LB_TARGET_NETBIOS_NAME         0x00000200
+#define LB_TARGET_NET_ADDRESSES                0x00000800
+#define LB_CLIENT_TSV_URL              0x00001000
+#define LB_SERVER_TSV_CAPABLE          0x00002000
+
+struct rdp_redirection
+{
+       uint32 flags;
+       uint32 sessionID;
+       rdpString tsvUrl;
+       rdpString username;
+       rdpString domain;
+       rdpBlob password_cookie;
+       rdpString targetFQDN;
+       rdpBlob loadBalanceInfo;
+       rdpString targetNetBiosName;
+       rdpString targetNetAddress;
+       uint32 targetNetAddressesCount;
+       rdpString* targetNetAddresses;
+};
+typedef struct rdp_redirection rdpRedirection;
+
+boolean rdp_recv_redirection_packet(rdpRdp* rdp, STREAM* s);
+boolean rdp_recv_enhanced_security_redirection_packet(rdpRdp* rdp, STREAM* s);
+
+rdpRedirection* redirection_new();
+void redirection_free(rdpRedirection* redirection);
+
+#ifdef WITH_DEBUG_REDIR
+#define DEBUG_REDIR(fmt, ...) DEBUG_CLASS(REDIR, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_REDIR(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __REDIRECTION_H */
diff --git a/libfreerdp-core/security.c b/libfreerdp-core/security.c
new file mode 100644 (file)
index 0000000..8df8a65
--- /dev/null
@@ -0,0 +1,525 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Security
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "security.h"
+
+/* 0x36 repeated 40 times */
+static const uint8 pad1[40] =
+{
+       "\x36\x36\x36\x36\x36\x36\x36\x36"
+       "\x36\x36\x36\x36\x36\x36\x36\x36"
+       "\x36\x36\x36\x36\x36\x36\x36\x36"
+       "\x36\x36\x36\x36\x36\x36\x36\x36"
+       "\x36\x36\x36\x36\x36\x36\x36\x36"
+};
+
+/* 0x5C repeated 48 times */
+static const uint8 pad2[48] =
+{
+       "\x5C\x5C\x5C\x5C\x5C\x5C\x5C\x5C"
+       "\x5C\x5C\x5C\x5C\x5C\x5C\x5C\x5C"
+       "\x5C\x5C\x5C\x5C\x5C\x5C\x5C\x5C"
+       "\x5C\x5C\x5C\x5C\x5C\x5C\x5C\x5C"
+       "\x5C\x5C\x5C\x5C\x5C\x5C\x5C\x5C"
+       "\x5C\x5C\x5C\x5C\x5C\x5C\x5C\x5C"
+};
+
+static const uint8
+fips_reverse_table[256] =
+{
+       0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+       0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+       0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+       0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+       0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+       0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+       0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+       0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+       0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+       0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+       0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+       0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+       0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+       0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+       0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+       0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+       0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+       0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+       0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+       0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+       0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+       0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+       0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+       0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+       0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+       0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+       0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+       0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+       0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+       0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+       0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+       0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+static const uint8
+fips_oddparity_table[256] =
+{
+       0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x07, 0x07,
+       0x08, 0x08, 0x0b, 0x0b, 0x0d, 0x0d, 0x0e, 0x0e,
+       0x10, 0x10, 0x13, 0x13, 0x15, 0x15, 0x16, 0x16,
+       0x19, 0x19, 0x1a, 0x1a, 0x1c, 0x1c, 0x1f, 0x1f,
+       0x20, 0x20, 0x23, 0x23, 0x25, 0x25, 0x26, 0x26,
+       0x29, 0x29, 0x2a, 0x2a, 0x2c, 0x2c, 0x2f, 0x2f,
+       0x31, 0x31, 0x32, 0x32, 0x34, 0x34, 0x37, 0x37,
+       0x38, 0x38, 0x3b, 0x3b, 0x3d, 0x3d, 0x3e, 0x3e,
+       0x40, 0x40, 0x43, 0x43, 0x45, 0x45, 0x46, 0x46,
+       0x49, 0x49, 0x4a, 0x4a, 0x4c, 0x4c, 0x4f, 0x4f,
+       0x51, 0x51, 0x52, 0x52, 0x54, 0x54, 0x57, 0x57,
+       0x58, 0x58, 0x5b, 0x5b, 0x5d, 0x5d, 0x5e, 0x5e,
+       0x61, 0x61, 0x62, 0x62, 0x64, 0x64, 0x67, 0x67,
+       0x68, 0x68, 0x6b, 0x6b, 0x6d, 0x6d, 0x6e, 0x6e,
+       0x70, 0x70, 0x73, 0x73, 0x75, 0x75, 0x76, 0x76,
+       0x79, 0x79, 0x7a, 0x7a, 0x7c, 0x7c, 0x7f, 0x7f,
+       0x80, 0x80, 0x83, 0x83, 0x85, 0x85, 0x86, 0x86,
+       0x89, 0x89, 0x8a, 0x8a, 0x8c, 0x8c, 0x8f, 0x8f,
+       0x91, 0x91, 0x92, 0x92, 0x94, 0x94, 0x97, 0x97,
+       0x98, 0x98, 0x9b, 0x9b, 0x9d, 0x9d, 0x9e, 0x9e,
+       0xa1, 0xa1, 0xa2, 0xa2, 0xa4, 0xa4, 0xa7, 0xa7,
+       0xa8, 0xa8, 0xab, 0xab, 0xad, 0xad, 0xae, 0xae,
+       0xb0, 0xb0, 0xb3, 0xb3, 0xb5, 0xb5, 0xb6, 0xb6,
+       0xb9, 0xb9, 0xba, 0xba, 0xbc, 0xbc, 0xbf, 0xbf,
+       0xc1, 0xc1, 0xc2, 0xc2, 0xc4, 0xc4, 0xc7, 0xc7,
+       0xc8, 0xc8, 0xcb, 0xcb, 0xcd, 0xcd, 0xce, 0xce,
+       0xd0, 0xd0, 0xd3, 0xd3, 0xd5, 0xd5, 0xd6, 0xd6,
+       0xd9, 0xd9, 0xda, 0xda, 0xdc, 0xdc, 0xdf, 0xdf,
+       0xe0, 0xe0, 0xe3, 0xe3, 0xe5, 0xe5, 0xe6, 0xe6,
+       0xe9, 0xe9, 0xea, 0xea, 0xec, 0xec, 0xef, 0xef,
+       0xf1, 0xf1, 0xf2, 0xf2, 0xf4, 0xf4, 0xf7, 0xf7,
+       0xf8, 0xf8, 0xfb, 0xfb, 0xfd, 0xfd, 0xfe, 0xfe
+};
+
+static void security_salted_hash(uint8* salt, uint8* input, int length, uint8* salt1, uint8* salt2, uint8* output)
+{
+       CryptoMd5 md5;
+       CryptoSha1 sha1;
+       uint8 sha1_digest[CRYPTO_SHA1_DIGEST_LENGTH];
+
+       /* SaltedHash(Salt, Input, Salt1, Salt2) = MD5(S + SHA1(Input + Salt + Salt1 + Salt2)) */
+
+       /* SHA1_Digest = SHA1(Input + Salt + Salt1 + Salt2) */
+       sha1 = crypto_sha1_init();
+       crypto_sha1_update(sha1, input, length); /* Input */
+       crypto_sha1_update(sha1, salt, 48); /* Salt (48 bytes) */
+       crypto_sha1_update(sha1, salt1, 32); /* Salt1 (32 bytes) */
+       crypto_sha1_update(sha1, salt2, 32); /* Salt2 (32 bytes) */
+       crypto_sha1_final(sha1, sha1_digest);
+
+       /* SaltedHash(Salt, Input, Salt1, Salt2) = MD5(S + SHA1_Digest) */
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, salt, 48); /* Salt (48 bytes) */
+       crypto_md5_update(md5, sha1_digest, sizeof(sha1_digest)); /* SHA1_Digest */
+       crypto_md5_final(md5, output);
+}
+
+static void security_premaster_hash(char* input, int length, uint8* premaster_secret, uint8* client_random, uint8* server_random, uint8* output)
+{
+       /* PremasterHash(Input) = SaltedHash(PremasterSecret, Input, ClientRandom, ServerRandom) */
+       security_salted_hash(premaster_secret, (uint8*)input, length, client_random, server_random, output);
+}
+
+void security_master_secret(uint8* premaster_secret, uint8* client_random, uint8* server_random, uint8* output)
+{
+       /* MasterSecret = PremasterHash('A') + PremasterHash('BB') + PremasterHash('CCC') */
+       security_premaster_hash("A", 1, premaster_secret, client_random, server_random, &output[0]);
+       security_premaster_hash("BB", 2, premaster_secret, client_random, server_random, &output[16]);
+       security_premaster_hash("CCC", 3, premaster_secret, client_random, server_random, &output[32]);
+}
+
+static void security_master_hash(char* input, int length, uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
+{
+       /* MasterHash(Input) = SaltedHash(MasterSecret, Input, ServerRandom, ClientRandom) */
+       security_salted_hash(master_secret, (uint8*)input, length, server_random, client_random, output);
+}
+
+void security_session_key_blob(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
+{
+       /* MasterHash = MasterHash('A') + MasterHash('BB') + MasterHash('CCC') */
+       security_master_hash("A", 1, master_secret, client_random, server_random, &output[0]);
+       security_master_hash("BB", 2, master_secret, client_random, server_random, &output[16]);
+       security_master_hash("CCC", 3, master_secret, client_random, server_random, &output[32]);
+}
+
+void security_mac_salt_key(uint8* session_key_blob, uint8* client_random, uint8* server_random, uint8* output)
+{
+       /* MacSaltKey = First128Bits(SessionKeyBlob) */
+       memcpy(output, session_key_blob, 16);
+}
+
+void security_md5_16_32_32(uint8* in0, uint8* in1, uint8* in2, uint8* output)
+{
+       CryptoMd5 md5;
+
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, in0, 16);
+       crypto_md5_update(md5, in1, 32);
+       crypto_md5_update(md5, in2, 32);
+       crypto_md5_final(md5, output);
+}
+
+void security_licensing_encryption_key(uint8* session_key_blob, uint8* client_random, uint8* server_random, uint8* output)
+{
+       /* LicensingEncryptionKey = MD5(Second128Bits(SessionKeyBlob) + ClientRandom + ServerRandom)) */
+       security_md5_16_32_32(&session_key_blob[16], client_random, server_random, output);
+}
+
+void security_uint32_le(uint8* output, uint32 value)
+{
+       output[0] = (value) & 0xFF;
+       output[1] = (value >> 8) & 0xFF;
+       output[2] = (value >> 16) & 0xFF;
+       output[3] = (value >> 24) & 0xFF;
+}
+
+void security_mac_data(uint8* mac_salt_key, uint8* data, uint32 length, uint8* output)
+{
+       CryptoMd5 md5;
+       CryptoSha1 sha1;
+       uint8 length_le[4];
+       uint8 sha1_digest[CRYPTO_SHA1_DIGEST_LENGTH];
+
+       /* MacData = MD5(MacSaltKey + pad2 + SHA1(MacSaltKey + pad1 + length + data)) */
+
+       security_uint32_le(length_le, length); /* length must be little-endian */
+
+       /* SHA1_Digest = SHA1(MacSaltKey + pad1 + length + data) */
+       sha1 = crypto_sha1_init();
+       crypto_sha1_update(sha1, mac_salt_key, 16); /* MacSaltKey */
+       crypto_sha1_update(sha1, pad1, sizeof(pad1)); /* pad1 */
+       crypto_sha1_update(sha1, length_le, sizeof(length_le)); /* length */
+       crypto_sha1_update(sha1, data, length); /* data */
+       crypto_sha1_final(sha1, sha1_digest);
+
+       /* MacData = MD5(MacSaltKey + pad2 + SHA1_Digest) */
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, mac_salt_key, 16); /* MacSaltKey */
+       crypto_md5_update(md5, pad2, sizeof(pad2)); /* pad2 */
+       crypto_md5_update(md5, sha1_digest, sizeof(sha1_digest)); /* SHA1_Digest */
+       crypto_md5_final(md5, output);
+}
+
+void security_mac_signature(rdpRdp *rdp, uint8* data, uint32 length, uint8* output)
+{
+       CryptoMd5 md5;
+       CryptoSha1 sha1;
+       uint8 length_le[4];
+       uint8 md5_digest[CRYPTO_MD5_DIGEST_LENGTH];
+       uint8 sha1_digest[CRYPTO_SHA1_DIGEST_LENGTH];
+
+       security_uint32_le(length_le, length); /* length must be little-endian */
+
+       /* SHA1_Digest = SHA1(MACKeyN + pad1 + length + data) */
+       sha1 = crypto_sha1_init();
+       crypto_sha1_update(sha1, rdp->sign_key, rdp->rc4_key_len); /* MacKeyN */
+       crypto_sha1_update(sha1, pad1, sizeof(pad1)); /* pad1 */
+       crypto_sha1_update(sha1, length_le, sizeof(length_le)); /* length */
+       crypto_sha1_update(sha1, data, length); /* data */
+       crypto_sha1_final(sha1, sha1_digest);
+
+       /* MACSignature = First64Bits(MD5(MACKeyN + pad2 + SHA1_Digest)) */
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, rdp->sign_key, rdp->rc4_key_len); /* MacKeyN */
+       crypto_md5_update(md5, pad2, sizeof(pad2)); /* pad2 */
+       crypto_md5_update(md5, sha1_digest, sizeof(sha1_digest)); /* SHA1_Digest */
+       crypto_md5_final(md5, md5_digest);
+
+       memcpy(output, md5_digest, 8);
+}
+
+void security_salted_mac_signature(rdpRdp *rdp, uint8* data, uint32 length, boolean encryption, uint8* output)
+{
+       CryptoMd5 md5;
+       CryptoSha1 sha1;
+       uint8 length_le[4];
+       uint8 use_count_le[4];
+       uint8 md5_digest[CRYPTO_MD5_DIGEST_LENGTH];
+       uint8 sha1_digest[CRYPTO_SHA1_DIGEST_LENGTH];
+
+       security_uint32_le(length_le, length); /* length must be little-endian */
+       if (encryption)
+               security_uint32_le(use_count_le, rdp->encrypt_use_count);
+       else
+       {
+               /*
+                * We calculate checksum on plain text, so we must have already
+                * decrypt it, which means decrypt_use_count is off by one.
+                */
+               security_uint32_le(use_count_le, rdp->decrypt_use_count - 1);
+       }
+
+       /* SHA1_Digest = SHA1(MACKeyN + pad1 + length + data) */
+       sha1 = crypto_sha1_init();
+       crypto_sha1_update(sha1, rdp->sign_key, rdp->rc4_key_len); /* MacKeyN */
+       crypto_sha1_update(sha1, pad1, sizeof(pad1)); /* pad1 */
+       crypto_sha1_update(sha1, length_le, sizeof(length_le)); /* length */
+       crypto_sha1_update(sha1, data, length); /* data */
+       crypto_sha1_update(sha1, use_count_le, sizeof(use_count_le)); /* encryptionCount */
+       crypto_sha1_final(sha1, sha1_digest);
+
+       /* MACSignature = First64Bits(MD5(MACKeyN + pad2 + SHA1_Digest)) */
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, rdp->sign_key, rdp->rc4_key_len); /* MacKeyN */
+       crypto_md5_update(md5, pad2, sizeof(pad2)); /* pad2 */
+       crypto_md5_update(md5, sha1_digest, sizeof(sha1_digest)); /* SHA1_Digest */
+       crypto_md5_final(md5, md5_digest);
+
+       memcpy(output, md5_digest, 8);
+}
+
+static void security_A(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
+{
+       security_premaster_hash("A", 1, master_secret, client_random, server_random, &output[0]);
+       security_premaster_hash("BB", 2, master_secret, client_random, server_random, &output[16]);
+       security_premaster_hash("CCC", 3, master_secret, client_random, server_random, &output[32]);
+}
+
+static void security_X(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output)
+{
+       security_premaster_hash("X", 1, master_secret, client_random, server_random, &output[0]);
+       security_premaster_hash("YY", 2, master_secret, client_random, server_random, &output[16]);
+       security_premaster_hash("ZZZ", 3, master_secret, client_random, server_random, &output[32]);
+}
+
+static void fips_expand_key_bits(uint8* in, uint8* out)
+{
+       uint8 buf[21], c;
+       int i, b, p, r;
+
+       /* reverse every byte in the key */
+       for (i = 0; i < 21; i++)
+               buf[i] = fips_reverse_table[in[i]];
+
+       /* insert a zero-bit after every 7th bit */
+       for (i = 0, b = 0; i < 24; i++, b += 7)
+       {
+               p = b / 8;
+               r = b % 8;
+               if (r == 0)
+               {
+                       out[i] = buf[p] & 0xfe;
+               }
+               else
+               {
+                       /* c is accumulator */
+                       c = buf[p] << r;
+                       c |= buf[p + 1] >> (8 - r);
+                       out[i] = c & 0xfe;
+               }
+       }
+
+       /* reverse every byte */
+       /* alter lsb so the byte has odd parity */
+       for (i = 0; i < 24; i++)
+               out[i] = fips_oddparity_table[fips_reverse_table[out[i]]];
+}
+
+boolean security_establish_keys(uint8* client_random, rdpRdp* rdp)
+{
+       uint8 pre_master_secret[48];
+       uint8 master_secret[48];
+       uint8 session_key_blob[48];
+       uint8* server_random;
+       uint8 salt40[] = { 0xD1, 0x26, 0x9E };
+       rdpSettings* settings;
+
+       settings = rdp->settings;
+       server_random = settings->server_random->data;
+
+       if (settings->encryption_method == ENCRYPTION_METHOD_FIPS)
+       {
+               CryptoSha1 sha1;
+               uint8 client_encrypt_key_t[CRYPTO_SHA1_DIGEST_LENGTH + 1];
+               uint8 client_decrypt_key_t[CRYPTO_SHA1_DIGEST_LENGTH + 1];
+
+               printf("FIPS Compliant encryption level.\n");
+
+               sha1 = crypto_sha1_init();
+               crypto_sha1_update(sha1, client_random + 16, 16);
+               crypto_sha1_update(sha1, server_random + 16, 16);
+               crypto_sha1_final(sha1, client_encrypt_key_t);
+
+               client_encrypt_key_t[20] = client_encrypt_key_t[0];
+               fips_expand_key_bits(client_encrypt_key_t, rdp->fips_encrypt_key);
+
+               sha1 = crypto_sha1_init();
+               crypto_sha1_update(sha1, client_random, 16);
+               crypto_sha1_update(sha1, server_random, 16);
+               crypto_sha1_final(sha1, client_decrypt_key_t);
+
+               client_decrypt_key_t[20] = client_decrypt_key_t[0];
+               fips_expand_key_bits(client_decrypt_key_t, rdp->fips_decrypt_key);
+
+               sha1 = crypto_sha1_init();
+               crypto_sha1_update(sha1, client_decrypt_key_t, 20);
+               crypto_sha1_update(sha1, client_encrypt_key_t, 20);
+               crypto_sha1_final(sha1, rdp->fips_sign_key);
+       }
+
+       memcpy(pre_master_secret, client_random, 24);
+       memcpy(pre_master_secret + 24, server_random, 24);
+
+       security_A(pre_master_secret, client_random, server_random, master_secret);
+       security_X(master_secret, client_random, server_random, session_key_blob);
+
+       memcpy(rdp->sign_key, session_key_blob, 16);
+
+       if (rdp->settings->server_mode) {
+               security_md5_16_32_32(&session_key_blob[16], client_random,
+                   server_random, rdp->encrypt_key);
+               security_md5_16_32_32(&session_key_blob[32], client_random,
+                   server_random, rdp->decrypt_key);
+       } else {
+               security_md5_16_32_32(&session_key_blob[16], client_random,
+                   server_random, rdp->decrypt_key);
+               security_md5_16_32_32(&session_key_blob[32], client_random,
+                   server_random, rdp->encrypt_key);
+       }
+
+       if (settings->encryption_method == 1) /* 40 and 56 bit */
+       {
+               memcpy(rdp->sign_key, salt40, 3); /* TODO 56 bit */
+               memcpy(rdp->decrypt_key, salt40, 3); /* TODO 56 bit */
+               memcpy(rdp->encrypt_key, salt40, 3); /* TODO 56 bit */
+               rdp->rc4_key_len = 8;
+       }
+       else if (settings->encryption_method == 2) /* 128 bit */
+       {
+               rdp->rc4_key_len = 16;
+       }
+
+       memcpy(rdp->decrypt_update_key, rdp->decrypt_key, 16);
+       memcpy(rdp->encrypt_update_key, rdp->encrypt_key, 16);
+
+       return true;
+}
+
+boolean security_key_update(uint8* key, uint8* update_key, int key_len)
+{
+       uint8 sha1h[CRYPTO_SHA1_DIGEST_LENGTH];
+       CryptoMd5 md5;
+       CryptoSha1 sha1;
+       CryptoRc4 rc4;
+       uint8 salt40[] = { 0xD1, 0x26, 0x9E };
+
+       sha1 = crypto_sha1_init();
+       crypto_sha1_update(sha1, update_key, key_len);
+       crypto_sha1_update(sha1, pad1, sizeof(pad1));
+       crypto_sha1_update(sha1, key, key_len);
+       crypto_sha1_final(sha1, sha1h);
+
+       md5 = crypto_md5_init();
+       crypto_md5_update(md5, update_key, key_len);
+       crypto_md5_update(md5, pad2, sizeof(pad2));
+       crypto_md5_update(md5, sha1h, sizeof(sha1h));
+       crypto_md5_final(md5, key);
+
+       rc4 = crypto_rc4_init(key, key_len);
+       crypto_rc4(rc4, key_len, key, key);
+       crypto_rc4_free(rc4);
+
+       if (key_len == 8)
+               memcpy(key, salt40, 3); /* TODO 56 bit */
+
+       return true;
+}
+
+boolean security_encrypt(uint8* data, int length, rdpRdp* rdp)
+{
+       if (rdp->encrypt_use_count >= 4096)
+       {
+               security_key_update(rdp->encrypt_key, rdp->encrypt_update_key, rdp->rc4_key_len);
+               crypto_rc4_free(rdp->rc4_encrypt_key);
+               rdp->rc4_encrypt_key = crypto_rc4_init(rdp->encrypt_key, rdp->rc4_key_len);
+               rdp->encrypt_use_count = 0;
+       }
+       crypto_rc4(rdp->rc4_encrypt_key, length, data, data);
+       rdp->encrypt_use_count += 1;
+       return true;
+}
+
+boolean security_decrypt(uint8* data, int length, rdpRdp* rdp)
+{
+       if (rdp->decrypt_use_count >= 4096)
+       {
+               security_key_update(rdp->decrypt_key, rdp->decrypt_update_key, rdp->rc4_key_len);
+               crypto_rc4_free(rdp->rc4_decrypt_key);
+               rdp->rc4_decrypt_key = crypto_rc4_init(rdp->decrypt_key, rdp->rc4_key_len);
+               rdp->decrypt_use_count = 0;
+       }
+       crypto_rc4(rdp->rc4_decrypt_key, length, data, data);
+       rdp->decrypt_use_count += 1;
+       return true;
+}
+
+void security_hmac_signature(uint8* data, int length, uint8* output, rdpRdp* rdp)
+{
+       uint8 buf[20];
+       uint8 use_count_le[4];
+
+       security_uint32_le(use_count_le, rdp->encrypt_use_count);
+
+       crypto_hmac_sha1_init(rdp->fips_hmac, rdp->fips_sign_key, 20);
+       crypto_hmac_update(rdp->fips_hmac, data, length);
+       crypto_hmac_update(rdp->fips_hmac, use_count_le, 4);
+       crypto_hmac_final(rdp->fips_hmac, buf, 20);
+
+       memmove(output, buf, 8);
+}
+
+boolean security_fips_encrypt(uint8* data, int length, rdpRdp* rdp)
+{
+       crypto_des3_encrypt(rdp->fips_encrypt, length, data, data);
+       rdp->encrypt_use_count++;
+       return true;
+}
+
+boolean security_fips_decrypt(uint8* data, int length, rdpRdp* rdp)
+{
+       crypto_des3_decrypt(rdp->fips_decrypt, length, data, data);
+       return true;
+}
+
+boolean security_fips_check_signature(uint8* data, int length, uint8* sig, rdpRdp* rdp)
+{
+       uint8 buf[20];
+       uint8 use_count_le[4];
+
+       security_uint32_le(use_count_le, rdp->decrypt_use_count);
+
+       crypto_hmac_sha1_init(rdp->fips_hmac, rdp->fips_sign_key, 20);
+       crypto_hmac_update(rdp->fips_hmac, data, length);
+       crypto_hmac_update(rdp->fips_hmac, use_count_le, 4);
+       crypto_hmac_final(rdp->fips_hmac, buf, 20);
+
+       rdp->decrypt_use_count++;
+
+       if (memcmp(sig, buf, 8))
+               return false;
+
+       return true;
+}
diff --git a/libfreerdp-core/security.h b/libfreerdp-core/security.h
new file mode 100644 (file)
index 0000000..7f338d3
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Security
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SECURITY_H
+#define __SECURITY_H
+
+#include "rdp.h"
+#include "crypto.h"
+
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+
+void security_master_secret(uint8* premaster_secret, uint8* client_random, uint8* server_random, uint8* output);
+void security_session_key_blob(uint8* master_secret, uint8* client_random, uint8* server_random, uint8* output);
+void security_mac_salt_key(uint8* session_key_blob, uint8* client_random, uint8* server_random, uint8* output);
+void security_licensing_encryption_key(uint8* session_key_blob, uint8* client_random, uint8* server_random, uint8* output);
+void security_mac_data(uint8* mac_salt_key, uint8* data, uint32 length, uint8* output);
+
+void security_mac_signature(rdpRdp *rdp, uint8* data, uint32 length, uint8* output);
+void security_salted_mac_signature(rdpRdp *rdp, uint8* data, uint32 length, boolean encryption, uint8* output);
+boolean security_establish_keys(uint8* client_random, rdpRdp* rdp);
+
+boolean security_encrypt(uint8* data, int length, rdpRdp* rdp);
+boolean security_decrypt(uint8* data, int length, rdpRdp* rdp);
+
+void security_hmac_signature(uint8* data, int length, uint8* output, rdpRdp* rdp);
+boolean security_fips_encrypt(uint8* data, int length, rdpRdp* rdp);
+boolean security_fips_decrypt(uint8* data, int length, rdpRdp* rdp);
+boolean security_fips_check_signature(uint8* data, int length, uint8* sig, rdpRdp* rdp);
+
+#endif /* __SECURITY_H */
diff --git a/libfreerdp-core/settings.c b/libfreerdp-core/settings.c
new file mode 100644 (file)
index 0000000..dbafa5b
--- /dev/null
@@ -0,0 +1,217 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RDP Settings
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include "capabilities.h"
+#include <freerdp/utils/memory.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <freerdp/settings.h>
+#include <freerdp/utils/file.h>
+
+static const char client_dll[] = "C:\\Windows\\System32\\mstscax.dll";
+
+rdpSettings* settings_new(void* instance)
+{
+       rdpSettings* settings;
+
+       settings = (rdpSettings*) xzalloc(sizeof(rdpSettings));
+
+       if (settings != NULL)
+       {
+               settings->instance = instance;
+
+               settings->width = 1024;
+               settings->height = 768;
+               settings->workarea = false;
+               settings->fullscreen = false;
+               settings->grab_keyboard = true;
+               settings->decorations = true;
+               settings->rdp_version = 7;
+               settings->color_depth = 16;
+               settings->nla_security = true;
+               settings->tls_security = true;
+               settings->rdp_security = true;
+               settings->client_build = 2600;
+               settings->kbd_type = 0;
+               settings->kbd_subtype = 0;
+               settings->kbd_fn_keys = 0;
+               settings->kbd_layout = 0;
+               settings->encryption = false;
+               settings->secure_checksum = false;
+               settings->port = 3389;
+               settings->desktop_resize = true;
+
+               settings->performance_flags =
+                               PERF_DISABLE_FULLWINDOWDRAG |
+                               PERF_DISABLE_MENUANIMATIONS |
+                               PERF_DISABLE_WALLPAPER;
+
+               settings->auto_reconnection = true;
+
+               settings->encryption_method = ENCRYPTION_METHOD_NONE;
+               settings->encryption_level = ENCRYPTION_LEVEL_NONE;
+
+               settings->authentication = true;
+
+               settings->order_support[NEG_DSTBLT_INDEX] = true;
+               settings->order_support[NEG_PATBLT_INDEX] = true;
+               settings->order_support[NEG_SCRBLT_INDEX] = true;
+               settings->order_support[NEG_OPAQUE_RECT_INDEX] = true;
+               settings->order_support[NEG_DRAWNINEGRID_INDEX] = true;
+               settings->order_support[NEG_MULTIDSTBLT_INDEX] = true;
+               settings->order_support[NEG_MULTIPATBLT_INDEX] = true;
+               settings->order_support[NEG_MULTISCRBLT_INDEX] = true;
+               settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = true;
+               settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = true;
+               settings->order_support[NEG_LINETO_INDEX] = true;
+               settings->order_support[NEG_POLYLINE_INDEX] = true;
+               settings->order_support[NEG_MEMBLT_INDEX] = true;
+               settings->order_support[NEG_MEM3BLT_INDEX] = true;
+               settings->order_support[NEG_SAVEBITMAP_INDEX] = true;
+               settings->order_support[NEG_GLYPH_INDEX_INDEX] = true;
+               settings->order_support[NEG_FAST_INDEX_INDEX] = true;
+               settings->order_support[NEG_FAST_GLYPH_INDEX] = true;
+               settings->order_support[NEG_POLYGON_SC_INDEX] = true;
+               settings->order_support[NEG_POLYGON_CB_INDEX] = true;
+               settings->order_support[NEG_ELLIPSE_SC_INDEX] = true;
+               settings->order_support[NEG_ELLIPSE_CB_INDEX] = true;
+
+               settings->color_pointer = true;
+               settings->large_pointer = true;
+               settings->pointer_cache_size = 20;
+               settings->sound_beeps = true;
+               settings->disable_wallpaper = false;
+               settings->disable_full_window_drag = false;
+               settings->disable_menu_animations = false;
+               settings->disable_theming = false;
+               settings->connection_type = 0;
+
+               settings->draw_gdi_plus = false;
+
+               settings->frame_marker = false;
+               settings->bitmap_cache_v3 = false;
+
+               settings->bitmap_cache = true;
+               settings->persistent_bitmap_cache = false;
+               settings->bitmapCacheV2CellInfo = xzalloc(sizeof(BITMAP_CACHE_V2_CELL_INFO) * 6);
+
+               settings->refresh_rect = true;
+               settings->suppress_output = true;
+
+               settings->glyph_cache = true;
+               settings->glyphSupportLevel = GLYPH_SUPPORT_NONE;
+               settings->glyphCache = xzalloc(sizeof(GLYPH_CACHE_DEFINITION) * 10);
+               settings->fragCache = xnew(GLYPH_CACHE_DEFINITION);
+               settings->glyphCache[0].cacheEntries = 254;
+               settings->glyphCache[0].cacheMaximumCellSize = 4;
+               settings->glyphCache[1].cacheEntries = 254;
+               settings->glyphCache[1].cacheMaximumCellSize = 4;
+               settings->glyphCache[2].cacheEntries = 254;
+               settings->glyphCache[2].cacheMaximumCellSize = 8;
+               settings->glyphCache[3].cacheEntries = 254;
+               settings->glyphCache[3].cacheMaximumCellSize = 8;
+               settings->glyphCache[4].cacheEntries = 254;
+               settings->glyphCache[4].cacheMaximumCellSize = 16;
+               settings->glyphCache[5].cacheEntries = 254;
+               settings->glyphCache[5].cacheMaximumCellSize = 32;
+               settings->glyphCache[6].cacheEntries = 254;
+               settings->glyphCache[6].cacheMaximumCellSize = 64;
+               settings->glyphCache[7].cacheEntries = 254;
+               settings->glyphCache[7].cacheMaximumCellSize = 128;
+               settings->glyphCache[8].cacheEntries = 254;
+               settings->glyphCache[8].cacheMaximumCellSize = 256;
+               settings->glyphCache[9].cacheEntries = 64;
+               settings->glyphCache[9].cacheMaximumCellSize = 256;
+               settings->fragCache->cacheEntries = 256;
+               settings->fragCache->cacheMaximumCellSize = 256;
+
+               settings->offscreen_bitmap_cache = true;
+               settings->offscreen_bitmap_cache_size = 7680;
+               settings->offscreen_bitmap_cache_entries = 100;
+
+               settings->draw_nine_grid_cache_size = 2560;
+               settings->draw_nine_grid_cache_entries = 256;
+
+               settings->client_dir = xstrdup(client_dll);
+
+               settings->num_icon_caches = 3;
+               settings->num_icon_cache_entries = 12;
+
+               settings->vc_chunk_size = CHANNEL_CHUNK_LENGTH;
+
+               settings->multifrag_max_request_size = 0x200000;
+
+               settings->fastpath_input = true;
+               settings->fastpath_output = true;
+
+               settings->uniconv = freerdp_uniconv_new();
+               gethostname(settings->client_hostname, sizeof(settings->client_hostname) - 1);
+               settings->mouse_motion = true;
+
+               settings->client_auto_reconnect_cookie = xnew(ARC_CS_PRIVATE_PACKET);
+               settings->server_auto_reconnect_cookie = xnew(ARC_SC_PRIVATE_PACKET);
+
+               settings->client_time_zone = xnew(TIME_ZONE_INFO);
+               settings->server_random = xnew(rdpBlob);
+               settings->server_certificate = xnew(rdpBlob);
+
+               freerdp_detect_paths(settings);
+       }
+
+       return settings;
+}
+
+void settings_free(rdpSettings* settings)
+{
+       if (settings != NULL)
+       {
+               freerdp_uniconv_free(settings->uniconv);
+               xfree(settings->hostname);
+               xfree(settings->username);
+               xfree(settings->password);
+               xfree(settings->domain);
+               xfree(settings->shell);
+               xfree(settings->directory);
+               xfree(settings->ip_address);
+               xfree(settings->client_dir);
+               xfree(settings->cert_file);
+               xfree(settings->privatekey_file);
+               freerdp_blob_free(settings->server_random);
+               freerdp_blob_free(settings->server_certificate);
+               xfree(settings->server_random);
+               xfree(settings->server_certificate);
+               xfree(settings->rdp_key_file);
+               certificate_free(settings->server_cert);
+               xfree(settings->client_auto_reconnect_cookie);
+               xfree(settings->server_auto_reconnect_cookie);
+               xfree(settings->client_time_zone);
+               xfree(settings->bitmapCacheV2CellInfo);
+               xfree(settings->glyphCache);
+               xfree(settings->fragCache);
+               key_free(settings->server_key);
+               xfree(settings->config_path);
+               xfree(settings->current_path);
+               xfree(settings->development_path);
+               xfree(settings);
+       }
+}
diff --git a/libfreerdp-core/surface.c b/libfreerdp-core/surface.c
new file mode 100644 (file)
index 0000000..a398c85
--- /dev/null
@@ -0,0 +1,128 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Surface Commands
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/pcap.h>
+
+#include "surface.h"
+
+static int update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s)
+{
+       int pos;
+       SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
+
+       stream_read_uint16(s, cmd->destLeft);
+       stream_read_uint16(s, cmd->destTop);
+       stream_read_uint16(s, cmd->destRight);
+       stream_read_uint16(s, cmd->destBottom);
+       stream_read_uint8(s, cmd->bpp);
+       stream_seek(s, 2); /* reserved1, reserved2 */
+       stream_read_uint8(s, cmd->codecID);
+       stream_read_uint16(s, cmd->width);
+       stream_read_uint16(s, cmd->height);
+       stream_read_uint32(s, cmd->bitmapDataLength);
+       pos = stream_get_pos(s) + cmd->bitmapDataLength;
+       cmd->bitmapData = stream_get_tail(s);
+
+       IFCALL(update->SurfaceBits, update->context, cmd);
+
+       stream_set_pos(s, pos);
+
+       return 20 + cmd->bitmapDataLength;
+}
+
+static int update_recv_surfcmd_frame_marker(rdpUpdate* update, STREAM* s)
+{
+       SURFACE_FRAME_MARKER* marker = &update->surface_frame_marker;
+
+       stream_read_uint16(s, marker->frameAction);
+       stream_read_uint32(s, marker->frameId);
+
+       IFCALL(update->SurfaceFrameMarker, update->context, marker);
+
+       return 6;
+}
+
+boolean update_recv_surfcmds(rdpUpdate* update, uint32 size, STREAM* s)
+{
+       uint8* mark;
+       uint16 cmdType;
+       uint32 cmdLength;
+
+       while (size > 2)
+       {
+               stream_get_mark(s, mark);
+
+               stream_read_uint16(s, cmdType);
+               size -= 2;
+
+               switch (cmdType)
+               {
+                       case CMDTYPE_SET_SURFACE_BITS:
+                       case CMDTYPE_STREAM_SURFACE_BITS:
+                               cmdLength = update_recv_surfcmd_surface_bits(update, s);
+                               break;
+
+                       case CMDTYPE_FRAME_MARKER:
+                               cmdLength = update_recv_surfcmd_frame_marker(update, s);
+                               break;
+
+                       default:
+                               DEBUG_WARN("unknown cmdType 0x%X", cmdType);
+                               return false;
+               }
+
+               size -= cmdLength;
+
+               if (update->dump_rfx)
+               {
+                       pcap_add_record(update->pcap_rfx, mark, cmdLength + 2);
+                       pcap_flush(update->pcap_rfx);
+               }
+       }
+       return true;
+}
+
+void update_write_surfcmd_surface_bits_header(STREAM* s, SURFACE_BITS_COMMAND* cmd)
+{
+       stream_check_size(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH);
+
+       stream_write_uint16(s, CMDTYPE_STREAM_SURFACE_BITS);
+
+       stream_write_uint16(s, cmd->destLeft);
+       stream_write_uint16(s, cmd->destTop);
+       stream_write_uint16(s, cmd->destRight);
+       stream_write_uint16(s, cmd->destBottom);
+       stream_write_uint8(s, cmd->bpp);
+       stream_write_uint16(s, 0); /* reserved1, reserved2 */
+       stream_write_uint8(s, cmd->codecID);
+       stream_write_uint16(s, cmd->width);
+       stream_write_uint16(s, cmd->height);
+       stream_write_uint32(s, cmd->bitmapDataLength);
+}
+
+void update_write_surfcmd_frame_marker(STREAM* s, uint16 frameAction, uint32 frameId)
+{
+       stream_check_size(s, SURFCMD_FRAME_MARKER_LENGTH);
+
+       stream_write_uint16(s, CMDTYPE_FRAME_MARKER);
+
+       stream_write_uint16(s, frameAction);
+       stream_write_uint32(s, frameId);
+}
+
diff --git a/libfreerdp-core/surface.h b/libfreerdp-core/surface.h
new file mode 100644 (file)
index 0000000..c19ed0d
--- /dev/null
@@ -0,0 +1,48 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Surface Commands
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SURFACE
+#define __SURFACE
+
+#include "rdp.h"
+#include <freerdp/utils/stream.h>
+
+#define SURFCMD_SURFACE_BITS_HEADER_LENGTH 22
+#define SURFCMD_FRAME_MARKER_LENGTH 8
+
+enum SURFCMD_CMDTYPE
+{
+       CMDTYPE_SET_SURFACE_BITS = 0x0001,
+       CMDTYPE_FRAME_MARKER = 0x0004,
+       CMDTYPE_STREAM_SURFACE_BITS = 0x0006
+};
+
+enum SURFCMD_FRAMEACTION
+{
+       SURFACECMD_FRAMEACTION_BEGIN = 0x0000,
+       SURFACECMD_FRAMEACTION_END = 0x0001
+};
+
+boolean update_recv_surfcmds(rdpUpdate* update, uint32 size, STREAM* s);
+
+void update_write_surfcmd_surface_bits_header(STREAM* s, SURFACE_BITS_COMMAND* cmd);
+void update_write_surfcmd_frame_marker(STREAM* s, uint16 frameAction, uint32 frameId);
+
+#endif /* __SURFACE */
+
diff --git a/libfreerdp-core/tcp.c b/libfreerdp-core/tcp.c
new file mode 100644 (file)
index 0000000..095f369
--- /dev/null
@@ -0,0 +1,332 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Transmission Control Protocol (TCP)
+ *
+ * Copyright 2011 Vic Lee
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifndef _WIN32
+#include <netdb.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <net/if.h>
+
+#ifdef __APPLE__
+#ifndef TCP_KEEPIDLE
+#define TCP_KEEPIDLE TCP_KEEPALIVE
+#endif
+#endif
+
+#else
+#define SHUT_RDWR SD_BOTH
+#define close(_fd) closesocket(_fd)
+#endif
+
+#include <freerdp/utils/print.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include "tcp.h"
+
+void tcp_get_ip_address(rdpTcp * tcp)
+{
+       uint8* ip;
+       socklen_t length;
+       struct sockaddr_in sockaddr;
+
+       length = sizeof(sockaddr);
+
+       if (getsockname(tcp->sockfd, (struct sockaddr*) &sockaddr, &length) == 0)
+       {
+               ip = (uint8*) (&sockaddr.sin_addr);
+               snprintf(tcp->ip_address, sizeof(tcp->ip_address),
+                        "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
+       }
+       else
+       {
+               strncpy(tcp->ip_address, "127.0.0.1", sizeof(tcp->ip_address));
+       }
+
+       tcp->ip_address[sizeof(tcp->ip_address) - 1] = 0;
+
+       tcp->settings->ipv6 = 0;
+       tcp->settings->ip_address = xstrdup(tcp->ip_address);
+}
+
+void tcp_get_mac_address(rdpTcp * tcp)
+{
+#ifdef LINUX
+       uint8* mac;
+       struct ifreq if_req;
+       struct if_nameindex* ni;
+
+       ni = if_nameindex();
+       mac = tcp->mac_address;
+
+       while (ni->if_name != NULL)
+       {
+               if (strcmp(ni->if_name, "lo") != 0)
+                       break;
+
+               ni++;
+       }
+
+       strncpy(if_req.ifr_name, ni->if_name, IF_NAMESIZE);
+
+       if (ioctl(tcp->sockfd, SIOCGIFHWADDR, &if_req) != 0)
+       {
+               printf("failed to obtain MAC address\n");
+               return;
+       }
+
+       memmove((void*) mac, (void*) &if_req.ifr_ifru.ifru_hwaddr.sa_data[0], 6);
+#endif
+
+       /* printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
+               mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); */
+}
+
+boolean tcp_connect(rdpTcp* tcp, const char* hostname, uint16 port)
+{
+       int status;
+       char servname[10];
+       uint32 option_value;
+       socklen_t option_len;
+       struct addrinfo hints = { 0 };
+       struct addrinfo * res, * ai;
+
+       memset(&hints, 0, sizeof(struct addrinfo));
+       hints.ai_family = AF_UNSPEC;
+       hints.ai_socktype = SOCK_STREAM;
+
+       snprintf(servname, sizeof(servname), "%d", port);
+       status = getaddrinfo(hostname, servname, &hints, &res);
+
+       if (status != 0)
+       {
+               printf("transport_connect: getaddrinfo (%s)\n", gai_strerror(status));
+               return false;
+       }
+
+       tcp->sockfd = -1;
+       for (ai = res; ai; ai = ai->ai_next)
+       {
+               tcp->sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+
+               if (tcp->sockfd < 0)
+                       continue;
+
+               if (connect(tcp->sockfd, ai->ai_addr, ai->ai_addrlen) == 0)
+               {
+                       printf("connected to %s:%s\n", hostname, servname);
+                       break;
+               }
+
+               close(tcp->sockfd);
+               tcp->sockfd = -1;
+       }
+       freeaddrinfo(res);
+
+       if (tcp->sockfd == -1)
+       {
+               printf("unable to connect to %s:%s\n", hostname, servname);
+               return false;
+       }
+
+       tcp_get_ip_address(tcp);
+       tcp_get_mac_address(tcp);
+
+       option_value = 1;
+       option_len = sizeof(option_value);
+       setsockopt(tcp->sockfd, IPPROTO_TCP, TCP_NODELAY, (void*) &option_value, option_len);
+
+       /* receive buffer must be a least 32 K */
+       if (getsockopt(tcp->sockfd, SOL_SOCKET, SO_RCVBUF, (void*) &option_value, &option_len) == 0)
+       {
+               if (option_value < (1024 * 32))
+               {
+                       option_value = 1024 * 32;
+                       option_len = sizeof(option_value);
+                       setsockopt(tcp->sockfd, SOL_SOCKET, SO_RCVBUF, (void*) &option_value, option_len);
+               }
+       }
+
+       tcp_set_keep_alive_mode(tcp);
+
+       return true;
+}
+
+int tcp_read(rdpTcp* tcp, uint8* data, int length)
+{
+       int status;
+
+       status = recv(tcp->sockfd, data, length, 0);
+
+       if (status == 0)
+       {
+               /* Peer disconnected. */
+               return -1;
+       }
+       else if (status < 0)
+       {
+#ifdef _WIN32
+               int wsa_error = WSAGetLastError();
+
+               /* No data available */
+               if (wsa_error == WSAEWOULDBLOCK)
+                       return 0;
+
+               printf("recv() error: %d\n", wsa_error);
+#else
+               /* No data available */
+               if (errno == EAGAIN || errno == EWOULDBLOCK)
+                       return 0;
+
+               perror("recv");
+#endif
+               return -1;
+       }
+
+       return status;
+}
+
+int tcp_write(rdpTcp* tcp, uint8* data, int length)
+{
+       int status;
+
+       status = send(tcp->sockfd, data, length, MSG_NOSIGNAL);
+
+       if (status < 0)
+       {
+#ifdef _WIN32
+               int wsa_error = WSAGetLastError();
+
+               /* No data available */
+               if (wsa_error == WSAEWOULDBLOCK)
+                       status = 0;
+                else 
+                        perror("send");
+#else
+               if (errno == EAGAIN || errno == EWOULDBLOCK)
+                       status = 0;
+               else
+                       perror("send");
+#endif
+       }
+
+       return status;
+}
+
+boolean tcp_disconnect(rdpTcp * tcp)
+{
+       if (tcp->sockfd != -1)
+       {
+               shutdown(tcp->sockfd, SHUT_RDWR);
+               close(tcp->sockfd);
+               tcp->sockfd = -1;
+       }
+
+       return true;
+}
+
+boolean tcp_set_blocking_mode(rdpTcp* tcp, boolean blocking)
+{
+#ifndef _WIN32
+       int flags;
+       flags = fcntl(tcp->sockfd, F_GETFL);
+
+       if (flags == -1)
+       {
+               printf("tcp_set_blocking_mode: fcntl failed.\n");
+               return false;
+       }
+
+       if (blocking == true)
+               fcntl(tcp->sockfd, F_SETFL, flags & ~(O_NONBLOCK));
+       else
+               fcntl(tcp->sockfd, F_SETFL, flags | O_NONBLOCK);
+#else
+       u_long arg = blocking;
+       ioctlsocket(tcp->sockfd, FIONBIO, &arg);
+       tcp->wsa_event = WSACreateEvent();
+       WSAEventSelect(tcp->sockfd, tcp->wsa_event, FD_READ);
+#endif
+
+       return true;
+}
+
+boolean tcp_set_keep_alive_mode(rdpTcp* tcp)
+{
+#ifndef _WIN32
+       uint32 option_value;
+       socklen_t option_len;
+
+       option_value = 1;
+       option_len = sizeof(option_value);
+
+       if (setsockopt(tcp->sockfd, SOL_SOCKET, SO_KEEPALIVE, (void*) &option_value, option_len) < 0)
+       {
+               perror("setsockopt() SOL_SOCKET, SO_KEEPALIVE:");
+               return false;
+       }
+
+#ifdef TCP_KEEPIDLE
+       option_value = 5;
+       option_len = sizeof(option_value);
+
+       if (setsockopt(tcp->sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (void*) &option_value, option_len) < 0)
+       {
+               perror("setsockopt() IPPROTO_TCP, SO_KEEPIDLE:");
+               return false;
+       }
+#endif
+#endif
+
+       return true;
+}
+
+rdpTcp* tcp_new(rdpSettings* settings)
+{
+       rdpTcp* tcp;
+
+       tcp = (rdpTcp*) xzalloc(sizeof(rdpTcp));
+
+       if (tcp != NULL)
+       {
+               tcp->sockfd = -1;
+               tcp->settings = settings;
+       }
+
+       return tcp;
+}
+
+void tcp_free(rdpTcp* tcp)
+{
+       if (tcp != NULL)
+       {
+               xfree(tcp);
+       }
+}
diff --git a/libfreerdp-core/tcp.h b/libfreerdp-core/tcp.h
new file mode 100644 (file)
index 0000000..6d0cd5b
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Transmission Control Protocol (TCP)
+ *
+ * Copyright 2011 Vic Lee
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TCP_H
+#define __TCP_H
+
+#ifdef _WIN32
+#include <winsock2.h>
+#include <windows.h>
+#include <ws2tcpip.h>
+#endif
+
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/stream.h>
+
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
+typedef struct rdp_tcp rdpTcp;
+
+struct rdp_tcp
+{
+       int sockfd;
+       char ip_address[32];
+       uint8 mac_address[6];
+       struct rdp_settings* settings;
+#ifdef _WIN32
+       WSAEVENT wsa_event;
+#endif
+};
+
+boolean tcp_connect(rdpTcp* tcp, const char* hostname, uint16 port);
+boolean tcp_disconnect(rdpTcp* tcp);
+int tcp_read(rdpTcp* tcp, uint8* data, int length);
+int tcp_write(rdpTcp* tcp, uint8* data, int length);
+boolean tcp_set_blocking_mode(rdpTcp* tcp, boolean blocking);
+boolean tcp_set_keep_alive_mode(rdpTcp* tcp);
+
+rdpTcp* tcp_new(rdpSettings* settings);
+void tcp_free(rdpTcp* tcp);
+
+#endif /* __TCP_H */
diff --git a/libfreerdp-core/tls.c b/libfreerdp-core/tls.c
new file mode 100644 (file)
index 0000000..3d49068
--- /dev/null
@@ -0,0 +1,434 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Transport Layer Security
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *              http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include "tls.h"
+
+boolean tls_connect(rdpTls* tls)
+{
+       int connection_status;
+
+       tls->ctx = SSL_CTX_new(TLSv1_client_method());
+
+       if (tls->ctx == NULL)
+       {
+               printf("SSL_CTX_new failed\n");
+               return false;
+       }
+
+       /*
+        * This is necessary, because the Microsoft TLS implementation is not perfect.
+        * SSL_OP_ALL enables a couple of workarounds for buggy TLS implementations,
+        * but the most important workaround being SSL_OP_TLS_BLOCK_PADDING_BUG.
+        * As the size of the encrypted payload may give hints about its contents,
+        * block padding is normally used, but the Microsoft TLS implementation
+        * won't recognize it and will disconnect you after sending a TLS alert.
+        */
+       SSL_CTX_set_options(tls->ctx, SSL_OP_ALL);
+
+       tls->ssl = SSL_new(tls->ctx);
+
+       if (tls->ssl == NULL)
+       {
+               printf("SSL_new failed\n");
+               return false;
+       }
+
+       if (SSL_set_fd(tls->ssl, tls->sockfd) < 1)
+       {
+               printf("SSL_set_fd failed\n");
+               return false;
+       }
+
+       connection_status = SSL_connect(tls->ssl);
+
+       if (connection_status <= 0)
+       {
+               if (tls_print_error("SSL_connect", tls->ssl, connection_status))
+                       return false;
+       }
+
+       return true;
+}
+
+boolean tls_accept(rdpTls* tls, const char* cert_file, const char* privatekey_file)
+{
+       int connection_status;
+
+       tls->ctx = SSL_CTX_new(TLSv1_server_method());
+
+       if (tls->ctx == NULL)
+       {
+               printf("SSL_CTX_new failed\n");
+               return false;
+       }
+
+       if (SSL_CTX_use_RSAPrivateKey_file(tls->ctx, privatekey_file, SSL_FILETYPE_PEM) <= 0)
+       {
+               printf("SSL_CTX_use_RSAPrivateKey_file failed\n");
+               return false;
+       }
+
+       tls->ssl = SSL_new(tls->ctx);
+
+       if (tls->ssl == NULL)
+       {
+               printf("SSL_new failed\n");
+               return false;
+       }
+
+       if (SSL_use_certificate_file(tls->ssl, cert_file, SSL_FILETYPE_PEM) <= 0)
+       {
+               printf("SSL_use_certificate_file failed\n");
+               return false;
+       }
+
+       if (SSL_set_fd(tls->ssl, tls->sockfd) < 1)
+       {
+               printf("SSL_set_fd failed\n");
+               return false;
+       }
+
+       connection_status = SSL_accept(tls->ssl);
+
+       if (connection_status <= 0)
+       {
+               if (tls_print_error("SSL_accept", tls->ssl, connection_status))
+                       return false;
+       }
+
+       printf("TLS connection accepted\n");
+
+       return true;
+}
+
+boolean tls_disconnect(rdpTls* tls)
+{
+       SSL_shutdown(tls->ssl);
+       return true;
+}
+
+int tls_read(rdpTls* tls, uint8* data, int length)
+{
+       int status;
+
+       status = SSL_read(tls->ssl, data, length);
+
+       switch (SSL_get_error(tls->ssl, status))
+       {
+               case SSL_ERROR_NONE:
+                       break;
+
+               case SSL_ERROR_WANT_READ:
+               case SSL_ERROR_WANT_WRITE:
+                       status = 0;
+                       break;
+
+               default:
+                       tls_print_error("SSL_read", tls->ssl, status);
+                       status = -1;
+                       break;
+       }
+
+       return status;
+}
+
+int tls_write(rdpTls* tls, uint8* data, int length)
+{
+       int status;
+
+       status = SSL_write(tls->ssl, data, length);
+
+       switch (SSL_get_error(tls->ssl, status))
+       {
+               case SSL_ERROR_NONE:
+                       break;
+
+               case SSL_ERROR_WANT_READ:
+               case SSL_ERROR_WANT_WRITE:
+                       status = 0;
+                       break;
+
+               default:
+                       tls_print_error("SSL_write", tls->ssl, status);
+                       status = -1;
+                       break;
+       }
+
+       return status;
+}
+
+boolean tls_print_error(char* func, SSL* connection, int value)
+{
+       switch (SSL_get_error(connection, value))
+       {
+               case SSL_ERROR_ZERO_RETURN:
+                       printf("%s: Server closed TLS connection\n", func);
+                       return true;
+
+               case SSL_ERROR_WANT_READ:
+                       printf("SSL_ERROR_WANT_READ\n");
+                       return false;
+
+               case SSL_ERROR_WANT_WRITE:
+                       printf("SSL_ERROR_WANT_WRITE\n");
+                       return false;
+
+               case SSL_ERROR_SYSCALL:
+                       printf("%s: I/O error\n", func);
+                       return true;
+
+               case SSL_ERROR_SSL:
+                       printf("%s: Failure in SSL library (protocol error?)\n", func);
+                       return true;
+
+               default:
+                       printf("%s: Unknown error\n", func);
+                       return true;
+       }
+}
+
+CryptoCert tls_get_certificate(rdpTls* tls)
+{
+       CryptoCert cert;
+       X509* server_cert;
+
+       server_cert = SSL_get_peer_certificate(tls->ssl);
+
+       if (!server_cert)
+       {
+               printf("ssl_verify: failed to get the server SSL certificate\n");
+               cert = NULL;
+       }
+       else
+       {
+               cert = xmalloc(sizeof(*cert));
+               cert->px509 = server_cert;
+       }
+
+       return cert;
+}
+
+boolean tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname)
+{
+       int match;
+       int index;
+       char* common_name;
+       int common_name_length;
+       char** alt_names;
+       int alt_names_count;
+       int* alt_names_lengths;
+       boolean certificate_status;
+       boolean hostname_match = false;
+       rdpCertificateData* certificate_data;
+
+       /* ignore certificate verification if user explicitly required it (discouraged) */
+       if (tls->settings->ignore_certificate)
+               return true;  /* success! */
+
+       /* if user explicitly specified a certificate name, use it instead of the hostname */
+       if (tls->settings->certificate_name)
+               hostname = tls->settings->certificate_name;
+
+       /* attempt verification using OpenSSL and the ~/.freerdp/certs certificate store */
+       certificate_status = x509_verify_certificate(cert, tls->certificate_store->path);
+
+       /* verify certificate name match */
+       certificate_data = crypto_get_certificate_data(cert->px509, hostname);
+
+       /* extra common name and alternative names */
+       common_name = crypto_cert_subject_common_name(cert->px509, &common_name_length);
+       alt_names = crypto_cert_subject_alt_name(cert->px509, &alt_names_count, &alt_names_lengths);
+
+       /* compare against common name */
+
+       if (common_name != NULL)
+       {
+               if (strlen(hostname) == common_name_length)
+               {
+                       if (memcmp((void*) hostname, (void*) common_name, common_name_length) == 0)
+                               hostname_match = true;
+               }
+       }
+
+       /* compare against alternative names */
+
+       if (alt_names != NULL)
+       {
+               for (index = 0; index < alt_names_count; index++)
+               {
+                       if (strlen(hostname) == alt_names_lengths[index])
+                       {
+                               if (memcmp((void*) hostname, (void*) alt_names[index], alt_names_lengths[index]) == 0)
+                                       hostname_match = true;
+                       }
+               }
+       }
+
+       /* if the certificate is valid and the certificate name matches, verification succeeds */
+       if (certificate_status && hostname_match)
+               return true; /* success! */
+
+       /* if the certificate is valid but the certificate name does not match, warn user, do not accept */
+       if (certificate_status && !hostname_match)
+               tls_print_certificate_name_mismatch_error(hostname, common_name, alt_names, alt_names_count);
+
+       /* verification could not succeed with OpenSSL, use known_hosts file and prompt user for manual verification */
+
+       if (!certificate_status)
+       {
+               char* issuer;
+               char* subject;
+               char* fingerprint;
+               boolean accept_certificate = false;
+               boolean verification_status = false;
+
+               issuer = crypto_cert_issuer(cert->px509);
+               subject = crypto_cert_subject(cert->px509);
+               fingerprint = crypto_cert_fingerprint(cert->px509);
+
+               /* search for matching entry in known_hosts file */
+               match = certificate_data_match(tls->certificate_store, certificate_data);
+
+               if (match == 1)
+               {
+                       /* no entry was found in known_hosts file, prompt user for manual verification */
+
+                       freerdp* instance = (freerdp*) tls->settings->instance;
+
+                       if (!hostname_match)
+                               tls_print_certificate_name_mismatch_error(hostname, common_name, alt_names, alt_names_count);
+
+                       if (instance->VerifyCertificate)
+                               accept_certificate = instance->VerifyCertificate(instance, subject, issuer, fingerprint);
+
+                       if (!accept_certificate)
+                       {
+                               /* user did not accept, abort and do not add entry in known_hosts file */
+                               verification_status = false;  /* failure! */
+                       }
+                       else
+                       {
+                               /* user accepted certificate, add entry in known_hosts file */
+                               certificate_data_print(tls->certificate_store, certificate_data);
+                               verification_status = true; /* success! */
+                       }
+               }
+               else if (match == -1)
+               {
+                       /* entry was found in known_hosts file, but fingerprint does not match */
+                       tls_print_certificate_error(hostname, fingerprint);
+                       verification_status = false; /* failure! */
+               }
+               else if (match == 0)
+               {
+                       verification_status = true; /* success! */
+               }
+
+               xfree(issuer);
+               xfree(subject);
+               xfree(fingerprint);
+
+               return verification_status;
+       }
+
+       return false;
+}
+
+void tls_print_certificate_error(char* hostname, char* fingerprint)
+{
+       printf("The host key for %s has changed\n", hostname);
+       printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+       printf("@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @\n");
+       printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+       printf("IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!\n");
+       printf("Someone could be eavesdropping on you right now (man-in-the-middle attack)!\n");
+       printf("It is also possible that a host key has just been changed.\n");
+       printf("The fingerprint for the host key sent by the remote host is\n%s\n", fingerprint);
+       printf("Please contact your system administrator.\n");
+       printf("Add correct host key in ~/.freerdp/known_hosts to get rid of this message.\n");
+       printf("Host key for %s has changed and you have requested strict checking.\n", hostname);
+       printf("Host key verification failed.\n");
+}
+
+void tls_print_certificate_name_mismatch_error(char* hostname, char* common_name, char** alt_names, int alt_names_count)
+{
+       int index;
+
+       printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+       printf("@           WARNING: CERTIFICATE NAME MISMATCH!           @\n");
+       printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+       printf("The hostname used for this connection (%s) \n", hostname);
+
+       if (alt_names_count < 1)
+       {
+               printf("does not match the name given in the certificate:\n");
+               printf("%s\n", common_name);
+       }
+       else
+       {
+               printf("does not match the names given in the certificate:\n");
+               printf("%s", common_name);
+
+               for (index = 0; index < alt_names_count; index++)
+               {
+                       printf(", %s", alt_names[index]);
+               }
+
+               printf("\n");
+       }
+
+       printf("A valid certificate for the wrong name should NOT be trusted!\n");
+}
+
+rdpTls* tls_new(rdpSettings* settings)
+{
+       rdpTls* tls;
+
+       tls = (rdpTls*) xzalloc(sizeof(rdpTls));
+
+       if (tls != NULL)
+       {
+               SSL_load_error_strings();
+               SSL_library_init();
+
+               tls->settings = settings;
+               tls->certificate_store = certificate_store_new(settings);
+       }
+
+       return tls;
+}
+
+void tls_free(rdpTls* tls)
+{
+       if (tls != NULL)
+       {
+               if (tls->ssl)
+                       SSL_free(tls->ssl);
+
+               if (tls->ctx)
+                       SSL_CTX_free(tls->ctx);
+
+               certificate_store_free(tls->certificate_store);
+
+               xfree(tls);
+       }
+}
diff --git a/libfreerdp-core/tls.h b/libfreerdp-core/tls.h
new file mode 100644 (file)
index 0000000..c3f2f59
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Transport Layer Security
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TLS_H
+#define __TLS_H
+
+#include "crypto.h"
+#include "certificate.h"
+
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+
+#include <freerdp/types.h>
+#include <freerdp/utils/stream.h>
+
+typedef struct rdp_tls rdpTls;
+
+struct rdp_tls
+{
+       SSL* ssl;
+       int sockfd;
+       SSL_CTX* ctx;
+       rdpSettings* settings;
+       rdpCertificateStore* certificate_store;
+};
+
+boolean tls_connect(rdpTls* tls);
+boolean tls_accept(rdpTls* tls, const char* cert_file, const char* privatekey_file);
+boolean tls_disconnect(rdpTls* tls);
+
+int tls_read(rdpTls* tls, uint8* data, int length);
+int tls_write(rdpTls* tls, uint8* data, int length);
+
+CryptoCert tls_get_certificate(rdpTls* tls);
+boolean tls_verify_certificate(rdpTls* tls, CryptoCert cert, char* hostname);
+void tls_print_certificate_error(char* hostname, char* fingerprint);
+void tls_print_certificate_name_mismatch_error(char* hostname, char* common_name, char** alt_names, int alt_names_count);
+
+boolean tls_print_error(char* func, SSL* connection, int value);
+
+rdpTls* tls_new(rdpSettings* settings);
+void tls_free(rdpTls* tls);
+
+#endif /* __TLS_H */
diff --git a/libfreerdp-core/tpdu.c b/libfreerdp-core/tpdu.c
new file mode 100644 (file)
index 0000000..c1e0ffa
--- /dev/null
@@ -0,0 +1,223 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X.224 Transport Protocol Data Units (TPDUs)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+
+#include "tpdu.h"
+
+/**
+ * TPDUs are defined in:
+ *
+ * http://www.itu.int/rec/T-REC-X.224-199511-I/
+ * X.224: Information technology - Open Systems Interconnection - Protocol for providing the connection-mode transport service
+ *
+ * RDP uses only TPDUs of class 0, the "simple class" defined in section 8 of X.224
+ *
+ *       TPDU Header
+ *  ____________________   byte
+ * |                    |
+ * |         LI         |   1
+ * |____________________|
+ * |                    |
+ * |        Code        |   2
+ * |____________________|
+ * |                    |
+ * |                    |   3
+ * |_______DST-REF______|
+ * |                    |
+ * |                    |   4
+ * |____________________|
+ * |                    |
+ * |                    |   5
+ * |_______SRC-REF______|
+ * |                    |
+ * |                    |   6
+ * |____________________|
+ * |                    |
+ * |        Class       |   7
+ * |____________________|
+ * |         ...        |
+ */
+
+/**
+ * Read TPDU header.
+ * @param s stream
+ * @param code variable pointer to receive TPDU code
+ * @return TPDU length indicator (LI)
+ */
+
+uint8
+tpdu_read_header(STREAM* s, uint8* code)
+{
+       uint8 li;
+
+       stream_read_uint8(s, li); /* LI */
+       stream_read_uint8(s, *code); /* Code */
+
+       if (*code == X224_TPDU_DATA)
+       {
+               /* EOT (1 byte) */
+               stream_seek(s, 1);
+       }
+       else
+       {
+               /* DST-REF (2 bytes) */
+               /* SRC-REF (2 bytes) */
+               /* Class 0 (1 byte) */
+               stream_seek(s, 5);
+       }
+
+       return li;
+}
+
+/**
+ * Write TDPU header.
+ * @param s stream
+ * @param length length
+ * @param code TPDU code
+ */
+
+void
+tpdu_write_header(STREAM* s, uint16 length, uint8 code)
+{
+       stream_write_uint8(s, length); /* LI */
+       stream_write_uint8(s, code); /* code */
+
+       if (code == X224_TPDU_DATA)
+       {
+               stream_write_uint8(s, 0x80); /* EOT */
+       }
+       else
+       {
+               stream_write_uint16(s, 0); /* DST-REF */
+               stream_write_uint16(s, 0); /* SRC-REF */
+               stream_write_uint8(s, 0); /* Class 0 */
+       }
+}
+
+/**
+ * Read Connection Request TPDU
+ * @param s stream
+ * @return length indicator (LI)
+ */
+
+uint8 tpdu_read_connection_request(STREAM* s)
+{
+       uint8 li;
+       uint8 code;
+
+       li = tpdu_read_header(s, &code);
+
+       if (code != X224_TPDU_CONNECTION_REQUEST)
+       {
+               printf("Error: expected X224_TPDU_CONNECTION_REQUEST\n");
+               return 0;
+       }
+
+       return li;
+}
+
+/**
+ * Write Connection Request TPDU.
+ * @param s stream
+ * @param length TPDU length
+ */
+
+void
+tpdu_write_connection_request(STREAM* s, uint16 length)
+{
+       tpdu_write_header(s, length, X224_TPDU_CONNECTION_REQUEST);
+}
+
+/**
+ * Read Connection Confirm TPDU.
+ * @param s stream
+ * @return length indicator (LI)
+ */
+
+uint8
+tpdu_read_connection_confirm(STREAM* s)
+{
+       uint8 li;
+       uint8 code;
+
+       li = tpdu_read_header(s, &code);
+
+       if (code != X224_TPDU_CONNECTION_CONFIRM)
+       {
+               printf("Error: expected X224_TPDU_CONNECTION_CONFIRM\n");
+               return 0;
+       }
+
+       return li;
+}
+
+/**
+ * Write Connection Confirm TPDU.
+ * @param s stream
+ * @param length TPDU length
+ */
+
+void
+tpdu_write_connection_confirm(STREAM* s, uint16 length)
+{
+       tpdu_write_header(s, length, X224_TPDU_CONNECTION_CONFIRM);
+}
+
+/**
+ * Write Disconnect Request TPDU.
+ * @param s stream
+ * @param length TPDU length
+ */
+
+void
+tpdu_write_disconnect_request(STREAM* s, uint16 length)
+{
+       tpdu_write_header(s, length, X224_TPDU_DISCONNECT_REQUEST);
+}
+
+/**
+ * Write Data TPDU.
+ * @param s stream
+ */
+
+void
+tpdu_write_data(STREAM* s)
+{
+       tpdu_write_header(s, 2, X224_TPDU_DATA);
+}
+
+/**
+ * Read Data TPDU.
+ * @param s stream
+ */
+
+uint16
+tpdu_read_data(STREAM* s)
+{
+       uint8 code;
+       uint16 li;
+
+       li = tpdu_read_header(s, &code);
+
+       if (code != X224_TPDU_DATA)
+               return 0;
+
+       return li;
+}
diff --git a/libfreerdp-core/tpdu.h b/libfreerdp-core/tpdu.h
new file mode 100644 (file)
index 0000000..c85273c
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X.224 Transport Protocol Data Units (TPDUs)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TPDU_H
+#define __TPDU_H
+
+#include <freerdp/utils/stream.h>
+
+enum X224_TPDU_TYPE
+{
+       X224_TPDU_CONNECTION_REQUEST = 0xE0,
+       X224_TPDU_CONNECTION_CONFIRM = 0xD0,
+       X224_TPDU_DISCONNECT_REQUEST = 0x80,
+       X224_TPDU_DATA = 0xF0,
+       X224_TPDU_ERROR = 0x70
+};
+
+#define TPDU_DATA_HEADER_LENGTH                        3
+#define TPDU_CONNECTION_REQUEST_HEADER_LENGTH  7
+#define TPDU_CONNECTION_CONFIRM_HEADER_LENGTH  7
+#define TPDU_DISCONNECT_REQUEST_HEADER_LENGTH  7
+
+#define TPDU_DATA_LENGTH                       (TPKT_HEADER_LENGTH + TPDU_DATA_HEADER_LENGTH)
+#define TPDU_CONNECTION_REQUEST_LENGTH         (TPKT_HEADER_LENGTH + TPDU_CONNECTION_REQUEST_HEADER_LENGTH)
+#define TPDU_CONNECTION_CONFIRM_LENGTH         (TPKT_HEADER_LENGTH + TPDU_CONNECTION_CONFIRM_HEADER_LENGTH)
+#define TPDU_DISCONNECT_REQUEST_LENGTH         (TPKT_HEADER_LENGTH + TPDU_DISCONNECT_REQUEST_HEADER_LENGTH)
+
+uint8 tpdu_read_header(STREAM* s, uint8* code);
+void tpdu_write_header(STREAM* s, uint16 length, uint8 code);
+uint8 tpdu_read_connection_request(STREAM* s);
+void tpdu_write_connection_request(STREAM* s, uint16 length);
+uint8 tpdu_read_connection_confirm(STREAM* s);
+void tpdu_write_connection_confirm(STREAM* s, uint16 length);
+void tpdu_write_disconnect_request(STREAM* s, uint16 length);
+uint16 tpdu_read_data(STREAM* s);
+void tpdu_write_data(STREAM* s);
+
+#endif /* __TPDU_H */
diff --git a/libfreerdp-core/tpkt.c b/libfreerdp-core/tpkt.c
new file mode 100644 (file)
index 0000000..449a2ae
--- /dev/null
@@ -0,0 +1,111 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Transport Packets (TPKTs)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "tpdu.h"
+
+#include "tpkt.h"
+
+/**
+ * TPKTs are defined in:
+ *
+ * http://tools.ietf.org/html/rfc1006/
+ * RFC 1006 - ISO Transport Service on top of the TCP
+ *
+ * http://www.itu.int/rec/T-REC-T.123/
+ * ITU-T T.123 (01/2007) - Network-specific data protocol stacks for multimedia conferencing
+ *
+ *       TPKT Header
+ *  ____________________   byte
+ * |                    |
+ * |     3 (version)    |   1
+ * |____________________|
+ * |                    |
+ * |      Reserved      |   2
+ * |____________________|
+ * |                    |
+ * |    Length (MSB)    |   3
+ * |____________________|
+ * |                    |
+ * |    Length (LSB)    |   4
+ * |____________________|
+ * |                    |
+ * |     X.224 TPDU     |   5 - ?
+ *          ....
+ *
+ * A TPKT header is of fixed length 4, and the following X.224 TPDU is at least three bytes long.
+ * Therefore, the minimum TPKT length is 7, and the maximum TPKT length is 65535. Because the TPKT
+ * length includes the TPKT header (4 bytes), the maximum X.224 TPDU length is 65531.
+ */
+
+/**
+ * Verify if a packet has valid TPKT header.\n
+ * @param s
+ * @return boolean
+ */
+
+boolean tpkt_verify_header(STREAM* s)
+{
+       uint8 version;
+
+       stream_peek_uint8(s, version);
+       if (version == 3)
+               return true;
+       else
+               return false;
+}
+
+/**
+ * Read a TPKT header.\n
+ * @param s
+ * @return length
+ */
+
+uint16 tpkt_read_header(STREAM* s)
+{
+       uint8 version;
+       uint16 length;
+
+       stream_peek_uint8(s, version);
+
+       if (version == 3)
+       {
+               stream_seek(s, 2);
+               stream_read_uint16_be(s, length);
+       }
+       else
+       {
+               /* not a TPKT header */
+               length = 0;
+       }
+
+       return length;
+}
+
+/**
+ * Write a TPKT header.\n
+ * @param s
+ * @param length
+ */
+
+void tpkt_write_header(STREAM* s, uint16 length)
+{
+       stream_write_uint8(s, 3); /* version */
+       stream_write_uint8(s, 0); /* reserved */
+       stream_write_uint16_be(s, length); /* length */
+}
diff --git a/libfreerdp-core/tpkt.h b/libfreerdp-core/tpkt.h
new file mode 100644 (file)
index 0000000..331bafd
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Transport Packets (TPKTs)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TPKT_H
+#define __TPKT_H
+
+#include "tpdu.h"
+#include "transport.h"
+
+#include <freerdp/utils/stream.h>
+
+#define TPKT_HEADER_LENGTH     4
+
+boolean tpkt_verify_header(STREAM* s);
+uint16 tpkt_read_header(STREAM* s);
+void tpkt_write_header(STREAM* s, uint16 length);
+
+#endif /* __TPKT_H */
diff --git a/libfreerdp-core/transport.c b/libfreerdp-core/transport.c
new file mode 100644 (file)
index 0000000..0bfc62f
--- /dev/null
@@ -0,0 +1,417 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Network Transport Layer
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/sleep.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/hexdump.h>
+
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifndef _WIN32
+#include <netdb.h>
+#include <sys/socket.h>
+#endif
+
+#include "tpkt.h"
+#include "fastpath.h"
+#include "credssp.h"
+#include "transport.h"
+
+#define BUFFER_SIZE 16384
+
+STREAM* transport_recv_stream_init(rdpTransport* transport, int size)
+{
+       STREAM* s = transport->recv_stream;
+       stream_check_size(s, size);
+       stream_set_pos(s, 0);
+       return s;
+}
+
+STREAM* transport_send_stream_init(rdpTransport* transport, int size)
+{
+       STREAM* s = transport->send_stream;
+       stream_check_size(s, size);
+       stream_set_pos(s, 0);
+       return s;
+}
+
+boolean transport_connect(rdpTransport* transport, const char* hostname, uint16 port)
+{
+       return tcp_connect(transport->tcp, hostname, port);
+}
+
+void transport_attach(rdpTransport* transport, int sockfd)
+{
+       transport->tcp->sockfd = sockfd;
+}
+
+boolean transport_disconnect(rdpTransport* transport)
+{
+       if (transport->layer == TRANSPORT_LAYER_TLS)
+               tls_disconnect(transport->tls);
+       return tcp_disconnect(transport->tcp);
+}
+
+boolean transport_connect_rdp(rdpTransport* transport)
+{
+       /* RDP encryption */
+
+       return true;
+}
+
+boolean transport_connect_tls(rdpTransport* transport)
+{
+       if (transport->tls == NULL)
+               transport->tls = tls_new(transport->settings);
+
+       transport->layer = TRANSPORT_LAYER_TLS;
+       transport->tls->sockfd = transport->tcp->sockfd;
+
+       if (tls_connect(transport->tls) != true)
+               return false;
+
+       return true;
+}
+
+boolean transport_connect_nla(rdpTransport* transport)
+{
+       if (transport->tls == NULL)
+               transport->tls = tls_new(transport->settings);
+
+       transport->layer = TRANSPORT_LAYER_TLS;
+       transport->tls->sockfd = transport->tcp->sockfd;
+
+       if (tls_connect(transport->tls) != true)
+               return false;
+
+       /* Network Level Authentication */
+
+       if (transport->settings->authentication != true)
+               return true;
+
+       if (transport->credssp == NULL)
+               transport->credssp = credssp_new(transport);
+
+       if (credssp_authenticate(transport->credssp) < 0)
+       {
+               printf("Authentication failure, check credentials.\n"
+                       "If credentials are valid, the NTLMSSP implementation may be to blame.\n");
+
+               credssp_free(transport->credssp);
+               return false;
+       }
+
+       credssp_free(transport->credssp);
+
+       return true;
+}
+
+boolean transport_accept_rdp(rdpTransport* transport)
+{
+       /* RDP encryption */
+
+       return true;
+}
+
+boolean transport_accept_tls(rdpTransport* transport)
+{
+       if (transport->tls == NULL)
+               transport->tls = tls_new(transport->settings);
+
+       transport->layer = TRANSPORT_LAYER_TLS;
+       transport->tls->sockfd = transport->tcp->sockfd;
+
+       if (tls_accept(transport->tls, transport->settings->cert_file, transport->settings->privatekey_file) != true)
+               return false;
+
+       return true;
+}
+
+boolean transport_accept_nla(rdpTransport* transport)
+{
+       if (transport->tls == NULL)
+               transport->tls = tls_new(transport->settings);
+
+       transport->layer = TRANSPORT_LAYER_TLS;
+       transport->tls->sockfd = transport->tcp->sockfd;
+
+       if (tls_accept(transport->tls, transport->settings->cert_file, transport->settings->privatekey_file) != true)
+               return false;
+
+       /* Network Level Authentication */
+
+       if (transport->settings->authentication != true)
+               return true;
+
+       /* Blocking here until NLA is complete */
+
+       return true;
+}
+
+int transport_read(rdpTransport* transport, STREAM* s)
+{
+       int status = -1;
+
+       while (true)
+       {
+               if (transport->layer == TRANSPORT_LAYER_TLS)
+                       status = tls_read(transport->tls, stream_get_tail(s), stream_get_left(s));
+               else if (transport->layer == TRANSPORT_LAYER_TCP)
+                       status = tcp_read(transport->tcp, stream_get_tail(s), stream_get_left(s));
+
+               if (status == 0 && transport->blocking)
+               {
+                       freerdp_usleep(transport->usleep_interval);
+                       continue;
+               }
+
+               break;
+       }
+
+#ifdef WITH_DEBUG_TRANSPORT
+       if (status > 0)
+       {
+               printf("Local < Remote\n");
+               freerdp_hexdump(s->data, status);
+       }
+#endif
+
+       return status;
+}
+
+static int transport_read_nonblocking(rdpTransport* transport)
+{
+       int status;
+
+       stream_check_size(transport->recv_buffer, 4096);
+       status = transport_read(transport, transport->recv_buffer);
+
+       if (status <= 0)
+               return status;
+
+       stream_seek(transport->recv_buffer, status);
+
+       return status;
+}
+
+int transport_write(rdpTransport* transport, STREAM* s)
+{
+       int status = -1;
+       int length;
+
+       length = stream_get_length(s);
+       stream_set_pos(s, 0);
+
+#ifdef WITH_DEBUG_TRANSPORT
+       if (length > 0)
+       {
+               printf("Local > Remote\n");
+               freerdp_hexdump(s->data, length);
+       }
+#endif
+
+       while (length > 0)
+       {
+               if (transport->layer == TRANSPORT_LAYER_TLS)
+                       status = tls_write(transport->tls, stream_get_tail(s), length);
+               else if (transport->layer == TRANSPORT_LAYER_TCP)
+                       status = tcp_write(transport->tcp, stream_get_tail(s), length);
+
+               if (status < 0)
+                       break; /* error occurred */
+
+               if (status == 0)
+               {
+                       /* blocking while sending */
+                       freerdp_usleep(transport->usleep_interval);
+
+                       /* when sending is blocked in nonblocking mode, the receiving buffer should be checked */
+                       if (!transport->blocking)
+                       {
+                               /* and in case we do have buffered some data, we set the event so next loop will get it */
+                               if (transport_read_nonblocking(transport) > 0)
+                                       wait_obj_set(transport->recv_event);
+                       }
+               }
+
+               length -= status;
+               stream_seek(s, status);
+       }
+
+       if (status < 0)
+       {
+               /* A write error indicates that the peer has dropped the connection */
+               transport->layer = TRANSPORT_LAYER_CLOSED;
+       }
+
+       return status;
+}
+
+void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount)
+{
+       rfds[*rcount] = (void*)(long)(transport->tcp->sockfd);
+       (*rcount)++;
+       wait_obj_get_fds(transport->recv_event, rfds, rcount);
+}
+
+int transport_check_fds(rdpTransport* transport)
+{
+       int pos;
+       int status;
+       uint16 length;
+       STREAM* received;
+
+       wait_obj_clear(transport->recv_event);
+
+       status = transport_read_nonblocking(transport);
+
+       if (status < 0)
+               return status;
+
+       while ((pos = stream_get_pos(transport->recv_buffer)) > 0)
+       {
+               stream_set_pos(transport->recv_buffer, 0);
+               if (tpkt_verify_header(transport->recv_buffer)) /* TPKT */
+               {
+                       /* Ensure the TPKT header is available. */
+                       if (pos <= 4)
+                       {
+                               stream_set_pos(transport->recv_buffer, pos);
+                               return 0;
+                       }
+                       length = tpkt_read_header(transport->recv_buffer);
+               }
+               else /* Fast Path */
+               {
+                       /* Ensure the Fast Path header is available. */
+                       if (pos <= 2)
+                       {
+                               stream_set_pos(transport->recv_buffer, pos);
+                               return 0;
+                       }
+                       /* Fastpath header can be two or three bytes long. */
+                       length = fastpath_header_length(transport->recv_buffer);
+                       if (pos < length)
+                       {
+                               stream_set_pos(transport->recv_buffer, pos);
+                               return 0;
+                       }
+                       length = fastpath_read_header(NULL, transport->recv_buffer);
+               }
+
+               if (length == 0)
+               {
+                       printf("transport_check_fds: protocol error, not a TPKT or Fast Path header.\n");
+                       freerdp_hexdump(stream_get_head(transport->recv_buffer), pos);
+                       return -1;
+               }
+
+               if (pos < length)
+               {
+                       stream_set_pos(transport->recv_buffer, pos);
+                       return 0; /* Packet is not yet completely received. */
+               }
+
+               /*
+                * A complete packet has been received. In case there are trailing data
+                * for the next packet, we copy it to the new receive buffer.
+                */
+               received = transport->recv_buffer;
+               transport->recv_buffer = stream_new(BUFFER_SIZE);
+
+               if (pos > length)
+               {
+                       stream_set_pos(received, length);
+                       stream_check_size(transport->recv_buffer, pos - length);
+                       stream_copy(transport->recv_buffer, received, pos - length);
+               }
+
+               stream_set_pos(received, length);
+               stream_seal(received);
+               stream_set_pos(received, 0);
+               
+               if (transport->recv_callback(transport, received, transport->recv_extra) == false)
+                       status = -1;
+       
+               stream_free(received);
+
+               if (status < 0)
+                       return status;
+       }
+
+       return 0;
+}
+
+boolean transport_set_blocking_mode(rdpTransport* transport, boolean blocking)
+{
+       transport->blocking = blocking;
+       return tcp_set_blocking_mode(transport->tcp, blocking);
+}
+
+rdpTransport* transport_new(rdpSettings* settings)
+{
+       rdpTransport* transport;
+
+       transport = (rdpTransport*) xzalloc(sizeof(rdpTransport));
+
+       if (transport != NULL)
+       {
+               transport->tcp = tcp_new(settings);
+               transport->settings = settings;
+
+               /* a small 0.1ms delay when transport is blocking. */
+               transport->usleep_interval = 100;
+
+               /* receive buffer for non-blocking read. */
+               transport->recv_buffer = stream_new(BUFFER_SIZE);
+               transport->recv_event = wait_obj_new();
+
+               /* buffers for blocking read/write */
+               transport->recv_stream = stream_new(BUFFER_SIZE);
+               transport->send_stream = stream_new(BUFFER_SIZE);
+
+               transport->blocking = true;
+
+               transport->layer = TRANSPORT_LAYER_TCP;
+       }
+
+       return transport;
+}
+
+void transport_free(rdpTransport* transport)
+{
+       if (transport != NULL)
+       {
+               stream_free(transport->recv_buffer);
+               stream_free(transport->recv_stream);
+               stream_free(transport->send_stream);
+               wait_obj_free(transport->recv_event);
+               if (transport->tls)
+                       tls_free(transport->tls);
+               tcp_free(transport->tcp);
+               xfree(transport);
+       }
+}
diff --git a/libfreerdp-core/transport.h b/libfreerdp-core/transport.h
new file mode 100644 (file)
index 0000000..977c837
--- /dev/null
@@ -0,0 +1,80 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Network Transport Layer
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __TRANSPORT_H
+#define __TRANSPORT_H
+
+typedef enum
+{
+       TRANSPORT_LAYER_TCP,
+       TRANSPORT_LAYER_TLS,
+       TRANSPORT_LAYER_CLOSED
+} TRANSPORT_LAYER;
+
+typedef struct rdp_transport rdpTransport;
+
+#include "tcp.h"
+#include "tls.h"
+#include "credssp.h"
+
+#include <time.h>
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/wait_obj.h>
+
+typedef boolean (*TransportRecv) (rdpTransport* transport, STREAM* stream, void* extra);
+
+struct rdp_transport
+{
+       STREAM* recv_stream;
+       STREAM* send_stream;
+       TRANSPORT_LAYER layer;
+       struct rdp_tcp* tcp;
+       struct rdp_tls* tls;
+       struct rdp_settings* settings;
+       struct rdp_credssp* credssp;
+       uint32 usleep_interval;
+       void* recv_extra;
+       STREAM* recv_buffer;
+       TransportRecv recv_callback;
+       struct wait_obj* recv_event;
+       boolean blocking;
+};
+
+STREAM* transport_recv_stream_init(rdpTransport* transport, int size);
+STREAM* transport_send_stream_init(rdpTransport* transport, int size);
+boolean transport_connect(rdpTransport* transport, const char* hostname, uint16 port);
+void transport_attach(rdpTransport* transport, int sockfd);
+boolean transport_disconnect(rdpTransport* transport);
+boolean transport_connect_rdp(rdpTransport* transport);
+boolean transport_connect_tls(rdpTransport* transport);
+boolean transport_connect_nla(rdpTransport* transport);
+boolean transport_accept_rdp(rdpTransport* transport);
+boolean transport_accept_tls(rdpTransport* transport);
+boolean transport_accept_nla(rdpTransport* transport);
+int transport_read(rdpTransport* transport, STREAM* s);
+int transport_write(rdpTransport* transport, STREAM* s);
+void transport_get_fds(rdpTransport* transport, void** rfds, int* rcount);
+int transport_check_fds(rdpTransport* transport);
+boolean transport_set_blocking_mode(rdpTransport* transport, boolean blocking);
+rdpTransport* transport_new(rdpSettings* settings);
+void transport_free(rdpTransport* transport);
+
+#endif
diff --git a/libfreerdp-core/update.c b/libfreerdp-core/update.c
new file mode 100644 (file)
index 0000000..17122ad
--- /dev/null
@@ -0,0 +1,580 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Update Data PDUs
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "update.h"
+#include "surface.h"
+#include <freerdp/utils/rect.h>
+#include <freerdp/codec/bitmap.h>
+
+/*
+static const char* const UPDATE_TYPE_STRINGS[] =
+{
+       "Orders",
+       "Bitmap",
+       "Palette",
+       "Synchronize"
+};
+*/
+
+void update_recv_orders(rdpUpdate* update, STREAM* s)
+{
+       uint16 numberOrders;
+
+       stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */
+       stream_read_uint16(s, numberOrders); /* numberOrders (2 bytes) */
+       stream_seek_uint16(s); /* pad2OctetsB (2 bytes) */
+
+       while (numberOrders > 0)
+       {
+               update_recv_order(update, s);
+               numberOrders--;
+       }
+}
+
+void update_read_bitmap_data(STREAM* s, BITMAP_DATA* bitmap_data)
+{
+       stream_read_uint16(s, bitmap_data->destLeft);
+       stream_read_uint16(s, bitmap_data->destTop);
+       stream_read_uint16(s, bitmap_data->destRight);
+       stream_read_uint16(s, bitmap_data->destBottom);
+       stream_read_uint16(s, bitmap_data->width);
+       stream_read_uint16(s, bitmap_data->height);
+       stream_read_uint16(s, bitmap_data->bitsPerPixel);
+       stream_read_uint16(s, bitmap_data->flags);
+       stream_read_uint16(s, bitmap_data->bitmapLength);
+
+       if (bitmap_data->flags & BITMAP_COMPRESSION)
+       {
+               if (!(bitmap_data->flags & NO_BITMAP_COMPRESSION_HDR))
+               {
+                       stream_read_uint16(s, bitmap_data->cbCompFirstRowSize); /* cbCompFirstRowSize (2 bytes) */
+                       stream_read_uint16(s, bitmap_data->cbCompMainBodySize); /* cbCompMainBodySize (2 bytes) */
+                       stream_read_uint16(s, bitmap_data->cbScanWidth); /* cbScanWidth (2 bytes) */
+                       stream_read_uint16(s, bitmap_data->cbUncompressedSize); /* cbUncompressedSize (2 bytes) */
+                       bitmap_data->bitmapLength = bitmap_data->cbCompMainBodySize;
+               }
+
+               bitmap_data->compressed = true;
+               stream_get_mark(s, bitmap_data->bitmapDataStream);
+               stream_seek(s, bitmap_data->bitmapLength);
+       }
+       else
+       {
+               bitmap_data->compressed = false;
+               stream_get_mark(s, bitmap_data->bitmapDataStream);
+               stream_seek(s, bitmap_data->bitmapLength);
+       }
+}
+
+void update_read_bitmap(rdpUpdate* update, STREAM* s, BITMAP_UPDATE* bitmap_update)
+{
+       int i;
+
+       stream_read_uint16(s, bitmap_update->number); /* numberRectangles (2 bytes) */
+
+       if (bitmap_update->number > bitmap_update->count)
+       {
+               uint16 count;
+
+               count = bitmap_update->number * 2;
+
+               bitmap_update->rectangles = (BITMAP_DATA*) xrealloc(bitmap_update->rectangles,
+                               sizeof(BITMAP_DATA) * count);
+
+               memset(&bitmap_update->rectangles[bitmap_update->count], 0,
+                               sizeof(BITMAP_DATA) * (count - bitmap_update->count));
+
+               bitmap_update->count = count;
+       }
+
+       /* rectangles */
+       for (i = 0; i < (int) bitmap_update->number; i++)
+       {
+               update_read_bitmap_data(s, &bitmap_update->rectangles[i]);
+       }
+}
+
+void update_read_palette(rdpUpdate* update, STREAM* s, PALETTE_UPDATE* palette_update)
+{
+       int i;
+       PALETTE_ENTRY* entry;
+
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+       stream_read_uint32(s, palette_update->number); /* numberColors (4 bytes), must be set to 256 */
+
+       if (palette_update->number > 256)
+               palette_update->number = 256;
+
+       /* paletteEntries */
+       for (i = 0; i < (int) palette_update->number; i++)
+       {
+               entry = &palette_update->entries[i];
+
+               stream_read_uint8(s, entry->blue);
+               stream_read_uint8(s, entry->green);
+               stream_read_uint8(s, entry->red);
+       }
+}
+
+void update_read_synchronize(rdpUpdate* update, STREAM* s)
+{
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+
+       /**
+        * The Synchronize Update is an artifact from the
+        * T.128 protocol and should be ignored.
+        */
+}
+
+void update_read_play_sound(STREAM* s, PLAY_SOUND_UPDATE* play_sound)
+{
+       stream_read_uint32(s, play_sound->duration); /* duration (4 bytes) */
+       stream_read_uint32(s, play_sound->frequency); /* frequency (4 bytes) */
+}
+
+void update_recv_play_sound(rdpUpdate* update, STREAM* s)
+{
+       update_read_play_sound(s, &update->play_sound);
+       IFCALL(update->PlaySound, update->context, &update->play_sound);
+}
+
+void update_read_pointer_position(STREAM* s, POINTER_POSITION_UPDATE* pointer_position)
+{
+       stream_read_uint16(s, pointer_position->xPos); /* xPos (2 bytes) */
+       stream_read_uint16(s, pointer_position->yPos); /* yPos (2 bytes) */
+}
+
+void update_read_pointer_system(STREAM* s, POINTER_SYSTEM_UPDATE* pointer_system)
+{
+       stream_read_uint32(s, pointer_system->type); /* systemPointerType (4 bytes) */
+}
+
+void update_read_pointer_color(STREAM* s, POINTER_COLOR_UPDATE* pointer_color)
+{
+       stream_read_uint16(s, pointer_color->cacheIndex); /* cacheIndex (2 bytes) */
+       stream_read_uint16(s, pointer_color->xPos); /* xPos (2 bytes) */
+       stream_read_uint16(s, pointer_color->yPos); /* yPos (2 bytes) */
+       stream_read_uint16(s, pointer_color->width); /* width (2 bytes) */
+       stream_read_uint16(s, pointer_color->height); /* height (2 bytes) */
+       stream_read_uint16(s, pointer_color->lengthAndMask); /* lengthAndMask (2 bytes) */
+       stream_read_uint16(s, pointer_color->lengthXorMask); /* lengthXorMask (2 bytes) */
+
+       if (pointer_color->lengthXorMask > 0)
+       {
+               pointer_color->xorMaskData = (uint8*) xmalloc(pointer_color->lengthXorMask);
+               stream_read(s, pointer_color->xorMaskData, pointer_color->lengthXorMask);
+       }
+
+       if (pointer_color->lengthAndMask > 0)
+       {
+               pointer_color->andMaskData = (uint8*) xmalloc(pointer_color->lengthAndMask);
+               stream_read(s, pointer_color->andMaskData, pointer_color->lengthAndMask);
+       }
+
+       if (stream_get_left(s) > 0)
+               stream_seek_uint8(s); /* pad (1 byte) */
+}
+
+void update_read_pointer_new(STREAM* s, POINTER_NEW_UPDATE* pointer_new)
+{
+       stream_read_uint16(s, pointer_new->xorBpp); /* xorBpp (2 bytes) */
+       update_read_pointer_color(s, &pointer_new->colorPtrAttr); /* colorPtrAttr */
+}
+
+void update_read_pointer_cached(STREAM* s, POINTER_CACHED_UPDATE* pointer_cached)
+{
+       stream_read_uint16(s, pointer_cached->cacheIndex); /* cacheIndex (2 bytes) */
+}
+
+void update_recv_pointer(rdpUpdate* update, STREAM* s)
+{
+       uint16 messageType;
+       rdpContext* context = update->context;
+       rdpPointerUpdate* pointer = update->pointer;
+
+       stream_read_uint16(s, messageType); /* messageType (2 bytes) */
+       stream_seek_uint16(s); /* pad2Octets (2 bytes) */
+
+       switch (messageType)
+       {
+               case PTR_MSG_TYPE_POSITION:
+                       update_read_pointer_position(s, &pointer->pointer_position);
+                       IFCALL(pointer->PointerPosition, context, &pointer->pointer_position);
+                       break;
+
+               case PTR_MSG_TYPE_SYSTEM:
+                       update_read_pointer_system(s, &pointer->pointer_system);
+                       IFCALL(pointer->PointerSystem, context, &pointer->pointer_system);
+                       break;
+
+               case PTR_MSG_TYPE_COLOR:
+                       update_read_pointer_color(s, &pointer->pointer_color);
+                       IFCALL(pointer->PointerColor, context, &pointer->pointer_color);
+                       break;
+
+               case PTR_MSG_TYPE_POINTER:
+                       update_read_pointer_new(s, &pointer->pointer_new);
+                       IFCALL(pointer->PointerNew, context, &pointer->pointer_new);
+                       break;
+
+               case PTR_MSG_TYPE_CACHED:
+                       update_read_pointer_cached(s, &pointer->pointer_cached);
+                       IFCALL(pointer->PointerCached, context, &pointer->pointer_cached);
+                       break;
+
+               default:
+                       break;
+       }
+}
+
+void update_recv(rdpUpdate* update, STREAM* s)
+{
+       uint16 updateType;
+       rdpContext* context = update->context;
+
+       stream_read_uint16(s, updateType); /* updateType (2 bytes) */
+
+       //printf("%s Update Data PDU\n", UPDATE_TYPE_STRINGS[updateType]);
+
+       IFCALL(update->BeginPaint, context);
+
+       switch (updateType)
+       {
+               case UPDATE_TYPE_ORDERS:
+                       update_recv_orders(update, s);
+                       break;
+
+               case UPDATE_TYPE_BITMAP:
+                       update_read_bitmap(update, s, &update->bitmap_update);
+                       IFCALL(update->BitmapUpdate, context, &update->bitmap_update);
+                       break;
+
+               case UPDATE_TYPE_PALETTE:
+                       update_read_palette(update, s, &update->palette_update);
+                       IFCALL(update->Palette, context, &update->palette_update);
+                       break;
+
+               case UPDATE_TYPE_SYNCHRONIZE:
+                       update_read_synchronize(update, s);
+                       IFCALL(update->Synchronize, context);
+                       break;
+       }
+
+       IFCALL(update->EndPaint, context);
+
+       if (stream_get_left(s) > RDP_SHARE_DATA_HEADER_LENGTH)
+       {
+               uint16 pduType;
+               uint16 length;
+               uint16 source;
+
+               rdp_read_share_control_header(s, &length, &pduType, &source);
+
+               if (pduType != PDU_TYPE_DATA)
+                       return;
+
+               rdp_recv_data_pdu(update->context->rdp, s);
+       }
+}
+
+void update_reset_state(rdpUpdate* update)
+{
+       rdpPrimaryUpdate* primary = update->primary;
+       rdpAltSecUpdate* altsec = update->altsec;
+
+       memset(&primary->order_info, 0, sizeof(ORDER_INFO));
+       memset(&primary->dstblt, 0, sizeof(DSTBLT_ORDER));
+       memset(&primary->patblt, 0, sizeof(PATBLT_ORDER));
+       memset(&primary->scrblt, 0, sizeof(SCRBLT_ORDER));
+       memset(&primary->opaque_rect, 0, sizeof(OPAQUE_RECT_ORDER));
+       memset(&primary->draw_nine_grid, 0, sizeof(DRAW_NINE_GRID_ORDER));
+       memset(&primary->multi_dstblt, 0, sizeof(MULTI_DSTBLT_ORDER));
+       memset(&primary->multi_patblt, 0, sizeof(MULTI_PATBLT_ORDER));
+       memset(&primary->multi_scrblt, 0, sizeof(MULTI_SCRBLT_ORDER));
+       memset(&primary->multi_opaque_rect, 0, sizeof(MULTI_OPAQUE_RECT_ORDER));
+       memset(&primary->multi_draw_nine_grid, 0, sizeof(MULTI_DRAW_NINE_GRID_ORDER));
+       memset(&primary->line_to, 0, sizeof(LINE_TO_ORDER));
+       memset(&primary->polyline, 0, sizeof(POLYLINE_ORDER));
+       memset(&primary->memblt, 0, sizeof(MEMBLT_ORDER));
+       memset(&primary->mem3blt, 0, sizeof(MEM3BLT_ORDER));
+       memset(&primary->save_bitmap, 0, sizeof(SAVE_BITMAP_ORDER));
+       memset(&primary->glyph_index, 0, sizeof(GLYPH_INDEX_ORDER));
+       memset(&primary->fast_index, 0, sizeof(FAST_INDEX_ORDER));
+       memset(&primary->fast_glyph, 0, sizeof(FAST_GLYPH_ORDER));
+       memset(&primary->polygon_sc, 0, sizeof(POLYGON_SC_ORDER));
+       memset(&primary->polygon_cb, 0, sizeof(POLYGON_CB_ORDER));
+       memset(&primary->ellipse_sc, 0, sizeof(ELLIPSE_SC_ORDER));
+       memset(&primary->ellipse_cb, 0, sizeof(ELLIPSE_CB_ORDER));
+
+       primary->order_info.orderType = ORDER_TYPE_PATBLT;
+       altsec->switch_surface.bitmapId = SCREEN_BITMAP_SURFACE;
+       IFCALL(altsec->SwitchSurface, update->context, &(altsec->switch_surface));
+}
+
+static void update_begin_paint(rdpContext* context)
+{
+
+}
+
+static void update_end_paint(rdpContext* context)
+{
+
+}
+
+static void update_write_refresh_rect(STREAM* s, uint8 count, RECTANGLE_16* areas)
+{
+       int i;
+
+       stream_write_uint8(s, count); /* numberOfAreas (1 byte) */
+       stream_seek(s, 3); /* pad3Octets (3 bytes) */
+
+       for (i = 0; i < count; i++)
+               freerdp_write_rectangle_16(s, &areas[i]);
+}
+
+static void update_send_refresh_rect(rdpContext* context, uint8 count, RECTANGLE_16* areas)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = rdp_data_pdu_init(rdp);
+       update_write_refresh_rect(s, count, areas);
+
+       rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_REFRESH_RECT, rdp->mcs->user_id);
+}
+
+static void update_write_suppress_output(STREAM* s, uint8 allow, RECTANGLE_16* area)
+{
+       stream_write_uint8(s, allow); /* allowDisplayUpdates (1 byte) */
+       stream_seek(s, 3); /* pad3Octets (3 bytes) */
+
+       if (allow > 0)
+               freerdp_write_rectangle_16(s, area);
+}
+
+static void update_send_suppress_output(rdpContext* context, uint8 allow, RECTANGLE_16* area)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = rdp_data_pdu_init(rdp);
+       update_write_suppress_output(s, allow, area);
+
+       rdp_send_data_pdu(rdp, s, DATA_PDU_TYPE_SUPPRESS_OUTPUT, rdp->mcs->user_id);
+}
+
+static void update_send_surface_command(rdpContext* context, STREAM* s)
+{
+       STREAM* update;
+       rdpRdp* rdp = context->rdp;
+
+       update = fastpath_update_pdu_init(rdp->fastpath);
+       stream_check_size(update, stream_get_length(s));
+       stream_write(update, stream_get_head(s), stream_get_length(s));
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, update);
+}
+
+static void update_send_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+       stream_check_size(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) surface_bits_command->bitmapDataLength);
+       update_write_surfcmd_surface_bits_header(s, surface_bits_command);
+       stream_write(s, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s);
+}
+
+static void update_send_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surface_frame_marker)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+       update_write_surfcmd_frame_marker(s, surface_frame_marker->frameAction, surface_frame_marker->frameId);
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s);
+}
+
+static void update_send_synchronize(rdpContext* context)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+       stream_write_zero(s, 2); /* pad2Octets (2 bytes) */
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SYNCHRONIZE, s);
+}
+
+static void update_send_desktop_resize(rdpContext* context)
+{
+       rdp_server_reactivate(context->rdp);
+}
+
+static void update_send_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+
+       stream_write_uint16(s, 1); /* numberOrders (2 bytes) */
+       stream_write_uint8(s, ORDER_STANDARD | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */
+       stream_write_uint8(s, ORDER_TYPE_SCRBLT); /* orderType (1 byte) */
+       stream_write_uint8(s, 0x7F); /* fieldFlags (variable) */
+
+       stream_write_uint16(s, scrblt->nLeftRect);
+       stream_write_uint16(s, scrblt->nTopRect);
+       stream_write_uint16(s, scrblt->nWidth);
+       stream_write_uint16(s, scrblt->nHeight);
+       stream_write_uint8(s, scrblt->bRop);
+       stream_write_uint16(s, scrblt->nXSrc);
+       stream_write_uint16(s, scrblt->nYSrc);
+
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_ORDERS, s);
+}
+
+static void update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system)
+{
+       STREAM* s;
+       uint8 updateCode;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+       if (pointer_system->type == SYSPTR_NULL)
+               updateCode = FASTPATH_UPDATETYPE_PTR_NULL;
+       else
+               updateCode = FASTPATH_UPDATETYPE_PTR_DEFAULT;
+       fastpath_send_update_pdu(rdp->fastpath, updateCode, s);
+}
+
+static void update_write_pointer_color(STREAM* s, POINTER_COLOR_UPDATE* pointer_color)
+{
+       stream_check_size(s, 15 + (int) pointer_color->lengthAndMask + (int) pointer_color->lengthXorMask);
+       stream_write_uint16(s, pointer_color->cacheIndex);
+       stream_write_uint16(s, pointer_color->xPos);
+       stream_write_uint16(s, pointer_color->yPos);
+       stream_write_uint16(s, pointer_color->width);
+       stream_write_uint16(s, pointer_color->height);
+       stream_write_uint16(s, pointer_color->lengthAndMask);
+       stream_write_uint16(s, pointer_color->lengthXorMask);
+       if (pointer_color->lengthXorMask > 0)
+               stream_write(s, pointer_color->xorMaskData, pointer_color->lengthXorMask);
+       if (pointer_color->lengthAndMask > 0)
+               stream_write(s, pointer_color->andMaskData, pointer_color->lengthAndMask);
+       stream_write_uint8(s, 0); /* pad (1 byte) */
+}
+
+static void update_send_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+        update_write_pointer_color(s, pointer_color);
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_COLOR, s);
+}
+
+static void update_send_pointer_new(rdpContext* context, POINTER_NEW_UPDATE* pointer_new)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+       stream_write_uint16(s, pointer_new->xorBpp); /* xorBpp (2 bytes) */
+        update_write_pointer_color(s, &pointer_new->colorPtrAttr);
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_POINTER, s);
+}
+
+static void update_send_pointer_cached(rdpContext* context, POINTER_CACHED_UPDATE* pointer_cached)
+{
+       STREAM* s;
+       rdpRdp* rdp = context->rdp;
+
+       s = fastpath_update_pdu_init(rdp->fastpath);
+       stream_write_uint16(s, pointer_cached->cacheIndex); /* cacheIndex (2 bytes) */
+       fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_CACHED, s);
+}
+
+void update_register_server_callbacks(rdpUpdate* update)
+{
+       update->BeginPaint = update_begin_paint;
+       update->EndPaint = update_end_paint;
+       update->Synchronize = update_send_synchronize;
+       update->DesktopResize = update_send_desktop_resize;
+       update->RefreshRect = update_send_refresh_rect;
+       update->SuppressOutput = update_send_suppress_output;
+       update->SurfaceBits = update_send_surface_bits;
+       update->SurfaceFrameMarker = update_send_surface_frame_marker;
+       update->SurfaceCommand = update_send_surface_command;
+       update->primary->ScrBlt = update_send_scrblt;
+       update->pointer->PointerSystem = update_send_pointer_system;
+       update->pointer->PointerColor = update_send_pointer_color;
+       update->pointer->PointerNew = update_send_pointer_new;
+       update->pointer->PointerCached = update_send_pointer_cached;
+}
+
+rdpUpdate* update_new(rdpRdp* rdp)
+{
+       rdpUpdate* update;
+
+       update = (rdpUpdate*) xzalloc(sizeof(rdpUpdate));
+
+       if (update != NULL)
+       {
+               OFFSCREEN_DELETE_LIST* deleteList;
+
+               update->bitmap_update.count = 64;
+               update->bitmap_update.rectangles = (BITMAP_DATA*) xzalloc(sizeof(BITMAP_DATA) * update->bitmap_update.count);
+
+               update->pointer = xnew(rdpPointerUpdate);
+               update->primary = xnew(rdpPrimaryUpdate);
+               update->secondary = xnew(rdpSecondaryUpdate);
+               update->altsec = xnew(rdpAltSecUpdate);
+               update->window = xnew(rdpWindowUpdate);
+
+               deleteList = &(update->altsec->create_offscreen_bitmap.deleteList);
+               deleteList->sIndices = 64;
+               deleteList->indices = xmalloc(deleteList->sIndices * 2);
+               deleteList->cIndices = 0;
+
+               update->SuppressOutput = update_send_suppress_output;
+       }
+
+       return update;
+}
+
+void update_free(rdpUpdate* update)
+{
+       if (update != NULL)
+       {
+               OFFSCREEN_DELETE_LIST* deleteList;
+               deleteList = &(update->altsec->create_offscreen_bitmap.deleteList);
+               xfree(deleteList->indices);
+
+               xfree(update->bitmap_update.rectangles);
+               xfree(update->pointer);
+               xfree(update->primary);
+               xfree(update->secondary);
+               xfree(update->altsec);
+               xfree(update->window);
+               xfree(update);
+       }
+}
+
diff --git a/libfreerdp-core/update.h b/libfreerdp-core/update.h
new file mode 100644 (file)
index 0000000..a7119e5
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Update Data PDUs
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __UPDATE_H
+#define __UPDATE_H
+
+#include "rdp.h"
+#include "orders.h"
+#include <freerdp/types.h>
+#include <freerdp/update.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/utils/stream.h>
+
+#define UPDATE_TYPE_ORDERS             0x0000
+#define UPDATE_TYPE_BITMAP             0x0001
+#define UPDATE_TYPE_PALETTE            0x0002
+#define UPDATE_TYPE_SYNCHRONIZE                0x0003
+
+#define BITMAP_COMPRESSION             0x0001
+#define NO_BITMAP_COMPRESSION_HDR      0x0400
+
+rdpUpdate* update_new(rdpRdp* rdp);
+void update_free(rdpUpdate* update);
+void update_free_bitmap(BITMAP_UPDATE* bitmap_update);
+void update_reset_state(rdpUpdate* update);
+
+void update_read_bitmap(rdpUpdate* update, STREAM* s, BITMAP_UPDATE* bitmap_update);
+void update_read_palette(rdpUpdate* update, STREAM* s, PALETTE_UPDATE* palette_update);
+void update_recv_play_sound(rdpUpdate* update, STREAM* s);
+void update_recv_pointer(rdpUpdate* update, STREAM* s);
+void update_recv(rdpUpdate* update, STREAM* s);
+
+void update_read_pointer_position(STREAM* s, POINTER_POSITION_UPDATE* pointer_position);
+void update_read_pointer_system(STREAM* s, POINTER_SYSTEM_UPDATE* pointer_system);
+void update_read_pointer_color(STREAM* s, POINTER_COLOR_UPDATE* pointer_color);
+void update_read_pointer_new(STREAM* s, POINTER_NEW_UPDATE* pointer_new);
+void update_read_pointer_cached(STREAM* s, POINTER_CACHED_UPDATE* pointer_cached);
+
+void update_register_server_callbacks(rdpUpdate* update);
+
+#endif /* __UPDATE_H */
diff --git a/libfreerdp-core/window.c b/libfreerdp-core/window.c
new file mode 100644 (file)
index 0000000..3505819
--- /dev/null
@@ -0,0 +1,341 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windowing Alternate Secondary Orders
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/rail.h>
+#include <freerdp/utils/memory.h>
+
+#include "window.h"
+
+void update_read_icon_info(STREAM* s, ICON_INFO* icon_info)
+{
+       stream_read_uint16(s, icon_info->cacheEntry); /* cacheEntry (2 bytes) */
+       stream_read_uint8(s, icon_info->cacheId); /* cacheId (1 byte) */
+       stream_read_uint8(s, icon_info->bpp); /* bpp (1 byte) */
+       stream_read_uint16(s, icon_info->width); /* width (2 bytes) */
+       stream_read_uint16(s, icon_info->height); /* height (2 bytes) */
+
+       /* cbColorTable is only present when bpp is 1, 2 or 4 */
+       if (icon_info->bpp == 1 || icon_info->bpp == 2 || icon_info->bpp == 4)
+               stream_read_uint16(s, icon_info->cbColorTable); /* cbColorTable (2 bytes) */
+       else
+               icon_info->cbColorTable = 0;
+
+       stream_read_uint16(s, icon_info->cbBitsMask); /* cbBitsMask (2 bytes) */
+       stream_read_uint16(s, icon_info->cbBitsColor); /* cbBitsColor (2 bytes) */
+
+       /* bitsMask */
+       if (icon_info->bitsMask == NULL)
+               icon_info->bitsMask = (uint8*) xmalloc(icon_info->cbBitsMask);
+       else
+               icon_info->bitsMask = (uint8*) xrealloc(icon_info->bitsMask, icon_info->cbBitsMask);
+       stream_read(s, icon_info->bitsMask, icon_info->cbBitsMask);
+
+       /* colorTable */
+       if (icon_info->colorTable == NULL)
+               icon_info->colorTable = (uint8*) xmalloc(icon_info->cbColorTable);
+       else
+               icon_info->colorTable = (uint8*) xrealloc(icon_info->colorTable, icon_info->cbColorTable);
+       stream_read(s, icon_info->colorTable, icon_info->cbColorTable);
+
+       /* bitsColor */
+       if (icon_info->bitsColor == NULL)
+               icon_info->bitsColor = (uint8*) xmalloc(icon_info->cbBitsColor);
+       else
+               icon_info->bitsColor = (uint8*) xrealloc(icon_info->bitsColor, icon_info->cbBitsColor);
+       stream_read(s, icon_info->bitsColor, icon_info->cbBitsColor);
+}
+
+void update_read_cached_icon_info(STREAM* s, CACHED_ICON_INFO* cached_icon_info)
+{
+       stream_read_uint16(s, cached_icon_info->cacheEntry); /* cacheEntry (2 bytes) */
+       stream_read_uint8(s, cached_icon_info->cacheId); /* cacheId (1 byte) */
+}
+
+void update_read_notify_icon_infotip(STREAM* s, NOTIFY_ICON_INFOTIP* notify_icon_infotip)
+{
+       stream_read_uint32(s, notify_icon_infotip->timeout); /* timeout (4 bytes) */
+       stream_read_uint32(s, notify_icon_infotip->flags); /* infoFlags (4 bytes) */
+       rail_read_unicode_string(s, &notify_icon_infotip->text); /* infoTipText */
+       rail_read_unicode_string(s, &notify_icon_infotip->title); /* title */
+}
+
+void update_read_window_state_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
+{
+       int i;
+       int size;
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
+               stream_read_uint32(s, window_state->ownerWindowId); /* ownerWindowId (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
+       {
+               stream_read_uint32(s, window_state->style); /* style (4 bytes) */
+               stream_read_uint32(s, window_state->extendedStyle); /* extendedStyle (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
+               stream_read_uint8(s, window_state->showState); /* showState (1 byte) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
+               rail_read_unicode_string(s, &window_state->titleInfo); /* titleInfo */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
+       {
+               stream_read_uint32(s, window_state->clientOffsetX); /* clientOffsetX (4 bytes) */
+               stream_read_uint32(s, window_state->clientOffsetY); /* clientOffsetY (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
+       {
+               stream_read_uint32(s, window_state->clientAreaWidth); /* clientAreaWidth (4 bytes) */
+               stream_read_uint32(s, window_state->clientAreaHeight); /* clientAreaHeight (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
+               stream_read_uint8(s, window_state->RPContent); /* RPContent (1 byte) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
+               stream_read_uint32(s, window_state->rootParentHandle);/* rootParentHandle (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET)
+       {
+               stream_read_uint32(s, window_state->windowOffsetX); /* windowOffsetX (4 bytes) */
+               stream_read_uint32(s, window_state->windowOffsetY); /* windowOffsetY (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
+       {
+               stream_read_uint32(s, window_state->windowClientDeltaX); /* windowClientDeltaX (4 bytes) */
+               stream_read_uint32(s, window_state->windowClientDeltaY); /* windowClientDeltaY (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)
+       {
+               stream_read_uint32(s, window_state->windowWidth); /* windowWidth (4 bytes) */
+               stream_read_uint32(s, window_state->windowHeight); /* windowHeight (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
+       {
+               stream_read_uint16(s, window_state->numWindowRects); /* numWindowRects (2 bytes) */
+
+               size = sizeof(RECTANGLE_16) * window_state->numWindowRects;
+               window_state->windowRects = (RECTANGLE_16*) xmalloc(size);
+
+               /* windowRects */
+               for (i = 0; i < (int) window_state->numWindowRects; i++)
+               {
+                       freerdp_read_rectangle_16(s, &window_state->windowRects[i]);
+               }
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
+       {
+               stream_read_uint32(s, window_state->visibleOffsetX); /* visibleOffsetX (4 bytes) */
+               stream_read_uint32(s, window_state->visibleOffsetY); /* visibleOffsetY (4 bytes) */
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
+       {
+               stream_read_uint16(s, window_state->numVisibilityRects); /* numVisibilityRects (2 bytes) */
+
+               size = sizeof(RECTANGLE_16) * window_state->numVisibilityRects;
+               window_state->visibilityRects = (RECTANGLE_16*) xmalloc(size);
+
+               /* visibilityRects */
+               for (i = 0; i < (int) window_state->numVisibilityRects; i++)
+               {
+                       freerdp_read_rectangle_16(s, &window_state->visibilityRects[i]);
+               }
+       }
+}
+
+void update_read_window_icon_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* window_icon)
+{
+       window_icon->iconInfo = (ICON_INFO*) xzalloc(sizeof(ICON_INFO));
+       update_read_icon_info(s, window_icon->iconInfo); /* iconInfo (ICON_INFO) */
+}
+
+void update_read_window_cached_icon_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon)
+{
+       update_read_cached_icon_info(s, &window_cached_icon->cachedIcon); /* cachedIcon (CACHED_ICON_INFO) */
+}
+
+void update_read_window_delete_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo)
+{
+       /* window deletion event */
+}
+
+void update_recv_window_info_order(rdpUpdate* update, STREAM* s, WINDOW_ORDER_INFO* orderInfo)
+{
+       rdpContext* context = update->context;
+       rdpWindowUpdate* window = update->window;
+
+       stream_read_uint32(s, orderInfo->windowId); /* windowId (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_ICON)
+       {
+               DEBUG_WND("Window Icon Order");
+               update_read_window_icon_order(s, orderInfo, &window->window_icon);
+               IFCALL(window->WindowIcon, context, orderInfo, &window->window_icon);
+       }
+       else if (orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON)
+       {
+               DEBUG_WND("Window Cached Icon Order");
+               update_read_window_cached_icon_order(s, orderInfo, &window->window_cached_icon);
+               IFCALL(window->WindowCachedIcon, context, orderInfo, &window->window_cached_icon);
+       }
+       else if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_DELETED)
+       {
+               DEBUG_WND("Window Deleted Order");
+               update_read_window_delete_order(s, orderInfo);
+               IFCALL(window->WindowDelete, context, orderInfo);
+       }
+       else
+       {
+               DEBUG_WND("Window State Order");
+               update_read_window_state_order(s, orderInfo, &window->window_state);
+
+               if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_NEW)
+                       IFCALL(window->WindowCreate, context, orderInfo, &window->window_state);
+               else
+                       IFCALL(window->WindowUpdate, context, orderInfo, &window->window_state);
+       }
+}
+
+void update_read_notification_icon_state_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state)
+{
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_VERSION)
+               stream_read_uint32(s, notify_icon_state->version); /* version (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_TIP)
+               rail_read_unicode_string(s, &notify_icon_state->toolTip); /* toolTip (UNICODE_STRING) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP)
+               update_read_notify_icon_infotip(s, &notify_icon_state->infoTip); /* infoTip (NOTIFY_ICON_INFOTIP) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_STATE)
+               stream_read_uint32(s, notify_icon_state->state); /* state (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_ICON)
+               update_read_icon_info(s, &notify_icon_state->icon); /* icon (ICON_INFO) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON)
+               update_read_cached_icon_info(s, &notify_icon_state->cachedIcon); /* cachedIcon (CACHED_ICON_INFO) */
+}
+
+void update_read_notification_icon_delete_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo)
+{
+       /* notification icon deletion event */
+}
+
+void update_recv_notification_icon_info_order(rdpUpdate* update, STREAM* s, WINDOW_ORDER_INFO* orderInfo)
+{
+       rdpContext* context = update->context;
+       rdpWindowUpdate* window = update->window;
+
+       stream_read_uint32(s, orderInfo->windowId); /* windowId (4 bytes) */
+       stream_read_uint32(s, orderInfo->notifyIconId); /* notifyIconId (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_DELETED)
+       {
+               DEBUG_WND("Delete Notification Icon Deleted Order");
+               update_read_notification_icon_delete_order(s, orderInfo);
+               IFCALL(window->NotifyIconDelete, context, orderInfo);
+       }
+       else
+       {
+               DEBUG_WND("Notification Icon State Order");
+               update_read_notification_icon_state_order(s, orderInfo, &window->notify_icon_state);
+
+               if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_NEW)
+                       IFCALL(window->NotifyIconCreate, context, orderInfo, &window->notify_icon_state);
+               else
+                       IFCALL(window->NotifyIconUpdate, context, orderInfo, &window->notify_icon_state);
+       }
+}
+
+void update_read_desktop_actively_monitored_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitored_desktop)
+{
+       int i;
+       int size;
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND)
+               stream_read_uint32(s, monitored_desktop->activeWindowId); /* activeWindowId (4 bytes) */
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ZORDER)
+       {
+               stream_read_uint8(s, monitored_desktop->numWindowIds); /* numWindowIds (1 byte) */
+
+               size = sizeof(uint32) * monitored_desktop->numWindowIds;
+
+               if (monitored_desktop->windowIds == NULL)
+                       monitored_desktop->windowIds = (uint32*) xmalloc(size);
+               else
+                       monitored_desktop->windowIds = (uint32*) xrealloc(monitored_desktop->windowIds, size);
+
+               /* windowIds */
+               for (i = 0; i < (int) monitored_desktop->numWindowIds; i++)
+               {
+                       stream_read_uint32(s, monitored_desktop->windowIds[i]);
+               }
+       }
+}
+
+void update_read_desktop_non_monitored_order(STREAM* s, WINDOW_ORDER_INFO* orderInfo)
+{
+       /* non-monitored desktop notification event */
+}
+
+void update_recv_desktop_info_order(rdpUpdate* update, STREAM* s, WINDOW_ORDER_INFO* orderInfo)
+{
+       rdpContext* context = update->context;
+       rdpWindowUpdate* window = update->window;
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_NONE)
+       {
+               DEBUG_WND("Non-Monitored Desktop Order");
+               update_read_desktop_non_monitored_order(s, orderInfo);
+               IFCALL(window->NonMonitoredDesktop, context, orderInfo);
+       }
+       else
+       {
+               DEBUG_WND("Actively Monitored Desktop Order");
+               update_read_desktop_actively_monitored_order(s, orderInfo, &window->monitored_desktop);
+               IFCALL(window->MonitoredDesktop, context, orderInfo, &window->monitored_desktop);
+       }
+}
+
+void update_recv_altsec_window_order(rdpUpdate* update, STREAM* s)
+{
+       uint16 orderSize;
+       rdpWindowUpdate* window = update->window;
+
+       stream_read_uint16(s, orderSize); /* orderSize (2 bytes) */
+       stream_read_uint32(s, window->orderInfo.fieldFlags); /* FieldsPresentFlags (4 bytes) */
+
+       if (window->orderInfo.fieldFlags & WINDOW_ORDER_TYPE_WINDOW)
+               update_recv_window_info_order(update, s, &window->orderInfo);
+       else if (window->orderInfo.fieldFlags & WINDOW_ORDER_TYPE_NOTIFY)
+               update_recv_notification_icon_info_order(update, s, &window->orderInfo);
+       else if (window->orderInfo.fieldFlags & WINDOW_ORDER_TYPE_DESKTOP)
+               update_recv_desktop_info_order(update, s, &window->orderInfo);
+}
+
diff --git a/libfreerdp-core/window.h b/libfreerdp-core/window.h
new file mode 100644 (file)
index 0000000..3ee0dff
--- /dev/null
@@ -0,0 +1,36 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Windowing Alternate Secondary Orders
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Roman Barabanov <romanbarabanov@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __WINDOW_H
+#define __WINDOW_H
+
+#include "update.h"
+
+#include <freerdp/utils/stream.h>
+
+void update_recv_altsec_window_order(rdpUpdate* update, STREAM* s);
+
+#ifdef WITH_DEBUG_WND
+#define DEBUG_WND(fmt, ...) DEBUG_CLASS(WND, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_WND(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __WINDOW_H */
diff --git a/libfreerdp-gdi/16bpp.c b/libfreerdp-gdi/16bpp.c
new file mode 100644 (file)
index 0000000..70f41ca
--- /dev/null
@@ -0,0 +1,1024 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI 16bpp Internal Buffer Routines
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/gdi/pen.h>
+#include <freerdp/gdi/bitmap.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/gdi/clipping.h>
+#include <freerdp/gdi/drawing.h>
+
+#include <freerdp/gdi/16bpp.h>
+
+uint16 gdi_get_color_16bpp(HGDI_DC hdc, GDI_COLOR color)
+{
+       uint8 r, g, b;
+       uint16 color16;
+
+       GetBGR32(r, g, b, color);
+
+       if (hdc->rgb555)
+       {
+               if (hdc->invert)
+               {
+                       color16 = BGR15(r, g, b);
+               }
+               else
+               {
+                       color16 = RGB15(r, g, b);
+               }
+       }
+       else
+       {
+               if (hdc->invert)
+               {
+                       color16 = BGR16(r, g, b);
+               }
+               else
+               {
+                       color16 = RGB16(r, g, b);
+               }
+       }
+
+       return color16;
+}
+
+int FillRect_16bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr)
+{
+       int x, y;
+       uint16 *dstp;
+       int nXDest, nYDest;
+       int nWidth, nHeight;
+
+       uint16 color16;
+       
+       gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight);
+       
+       if (gdi_ClipCoords(hdc, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0)
+               return 0;
+
+       color16 = gdi_get_color_16bpp(hdc, hbr->color);
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdc, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = color16;
+                               dstp++;
+                       }
+               }
+       }
+
+       gdi_InvalidateRegion(hdc, nXDest, nYDest, nWidth, nHeight);
+       return 0;
+}
+
+static int BitBlt_BLACKNESS_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int y;
+       uint8* dstp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+                       memset(dstp, 0, nWidth * hdcDest->bytesPerPixel);
+       }
+
+       return 0;
+}
+
+static int BitBlt_WHITENESS_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int y;
+       uint8* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+                       memset(dstp, 0xFF, nWidth * hdcDest->bytesPerPixel);
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCCOPY_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int y;
+       uint8* srcp;
+       uint8* dstp;
+
+       if ((hdcDest->selectedObject != hdcSrc->selectedObject) ||
+           gdi_CopyOverlap(nXDest, nYDest, nWidth, nHeight, nXSrc, nYSrc) == 0)
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memcpy(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+
+               return 0;
+       }
+       
+       if (nYSrc < nYDest)
+       {
+               /* copy down (bottom to top) */
+               for (y = nHeight - 1; y >= 0; y--)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       else if (nYSrc > nYDest || nXSrc > nXDest)
+       {
+               /* copy up or left (top top bottom) */
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       else
+       {
+               /* copy straight right */
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_NOTSRCCOPY_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSTINVERT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint16* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*dstp);
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCERASE_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = *srcp & ~(*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_NOTSRCERASE_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp) & ~(*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCINVERT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp ^= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCAND_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp &= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCPAINT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp |= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSPDxax_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{      
+       int x, y;
+       uint8* srcp;
+       uint16* dstp;
+       uint16 src16;
+       uint16 color16;
+       HGDI_BITMAP hSrcBmp;
+
+       /* D = (S & P) | (~S & D) */
+       /* DSPDxax, used to draw glyphs */
+
+       color16 = gdi_get_color_16bpp(hdcDest, hdcDest->textColor);
+
+       hSrcBmp = (HGDI_BITMAP) hdcSrc->selectedObject;
+
+       if (hdcSrc->bytesPerPixel != 1)
+       {
+               printf("BitBlt_DSPDxax expects 1 bpp, unimplemented for %d\n", hdcSrc->bytesPerPixel);
+               return 0;
+       }
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint8*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               src16 = (*srcp << 8) | *srcp;
+                               *dstp = (src16 & color16) | (~src16 & *dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SPna_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+       uint16* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+                               *dstp = *srcp & ~(*patp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PDxn_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint16* dstp;
+       uint16* patp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+                               *dstp = *dstp ^ ~(*patp);
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSna_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp) & (*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+
+static int BitBlt_MERGECOPY_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+       uint16* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+                               *dstp = *srcp & *patp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_MERGEPAINT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {                               
+                               *dstp = ~(*srcp) | *dstp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATCOPY_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint16* dstp;
+       uint16* patp;
+       uint16 color16;
+
+       if (hdcDest->brush->style == GDI_BS_SOLID)
+       {
+               color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color);
+
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp = color16;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+                                       *dstp = *patp;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_PATINVERT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint16* dstp;
+       uint16* patp;
+       uint16 color16;
+
+       if (hdcDest->brush->style == GDI_BS_SOLID)
+       {
+               color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color);
+
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp ^= color16;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+                                       *dstp = *patp ^ *dstp;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATPAINT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint16* srcp;
+       uint16* dstp;
+       uint16* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+                               *dstp = *dstp | (*patp | ~(*srcp));
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+int BitBlt_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop)
+{
+       if (hdcSrc != NULL)
+       {
+               if (gdi_ClipCoords(hdcDest, &nXDest, &nYDest, &nWidth, &nHeight, &nXSrc, &nYSrc) == 0)
+                       return 0;
+       }
+       else
+       {
+               if (gdi_ClipCoords(hdcDest, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0)
+                       return 0;
+       }
+       
+       gdi_InvalidateRegion(hdcDest, nXDest, nYDest, nWidth, nHeight);
+       
+       switch (rop)
+       {
+               case GDI_BLACKNESS:
+                       return BitBlt_BLACKNESS_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_WHITENESS:
+                       return BitBlt_WHITENESS_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_SRCCOPY:
+                       return BitBlt_SRCCOPY_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SPna:
+                       return BitBlt_SPna_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSna:
+                       return BitBlt_DSna_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSPDxax:
+                       return BitBlt_DSPDxax_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+                       
+               case GDI_NOTSRCCOPY:
+                       return BitBlt_NOTSRCCOPY_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSTINVERT:
+                       return BitBlt_DSTINVERT_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_SRCERASE:
+                       return BitBlt_SRCERASE_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_NOTSRCERASE:
+                       return BitBlt_NOTSRCERASE_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCINVERT:
+                       return BitBlt_SRCINVERT_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCAND:
+                       return BitBlt_SRCAND_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCPAINT:
+                       return BitBlt_SRCPAINT_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_MERGECOPY:
+                       return BitBlt_MERGECOPY_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_MERGEPAINT:
+                       return BitBlt_MERGEPAINT_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_PATCOPY:
+                       return BitBlt_PATCOPY_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_PATINVERT:
+                       return BitBlt_PATINVERT_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_PATPAINT:
+                       return BitBlt_PATPAINT_16bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+       }
+       
+       printf("BitBlt: unknown rop: 0x%08X\n", rop);
+       return 1;
+}
+
+int PatBlt_16bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop)
+{
+       if (gdi_ClipCoords(hdc, &nXLeft, &nYLeft, &nWidth, &nHeight, NULL, NULL) == 0)
+               return 0;
+       
+       gdi_InvalidateRegion(hdc, nXLeft, nYLeft, nWidth, nHeight);
+
+       switch (rop)
+       {
+               case GDI_PATCOPY:
+                       return BitBlt_PATCOPY_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_PATINVERT:
+                       return BitBlt_PATINVERT_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+                       
+               case GDI_DSTINVERT:
+                       return BitBlt_DSTINVERT_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_BLACKNESS:
+                       return BitBlt_BLACKNESS_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_WHITENESS:
+                       return BitBlt_WHITENESS_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_PDxn:
+                       return BitBlt_PDxn_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               default:
+                       break;
+       }
+       
+       printf("PatBlt: unknown rop: 0x%08X\n", rop);
+
+       return 1;
+}
+
+INLINE void SetPixel_BLACK_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = 0 */
+       *pixel = 0;
+}
+
+INLINE void SetPixel_NOTMERGEPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = ~(D | P) */
+       *pixel = ~(*pixel | *pen);
+}
+
+INLINE void SetPixel_MASKNOTPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = D & ~P */
+       *pixel &= ~(*pen);
+}
+
+INLINE void SetPixel_NOTCOPYPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = ~P */
+       *pixel = ~(*pen);
+}
+
+INLINE void SetPixel_MASKPENNOT_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = P & ~D */
+       *pixel = *pen & ~*pixel;
+}
+
+INLINE void SetPixel_NOT_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = ~D */
+       *pixel = ~(*pixel);
+}
+
+INLINE void SetPixel_XORPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = D ^ P */
+       *pixel = *pixel ^ *pen;
+}
+
+INLINE void SetPixel_NOTMASKPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = ~(D & P) */
+       *pixel = ~(*pixel & *pen);
+}
+
+INLINE void SetPixel_MASKPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = D & P */
+       *pixel &= *pen;
+}
+
+INLINE void SetPixel_NOTXORPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = ~(D ^ P) */
+       *pixel = ~(*pixel ^ *pen);
+}
+
+INLINE void SetPixel_NOP_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = D */
+}
+
+INLINE void SetPixel_MERGENOTPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = D | ~P */
+       *pixel |= ~(*pen);
+}
+
+INLINE void SetPixel_COPYPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = P */
+       *pixel = *pen;
+}
+
+INLINE void SetPixel_MERGEPENNOT_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = P | ~D */
+       *pixel = *pen | ~(*pixel);
+}
+
+INLINE void SetPixel_MERGEPEN_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = P | D */
+       *pixel |= *pen;
+}
+
+INLINE void SetPixel_WHITE_16bpp(uint16 *pixel, uint16 *pen)
+{
+       /* D = 1 */
+       *pixel = 0xFFFF;
+}
+
+#define PIXEL_TYPE             uint16
+#define GDI_GET_POINTER                gdi_GetPointer_16bpp
+#define GDI_GET_PEN_COLOR      gdi_GetPenColor_16bpp
+
+#define LINE_TO                        LineTo_BLACK_16bpp
+#define SET_PIXEL_ROP2         SetPixel_BLACK_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTMERGEPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTMERGEPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKNOTPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKNOTPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTCOPYPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTCOPYPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKPENNOT_16bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKPENNOT_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOT_16bpp
+#define SET_PIXEL_ROP2         SetPixel_NOT_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_XORPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_XORPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTMASKPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTMASKPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTXORPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTXORPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOP_16bpp
+#define SET_PIXEL_ROP2         SetPixel_NOP_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGENOTPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGENOTPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_COPYPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_COPYPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGEPENNOT_16bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGEPENNOT_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGEPEN_16bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGEPEN_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_WHITE_16bpp
+#define SET_PIXEL_ROP2         SetPixel_WHITE_16bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#undef PIXEL_TYPE
+#undef GDI_GET_POINTER
+#undef GDI_GET_PEN_COLOR
+
+pLineTo_16bpp LineTo_ROP2_16bpp[32] =
+{
+       LineTo_BLACK_16bpp,
+       LineTo_NOTMERGEPEN_16bpp,
+       LineTo_MASKNOTPEN_16bpp,
+       LineTo_NOTCOPYPEN_16bpp,
+       LineTo_MASKPENNOT_16bpp,
+       LineTo_NOT_16bpp,
+       LineTo_XORPEN_16bpp,
+       LineTo_NOTMASKPEN_16bpp,
+       LineTo_MASKPEN_16bpp,
+       LineTo_NOTXORPEN_16bpp,
+       LineTo_NOP_16bpp,
+       LineTo_MERGENOTPEN_16bpp,
+       LineTo_COPYPEN_16bpp,
+       LineTo_MERGEPENNOT_16bpp,
+       LineTo_MERGEPEN_16bpp,
+       LineTo_WHITE_16bpp
+};
+
+int LineTo_16bpp(HGDI_DC hdc, int nXEnd, int nYEnd)
+{
+       pLineTo_16bpp _LineTo;
+       int rop2 = gdi_GetROP2(hdc) - 1;
+
+       _LineTo = LineTo_ROP2_16bpp[rop2];
+
+       if (_LineTo != NULL)
+               return _LineTo(hdc, nXEnd, nYEnd);
+       else
+               return 0;
+}
diff --git a/libfreerdp-gdi/32bpp.c b/libfreerdp-gdi/32bpp.c
new file mode 100644 (file)
index 0000000..728215a
--- /dev/null
@@ -0,0 +1,1053 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI 32bpp Internal Buffer Routines
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/gdi/pen.h>
+#include <freerdp/gdi/bitmap.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/gdi/clipping.h>
+#include <freerdp/gdi/drawing.h>
+
+#include <freerdp/gdi/32bpp.h>
+
+uint32 gdi_get_color_32bpp(HGDI_DC hdc, GDI_COLOR color)
+{
+       uint32 color32;
+       uint8 a, r, g, b;
+
+       a = 0xFF;
+       GetBGR32(r, g, b, color);
+
+       if (hdc->invert)
+       {
+               color32 = ABGR32(a, r, g, b);
+       }
+       else
+       {
+               color32 = ARGB32(a, r, g, b);
+       }
+
+       return color32;
+}
+
+int FillRect_32bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr)
+{
+       int x, y;
+       uint32 *dstp;
+       uint32 color32;
+       int nXDest, nYDest;
+       int nWidth, nHeight;
+
+       gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight);
+       
+       if (gdi_ClipCoords(hdc, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0)
+               return 0;
+
+       color32 = gdi_get_color_32bpp(hdc, hbr->color);
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdc, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = color32;
+                               dstp++;
+                       }
+               }
+       }
+
+       gdi_InvalidateRegion(hdc, nXDest, nYDest, nWidth, nHeight);
+       return 0;
+}
+
+static int BitBlt_BLACKNESS_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       if (hdcDest->alpha)
+       {
+               int x, y;
+               uint8* dstp;
+
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp = 0;
+                                       dstp++;
+
+                                       *dstp = 0;
+                                       dstp++;
+
+                                       *dstp = 0;
+                                       dstp++;
+
+                                       *dstp = 0xFF;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               int y;
+               uint8* dstp;
+
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                               memset(dstp, 0, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_WHITENESS_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int y;
+       uint8* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+                       memset(dstp, 0xFF, nWidth * hdcDest->bytesPerPixel);
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCCOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int y;
+       uint8* srcp;
+       uint8* dstp;
+
+       if ((hdcDest->selectedObject != hdcSrc->selectedObject) ||
+           gdi_CopyOverlap(nXDest, nYDest, nWidth, nHeight, nXSrc, nYSrc) == 0)
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memcpy(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+
+               return 0;
+       }
+       
+       if (nYSrc < nYDest)
+       {
+               /* copy down (bottom to top) */
+               for (y = nHeight - 1; y >= 0; y--)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       else if (nYSrc > nYDest || nXSrc > nXDest)
+       {
+               /* copy up or left (top top bottom) */
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       else
+       {
+               /* copy straight right */
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_NOTSRCCOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSTINVERT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint32* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*dstp);
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCERASE_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = *srcp & ~(*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_NOTSRCERASE_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp) & ~(*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCINVERT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp ^= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCAND_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp &= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCPAINT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp |= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSPDxax_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{      
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+       uint8* patp;
+       uint32 color32;
+       HGDI_BITMAP hSrcBmp;
+
+       /* D = (S & P) | (~S & D) */
+       /* DSPDxax, used to draw glyphs */
+
+       color32 = gdi_get_color_32bpp(hdcDest, hdcDest->textColor);
+
+       hSrcBmp = (HGDI_BITMAP) hdcSrc->selectedObject;
+       srcp = hSrcBmp->data;
+
+       if (hdcSrc->bytesPerPixel != 1)
+       {
+               printf("BitBlt_DSPDxax expects 1 bpp, unimplemented for %d\n", hdcSrc->bytesPerPixel);
+               return 0;
+       }
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint8*) &color32;
+
+                               *dstp = (*srcp & *patp) | (~(*srcp) & *dstp);
+                               dstp++;
+                               patp++;
+
+                               *dstp = (*srcp & *patp) | (~(*srcp) & *dstp);
+                               dstp++;
+                               patp++;
+
+                               *dstp = (*srcp & *patp) | (~(*srcp) & *dstp);
+                               dstp += 2;
+                               srcp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SPna_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+       uint32* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+                               
+                               *dstp = *srcp & ~(*patp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_DSna_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp) & (*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_PDxn_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint32* dstp;
+       uint32* patp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+
+                               *dstp = *dstp ^ ~(*patp);
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_MERGECOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+       uint32* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+                               
+                               *dstp = *srcp & *patp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_MERGEPAINT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {                               
+                               *dstp = ~(*srcp) | *dstp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATCOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint32* dstp;
+       uint32* patp;
+       uint32 color32;
+
+       if (hdcDest->brush->style == GDI_BS_SOLID)
+       {
+               color32 = gdi_get_color_32bpp(hdcDest, hdcDest->brush->color);
+
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp = color32;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+                                       *dstp = *patp;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATINVERT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint32* dstp;
+       uint32* patp;
+       uint32 color32;
+               
+       if (hdcDest->brush->style == GDI_BS_SOLID)
+       {
+               color32 = gdi_get_color_32bpp(hdcDest, hdcDest->brush->color);
+
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp ^= color32;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+                                       *dstp = *patp ^ *dstp;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATPAINT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint32* srcp;
+       uint32* dstp;
+       uint32* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+                               *dstp = *dstp | (*patp | ~(*srcp));
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+int BitBlt_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop)
+{
+       if (hdcSrc != NULL)
+       {
+               if (gdi_ClipCoords(hdcDest, &nXDest, &nYDest, &nWidth, &nHeight, &nXSrc, &nYSrc) == 0)
+                       return 0;
+       }
+       else
+       {
+               if (gdi_ClipCoords(hdcDest, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0)
+                       return 0;
+       }
+       
+       gdi_InvalidateRegion(hdcDest, nXDest, nYDest, nWidth, nHeight);
+       
+       switch (rop)
+       {
+               case GDI_BLACKNESS:
+                       return BitBlt_BLACKNESS_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_WHITENESS:
+                       return BitBlt_WHITENESS_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_SRCCOPY:
+                       return BitBlt_SRCCOPY_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SPna:
+                       return BitBlt_SPna_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSna:
+                       return BitBlt_DSna_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSPDxax:
+                       return BitBlt_DSPDxax_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+                       
+               case GDI_NOTSRCCOPY:
+                       return BitBlt_NOTSRCCOPY_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSTINVERT:
+                       return BitBlt_DSTINVERT_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_SRCERASE:
+                       return BitBlt_SRCERASE_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_NOTSRCERASE:
+                       return BitBlt_NOTSRCERASE_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCINVERT:
+                       return BitBlt_SRCINVERT_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCAND:
+                       return BitBlt_SRCAND_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCPAINT:
+                       return BitBlt_SRCPAINT_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_MERGECOPY:
+                       return BitBlt_MERGECOPY_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_MERGEPAINT:
+                       return BitBlt_MERGEPAINT_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_PATCOPY:
+                       return BitBlt_PATCOPY_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_PATINVERT:
+                       return BitBlt_PATINVERT_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_PATPAINT:
+                       return BitBlt_PATPAINT_32bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+       }
+       
+       printf("BitBlt: unknown rop: 0x%08X\n", rop);
+       return 1;
+}
+
+int PatBlt_32bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop)
+{
+       if (gdi_ClipCoords(hdc, &nXLeft, &nYLeft, &nWidth, &nHeight, NULL, NULL) == 0)
+               return 0;
+       
+       gdi_InvalidateRegion(hdc, nXLeft, nYLeft, nWidth, nHeight);
+
+       switch (rop)
+       {
+               case GDI_PATCOPY:
+                       return BitBlt_PATCOPY_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_PATINVERT:
+                       return BitBlt_PATINVERT_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+                       
+               case GDI_DSTINVERT:
+                       return BitBlt_DSTINVERT_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_BLACKNESS:
+                       return BitBlt_BLACKNESS_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_WHITENESS:
+                       return BitBlt_WHITENESS_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_PDxn:
+                       return BitBlt_PDxn_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               default:
+                       break;
+       }
+       
+       printf("PatBlt: unknown rop: 0x%08X\n", rop);
+
+       return 1;
+}
+
+INLINE void SetPixel_BLACK_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = 0 */
+       *pixel = 0;
+}
+
+INLINE void SetPixel_NOTMERGEPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = ~(D | P) */
+       *pixel = ~(*pixel | *pen);
+}
+
+INLINE void SetPixel_MASKNOTPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = D & ~P */
+       *pixel &= ~(*pen);
+}
+
+INLINE void SetPixel_NOTCOPYPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = ~P */
+       *pixel = ~(*pen);
+}
+
+INLINE void SetPixel_MASKPENNOT_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = P & ~D */
+       *pixel = *pen & ~*pixel;
+}
+
+INLINE void SetPixel_NOT_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = ~D */
+       *pixel = ~(*pixel);
+}
+
+INLINE void SetPixel_XORPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = D ^ P */
+       *pixel = *pixel ^ *pen;
+}
+
+INLINE void SetPixel_NOTMASKPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = ~(D & P) */
+       *pixel = ~(*pixel & *pen);
+}
+
+INLINE void SetPixel_MASKPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = D & P */
+       *pixel &= *pen;
+}
+
+INLINE void SetPixel_NOTXORPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = ~(D ^ P) */
+       *pixel = ~(*pixel ^ *pen);
+}
+
+INLINE void SetPixel_NOP_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = D */
+}
+
+INLINE void SetPixel_MERGENOTPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = D | ~P */
+       *pixel |= ~(*pen);
+}
+
+INLINE void SetPixel_COPYPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = P */
+       *pixel = *pen;
+}
+
+INLINE void SetPixel_MERGEPENNOT_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = P | ~D */
+       *pixel = *pen | ~(*pixel);
+}
+
+INLINE void SetPixel_MERGEPEN_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = P | D */
+       *pixel |= *pen;
+}
+
+INLINE void SetPixel_WHITE_32bpp(uint32* pixel, uint32* pen)
+{
+       /* D = 1 */
+       *pixel = 0xFFFFFF;
+}
+
+#define PIXEL_TYPE             uint32
+#define GDI_GET_POINTER                gdi_GetPointer_32bpp
+#define GDI_GET_PEN_COLOR      gdi_GetPenColor_32bpp
+
+#define LINE_TO                        LineTo_BLACK_32bpp
+#define SET_PIXEL_ROP2         SetPixel_BLACK_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTMERGEPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTMERGEPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKNOTPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKNOTPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTCOPYPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTCOPYPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKPENNOT_32bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKPENNOT_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOT_32bpp
+#define SET_PIXEL_ROP2         SetPixel_NOT_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_XORPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_XORPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTMASKPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTMASKPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTXORPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTXORPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOP_32bpp
+#define SET_PIXEL_ROP2         SetPixel_NOP_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGENOTPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGENOTPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_COPYPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_COPYPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGEPENNOT_32bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGEPENNOT_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGEPEN_32bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGEPEN_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_WHITE_32bpp
+#define SET_PIXEL_ROP2         SetPixel_WHITE_32bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#undef PIXEL_TYPE
+#undef GDI_GET_POINTER
+#undef GDI_GET_PEN_COLOR
+
+pLineTo_32bpp LineTo_ROP2_32bpp[32] =
+{
+       LineTo_BLACK_32bpp,
+       LineTo_NOTMERGEPEN_32bpp,
+       LineTo_MASKNOTPEN_32bpp,
+       LineTo_NOTCOPYPEN_32bpp,
+       LineTo_MASKPENNOT_32bpp,
+       LineTo_NOT_32bpp,
+       LineTo_XORPEN_32bpp,
+       LineTo_NOTMASKPEN_32bpp,
+       LineTo_MASKPEN_32bpp,
+       LineTo_NOTXORPEN_32bpp,
+       LineTo_NOP_32bpp,
+       LineTo_MERGENOTPEN_32bpp,
+       LineTo_COPYPEN_32bpp,
+       LineTo_MERGEPENNOT_32bpp,
+       LineTo_MERGEPEN_32bpp,
+       LineTo_WHITE_32bpp
+};
+
+int LineTo_32bpp(HGDI_DC hdc, int nXEnd, int nYEnd)
+{
+       pLineTo_32bpp _LineTo;
+       int rop2 = gdi_GetROP2(hdc) - 1;
+
+       _LineTo = LineTo_ROP2_32bpp[rop2];
+
+       if (_LineTo != NULL)
+               return _LineTo(hdc, nXEnd, nYEnd);
+       else
+               return 0;
+}
diff --git a/libfreerdp-gdi/8bpp.c b/libfreerdp-gdi/8bpp.c
new file mode 100644 (file)
index 0000000..d5a8a00
--- /dev/null
@@ -0,0 +1,933 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI 8bpp Internal Buffer Routines
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/gdi/pen.h>
+#include <freerdp/gdi/bitmap.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/gdi/clipping.h>
+#include <freerdp/gdi/drawing.h>
+
+#include <freerdp/gdi/8bpp.h>
+
+int FillRect_8bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr)
+{
+       /* TODO: Implement 8bpp FillRect() */
+       return 0;
+}
+
+static int BitBlt_BLACKNESS_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int y;
+       uint8* dstp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+                       memset(dstp, 0, nWidth * hdcDest->bytesPerPixel);
+       }
+
+       return 0;
+}
+
+static int BitBlt_WHITENESS_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int y;
+       uint8* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+                       memset(dstp, 0xFF, nWidth * hdcDest->bytesPerPixel);
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCCOPY_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int y;
+       uint8* srcp;
+       uint8* dstp;
+
+       if ((hdcDest->selectedObject != hdcSrc->selectedObject) ||
+           gdi_CopyOverlap(nXDest, nYDest, nWidth, nHeight, nXSrc, nYSrc) == 0)
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memcpy(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+
+               return 0;
+       }
+       
+       if (nYSrc < nYDest)
+       {
+               /* copy down (bottom to top) */
+               for (y = nHeight - 1; y >= 0; y--)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       else if (nYSrc > nYDest || nXSrc > nXDest)
+       {
+               /* copy up or left (top top bottom) */
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       else
+       {
+               /* copy straight right */
+               for (y = 0; y < nHeight; y++)
+               {
+                       srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (srcp != 0 && dstp != 0)
+                               memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel);
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_NOTSRCCOPY_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSTINVERT_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint8* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*dstp);
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCERASE_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = *srcp & ~(*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_NOTSRCERASE_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp) & ~(*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCINVERT_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp ^= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCAND_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp &= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_SRCPAINT_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+               
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp |= *srcp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSPDxax_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       /* TODO: Implement 8bpp DSPDxax BitBlt */
+       return 0;
+}
+
+static int BitBlt_SPna_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+       uint8* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);             
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = gdi_get_brush_pointer(hdcDest, x, y);
+                               
+                               *dstp = *srcp & ~(*patp);
+                               patp++;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PDxn_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint8* dstp;
+       uint8* patp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = gdi_get_brush_pointer(hdcDest, x, y);
+
+                               *dstp = *dstp ^ ~(*patp);
+                               patp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_DSna_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               *dstp = ~(*srcp) & (*dstp);
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_MERGECOPY_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+       uint8* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = gdi_get_brush_pointer(hdcDest, x, y);
+                               
+                               *dstp = *srcp & *patp;
+                               patp++;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_MERGEPAINT_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {                               
+                               *dstp = ~(*srcp) | *dstp;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATCOPY_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint8* dstp;
+       uint8* patp;
+       uint8 palIndex;
+
+       if(hdcDest->brush->style == GDI_BS_SOLID)
+       {
+               palIndex = ((hdcDest->brush->color >> 16) & 0xFF);
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp = palIndex;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       patp = gdi_get_brush_pointer(hdcDest, x, y);
+
+                                       *dstp = *patp;
+                                       patp++;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int BitBlt_PATINVERT_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+       int x, y;
+       uint8* dstp;
+       uint8* patp;
+       uint8 palIndex;
+
+       if(hdcDest->brush->style == GDI_BS_SOLID)
+       {
+               palIndex = ((hdcDest->brush->color >> 16) & 0xFF);
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       *dstp ^= palIndex;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       else
+       {
+               for (y = 0; y < nHeight; y++)
+               {
+                       dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+                       if (dstp != 0)
+                       {
+                               for (x = 0; x < nWidth; x++)
+                               {
+                                       patp = gdi_get_brush_pointer(hdcDest, x, y);
+
+                                       *dstp = *patp ^ *dstp;
+                                       patp++;
+                                       dstp++;
+                               }
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+static int BitBlt_PATPAINT_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc)
+{
+       int x, y;
+       uint8* srcp;
+       uint8* dstp;
+       uint8* patp;
+       
+       for (y = 0; y < nHeight; y++)
+       {
+               srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y);
+               dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+               if (dstp != 0)
+               {
+                       for (x = 0; x < nWidth; x++)
+                       {
+                               patp = gdi_get_brush_pointer(hdcDest, x, y);
+                               
+                               *dstp = *dstp | (*patp | ~(*srcp));
+                               patp++;
+                               srcp++;
+                               dstp++;
+                       }
+               }
+       }
+       
+       return 0;
+}
+
+int BitBlt_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop)
+{
+       if (hdcSrc != NULL)
+       {
+               if (gdi_ClipCoords(hdcDest, &nXDest, &nYDest, &nWidth, &nHeight, &nXSrc, &nYSrc) == 0)
+                       return 0;
+       }
+       else
+       {
+               if (gdi_ClipCoords(hdcDest, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0)
+                       return 0;
+       }
+       
+       gdi_InvalidateRegion(hdcDest, nXDest, nYDest, nWidth, nHeight);
+       
+       switch (rop)
+       {
+               case GDI_BLACKNESS:
+                       return BitBlt_BLACKNESS_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_WHITENESS:
+                       return BitBlt_WHITENESS_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_SRCCOPY:
+                       return BitBlt_SRCCOPY_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SPna:
+                       return BitBlt_SPna_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSna:
+                       return BitBlt_DSna_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSPDxax:
+                       return BitBlt_DSPDxax_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+                       
+               case GDI_NOTSRCCOPY:
+                       return BitBlt_NOTSRCCOPY_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_DSTINVERT:
+                       return BitBlt_DSTINVERT_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_SRCERASE:
+                       return BitBlt_SRCERASE_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_NOTSRCERASE:
+                       return BitBlt_NOTSRCERASE_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCINVERT:
+                       return BitBlt_SRCINVERT_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCAND:
+                       return BitBlt_SRCAND_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_SRCPAINT:
+                       return BitBlt_SRCPAINT_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_MERGECOPY:
+                       return BitBlt_MERGECOPY_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_MERGEPAINT:
+                       return BitBlt_MERGEPAINT_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+
+               case GDI_PATCOPY:
+                       return BitBlt_PATCOPY_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_PATINVERT:
+                       return BitBlt_PATINVERT_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight);
+                       break;
+
+               case GDI_PATPAINT:
+                       return BitBlt_PATPAINT_8bpp(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc);
+                       break;
+       }
+       
+       printf("BitBlt: unknown rop: 0x%08X\n", rop);
+       return 1;
+}
+
+int PatBlt_8bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop)
+{
+       if (gdi_ClipCoords(hdc, &nXLeft, &nYLeft, &nWidth, &nHeight, NULL, NULL) == 0)
+               return 0;
+       
+       gdi_InvalidateRegion(hdc, nXLeft, nYLeft, nWidth, nHeight);
+
+       switch (rop)
+       {
+               case GDI_PATCOPY:
+                       return BitBlt_PATCOPY_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_PATINVERT:
+                       return BitBlt_PATINVERT_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+                       
+               case GDI_DSTINVERT:
+                       return BitBlt_DSTINVERT_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_BLACKNESS:
+                       return BitBlt_BLACKNESS_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_WHITENESS:
+                       return BitBlt_WHITENESS_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               case GDI_PDxn:
+                       return BitBlt_PDxn_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+                       break;
+
+               default:
+                       break;
+       }
+       
+       printf("PatBlt: unknown rop: 0x%08X\n", rop);
+       return 1;
+}
+
+INLINE void SetPixel_BLACK_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = 0 */
+       *pixel = 0;
+}
+
+INLINE void SetPixel_NOTMERGEPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = ~(D | P) */
+       *pixel = ~(*pixel | *pen);
+}
+
+INLINE void SetPixel_MASKNOTPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = D & ~P */
+       *pixel &= ~(*pen);
+}
+
+INLINE void SetPixel_NOTCOPYPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = ~P */
+       *pixel = ~(*pen);
+}
+
+INLINE void SetPixel_MASKPENNOT_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = P & ~D */
+       *pixel = *pen & ~*pixel;
+}
+
+INLINE void SetPixel_NOT_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = ~D */
+       *pixel = ~(*pixel);
+}
+
+INLINE void SetPixel_XORPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = D ^ P */
+       *pixel = *pixel ^ *pen;
+}
+
+INLINE void SetPixel_NOTMASKPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = ~(D & P) */
+       *pixel = ~(*pixel & *pen);
+}
+
+INLINE void SetPixel_MASKPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = D & P */
+       *pixel &= *pen;
+}
+
+INLINE void SetPixel_NOTXORPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = ~(D ^ P) */
+       *pixel = ~(*pixel ^ *pen);
+}
+
+INLINE void SetPixel_NOP_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = D */
+}
+
+INLINE void SetPixel_MERGENOTPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = D | ~P */
+       *pixel |= ~(*pen);
+}
+
+INLINE void SetPixel_COPYPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = P */
+       *pixel = *pen;
+}
+
+INLINE void SetPixel_MERGEPENNOT_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = P | ~D */
+       *pixel = *pen | ~(*pixel);
+}
+
+INLINE void SetPixel_MERGEPEN_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = P | D */
+       *pixel |= *pen;
+}
+
+INLINE void SetPixel_WHITE_8bpp(uint8* pixel, uint8* pen)
+{
+       /* D = 1 */
+       *pixel = 0xFF;
+}
+
+#define PIXEL_TYPE             uint8
+#define GDI_GET_POINTER                gdi_GetPointer_8bpp
+#define GDI_GET_PEN_COLOR      gdi_GetPenColor_8bpp
+
+#define LINE_TO                        LineTo_BLACK_8bpp
+#define SET_PIXEL_ROP2         SetPixel_BLACK_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTMERGEPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTMERGEPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKNOTPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKNOTPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTCOPYPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTCOPYPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKPENNOT_8bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKPENNOT_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOT_8bpp
+#define SET_PIXEL_ROP2         SetPixel_NOT_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_XORPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_XORPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTMASKPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTMASKPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MASKPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_MASKPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOTXORPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_NOTXORPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_NOP_8bpp
+#define SET_PIXEL_ROP2         SetPixel_NOP_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGENOTPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGENOTPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_COPYPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_COPYPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGEPENNOT_8bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGEPENNOT_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_MERGEPEN_8bpp
+#define SET_PIXEL_ROP2         SetPixel_MERGEPEN_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#define LINE_TO                        LineTo_WHITE_8bpp
+#define SET_PIXEL_ROP2         SetPixel_WHITE_8bpp
+#include "include/line.c"
+#undef LINE_TO
+#undef SET_PIXEL_ROP2
+
+#undef PIXEL_TYPE
+#undef GDI_GET_POINTER
+#undef GDI_GET_PEN_COLOR
+
+pLineTo_8bpp LineTo_ROP2_8bpp[32] =
+{
+       LineTo_BLACK_8bpp,
+       LineTo_NOTMERGEPEN_8bpp,
+       LineTo_MASKNOTPEN_8bpp,
+       LineTo_NOTCOPYPEN_8bpp,
+       LineTo_MASKPENNOT_8bpp,
+       LineTo_NOT_8bpp,
+       LineTo_XORPEN_8bpp,
+       LineTo_NOTMASKPEN_8bpp,
+       LineTo_MASKPEN_8bpp,
+       LineTo_NOTXORPEN_8bpp,
+       LineTo_NOP_8bpp,
+       LineTo_MERGENOTPEN_8bpp,
+       LineTo_COPYPEN_8bpp,
+       LineTo_MERGEPENNOT_8bpp,
+       LineTo_MERGEPEN_8bpp,
+       LineTo_WHITE_8bpp
+};
+
+int LineTo_8bpp(HGDI_DC hdc, int nXEnd, int nYEnd)
+{
+       pLineTo_8bpp _LineTo;
+       int rop2 = gdi_GetROP2(hdc) - 1;
+
+       _LineTo = LineTo_ROP2_8bpp[rop2];
+
+       if (_LineTo != NULL)
+               return _LineTo(hdc, nXEnd, nYEnd);
+       else
+               return 0;
+}
diff --git a/libfreerdp-gdi/CMakeLists.txt b/libfreerdp-gdi/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5991348
--- /dev/null
@@ -0,0 +1,47 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-gdi cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(FREERDP_GDI_SRCS
+       8bpp.c
+       16bpp.c
+       32bpp.c
+       bitmap.c
+       brush.c
+       clipping.c
+       dc.c
+       drawing.c
+       line.c
+       palette.c
+       pen.c
+       region.c
+       shape.c
+       graphics.c
+       graphics.h
+       gdi.c
+       gdi.h)
+
+add_library(freerdp-gdi ${FREERDP_GDI_SRCS})
+
+target_link_libraries(freerdp-gdi freerdp-core)
+target_link_libraries(freerdp-gdi freerdp-cache)
+target_link_libraries(freerdp-gdi freerdp-codec)
+
+set_target_properties(freerdp-gdi PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+
+install(TARGETS freerdp-gdi DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/libfreerdp-gdi/bitmap.c b/libfreerdp-gdi/bitmap.c
new file mode 100644 (file)
index 0000000..6c52149
--- /dev/null
@@ -0,0 +1,189 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Bitmap Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/gdi/32bpp.h>
+#include <freerdp/gdi/16bpp.h>
+#include <freerdp/gdi/8bpp.h>
+
+#include <freerdp/gdi/bitmap.h>
+
+p_BitBlt BitBlt_[5] =
+{
+       NULL,
+       BitBlt_8bpp,
+       BitBlt_16bpp,
+       NULL,
+       BitBlt_32bpp
+};
+
+/**
+ * Get pixel at the given coordinates.\n
+ * @msdn{dd144909}
+ * @param hdc device context
+ * @param nXPos pixel x position
+ * @param nYPos pixel y position
+ * @return pixel color
+ */
+
+INLINE GDI_COLOR gdi_GetPixel(HGDI_DC hdc, int nXPos, int nYPos)
+{
+       HGDI_BITMAP hBmp = (HGDI_BITMAP) hdc->selectedObject;
+       GDI_COLOR* colorp = (GDI_COLOR*)&(hBmp->data[(nYPos * hBmp->width * hdc->bytesPerPixel) + nXPos * hdc->bytesPerPixel]);
+       return (GDI_COLOR) *colorp;
+}
+
+INLINE uint8 gdi_GetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y)
+{
+       return *((uint8*)&(hBmp->data[(Y * hBmp->width) + X]));
+}
+
+INLINE uint16 gdi_GetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y)
+{
+       return *((uint16*)&(hBmp->data[(Y * hBmp->width * 2) + X * 2]));
+}
+
+INLINE uint32 gdi_GetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y)
+{
+       return *((uint32*)&(hBmp->data[(Y * hBmp->width * 4) + X * 4]));
+}
+
+INLINE uint8* gdi_GetPointer_8bpp(HGDI_BITMAP hBmp, int X, int Y)
+{
+       return ((uint8*)&(hBmp->data[(Y * hBmp->width) + X]));
+}
+
+INLINE uint16* gdi_GetPointer_16bpp(HGDI_BITMAP hBmp, int X, int Y)
+{
+       return ((uint16*)&(hBmp->data[(Y * hBmp->width * 2) + X * 2]));
+}
+
+INLINE uint32* gdi_GetPointer_32bpp(HGDI_BITMAP hBmp, int X, int Y)
+{
+       return ((uint32*)&(hBmp->data[(Y * hBmp->width * 4) + X * 4]));
+}
+
+/**
+ * Set pixel at the given coordinates.\n
+ * @msdn{dd145078}
+ * @param hdc device context
+ * @param X pixel x position
+ * @param Y pixel y position
+ * @param crColor new pixel color
+ * @return
+ */
+
+INLINE GDI_COLOR gdi_SetPixel(HGDI_DC hdc, int X, int Y, GDI_COLOR crColor)
+{
+       HGDI_BITMAP hBmp = (HGDI_BITMAP) hdc->selectedObject;
+       *((GDI_COLOR*)&(hBmp->data[(Y * hBmp->width * hdc->bytesPerPixel) + X * hdc->bytesPerPixel])) = crColor;
+       return 0;
+}
+
+INLINE void gdi_SetPixel_8bpp(HGDI_BITMAP hBmp, int X, int Y, uint8 pixel)
+{
+       *((uint8*)&(hBmp->data[(Y * hBmp->width) + X])) = pixel;
+}
+
+INLINE void gdi_SetPixel_16bpp(HGDI_BITMAP hBmp, int X, int Y, uint16 pixel)
+{
+       *((uint16*)&(hBmp->data[(Y * hBmp->width * 2) + X * 2])) = pixel;
+}
+
+INLINE void gdi_SetPixel_32bpp(HGDI_BITMAP hBmp, int X, int Y, uint32 pixel)
+{
+       *((uint32*)&(hBmp->data[(Y * hBmp->width * 4) + X * 4])) = pixel;
+}
+
+/**
+ * Create a new bitmap with the given width, height, color format and pixel buffer.\n
+ * @msdn{dd183485}
+ * @param nWidth width
+ * @param nHeight height
+ * @param cBitsPerPixel bits per pixel
+ * @param data pixel buffer
+ * @return new bitmap
+ */
+
+HGDI_BITMAP gdi_CreateBitmap(int nWidth, int nHeight, int cBitsPerPixel, uint8* data)
+{
+       HGDI_BITMAP hBitmap = (HGDI_BITMAP) malloc(sizeof(GDI_BITMAP));
+       hBitmap->objectType = GDIOBJECT_BITMAP;
+       hBitmap->bitsPerPixel = cBitsPerPixel;
+       hBitmap->bytesPerPixel = (cBitsPerPixel + 1) / 8;
+       hBitmap->scanline = nWidth * hBitmap->bytesPerPixel;
+       hBitmap->width = nWidth;
+       hBitmap->height = nHeight;
+       hBitmap->data = data;
+       return hBitmap;
+}
+
+/**
+ * Create a new bitmap of the given width and height compatible with the current device context.\n
+ * @msdn{dd183488}
+ * @param hdc device context
+ * @param nWidth width
+ * @param nHeight height
+ * @return new bitmap
+ */
+
+HGDI_BITMAP gdi_CreateCompatibleBitmap(HGDI_DC hdc, int nWidth, int nHeight)
+{
+       HGDI_BITMAP hBitmap = (HGDI_BITMAP) malloc(sizeof(GDI_BITMAP));
+       hBitmap->objectType = GDIOBJECT_BITMAP;
+       hBitmap->bytesPerPixel = hdc->bytesPerPixel;
+       hBitmap->bitsPerPixel = hdc->bitsPerPixel;
+       hBitmap->width = nWidth;
+       hBitmap->height = nHeight;
+       hBitmap->data = malloc(nWidth * nHeight * hBitmap->bytesPerPixel);
+       hBitmap->scanline = nWidth * hBitmap->bytesPerPixel;
+       return hBitmap;
+}
+
+/**
+ * Perform a bit blit operation on the given pixel buffers.\n
+ * @msdn{dd183370}
+ * @param hdcDest destination device context
+ * @param nXDest destination x1
+ * @param nYDest destination y1
+ * @param nWidth width
+ * @param nHeight height
+ * @param hdcSrc source device context
+ * @param nXSrc source x1
+ * @param nYSrc source y1
+ * @param rop raster operation code
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_BitBlt(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc, int rop)
+{
+       p_BitBlt _BitBlt = BitBlt_[IBPP(hdcDest->bitsPerPixel)];
+
+       if (_BitBlt != NULL)
+               return _BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, rop);
+       else
+               return 0;
+}
diff --git a/libfreerdp-gdi/brush.c b/libfreerdp-gdi/brush.c
new file mode 100644 (file)
index 0000000..c93b29e
--- /dev/null
@@ -0,0 +1,96 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Brush Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* GDI Brush Functions: http://msdn.microsoft.com/en-us/library/dd183395/ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/32bpp.h>
+#include <freerdp/gdi/16bpp.h>
+#include <freerdp/gdi/8bpp.h>
+
+#include <freerdp/gdi/brush.h>
+
+p_PatBlt PatBlt_[5] =
+{
+       NULL,
+       PatBlt_8bpp,
+       PatBlt_16bpp,
+       NULL,
+       PatBlt_32bpp
+};
+
+/**
+ * Create a new solid brush.\n
+ * @msdn{dd183518}
+ * @param crColor brush color
+ * @return new brush
+ */
+
+HGDI_BRUSH gdi_CreateSolidBrush(GDI_COLOR crColor)
+{
+       HGDI_BRUSH hBrush = (HGDI_BRUSH) malloc(sizeof(GDI_BRUSH));
+       hBrush->objectType = GDIOBJECT_BRUSH;
+       hBrush->style = GDI_BS_SOLID;
+       hBrush->color = crColor;
+       return hBrush;
+}
+
+/**
+ * Create a new pattern brush.\n
+ * @msdn{dd183508}
+ * @param hbmp pattern bitmap
+ * @return new brush
+ */
+
+HGDI_BRUSH gdi_CreatePatternBrush(HGDI_BITMAP hbmp)
+{
+       HGDI_BRUSH hBrush = (HGDI_BRUSH) malloc(sizeof(GDI_BRUSH));
+       hBrush->objectType = GDIOBJECT_BRUSH;
+       hBrush->style = GDI_BS_PATTERN;
+       hBrush->pattern = hbmp;
+       return hBrush;
+}
+
+/**
+ * Perform a pattern blit operation on the given pixel buffer.\n
+ * @msdn{dd162778}
+ * @param hdc device context
+ * @param nXLeft x1
+ * @param nYLeft y1
+ * @param nWidth width
+ * @param nHeight height
+ * @param rop raster operation code
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_PatBlt(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, int rop)
+{
+       p_PatBlt _PatBlt = PatBlt_[IBPP(hdc->bitsPerPixel)];
+
+       if (_PatBlt != NULL)
+               return _PatBlt(hdc, nXLeft, nYLeft, nWidth, nHeight, rop);
+       else
+               return 0;
+}
diff --git a/libfreerdp-gdi/clipping.c b/libfreerdp-gdi/clipping.c
new file mode 100644 (file)
index 0000000..c805a43
--- /dev/null
@@ -0,0 +1,172 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Clipping Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/region.h>
+
+#include <freerdp/gdi/clipping.h>
+
+int gdi_SetClipRgn(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight)
+{
+       return gdi_SetRgn(hdc->clip, nXLeft, nYLeft, nWidth, nHeight);
+}
+
+/**
+ * Get the current clipping region.\n
+ * @msdn{dd144866}
+ * @param hdc device context
+ * @return clipping region
+ */
+
+HGDI_RGN gdi_GetClipRgn(HGDI_DC hdc)
+{
+       return hdc->clip;
+}
+
+/**
+ * Set the current clipping region to null.
+ * @param hdc device context
+ * @return
+ */
+
+int gdi_SetNullClipRgn(HGDI_DC hdc)
+{
+       gdi_SetClipRgn(hdc, 0, 0, 0, 0);
+       hdc->clip->null = 1;
+       return 0;
+}
+
+/**
+ * Clip coordinates according to clipping region
+ * @param hdc device context
+ * @param x x1
+ * @param y y1
+ * @param w width
+ * @param h height
+ * @param srcx source x1
+ * @param srcy source y1
+ * @return 1 if there is something to draw, 0 otherwise
+ */
+
+int gdi_ClipCoords(HGDI_DC hdc, int *x, int *y, int *w, int *h, int *srcx, int *srcy)
+{
+       GDI_RECT bmp;
+       GDI_RECT clip;
+       GDI_RECT coords;
+       HGDI_BITMAP hBmp;
+
+       int dx = 0;
+       int dy = 0;
+       int draw = 1;
+
+       if (hdc == NULL)
+               return 0;
+
+       hBmp = (HGDI_BITMAP) hdc->selectedObject;
+
+       if (hBmp != NULL)
+       {
+               if (hdc->clip->null)
+               {
+                       gdi_CRgnToRect(0, 0, hBmp->width, hBmp->height, &clip);
+               }
+               else
+               {
+                       gdi_RgnToRect(hdc->clip, &clip);
+                       gdi_CRgnToRect(0, 0, hBmp->width, hBmp->height, &bmp);
+
+                       if (clip.left < bmp.left)
+                               clip.left = bmp.left;
+
+                       if (clip.right > bmp.right)
+                               clip.right = bmp.right;
+
+                       if (clip.top < bmp.top)
+                               clip.top = bmp.top;
+
+                       if (clip.bottom > bmp.bottom)
+                               clip.bottom = bmp.bottom;
+               }
+       }
+       else
+       {
+               gdi_RgnToRect(hdc->clip, &clip);
+       }
+
+       gdi_CRgnToRect(*x, *y, *w, *h, &coords);
+
+       if (coords.right >= clip.left && coords.left <= clip.right &&
+               coords.bottom >= clip.top && coords.top <= clip.bottom)
+       {
+               /* coordinates overlap with clipping region */
+
+               if (coords.left < clip.left)
+               {
+                       dx = (clip.left - coords.left) + 1;
+                       coords.left = clip.left;
+               }
+
+               if (coords.right > clip.right)
+                       coords.right = clip.right;
+
+               if (coords.top < clip.top)
+               {
+                       dy = (clip.top - coords.top) + 1;
+                       coords.top = clip.top;
+               }
+
+               if (coords.bottom > clip.bottom)
+                       coords.bottom = clip.bottom;
+       }
+       else
+       {
+               /* coordinates do not overlap with clipping region */
+
+               coords.left = 0;
+               coords.right = 0;
+               coords.top = 0;
+               coords.bottom = 0;
+               draw = 0;
+       }
+
+       if (srcx != NULL)
+       {
+               if (dx > 0)
+               {
+                       *srcx += dx - 1;
+               }
+       }
+
+       if (srcy != NULL)
+       {
+               if (dy > 0)
+               {
+                       *srcy += dy - 1;
+               }
+       }
+
+       gdi_RectToCRgn(&coords, x, y, w, h);
+
+       return draw;
+}
diff --git a/libfreerdp-gdi/dc.c b/libfreerdp-gdi/dc.c
new file mode 100644 (file)
index 0000000..b4f4ced
--- /dev/null
@@ -0,0 +1,232 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Device Context Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Device Context Functions: http://msdn.microsoft.com/en-us/library/dd183554 */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/codec/color.h>
+
+#include <freerdp/gdi/region.h>
+
+#include <freerdp/gdi/dc.h>
+
+/**
+ * Get the current device context (a new one is created each time).\n
+ * @msdn{dd144871}
+ * @return current device context
+ */
+
+HGDI_DC gdi_GetDC()
+{
+       HGDI_DC hDC = (HGDI_DC) malloc(sizeof(GDI_DC));
+       hDC->bytesPerPixel = 4;
+       hDC->bitsPerPixel = 32;
+       hDC->drawMode = GDI_R2_BLACK;
+       hDC->clip = gdi_CreateRectRgn(0, 0, 0, 0);
+       hDC->clip->null = 1;
+       hDC->hwnd = NULL;
+       return hDC;
+}
+
+/**
+ * Create a device context.\n
+ * @msdn{dd144871}
+ * @return new device context
+ */
+
+HGDI_DC gdi_CreateDC(HCLRCONV clrconv, int bpp)
+{
+       HGDI_DC hDC = (HGDI_DC) malloc(sizeof(GDI_DC));
+
+       hDC->drawMode = GDI_R2_BLACK;
+       hDC->clip = gdi_CreateRectRgn(0, 0, 0, 0);
+       hDC->clip->null = 1;
+       hDC->hwnd = NULL;
+
+       hDC->bitsPerPixel = bpp;
+       hDC->bytesPerPixel = bpp / 8;
+
+       hDC->alpha = clrconv->alpha;
+       hDC->invert = clrconv->invert;
+       hDC->rgb555 = clrconv->rgb555;
+
+       hDC->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND));
+       hDC->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
+       hDC->hwnd->invalid->null = 1;
+
+       hDC->hwnd->count = 32;
+       hDC->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * hDC->hwnd->count);
+       hDC->hwnd->ninvalid = 0;
+
+       return hDC;
+}
+
+/**
+ * Create a new device context compatible with the given device context.\n
+ * @msdn{dd183489}
+ * @param hdc device context
+ * @return new compatible device context
+ */
+
+HGDI_DC gdi_CreateCompatibleDC(HGDI_DC hdc)
+{
+       HGDI_DC hDC = (HGDI_DC) malloc(sizeof(GDI_DC));
+       hDC->bytesPerPixel = hdc->bytesPerPixel;
+       hDC->bitsPerPixel = hdc->bitsPerPixel;
+       hDC->drawMode = hdc->drawMode;
+       hDC->clip = gdi_CreateRectRgn(0, 0, 0, 0);
+       hDC->clip->null = 1;
+       hDC->hwnd = NULL;
+       hDC->alpha = hdc->alpha;
+       hDC->invert = hdc->invert;
+       hDC->rgb555 = hdc->rgb555;
+       return hDC;
+}
+
+/**
+ * Select a GDI object in the current device context.\n
+ * @msdn{dd162957}
+ * @param hdc device context
+ * @param hgdiobject new selected GDI object
+ * @return previous selected GDI object
+ */
+
+HGDIOBJECT gdi_SelectObject(HGDI_DC hdc, HGDIOBJECT hgdiobject)
+{
+       HGDIOBJECT previousSelectedObject = hdc->selectedObject;
+
+       if (hgdiobject == NULL)
+               return NULL;
+
+       if (hgdiobject->objectType == GDIOBJECT_BITMAP)
+       {
+               hdc->selectedObject = hgdiobject;
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_PEN)
+       {
+               previousSelectedObject = (HGDIOBJECT) hdc->pen;
+               hdc->pen = (HGDI_PEN) hgdiobject;
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_BRUSH)
+       {
+               previousSelectedObject = (HGDIOBJECT) hdc->brush;
+               hdc->brush = (HGDI_BRUSH) hgdiobject;
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_REGION)
+       {
+               hdc->selectedObject = hgdiobject;
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_RECT)
+       {
+               hdc->selectedObject = hgdiobject;
+       }
+       else
+       {
+               /* Unknown GDI Object Type */
+               return 0;
+       }
+
+       return previousSelectedObject;
+}
+
+/**
+ * Delete a GDI object.\n
+ * @msdn{dd183539}
+ * @param hgdiobject GDI object
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_DeleteObject(HGDIOBJECT hgdiobject)
+{
+       if (hgdiobject == NULL)
+               return 0;
+
+       if (hgdiobject->objectType == GDIOBJECT_BITMAP)
+       {
+               HGDI_BITMAP hBitmap = (HGDI_BITMAP) hgdiobject;
+
+               if (hBitmap->data != NULL)
+                       free(hBitmap->data);
+
+               free(hBitmap);
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_PEN)
+       {
+               HGDI_PEN hPen = (HGDI_PEN) hgdiobject;
+               free(hPen);
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_BRUSH)
+       {
+               HGDI_BRUSH hBrush = (HGDI_BRUSH) hgdiobject;
+
+               if(hBrush->style == GDI_BS_PATTERN)
+               {
+                       if (hBrush->pattern != NULL)
+                               gdi_DeleteObject((HGDIOBJECT) hBrush->pattern);
+               }
+
+               free(hBrush);
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_REGION)
+       {
+               free(hgdiobject);
+       }
+       else if (hgdiobject->objectType == GDIOBJECT_RECT)
+       {
+               free(hgdiobject);
+       }
+       else
+       {
+               /* Unknown GDI Object Type */
+               free(hgdiobject);
+               return 0;
+       }
+
+       return 1;
+}
+
+/**
+ * Delete device context.\n
+ * @msdn{dd183533}
+ * @param hdc device context
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_DeleteDC(HGDI_DC hdc)
+{
+       if (hdc->hwnd)
+       {
+               if (hdc->hwnd->cinvalid != NULL)
+                       free(hdc->hwnd->cinvalid);
+
+               if (hdc->hwnd->invalid != NULL)
+                       free(hdc->hwnd->invalid);
+
+               free(hdc->hwnd);
+       }
+
+       free(hdc->clip);
+       free(hdc);
+
+       return 1;
+}
diff --git a/libfreerdp-gdi/drawing.c b/libfreerdp-gdi/drawing.c
new file mode 100644 (file)
index 0000000..98f50c3
--- /dev/null
@@ -0,0 +1,131 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Drawing Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* GDI Drawing Functions: http://msdn.microsoft.com/en-us/library/dd162760/ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/dc.h>
+
+/**
+ * Set current foreground draw mode.\n
+ * @msdn{dd144922}
+ * @param hdc device context
+ * @return draw mode
+ */
+
+int gdi_GetROP2(HGDI_DC hdc)
+{
+       return hdc->drawMode;
+}
+
+/**
+ * Set current foreground draw mode.\n
+ * @msdn{dd145088}
+ * @param hdc device context
+ * @param fnDrawMode draw mode
+ * @return previous draw mode
+ */
+
+int gdi_SetROP2(HGDI_DC hdc, int fnDrawMode)
+{
+       int prevDrawMode = hdc->drawMode;
+
+       if (fnDrawMode > 0 && fnDrawMode <= 16)
+               hdc->drawMode = fnDrawMode;
+
+       return prevDrawMode;
+}
+
+/**
+ * Get the current background color.\n
+ * @msdn{dd144852}
+ * @param hdc device context
+ * @return background color
+ */
+
+GDI_COLOR gdi_GetBkColor(HGDI_DC hdc)
+{
+       return hdc->bkColor;
+}
+
+/**
+ * Set the current background color.\n
+ * @msdn{dd162964}
+ * @param hdc device color
+ * @param crColor new background color
+ * @return previous background color
+ */
+
+GDI_COLOR gdi_SetBkColor(HGDI_DC hdc, GDI_COLOR crColor)
+{
+       GDI_COLOR previousBkColor = hdc->bkColor;
+       hdc->bkColor = crColor;
+       return previousBkColor;
+}
+
+/**
+ * Get the current background mode.\n
+ * @msdn{dd144853}
+ * @param hdc device context
+ * @return background mode
+ */
+
+int gdi_GetBkMode(HGDI_DC hdc)
+{
+       return hdc->bkMode;
+}
+
+/**
+ * Set the current background mode.\n
+ * @msdn{dd162965}
+ * @param hdc device context
+ * @param iBkMode background mode
+ * @return
+ */
+
+int gdi_SetBkMode(HGDI_DC hdc, int iBkMode)
+{
+       if (iBkMode == GDI_OPAQUE || iBkMode == GDI_TRANSPARENT)
+               hdc->bkMode = iBkMode;
+       else
+               hdc->bkMode = GDI_OPAQUE;
+
+       return 0;
+}
+
+/**
+ * Set the current text color.\n
+ * @msdn{dd145093}
+ * @param hdc device context
+ * @param crColor new text color
+ * @return previous text color
+ */
+
+GDI_COLOR gdi_SetTextColor(HGDI_DC hdc, GDI_COLOR crColor)
+{
+       GDI_COLOR previousTextColor = hdc->textColor;
+       hdc->textColor = crColor;
+       return previousTextColor;
+}
diff --git a/libfreerdp-gdi/gdi.c b/libfreerdp-gdi/gdi.c
new file mode 100644 (file)
index 0000000..77c1384
--- /dev/null
@@ -0,0 +1,937 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Library
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/bitmap.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/codec/bitmap.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/codec/nsc.h>
+
+#include <freerdp/gdi/dc.h>
+#include <freerdp/gdi/pen.h>
+#include <freerdp/gdi/line.h>
+#include <freerdp/gdi/shape.h>
+#include <freerdp/gdi/brush.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/gdi/bitmap.h>
+#include <freerdp/gdi/palette.h>
+#include <freerdp/gdi/drawing.h>
+#include <freerdp/gdi/clipping.h>
+
+#include <freerdp/gdi/gdi.h>
+
+#include "gdi.h"
+
+/* Ternary Raster Operation Table */
+static const uint32 rop3_code_table[] =
+{
+       0x00000042, /* 0 */
+       0x00010289, /* DPSoon */
+       0x00020C89, /* DPSona */
+       0x000300AA, /* PSon */
+       0x00040C88, /* SDPona */
+       0x000500A9, /* DPon */
+       0x00060865, /* PDSxnon */
+       0x000702C5, /* PDSaon */
+       0x00080F08, /* SDPnaa */
+       0x00090245, /* PDSxon */
+       0x000A0329, /* DPna */
+       0x000B0B2A, /* PSDnaon */
+       0x000C0324, /* SPna */
+       0x000D0B25, /* PDSnaon */
+       0x000E08A5, /* PDSonon */
+       0x000F0001, /* Pn */
+       0x00100C85, /* PDSona */
+       0x001100A6, /* DSon */
+       0x00120868, /* SDPxnon */
+       0x001302C8, /* SDPaon */
+       0x00140869, /* DPSxnon */
+       0x001502C9, /* DPSaon */
+       0x00165CCA, /* PSDPSanaxx */
+       0x00171D54, /* SSPxDSxaxn */
+       0x00180D59, /* SPxPDxa */
+       0x00191CC8, /* SDPSanaxn */
+       0x001A06C5, /* PDSPaox */
+       0x001B0768, /* SDPSxaxn */
+       0x001C06CA, /* PSDPaox */
+       0x001D0766, /* DSPDxaxn */
+       0x001E01A5, /* PDSox */
+       0x001F0385, /* PDSoan */
+       0x00200F09, /* DPSnaa */
+       0x00210248, /* SDPxon */
+       0x00220326, /* DSna */
+       0x00230B24, /* SPDnaon */
+       0x00240D55, /* SPxDSxa */
+       0x00251CC5, /* PDSPanaxn */
+       0x002606C8, /* SDPSaox */
+       0x00271868, /* SDPSxnox */
+       0x00280369, /* DPSxa */
+       0x002916CA, /* PSDPSaoxxn */
+       0x002A0CC9, /* DPSana */
+       0x002B1D58, /* SSPxPDxaxn */
+       0x002C0784, /* SPDSoax */
+       0x002D060A, /* PSDnox */
+       0x002E064A, /* PSDPxox */
+       0x002F0E2A, /* PSDnoan */
+       0x0030032A, /* PSna */
+       0x00310B28, /* SDPnaon */
+       0x00320688, /* SDPSoox */
+       0x00330008, /* Sn */
+       0x003406C4, /* SPDSaox */
+       0x00351864, /* SPDSxnox */
+       0x003601A8, /* SDPox */
+       0x00370388, /* SDPoan */
+       0x0038078A, /* PSDPoax */
+       0x00390604, /* SPDnox */
+       0x003A0644, /* SPDSxox */
+       0x003B0E24, /* SPDnoan */
+       0x003C004A, /* PSx */
+       0x003D18A4, /* SPDSonox */
+       0x003E1B24, /* SPDSnaox */
+       0x003F00EA, /* PSan */
+       0x00400F0A, /* PSDnaa */
+       0x00410249, /* DPSxon */
+       0x00420D5D, /* SDxPDxa */
+       0x00431CC4, /* SPDSanaxn */
+       0x00440328, /* SDna */
+       0x00450B29, /* DPSnaon */
+       0x004606C6, /* DSPDaox */
+       0x0047076A, /* PSDPxaxn */
+       0x00480368, /* SDPxa */
+       0x004916C5, /* PDSPDaoxxn */
+       0x004A0789, /* DPSDoax */
+       0x004B0605, /* PDSnox */
+       0x004C0CC8, /* SDPana */
+       0x004D1954, /* SSPxDSxoxn */
+       0x004E0645, /* PDSPxox */
+       0x004F0E25, /* PDSnoan */
+       0x00500325, /* PDna */
+       0x00510B26, /* DSPnaon */
+       0x005206C9, /* DPSDaox */
+       0x00530764, /* SPDSxaxn */
+       0x005408A9, /* DPSonon */
+       0x00550009, /* Dn */
+       0x005601A9, /* DPSox */
+       0x00570389, /* DPSoan */
+       0x00580785, /* PDSPoax */
+       0x00590609, /* DPSnox */
+       0x005A0049, /* DPx */
+       0x005B18A9, /* DPSDonox */
+       0x005C0649, /* DPSDxox */
+       0x005D0E29, /* DPSnoan */
+       0x005E1B29, /* DPSDnaox */
+       0x005F00E9, /* DPan */
+       0x00600365, /* PDSxa */
+       0x006116C6, /* DSPDSaoxxn */
+       0x00620786, /* DSPDoax */
+       0x00630608, /* SDPnox */
+       0x00640788, /* SDPSoax */
+       0x00650606, /* DSPnox */
+       0x00660046, /* DSx */
+       0x006718A8, /* SDPSonox */
+       0x006858A6, /* DSPDSonoxxn */
+       0x00690145, /* PDSxxn */
+       0x006A01E9, /* DPSax */
+       0x006B178A, /* PSDPSoaxxn */
+       0x006C01E8, /* SDPax */
+       0x006D1785, /* PDSPDoaxxn */
+       0x006E1E28, /* SDPSnoax */
+       0x006F0C65, /* PDSxnan */
+       0x00700CC5, /* PDSana */
+       0x00711D5C, /* SSDxPDxaxn */
+       0x00720648, /* SDPSxox */
+       0x00730E28, /* SDPnoan */
+       0x00740646, /* DSPDxox */
+       0x00750E26, /* DSPnoan */
+       0x00761B28, /* SDPSnaox */
+       0x007700E6, /* DSan */
+       0x007801E5, /* PDSax */
+       0x00791786, /* DSPDSoaxxn */
+       0x007A1E29, /* DPSDnoax */
+       0x007B0C68, /* SDPxnan */
+       0x007C1E24, /* SPDSnoax */
+       0x007D0C69, /* DPSxnan */
+       0x007E0955, /* SPxDSxo */
+       0x007F03C9, /* DPSaan */
+       0x008003E9, /* DPSaa */
+       0x00810975, /* SPxDSxon */
+       0x00820C49, /* DPSxna */
+       0x00831E04, /* SPDSnoaxn */
+       0x00840C48, /* SDPxna */
+       0x00851E05, /* PDSPnoaxn */
+       0x008617A6, /* DSPDSoaxx */
+       0x008701C5, /* PDSaxn */
+       0x008800C6, /* DSa */
+       0x00891B08, /* SDPSnaoxn */
+       0x008A0E06, /* DSPnoa */
+       0x008B0666, /* DSPDxoxn */
+       0x008C0E08, /* SDPnoa */
+       0x008D0668, /* SDPSxoxn */
+       0x008E1D7C, /* SSDxPDxax */
+       0x008F0CE5, /* PDSanan */
+       0x00900C45, /* PDSxna */
+       0x00911E08, /* SDPSnoaxn */
+       0x009217A9, /* DPSDPoaxx */
+       0x009301C4, /* SPDaxn */
+       0x009417AA, /* PSDPSoaxx */
+       0x009501C9, /* DPSaxn */
+       0x00960169, /* DPSxx */
+       0x0097588A, /* PSDPSonoxx */
+       0x00981888, /* SDPSonoxn */
+       0x00990066, /* DSxn */
+       0x009A0709, /* DPSnax */
+       0x009B07A8, /* SDPSoaxn */
+       0x009C0704, /* SPDnax */
+       0x009D07A6, /* DSPDoaxn */
+       0x009E16E6, /* DSPDSaoxx */
+       0x009F0345, /* PDSxan */
+       0x00A000C9, /* DPa */
+       0x00A11B05, /* PDSPnaoxn */
+       0x00A20E09, /* DPSnoa */
+       0x00A30669, /* DPSDxoxn */
+       0x00A41885, /* PDSPonoxn */
+       0x00A50065, /* PDxn */
+       0x00A60706, /* DSPnax */
+       0x00A707A5, /* PDSPoaxn */
+       0x00A803A9, /* DPSoa */
+       0x00A90189, /* DPSoxn */
+       0x00AA0029, /* D */
+       0x00AB0889, /* DPSono */
+       0x00AC0744, /* SPDSxax */
+       0x00AD06E9, /* DPSDaoxn */
+       0x00AE0B06, /* DSPnao */
+       0x00AF0229, /* DPno */
+       0x00B00E05, /* PDSnoa */
+       0x00B10665, /* PDSPxoxn */
+       0x00B21974, /* SSPxDSxox */
+       0x00B30CE8, /* SDPanan */
+       0x00B4070A, /* PSDnax */
+       0x00B507A9, /* DPSDoaxn */
+       0x00B616E9, /* DPSDPaoxx */
+       0x00B70348, /* SDPxan */
+       0x00B8074A, /* PSDPxax */
+       0x00B906E6, /* DSPDaoxn */
+       0x00BA0B09, /* DPSnao */
+       0x00BB0226, /* DSno */
+       0x00BC1CE4, /* SPDSanax */
+       0x00BD0D7D, /* SDxPDxan */
+       0x00BE0269, /* DPSxo */
+       0x00BF08C9, /* DPSano */
+       0x00C000CA, /* PSa */
+       0x00C11B04, /* SPDSnaoxn */
+       0x00C21884, /* SPDSonoxn */
+       0x00C3006A, /* PSxn */
+       0x00C40E04, /* SPDnoa */
+       0x00C50664, /* SPDSxoxn */
+       0x00C60708, /* SDPnax */
+       0x00C707AA, /* PSDPoaxn */
+       0x00C803A8, /* SDPoa */
+       0x00C90184, /* SPDoxn */
+       0x00CA0749, /* DPSDxax */
+       0x00CB06E4, /* SPDSaoxn */
+       0x00CC0020, /* S */
+       0x00CD0888, /* SDPono */
+       0x00CE0B08, /* SDPnao */
+       0x00CF0224, /* SPno */
+       0x00D00E0A, /* PSDnoa */
+       0x00D1066A, /* PSDPxoxn */
+       0x00D20705, /* PDSnax */
+       0x00D307A4, /* SPDSoaxn */
+       0x00D41D78, /* SSPxPDxax */
+       0x00D50CE9, /* DPSanan */
+       0x00D616EA, /* PSDPSaoxx */
+       0x00D70349, /* DPSxan */
+       0x00D80745, /* PDSPxax */
+       0x00D906E8, /* SDPSaoxn */
+       0x00DA1CE9, /* DPSDanax */
+       0x00DB0D75, /* SPxDSxan */
+       0x00DC0B04, /* SPDnao */
+       0x00DD0228, /* SDno */
+       0x00DE0268, /* SDPxo */
+       0x00DF08C8, /* SDPano */
+       0x00E003A5, /* PDSoa */
+       0x00E10185, /* PDSoxn */
+       0x00E20746, /* DSPDxax */
+       0x00E306EA, /* PSDPaoxn */
+       0x00E40748, /* SDPSxax */
+       0x00E506E5, /* PDSPaoxn */
+       0x00E61CE8, /* SDPSanax */
+       0x00E70D79, /* SPxPDxan */
+       0x00E81D74, /* SSPxDSxax */
+       0x00E95CE6, /* DSPDSanaxxn */
+       0x00EA02E9, /* DPSao */
+       0x00EB0849, /* DPSxno */
+       0x00EC02E8, /* SDPao */
+       0x00ED0848, /* SDPxno */
+       0x00EE0086, /* DSo */
+       0x00EF0A08, /* SDPnoo */
+       0x00F00021, /* P */
+       0x00F10885, /* PDSono */
+       0x00F20B05, /* PDSnao */
+       0x00F3022A, /* PSno */
+       0x00F40B0A, /* PSDnao */
+       0x00F50225, /* PDno */
+       0x00F60265, /* PDSxo */
+       0x00F708C5, /* PDSano */
+       0x00F802E5, /* PDSao */
+       0x00F90845, /* PDSxno */
+       0x00FA0089, /* DPo */
+       0x00FB0A09, /* DPSnoo */
+       0x00FC008A, /* PSo */
+       0x00FD0A0A, /* PSDnoo */
+       0x00FE02A9, /* DPSoo */
+       0x00FF0062  /* 1 */
+};
+
+/* GDI Helper Functions */
+
+INLINE uint32 gdi_rop3_code(uint8 code)
+{
+       return rop3_code_table[code];
+}
+
+INLINE uint8* gdi_get_bitmap_pointer(HGDI_DC hdcBmp, int x, int y)
+{
+       uint8* p;
+       HGDI_BITMAP hBmp = (HGDI_BITMAP) hdcBmp->selectedObject;
+       
+       if (x >= 0 && x < hBmp->width && y >= 0 && y < hBmp->height)
+       {
+               p = hBmp->data + (y * hBmp->width * hdcBmp->bytesPerPixel) + (x * hdcBmp->bytesPerPixel);
+               return p;
+       }
+       else
+       {
+               printf("gdi_get_bitmap_pointer: requesting invalid pointer: (%d,%d) in %dx%d\n", x, y, hBmp->width, hBmp->height);
+               return 0;
+       }
+}
+
+INLINE uint8* gdi_get_brush_pointer(HGDI_DC hdcBrush, int x, int y)
+{
+       uint8 * p;
+
+       if (hdcBrush->brush != NULL)
+       {
+               if (hdcBrush->brush->style == GDI_BS_PATTERN)
+               {
+                       HGDI_BITMAP hBmpBrush = hdcBrush->brush->pattern;
+       
+                       if (x >= 0 && y >= 0)
+                       {
+                               x = x % hBmpBrush->width;
+                               y = y % hBmpBrush->height;
+                               p = hBmpBrush->data + (y * hBmpBrush->scanline) + (x * hBmpBrush->bytesPerPixel);
+                               return p;
+                       }
+               }
+       }
+
+       p = (uint8*) &(hdcBrush->textColor);
+       return p;
+}
+
+INLINE int gdi_is_mono_pixel_set(uint8* data, int x, int y, int width)
+{
+       int byte;
+       int shift;
+
+       width = (width + 7) / 8;
+       byte = (y * width) + (x / 8);
+       shift = x % 8;
+
+       return (data[byte] & (0x80 >> shift)) != 0;
+}
+
+gdiBitmap* gdi_glyph_new(rdpGdi* gdi, GLYPH_DATA* glyph)
+{
+       uint8* extra;
+       gdiBitmap* gdi_bmp;
+
+       gdi_bmp = (gdiBitmap*) malloc(sizeof(gdiBitmap));
+
+       gdi_bmp->hdc = gdi_GetDC();
+       gdi_bmp->hdc->bytesPerPixel = 1;
+       gdi_bmp->hdc->bitsPerPixel = 1;
+
+       extra = freerdp_glyph_convert(glyph->cx, glyph->cy, glyph->aj);
+       gdi_bmp->bitmap = gdi_CreateBitmap(glyph->cx, glyph->cy, 1, extra);
+       gdi_bmp->bitmap->bytesPerPixel = 1;
+       gdi_bmp->bitmap->bitsPerPixel = 1;
+
+       gdi_SelectObject(gdi_bmp->hdc, (HGDIOBJECT) gdi_bmp->bitmap);
+       gdi_bmp->org_bitmap = NULL;
+
+       return gdi_bmp;
+}
+
+void gdi_glyph_free(gdiBitmap *gdi_bmp)
+{
+       if (gdi_bmp != 0)
+       {
+               gdi_SelectObject(gdi_bmp->hdc, (HGDIOBJECT) gdi_bmp->org_bitmap);
+               gdi_DeleteObject((HGDIOBJECT) gdi_bmp->bitmap);
+               gdi_DeleteDC(gdi_bmp->hdc);
+               free(gdi_bmp);
+       }
+}
+
+gdiBitmap* gdi_bitmap_new_ex(rdpGdi* gdi, int width, int height, int bpp, uint8* data)
+{
+       gdiBitmap* bitmap;
+
+       bitmap = (gdiBitmap*) malloc(sizeof(gdiBitmap));
+       bitmap->hdc = gdi_CreateCompatibleDC(gdi->hdc);
+
+       DEBUG_GDI("gdi_bitmap_new: width:%d height:%d bpp:%d", width, height, bpp);
+
+       if (data == NULL)
+               bitmap->bitmap = gdi_CreateCompatibleBitmap(gdi->hdc, width, height);
+       else
+               bitmap->bitmap = gdi_create_bitmap(gdi, width, height, bpp, data);
+
+       gdi_SelectObject(bitmap->hdc, (HGDIOBJECT) bitmap->bitmap);
+       bitmap->org_bitmap = NULL;
+
+       return bitmap;
+}
+
+void gdi_bitmap_free_ex(gdiBitmap* bitmap)
+{
+       if (bitmap != NULL)
+       {
+               gdi_SelectObject(bitmap->hdc, (HGDIOBJECT) bitmap->org_bitmap);
+               gdi_DeleteObject((HGDIOBJECT) bitmap->bitmap);
+               gdi_DeleteDC(bitmap->hdc);
+               free(bitmap);
+       }
+}
+
+void gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette)
+{
+       rdpGdi* gdi = context->gdi;
+       gdi->clrconv->palette->count = palette->number;
+       gdi->clrconv->palette->entries = palette->entries;
+}
+
+void gdi_set_bounds(rdpContext* context, rdpBounds* bounds)
+{
+       rdpGdi* gdi = context->gdi;
+
+       if (bounds != NULL)
+       {
+               gdi_SetClipRgn(gdi->drawing->hdc, bounds->left, bounds->top,
+                               bounds->right - bounds->left + 1, bounds->bottom - bounds->top + 1);
+       }
+       else
+       {
+               gdi_SetNullClipRgn(gdi->drawing->hdc);
+       }
+}
+
+void gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt)
+{
+       rdpGdi* gdi = context->gdi;
+
+       gdi_BitBlt(gdi->drawing->hdc, dstblt->nLeftRect, dstblt->nTopRect,
+                       dstblt->nWidth, dstblt->nHeight, NULL, 0, 0, gdi_rop3_code(dstblt->bRop));
+}
+
+void gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt)
+{
+       uint8* data;
+       rdpBrush* brush;
+       HGDI_BRUSH originalBrush;
+       rdpGdi* gdi = context->gdi;
+
+       brush = &patblt->brush;
+
+       if (brush->style == GDI_BS_SOLID)
+       {
+               uint32 color;
+               originalBrush = gdi->drawing->hdc->brush;
+
+               color = freerdp_color_convert_rgb(patblt->foreColor, gdi->srcBpp, 32, gdi->clrconv);
+               gdi->drawing->hdc->brush = gdi_CreateSolidBrush(color);
+
+               gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect,
+                               patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop));
+
+               gdi_DeleteObject((HGDIOBJECT) gdi->drawing->hdc->brush);
+               gdi->drawing->hdc->brush = originalBrush;
+       }
+       else if (brush->style == GDI_BS_PATTERN)
+       {
+               HGDI_BITMAP hBmp;
+
+               if (brush->bpp > 1)
+               {
+                       data = freerdp_image_convert(brush->data, NULL, 8, 8, gdi->srcBpp, gdi->dstBpp, gdi->clrconv);
+               }
+               else
+               {
+                       data = freerdp_mono_image_convert(brush->data, 8, 8, gdi->srcBpp, gdi->dstBpp,
+                               patblt->backColor, patblt->foreColor, gdi->clrconv);
+               }
+
+               hBmp = gdi_CreateBitmap(8, 8, gdi->drawing->hdc->bitsPerPixel, data);
+
+               originalBrush = gdi->drawing->hdc->brush;
+               gdi->drawing->hdc->brush = gdi_CreatePatternBrush(hBmp);
+
+               gdi_PatBlt(gdi->drawing->hdc, patblt->nLeftRect, patblt->nTopRect,
+                               patblt->nWidth, patblt->nHeight, gdi_rop3_code(patblt->bRop));
+
+               gdi_DeleteObject((HGDIOBJECT) gdi->drawing->hdc->brush);
+               gdi->drawing->hdc->brush = originalBrush;
+       }
+       else
+       {
+               printf("unimplemented brush style:%d\n", brush->style);
+       }
+}
+
+void gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt)
+{
+       rdpGdi* gdi = context->gdi;
+
+       gdi_BitBlt(gdi->drawing->hdc, scrblt->nLeftRect, scrblt->nTopRect,
+                       scrblt->nWidth, scrblt->nHeight, gdi->primary->hdc,
+                       scrblt->nXSrc, scrblt->nYSrc, gdi_rop3_code(scrblt->bRop));
+}
+
+void gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect)
+{
+       GDI_RECT rect;
+       HGDI_BRUSH hBrush;
+       uint32 brush_color;
+       rdpGdi *gdi = context->gdi;
+
+       gdi_CRgnToRect(opaque_rect->nLeftRect, opaque_rect->nTopRect,
+                       opaque_rect->nWidth, opaque_rect->nHeight, &rect);
+
+       brush_color = freerdp_color_convert_var_bgr(opaque_rect->color, gdi->srcBpp, 32, gdi->clrconv);
+
+       hBrush = gdi_CreateSolidBrush(brush_color);
+       gdi_FillRect(gdi->drawing->hdc, &rect, hBrush);
+
+       gdi_DeleteObject((HGDIOBJECT) hBrush);
+}
+
+void gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect)
+{
+       int i;
+       GDI_RECT rect;
+       HGDI_BRUSH hBrush;
+       uint32 brush_color;
+       DELTA_RECT* rectangle;
+       rdpGdi *gdi = context->gdi;
+
+       for (i = 1; i < (int) multi_opaque_rect->numRectangles + 1; i++)
+       {
+               rectangle = &multi_opaque_rect->rectangles[i];
+
+               gdi_CRgnToRect(rectangle->left, rectangle->top,
+                               rectangle->width, rectangle->height, &rect);
+
+               brush_color = freerdp_color_convert_var_bgr(multi_opaque_rect->color, gdi->srcBpp, 32, gdi->clrconv);
+
+               hBrush = gdi_CreateSolidBrush(brush_color);
+               gdi_FillRect(gdi->drawing->hdc, &rect, hBrush);
+
+               gdi_DeleteObject((HGDIOBJECT) hBrush);
+       }
+}
+
+void gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to)
+{
+       uint32 color;
+       HGDI_PEN hPen;
+       rdpGdi *gdi = context->gdi;
+
+       color = freerdp_color_convert_rgb(line_to->penColor, gdi->srcBpp, 32, gdi->clrconv);
+       hPen = gdi_CreatePen(line_to->penStyle, line_to->penWidth, (GDI_COLOR) color);
+       gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen);
+       gdi_SetROP2(gdi->drawing->hdc, line_to->bRop2);
+
+       gdi_MoveToEx(gdi->drawing->hdc, line_to->nXStart, line_to->nYStart, NULL);
+       gdi_LineTo(gdi->drawing->hdc, line_to->nXEnd, line_to->nYEnd);
+
+       gdi_DeleteObject((HGDIOBJECT) hPen);
+}
+
+void gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline)
+{
+       int i;
+       uint32 color;
+       HGDI_PEN hPen;
+       DELTA_POINT* points;
+       rdpGdi* gdi = context->gdi;
+       sint32 x;
+       sint32 y;
+
+       color = freerdp_color_convert_rgb(polyline->penColor, gdi->srcBpp, 32, gdi->clrconv);
+       hPen = gdi_CreatePen(GDI_PS_SOLID, 1, (GDI_COLOR) color);
+       gdi_SelectObject(gdi->drawing->hdc, (HGDIOBJECT) hPen);
+       gdi_SetROP2(gdi->drawing->hdc, polyline->bRop2);
+
+       x = polyline->xStart;
+       y = polyline->yStart;
+       gdi_MoveToEx(gdi->drawing->hdc, x, y, NULL);
+
+       points = polyline->points;
+       for (i = 0; i < (int) polyline->numPoints; i++)
+       {
+               x += points[i].x;
+               y += points[i].y;
+               gdi_LineTo(gdi->drawing->hdc, x, y);
+               gdi_MoveToEx(gdi->drawing->hdc, x, y, NULL);
+       }
+
+       gdi_DeleteObject((HGDIOBJECT) hPen);
+}
+
+void gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt)
+{
+       gdiBitmap* bitmap;
+       rdpGdi* gdi = context->gdi;
+
+       bitmap = (gdiBitmap*) memblt->bitmap;
+
+       gdi_BitBlt(gdi->drawing->hdc, memblt->nLeftRect, memblt->nTopRect,
+                       memblt->nWidth, memblt->nHeight, bitmap->hdc,
+                       memblt->nXSrc, memblt->nYSrc, gdi_rop3_code(memblt->bRop));
+}
+
+void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt)
+{
+
+}
+
+int tilenum = 0;
+
+void gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command)
+{
+       int i, j;
+       int tx, ty;
+       char* tile_bitmap;
+       RFX_MESSAGE* message;
+       rdpGdi* gdi = context->gdi;
+       RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) gdi->rfx_context;
+       NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) gdi->nsc_context;
+
+       DEBUG_GDI("destLeft %d destTop %d destRight %d destBottom %d "
+               "bpp %d codecID %d width %d height %d length %d",
+               surface_bits_command->destLeft, surface_bits_command->destTop,
+               surface_bits_command->destRight, surface_bits_command->destBottom,
+               surface_bits_command->bpp, surface_bits_command->codecID,
+               surface_bits_command->width, surface_bits_command->height,
+               surface_bits_command->bitmapDataLength);
+
+       tile_bitmap = (char*) xzalloc(32);
+
+       if (surface_bits_command->codecID == CODEC_ID_REMOTEFX)
+       {
+               message = rfx_process_message(rfx_context,
+                               surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+
+               DEBUG_GDI("num_rects %d num_tiles %d", message->num_rects, message->num_tiles);
+
+               /* blit each tile */
+               for (i = 0; i < message->num_tiles; i++)
+               {
+                       tx = message->tiles[i]->x + surface_bits_command->destLeft;
+                       ty = message->tiles[i]->y + surface_bits_command->destTop;
+
+                       freerdp_image_convert(message->tiles[i]->data, gdi->tile->bitmap->data, 64, 64, 32, 32, gdi->clrconv);
+
+#ifdef DUMP_REMOTEFX_TILES
+                       sprintf(tile_bitmap, "/tmp/rfx/tile_%d.bmp", tilenum++);
+                       freerdp_bitmap_write(tile_bitmap, gdi->tile->bitmap->data, 64, 64, 32);
+#endif
+
+                       for (j = 0; j < message->num_rects; j++)
+                       {
+                               gdi_SetClipRgn(gdi->primary->hdc,
+                                       surface_bits_command->destLeft + message->rects[j].x,
+                                       surface_bits_command->destTop + message->rects[j].y,
+                                       message->rects[j].width, message->rects[j].height);
+
+                               gdi_BitBlt(gdi->primary->hdc, tx, ty, 64, 64, gdi->tile->hdc, 0, 0, GDI_SRCCOPY);
+                       }
+               }
+
+               gdi_SetNullClipRgn(gdi->primary->hdc);
+               rfx_message_free(rfx_context, message);
+       }
+       else if (surface_bits_command->codecID == CODEC_ID_NSCODEC)
+       {
+               nsc_context->width = surface_bits_command->width;
+               nsc_context->height = surface_bits_command->height;
+               nsc_process_message(nsc_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
+               gdi->image->bitmap->width = surface_bits_command->width;
+               gdi->image->bitmap->height = surface_bits_command->height;
+               gdi->image->bitmap->bitsPerPixel = surface_bits_command->bpp;
+               gdi->image->bitmap->bytesPerPixel = gdi->image->bitmap->bitsPerPixel / 8;
+               gdi->image->bitmap->data = (uint8*) xrealloc(gdi->image->bitmap->data, gdi->image->bitmap->width * gdi->image->bitmap->height * 4);
+               freerdp_image_flip(nsc_context->bmpdata, gdi->image->bitmap->data, gdi->image->bitmap->width, gdi->image->bitmap->height, 32);
+               gdi_BitBlt(gdi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop, surface_bits_command->width, surface_bits_command->height, gdi->image->hdc, 0, 0, GDI_SRCCOPY);
+               nsc_context_destroy(nsc_context);
+       } 
+       else if (surface_bits_command->codecID == CODEC_ID_NONE)
+       {
+               gdi->image->bitmap->width = surface_bits_command->width;
+               gdi->image->bitmap->height = surface_bits_command->height;
+               gdi->image->bitmap->bitsPerPixel = surface_bits_command->bpp;
+               gdi->image->bitmap->bytesPerPixel = gdi->image->bitmap->bitsPerPixel / 8;
+
+               gdi->image->bitmap->data = (uint8*) xrealloc(gdi->image->bitmap->data,
+                               gdi->image->bitmap->width * gdi->image->bitmap->height * 4);
+
+               if ((surface_bits_command->bpp != 32) || (gdi->clrconv->alpha == true))
+               {
+                       uint8* temp_image;
+
+                       freerdp_image_convert(surface_bits_command->bitmapData, gdi->image->bitmap->data,
+                               gdi->image->bitmap->width, gdi->image->bitmap->height,
+                               gdi->image->bitmap->bitsPerPixel, 32, gdi->clrconv);
+
+                       surface_bits_command->bpp = 32;
+                       surface_bits_command->bitmapData = gdi->image->bitmap->data;
+
+                       temp_image = (uint8*) xmalloc(gdi->image->bitmap->width * gdi->image->bitmap->height * 4);
+                       freerdp_image_flip(gdi->image->bitmap->data, temp_image, gdi->image->bitmap->width, gdi->image->bitmap->height, 32);
+                       xfree(gdi->image->bitmap->data);
+                       gdi->image->bitmap->data = temp_image;
+               }
+               else
+               {
+                       freerdp_image_flip(surface_bits_command->bitmapData, gdi->image->bitmap->data,
+                                       gdi->image->bitmap->width, gdi->image->bitmap->height, 32);
+               }
+
+               gdi_BitBlt(gdi->primary->hdc, surface_bits_command->destLeft, surface_bits_command->destTop,
+                               surface_bits_command->width, surface_bits_command->height, gdi->image->hdc, 0, 0, GDI_SRCCOPY);
+       }
+       else
+       {
+               printf("Unsupported codecID %d\n", surface_bits_command->codecID);
+       }
+
+       if (tile_bitmap != NULL)
+               xfree(tile_bitmap);
+}
+
+/**
+ * Register GDI callbacks with libfreerdp-core.
+ * @param inst current instance
+ * @return
+ */
+
+void gdi_register_update_callbacks(rdpUpdate* update)
+{
+       rdpPrimaryUpdate* primary = update->primary;
+
+       update->Palette = gdi_palette_update;
+       update->SetBounds = gdi_set_bounds;
+
+       primary->DstBlt = gdi_dstblt;
+       primary->PatBlt = gdi_patblt;
+       primary->ScrBlt = gdi_scrblt;
+       primary->OpaqueRect = gdi_opaque_rect;
+       primary->DrawNineGrid = NULL;
+       primary->MultiDstBlt = NULL;
+       primary->MultiPatBlt = NULL;
+       primary->MultiScrBlt = NULL;
+       primary->MultiOpaqueRect = gdi_multi_opaque_rect;
+       primary->MultiDrawNineGrid = NULL;
+       primary->LineTo = gdi_line_to;
+       primary->Polyline = gdi_polyline;
+       primary->MemBlt = gdi_memblt;
+       primary->Mem3Blt = gdi_mem3blt;
+       primary->SaveBitmap = NULL;
+       primary->GlyphIndex = NULL;
+       primary->FastIndex = NULL;
+       primary->FastGlyph = NULL;
+       primary->PolygonSC = NULL;
+       primary->PolygonCB = NULL;
+       primary->EllipseSC = NULL;
+       primary->EllipseCB = NULL;
+
+       update->SurfaceBits = gdi_surface_bits;
+}
+
+void gdi_init_primary(rdpGdi* gdi)
+{
+       gdi->primary = gdi_bitmap_new_ex(gdi, gdi->width, gdi->height, gdi->dstBpp, gdi->primary_buffer);
+       gdi->primary_buffer = gdi->primary->bitmap->data;
+
+       if (gdi->drawing == NULL)
+               gdi->drawing = gdi->primary;
+
+       gdi->primary->hdc->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND));
+       gdi->primary->hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0);
+       gdi->primary->hdc->hwnd->invalid->null = 1;
+
+       gdi->primary->hdc->hwnd->count = 32;
+       gdi->primary->hdc->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * gdi->primary->hdc->hwnd->count);
+       gdi->primary->hdc->hwnd->ninvalid = 0;
+}
+
+void gdi_resize(rdpGdi* gdi, int width, int height)
+{
+       if (gdi && gdi->primary)
+       {
+               if (gdi->width != width || gdi->height != height)
+               {
+                       if (gdi->drawing == gdi->primary)
+                               gdi->drawing = NULL;
+
+                       gdi->width = width;
+                       gdi->height = height;
+                       gdi_bitmap_free_ex(gdi->primary);
+                       gdi_init_primary(gdi);
+               }
+       }
+}
+
+/**
+ * Initialize GDI
+ * @param inst current instance
+ * @return
+ */
+
+int gdi_init(freerdp* instance, uint32 flags, uint8* buffer)
+{
+       rdpGdi* gdi;
+       rdpCache* cache;
+
+       gdi = (rdpGdi*) malloc(sizeof(rdpGdi));
+       memset(gdi, 0, sizeof(rdpGdi));
+
+       instance->context->gdi = gdi;
+       cache = instance->context->cache;
+
+       gdi->width = instance->settings->width;
+       gdi->height = instance->settings->height;
+       gdi->srcBpp = instance->settings->color_depth;
+       gdi->primary_buffer = buffer;
+
+       /* default internal buffer format */
+       gdi->dstBpp = 32;
+       gdi->bytesPerPixel = 4;
+
+       if (gdi->srcBpp > 16)
+       {
+               if (flags & CLRBUF_32BPP)
+               {
+                       gdi->dstBpp = 32;
+                       gdi->bytesPerPixel = 4;
+               }
+               else if (flags & CLRBUF_24BPP)
+               {
+                       gdi->dstBpp = 24;
+                       gdi->bytesPerPixel = 3;
+               }
+               else if (flags & CLRBUF_16BPP)
+               {
+                       gdi->dstBpp = 16;
+                       gdi->bytesPerPixel = 2;
+               }
+       }
+       else
+       {
+               if (flags & CLRBUF_16BPP)
+               {
+                       gdi->dstBpp = 16;
+                       gdi->bytesPerPixel = 2;
+               }
+               else if (flags & CLRBUF_32BPP)
+               {
+                       gdi->dstBpp = 32;
+                       gdi->bytesPerPixel = 4;
+               }
+       }
+       
+       gdi->hdc = gdi_GetDC();
+       gdi->hdc->bitsPerPixel = gdi->dstBpp;
+       gdi->hdc->bytesPerPixel = gdi->bytesPerPixel;
+
+       gdi->clrconv = (HCLRCONV) malloc(sizeof(CLRCONV));
+       gdi->clrconv->alpha = (flags & CLRCONV_ALPHA) ? 1 : 0;
+       gdi->clrconv->invert = (flags & CLRCONV_INVERT) ? 1 : 0;
+       gdi->clrconv->rgb555 = (flags & CLRCONV_RGB555) ? 1 : 0;
+       gdi->clrconv->palette = (rdpPalette*) malloc(sizeof(rdpPalette));
+
+       gdi->hdc->alpha = gdi->clrconv->alpha;
+       gdi->hdc->invert = gdi->clrconv->invert;
+       gdi->hdc->rgb555 = gdi->clrconv->rgb555;
+
+       gdi_init_primary(gdi);
+
+       gdi->tile = gdi_bitmap_new_ex(gdi, 64, 64, 32, NULL);
+       gdi->image = gdi_bitmap_new_ex(gdi, 64, 64, 32, NULL);
+
+       if (cache == NULL)
+       {
+               cache = cache_new(instance->settings);
+               instance->context->cache = cache;
+       }
+
+       gdi_register_update_callbacks(instance->update);
+
+       brush_cache_register_callbacks(instance->update);
+       glyph_cache_register_callbacks(instance->update);
+       bitmap_cache_register_callbacks(instance->update);
+       offscreen_cache_register_callbacks(instance->update);
+       palette_cache_register_callbacks(instance->update);
+
+       gdi_register_graphics(instance->context->graphics);
+
+       gdi->rfx_context = rfx_context_new();
+       gdi->nsc_context = nsc_context_new();
+
+       return 0;
+}
+
+void gdi_free(freerdp* instance)
+{
+       rdpGdi* gdi = instance->context->gdi;
+
+       if (gdi)
+       {
+               gdi_bitmap_free_ex(gdi->primary);
+               gdi_bitmap_free_ex(gdi->tile);
+               gdi_bitmap_free_ex(gdi->image);
+               gdi_DeleteDC(gdi->hdc);
+               rfx_context_free((RFX_CONTEXT*)gdi->rfx_context);
+               free(gdi->clrconv);
+               free(gdi);
+       }
+       
+       instance->context->gdi = (rdpGdi*) NULL;
+}
+
diff --git a/libfreerdp-gdi/gdi.h b/libfreerdp-gdi/gdi.h
new file mode 100644 (file)
index 0000000..99fa736
--- /dev/null
@@ -0,0 +1,28 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Library
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_CORE_H
+#define __GDI_CORE_H
+
+#include "graphics.h"
+
+gdiBitmap* gdi_bitmap_new_ex(rdpGdi* gdi, int width, int height, int bpp, uint8* data);
+void gdi_bitmap_free_ex(gdiBitmap* gdi_bmp);
+
+#endif /* __GDI_CORE_H */
diff --git a/libfreerdp-gdi/graphics.c b/libfreerdp-gdi/graphics.c
new file mode 100644 (file)
index 0000000..0481633
--- /dev/null
@@ -0,0 +1,239 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/gdi/dc.h>
+#include <freerdp/gdi/brush.h>
+#include <freerdp/gdi/shape.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/gdi/bitmap.h>
+#include <freerdp/gdi/drawing.h>
+#include <freerdp/gdi/clipping.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/codec/bitmap.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/codec/bitmap.h>
+#include <freerdp/cache/glyph.h>
+
+#include "graphics.h"
+
+/* Bitmap Class */
+
+HGDI_BITMAP gdi_create_bitmap(rdpGdi* gdi, int width, int height, int bpp, uint8* data)
+{
+       uint8* bmpData;
+       HGDI_BITMAP bitmap;
+
+       bmpData = freerdp_image_convert(data, NULL, width, height, gdi->srcBpp, bpp, gdi->clrconv);
+       bitmap = gdi_CreateBitmap(width, height, gdi->dstBpp, bmpData);
+
+       return bitmap;
+}
+
+void gdi_Bitmap_New(rdpContext* context, rdpBitmap* bitmap)
+{
+       gdiBitmap* gdi_bitmap;
+       rdpGdi* gdi = context->gdi;
+
+       gdi_bitmap = (gdiBitmap*) bitmap;
+       gdi_bitmap->hdc = gdi_CreateCompatibleDC(gdi->hdc);
+
+       if (bitmap->data == NULL)
+               gdi_bitmap->bitmap = gdi_CreateCompatibleBitmap(gdi->hdc, bitmap->width, bitmap->height);
+       else
+               gdi_bitmap->bitmap = gdi_create_bitmap(gdi, bitmap->width, bitmap->height, gdi->dstBpp, bitmap->data);
+
+       gdi_SelectObject(gdi_bitmap->hdc, (HGDIOBJECT) gdi_bitmap->bitmap);
+       gdi_bitmap->org_bitmap = NULL;
+}
+
+void gdi_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap)
+{
+       gdiBitmap* gdi_bitmap = (gdiBitmap*) bitmap;
+
+       if (gdi_bitmap != NULL)
+       {
+               gdi_SelectObject(gdi_bitmap->hdc, (HGDIOBJECT) gdi_bitmap->org_bitmap);
+               gdi_DeleteObject((HGDIOBJECT) gdi_bitmap->bitmap);
+               gdi_DeleteDC(gdi_bitmap->hdc);
+       }
+}
+
+void gdi_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap)
+{
+       int width, height;
+       gdiBitmap* gdi_bitmap = (gdiBitmap*) bitmap;
+
+       width = bitmap->right - bitmap->left + 1;
+       height = bitmap->bottom - bitmap->top + 1;
+
+       gdi_BitBlt(context->gdi->primary->hdc, bitmap->left, bitmap->top,
+                       width, height, gdi_bitmap->hdc, 0, 0, GDI_SRCCOPY);
+}
+
+void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
+               uint8* data, int width, int height, int bpp, int length, boolean compressed)
+{
+       uint16 size;
+
+       size = width * height * (bpp + 7) / 8;
+
+       if (bitmap->data == NULL)
+               bitmap->data = (uint8*) xmalloc(size);
+       else
+               bitmap->data = (uint8*) xrealloc(bitmap->data, size);
+
+       if (compressed)
+       {
+               boolean status;
+
+               status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp);
+
+               if (status != true)
+               {
+                       printf("Bitmap Decompression Failed\n");
+               }
+       }
+       else
+       {
+               freerdp_image_flip(data, bitmap->data, width, height, bpp);
+
+       }
+
+       bitmap->width = width;
+       bitmap->height = height;
+       bitmap->compressed = false;
+       bitmap->length = size;
+       bitmap->bpp = bpp;
+}
+
+void gdi_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary)
+{
+       rdpGdi* gdi = context->gdi;
+
+       if (primary)
+               gdi->drawing = gdi->primary;
+       else
+               gdi->drawing = (gdiBitmap*) bitmap;
+}
+
+/* Glyph Class */
+
+void gdi_Glyph_New(rdpContext* context, rdpGlyph* glyph)
+{
+       uint8* data;
+       gdiGlyph* gdi_glyph;
+
+       gdi_glyph = (gdiGlyph*) glyph;
+
+       gdi_glyph->hdc = gdi_GetDC();
+       gdi_glyph->hdc->bytesPerPixel = 1;
+       gdi_glyph->hdc->bitsPerPixel = 1;
+
+       data = freerdp_glyph_convert(glyph->cx, glyph->cy, glyph->aj);
+       gdi_glyph->bitmap = gdi_CreateBitmap(glyph->cx, glyph->cy, 1, data);
+       gdi_glyph->bitmap->bytesPerPixel = 1;
+       gdi_glyph->bitmap->bitsPerPixel = 1;
+
+       gdi_SelectObject(gdi_glyph->hdc, (HGDIOBJECT) gdi_glyph->bitmap);
+       gdi_glyph->org_bitmap = NULL;
+}
+
+void gdi_Glyph_Free(rdpContext* context, rdpGlyph* glyph)
+{
+       gdiGlyph* gdi_glyph;
+
+       gdi_glyph = (gdiGlyph*) glyph;
+
+       if (gdi_glyph != 0)
+       {
+               gdi_SelectObject(gdi_glyph->hdc, (HGDIOBJECT) gdi_glyph->org_bitmap);
+               gdi_DeleteObject((HGDIOBJECT) gdi_glyph->bitmap);
+               gdi_DeleteDC(gdi_glyph->hdc);
+       }
+}
+
+void gdi_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y)
+{
+       gdiGlyph* gdi_glyph;
+       rdpGdi* gdi = context->gdi;
+
+       gdi_glyph = (gdiGlyph*) glyph;
+
+       gdi_BitBlt(gdi->drawing->hdc, x, y, gdi_glyph->bitmap->width,
+                       gdi_glyph->bitmap->height, gdi_glyph->hdc, 0, 0, GDI_DSPDxax);
+}
+
+void gdi_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
+{
+       GDI_RECT rect;
+       HGDI_BRUSH brush;
+       rdpGdi* gdi = context->gdi;
+
+       bgcolor = freerdp_color_convert_var_bgr(bgcolor, gdi->srcBpp, 32, gdi->clrconv);
+       fgcolor = freerdp_color_convert_var_bgr(fgcolor, gdi->srcBpp, 32, gdi->clrconv);
+
+       gdi_CRgnToRect(x, y, width, height, &rect);
+
+       brush = gdi_CreateSolidBrush(fgcolor);
+
+       gdi_FillRect(gdi->drawing->hdc, &rect, brush);
+
+       gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor);
+}
+
+void gdi_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor)
+{
+       rdpGdi* gdi = context->gdi;
+
+       bgcolor = freerdp_color_convert_var_bgr(bgcolor, gdi->srcBpp, 32, gdi->clrconv);
+       gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor);
+}
+
+/* Graphics Module */
+
+void gdi_register_graphics(rdpGraphics* graphics)
+{
+       rdpBitmap* bitmap;
+       rdpGlyph* glyph;
+
+       bitmap = xnew(rdpBitmap);
+       bitmap->size = sizeof(gdiBitmap);
+
+       bitmap->New = gdi_Bitmap_New;
+       bitmap->Free = gdi_Bitmap_Free;
+       bitmap->Paint = gdi_Bitmap_Paint;
+       bitmap->Decompress = gdi_Bitmap_Decompress;
+       bitmap->SetSurface = gdi_Bitmap_SetSurface;
+
+       graphics_register_bitmap(graphics, bitmap);
+       xfree(bitmap);
+
+       glyph = xnew(rdpGlyph);
+       glyph->size = sizeof(gdiGlyph);
+
+       glyph->New = gdi_Glyph_New;
+       glyph->Free = gdi_Glyph_Free;
+       glyph->Draw = gdi_Glyph_Draw;
+       glyph->BeginDraw = gdi_Glyph_BeginDraw;
+       glyph->EndDraw = gdi_Glyph_EndDraw;
+
+       graphics_register_glyph(graphics, glyph);
+       xfree(glyph);
+}
+
diff --git a/libfreerdp-gdi/graphics.h b/libfreerdp-gdi/graphics.h
new file mode 100644 (file)
index 0000000..3940a44
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Graphical Objects
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GDI_GRAPHICS_H
+#define __GDI_GRAPHICS_H
+
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/graphics.h>
+
+HGDI_BITMAP gdi_create_bitmap(rdpGdi* gdi, int width, int height, int bpp, uint8* data);
+
+void gdi_Bitmap_New(rdpContext* context, rdpBitmap* bitmap);
+void gdi_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap);
+void gdi_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap,
+               uint8* data, int width, int height, int bpp, int length, boolean compressed);
+void gdi_register_graphics(rdpGraphics* graphics);
+
+#endif /* __GDI_GRAPHICS_H */
diff --git a/libfreerdp-gdi/include/line.c b/libfreerdp-gdi/include/line.c
new file mode 100644 (file)
index 0000000..ab35d1e
--- /dev/null
@@ -0,0 +1,110 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI LineTo
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* do not include this file directly! */
+
+int LINE_TO(HGDI_DC hdc, int nXEnd, int nYEnd)
+{
+       int x, y;
+       int x1, y1;
+       int x2, y2;
+       int e, e2;
+       int dx, dy;
+       int sx, sy;
+       int bx1, by1;
+       int bx2, by2;
+       PIXEL_TYPE pen;
+       PIXEL_TYPE* pixel;
+       HGDI_BITMAP bmp;
+
+       x1 = hdc->pen->posX;
+       y1 = hdc->pen->posY;
+       x2 = nXEnd;
+       y2 = nYEnd;
+
+       dx = (x1 > x2) ? x1 - x2 : x2 - x1;
+       dy = (y1 > y2) ? y1 - y2 : y2 - y1;
+
+       sx = (x1 < x2) ? 1 : -1;
+       sy = (y1 < y2) ? 1 : -1;
+
+       e = dx - dy;
+
+       x = x1;
+       y = y1;
+
+       bmp = (HGDI_BITMAP) hdc->selectedObject;
+
+       if (hdc->clip->null)
+       {
+               bx1 = (x1 < x2) ? x1 : x2;
+               by1 = (y1 < y2) ? y1 : y2;
+               bx2 = (x1 > x2) ? x1 : x2;
+               by2 = (y1 > y2) ? y1 : y2;
+       }
+       else
+       {
+               bx1 = hdc->clip->x;
+               by1 = hdc->clip->y;
+               bx2 = bx1 + hdc->clip->w - 1;
+               by2 = by1 + hdc->clip->h - 1;
+       }
+
+       pen = GDI_GET_PEN_COLOR(hdc->pen);
+
+       while (1)
+       {
+               if (!(x == x2 && y == y2))
+               {
+                       if ((x >= bx1 && x <= bx2) && (y >= by1 && y <= by2))
+                       {
+                               pixel = GDI_GET_POINTER(bmp, x, y);
+                               SET_PIXEL_ROP2(pixel, &pen);
+                       }
+               }
+               else
+               {
+                       break;
+               }
+
+               e2 = 2 * e;
+
+               if (e2 > -dy)
+               {
+                       e -= dy;
+                       x += sx;
+               }
+
+               if (e2 < dx)
+               {
+                       e += dx;
+                       y += sy;
+               }
+       }
+
+       return 1;
+}
+
+/*
+#undef LINE_TO
+#undef PIXEL_TYPE
+#undef SET_PIXEL_ROP2
+#undef GDI_GET_POINTER
+#undef GDI_GET_PEN_COLOR
+*/
diff --git a/libfreerdp-gdi/line.c b/libfreerdp-gdi/line.c
new file mode 100644 (file)
index 0000000..014e904
--- /dev/null
@@ -0,0 +1,152 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Line Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/32bpp.h>
+#include <freerdp/gdi/16bpp.h>
+#include <freerdp/gdi/8bpp.h>
+
+#include <freerdp/gdi/line.h>
+
+p_LineTo LineTo_[5] =
+{
+       NULL,
+       LineTo_8bpp,
+       LineTo_16bpp,
+       NULL,
+       LineTo_32bpp
+};
+
+/**
+ * Draw a line from the current position to the given position.\n
+ * @msdn{dd145029}
+ * @param hdc device context
+ * @param nXEnd ending x position
+ * @param nYEnd ending y position
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_LineTo(HGDI_DC hdc, int nXEnd, int nYEnd)
+{
+       p_LineTo _LineTo = LineTo_[IBPP(hdc->bitsPerPixel)];
+
+       if (_LineTo != NULL)
+               return _LineTo(hdc, nXEnd, nYEnd);
+       else
+               return 0;
+}
+
+/**
+ * Draw one or more straight lines
+ * @param hdc device context
+ * @param lppt array of points
+ * @param cCount number of points
+ * @return
+ */
+int gdi_PolylineTo(HGDI_DC hdc, GDI_POINT *lppt, int cCount)
+{
+       int i;
+
+       for (i = 0; i < cCount; i++)
+       {
+               gdi_LineTo(hdc, lppt[i].x, lppt[i].y);
+               gdi_MoveToEx(hdc, lppt[i].x, lppt[i].y, NULL);
+       }
+
+       return 1;
+}
+
+/**
+ * Draw one or more straight lines
+ * @param hdc device context
+ * @param lppt array of points
+ * @param cPoints number of points
+ * @return
+ */
+int gdi_Polyline(HGDI_DC hdc, GDI_POINT *lppt, int cPoints)
+{
+       if (cPoints > 0)
+       {
+               int i;
+               GDI_POINT pt;
+
+               gdi_MoveToEx(hdc, lppt[0].x, lppt[0].y, &pt);
+
+               for (i = 0; i < cPoints; i++)
+               {
+                       gdi_LineTo(hdc, lppt[i].x, lppt[i].y);
+                       gdi_MoveToEx(hdc, lppt[i].x, lppt[i].y, NULL);
+               }
+
+               gdi_MoveToEx(hdc, pt.x, pt.y, NULL);
+       }
+
+       return 1;
+}
+
+/**
+ * Draw multiple series of connected line segments
+ * @param hdc device context
+ * @param lppt array of points
+ * @param lpdwPolyPoints array of numbers of points per series
+ * @param cCount count of entries in lpdwPolyPoints
+ * @return
+ */
+int gdi_PolyPolyline(HGDI_DC hdc, GDI_POINT *lppt, int *lpdwPolyPoints, int cCount)
+{
+       int cPoints;
+       int i, j = 0;
+
+       for (i = 0; i < cCount; i++)
+       {
+               cPoints = lpdwPolyPoints[i];
+               gdi_Polyline(hdc, &lppt[j], cPoints);
+               j += cPoints;
+       }
+
+       return 1;
+}
+
+/**
+ * Move pen from the current device context to a new position.
+ * @param hdc device context
+ * @param X x position
+ * @param Y y position
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_MoveToEx(HGDI_DC hdc, int X, int Y, HGDI_POINT lpPoint)
+{
+       if (lpPoint != NULL)
+       {
+               lpPoint->x = hdc->pen->posX;
+               lpPoint->y = hdc->pen->posY;
+       }
+
+       hdc->pen->posX = X;
+       hdc->pen->posY = Y;
+
+       return 1;
+}
diff --git a/libfreerdp-gdi/palette.c b/libfreerdp-gdi/palette.c
new file mode 100644 (file)
index 0000000..1df08d9
--- /dev/null
@@ -0,0 +1,106 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Palette Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* GDI Palette Functions: http://msdn.microsoft.com/en-us/library/dd183454/ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/palette.h>
+
+static HGDI_PALETTE hSystemPalette = NULL;
+
+static const GDI_PALETTEENTRY default_system_palette[20] =
+{
+       /* First 10 entries */
+       { 0x00, 0x00, 0x00 },
+       { 0x80, 0x00, 0x00 },
+       { 0x00, 0x80, 0x00 },
+       { 0x80, 0x80, 0x00 },
+       { 0x00, 0x00, 0x80 },
+       { 0x80, 0x00, 0x80 },
+       { 0x00, 0x80, 0x80 },
+       { 0xC0, 0xC0, 0xC0 },
+       { 0xC0, 0xDC, 0xC0 },
+       { 0xA6, 0xCA, 0xF0 },
+
+       /* Last 10 entries */
+       { 0xFF, 0xFB, 0xF0 },
+       { 0xA0, 0xA0, 0xA4 },
+       { 0x80, 0x80, 0x80 },
+       { 0xFF, 0x00, 0x00 },
+       { 0x00, 0xFF, 0x00 },
+       { 0xFF, 0xFF, 0x00 },
+       { 0x00, 0x00, 0xFF },
+       { 0xFF, 0x00, 0xFF },
+       { 0x00, 0xFF, 0xFF },
+       { 0xFF, 0xFF, 0xFF }
+};
+
+/**
+ * Create a new palette.\n
+ * @msdn{dd183507}
+ * @param original palette
+ * @return new palette
+ */
+
+HGDI_PALETTE gdi_CreatePalette(HGDI_PALETTE palette)
+{
+       HGDI_PALETTE hPalette = (HGDI_PALETTE) malloc(sizeof(GDI_PALETTE));
+       hPalette->count = palette->count;
+       hPalette->entries = (GDI_PALETTEENTRY*) malloc(sizeof(GDI_PALETTEENTRY) * hPalette->count);
+       memcpy(hPalette->entries, palette->entries, sizeof(GDI_PALETTEENTRY) * hPalette->count);
+       return hPalette;
+}
+
+/**
+ * Create system palette\n
+ * @return system palette
+ */
+
+HGDI_PALETTE CreateSystemPalette()
+{
+       HGDI_PALETTE palette = (HGDI_PALETTE) malloc(sizeof(GDI_PALETTE));
+
+       palette->count = 256;
+       palette->entries = (GDI_PALETTEENTRY*) malloc(sizeof(GDI_PALETTEENTRY) * 256);
+       memset(palette->entries, 0, sizeof(GDI_PALETTEENTRY) * 256);
+
+       memcpy(&palette->entries[0], &default_system_palette[0], 10 * sizeof(GDI_PALETTEENTRY));
+       memcpy(&palette->entries[256 - 10], &default_system_palette[10], 10 * sizeof(GDI_PALETTEENTRY));
+
+       return palette;
+}
+
+/**
+ * Get system palette\n
+ * @return system palette
+ */
+
+HGDI_PALETTE gdi_GetSystemPalette()
+{
+       if (hSystemPalette == NULL)
+               hSystemPalette = CreateSystemPalette();
+
+       return hSystemPalette;
+}
diff --git a/libfreerdp-gdi/pen.c b/libfreerdp-gdi/pen.c
new file mode 100644 (file)
index 0000000..735f159
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Pen Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* GDI Pen Functions: http://msdn.microsoft.com/en-us/library/dd162790 */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/pen.h>
+
+/**
+ * Create a new pen.\n
+ * @msdn{dd183509}
+ * @param fnPenStyle pen style
+ * @param nWidth pen width
+ * @param crColor pen color
+ * @return new pen
+ */
+
+HGDI_PEN gdi_CreatePen(int fnPenStyle, int nWidth, int crColor)
+{
+       HGDI_PEN hPen = (HGDI_PEN) malloc(sizeof(GDI_PEN));
+       hPen->objectType = GDIOBJECT_PEN;
+       hPen->style = fnPenStyle;
+       hPen->color = crColor;
+       hPen->width = nWidth;
+       return hPen;
+}
+
+INLINE uint8 gdi_GetPenColor_8bpp(HGDI_PEN pen)
+{
+       /* TODO: implement conversion using palette */
+       return 0xFF;
+}
+
+INLINE uint16 gdi_GetPenColor_16bpp(HGDI_PEN pen)
+{
+       uint16 p;
+       int r, g, b;
+       GetRGB32(r, g, b, pen->color);
+       RGB_888_565(r, g, b);
+       p = RGB16(r, g, b);
+       return p;
+}
+
+INLINE uint32 gdi_GetPenColor_32bpp(HGDI_PEN pen)
+{
+       return pen->color;
+}
diff --git a/libfreerdp-gdi/region.c b/libfreerdp-gdi/region.c
new file mode 100644 (file)
index 0000000..e9d0447
--- /dev/null
@@ -0,0 +1,423 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Region Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <freerdp/api.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/region.h>
+
+/**
+ * Create a region from rectangular coordinates.\n
+ * @msdn{dd183514}
+ * @param nLeftRect x1
+ * @param nTopRect y1
+ * @param nRightRect x2
+ * @param nBottomRect y2
+ * @return new region
+ */
+
+HGDI_RGN gdi_CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect)
+{
+       HGDI_RGN hRgn = (HGDI_RGN) malloc(sizeof(GDI_RGN));
+       hRgn->objectType = GDIOBJECT_REGION;
+       hRgn->x = nLeftRect;
+       hRgn->y = nTopRect;
+       hRgn->w = nRightRect - nLeftRect + 1;
+       hRgn->h = nBottomRect - nTopRect + 1;
+       hRgn->null = 0;
+       return hRgn;
+}
+
+/**
+ * Create a new rectangle.
+ * @param xLeft x1
+ * @param yTop y1
+ * @param xRight x2
+ * @param yBottom y2
+ * @return new rectangle
+ */
+
+HGDI_RECT gdi_CreateRect(int xLeft, int yTop, int xRight, int yBottom)
+{
+       HGDI_RECT hRect = (HGDI_RECT) malloc(sizeof(GDI_RECT));
+       hRect->objectType = GDIOBJECT_RECT;
+       hRect->left = xLeft;
+       hRect->top = yTop;
+       hRect->right = xRight;
+       hRect->bottom = yBottom;
+       return hRect;
+}
+
+/**
+ * Convert a rectangle to a region.
+ * @param rect source rectangle
+ * @param rgn destination region
+ */
+
+INLINE void gdi_RectToRgn(HGDI_RECT rect, HGDI_RGN rgn)
+{
+       rgn->x = rect->left;
+       rgn->y = rect->top;
+       rgn->w = rect->right - rect->left + 1;
+       rgn->h = rect->bottom - rect->top + 1;
+}
+
+/**
+ * Convert rectangular coordinates to a region.
+ * @param left x1
+ * @param top y1
+ * @param right x2
+ * @param bottom y2
+ * @param rgn destination region
+ */
+
+INLINE void gdi_CRectToRgn(int left, int top, int right, int bottom, HGDI_RGN rgn)
+{
+       rgn->x = left;
+       rgn->y = top;
+       rgn->w = right - left + 1;
+       rgn->h = bottom - top + 1;
+}
+
+/**
+ * Convert a rectangle to region coordinates.
+ * @param rect source rectangle
+ * @param x x1
+ * @param y y1
+ * @param w width
+ * @param h height
+ */
+
+INLINE void gdi_RectToCRgn(HGDI_RECT rect, int *x, int *y, int *w, int *h)
+{
+       *x = rect->left;
+       *y = rect->top;
+       *w = rect->right - rect->left + 1;
+       *h = rect->bottom - rect->top + 1;
+}
+
+/**
+ * Convert rectangular coordinates to region coordinates.
+ * @param left x1
+ * @param top y1
+ * @param right x2
+ * @param bottom y2
+ * @param x x1
+ * @param y y1
+ * @param w width
+ * @param h height
+ */
+
+INLINE void gdi_CRectToCRgn(int left, int top, int right, int bottom, int *x, int *y, int *w, int *h)
+{
+       *x = left;
+       *y = top;
+       *w = right - left + 1;
+       *h = bottom - top + 1;
+}
+
+/**
+ * Convert a region to a rectangle.
+ * @param rgn source region
+ * @param rect destination rectangle
+ */
+
+INLINE void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect)
+{
+       rect->left = rgn->x;
+       rect->top = rgn->y;
+       rect->right = rgn->x + rgn->w - 1;
+       rect->bottom = rgn->y + rgn->h - 1;
+}
+
+/**
+ * Convert region coordinates to a rectangle.
+ * @param x x1
+ * @param y y1
+ * @param w width
+ * @param h height
+ * @param rect destination rectangle
+ */
+
+INLINE void gdi_CRgnToRect(int x, int y, int w, int h, HGDI_RECT rect)
+{
+       rect->left = x;
+       rect->top = y;
+       rect->right = x + w - 1;
+       rect->bottom = y + h - 1;
+}
+
+/**
+ * Convert a region to rectangular coordinates.
+ * @param rgn source region
+ * @param left x1
+ * @param top y1
+ * @param right x2
+ * @param bottom y2
+ */
+
+INLINE void gdi_RgnToCRect(HGDI_RGN rgn, int *left, int *top, int *right, int *bottom)
+{
+       *left = rgn->x;
+       *top = rgn->y;
+       *right = rgn->x + rgn->w - 1;
+       *bottom = rgn->y + rgn->h - 1;
+}
+
+/**
+ * Convert region coordinates to rectangular coordinates.
+ * @param x x1
+ * @param y y1
+ * @param w width
+ * @param h height
+ * @param left x1
+ * @param top y1
+ * @param right x2
+ * @param bottom y2
+ */
+
+INLINE void gdi_CRgnToCRect(int x, int y, int w, int h, int *left, int *top, int *right, int *bottom)
+{
+       *left = x;
+       *top = y;
+       *right = x + w - 1;
+       *bottom = y + h - 1;
+}
+
+/**
+ * Check if copying would involve overlapping regions
+ * @param x x1
+ * @param y y1
+ * @param width width
+ * @param height height
+ * @param srcx source x1
+ * @param srcy source y1
+ * @return 1 if there is an overlap, 0 otherwise
+ */
+
+INLINE int gdi_CopyOverlap(int x, int y, int width, int height, int srcx, int srcy)
+{
+       GDI_RECT dst;
+       GDI_RECT src;
+
+       gdi_CRgnToRect(x, y, width, height, &dst);
+       gdi_CRgnToRect(srcx, srcy, width, height, &src);
+
+       return (dst.right > src.left && dst.left < src.right &&
+               dst.bottom > src.top && dst.top < src.bottom) ? 1 : 0;
+}
+
+/**
+ * Set the coordinates of a given rectangle.\n
+ * @msdn{dd145085}
+ * @param rc rectangle
+ * @param xLeft x1
+ * @param yTop y1
+ * @param xRight x2
+ * @param yBottom y2
+ * @return 1 if successful, 0 otherwise
+ */
+
+INLINE int gdi_SetRect(HGDI_RECT rc, int xLeft, int yTop, int xRight, int yBottom)
+{
+       rc->left = xLeft;
+       rc->top = yTop;
+       rc->right = xRight;
+       rc->bottom = yBottom;
+       return 1;
+}
+
+/**
+ * Set the coordinates of a given region.
+ * @param hRgn region
+ * @param nXLeft x1
+ * @param nYLeft y1
+ * @param nWidth width
+ * @param nHeight height
+ * @return
+ */
+
+INLINE int gdi_SetRgn(HGDI_RGN hRgn, int nXLeft, int nYLeft, int nWidth, int nHeight)
+{
+       hRgn->x = nXLeft;
+       hRgn->y = nYLeft;
+       hRgn->w = nWidth;
+       hRgn->h = nHeight;
+       hRgn->null = 0;
+       return 0;
+}
+
+/**
+ * Convert rectangular coordinates to a region
+ * @param hRgn destination region
+ * @param nLeftRect x1
+ * @param nTopRect y1
+ * @param nRightRect x2
+ * @param nBottomRect y2
+ * @return
+ */
+
+INLINE int gdi_SetRectRgn(HGDI_RGN hRgn, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect)
+{
+       gdi_CRectToRgn(nLeftRect, nTopRect, nRightRect, nBottomRect, hRgn);
+       hRgn->null = 0;
+       return 0;
+}
+
+/**
+ * Compare two regions for equality.\n
+ * @msdn{dd162700}
+ * @param hSrcRgn1 first region
+ * @param hSrcRgn2 second region
+ * @return 1 if both regions are equal, 0 otherwise
+ */
+
+INLINE int gdi_EqualRgn(HGDI_RGN hSrcRgn1, HGDI_RGN hSrcRgn2)
+{
+       if ((hSrcRgn1->x == hSrcRgn2->x) &&
+           (hSrcRgn1->y == hSrcRgn2->y) &&
+           (hSrcRgn1->w == hSrcRgn2->w) &&
+           (hSrcRgn1->h == hSrcRgn2->h))
+       {
+               return 1;
+       }
+
+       return 0;
+}
+
+/**
+ * Copy coordinates from a rectangle to another rectangle
+ * @param dst destination rectangle
+ * @param src source rectangle
+ * @return 1 if successful, 0 otherwise
+ */
+
+INLINE int gdi_CopyRect(HGDI_RECT dst, HGDI_RECT src)
+{
+       dst->left = src->left;
+       dst->top = src->top;
+       dst->right = src->right;
+       dst->bottom = src->bottom;
+       return 1;
+}
+
+/**
+ * Check if a point is inside a rectangle.\n
+ * @msdn{dd162882}
+ * @param rc rectangle
+ * @param x point x position
+ * @param y point y position
+ * @return 1 if the point is inside, 0 otherwise
+ */
+
+INLINE int gdi_PtInRect(HGDI_RECT rc, int x, int y)
+{
+       /*
+        * points on the left and top sides are considered in,
+        * while points on the right and bottom sides are considered out
+        */
+
+       if (x >= rc->left && x <= rc->right)
+       {
+               if (y >= rc->top && y <= rc->bottom)
+               {
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
+/**
+ * Invalidate a given region, such that it is redrawn on the next region update.\n
+ * @msdn{dd145003}
+ * @param hdc device context
+ * @param x x1
+ * @param y y1
+ * @param w width
+ * @param h height
+ * @return
+ */
+
+INLINE int gdi_InvalidateRegion(HGDI_DC hdc, int x, int y, int w, int h)
+{
+       GDI_RECT inv;
+       GDI_RECT rgn;
+       HGDI_RGN invalid;
+       HGDI_RGN cinvalid;
+
+       if (hdc->hwnd == NULL)
+               return 0;
+
+       if (hdc->hwnd->invalid == NULL)
+               return 0;
+
+       cinvalid = hdc->hwnd->cinvalid;
+
+       if (hdc->hwnd->ninvalid + 1 > hdc->hwnd->count)
+       {
+               hdc->hwnd->count *= 2;
+               cinvalid = (HGDI_RGN) realloc(cinvalid, sizeof(GDI_RGN) * (hdc->hwnd->count));
+       }
+
+       gdi_SetRgn(&cinvalid[hdc->hwnd->ninvalid++], x, y, w, h);
+       hdc->hwnd->cinvalid = cinvalid;
+
+       invalid = hdc->hwnd->invalid;
+
+       if (invalid->null)
+       {
+               invalid->x = x;
+               invalid->y = y;
+               invalid->w = w;
+               invalid->h = h;
+               invalid->null = 0;
+               return 0;
+       }
+
+       gdi_CRgnToRect(x, y, w, h, &rgn);
+       gdi_RgnToRect(invalid, &inv);
+
+       if (rgn.left < 0)
+               rgn.left = 0;
+
+       if (rgn.top < 0)
+               rgn.top = 0;
+
+       if (rgn.left < inv.left)
+               inv.left = rgn.left;
+
+       if (rgn.top < inv.top)
+               inv.top = rgn.top;
+
+       if (rgn.right > inv.right)
+               inv.right = rgn.right;
+
+       if (rgn.bottom > inv.bottom)
+               inv.bottom = rgn.bottom;
+
+       gdi_RectToRgn(&inv, invalid);
+
+       return 0;
+}
diff --git a/libfreerdp-gdi/shape.c b/libfreerdp-gdi/shape.c
new file mode 100644 (file)
index 0000000..4ae449a
--- /dev/null
@@ -0,0 +1,223 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * GDI Shape Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+
+#include <freerdp/gdi/8bpp.h>
+#include <freerdp/gdi/16bpp.h>
+#include <freerdp/gdi/32bpp.h>
+#include <freerdp/gdi/bitmap.h>
+
+#include <freerdp/gdi/shape.h>
+
+p_FillRect FillRect_[5] =
+{
+       NULL,
+       FillRect_8bpp,
+       FillRect_16bpp,
+       NULL,
+       FillRect_32bpp
+};
+
+static void Ellipse_Bresenham(HGDI_DC hdc, int x1, int y1, int x2, int y2)
+{
+       int i;
+       long e, e2;
+       long dx, dy;
+       int a, b, c;
+
+       HGDI_BITMAP bmp;
+       uint8 pixel8;
+       uint16 pixel16;
+       uint32 pixel32;
+       int bpp = hdc->bitsPerPixel;
+
+       a = (x1 < x2) ? x2 - x1 : x1 - x2;
+       b = (y1 < y2) ? y2 - y1 : y1 - y2;
+       c = b & 1;
+
+       dx = 4 * (1 - a) * b * b;
+       dy = 4 * (c + 1) * a * a;
+       e = dx + dy + c * a * a;
+
+       if (x1 > x2)
+       {
+               x1 = x2;
+               x2 += a;
+       }
+
+       if (y1 > y2)
+               y1 = y2;
+
+       y1 += (b + 1) / 2;
+       y2 = y1 - c;
+
+       a *= 8 * a;
+       c = 8 * b * b;
+
+       pixel8 = 0;
+       pixel16 = 0;
+       pixel32 = 0;
+       bmp = (HGDI_BITMAP) hdc->selectedObject;
+
+       do
+       {
+               if (bpp == 32)
+               {
+                       gdi_SetPixel_32bpp(bmp, x2, y1, pixel32);
+                       gdi_SetPixel_32bpp(bmp, x1, y1, pixel32);
+                       gdi_SetPixel_32bpp(bmp, x1, y2, pixel32);
+                       gdi_SetPixel_32bpp(bmp, x2, y2, pixel32);
+               }
+               else if (bpp == 16)
+               {
+                       gdi_SetPixel_16bpp(bmp, x2, y1, pixel16);
+                       gdi_SetPixel_16bpp(bmp, x1, y1, pixel16);
+                       gdi_SetPixel_16bpp(bmp, x1, y2, pixel16);
+                       gdi_SetPixel_16bpp(bmp, x2, y2, pixel16);
+               }
+               else if (bpp == 8)
+               {
+                       for (i = x1; i < x2; i++)
+                       {
+                               gdi_SetPixel_8bpp(bmp, i, y1, pixel8);
+                               gdi_SetPixel_8bpp(bmp, i, y2, pixel8);
+                       }
+
+                       for (i = y1; i < y2; i++)
+                       {
+                               gdi_SetPixel_8bpp(bmp, x1, i, pixel8);
+                               gdi_SetPixel_8bpp(bmp, x2, i, pixel8);
+                       }
+               }
+
+               e2 = 2 * e;
+
+               if (e2 >= dx)
+               {
+                       x1++;
+                       x2--;
+                       e += dx += c;
+               }
+
+               if (e2 <= dy)
+               {
+                       y1++;
+                       y2--;
+                       e += dy += a;
+               }
+       }
+       while (x1 <= x2);
+
+       while (y1 - y2 < b)
+       {
+               if (bpp == 32)
+               {
+                       gdi_SetPixel_32bpp(bmp, x1 - 1, ++y1, pixel32);
+                       gdi_SetPixel_32bpp(bmp, x1 - 1, --y2, pixel32);
+               }
+               else if (bpp == 16)
+               {
+                       gdi_SetPixel_16bpp(bmp, x1 - 1, ++y1, pixel16);
+                       gdi_SetPixel_16bpp(bmp, x1 - 1, --y2, pixel16);
+               }
+               else if (bpp == 8)
+               {
+                       gdi_SetPixel_8bpp(bmp, x1 - 1, ++y1, pixel8);
+                       gdi_SetPixel_8bpp(bmp, x1 - 1, --y2, pixel8);
+               }
+       }
+}
+
+/**
+ * Draw an ellipse
+ * @param hdc device context
+ * @param nLeftRect x1
+ * @param nTopRect y1
+ * @param nRightRect x2
+ * @param nBottomRect y2
+ * @return
+ */
+int gdi_Ellipse(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect)
+{
+       Ellipse_Bresenham(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect);
+       return 1;
+}
+
+/**
+ * Fill a rectangle with the given brush.\n
+ * @msdn{dd162719}
+ * @param hdc device context
+ * @param rect rectangle
+ * @param hbr brush
+ * @return 1 if successful, 0 otherwise
+ */
+
+int gdi_FillRect(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr)
+{
+       p_FillRect _FillRect = FillRect_[IBPP(hdc->bitsPerPixel)];
+
+       if (_FillRect != NULL)
+               return _FillRect(hdc, rect, hbr);
+       else
+               return 0;
+}
+
+/**
+ *
+ * @param hdc device context
+ * @param lpPoints array of points
+ * @param nCount number of points
+ * @return
+ */
+int gdi_Polygon(HGDI_DC hdc, GDI_POINT *lpPoints, int nCount)
+{
+       return 1;
+}
+
+/**
+ * Draw a series of closed polygons
+ * @param hdc device context
+ * @param lpPoints array of series of points
+ * @param lpPolyCounts array of number of points in each series
+ * @param nCount count of number of points in lpPolyCounts
+ * @return
+ */
+int gdi_PolyPolygon(HGDI_DC hdc, GDI_POINT *lpPoints, int *lpPolyCounts, int nCount)
+{
+       return 1;
+}
+
+/**
+ * Draw a rectangle
+ * @param hdc device context
+ * @param nLeftRect x1
+ * @param nTopRect y1
+ * @param nRightRect x2
+ * @param nBottomRect y2
+ * @return
+ */
+int gdi_Rectangle(HGDI_DC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect)
+{
+       return 1;
+}
diff --git a/libfreerdp-kbd/CMakeLists.txt b/libfreerdp-kbd/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e16fd78
--- /dev/null
@@ -0,0 +1,53 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-kbd cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(FREERDP_KBD_SRCS
+       locales.c
+       layouts.c
+       layouts_xkb.c
+       layouts_xkb.h
+       x_layout_id_table.c
+       x_layout_id_table.h
+       libkbd.c
+       libkbd.h)
+
+add_library(freerdp-kbd ${FREERDP_KBD_SRCS})
+
+find_suggested_package(X11)
+if(WITH_X11)
+       target_link_libraries(freerdp-kbd ${X11_LIBRARIES})
+endif()
+
+if(NOT APPLE)
+       find_suggested_package(XKBFile)
+       if(WITH_X11)
+               if(WITH_XKBFILE)
+                       add_definitions(-DWITH_XKBFILE)
+                       include_directories(${XKBFILE_INCLUDE_DIRS})
+                       target_link_libraries(freerdp-kbd ${XKBFILE_LIBRARIES})
+               endif()
+       endif()
+endif()
+
+add_definitions(-DKEYMAP_PATH="${FREERDP_KEYMAP_PATH}")
+
+set_target_properties(freerdp-kbd PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+
+install(TARGETS freerdp-kbd DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
diff --git a/libfreerdp-kbd/layouts.c b/libfreerdp-kbd/layouts.c
new file mode 100644 (file)
index 0000000..1f8a5ae
--- /dev/null
@@ -0,0 +1,300 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "libkbd.h"
+
+#include <freerdp/kbd/layouts.h>
+
+typedef struct
+{
+       /* Keyboard layout code */
+       unsigned int code;
+
+       /* Keyboard layout name */
+       char name[50];
+
+} keyboardLayout;
+
+/*
+ * In Windows XP, this information is available in the system registry at
+ * HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet001/Control/Keyboard Layouts/
+ */
+
+static const keyboardLayout keyboardLayouts[] =
+{
+       { KBD_ARABIC_101,               "Arabic (101)" },
+       { KBD_BULGARIAN,                "Bulgarian" },
+       { KBD_CHINESE_TRADITIONAL_US,   "Chinese (Traditional) - US Keyboard" },
+       { KBD_CZECH,                    "Czech" },
+       { KBD_DANISH,                   "Danish" },
+       { KBD_GERMAN,                   "German" },
+       { KBD_GREEK,                    "Greek" },
+       { KBD_US,                       "US" },
+       { KBD_SPANISH,                  "Spanish" },
+       { KBD_FINNISH,                  "Finnish" },
+       { KBD_FRENCH,                   "French" },
+       { KBD_HEBREW,                   "Hebrew" },
+       { KBD_HUNGARIAN,                "Hungarian" },
+       { KBD_ICELANDIC,                "Icelandic" },
+       { KBD_ITALIAN,                  "Italian" },
+       { KBD_JAPANESE,                 "Japanese" },
+       { KBD_KOREAN,                   "Korean" },
+       { KBD_DUTCH,                    "Dutch" },
+       { KBD_NORWEGIAN,                "Norwegian" },
+       { KBD_POLISH_PROGRAMMERS,       "Polish (Programmers)" },
+       { KBD_PORTUGUESE_BRAZILIAN_ABNT,"Portuguese (Brazilian ABNT)" },
+       { KBD_ROMANIAN,                 "Romanian" },
+       { KBD_RUSSIAN,                  "Russian" },
+       { KBD_CROATIAN,                 "Croatian" },
+       { KBD_SLOVAK,                   "Slovak" },
+       { KBD_ALBANIAN,                 "Albanian" },
+       { KBD_SWEDISH,                  "Swedish" },
+       { KBD_THAI_KEDMANEE,            "Thai Kedmanee" },
+       { KBD_TURKISH_Q,                "Turkish Q" },
+       { KBD_URDU,                     "Urdu" },
+       { KBD_UKRAINIAN,                "Ukrainian" },
+       { KBD_BELARUSIAN,               "Belarusian" },
+       { KBD_SLOVENIAN,                "Slovenian" },
+       { KBD_ESTONIAN,                 "Estonian" },
+       { KBD_LATVIAN,                  "Latvian" },
+       { KBD_LITHUANIAN_IBM,           "Lithuanian IBM" },
+       { KBD_FARSI,                    "Farsi" },
+       { KBD_VIETNAMESE,               "Vietnamese" },
+       { KBD_ARMENIAN_EASTERN,         "Armenian Eastern" },
+       { KBD_AZERI_LATIN,              "Azeri Latin" },
+       { KBD_FYRO_MACEDONIAN,          "FYRO Macedonian" },
+       { KBD_GEORGIAN,                 "Georgian" },
+       { KBD_FAEROESE,                 "Faeroese" },
+       { KBD_DEVANAGARI_INSCRIPT,      "Devanagari - INSCRIPT" },
+       { KBD_MALTESE_47_KEY,           "Maltese 47-key" },
+       { KBD_NORWEGIAN_WITH_SAMI,      "Norwegian with Sami" },
+       { KBD_KAZAKH,                   "Kazakh" },
+       { KBD_KYRGYZ_CYRILLIC,          "Kyrgyz Cyrillic" },
+       { KBD_TATAR,                    "Tatar" },
+       { KBD_BENGALI,                  "Bengali" },
+       { KBD_PUNJABI,                  "Punjabi" },
+       { KBD_GUJARATI,                 "Gujarati" },
+       { KBD_TAMIL,                    "Tamil" },
+       { KBD_TELUGU,                   "Telugu" },
+       { KBD_KANNADA,                  "Kannada" },
+       { KBD_MALAYALAM,                "Malayalam" },
+       { KBD_MARATHI,                  "Marathi" },
+       { KBD_MONGOLIAN_CYRILLIC,       "Mongolian Cyrillic" },
+       { KBD_UNITED_KINGDOM_EXTENDED,  "United Kingdom Extended" },
+       { KBD_SYRIAC,                   "Syriac" },
+       { KBD_NEPALI,                   "Nepali" },
+       { KBD_PASHTO,                   "Pashto" },
+       { KBD_DIVEHI_PHONETIC,          "Divehi Phonetic" },
+       { KBD_LUXEMBOURGISH,            "Luxembourgish" },
+       { KBD_MAORI,                    "Maori" },
+       { KBD_CHINESE_SIMPLIFIED_US,    "Chinese (Simplified) - US Keyboard" },
+       { KBD_SWISS_GERMAN,             "Swiss German" },
+       { KBD_UNITED_KINGDOM,           "United Kingdom" },
+       { KBD_LATIN_AMERICAN,           "Latin American" },
+       { KBD_BELGIAN_FRENCH,           "Belgian French" },
+       { KBD_BELGIAN_PERIOD,           "Belgian (Period)" },
+       { KBD_PORTUGUESE,               "Portuguese" },
+       { KBD_SERBIAN_LATIN,            "Serbian (Latin)" },
+       { KBD_AZERI_CYRILLIC,           "Azeri Cyrillic" },
+       { KBD_SWEDISH_WITH_SAMI,        "Swedish with Sami" },
+       { KBD_UZBEK_CYRILLIC,           "Uzbek Cyrillic" },
+       { KBD_INUKTITUT_LATIN,          "Inuktitut Latin" },
+       { KBD_CANADIAN_FRENCH_LEGACY,   "Canadian French (legacy)" },
+       { KBD_SERBIAN_CYRILLIC,         "Serbian (Cyrillic)" },
+       { KBD_CANADIAN_FRENCH,          "Canadian French" },
+       { KBD_SWISS_FRENCH,             "Swiss French" },
+       { KBD_BOSNIAN,                  "Bosnian" },
+       { KBD_IRISH,                    "Irish" },
+       { KBD_BOSNIAN_CYRILLIC,         "Bosnian Cyrillic" }
+};
+
+
+typedef struct
+{
+       /* Keyboard layout code */
+       unsigned int code;
+
+       /* Keyboard variant ID */
+       unsigned short id;
+
+       /* Keyboard layout variant name */
+       char name[50];
+
+} keyboardLayoutVariant;
+
+
+static const keyboardLayoutVariant keyboardLayoutVariants[] =
+{
+       { KBD_ARABIC_102,                               0x0028, "Arabic (102)" },
+       { KBD_BULGARIAN_LATIN,                          0x0004, "Bulgarian (Latin)" },
+       { KBD_CZECH_QWERTY,                             0x0005, "Czech (QWERTY)" },
+       { KBD_GERMAN_IBM,                               0x0012, "German (IBM)" },
+       { KBD_GREEK_220,                                0x0016, "Greek (220)" },
+       { KBD_UNITED_STATES_DVORAK,                     0x0002, "United States-Dvorak" },
+       { KBD_SPANISH_VARIATION,                        0x0086, "Spanish Variation" },
+       { KBD_HUNGARIAN_101_KEY,                        0x0006, "Hungarian 101-key" },
+       { KBD_ITALIAN_142,                              0x0003, "Italian (142)" },
+       { KBD_POLISH_214,                               0x0007, "Polish (214)" },
+       { KBD_PORTUGUESE_BRAZILIAN_ABNT2,               0x001D, "Portuguese (Brazilian ABNT2)" },
+       { KBD_RUSSIAN_TYPEWRITER,                       0x0008, "Russian (Typewriter)" },
+       { KBD_SLOVAK_QWERTY,                            0x0013, "Slovak (QWERTY)" },
+       { KBD_THAI_PATTACHOTE,                          0x0021, "Thai Pattachote" },
+       { KBD_TURKISH_F,                                0x0014, "Turkish F" },
+       { KBD_LATVIAN_QWERTY,                           0x0015, "Latvian (QWERTY)" },
+       { KBD_LITHUANIAN,                               0x0027, "Lithuanian" },
+       { KBD_ARMENIAN_WESTERN,                         0x0025, "Armenian Western" },
+       { KBD_HINDI_TRADITIONAL,                        0x000C, "Hindi Traditional" },
+       { KBD_MALTESE_48_KEY,                           0x002B, "Maltese 48-key" },
+       { KBD_SAMI_EXTENDED_NORWAY,                     0x002C, "Sami Extended Norway" },
+       { KBD_BENGALI_INSCRIPT,                         0x002A, "Bengali (Inscript)" },
+       { KBD_SYRIAC_PHONETIC,                          0x000E, "Syriac Phonetic" },
+       { KBD_DIVEHI_TYPEWRITER,                        0x000D, "Divehi Typewriter" },
+       { KBD_BELGIAN_COMMA,                            0x001E, "Belgian (Comma)" },
+       { KBD_FINNISH_WITH_SAMI,                        0x002D, "Finnish with Sami" },
+       { KBD_CANADIAN_MULTILINGUAL_STANDARD,           0x0020, "Canadian Multilingual Standard" },
+       { KBD_GAELIC,                                   0x0026, "Gaelic" },
+       { KBD_ARABIC_102_AZERTY,                        0x0029, "Arabic (102) AZERTY" },
+       { KBD_CZECH_PROGRAMMERS,                        0x000A, "Czech Programmers" },
+       { KBD_GREEK_319,                                0x0018, "Greek (319)" },
+       { KBD_UNITED_STATES_INTERNATIONAL,              0x0001, "United States-International" },
+       { KBD_THAI_KEDMANEE_NON_SHIFTLOCK,              0x0022, "Thai Kedmanee (non-ShiftLock)" },
+       { KBD_SAMI_EXTENDED_FINLAND_SWEDEN,             0x002E, "Sami Extended Finland-Sweden" },
+       { KBD_GREEK_220_LATIN,                          0x0017, "Greek (220) Latin" },
+       { KBD_UNITED_STATES_DVORAK_FOR_LEFT_HAND,       0x001A, "United States-Dvorak for left hand" },
+       { KBD_THAI_PATTACHOTE_NON_SHIFTLOCK,            0x0023, "Thai Pattachote (non-ShiftLock)" },
+       { KBD_GREEK_319_LATIN,                          0x0011, "Greek (319) Latin" },
+       { KBD_UNITED_STATES_DVORAK_FOR_RIGHT_HAND,      0x001B, "United States-Dvorak for right hand" },
+       { KBD_GREEK_LATIN,                              0x0019, "Greek Latin" },
+       { KBD_US_ENGLISH_TABLE_FOR_IBM_ARABIC_238_L,    0x000B, "US English Table for IBM Arabic 238_L" },
+       { KBD_GREEK_POLYTONIC,                          0x001F, "Greek Polytonic" },
+       { KBD_GERMAN_NEO,                               0x00C0, "German Neo" }
+};
+
+/* Input Method Editor (IME) */
+
+typedef struct
+{
+       /* Keyboard layout code */
+       unsigned int code;
+
+       /* IME file name */
+       char fileName[32];
+
+       /* Keyboard layout name */
+       char name[50];
+
+} keyboardIME;
+
+
+/* Global Input Method Editors (IME) */
+
+static const keyboardIME keyboardIMEs[] =
+{
+       { KBD_CHINESE_TRADITIONAL_PHONETIC,                     "phon.ime", "Chinese (Traditional) - Phonetic" },
+       { KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002,                 "imjp81.ime", "Japanese Input System (MS-IME2002)" },
+       { KBD_KOREAN_INPUT_SYSTEM_IME_2000,                     "imekr61.ime", "Korean Input System (IME 2000)" },
+       { KBD_CHINESE_SIMPLIFIED_QUANPIN,                       "winpy.ime", "Chinese (Simplified) - QuanPin" },
+       { KBD_CHINESE_TRADITIONAL_CHANGJIE,                     "chajei.ime", "Chinese (Traditional) - ChangJie" },
+       { KBD_CHINESE_SIMPLIFIED_SHUANGPIN,                     "winsp.ime", "Chinese (Simplified) - ShuangPin" },
+       { KBD_CHINESE_TRADITIONAL_QUICK,                        "quick.ime", "Chinese (Traditional) - Quick" },
+       { KBD_CHINESE_SIMPLIFIED_ZHENGMA,                       "winzm.ime", "Chinese (Simplified) - ZhengMa" },
+       { KBD_CHINESE_TRADITIONAL_BIG5_CODE,                    "winime.ime", "Chinese (Traditional) - Big5 Code" },
+       { KBD_CHINESE_TRADITIONAL_ARRAY,                        "winar30.ime", "Chinese (Traditional) - Array" },
+       { KBD_CHINESE_SIMPLIFIED_NEIMA,                         "wingb.ime", "Chinese (Simplified) - NeiMa" },
+       { KBD_CHINESE_TRADITIONAL_DAYI,                         "dayi.ime", "Chinese (Traditional) - DaYi" },
+       { KBD_CHINESE_TRADITIONAL_UNICODE,                      "unicdime.ime", "Chinese (Traditional) - Unicode" },
+       { KBD_CHINESE_TRADITIONAL_NEW_PHONETIC,                 "TINTLGNT.IME", "Chinese (Traditional) - New Phonetic" },
+       { KBD_CHINESE_TRADITIONAL_NEW_CHANGJIE,                 "CINTLGNT.IME", "Chinese (Traditional) - New ChangJie" },
+       { KBD_CHINESE_TRADITIONAL_MICROSOFT_PINYIN_IME_3,       "pintlgnt.ime", "Chinese (Traditional) - Microsoft Pinyin IME 3.0" },
+       { KBD_CHINESE_TRADITIONAL_ALPHANUMERIC,                 "romanime.ime", "Chinese (Traditional) - Alphanumeric" }
+};
+
+
+rdpKeyboardLayout* get_keyboard_layouts(int types)
+{
+       int num, len, i;
+       rdpKeyboardLayout * layouts;
+
+       num = 0;
+       layouts = (rdpKeyboardLayout *) malloc((num + 1) * sizeof(rdpKeyboardLayout));
+
+       if ((types & RDP_KEYBOARD_LAYOUT_TYPE_STANDARD) != 0)
+       {
+               len = sizeof(keyboardLayouts) / sizeof(keyboardLayout);
+               layouts = (rdpKeyboardLayout *) realloc(layouts, (num + len + 1) * sizeof(rdpKeyboardLayout));
+               for (i = 0; i < len; i++, num++)
+               {
+                       layouts[num].code = keyboardLayouts[i].code;
+                       strcpy(layouts[num].name, keyboardLayouts[i].name);
+               }
+       }
+       if ((types & RDP_KEYBOARD_LAYOUT_TYPE_VARIANT) != 0)
+       {
+               len = sizeof(keyboardLayoutVariants) / sizeof(keyboardLayoutVariant);
+               layouts = (rdpKeyboardLayout *) realloc(layouts, (num + len + 1) * sizeof(rdpKeyboardLayout));
+               for (i = 0; i < len; i++, num++)
+               {
+                       layouts[num].code = keyboardLayoutVariants[i].code;
+                       strcpy(layouts[num].name, keyboardLayoutVariants[i].name);
+               }
+       }
+       if ((types & RDP_KEYBOARD_LAYOUT_TYPE_IME) != 0)
+       {
+               len = sizeof(keyboardIMEs) / sizeof(keyboardIME);
+               layouts = (rdpKeyboardLayout *) realloc(layouts, (num + len + 1) * sizeof(rdpKeyboardLayout));
+
+               for (i = 0; i < len; i++, num++)
+               {
+                       layouts[num].code = keyboardIMEs[i].code;
+                       strcpy(layouts[num].name, keyboardIMEs[i].name);
+               }
+       }
+
+       memset(&layouts[num], 0, sizeof(rdpKeyboardLayout));
+
+       return layouts;
+}
+
+const char* get_layout_name(unsigned int keyboardLayoutID)
+{
+       int i;
+
+       for (i = 0; i < sizeof(keyboardLayouts) / sizeof(keyboardLayout); i++)
+       {
+               if (keyboardLayouts[i].code == keyboardLayoutID)
+                       return keyboardLayouts[i].name;
+       }
+
+       for (i = 0; i < sizeof(keyboardLayoutVariants) / sizeof(keyboardLayoutVariant); i++)
+       {
+               if (keyboardLayoutVariants[i].code == keyboardLayoutID)
+                       return keyboardLayoutVariants[i].name;
+       }
+
+       for (i = 0; i < sizeof(keyboardIMEs) / sizeof(keyboardIME); i++)
+       {
+               if (keyboardIMEs[i].code == keyboardLayoutID)
+                       return keyboardIMEs[i].name;
+       }
+
+       return "unknown";
+}
diff --git a/libfreerdp-kbd/layouts_xkb.c b/libfreerdp-kbd/layouts_xkb.c
new file mode 100644 (file)
index 0000000..2e8a965
--- /dev/null
@@ -0,0 +1,418 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef WITH_XKBFILE
+#include <X11/Xlib.h>
+#include <X11/XKBlib.h>
+#include <X11/extensions/XKBfile.h>
+#include <X11/extensions/XKBrules.h>
+#endif
+
+#include "libkbd.h"
+#include <freerdp/kbd/vkcodes.h>
+#include "x_layout_id_table.h"
+
+#include "layouts_xkb.h"
+
+#ifndef KEYMAP_PATH
+#define KEYMAP_PATH    "/usr/local/freerdp/keymaps"
+#endif
+
+#ifdef WITH_XKBFILE
+
+int init_xkb(void* dpy)
+{
+       return XkbQueryExtension(dpy, NULL, NULL, NULL, NULL, NULL);
+}
+
+/* return substring starting after nth comma, ending at following comma */
+static char* comma_substring(char* s, int n)
+{
+       char *p;
+
+       if (!s)
+               return "";
+
+       while (n-- > 0)
+       {
+               if (!(p = strchr(s, ',')))
+                       break;
+
+               s = p + 1;
+       }
+
+       if ((p = strchr(s, ',')))
+               *p = 0;
+
+       return s;
+}
+
+unsigned int detect_keyboard_layout_from_xkb(void* dpy)
+{
+       char *layout, *variant;
+       unsigned int keyboard_layout = 0, group = 0;
+       XkbRF_VarDefsRec rules_names;
+       XKeyboardState coreKbdState;
+       XkbStateRec state;
+
+       DEBUG_KBD("display: %p", dpy);
+
+       if (dpy && XkbRF_GetNamesProp(dpy, NULL, &rules_names))
+       {
+               DEBUG_KBD("layouts: %s", rules_names.layout ? rules_names.layout : "");
+               DEBUG_KBD("variants: %s", rules_names.variant ? rules_names.variant : "");
+
+               XGetKeyboardControl(dpy, &coreKbdState);
+
+               if (XkbGetState(dpy, XkbUseCoreKbd, &state) == Success)
+                       group = state.group;
+
+               DEBUG_KBD("group: %d", state.group);
+
+               layout = comma_substring(rules_names.layout, group);
+               variant = comma_substring(rules_names.variant, group);
+
+               DEBUG_KBD("layout: %s", layout ? layout : "");
+               DEBUG_KBD("variant: %s", variant ? variant : "");
+
+               keyboard_layout = find_keyboard_layout_in_xorg_rules(layout, variant);
+
+               free(rules_names.model);
+               free(rules_names.layout);
+               free(rules_names.variant);
+               free(rules_names.options);
+       }
+
+       return keyboard_layout;
+}
+
+int init_keycodes_from_xkb(void* dpy, RdpScancodes x_keycode_to_rdp_scancode, uint8 rdp_scancode_to_x_keycode[256][2])
+{
+       int ret = 0;
+       XkbDescPtr xkb;
+
+       if (dpy && (xkb = XkbGetMap(dpy, 0, XkbUseCoreKbd)))
+       {
+               if (XkbGetNames(dpy, XkbKeyNamesMask, xkb) == Success)
+               {
+                       int i, j;
+                       char buf[5] = {42, 42, 42, 42, 0}; /* end-of-string at pos 5 */
+
+                       for (i = xkb->min_key_code; i <= xkb->max_key_code; i++)
+                       {
+                               memcpy(buf, xkb->names->keys[i].name, 4);
+
+                               /* TODO: Use more efficient search ... but it is so fast that it doesn't matter */
+                               j = sizeof(virtualKeyboard) / sizeof(virtualKeyboard[0]) - 1;
+
+                               while (j >= 0)
+                               {
+                                       if (virtualKeyboard[j].x_keyname && !strcmp(buf, virtualKeyboard[j].x_keyname))
+                                               break;
+                                       j--;
+                               }
+
+                               if (j >= 0)
+                               {
+                                       DEBUG_KBD("X keycode %3d has keyname %-4s -> RDP scancode %d/%d",
+                                                       i, buf, virtualKeyboard[j].extended, virtualKeyboard[j].scancode);
+
+                                       x_keycode_to_rdp_scancode[i].extended = virtualKeyboard[j].extended;
+                                       x_keycode_to_rdp_scancode[i].keycode = virtualKeyboard[j].scancode;
+                                       x_keycode_to_rdp_scancode[i].keyname = virtualKeyboard[j].x_keyname;
+
+                                       if (x_keycode_to_rdp_scancode[i].extended)
+                                               rdp_scancode_to_x_keycode[virtualKeyboard[j].scancode][1] = i;
+                                       else
+                                               rdp_scancode_to_x_keycode[virtualKeyboard[j].scancode][0] = i;
+                               }
+                               else
+                               {
+                                       DEBUG_KBD("X key code %3d has keyname %-4s -> ??? - not found", i, buf);
+                               }
+                       }
+                       ret = 1;
+               }
+               XkbFreeKeyboard(xkb, 0, 1);
+       }
+       return ret;
+}
+
+#else
+
+/* Default built-in keymap */
+static const KeycodeToVkcode defaultKeycodeToVkcode =
+{
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
+       0x37, 0x38, 0x39, 0x30, 0xBD, 0xBB, 0x08, 0x09, 0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49,
+       0x4F, 0x50, 0xDB, 0xDD, 0x0D, 0xA2, 0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4A, 0x4B, 0x4C, 0xBA,
+       0xDE, 0xC0, 0xA0, 0x00, 0x5A, 0x58, 0x43, 0x56, 0x42, 0x4E, 0x4D, 0xBC, 0xBE, 0xBF, 0xA1, 0x6A,
+       0x12, 0x20, 0x14, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x90, 0x91, 0x67,
+       0x68, 0x69, 0x6D, 0x64, 0x65, 0x66, 0x6B, 0x61, 0x62, 0x63, 0x60, 0x6E, 0x00, 0x00, 0x00, 0x7A,
+       0x7B, 0x24, 0x26, 0x21, 0x25, 0x00, 0x27, 0x23, 0x28, 0x22, 0x2D, 0x2E, 0x0D, 0xA3, 0x13, 0x2C,
+       0x6F, 0x12, 0x00, 0x5B, 0x5C, 0x5D, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static int load_xkb_keyboard(KeycodeToVkcode map, char* kbd)
+{
+       char* pch;
+       char *beg, *end;
+       char* home;
+       char buffer[1024] = "";
+       char xkbfile[256] = "";
+       char xkbfilepath[512] = "";
+       char xkbmap[256] = "";
+       char xkbinc[256] = "";
+
+       FILE* fp;
+       int kbdFound = 0;
+
+       int i = 0;
+       int keycode = 0;
+       char keycodeString[32] = "";
+       char vkcodeName[128] = "";
+
+       beg = kbd;
+
+       /* Extract file name and keymap name */
+       if ((end = strrchr(kbd, '(')) != NULL)
+       {
+               strncpy(xkbfile, &kbd[beg - kbd], end - beg);
+
+               beg = end + 1;
+               if ((end = strrchr(kbd, ')')) != NULL)
+               {
+                       strncpy(xkbmap, &kbd[beg - kbd], end - beg);
+                       xkbmap[end - beg] = '\0';
+               }
+       }
+       else
+       {
+               /* The keyboard name is the same as the file name */
+               strcpy(xkbfile, kbd);
+               strcpy(xkbmap, kbd);
+       }
+
+       /* Get path to file relative to freerdp's directory */
+       snprintf(xkbfilepath, sizeof(xkbfilepath), "keymaps/%s", xkbfile);
+       DEBUG_KBD("Loading keymap %s, first trying %s", kbd, xkbfilepath);
+
+       /*
+        *  Open the file for reading only
+        * It can happen that the same file is opened twice at the same time
+        * in order to load multiple keyboard maps from the same file, but
+        * it does not matter: files can be opened as many times as we want
+        * when it is for reading only.
+        */
+
+       if ((fp = fopen(xkbfilepath, "r")) == NULL)
+       {
+               /* Look first in path given at compile time (install path) */
+               snprintf(xkbfilepath, sizeof(xkbfilepath), "%s/%s", KEYMAP_PATH, xkbfile);
+
+               if ((fp = fopen(xkbfilepath, "r")) == NULL)
+               {
+                       /* If ran from the root of the source tree */
+                       snprintf(xkbfilepath, sizeof(xkbfilepath), "./keymaps/%s", xkbfile);
+
+                       /* If ran from the client directory */
+                       if((fp = fopen(xkbfilepath, "r")) == NULL)
+                               snprintf(xkbfilepath, sizeof(xkbfilepath), "../../keymaps/%s", xkbfile);
+
+                       if ((fp = fopen(xkbfilepath, "r")) == NULL)
+                       {
+                               /* File wasn't found in the source tree, try ~/.freerdp/ folder */
+                               if ((home = getenv("HOME")) == NULL)
+                                       return 0;
+
+                               /* Get path to file in ~/.freerdp/ folder */
+                               snprintf(xkbfilepath, sizeof(xkbfilepath), "%s/.freerdp/keymaps/%s", home, xkbfile);
+
+                               if ((fp = fopen(xkbfilepath, "r")) == NULL)
+                               {
+                                       /* Try /usr/share/freerdp folder */
+                                       snprintf(xkbfilepath, sizeof(xkbfilepath), "/usr/share/freerdp/keymaps/%s", xkbfile);
+
+                                       if ((fp = fopen(xkbfilepath, "r")) == NULL)
+                                       {
+                                               /* Try /usr/local/share/freerdp folder */
+                                               snprintf(xkbfilepath, sizeof(xkbfilepath), "/usr/local/share/freerdp/keymaps/%s", xkbfile);
+
+                                               if ((fp = fopen(xkbfilepath, "r")) == NULL)
+                                               {
+                                                       /* Error: Could not find keymap */
+                                                       DEBUG_KBD("keymaps for %s not found", xkbfile);
+                                                       return 0;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       DEBUG_KBD("xkbfilepath: %s", xkbfilepath);
+
+       while(fgets(buffer, sizeof(buffer), fp) != NULL)
+       {
+               if (buffer[0] == '#')
+               {
+                       continue; /* Skip comments */
+               }
+
+               if (kbdFound)
+               {
+                       /* Closing curly bracket and semicolon */
+                       if ((pch = strstr(buffer, "};")) != NULL)
+                       {
+                               break;
+                       }
+                       else if ((pch = strstr(buffer, "VK_")) != NULL)
+                       {
+                               /* The end is delimited by the first white space */
+                               end = strcspn(pch, " \t\n\0") + pch;
+
+                               /* We copy the virtual key code name in a string */
+                               beg = pch;
+                               strncpy(vkcodeName, beg, end - beg);
+                               vkcodeName[end - beg] = '\0';
+
+                               /* Now we want to extract the virtual key code itself which is in between '<' and '>' */
+                               if ((beg = strchr(pch + 3, '<')) == NULL)
+                                       break;
+                               else
+                                       beg++;
+
+                               if ((end = strchr(beg, '>')) == NULL)
+                                       break;
+
+                               /* We copy the string representing the number in a string */
+                               strncpy(keycodeString, beg, end - beg);
+                               keycodeString[end - beg] = '\0';
+
+                               /* Convert the string representing the code to an integer */
+                               keycode = atoi(keycodeString);
+
+                               /* Make sure it is a valid keycode */
+                               if (keycode < 0 || keycode > 255)
+                                       break;
+
+                               /* Load this key mapping in the keyboard mapping */
+                               for(i = 0; i < sizeof(virtualKeyboard) / sizeof(virtualKey); i++)
+                               {
+                                       if (strcmp(vkcodeName, virtualKeyboard[i].name) == 0)
+                                       {
+                                               map[keycode] = i;
+                                       }
+                               }
+                       }
+                       else if ((pch = strstr(buffer, ": extends")) != NULL)
+                       {
+                               /*
+                                * This map extends another keymap We extract its name
+                                * and we recursively load the keymap we need to include.
+                                */
+
+                               if ((beg = strchr(pch + sizeof(": extends"), '"')) == NULL)
+                                       break;
+                               beg++;
+
+                               if ((end = strchr(beg, '"')) == NULL)
+                                       break;
+
+                               strncpy(xkbinc, beg, end - beg);
+                               xkbinc[end - beg] = '\0';
+
+                               load_xkb_keyboard(map, xkbinc); /* Load included keymap */
+                       }
+               }
+               else if ((pch = strstr(buffer, "keyboard")) != NULL)
+               {
+                       /* Keyboard map identifier */
+                       if ((beg = strchr(pch + sizeof("keyboard"), '"')) == NULL)
+                               break;
+                       beg++;
+
+                       if ((end = strchr(beg, '"')) == NULL)
+                               break;
+
+                       pch = beg;
+                       buffer[end - beg] = '\0';
+
+                       /* Does it match our keymap name? */
+                       if (strncmp(xkbmap, pch, strlen(xkbmap)) == 0)
+                               kbdFound = 1;
+               }
+       }
+
+       fclose(fp); /* Don't forget to close file */
+
+       return 1;
+}
+
+void load_keyboard_map(KeycodeToVkcode keycodeToVkcode, char *xkbfile)
+{
+       char* kbd;
+       char* xkbfileEnd;
+       int keymapLoaded = 0;
+
+       memset(keycodeToVkcode, 0, sizeof(keycodeToVkcode));
+
+       kbd = xkbfile;
+       xkbfileEnd = xkbfile + strlen(xkbfile);
+
+#ifdef __APPLE__
+       /* Apple X11 breaks XKB detection */
+       keymapLoaded += load_xkb_keyboard(keycodeToVkcode, "macosx(macosx)");
+#else
+       do
+       {
+               /* Multiple maps are separated by '+' */
+               int kbdlen = strcspn(kbd + 1, "+") + 1;
+               kbd[kbdlen] = '\0';
+
+               /* Load keyboard map */
+               keymapLoaded += load_xkb_keyboard(keycodeToVkcode, kbd);
+
+               kbd += kbdlen + 1;
+       }
+       while (kbd < xkbfileEnd);
+#endif
+
+       DEBUG_KBD("loaded %d keymaps", keymapLoaded);
+       if (keymapLoaded <= 0)
+       {
+               /* No keymap was loaded, load default hard-coded keymap */
+               DEBUG_KBD("using default keymap");
+               memcpy(keycodeToVkcode, defaultKeycodeToVkcode, sizeof(keycodeToVkcode));
+       }
+}
+
+#endif
diff --git a/libfreerdp-kbd/layouts_xkb.h b/libfreerdp-kbd/layouts_xkb.h
new file mode 100644 (file)
index 0000000..dc0c769
--- /dev/null
@@ -0,0 +1,44 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LAYOUTS_XKB_H
+#define __LAYOUTS_XKB_H
+
+typedef unsigned char KeycodeToVkcode[256];
+
+typedef struct
+{
+       unsigned char extended;
+       unsigned char keycode;
+       char* keyname;
+} RdpKeycodeRec, RdpScancodes[256];
+
+#ifdef WITH_XKBFILE
+
+int init_xkb(void *dpy);
+unsigned int detect_keyboard_layout_from_xkb(void *dpy);
+int init_keycodes_from_xkb(void* dpy, RdpScancodes x_keycode_to_rdp_scancode, uint8 rdp_scancode_to_x_keycode[256][2]);
+
+#else
+
+void load_keyboard_map(KeycodeToVkcode keycodeToVkcode, char *xkbfile);
+
+#endif
+
+#endif
diff --git a/libfreerdp-kbd/libkbd.c b/libfreerdp-kbd/libkbd.c
new file mode 100644 (file)
index 0000000..156b30f
--- /dev/null
@@ -0,0 +1,168 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/types.h>
+#include <freerdp/kbd/kbd.h>
+
+#include "libkbd.h"
+
+#include <freerdp/kbd/locales.h>
+#include <freerdp/kbd/vkcodes.h>
+#include <freerdp/kbd/layouts.h>
+#include "layouts_xkb.h"
+
+/*
+ * The actual mapping from X keycodes to RDP keycodes, initialized from xkb keycodes or similar.
+ * Used directly by freerdp_kbd_get_scancode_by_keycode. The mapping is a global variable,
+ * but it only depends on which keycodes the X servers keyboard driver uses and is thus very static.
+ */
+
+RdpScancodes x_keycode_to_rdp_scancode;
+
+uint8 rdp_scancode_to_x_keycode[256][2];
+
+#ifndef WITH_XKBFILE
+
+static unsigned int detect_keyboard(void* dpy, unsigned int keyboardLayoutID, char* xkbfile, size_t xkbfilelength)
+{
+       xkbfile[0] = '\0';
+
+       if (keyboardLayoutID != 0)
+               DEBUG_KBD("keyboard layout configuration: %X", keyboardLayoutID);
+
+#if defined(sun)
+       if (keyboardLayoutID == 0)
+       {
+               keyboardLayoutID = detect_keyboard_type_and_layout_sunos(xkbfile, xkbfilelength);
+               DEBUG_KBD("detect_keyboard_type_and_layout_sunos: %X %s", keyboardLayoutID, xkbfile);
+       }
+#endif
+
+       if (keyboardLayoutID == 0)
+       {
+               keyboardLayoutID = detect_keyboard_layout_from_locale();
+               DEBUG_KBD("detect_keyboard_layout_from_locale: %X", keyboardLayoutID);
+       }
+
+       if (keyboardLayoutID == 0)
+       {
+               keyboardLayoutID = 0x0409;
+               DEBUG_KBD("using default keyboard layout: %X", keyboardLayoutID);
+       }
+
+       if (xkbfile[0] == '\0')
+       {
+               strncpy(xkbfile, "base", xkbfilelength);
+               DEBUG_KBD("using default keyboard layout: %s", xkbfile);
+       }
+
+       return keyboardLayoutID;
+}
+
+#endif
+
+/*
+ * Initialize global keyboard mapping and return the suggested server side layout.
+ * dpy must be a X Display* or NULL.
+ */
+
+unsigned int freerdp_kbd_init(void* dpy, unsigned int keyboard_layout_id)
+{
+       memset(x_keycode_to_rdp_scancode, 0, sizeof(x_keycode_to_rdp_scancode));
+       memset(rdp_scancode_to_x_keycode, '\0', sizeof(rdp_scancode_to_x_keycode));
+
+#ifdef WITH_XKBFILE
+       if (!init_xkb(dpy))
+       {
+               DEBUG_KBD("Error initializing xkb");
+               return 0;
+       }
+       if (keyboard_layout_id == 0)
+       {
+               keyboard_layout_id = detect_keyboard_layout_from_xkb(dpy);
+               DEBUG_KBD("detect_keyboard_layout_from_xkb: %X", keyboard_layout_id);
+       }
+       init_keycodes_from_xkb(dpy, x_keycode_to_rdp_scancode, rdp_scancode_to_x_keycode);
+#else
+       int vkcode;
+       int keycode;
+       char xkbfile[256];
+       KeycodeToVkcode keycodeToVkcode;
+
+       if (keyboard_layout_id == 0)
+               keyboard_layout_id = detect_keyboard(dpy, keyboard_layout_id, xkbfile, sizeof(xkbfile));
+
+       DEBUG_KBD("Using keyboard layout 0x%X with xkb name %s and xkbfile %s",
+                       keyboard_layout_id, get_layout_name(keyboard_layout_id), xkbfile);
+
+       load_keyboard_map(keycodeToVkcode, xkbfile);
+
+       for (keycode = 0; keycode < 256; keycode++)
+       {
+               vkcode = keycodeToVkcode[keycode];
+
+               DEBUG_KBD("X keycode %3d VK %3d %-19s-> RDP scancode %d/%d",
+                               keycode, vkcode, virtualKeyboard[vkcode].name,
+                               virtualKeyboard[vkcode].extended, virtualKeyboard[vkcode].scancode);
+
+               x_keycode_to_rdp_scancode[keycode].keycode = virtualKeyboard[vkcode].scancode;
+               x_keycode_to_rdp_scancode[keycode].extended = virtualKeyboard[vkcode].extended;
+               x_keycode_to_rdp_scancode[keycode].keyname = virtualKeyboard[vkcode].name;
+
+               if (x_keycode_to_rdp_scancode[keycode].extended)
+                       rdp_scancode_to_x_keycode[virtualKeyboard[vkcode].scancode][1] = keycode;
+               else
+                       rdp_scancode_to_x_keycode[virtualKeyboard[vkcode].scancode][0] = keycode;
+       }
+#endif
+
+       return keyboard_layout_id;
+}
+
+rdpKeyboardLayout* freerdp_kbd_get_layouts(int types)
+{
+       return get_keyboard_layouts(types);
+}
+
+uint8 freerdp_kbd_get_scancode_by_keycode(uint8 keycode, boolean* extended)
+{
+       DEBUG_KBD("%2x %4s -> %d/%d", keycode, x_keycode_to_rdp_scancode[keycode].keyname,
+                       x_keycode_to_rdp_scancode[keycode].extended, x_keycode_to_rdp_scancode[keycode].keycode);
+
+       *extended = x_keycode_to_rdp_scancode[keycode].extended;
+
+       return x_keycode_to_rdp_scancode[keycode].keycode;
+}
+
+uint8 freerdp_kbd_get_keycode_by_scancode(uint8 scancode, boolean extended)
+{
+       if (extended)
+               return rdp_scancode_to_x_keycode[scancode][1];
+       else
+               return rdp_scancode_to_x_keycode[scancode][0];
+}
+
+uint8 freerdp_kbd_get_scancode_by_virtualkey(int vkcode, boolean* extended)
+{
+       *extended = virtualKeyboard[vkcode].extended;
+       return virtualKeyboard[vkcode].scancode;
+}
diff --git a/libfreerdp-kbd/libkbd.h b/libfreerdp-kbd/libkbd.h
new file mode 100644 (file)
index 0000000..ffd561e
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LIBKBD_H
+#define __LIBKBD_H
+
+#include <freerdp/utils/debug.h>
+
+#ifdef WITH_DEBUG_KBD
+#define DEBUG_KBD(fmt, ...) DEBUG_CLASS(KBD, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_KBD(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __LIBKBD_H */
diff --git a/libfreerdp-kbd/locales.c b/libfreerdp-kbd/locales.c
new file mode 100644 (file)
index 0000000..653b990
--- /dev/null
@@ -0,0 +1,510 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "libkbd.h"
+
+#include <freerdp/kbd/locales.h>
+
+typedef struct
+{
+       /* Two or three letter language code */
+       char language[4];
+
+       /* Two or three letter country code (Sometimes with Cyrl_ prefix) */
+       char country[10];
+
+       /* 32-bit unsigned integer corresponding to the locale */
+       unsigned int code;
+
+} locale;
+
+/*
+ * Refer to MSDN article "Locale Identifier Constants and Strings":
+ * http://msdn.microsoft.com/en-us/library/ms776260.aspx
+ */
+
+static const locale locales[] =
+{
+       {  "af", "ZA", AFRIKAANS }, /* Afrikaans (South Africa) */
+       {  "sq", "AL", ALBANIAN }, /* Albanian (Albania) */
+       { "gsw", "FR", ALSATIAN }, /* Windows Vista and later: Alsatian (France) */
+       {  "am", "ET", AMHARIC }, /* Windows Vista and later: Amharic (Ethiopia) */
+       {  "ar", "DZ", ARABIC_ALGERIA }, /* Arabic (Algeria) */
+       {  "ar", "BH", ARABIC_BAHRAIN }, /* Arabic (Bahrain) */
+       {  "ar", "EG", ARABIC_EGYPT }, /* Arabic (Egypt) */
+       {  "ar", "IQ", ARABIC_IRAQ }, /* Arabic (Iraq) */
+       {  "ar", "JO", ARABIC_JORDAN }, /* Arabic (Jordan) */
+       {  "ar", "KW", ARABIC_KUWAIT }, /* Arabic (Kuwait) */
+       {  "ar", "LB", ARABIC_LEBANON }, /* Arabic (Lebanon) */
+       {  "ar", "LY", ARABIC_LIBYA }, /* Arabic (Libya) */
+       {  "ar", "MA", ARABIC_MOROCCO }, /* Arabic (Morocco) */
+       {  "ar", "OM", ARABIC_OMAN }, /* Arabic (Oman) */
+       {  "ar", "QA", ARABIC_QATAR }, /* Arabic (Qatar) */
+       {  "ar", "SA", ARABIC_SAUDI_ARABIA }, /* Arabic (Saudi Arabia) */
+       {  "ar", "SY", ARABIC_SYRIA }, /* Arabic (Syria) */
+       {  "ar", "TN", ARABIC_TUNISIA }, /* Arabic (Tunisia) */
+       {  "ar", "AE", ARABIC_UAE }, /* Arabic (U.A.E.) */
+       {  "ar", "YE", ARABIC_YEMEN }, /* Arabic (Yemen) */
+       {  "az", "AZ", AZERI_LATIN }, /* Azeri (Latin) */
+       {  "az", "Cyrl_AZ", AZERI_CYRILLIC }, /* Azeri (Cyrillic) */
+       {  "hy", "AM", ARMENIAN }, /* Windows 2000 and later: Armenian (Armenia) */
+       {  "as", "IN", ASSAMESE }, /* Windows Vista and later: Assamese (India) */
+       {  "ba", "RU", BASHKIR }, /* Windows Vista and later: Bashkir (Russia) */
+       {  "eu", "ES", BASQUE }, /* Basque (Basque) */
+       {  "be", "BY", BELARUSIAN }, /* Belarusian (Belarus) */
+       {  "bn", "IN", BENGALI_INDIA }, /* Windows XP SP2 and later: Bengali (India) */
+       {  "br", "FR", BRETON }, /* Breton (France) */
+       {  "bs", "BA", BOSNIAN_LATIN }, /* Bosnian (Latin) */
+       {  "bg", "BG", BULGARIAN }, /* Bulgarian (Bulgaria) */
+       {  "ca", "ES", CATALAN }, /* Catalan (Catalan) */
+       {  "zh", "HK", CHINESE_HONG_KONG }, /* Chinese (Hong Kong SAR, PRC) */
+       {  "zh", "MO", CHINESE_MACAU }, /* Windows 98/Me, Windows XP and later: Chinese (Macao SAR) */
+       {  "zh", "CN", CHINESE_PRC }, /* Chinese (PRC) */
+       {  "zh", "SG", CHINESE_SINGAPORE }, /* Chinese (Singapore) */
+       {  "zh", "TW", CHINESE_TAIWAN }, /* Chinese (Taiwan) */
+       {  "hr", "BA", CROATIAN_BOSNIA_HERZEGOVINA }, /* Windows XP SP2 and later: Croatian (Bosnia and Herzegovina, Latin) */
+       {  "hr", "HR", CROATIAN }, /* Croatian (Croatia) */
+       {  "cs", "CZ", CZECH }, /* Czech (Czech Republic) */
+       {  "da", "DK", DANISH }, /* Danish (Denmark) */
+       { "prs", "AF", DARI }, /* Windows XP and later: Dari (Afghanistan) */
+       {  "dv", "MV", DIVEHI }, /* Windows XP and later: Divehi (Maldives) */
+       {  "nl", "BE", DUTCH_BELGIAN }, /* Dutch (Belgium) */
+       {  "nl", "NL", DUTCH_STANDARD }, /* Dutch (Netherlands) */
+       {  "en", "AU", ENGLISH_AUSTRALIAN }, /* English (Australia) */
+       {  "en", "BZ", ENGLISH_BELIZE }, /* English (Belize) */
+       {  "en", "CA", ENGLISH_CANADIAN }, /* English (Canada) */
+       {  "en", "CB", ENGLISH_CARIBBEAN }, /* English (Carribean) */
+       {  "en", "IN", ENGLISH_INDIA }, /* Windows Vista and later: English (India) */
+       {  "en", "IE", ENGLISH_IRELAND }, /* English (Ireland) */
+       {  "en", "JM", ENGLISH_JAMAICA }, /* English (Jamaica) */
+       {  "en", "MY", ENGLISH_MALAYSIA }, /* Windows Vista and later: English (Malaysia) */
+       {  "en", "NZ", ENGLISH_NEW_ZEALAND }, /* English (New Zealand) */
+       {  "en", "PH", ENGLISH_PHILIPPINES }, /* Windows 98/Me, Windows 2000 and later: English (Philippines) */
+       {  "en", "SG", ENGLISH_SINGAPORE }, /* Windows Vista and later: English (Singapore) */
+       {  "en", "ZA", ENGLISH_SOUTH_AFRICA }, /* English (South Africa) */
+       {  "en", "TT", ENGLISH_TRINIDAD }, /* English (Trinidad and Tobago) */
+       {  "en", "GB", ENGLISH_UNITED_KINGDOM }, /* English (United Kingdom) */
+       {  "en", "US", ENGLISH_UNITED_STATES }, /* English (United States) */
+       {  "en", "ZW", ENGLISH_ZIMBABWE }, /* Windows 98/Me, Windows 2000 and later: English (Zimbabwe) */
+       {  "et", "EE", ESTONIAN }, /* Estonian (Estonia) */
+       {  "fo", "FO", FAEROESE }, /* Faroese (Faroe Islands) */
+       { "fil", "PH", FILIPINO }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Filipino (Philippines) */
+       {  "fi", "FI", FINNISH }, /* Finnish (Finland) */
+       {  "fr", "BE", FRENCH_BELGIAN }, /* French (Belgium) */
+       {  "fr", "CA", FRENCH_CANADIAN }, /* French (Canada) */
+       {  "fr", "FR", FRENCH_STANDARD }, /* French (France) */
+       {  "fr", "LU", FRENCH_LUXEMBOURG }, /* French (Luxembourg) */
+       {  "fr", "MC", FRENCH_MONACO }, /* French (Monaco) */
+       {  "fr", "CH", FRENCH_SWISS }, /* French (Switzerland) */
+       {  "fy", "NL", FRISIAN }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Frisian (Netherlands) */
+       {  "gl", "ES", GALICIAN }, /* Windows XP and later: Galician (Spain) */
+       {  "ka", "GE", GEORGIAN }, /* Windows 2000 and later: Georgian (Georgia) */
+       {  "de", "AT", GERMAN_AUSTRIAN }, /* German (Austria) */
+       {  "de", "DE", GERMAN_STANDARD }, /* German (Germany) */
+       {  "de", "LI", GERMAN_LIECHTENSTEIN }, /* German (Liechtenstein) */
+       {  "de", "LU", GERMAN_LUXEMBOURG }, /* German (Luxembourg) */
+       {  "de", "CH", GERMAN_SWISS }, /* German (Switzerland) */
+       {  "el", "GR", GREEK }, /* Greek (Greece) */
+       {  "kl", "GL", GREENLANDIC }, /* Windows Vista and later: Greenlandic (Greenland) */
+       {  "gu", "IN", GUJARATI }, /* Windows XP and later: Gujarati (India) */
+       {  "he", "IL", HEBREW }, /* Hebrew (Israel) */
+       {  "hi", "IN", HINDI }, /* Windows 2000 and later: Hindi (India) */
+       {  "hu", "HU", HUNGARIAN }, /* Hungarian (Hungary) */
+       {  "is", "IS", ICELANDIC }, /* Icelandic (Iceland) */
+       {  "ig", "NG", IGBO }, /* Igbo (Nigeria) */
+       {  "id", "ID", INDONESIAN }, /* Indonesian (Indonesia) */
+       {  "ga", "IE", IRISH }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Irish (Ireland) */
+       {  "it", "IT", ITALIAN_STANDARD }, /* Italian (Italy) */
+       {  "it", "CH", ITALIAN_SWISS }, /* Italian (Switzerland) */
+       {  "ja", "JP", JAPANESE }, /* Japanese (Japan) */
+       {  "kn", "IN", KANNADA }, /* Windows XP and later: Kannada (India) */
+       {  "kk", "KZ", KAZAKH }, /* Windows 2000 and later: Kazakh (Kazakhstan) */
+       {  "kh", "KH", KHMER }, /* Windows Vista and later: Khmer (Cambodia) */
+       { "qut", "GT", KICHE }, /* Windows Vista and later: K'iche (Guatemala) */
+       {  "rw", "RW", KINYARWANDA }, /* Windows Vista and later: Kinyarwanda (Rwanda) */
+       { "kok", "IN", KONKANI }, /* Windows 2000 and later: Konkani (India) */
+       {  "ko", "KR", KOREAN }, /* Korean (Korea) */
+       {  "ky", "KG", KYRGYZ }, /* Windows XP and later: Kyrgyz (Kyrgyzstan) */
+       {  "lo", "LA", LAO }, /* Windows Vista and later: Lao (Lao PDR) */
+       {  "lv", "LV", LATVIAN }, /* Latvian (Latvia) */
+       {  "lt", "LT", LITHUANIAN }, /* Lithuanian (Lithuania) */
+       { "dsb", "DE", LOWER_SORBIAN }, /* Windows Vista and later: Lower Sorbian (Germany) */
+       {  "lb", "LU", LUXEMBOURGISH }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Luxembourgish (Luxembourg) */
+       {  "mk", "MK", MACEDONIAN }, /* Windows 2000 and later: Macedonian (Macedonia, FYROM) */
+       {  "ms", "BN", MALAY_BRUNEI_DARUSSALAM }, /* Windows 2000 and later: Malay (Brunei Darussalam) */
+       {  "ms", "MY", MALAY_MALAYSIA }, /* Windows 2000 and later: Malay (Malaysia) */
+       {  "ml", "IN", MALAYALAM }, /* Windows XP SP2 and later: Malayalam (India) */
+       {  "mt", "MT", MALTESE }, /* Windows XP SP2 and later: Maltese (Malta) */
+       {  "mi", "NZ", MAORI }, /* Windows XP SP2 and later: Maori (New Zealand) */
+       { "arn", "CL", MAPUDUNGUN }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Mapudungun (Chile) */
+       {  "mr", "IN", MARATHI }, /* Windows 2000 and later: Marathi (India) */
+       { "moh", "CA", MOHAWK }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Mohawk (Canada) */
+       {  "mn", "MN", MONGOLIAN }, /* Mongolian */
+       {  "ne", "NP", NEPALI }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Nepali (Nepal) */
+       {  "nb", "NO", NORWEGIAN_BOKMAL }, /* Norwegian (Bokmal, Norway) */
+       {  "nn", "NO", NORWEGIAN_NYNORSK }, /* Norwegian (Nynorsk, Norway) */
+       {  "oc", "FR", OCCITAN }, /* Occitan (France) */
+       {  "or", "IN", ORIYA }, /* Oriya (India) */
+       {  "ps", "AF", PASHTO }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Pashto (Afghanistan) */
+       {  "fa", "IR", FARSI }, /* Persian (Iran) */
+       {  "pl", "PL", POLISH }, /* Polish (Poland) */
+       {  "pt", "BR", PORTUGUESE_BRAZILIAN }, /* Portuguese (Brazil) */
+       {  "pt", "PT", PORTUGUESE_STANDARD }, /* Portuguese (Portugal) */
+       {  "pa", "IN", PUNJABI }, /* Windows XP and later: Punjabi (India) */
+       { "quz", "BO", QUECHUA_BOLIVIA }, /* Windows XP SP2 and later: Quechua (Bolivia) */
+       { "quz", "EC", QUECHUA_ECUADOR }, /* Windows XP SP2 and later: Quechua (Ecuador) */
+       { "quz", "PE", QUECHUA_PERU }, /* Windows XP SP2 and later: Quechua (Peru) */
+       {  "ro", "RO", ROMANIAN }, /* Romanian (Romania) */
+       {  "rm", "CH", ROMANSH }, /* Windows XP SP2 and later (downloadable); Windows Vista and later: Romansh (Switzerland) */
+       {  "ru", "RU", RUSSIAN }, /* Russian (Russia) */
+       { "smn", "FI", SAMI_INARI }, /* Windows XP SP2 and later: Sami (Inari, Finland) */
+       { "smj", "NO", SAMI_LULE_NORWAY }, /* Windows XP SP2 and later: Sami (Lule, Norway) */
+       { "smj", "SE", SAMI_LULE_SWEDEN }, /* Windows XP SP2 and later: Sami (Lule, Sweden) */
+       {  "se", "FI", SAMI_NORTHERN_FINLAND }, /* Windows XP SP2 and later: Sami (Northern, Finland) */
+       {  "se", "NO", SAMI_NORTHERN_NORWAY }, /* Windows XP SP2 and later: Sami (Northern, Norway) */
+       {  "se", "SE", SAMI_NORTHERN_SWEDEN }, /* Windows XP SP2 and later: Sami (Northern, Sweden) */
+       { "sms", "FI", SAMI_SKOLT }, /* Windows XP SP2 and later: Sami (Skolt, Finland) */
+       { "sma", "NO", SAMI_SOUTHERN_NORWAY }, /* Windows XP SP2 and later: Sami (Southern, Norway) */
+       { "sma", "SE", SAMI_SOUTHERN_SWEDEN }, /* Windows XP SP2 and later: Sami (Southern, Sweden) */
+       {  "sa", "IN", SANSKRIT }, /* Windows 2000 and later: Sanskrit (India) */
+       {  "sr", "SP", SERBIAN_LATIN }, /* Serbian (Latin) */
+       {  "sr", "SIH", SERBIAN_LATIN_BOSNIA_HERZEGOVINA }, /* Serbian (Latin) (Bosnia and Herzegovina) */
+       {  "sr", "Cyrl_SP", SERBIAN_CYRILLIC }, /* Serbian (Cyrillic) */
+       {  "sr", "Cyrl_SIH", SERBIAN_CYRILLIC_BOSNIA_HERZEGOVINA }, /* Serbian (Cyrillic) (Bosnia and Herzegovina) */
+       {  "ns", "ZA", SESOTHO_SA_LEBOA }, /* Windows XP SP2 and later: Sesotho sa Leboa/Northern Sotho (South Africa) */
+       {  "tn", "ZA", TSWANA }, /* Windows XP SP2 and later: Setswana/Tswana (South Africa) */
+       {  "si", "LK", SINHALA }, /* Windows Vista and later: Sinhala (Sri Lanka) */
+       {  "sk", "SK", SLOVAK }, /* Slovak (Slovakia) */
+       {  "sl", "SI", SLOVENIAN }, /* Slovenian (Slovenia) */
+       {  "es", "AR", SPANISH_ARGENTINA }, /* Spanish (Argentina) */
+       {  "es", "BO", SPANISH_BOLIVIA }, /* Spanish (Bolivia) */
+       {  "es", "CL", SPANISH_CHILE }, /* Spanish (Chile) */
+       {  "es", "CO", SPANISH_COLOMBIA }, /* Spanish (Colombia) */
+       {  "es", "CR", SPANISH_COSTA_RICA }, /* Spanish (Costa Rica) */
+       {  "es", "DO", SPANISH_DOMINICAN_REPUBLIC }, /* Spanish (Dominican Republic) */
+       {  "es", "EC", SPANISH_ECUADOR }, /* Spanish (Ecuador) */
+       {  "es", "SV", SPANISH_EL_SALVADOR }, /* Spanish (El Salvador) */
+       {  "es", "GT", SPANISH_GUATEMALA }, /* Spanish (Guatemala) */
+       {  "es", "HN", SPANISH_HONDURAS }, /* Spanish (Honduras) */
+       {  "es", "MX", SPANISH_MEXICAN }, /* Spanish (Mexico) */
+       {  "es", "NI", SPANISH_NICARAGUA }, /* Spanish (Nicaragua) */
+       {  "es", "PA", SPANISH_PANAMA }, /* Spanish (Panama) */
+       {  "es", "PY", SPANISH_PARAGUAY }, /* Spanish (Paraguay) */
+       {  "es", "PE", SPANISH_PERU }, /* Spanish (Peru) */
+       {  "es", "PR", SPANISH_PUERTO_RICO }, /* Spanish (Puerto Rico) */
+       {  "es", "ES", SPANISH_MODERN_SORT }, /* Spanish (Spain) */
+       {  "es", "ES", SPANISH_TRADITIONAL_SORT }, /* Spanish (Spain, Traditional Sort) */
+       {  "es", "US", SPANISH_UNITED_STATES }, /* Windows Vista and later: Spanish (United States) */
+       {  "es", "UY", SPANISH_URUGUAY }, /* Spanish (Uruguay) */
+       {  "es", "VE", SPANISH_VENEZUELA }, /* Spanish (Venezuela) */
+       {  "sw", "KE", SWAHILI }, /* Windows 2000 and later: Swahili (Kenya) */
+       {  "sv", "FI", SWEDISH_FINLAND }, /* Swedish (Finland) */
+       {  "sv", "SE", SWEDISH }, /* Swedish (Sweden) */
+       { "syr", "SY", SYRIAC }, /* Windows XP and later: Syriac (Syria) */
+       {  "ta", "IN", TAMIL }, /* Windows 2000 and later: Tamil (India) */
+       {  "tt", "RU", TATAR }, /* Windows XP and later: Tatar (Russia) */
+       {  "te", "IN", TELUGU }, /* Windows XP and later: Telugu (India) */
+       {  "th", "TH", THAI }, /* Thai (Thailand) */
+       {  "bo", "BT", TIBETAN_BHUTAN }, /* Windows Vista and later: Tibetan (Bhutan) */
+       {  "bo", "CN", TIBETAN_PRC }, /* Windows Vista and later: Tibetan (PRC) */
+       {  "tr", "TR", TURKISH }, /* Turkish (Turkey) */
+       {  "tk", "TM", TURKMEN }, /* Windows Vista and later: Turkmen (Turkmenistan) */
+       {  "ug", "CN", UIGHUR }, /* Windows Vista and later: Uighur (PRC) */
+       {  "uk", "UA", UKRAINIAN }, /* Ukrainian (Ukraine) */
+       { "wen", "DE", UPPER_SORBIAN }, /* Windows Vista and later: Upper Sorbian (Germany) */
+       {  "tr", "IN", URDU_INDIA }, /* Urdu (India) */
+       {  "ur", "PK", URDU }, /* Windows 98/Me, Windows 2000 and later: Urdu (Pakistan) */
+       {  "uz", "UZ", UZBEK_LATIN }, /* Uzbek (Latin) */
+       {  "uz", "Cyrl_UZ", UZBEK_CYRILLIC }, /* Uzbek (Cyrillic) */
+       {  "vi", "VN", VIETNAMESE }, /* Windows 98/Me, Windows NT 4.0 and later: Vietnamese (Vietnam) */
+       {  "cy", "GB", WELSH }, /* Windows XP SP2 and later: Welsh (United Kingdom) */
+       {  "wo", "SN", WOLOF }, /* Windows Vista and later: Wolof (Senegal) */
+       {  "xh", "ZA", XHOSA }, /* Windows XP SP2 and later: Xhosa/isiXhosa (South Africa) */
+       { "sah", "RU", YAKUT }, /* Windows Vista and later: Yakut (Russia) */
+       {  "ii", "CN", YI }, /* Windows Vista and later: Yi (PRC) */
+       {  "yo", "NG", YORUBA }, /* Windows Vista and later: Yoruba (Nigeria) */
+       {  "zu", "ZA", ZULU } /* Windows XP SP2 and later: Zulu/isiZulu (South Africa) */
+};
+
+
+typedef struct
+{
+       /* Locale ID */
+       unsigned int locale;
+
+       /* Array of associated keyboard layouts */
+       unsigned int keyboardLayouts[5];
+
+} localeAndKeyboardLayout;
+
+/* TODO: Use KBD_* defines instead of hardcoded values */
+
+static const localeAndKeyboardLayout defaultKeyboardLayouts[] =
+{
+       { AFRIKAANS,                            { 0x00000409, 0x00000409, 0x0, 0x0, 0x0 } },
+       { ALBANIAN,                             { 0x0000041c, 0x00000409, 0x0, 0x0, 0x0 } },
+       { ARABIC_SAUDI_ARABIA,                  { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_IRAQ,                          { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_EGYPT,                         { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_LIBYA,                         { 0x0000040c, 0x00020401, 0x0, 0x0, 0x0 } },
+       { ARABIC_ALGERIA,                       { 0x0000040c, 0x00020401, 0x0, 0x0, 0x0 } },
+       { ARABIC_MOROCCO,                       { 0x0000040c, 0x00020401, 0x0, 0x0, 0x0 } },
+       { ARABIC_TUNISIA,                       { 0x0000040c, 0x00020401, 0x0, 0x0, 0x0 } },
+       { ARABIC_OMAN,                          { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_YEMEN,                         { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_SYRIA,                         { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_JORDAN,                        { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_LEBANON,                       { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_KUWAIT,                        { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_UAE,                           { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_BAHRAIN,                       { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARABIC_QATAR,                         { 0x00000409, 0x00000401, 0x0, 0x0, 0x0 } },
+       { ARMENIAN,                             { 0x0000042b, 0x00000409, 0x00000419, 0x0, 0x0 } },
+       { AZERI_LATIN,                          { 0x0000042c, 0x0000082c, 0x00000419, 0x0, 0x0 } },
+       { AZERI_CYRILLIC,                       { 0x0000082c, 0x0000042c, 0x00000419, 0x0, 0x0 } },
+       { BASQUE,                               { 0x0000040a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { BELARUSIAN,                           { 0x00000423, 0x00000409, 0x00000419, 0x0, 0x0 } },
+       { BENGALI_INDIA,                        { 0x00000445, 0x00000409, 0x0, 0x0, 0x0 } },
+       { BOSNIAN_LATIN,                        { 0x0000141A, 0x00000409, 0x0, 0x0, 0x0 } },
+       { BULGARIAN,                            { 0x00000402, 0x00000409, 0x0, 0x0, 0x0 } },
+       { CATALAN,                              { 0x0000040a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { CHINESE_TAIWAN,                       { 0x00000404, 0xe0080404, 0xE0010404, 0x0, 0x0 } },
+       { CHINESE_PRC,                          { 0x00000804, 0xe00e0804, 0xe0010804, 0xe0030804, 0xe0040804 } },
+       { CHINESE_HONG_KONG,                    { 0x00000409, 0xe0080404, 0x0, 0x0, 0x0 } },
+       { CHINESE_SINGAPORE,                    { 0x00000409, 0xe00e0804, 0xe0010804, 0xe0030804, 0xe0040804 } },
+       { CHINESE_MACAU,                        { 0x00000409, 0xe00e0804, 0xe0020404, 0xe0080404 } },
+       { CROATIAN,                             { 0x0000041a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { CROATIAN_BOSNIA_HERZEGOVINA,          { 0x0000041a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { CZECH,                                { 0x00000405, 0x00000409, 0x0, 0x0, 0x0 } },
+       { DANISH,                               { 0x00000406, 0x00000409, 0x0, 0x0, 0x0 } },
+       { DIVEHI,                               { 0x00000409, 0x00000465, 0x0, 0x0, 0x0 } },
+       { DUTCH_STANDARD,                       { 0x00020409, 0x00000413, 0x00000409, 0x0, 0x0 } },
+       { DUTCH_BELGIAN,                        { 0x00000813, 0x00000409, 0x0, 0x0, 0x0 } },
+       { ENGLISH_UNITED_STATES,                { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_UNITED_KINGDOM,               { 0x00000809, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_AUSTRALIAN,                   { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_CANADIAN,                     { 0x00000409, 0x00011009, 0x00001009, 0x0, 0x0 } },
+       { ENGLISH_NEW_ZEALAND,                  { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_IRELAND,                      { 0x00001809, 0x00011809, 0x0, 0x0, 0x0 } },
+       { ENGLISH_SOUTH_AFRICA,                 { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_JAMAICA,                      { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_CARIBBEAN,                    { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_BELIZE,                       { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_TRINIDAD,                     { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_ZIMBABWE,                     { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ENGLISH_PHILIPPINES,                  { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { ESTONIAN,                             { 0x00000425, 0x0, 0x0, 0x0, 0x0 } },
+       { FAEROESE,                             { 0x00000406, 0x00000409, 0x0, 0x0, 0x0 } },
+       { FARSI,                                { 0x00000409, 0x00000429, 0x00000401, 0x0, 0x0 } },
+       { FINNISH,                              { 0x0000040b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { FRENCH_STANDARD,                      { 0x0000040c, 0x00000409, 0x0, 0x0, 0x0 } },
+       { FRENCH_BELGIAN,                       { 0x0000080c, 0x00000409, 0x0, 0x0, 0x0 } },
+       { FRENCH_CANADIAN,                      { 0x00000C0C, 0x00011009, 0x00000409, 0x0, 0x0 } },
+       { FRENCH_SWISS,                         { 0x0000100c, 0x00000409, 0x0, 0x0, 0x0 } },
+       { FRENCH_LUXEMBOURG,                    { 0x0000040c, 0x00000409, 0x0, 0x0, 0x0 } },
+       { FRENCH_MONACO,                        { 0x0000040c, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GEORGIAN,                             { 0x00000437, 0x00000409, 0x00000419, 0x0, 0x0 } },
+       { GALICIAN,                             { 0x0000040a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GERMAN_STANDARD,                      { 0x00000407, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GERMAN_SWISS,                         { 0x00000807, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GERMAN_AUSTRIAN,                      { 0x00000407, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GERMAN_LUXEMBOURG,                    { 0x00000407, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GERMAN_LIECHTENSTEIN,                 { 0x00000407, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GREEK,                                { 0x00000408, 0x00000409, 0x0, 0x0, 0x0 } },
+       { GUJARATI,                             { 0x00000409, 0x00000447, 0x00010439, 0x0, 0x0 } },
+       { HEBREW,                               { 0x00000409, 0x0000040d, 0x0, 0x0, 0x0 } },
+       { HINDI,                                { 0x00000409, 0x00010439, 0x00000439, 0x0, 0x0 } },
+       { HUNGARIAN,                            { 0x0000040e, 0x00000409, 0x0, 0x0, 0x0 } },
+       { ICELANDIC,                            { 0x0000040f, 0x00000409, 0x0, 0x0, 0x0 } },
+       { INDONESIAN,                           { 0x00000409, 0x00000409, 0x0, 0x0, 0x0 } },
+       { ITALIAN_STANDARD,                     { 0x00000410, 0x00000409, 0x0, 0x0, 0x0 } },
+       { ITALIAN_SWISS,                        { 0x00000410, 0x00000409, 0x0, 0x0, 0x0 } },
+       { JAPANESE,                             { 0xe0010411, 0x0, 0x0, 0x0, 0x0 } },
+       { KANNADA,                              { 0x00000409, 0x0000044b, 0x00010439, 0x0, 0x0 } },
+       { KAZAKH,                               { 0x0000043f, 0x00000409, 0x00000419, 0x0, 0x0 } },
+       { KONKANI,                              { 0x00000409, 0x00000439, 0x0, 0x0, 0x0 } },
+       { KOREAN,                               { 0xE0010412, 0x0, 0x0, 0x0, 0x0 } },
+       { KYRGYZ,                               { 0x00000440, 0x00000409, 0x0, 0x0, 0x0 } },
+       { LATVIAN,                              { 0x00010426, 0x0, 0x0, 0x0, 0x0 } },
+       { LITHUANIAN,                           { 0x00010427, 0x0, 0x0, 0x0, 0x0 } },
+       { MACEDONIAN,                           { 0x0000042f, 0x00000409, 0x0, 0x0, 0x0 } },
+       { MALAY_MALAYSIA,                       { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { MALAY_BRUNEI_DARUSSALAM,              { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { MALAYALAM,                            { 0x00000409, 0x0000044c, 0x0, 0x0, 0x0 } },
+       { MALTESE,                              { 0x00000409, 0x0000043a, 0x0, 0x0, 0x0 } },
+       { MAORI,                                { 0x00000409, 0x00000481, 0x0, 0x0, 0x0 } },
+       { MARATHI,                              { 0x00000409, 0x0000044e, 0x00000439, 0x0, 0x0 } },
+       { MONGOLIAN,                            { 0x00000450, 0x00000409, 0x0, 0x0, 0x0 } },
+       { NORWEGIAN_BOKMAL,                     { 0x00000414, 0x00000409, 0x0, 0x0, 0x0 } },
+       { NORWEGIAN_NYNORSK,                    { 0x00000414, 0x00000409, 0x0, 0x0, 0x0 } },
+       { POLISH,                               { 0x00010415, 0x00000415, 0x00000409, 0x0, 0x0 } },
+       { PORTUGUESE_BRAZILIAN,                 { 0x00000416, 0x00000409, 0x0, 0x0, 0x0 } },
+       { PORTUGUESE_STANDARD,                  { 0x00000816, 0x00000409, 0x0, 0x0, 0x0 } },
+       { PUNJABI,                              { 0x00000409, 0x00000446, 0x00010439, 0x0, 0x0 } },
+       { QUECHUA_BOLIVIA,                      { 0x00000409, 0x0000080A, 0x0, 0x0, 0x0 } },
+       { QUECHUA_ECUADOR,                      { 0x00000409, 0x0000080A, 0x0, 0x0, 0x0 } },
+       { QUECHUA_PERU,                         { 0x00000409, 0x0000080A, 0x0, 0x0, 0x0 } },
+       { ROMANIAN,                             { 0x00000418, 0x00000409, 0x0, 0x0, 0x0 } },
+       { RUSSIAN,                              { 0x00000419, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_INARI,                           { 0x0001083b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_LULE_NORWAY,                     { 0x0000043b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_LULE_SWEDEN,                     { 0x0000083b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_NORTHERN_FINLAND,                { 0x0001083b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_NORTHERN_NORWAY,                 { 0x0000043b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_NORTHERN_SWEDEN,                 { 0x0000083b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_SKOLT,                           { 0x0001083b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_SOUTHERN_NORWAY,                 { 0x0000043b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SAMI_SOUTHERN_SWEDEN,                 { 0x0000083b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SANSKRIT,                             { 0x00000409, 0x00000439, 0x0, 0x0, 0x0 } },
+       { SERBIAN_LATIN,                        { 0x0000081a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SERBIAN_LATIN_BOSNIA_HERZEGOVINA,     { 0x0000081a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SERBIAN_CYRILLIC,                     { 0x00000c1a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SERBIAN_CYRILLIC_BOSNIA_HERZEGOVINA,  { 0x00000c1a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SLOVAK,                               { 0x0000041b, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SLOVENIAN,                            { 0x00000424, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_TRADITIONAL_SORT,             { 0x0000040a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_MEXICAN,                      { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_MODERN_SORT,                  { 0x0000040a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_GUATEMALA,                    { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_COSTA_RICA,                   { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_PANAMA,                       { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_DOMINICAN_REPUBLIC,           { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_VENEZUELA,                    { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_COLOMBIA,                     { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_PERU,                         { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_ARGENTINA,                    { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_ECUADOR,                      { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_CHILE,                        { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_URUGUAY,                      { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_PARAGUAY,                     { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_BOLIVIA,                      { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_EL_SALVADOR,                  { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_HONDURAS,                     { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_NICARAGUA,                    { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SPANISH_PUERTO_RICO,                  { 0x0000080a, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SWAHILI,                              { 0x00000409, 0x0, 0x0, 0x0, 0x0 } },
+       { SWEDISH,                              { 0x0000041d, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SWEDISH_FINLAND,                      { 0x0000041d, 0x00000409, 0x0, 0x0, 0x0 } },
+       { SYRIAC,                               { 0x00000409, 0x0000045a, 0x0, 0x0, 0x0 } },
+       { TAMIL,                                { 0x00000409, 0x00000449, 0x0, 0x0, 0x0 } },
+       { TATAR,                                { 0x00000444, 0x00000409, 0x00000419, 0x0, 0x0 } },
+       { TELUGU,                               { 0x00000409, 0x0000044a, 0x00010439, 0x0, 0x0 } },
+       { THAI,                                 { 0x00000409, 0x0000041e, 0x0, 0x0, 0x0 } },
+       { TSWANA,                               { 0x00000409, 0x0000041f, 0x0, 0x0, 0x0 } },
+       { UKRAINIAN,                            { 0x00000422, 0x00000409, 0x0, 0x0, 0x0 } },
+       { TURKISH,                              { 0x0000041f, 0x0000041f, 0x0, 0x0, 0x0 } },
+       { UKRAINIAN,                            { 0x00000422, 0x00000409, 0x0, 0x0, 0x0 } },
+       { URDU,                                 { 0x00000401, 0x00000409, 0x0, 0x0, 0x0 } },
+       { UZBEK_LATIN,                          { 0x00000409, 0x00000843, 0x00000419, 0x0, 0x0 } },
+       { UZBEK_CYRILLIC,                       { 0x00000843, 0x00000409, 0x00000419, 0x0, 0x0 } },
+       { VIETNAMESE,                           { 0x00000409, 0x0000042a, 0x0, 0x0, 0x0 } },
+       { WELSH,                                { 0x00000452, 0x00000809, 0x0, 0x0, 0x0 } },
+       { XHOSA,                                { 0x00000409, 0x00000409, 0x0, 0x0, 0x0 } },
+};
+
+unsigned int detect_keyboard_layout_from_locale()
+{
+       int dot;
+       int i, j, k;
+       int underscore;
+       char language[4];
+       char country[10];
+
+       /* LANG = <language>_<country>.<encoding> */
+       char* envLang = getenv("LANG"); /* Get locale from environment variable LANG */
+
+       if (envLang == NULL)
+               return 0; /* LANG environment variable was not set */
+
+       underscore = strcspn(envLang, "_");
+
+       if (underscore > 3)
+               return 0; /* The language name should not be more than 3 letters long */
+       else
+       {
+               /* Get language code */
+               strncpy(language, envLang, underscore);
+               language[underscore] = '\0';
+       }
+
+       /*
+        * There is always the special case of "C" or "POSIX" as locale name
+        * In this case, use a U.S. keyboard and a U.S. keyboard layout
+        */
+
+       if ((strcmp(language, "C") == 0) || (strcmp(language, "POSIX") == 0))
+               return ENGLISH_UNITED_STATES; /* U.S. Keyboard Layout */
+
+       dot = strcspn(envLang, ".");
+
+       /* Get country code */
+       if (dot > underscore)
+       {
+               strncpy(country, &envLang[underscore + 1], dot - underscore - 1);
+               country[dot - underscore - 1] = '\0';
+       }
+       else
+               return 0; /* Invalid locale */
+
+       for (i = 0; i < sizeof(locales) / sizeof(locale); i++)
+       {
+               if ((strcmp(language, locales[i].language) == 0) && (strcmp(country, locales[i].country) == 0))
+                       break;
+       }
+
+       DEBUG_KBD("Found locale : %s_%s", locales[i].language, locales[i].country);
+
+       for (j = 0; j < sizeof(defaultKeyboardLayouts) / sizeof(localeAndKeyboardLayout); j++)
+       {
+               if (defaultKeyboardLayouts[j].locale == locales[i].code)
+               {
+                       /* Locale found in list of default keyboard layouts */
+                       for (k = 0; k < 5; k++)
+                       {
+                               if (defaultKeyboardLayouts[j].keyboardLayouts[k] == ENGLISH_UNITED_STATES)
+                               {
+                                       continue; /* Skip, try to get a more localized keyboard layout */
+                               }
+                               else if (defaultKeyboardLayouts[j].keyboardLayouts[k] == 0)
+                               {
+                                       break; /* No more keyboard layouts */
+                               }
+                               else
+                               {
+                                       return defaultKeyboardLayouts[j].keyboardLayouts[k];
+                               }
+                       }
+
+                       /*
+                        * If we skip the ENGLISH_UNITED_STATES keyboard layout but there are no
+                        * other possible keyboard layout for the locale, we end up here with k > 1
+                        */
+
+                       if (k >= 1)
+                               return ENGLISH_UNITED_STATES;
+                       else
+                               return 0;
+               }
+       }
+
+       return 0; /* Could not detect the current keyboard layout from locale */
+}
diff --git a/libfreerdp-kbd/x_layout_id_table.c b/libfreerdp-kbd/x_layout_id_table.c
new file mode 100644 (file)
index 0000000..42ee135
--- /dev/null
@@ -0,0 +1,1172 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libkbd.h"
+#include <freerdp/kbd/layouts.h>
+
+#include "x_layout_id_table.h"
+
+typedef struct
+{
+       /* XKB Keyboard layout variant */
+       const char* variant;
+
+       /* Keyboard Layout ID */
+       unsigned int keyboardLayoutID;
+
+} xkbVariant;
+
+typedef struct
+{
+       /* XKB Keyboard layout */
+       const char* layout;
+
+       /* Keyboard Layout ID */
+       unsigned int keyboardLayoutID;
+
+       const xkbVariant* variants;
+
+} xkbLayout;
+
+/* Those have been generated automatically and are waiting to be filled by hand */
+
+/* USA */
+static const xkbVariant us_variants[] =
+{
+       { "chr",                0 }, /* Cherokee */
+       { "euro",               0 }, /* With EuroSign on 5 */
+       { "intl",               KBD_UNITED_STATES_INTERNATIONAL }, /* International (with dead keys) */
+       { "alt-intl",           KBD_UNITED_STATES_INTERNATIONAL }, /* Alternative international (former us_intl) */
+       { "colemak",            0 }, /* Colemak */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "dvorak-intl",        KBD_UNITED_STATES_DVORAK }, /* Dvorak international */
+       { "dvorak-l",           KBD_UNITED_STATES_DVORAK_FOR_LEFT_HAND }, /* Left handed Dvorak */
+       { "dvorak-r",           KBD_UNITED_STATES_DVORAK_FOR_RIGHT_HAND }, /* Right handed Dvorak */
+       { "dvorak-classic",     KBD_UNITED_STATES_DVORAK }, /* Classic Dvorak */
+       { "dvp",                KBD_UNITED_STATES_DVORAK }, /* Programmer Dvorak */
+       { "rus",                0 }, /* Russian phonetic */
+       { "mac",                KBD_US }, /* Macintosh */
+       { "altgr-intl",         KBD_UNITED_STATES_INTERNATIONAL }, /* International (AltGr dead keys) */
+       { "olpc2",              KBD_US }, /* Group toggle on multiply/divide key */
+       { "",                   0 },
+};
+
+/* Afghanistan */
+static const xkbVariant af_variants[] =
+{
+       { "ps",                 KBD_PASHTO }, /* Pashto */
+       { "uz",                 KBD_UZBEK_CYRILLIC }, /* Southern Uzbek */
+       { "olpc-ps",            KBD_PASHTO }, /* OLPC Pashto */
+       { "olpc-fa",            0 }, /* OLPC Dari */
+       { "olpc-uz",            KBD_UZBEK_CYRILLIC }, /* OLPC Southern Uzbek */
+       { "",                   0 },
+};
+
+/* Arabic */
+static const xkbVariant ara_variants[] =
+{
+       { "azerty",             KBD_ARABIC_102_AZERTY }, /* azerty */
+       { "azerty_digits",      KBD_ARABIC_102_AZERTY }, /* azerty/digits */
+       { "digits",             KBD_ARABIC_102_AZERTY }, /* digits */
+       { "qwerty",             KBD_ARABIC_101 }, /* qwerty */
+       { "qwerty_digits",      KBD_ARABIC_101 }, /* qwerty/digits */
+       { "buckwalter",         KBD_US_ENGLISH_TABLE_FOR_IBM_ARABIC_238_L }, /* Buckwalter */
+       { "",                   0 },
+};
+
+/* Armenia */
+static const xkbVariant am_variants[] =
+{
+       { "phonetic",           0 }, /* Phonetic */
+       { "phonetic-alt",       0 }, /* Alternative Phonetic */
+       { "eastern",            KBD_ARMENIAN_EASTERN }, /* Eastern */
+       { "western",            KBD_ARMENIAN_WESTERN }, /* Western */
+       { "eastern-alt",        KBD_ARMENIAN_EASTERN }, /* Alternative Eastern */
+       { "",                   0 },
+};
+
+/* Azerbaijan */
+static const xkbVariant az_variants[] =
+{
+       { "cyrillic",           KBD_AZERI_CYRILLIC }, /* Cyrillic */
+       { "",                   0 },
+};
+
+/* Belarus */
+static const xkbVariant by_variants[] =
+{
+       { "winkeys",            KBD_BELARUSIAN }, /* Winkeys */
+       { "latin",              KBD_BELARUSIAN }, /* Latin */
+       { "",                   0 },
+};
+
+/* Belgium */
+static const xkbVariant be_variants[] =
+{
+       { "oss",                KBD_BELGIAN_FRENCH }, /* Alternative */
+       { "oss_latin9",         KBD_BELGIAN_FRENCH }, /* Alternative, latin-9 only */
+       { "oss_sundeadkeys",    KBD_BELGIAN_PERIOD }, /* Alternative, Sun dead keys */
+       { "iso-alternate",      KBD_BELGIAN_COMMA }, /* ISO Alternate */
+       { "nodeadkeys",         KBD_BELGIAN_COMMA }, /* Eliminate dead keys */
+       { "sundeadkeys",        KBD_BELGIAN_PERIOD }, /* Sun dead keys */
+       { "wang",               KBD_BELGIAN_FRENCH }, /* Wang model 724 azerty */
+       { "",                   0 },
+};
+
+/* Bangladesh */
+static const xkbVariant bd_variants[] =
+{
+       { "probhat",            KBD_BENGALI_INSCRIPT }, /* Probhat */
+       { "",                   0 },
+};
+
+/* India */
+static const xkbVariant in_variants[] =
+{
+       { "ben",                KBD_BENGALI }, /* Bengali */
+       { "ben_probhat",        KBD_BENGALI_INSCRIPT }, /* Bengali Probhat */
+       { "guj",                KBD_GUJARATI }, /* Gujarati */
+       { "guru",               0 }, /* Gurmukhi */
+       { "jhelum",             0 }, /* Gurmukhi Jhelum */
+       { "kan",                KBD_KANNADA }, /* Kannada */
+       { "mal",                KBD_MALAYALAM }, /* Malayalam */
+       { "mal_lalitha",        KBD_MALAYALAM }, /* Malayalam Lalitha */
+       { "ori",                0 }, /* Oriya */
+       { "tam_unicode",        KBD_TAMIL }, /* Tamil Unicode */
+       { "tam_TAB",            KBD_TAMIL }, /* Tamil TAB Typewriter */
+       { "tam_TSCII",          KBD_TAMIL }, /* Tamil TSCII Typewriter */
+       { "tam",                KBD_TAMIL }, /* Tamil */
+       { "tel",                KBD_TELUGU }, /* Telugu */
+       { "urd-phonetic",       KBD_URDU }, /* Urdu, Phonetic */
+       { "urd-phonetic3",      KBD_URDU }, /* Urdu, Alternative phonetic */
+       { "urd-winkeys",        KBD_URDU }, /* Urdu, Winkeys */
+       { "bolnagri",           KBD_HINDI_TRADITIONAL }, /* Hindi Bolnagri */
+       { "hin-wx",             KBD_HINDI_TRADITIONAL }, /* Hindi Wx */
+       { "",                   0 },
+};
+
+/* Bosnia and Herzegovina */
+static const xkbVariant ba_variants[] =
+{
+       { "alternatequotes",    KBD_BOSNIAN }, /* Use guillemets for quotes */
+       { "unicode",            KBD_BOSNIAN }, /* Use Bosnian digraphs */
+       { "unicodeus",          KBD_BOSNIAN }, /* US keyboard with Bosnian digraphs */
+       { "us",                 KBD_BOSNIAN_CYRILLIC }, /* US keyboard with Bosnian letters */
+       { "",                   0 },
+};
+
+/* Brazil */
+static const xkbVariant br_variants[] =
+{
+       { "nodeadkeys",         KBD_PORTUGUESE_BRAZILIAN_ABNT2 }, /* Eliminate dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "nativo",             KBD_PORTUGUESE_BRAZILIAN_ABNT2 }, /* Nativo */
+       { "nativo-us",          KBD_PORTUGUESE_BRAZILIAN_ABNT2 }, /* Nativo for USA keyboards */
+       { "nativo-epo",         KBD_PORTUGUESE_BRAZILIAN_ABNT2 }, /* Nativo for Esperanto */
+       { "",                   0 },
+};
+
+/* Bulgaria */
+static const xkbVariant bg_variants[] =
+{
+       { "phonetic",           KBD_BULGARIAN_LATIN }, /* Traditional Phonetic */
+       { "bas_phonetic",       KBD_BULGARIAN_LATIN }, /* Standard Phonetic */
+       { "",                   0 },
+};
+
+/* Morocco */
+static const xkbVariant ma_variants[] =
+{
+       { "french",                     KBD_FRENCH }, /* French */
+       { "tifinagh",                   0 }, /* Tifinagh */
+       { "tifinagh-alt",               0 }, /* Tifinagh Alternative */
+       { "tifinagh-alt-phonetic",      0 }, /* Tifinagh Alternative Phonetic */
+       { "tifinagh-extended",          0 }, /* Tifinagh Extended */
+       { "tifinagh-phonetic",          0 }, /* Tifinagh Phonetic */
+       { "tifinagh-extended-phonetic", 0 }, /* Tifinagh Extended Phonetic */
+       { "",                           0 },
+};
+
+/* Canada */
+static const xkbVariant ca_variants[] =
+{
+       { "fr-dvorak",          KBD_UNITED_STATES_DVORAK }, /* French Dvorak */
+       { "fr-legacy",          KBD_CANADIAN_FRENCH }, /* French (legacy) */
+       { "multix",             KBD_CANADIAN_MULTILINGUAL_STANDARD }, /* Multilingual */
+       { "multi",              KBD_CANADIAN_MULTILINGUAL_STANDARD }, /* Multilingual, first part */
+       { "multi-2gr",          KBD_CANADIAN_MULTILINGUAL_STANDARD }, /* Multilingual, second part */
+       { "ike",                KBD_INUKTITUT_LATIN }, /* Inuktitut */
+       { "shs",                0 }, /* Secwepemctsin */
+       { "kut",                0 }, /* Ktunaxa */
+       { "eng",                KBD_US }, /* English */
+       { "",                   0 },
+};
+
+/* China */
+static const xkbVariant cn_variants[] =
+{
+       { "tib",                0 }, /* Tibetan */
+       { "tib_asciinum",       0 }, /* Tibetan (with ASCII numerals) */
+       { "",                   0 },
+};
+
+/* Croatia */
+static const xkbVariant hr_variants[] =
+{
+       { "alternatequotes",    KBD_CROATIAN }, /* Use guillemets for quotes */
+       { "unicode",            KBD_CROATIAN }, /* Use Croatian digraphs */
+       { "unicodeus",          KBD_CROATIAN }, /* US keyboard with Croatian digraphs */
+       { "us",                 KBD_CROATIAN }, /* US keyboard with Croatian letters */
+       { "",                   0 },
+};
+
+/* Czechia */
+static const xkbVariant cz_variants[] =
+{
+       { "bksl",               KBD_CZECH_PROGRAMMERS }, /* With &lt;\|&gt; key */
+       { "qwerty",             KBD_CZECH_QWERTY }, /* qwerty */
+       { "qwerty_bksl",        KBD_CZECH_QWERTY }, /* qwerty, extended Backslash */
+       { "ucw",                KBD_CZECH }, /* UCW layout (accented letters only) */
+       { "",                   0 },
+};
+
+/* Denmark */
+static const xkbVariant dk_variants[] =
+{
+       { "nodeadkeys",         KBD_DANISH }, /* Eliminate dead keys */
+       { "mac",                KBD_DANISH }, /* Macintosh */
+       { "mac_nodeadkeys",     KBD_DANISH }, /* Macintosh, eliminate dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "",                   0 },
+};
+
+/* Netherlands */
+static const xkbVariant nl_variants[] =
+{
+       { "sundeadkeys",        KBD_SWISS_FRENCH }, /* Sun dead keys */
+       { "mac",                KBD_SWISS_FRENCH }, /* Macintosh */
+       { "std",                KBD_SWISS_FRENCH }, /* Standard */
+       { "",                   0 },
+};
+
+/* Estonia */
+static const xkbVariant ee_variants[] =
+{
+       { "nodeadkeys",         KBD_US }, /* Eliminate dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "us",                 KBD_UNITED_STATES_INTERNATIONAL }, /* US keyboard with Estonian letters */
+       { "",                   0 },
+};
+
+/* Iran */
+static const xkbVariant ir_variants[] =
+{
+       { "pro",                0 }, /* Pro */
+       { "keypad",             0 }, /* Keypad */
+       { "pro_keypad",         0 }, /* Pro Keypad */
+       { "ku",                 0 }, /* Kurdish, Latin Q */
+       { "ku_f",               0 }, /* Kurdish, (F) */
+       { "ku_alt",             0 }, /* Kurdish, Latin Alt-Q */
+       { "ku_ara",             0 }, /* Kurdish, Arabic-Latin */
+       { "",                   0 },
+};
+
+/* Iraq */
+static const xkbVariant iq_variants[] =
+{
+       { "ku",                 0 }, /* Kurdish, Latin Q */
+       { "ku_f",               0 }, /* Kurdish, (F) */
+       { "ku_alt",             0 }, /* Kurdish, Latin Alt-Q */
+       { "ku_ara",             0 }, /* Kurdish, Arabic-Latin */
+       { "",                   0 },
+};
+
+/* Faroe Islands */
+static const xkbVariant fo_variants[] =
+{
+       { "nodeadkeys",         0 }, /* Eliminate dead keys */
+       { "",                   0 },
+};
+
+/* Finland */
+static const xkbVariant fi_variants[] =
+{
+       { "nodeadkeys",         0 }, /* Eliminate dead keys */
+       { "smi",                0 }, /* Northern Saami */
+       { "classic",            0 }, /* Classic */
+       { "mac",                0 }, /* Macintosh */
+       { "",                   0 },
+};
+
+/* France */
+static const xkbVariant fr_variants[] =
+{
+       { "nodeadkeys",         0 }, /* Eliminate dead keys */
+       { "sundeadkeys",        0 }, /* Sun dead keys */
+       { "oss",                0 }, /* Alternative */
+       { "oss_latin9",         0 }, /* Alternative, latin-9 only */
+       { "oss_nodeadkeys",     0 }, /* Alternative, eliminate dead keys */
+       { "oss_sundeadkeys",    0 }, /* Alternative, Sun dead keys */
+       { "latin9",             0 }, /* (Legacy) Alternative */
+       { "latin9_nodeadkeys",  0 }, /* (Legacy) Alternative, eliminate dead keys */
+       { "latin9_sundeadkeys", 0 }, /* (Legacy) Alternative, Sun dead keys */
+       { "bepo",               0 }, /* Bepo, ergonomic, Dvorak way */
+       { "bepo_latin9",        0 }, /* Bepo, ergonomic, Dvorak way, latin-9 only */
+       { "dvorak",             0 }, /* Dvorak */
+       { "mac",                0 }, /* Macintosh */
+       { "bre",                0 }, /* Breton */
+       { "oci",                0 }, /* Occitan */
+       { "geo",                0 }, /* Georgian AZERTY Tskapo */
+       { "",                   0 },
+};
+
+/* Ghana */
+static const xkbVariant gh_variants[] =
+{
+       { "generic",            0 }, /* Multilingual */
+       { "akan",               0 }, /* Akan */
+       { "ewe",                0 }, /* Ewe */
+       { "fula",               0 }, /* Fula */
+       { "ga",                 0 }, /* Ga */
+       { "hausa",              0 }, /* Hausa */
+       { "",                   0 },
+};
+
+/* Georgia */
+static const xkbVariant ge_variants[] =
+{
+       { "ergonomic",          0 }, /* Ergonomic */
+       { "mess",               0 }, /* MESS */
+       { "ru",                 0 }, /* Russian */
+       { "os",                 0 }, /* Ossetian */
+       { "",                   0 },
+};
+
+/* Germany */
+static const xkbVariant de_variants[] =
+{
+       { "deadacute",          KBD_GERMAN }, /* Dead acute */
+       { "deadgraveacute",     KBD_GERMAN }, /* Dead grave acute */
+       { "nodeadkeys",         KBD_GERMAN }, /* Eliminate dead keys */
+       { "ro",                 KBD_GERMAN }, /* Romanian keyboard with German letters */
+       { "ro_nodeadkeys",      KBD_GERMAN }, /* Romanian keyboard with German letters, eliminate dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "sundeadkeys",        KBD_GERMAN }, /* Sun dead keys */
+       { "neo",                KBD_GERMAN_NEO }, /* Neo 2 */
+       { "mac",                KBD_GERMAN }, /* Macintosh */
+       { "mac_nodeadkeys",     KBD_GERMAN }, /* Macintosh, eliminate dead keys */
+       { "dsb",                KBD_GERMAN }, /* Lower Sorbian */
+       { "dsb_qwertz",         KBD_GERMAN }, /* Lower Sorbian (qwertz) */
+       { "qwerty",             KBD_GERMAN_IBM }, /* qwerty */
+       { "",                   0 },
+};
+
+/* Greece */
+static const xkbVariant gr_variants[] =
+{
+       { "simple",             KBD_GREEK_220 }, /* Simple */
+       { "extended",           KBD_GREEK_319 }, /* Extended */
+       { "nodeadkeys",         KBD_GREEK_319}, /* Eliminate dead keys */
+       { "polytonic",          KBD_GREEK_POLYTONIC }, /* Polytonic */
+       { "",                   0 },
+};
+
+/* Hungary */
+static const xkbVariant hu_variants[] =
+{
+       { "standard",                           KBD_HUNGARIAN_101_KEY }, /* Standard */
+       { "nodeadkeys",                         KBD_HUNGARIAN_101_KEY }, /* Eliminate dead keys */
+       { "qwerty",                             KBD_HUNGARIAN_101_KEY }, /* qwerty */
+       { "101_qwertz_comma_dead",              KBD_HUNGARIAN_101_KEY }, /* 101/qwertz/comma/Dead keys */
+       { "101_qwertz_comma_nodead",            KBD_HUNGARIAN_101_KEY }, /* 101/qwertz/comma/Eliminate dead keys */
+       { "101_qwertz_dot_dead",                KBD_HUNGARIAN_101_KEY }, /* 101/qwertz/dot/Dead keys */
+       { "101_qwertz_dot_nodead",              KBD_HUNGARIAN_101_KEY }, /* 101/qwertz/dot/Eliminate dead keys */
+       { "101_qwerty_comma_dead",              KBD_HUNGARIAN_101_KEY }, /* 101/qwerty/comma/Dead keys */
+       { "101_qwerty_comma_nodead",            KBD_HUNGARIAN_101_KEY }, /* 101/qwerty/comma/Eliminate dead keys */
+       { "101_qwerty_dot_dead",                KBD_HUNGARIAN_101_KEY }, /* 101/qwerty/dot/Dead keys */
+       { "101_qwerty_dot_nodead",              KBD_HUNGARIAN_101_KEY }, /* 101/qwerty/dot/Eliminate dead keys */
+       { "102_qwertz_comma_dead",              KBD_HUNGARIAN_101_KEY }, /* 102/qwertz/comma/Dead keys */
+       { "102_qwertz_comma_nodead",            KBD_HUNGARIAN_101_KEY }, /* 102/qwertz/comma/Eliminate dead keys */
+       { "102_qwertz_dot_dead",                KBD_HUNGARIAN_101_KEY }, /* 102/qwertz/dot/Dead keys */
+       { "102_qwertz_dot_nodead",              KBD_HUNGARIAN_101_KEY }, /* 102/qwertz/dot/Eliminate dead keys */
+       { "102_qwerty_comma_dead",              KBD_HUNGARIAN_101_KEY }, /* 102/qwerty/comma/Dead keys */
+       { "102_qwerty_comma_nodead",            KBD_HUNGARIAN_101_KEY }, /* 102/qwerty/comma/Eliminate dead keys */
+       { "102_qwerty_dot_dead",                KBD_HUNGARIAN_101_KEY }, /* 102/qwerty/dot/Dead keys */
+       { "102_qwerty_dot_nodead",              KBD_HUNGARIAN_101_KEY }, /* 102/qwerty/dot/Eliminate dead keys */
+       { "",                                   0 },
+};
+
+/* Iceland */
+static const xkbVariant is_variants[] =
+{
+       { "Sundeadkeys",        KBD_ICELANDIC }, /* Sun dead keys */
+       { "nodeadkeys",         KBD_ICELANDIC }, /* Eliminate dead keys */
+       { "mac",                KBD_ICELANDIC }, /* Macintosh */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "",                   0 },
+};
+
+/* Israel */
+static const xkbVariant il_variants[] =
+{
+       { "lyx",                KBD_HEBREW }, /* lyx */
+       { "phonetic",           KBD_HEBREW }, /* Phonetic */
+       { "biblical",           KBD_HEBREW }, /* Biblical Hebrew (Tiro) */
+       { "",                   0 },
+};
+
+/* Italy */
+static const xkbVariant it_variants[] =
+{
+       { "nodeadkeys",         KBD_ITALIAN_142 }, /* Eliminate dead keys */
+       { "mac",                KBD_ITALIAN }, /* Macintosh */
+       { "geo",                KBD_GEORGIAN }, /* Georgian */
+       { "",                   0 },
+};
+
+/* Japan */
+static const xkbVariant jp_variants[] =
+{
+       { "kana",               KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002 }, /* Kana */
+       { "OADG109A",           KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002 }, /* OADG 109A */
+       { "",                   0 },
+};
+
+/* Kyrgyzstan */
+static const xkbVariant kg_variants[] =
+{
+       { "phonetic",           KBD_KYRGYZ_CYRILLIC }, /* Phonetic */
+       { "",                   0 },
+};
+
+/* Kazakhstan */
+static const xkbVariant kz_variants[] =
+{
+       { "ruskaz",             KBD_KAZAKH }, /* Russian with Kazakh */
+       { "kazrus",             KBD_KAZAKH }, /* Kazakh with Russian */
+       { "",                   0 },
+};
+
+/* Latin America */
+static const xkbVariant latam_variants[] =
+{
+       { "nodeadkeys",         KBD_LATIN_AMERICAN }, /* Eliminate dead keys */
+       { "deadtilde",          KBD_LATIN_AMERICAN }, /* Include dead tilde */
+       { "sundeadkeys",        KBD_LATIN_AMERICAN }, /* Sun dead keys */
+       { "",                   0 },
+};
+
+/* Lithuania */
+static const xkbVariant lt_variants[] =
+{
+       { "std",                KBD_LITHUANIAN }, /* Standard */
+       { "us",                 KBD_LITHUANIAN_IBM }, /* US keyboard with Lithuanian letters */
+       { "ibm",                KBD_LITHUANIAN_IBM }, /* IBM (LST 1205-92) */
+       { "lekp",               KBD_LITHUANIAN }, /* LEKP */
+       { "lekpa",              KBD_LITHUANIAN }, /* LEKPa */
+       { "balticplus",         KBD_LITHUANIAN }, /* Baltic+ */
+       { "",                   0 },
+};
+
+/* Latvia */
+static const xkbVariant lv_variants[] =
+{
+       { "apostrophe",         KBD_LATVIAN }, /* Apostrophe (') variant */
+       { "tilde",              KBD_LATVIAN }, /* Tilde (~) variant */
+       { "fkey",               KBD_LATVIAN }, /* F-letter (F) variant */
+       { "",                   0 },
+};
+
+/* Montenegro */
+static const xkbVariant me_variants[] =
+{
+       { "cyrillic",                   0 }, /* Cyrillic */
+       { "cyrillicyz",                 0 }, /* Cyrillic, Z and ZHE swapped */
+       { "latinunicode",               0 }, /* Latin unicode */
+       { "latinyz",                    0 }, /* Latin qwerty */
+       { "latinunicodeyz",             0 }, /* Latin unicode qwerty */
+       { "cyrillicalternatequotes",    0 }, /* Cyrillic with guillemets */
+       { "latinalternatequotes",       0 }, /* Latin with guillemets */
+       { "",                   0 },
+};
+
+/* Macedonia */
+static const xkbVariant mk_variants[] =
+{
+       { "nodeadkeys",         KBD_FYRO_MACEDONIAN }, /* Eliminate dead keys */
+       { "",                   0 },
+};
+
+/* Malta */
+static const xkbVariant mt_variants[] =
+{
+       { "us",                 KBD_MALTESE_48_KEY }, /* Maltese keyboard with US layout */
+       { "",                   0 },
+};
+
+/* Norway */
+static const xkbVariant no_variants[] =
+{
+       { "nodeadkeys",         KBD_NORWEGIAN }, /* Eliminate dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "smi",                KBD_NORWEGIAN_WITH_SAMI }, /* Northern Saami */
+       { "smi_nodeadkeys",     KBD_SAMI_EXTENDED_NORWAY }, /* Northern Saami, eliminate dead keys */
+       { "mac",                KBD_NORWEGIAN }, /* Macintosh */
+       { "mac_nodeadkeys",     KBD_SAMI_EXTENDED_NORWAY }, /* Macintosh, eliminate dead keys */
+       { "",                   0 },
+};
+
+/* Poland */
+static const xkbVariant pl_variants[] =
+{
+       { "qwertz",             KBD_POLISH_214 }, /* qwertz */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "dvorak_quotes",      KBD_UNITED_STATES_DVORAK }, /* Dvorak, Polish quotes on quotemark key */
+       { "dvorak_altquotes",   KBD_UNITED_STATES_DVORAK }, /* Dvorak, Polish quotes on key 1 */
+       { "csb",                0 }, /* Kashubian */
+       { "ru_phonetic_dvorak", KBD_UNITED_STATES_DVORAK }, /* Russian phonetic Dvorak */
+       { "",                   0 },
+};
+
+/* Portugal */
+static const xkbVariant pt_variants[] =
+{
+       { "nodeadkeys",         KBD_PORTUGUESE }, /* Eliminate dead keys */
+       { "sundeadkeys",        KBD_PORTUGUESE }, /* Sun dead keys */
+       { "mac",                KBD_PORTUGUESE }, /* Macintosh */
+       { "mac_nodeadkeys",     KBD_PORTUGUESE }, /* Macintosh, eliminate dead keys */
+       { "mac_sundeadkeys",    KBD_PORTUGUESE }, /* Macintosh, Sun dead keys */
+       { "nativo",             KBD_PORTUGUESE }, /* Nativo */
+       { "nativo-us",          KBD_PORTUGUESE }, /* Nativo for USA keyboards */
+       { "nativo-epo",         KBD_PORTUGUESE }, /* Nativo for Esperanto */
+       { "",                   0 },
+};
+
+/* Romania */
+static const xkbVariant ro_variants[] =
+{
+       { "cedilla",            KBD_ROMANIAN }, /* Cedilla */
+       { "std",                KBD_ROMANIAN }, /* Standard */
+       { "std_cedilla",        KBD_ROMANIAN }, /* Standard (Cedilla) */
+       { "winkeys",            KBD_ROMANIAN }, /* Winkeys */
+       { "crh_f",              KBD_TURKISH_F }, /* Crimean Tatar (Turkish F) */
+       { "crh_alt",            KBD_TURKISH_Q }, /* Crimean Tatar (Turkish Alt-Q) */
+       { "crh_dobruca1",       KBD_TATAR }, /* Crimean Tatar (Dobruca-1 Q) */
+       { "crh_dobruca2",       KBD_TATAR }, /* Crimean Tatar (Dobruca-2 Q) */
+       { "",                   0 },
+};
+
+/* Russia */
+static const xkbVariant ru_variants[] =
+{
+       { "phonetic",           KBD_RUSSIAN }, /* Phonetic */
+       { "phonetic_winkeys",   KBD_RUSSIAN }, /* Phonetic Winkeys */
+       { "typewriter",         KBD_RUSSIAN_TYPEWRITER }, /* Typewriter */
+       { "legacy",             KBD_RUSSIAN }, /* Legacy */
+       { "tt",                 KBD_TATAR }, /* Tatar */
+       { "os_legacy",          0 }, /* Ossetian, legacy */
+       { "os_winkeys",         0 }, /* Ossetian, Winkeys */
+       { "cv",                 0 }, /* Chuvash */
+       { "cv_latin",           0 }, /* Chuvash Latin */
+       { "udm",                0 }, /* Udmurt */
+       { "kom",                0 }, /* Komi */
+       { "sah",                0 }, /* Yakut */
+       { "xal",                0 }, /* Kalmyk */
+       { "dos",                0 }, /* DOS */
+       { "",                   0 },
+};
+
+/* Serbia */
+static const xkbVariant rs_variants[] =
+{
+       { "yz",                         KBD_SERBIAN_CYRILLIC }, /* Z and ZHE swapped */
+       { "latin",                      KBD_SERBIAN_LATIN }, /* Latin */
+       { "latinunicode",               KBD_SERBIAN_LATIN }, /* Latin Unicode */
+       { "latinyz",                    KBD_SERBIAN_LATIN }, /* Latin qwerty */
+       { "latinunicodeyz",             KBD_SERBIAN_LATIN }, /* Latin Unicode qwerty */
+       { "alternatequotes",            KBD_SERBIAN_CYRILLIC }, /* With guillemets */
+       { "latinalternatequotes",       KBD_SERBIAN_LATIN }, /* Latin with guillemets */
+       { "",                           0 },
+};
+
+/* Slovenia */
+static const xkbVariant si_variants[] =
+{
+       { "alternatequotes",    KBD_SLOVENIAN }, /* Use guillemets for quotes */
+       { "us",                 KBD_UNITED_STATES_INTERNATIONAL }, /* US keyboard with Slovenian letters */
+       { "",                   0 },
+};
+
+/* Slovakia */
+static const xkbVariant sk_variants[] =
+{
+       { "bksl",               KBD_SLOVAK }, /* Extended Backslash */
+       { "qwerty",             KBD_SLOVAK_QWERTY }, /* qwerty */
+       { "qwerty_bksl",        KBD_SLOVAK_QWERTY }, /* qwerty, extended Backslash */
+       { "",                   0 },
+};
+
+/* Spain */
+static const xkbVariant es_variants[] =
+{
+       { "nodeadkeys",         KBD_SPANISH_VARIATION }, /* Eliminate dead keys */
+       { "deadtilde",          KBD_SPANISH_VARIATION }, /* Include dead tilde */
+       { "sundeadkeys",        KBD_SPANISH }, /* Sun dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "ast",                KBD_SPANISH_VARIATION }, /* Asturian variant with bottom-dot H and bottom-dot L */
+       { "cat",                KBD_SPANISH_VARIATION }, /* Catalan variant with middle-dot L */
+       { "mac",                KBD_SPANISH }, /* Macintosh */
+       { "",                   0 },
+};
+
+/* Sweden */
+static const xkbVariant se_variants[] =
+{
+       { "nodeadkeys",         KBD_SWEDISH }, /* Eliminate dead keys */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "rus",                KBD_RUSSIAN }, /* Russian phonetic */
+       { "rus_nodeadkeys",     KBD_RUSSIAN }, /* Russian phonetic, eliminate dead keys */
+       { "smi",                KBD_SWEDISH_WITH_SAMI }, /* Northern Saami */
+       { "mac",                KBD_SWEDISH }, /* Macintosh */
+       { "svdvorak",           KBD_UNITED_STATES_DVORAK }, /* Svdvorak */
+       { "",                   0 },
+};
+
+/* Switzerland */
+static const xkbVariant ch_variants[] =
+{
+       { "de_nodeadkeys",      KBD_SWISS_GERMAN }, /* German, eliminate dead keys */
+       { "de_sundeadkeys",     KBD_SWISS_GERMAN }, /* German, Sun dead keys */
+       { "fr",                 KBD_SWISS_FRENCH }, /* French */
+       { "fr_nodeadkeys",      KBD_SWISS_FRENCH }, /* French, eliminate dead keys */
+       { "fr_sundeadkeys",     KBD_SWISS_FRENCH }, /* French, Sun dead keys */
+       { "fr_mac",             KBD_SWISS_FRENCH }, /* French (Macintosh) */
+       { "de_mac",             KBD_SWISS_GERMAN }, /* German (Macintosh) */
+       { "",                   0 },
+};
+
+/* Syria */
+static const xkbVariant sy_variants[] =
+{
+       { "syc",                KBD_SYRIAC }, /* Syriac */
+       { "syc_phonetic",       KBD_SYRIAC_PHONETIC }, /* Syriac phonetic */
+       { "ku",                 0 }, /* Kurdish, Latin Q */
+       { "ku_f",               0 }, /* Kurdish, (F) */
+       { "ku_alt",             0 }, /* Kurdish, Latin Alt-Q */
+       { "",                   0 },
+};
+
+/* Tajikistan */
+static const xkbVariant tj_variants[] =
+{
+       { "legacy",             0 }, /* Legacy */
+       { "",                   0 },
+};
+
+/* Sri Lanka */
+static const xkbVariant lk_variants[] =
+{
+       { "tam_unicode",        KBD_TAMIL }, /* Tamil Unicode */
+       { "tam_TAB",            KBD_TAMIL }, /* Tamil TAB Typewriter */
+       { "",                   0 },
+};
+
+/* Thailand */
+static const xkbVariant th_variants[] =
+{
+       { "tis",                KBD_THAI_KEDMANEE_NON_SHIFTLOCK }, /* TIS-820.2538 */
+       { "pat",                KBD_THAI_PATTACHOTE }, /* Pattachote */
+       { "",                   0 },
+};
+
+/* Turkey */
+static const xkbVariant tr_variants[] =
+{
+       { "f",                  KBD_TURKISH_F }, /* (F) */
+       { "alt",                KBD_TURKISH_Q }, /* Alt-Q */
+       { "sundeadkeys",        KBD_TURKISH_F }, /* Sun dead keys */
+       { "ku",                 0 }, /* Kurdish, Latin Q */
+       { "ku_f",               0 }, /* Kurdish, (F) */
+       { "ku_alt",             0 }, /* Kurdish, Latin Alt-Q */
+       { "intl",               KBD_TURKISH_F }, /* International (with dead keys) */
+       { "crh",                KBD_TATAR }, /* Crimean Tatar (Turkish Q) */
+       { "crh_f",              KBD_TURKISH_F }, /* Crimean Tatar (Turkish F) */
+       { "crh_alt",            KBD_TURKISH_Q }, /* Crimean Tatar (Turkish Alt-Q) */
+       { "",                   0 },
+};
+
+/* Ukraine */
+static const xkbVariant ua_variants[] =
+{
+       { "phonetic",           KBD_UKRAINIAN }, /* Phonetic */
+       { "typewriter",         KBD_UKRAINIAN }, /* Typewriter */
+       { "winkeys",            KBD_UKRAINIAN }, /* Winkeys */
+       { "legacy",             KBD_UKRAINIAN }, /* Legacy */
+       { "rstu",               KBD_UKRAINIAN }, /* Standard RSTU */
+       { "rstu_ru",            KBD_UKRAINIAN }, /* Standard RSTU on Russian layout */
+       { "homophonic",         KBD_UKRAINIAN }, /* Homophonic */
+       { "crh",                KBD_TATAR }, /* Crimean Tatar (Turkish Q) */
+       { "crh_f",              KBD_TURKISH_F }, /* Crimean Tatar (Turkish F) */
+       { "crh_alt",            KBD_TURKISH_Q }, /* Crimean Tatar (Turkish Alt-Q) */
+       { "",                   0 },
+};
+
+/* United Kingdom */
+static const xkbVariant gb_variants[] =
+{
+       { "extd",               KBD_UNITED_KINGDOM_EXTENDED }, /* Extended - Winkeys */
+       { "intl",               KBD_UNITED_KINGDOM_EXTENDED }, /* International (with dead keys) */
+       { "dvorak",             KBD_UNITED_STATES_DVORAK }, /* Dvorak */
+       { "dvorakukp",          KBD_UNITED_STATES_DVORAK }, /* Dvorak (UK Punctuation) */
+       { "mac",                KBD_UNITED_KINGDOM }, /* Macintosh */
+       { "colemak",            0 }, /* Colemak */
+       { "",                   0 },
+};
+
+/* Uzbekistan */
+static const xkbVariant uz_variants[] =
+{
+       { "latin",              0 }, /* Latin */
+       { "crh",                KBD_TATAR }, /* Crimean Tatar (Turkish Q) */
+       { "crh_f",              KBD_TURKISH_F }, /* Crimean Tatar (Turkish F) */
+       { "crh_alt",            KBD_TURKISH_Q }, /* Crimean Tatar (Turkish Alt-Q) */
+       { "",                   0 },
+};
+
+/* Korea, Republic of */
+static const xkbVariant kr_variants[] =
+{
+       { "kr104",              KBD_KOREAN_INPUT_SYSTEM_IME_2000 }, /* 101/104 key Compatible */
+       { "",                   0 },
+};
+
+/* Ireland */
+static const xkbVariant ie_variants[] =
+{
+       { "CloGaelach",         KBD_GAELIC }, /* CloGaelach */
+       { "UnicodeExpert",      KBD_GAELIC }, /* UnicodeExpert */
+       { "ogam",               KBD_GAELIC }, /* Ogham */
+       { "ogam_is434",         KBD_GAELIC }, /* Ogham IS434 */
+       { "",                   0 },
+};
+
+/* Pakistan */
+static const xkbVariant pk_variants[] =
+{
+       { "urd-crulp",          0 }, /* CRULP */
+       { "urd-nla",            0 }, /* NLA */
+       { "ara",                KBD_ARABIC_101 }, /* Arabic */
+       { "",                   0 },
+};
+
+/* Esperanto */
+static const xkbVariant epo_variants[] =
+{
+       { "legacy",             0 }, /* displaced semicolon and quote (obsolete) */
+       { "",                   0 },
+};
+
+/* Nigeria */
+static const xkbVariant ng_variants[] =
+{
+       { "igbo",               0 }, /* Igbo */
+       { "yoruba",             0 }, /* Yoruba */
+       { "hausa",              0 }, /* Hausa */
+       { "",                   0 },
+};
+
+/* Braille */
+static const xkbVariant brai_variants[] =
+{
+       { "left_hand",          0 }, /* Left hand */
+       { "right_hand",         0 }, /* Right hand */
+       { "",                   0 },
+};
+
+/* Turkmenistan */
+static const xkbVariant tm_variants[] =
+{
+       { "alt",                KBD_TURKISH_Q }, /* Alt-Q */
+       { "",                   0 },
+};
+
+static const xkbLayout xkbLayouts[] =
+{
+       { "us",          KBD_US, us_variants }, /* USA */
+       { "ad",          0, NULL }, /* Andorra */
+       { "af",          KBD_FARSI, af_variants }, /* Afghanistan */
+       { "ara",         KBD_ARABIC_101, ara_variants }, /* Arabic */
+       { "al",          0, NULL }, /* Albania */
+       { "am",          KBD_ARMENIAN_EASTERN, am_variants }, /* Armenia */
+       { "az",          KBD_AZERI_CYRILLIC, az_variants }, /* Azerbaijan */
+       { "by",          KBD_BELARUSIAN, by_variants }, /* Belarus */
+       { "be",          KBD_BELGIAN_FRENCH, be_variants }, /* Belgium */
+       { "bd",          KBD_BENGALI, bd_variants }, /* Bangladesh */
+       { "in",          KBD_HINDI_TRADITIONAL, in_variants }, /* India */
+       { "ba",          KBD_CROATIAN, ba_variants }, /* Bosnia and Herzegovina */
+       { "br",          KBD_PORTUGUESE_BRAZILIAN_ABNT, br_variants }, /* Brazil */
+       { "bg",          KBD_BULGARIAN_LATIN, bg_variants }, /* Bulgaria */
+       { "ma",          KBD_FRENCH, ma_variants }, /* Morocco */
+       { "mm",          0, NULL }, /* Myanmar */
+       { "ca",          KBD_US, ca_variants }, /* Canada */
+       { "cd",          0, NULL }, /* Congo, Democratic Republic of the */
+       { "cn",          KBD_CHINESE_TRADITIONAL_PHONETIC, cn_variants }, /* China */
+       { "hr",          KBD_CROATIAN, hr_variants }, /* Croatia */
+       { "cz",          KBD_CZECH, cz_variants }, /* Czechia */
+       { "dk",          KBD_DANISH, dk_variants }, /* Denmark */
+       { "nl",          KBD_DUTCH, nl_variants }, /* Netherlands */
+       { "bt",          0, NULL }, /* Bhutan */
+       { "ee",          KBD_ESTONIAN, ee_variants }, /* Estonia */
+       { "ir",          0, ir_variants }, /* Iran */
+       { "iq",          0, iq_variants }, /* Iraq */
+       { "fo",          0, fo_variants }, /* Faroe Islands */
+       { "fi",          KBD_FINNISH, fi_variants }, /* Finland */
+       { "fr",          KBD_FRENCH, fr_variants }, /* France */
+       { "gh",          0, gh_variants }, /* Ghana */
+       { "gn",          0, NULL }, /* Guinea */
+       { "ge",          KBD_GEORGIAN, ge_variants }, /* Georgia */
+       { "de",          KBD_GERMAN, de_variants }, /* Germany */
+       { "gr",          KBD_GREEK, gr_variants }, /* Greece */
+       { "hu",          KBD_HUNGARIAN, hu_variants }, /* Hungary */
+       { "is",          KBD_ICELANDIC, is_variants }, /* Iceland */
+       { "il",          KBD_HEBREW, il_variants }, /* Israel */
+       { "it",          KBD_ITALIAN, it_variants }, /* Italy */
+       { "jp",          KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002, jp_variants }, /* Japan */
+       { "kg",          0, kg_variants }, /* Kyrgyzstan */
+       { "kh",          0, NULL }, /* Cambodia */
+       { "kz",          KBD_KAZAKH, kz_variants }, /* Kazakhstan */
+       { "la",          0, NULL }, /* Laos */
+       { "latam",       KBD_LATIN_AMERICAN, latam_variants }, /* Latin America */
+       { "lt",          KBD_LITHUANIAN, lt_variants }, /* Lithuania */
+       { "lv",          KBD_LATVIAN, lv_variants }, /* Latvia */
+       { "mao",         KBD_MAORI, NULL }, /* Maori */
+       { "me",          KBD_SERBIAN_LATIN, me_variants }, /* Montenegro */
+       { "mk",          KBD_FYRO_MACEDONIAN, mk_variants }, /* Macedonia */
+       { "mt",          KBD_MALTESE_48_KEY, mt_variants }, /* Malta */
+       { "mn",          KBD_MONGOLIAN_CYRILLIC, NULL }, /* Mongolia */
+       { "no",          KBD_NORWEGIAN, no_variants }, /* Norway */
+       { "pl",          KBD_POLISH_214, pl_variants }, /* Poland */
+       { "pt",          KBD_PORTUGUESE, pt_variants }, /* Portugal */
+       { "ro",          KBD_ROMANIAN, ro_variants }, /* Romania */
+       { "ru",          KBD_RUSSIAN, ru_variants }, /* Russia */
+       { "rs",          KBD_SERBIAN_LATIN, rs_variants }, /* Serbia */
+       { "si",          KBD_SLOVENIAN, si_variants }, /* Slovenia */
+       { "sk",          KBD_SLOVAK, sk_variants }, /* Slovakia */
+       { "es",          KBD_SPANISH, es_variants }, /* Spain */
+       { "se",          KBD_SWEDISH, se_variants }, /* Sweden */
+       { "ch",          KBD_SWISS_FRENCH, ch_variants }, /* Switzerland */
+       { "sy",          KBD_SYRIAC, sy_variants }, /* Syria */
+       { "tj",          0, tj_variants }, /* Tajikistan */
+       { "lk",          0, lk_variants }, /* Sri Lanka */
+       { "th",          KBD_THAI_KEDMANEE, th_variants }, /* Thailand */
+       { "tr",          KBD_TURKISH_Q, tr_variants }, /* Turkey */
+       { "ua",          KBD_UKRAINIAN, ua_variants }, /* Ukraine */
+       { "gb",          KBD_UNITED_KINGDOM, gb_variants }, /* United Kingdom */
+       { "uz",          KBD_UZBEK_CYRILLIC, uz_variants }, /* Uzbekistan */
+       { "vn",          KBD_VIETNAMESE, NULL }, /* Vietnam */
+       { "kr",          KBD_KOREAN_INPUT_SYSTEM_IME_2000, kr_variants }, /* Korea, Republic of */
+       { "ie",          KBD_UNITED_KINGDOM, ie_variants }, /* Ireland */
+       { "pk",          0, pk_variants }, /* Pakistan */
+       { "mv",          0, NULL }, /* Maldives */
+       { "za",          0, NULL }, /* South Africa */
+       { "epo",         0, epo_variants }, /* Esperanto */
+       { "np",          KBD_NEPALI, NULL }, /* Nepal */
+       { "ng",          0, ng_variants }, /* Nigeria */
+       { "et",          0, NULL }, /* Ethiopia */
+       { "sn",          0, NULL }, /* Senegal */
+       { "brai",        0, brai_variants }, /* Braille */
+       { "tm",          KBD_TURKISH_Q, tm_variants }, /* Turkmenistan */
+};
+
+/* OpenSolaris 2008.11 and 2009.06 keyboard layouts
+ *
+ * While OpenSolaris comes with Xorg and XKB, it maintains a set of keyboard layout
+ * names that map directly to a particular keyboard layout in XKB. Fortunately for us,
+ * this way of doing things comes from Solaris, which is XKB unaware. The same keyboard
+ * layout naming system is used in Solaris, so we can use the same XKB configuration as
+ * we would on OpenSolaris and get an accurate keyboard layout detection :)
+ *
+ * We can check for the current keyboard layout using the "kbd -l" command:
+ *
+ * type=6
+ * layout=33 (0x21)
+ * delay(ms)=500
+ * rate(ms)=40
+ *
+ * We can check at runtime if the kbd utility is present, parse the output, and use the
+ * keyboard layout indicated by the index given (in this case, 33, or US-English).
+ */
+
+
+typedef struct _SunOSKeyboard
+{
+       /* Sun keyboard type */
+       int type;
+
+       /* Layout */
+       int layout;
+
+       /* XKB keyboard */
+       char* xkbType;
+
+       /* XKB keyboard layout */
+       unsigned int keyboardLayoutID;
+} SunOSKeyboard;
+
+
+static const SunOSKeyboard SunOSKeyboards[] =
+{
+       { 4,   0,    "sun(type4)",               KBD_US                                 }, /*  US4 */
+       { 4,   1,    "sun(type4)",               KBD_US                                 }, /*  US4 */
+       { 4,   2,    "sun(type4tuv)",            KBD_FRENCH                             }, /*  FranceBelg4 */
+       { 4,   3,    "sun(type4_ca)",            KBD_US                                 }, /*  Canada4 */
+       { 4,   4,    "sun(type4tuv)",            KBD_DANISH                             }, /*  Denmark4 */
+       { 4,   5,    "sun(type4tuv)",            KBD_GERMAN                             }, /*  Germany4 */
+       { 4,   6,    "sun(type4tuv)",            KBD_ITALIAN                            }, /*  Italy4 */
+       { 4,   7,    "sun(type4tuv)",            KBD_DUTCH                              }, /*  Netherland4 */
+       { 4,   8,    "sun(type4tuv)",            KBD_NORWEGIAN                          }, /*  Norway4 */
+       { 4,   9,    "sun(type4tuv)",            KBD_PORTUGUESE                         }, /*  Portugal4 */
+       { 4,   10,   "sun(type4tuv)",            KBD_SPANISH                            }, /*  SpainLatAm4 */
+       { 4,   11,   "sun(type4tuv)",            KBD_SWEDISH                            }, /*  SwedenFin4 */
+       { 4,   12,   "sun(type4tuv)",            KBD_SWISS_FRENCH                       }, /*  Switzer_Fr4 */
+       { 4,   13,   "sun(type4tuv)",            KBD_SWISS_GERMAN                       }, /*  Switzer_Ge4 */
+       { 4,   14,   "sun(type4tuv)",            KBD_UNITED_KINGDOM                     }, /*  UK4 */
+       { 4,   16,   "sun(type4)",               KBD_KOREAN_INPUT_SYSTEM_IME_2000       }, /*  Korea4 */
+       { 4,   17,   "sun(type4)",               KBD_CHINESE_TRADITIONAL_PHONETIC       }, /*  Taiwan4 */
+       { 4,   32,   "sun(type4jp)",             KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002   }, /*  Japan4 */
+       { 4,   19,   "sun(type5)",               KBD_US                                 }, /*  US101A_PC */
+       { 4,   33,   "sun(type5)",               KBD_US                                 }, /*  US5 */
+       { 4,   34,   "sun(type5unix)",           KBD_US                                 }, /*  US_UNIX5 */
+       { 4,   35,   "sun(type5tuv)",            KBD_FRENCH                             }, /*  France5 */
+       { 4,   36,   "sun(type5tuv)",            KBD_DANISH                             }, /*  Denmark5 */
+       { 4,   37,   "sun(type5tuv)",            KBD_GERMAN                             }, /*  Germany5 */
+       { 4,   38,   "sun(type5tuv)",            KBD_ITALIAN                            }, /*  Italy5 */
+       { 4,   39,   "sun(type5tuv)",            KBD_DUTCH                              }, /*  Netherland5 */
+       { 4,   40,   "sun(type5tuv)",            KBD_NORWEGIAN                          }, /*  Norway5 */
+       { 4,   41,   "sun(type5tuv)",            KBD_PORTUGUESE                         }, /*  Portugal5 */
+       { 4,   42,   "sun(type5tuv)",            KBD_SPANISH                            }, /*  Spain5 */
+       { 4,   43,   "sun(type5tuv)",            KBD_SWEDISH                            }, /*  Sweden5 */
+       { 4,   44,   "sun(type5tuv)",            KBD_SWISS_FRENCH                       }, /*  Switzer_Fr5 */
+       { 4,   45,   "sun(type5tuv)",            KBD_SWISS_GERMAN                       }, /*  Switzer_Ge5 */
+       { 4,   46,   "sun(type5tuv)",            KBD_UNITED_KINGDOM                     }, /*  UK5 */
+       { 4,   47,   "sun(type5)",               KBD_KOREAN_INPUT_SYSTEM_IME_2000       }, /*  Korea5 */
+       { 4,   48,   "sun(type5)",               KBD_CHINESE_TRADITIONAL_PHONETIC       }, /*  Taiwan5 */
+       { 4,   49,   "sun(type5jp)",             KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002   }, /*  Japan5 */
+       { 4,   50,   "sun(type5tuv)",            KBD_CANADIAN_FRENCH                    }, /*  Canada_Fr5 */
+       { 4,   51,   "sun(type5tuv)",            KBD_HUNGARIAN                          }, /*  Hungary5 */
+       { 4,   52,   "sun(type5tuv)",            KBD_POLISH_214                         }, /*  Poland5 */
+       { 4,   53,   "sun(type5tuv)",            KBD_CZECH                              }, /*  Czech5 */
+       { 4,   54,   "sun(type5tuv)",            KBD_RUSSIAN                            }, /*  Russia5 */
+       { 4,   55,   "sun(type5tuv)",            KBD_LATVIAN                            }, /*  Latvia5 */
+       { 4,   57,   "sun(type5tuv)",            KBD_GREEK                              }, /*  Greece5 */
+       { 4,   59,   "sun(type5tuv)",            KBD_LITHUANIAN                         }, /*  Lithuania5 */
+       { 4,   63,   "sun(type5tuv)",            KBD_CANADIAN_FRENCH                    }, /*  Canada_Fr5_TBITS5 */
+       { 4,   56,   "sun(type5tuv)",            KBD_TURKISH_Q                          }, /*  TurkeyQ5 */
+       { 4,   58,   "sun(type5tuv)",            KBD_ARABIC_101                         }, /*  Arabic5 */
+       { 4,   60,   "sun(type5tuv)",            KBD_BELGIAN_FRENCH                     }, /*  Belgian5 */
+       { 4,   62,   "sun(type5tuv)",            KBD_TURKISH_F                          }, /*  TurkeyF5 */
+       { 4,   80,   "sun(type5hobo)",           KBD_US                                 }, /*  US5_Hobo */
+       { 4,   81,   "sun(type5hobo)",           KBD_US                                 }, /*  US_UNIX5_Hobo */
+       { 4,   82,   "sun(type5tuvhobo)",        KBD_FRENCH                             }, /*  France5_Hobo */
+       { 4,   83,   "sun(type5tuvhobo)",        KBD_DANISH                             }, /*  Denmark5_Hobo */
+       { 4,   84,   "sun(type5tuvhobo)",        KBD_GERMAN                             }, /*  Germany5_Hobo */
+       { 4,   85,   "sun(type5tuvhobo)",        KBD_ITALIAN                            }, /*  Italy5_Hobo */
+       { 4,   86,   "sun(type5tuvhobo)",        KBD_DUTCH                              }, /*  Netherland5_Hobo */
+       { 4,   87,   "sun(type5tuvhobo)",        KBD_NORWEGIAN                          }, /*  Norway5_Hobo */
+       { 4,   88,   "sun(type5tuvhobo)",        KBD_PORTUGUESE                         }, /*  Portugal5_Hobo */
+       { 4,   89,   "sun(type5tuvhobo)",        KBD_SPANISH                            }, /*  Spain5_Hobo */
+       { 4,   90,   "sun(type5tuvhobo)",        KBD_SWEDISH                            }, /*  Sweden5_Hobo */
+       { 4,   91,   "sun(type5tuvhobo)",        KBD_SWISS_FRENCH                       }, /*  Switzer_Fr5_Hobo */
+       { 4,   92,   "sun(type5tuvhobo)",        KBD_SWISS_GERMAN                       }, /*  Switzer_Ge5_Hobo */
+       { 4,   93,   "sun(type5tuvhobo)",        KBD_UNITED_KINGDOM                     }, /*  UK5_Hobo */
+       { 4,   94,   "sun(type5hobo)",           KBD_KOREAN_INPUT_SYSTEM_IME_2000       }, /*  Korea5_Hobo */
+       { 4,   95,   "sun(type5hobo)",           KBD_CHINESE_TRADITIONAL_PHONETIC       }, /*  Taiwan5_Hobo */
+       { 4,   96,   "sun(type5jphobo)",         KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002   }, /*  Japan5_Hobo */
+       { 4,   97,   "sun(type5tuvhobo)",        KBD_CANADIAN_FRENCH                    }, /*  Canada_Fr5_Hobo */
+       { 101, 1,    "digital_vndr/pc(pc104)",   KBD_US                                 }, /*  US101A_x86 */
+       { 101, 34,   "digital_vndr/pc(pc104)",   KBD_US                                 }, /*  J3100_x86 */
+       { 101, 35,   "digital_vndr/pc(pc104)",   KBD_FRENCH                             }, /*  France_x86 */
+       { 101, 36,   "digital_vndr/pc(pc104)",   KBD_DANISH                             }, /*  Denmark_x86 */
+       { 101, 37,   "digital_vndr/pc(pc104)",   KBD_GERMAN                             }, /*  Germany_x86 */
+       { 101, 38,   "digital_vndr/pc(pc104)",   KBD_ITALIAN                            }, /*  Italy_x86 */
+       { 101, 39,   "digital_vndr/pc(pc104)",   KBD_DUTCH                              }, /*  Netherland_x86 */
+       { 101, 40,   "digital_vndr/pc(pc104)",   KBD_NORWEGIAN                          }, /*  Norway_x86 */
+       { 101, 41,   "digital_vndr/pc(pc104)",   KBD_PORTUGUESE                         }, /*  Portugal_x86 */
+       { 101, 42,   "digital_vndr/pc(pc104)",   KBD_SPANISH                            }, /*  Spain_x86 */
+       { 101, 43,   "digital_vndr/pc(pc104)",   KBD_SWEDISH                            }, /*  Sweden_x86 */
+       { 101, 44,   "digital_vndr/pc(pc104)",   KBD_SWISS_FRENCH                       }, /*  Switzer_Fr_x86 */
+       { 101, 45,   "digital_vndr/pc(pc104)",   KBD_SWISS_GERMAN                       }, /*  Switzer_Ge_x86 */
+       { 101, 46,   "digital_vndr/pc(pc104)",   KBD_UNITED_KINGDOM                     }, /*  UK_x86 */
+       { 101, 47,   "digital_vndr/pc(pc104)",   KBD_KOREAN_INPUT_SYSTEM_IME_2000       }, /*  Korea_x86 */
+       { 101, 48,   "digital_vndr/pc(pc104)",   KBD_CHINESE_TRADITIONAL_PHONETIC       }, /*  Taiwan_x86 */
+       { 101, 49,   "digital_vndr/pc(lk411jj)", KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002   }, /*  Japan_x86 */
+       { 101, 50,   "digital_vndr/pc(pc104)",   KBD_CANADIAN_FRENCH                    }, /*  Canada_Fr2_x86 */
+       { 101, 51,   "digital_vndr/pc(pc104)",   KBD_HUNGARIAN                          }, /*  Hungary_x86 */
+       { 101, 52,   "digital_vndr/pc(pc104)",   KBD_POLISH_214                         }, /*  Poland_x86 */
+       { 101, 53,   "digital_vndr/pc(pc104)",   KBD_CZECH                              }, /*  Czech_x86 */
+       { 101, 54,   "digital_vndr/pc(pc104)",   KBD_RUSSIAN                            }, /*  Russia_x86 */
+       { 101, 55,   "digital_vndr/pc(pc104)",   KBD_LATVIAN                            }, /*  Latvia_x86 */
+       { 101, 56,   "digital_vndr/pc(pc104)",   KBD_TURKISH_Q                          }, /*  Turkey_x86 */
+       { 101, 57,   "digital_vndr/pc(pc104)",   KBD_GREEK                              }, /*  Greece_x86 */
+       { 101, 59,   "digital_vndr/pc(pc104)",   KBD_LITHUANIAN                         }, /*  Lithuania_x86 */
+       { 101, 1001, "digital_vndr/pc(pc104)",   KBD_US                                 }, /*  MS_US101A_x86 */
+       { 6,   6,    "sun(type6tuv)",            KBD_DANISH                             }, /*  Denmark6_usb */
+       { 6,   7,    "sun(type6tuv)",            KBD_FINNISH                            }, /*  Finnish6_usb */
+       { 6,   8,    "sun(type6tuv)",            KBD_FRENCH                             }, /*  France6_usb */
+       { 6,   9,    "sun(type6tuv)",            KBD_GERMAN                             }, /*  Germany6_usb */
+       { 6,   14,   "sun(type6tuv)",            KBD_ITALIAN                            }, /*  Italy6_usb */
+       { 6,   15,   "sun(type6jp)",             KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002   }, /*  Japan7_usb */
+       { 6,   16,   "sun(type6)",               KBD_KOREAN_INPUT_SYSTEM_IME_2000       }, /*  Korea6_usb */
+       { 6,   18,   "sun(type6tuv)",            KBD_DUTCH                              }, /*  Netherland6_usb */
+       { 6,   19,   "sun(type6tuv)",            KBD_NORWEGIAN                          }, /*  Norway6_usb */
+       { 6,   22,   "sun(type6tuv)",            KBD_PORTUGUESE                         }, /*  Portugal6_usb */
+       { 6,   23,   "sun(type6tuv)",            KBD_RUSSIAN                            }, /*  Russia6_usb */
+       { 6,   25,   "sun(type6tuv)",            KBD_SPANISH                            }, /*  Spain6_usb */
+       { 6,   26,   "sun(type6tuv)",            KBD_SWEDISH                            }, /*  Sweden6_usb */
+       { 6,   27,   "sun(type6tuv)",            KBD_SWISS_FRENCH                       }, /*  Switzer_Fr6_usb */
+       { 6,   28,   "sun(type6tuv)",            KBD_SWISS_GERMAN                       }, /*  Switzer_Ge6_usb */
+       { 6,   30,   "sun(type6)",               KBD_CHINESE_TRADITIONAL_PHONETIC       }, /*  Taiwan6_usb */
+       { 6,   32,   "sun(type6tuv)",            KBD_UNITED_KINGDOM                     }, /*  UK6_usb */
+       { 6,   33,   "sun(type6)",               KBD_US                                 }, /*  US6_usb */
+       { 6,   1,    "sun(type6tuv)",            KBD_ARABIC_101                         }, /*  Arabic6_usb */
+       { 6,   2,    "sun(type6tuv)",            KBD_BELGIAN_FRENCH                     }, /*  Belgian6_usb */
+       { 6,   31,   "sun(type6tuv)",            KBD_TURKISH_Q                          }, /*  TurkeyQ6_usb */
+       { 6,   35,   "sun(type6tuv)",            KBD_TURKISH_F                          }, /*  TurkeyF6_usb */
+       { 6,   271,  "sun(type6jp)",             KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002   }, /*  Japan6_usb */
+       { 6,   264,  "sun(type6tuv)",            KBD_ALBANIAN                           }, /*  Albanian6_usb */
+       { 6,   261,  "sun(type6tuv)",            KBD_BELARUSIAN                         }, /*  Belarusian6_usb */
+       { 6,   260,  "sun(type6tuv)",            KBD_BULGARIAN                          }, /*  Bulgarian6_usb */
+       { 6,   259,  "sun(type6tuv)",            KBD_CROATIAN                           }, /*  Croatian6_usb */
+       { 6,   5,    "sun(type6tuv)",            KBD_CZECH                              }, /*  Czech6_usb */
+       { 6,   4,    "sun(type6tuv)",            KBD_CANADIAN_FRENCH                    }, /*  French-Canadian6_usb */
+       { 6,   12,   "sun(type6tuv)",            KBD_HUNGARIAN                          }, /*  Hungarian6_usb */
+       { 6,   10,   "sun(type6tuv)",            KBD_GREEK                              }, /*  Greek6_usb */
+       { 6,   17,   "sun(type6)",               KBD_LATIN_AMERICAN                     }, /*  Latin-American6_usb */
+       { 6,   265,  "sun(type6tuv)",            KBD_LITHUANIAN                         }, /*  Lithuanian6_usb */
+       { 6,   266,  "sun(type6tuv)",            KBD_LATVIAN                            }, /*  Latvian6_usb */
+       { 6,   267,  "sun(type6tuv)",            KBD_FYRO_MACEDONIAN                    }, /*  Macedonian6_usb */
+       { 6,   263,  "sun(type6tuv)",            KBD_MALTESE_47_KEY                     }, /*  Malta_UK6_usb */
+       { 6,   262,  "sun(type6tuv)",            KBD_MALTESE_48_KEY                     }, /*  Malta_US6_usb */
+       { 6,   21,   "sun(type6tuv)",            KBD_POLISH_214                         }, /*  Polish6_usb */
+       { 6,   257,  "sun(type6tuv)",            KBD_SERBIAN_LATIN                      }, /*  Serbia-And-Montenegro6_usb */
+       { 6,   256,  "sun(type6tuv)",            KBD_SLOVENIAN                          }, /*  Slovenian6_usb */
+       { 6,   24,   "sun(type6tuv)",            KBD_SLOVAK                             }, /*  Slovakian6_usb */
+       { 6,   3,    "sun(type6)",               KBD_CANADIAN_MULTILINGUAL_STANDARD     }, /*  Canada_Bi6_usb */
+       { 6,   272,  "sun(type6)",               KBD_PORTUGUESE_BRAZILIAN_ABNT          }  /*  Brazil6_usb */
+};
+
+unsigned int find_keyboard_layout_in_xorg_rules(char* layout, char* variant)
+{
+       int i;
+       int j;
+
+       if ((layout == NULL) || (variant == NULL))
+               return 0;
+
+       DEBUG_KBD("xkbLayout: %s\txkbVariant: %s\n", layout, variant);
+
+       for (i = 0; i < sizeof(xkbLayouts) / sizeof(xkbLayout); i++)
+       {
+               if (strcmp(xkbLayouts[i].layout, layout) == 0)
+               {
+                       for (j = 0; xkbLayouts[i].variants[j].variant != NULL && strlen(xkbLayouts[i].variants[j].variant) > 0; j++)
+                       {
+                               if (strcmp(xkbLayouts[i].variants[j].variant, variant) == 0)
+                               {
+                                       return xkbLayouts[i].variants[j].keyboardLayoutID;
+                               }
+                       }
+
+                       return xkbLayouts[i].keyboardLayoutID;
+               }
+       }
+
+       return 0;
+}
+
+#if defined(sun)
+
+unsigned int detect_keyboard_type_and_layout_sunos(char* xkbfile, int length)
+{
+       FILE* kbd;
+
+       int i;
+       int type = 0;
+       int layout = 0;
+
+       char* pch;
+       char* beg;
+       char* end;
+
+       char buffer[1024];
+
+       /*
+               Sample output for "kbd -t -l" :
+
+               USB keyboard
+               type=6
+               layout=3 (0x03)
+               delay(ms)=500
+               rate(ms)=40
+       */
+
+       kbd = popen("kbd -t -l", "r");
+
+       if (kbd < 0)
+               return 0;
+
+       while(fgets(buffer, sizeof(buffer), kbd) != NULL)
+       {
+               if((pch = strstr(buffer, "type=")) != NULL)
+               {
+                       beg = pch + sizeof("type=") - 1;
+                       end = strchr(beg, '\n');
+                       end[0] = '\0';
+                       type = atoi(beg);
+               }
+               else if((pch = strstr(buffer, "layout=")) != NULL)
+               {
+                       beg = pch + sizeof("layout=") - 1;
+                       end = strchr(beg, ' ');
+                       end[0] = '\0';
+                       layout = atoi(beg);
+               }
+       }
+       pclose(kbd);
+
+       for(i = 0; i < sizeof(SunOSKeyboards) / sizeof(SunOSKeyboard); i++)
+       {
+               if(SunOSKeyboards[i].type == type)
+               {
+                       if(SunOSKeyboards[i].layout == layout)
+                       {
+                               strncpy(xkbfile, SunOSKeyboards[i].xkbType, length);
+                               return SunOSKeyboards[i].keyboardLayoutID;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+#endif
diff --git a/libfreerdp-kbd/x_layout_id_table.h b/libfreerdp-kbd/x_layout_id_table.h
new file mode 100644 (file)
index 0000000..11db11a
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * XKB-based Keyboard Mapping to Microsoft Keyboard System
+ *
+ * Copyright 2009 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Hardcoded mapping from xkb layout names and variants to RDP layout ids */
+
+#ifndef __LAYOUTS_X_H
+#define __LAYOUTS_X_H
+
+unsigned int find_keyboard_layout_in_xorg_rules(char* layout, char* variant);
+
+#if defined(sun)
+unsigned int detect_keyboard_type_and_layout_sunos(char* xkbfile, int length);
+#endif
+
+#endif
diff --git a/libfreerdp-rail/CMakeLists.txt b/libfreerdp-rail/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b864852
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-rail cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(FREERDP_RAIL_SRCS
+       window_list.c
+       window.c
+       icon.c
+       rail.c
+       librail.h)
+
+add_library(freerdp-rail ${FREERDP_RAIL_SRCS})
+
+set_target_properties(freerdp-rail PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+
+target_link_libraries(freerdp-rail freerdp-utils)
+
+install(TARGETS freerdp-rail DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/libfreerdp-rail/icon.c b/libfreerdp-rail/icon.c
new file mode 100644 (file)
index 0000000..3a9e167
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Window Icon Cache
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/unicode.h>
+
+#include <freerdp/rail/icon.h>
+
+ICON_INFO* icon_cache_get(rdpIconCache* cache, uint8 id, uint16 index, void** extra)
+{
+       ICON_INFO* entry;
+
+       if (id >= cache->numCaches)
+       {
+               printf("invalid window icon cache id:%d\n", id);
+               return (ICON_INFO*) NULL;
+       }
+
+       if (index >= cache->numCacheEntries)
+       {
+               printf("invalid window icon cache index:%d in cache id:%d\n", index, id);
+               return (ICON_INFO*) NULL;
+       }
+
+       entry = cache->caches[id].entries[index].entry;
+
+       if (extra != NULL)
+               *extra = cache->caches[id].entries[index].extra;
+
+       return entry;
+}
+
+void icon_cache_put(rdpIconCache* cache, uint8 id, uint16 index, ICON_INFO* entry, void* extra)
+{
+       if (id >= cache->numCaches)
+       {
+               printf("invalid window icon cache id:%d\n", id);
+               return;
+       }
+
+       if (index >= cache->numCacheEntries)
+       {
+               printf("invalid window icon cache index:%d in cache id:%d\n", index, id);
+               return;
+       }
+
+       cache->caches[id].entries[index].entry = entry;
+
+       if (extra != NULL)
+               cache->caches[id].entries[index].extra = extra;
+}
+
+rdpIconCache* icon_cache_new(rdpRail* rail)
+{
+       rdpIconCache* cache;
+
+       cache = (rdpIconCache*) xzalloc(sizeof(rdpIconCache));
+
+       if (cache != NULL)
+       {
+               int i;
+
+               cache->rail = rail;
+               cache->numCaches = (uint8) rail->settings->num_icon_cache_entries;
+               cache->numCacheEntries = rail->settings->num_icon_cache_entries;
+
+               cache->caches = xzalloc(cache->numCaches * sizeof(WINDOW_ICON_CACHE));
+
+               for (i = 0; i < cache->numCaches; i++)
+               {
+                       cache->caches[i].entries = xzalloc(cache->numCacheEntries * sizeof(rdpIconCache));
+               }
+       }
+
+       return cache;
+}
+
+void icon_cache_free(rdpIconCache* cache)
+{
+       if (cache != NULL)
+       {
+               int i;
+
+               for (i = 0; i < cache->numCaches; i++)
+               {
+                       xfree(cache->caches[i].entries);
+               }
+
+               xfree(cache->caches);
+
+               xfree(cache);
+       }
+}
+
diff --git a/libfreerdp-rail/librail.h b/libfreerdp-rail/librail.h
new file mode 100644 (file)
index 0000000..50bd07b
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Remote Applications Integrated Locally (RAIL)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LIBRAIL_H
+#define __LIBRAIL_H
+
+#include <freerdp/utils/debug.h>
+
+#ifdef WITH_DEBUG_RAIL
+#define DEBUG_RAIL(fmt, ...) DEBUG_CLASS(RAIL, fmt, ## __VA_ARGS__)
+#else
+#define DEBUG_RAIL(fmt, ...) DEBUG_NULL(fmt, ## __VA_ARGS__)
+#endif
+
+#endif /* __LIBRAIL_H */
diff --git a/libfreerdp-rail/rail.c b/libfreerdp-rail/rail.c
new file mode 100644 (file)
index 0000000..ead0cc3
--- /dev/null
@@ -0,0 +1,149 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Remote Applications Integrated Locally (RAIL)
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include "librail.h"
+
+#include <freerdp/rail/rail.h>
+#include <freerdp/rail/window_list.h>
+
+static void rail_WindowCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
+{
+       rdpRail* rail = context->rail;
+       window_list_create(rail->list, orderInfo, window_state);
+}
+
+static void rail_WindowUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
+{
+       rdpRail* rail = context->rail;
+       window_list_update(rail->list, orderInfo, window_state);
+}
+
+static void rail_WindowDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
+{
+       rdpRail* rail = context->rail;
+       window_list_delete(rail->list, orderInfo);
+}
+
+static void rail_WindowIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* window_icon)
+{
+       rdpIcon* icon;
+       rdpWindow* window;
+       rdpRail* rail = context->rail;
+
+       if (window_icon->iconInfo->cacheEntry != 0xFFFF)
+       {
+               /* cache icon */
+       }
+
+       window = window_list_get_by_id(rail->list, orderInfo->windowId);
+
+       icon = (rdpIcon*) xzalloc(sizeof(rdpIcon));
+       icon->entry = window_icon->iconInfo;
+       icon->big = (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ICON_BIG) ? true : false;
+
+       DEBUG_RAIL("Window Icon: %dx%d@%dbpp cbBitsColor:%d cbBitsMask:%d cbColorTable:%d",
+                       window_icon->iconInfo->width, window_icon->iconInfo->height, window_icon->iconInfo->bpp,
+                       window_icon->iconInfo->cbBitsColor, window_icon->iconInfo->cbBitsMask, window_icon->iconInfo->cbColorTable);
+
+       if (icon->big)
+               window->bigIcon = icon;
+       else
+               window->smallIcon = icon;
+
+       IFCALL(rail->rail_SetWindowIcon, rail, window, icon);
+}
+
+static void rail_WindowCachedIcon(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* window_cached_icon)
+{
+
+}
+
+static void rail_NotifyIconCreate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state)
+{
+
+}
+
+static void rail_NotifyIconUpdate(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notify_icon_state)
+{
+
+}
+
+static void rail_NotifyIconDelete(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
+{
+
+}
+
+static void rail_MonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitored_desktop)
+{
+
+}
+
+static void rail_NonMonitoredDesktop(rdpContext* context, WINDOW_ORDER_INFO* orderInfo)
+{
+
+}
+
+void rail_register_update_callbacks(rdpRail* rail, rdpUpdate* update)
+{
+       rdpWindowUpdate* window = update->window;
+
+       window->WindowCreate = rail_WindowCreate;
+       window->WindowUpdate = rail_WindowUpdate;
+       window->WindowDelete = rail_WindowDelete;
+       window->WindowIcon = rail_WindowIcon;
+       window->WindowCachedIcon = rail_WindowCachedIcon;
+       window->NotifyIconCreate = rail_NotifyIconCreate;
+       window->NotifyIconUpdate = rail_NotifyIconUpdate;
+       window->NotifyIconDelete = rail_NotifyIconDelete;
+       window->MonitoredDesktop = rail_MonitoredDesktop;
+       window->NonMonitoredDesktop = rail_NonMonitoredDesktop;
+}
+
+rdpRail* rail_new(rdpSettings* settings)
+{
+       rdpRail* rail;
+
+       rail = (rdpRail*) xzalloc(sizeof(rdpRail));
+
+       if (rail != NULL)
+       {
+               rail->settings = settings;
+               rail->cache = icon_cache_new(rail);
+               rail->list = window_list_new(rail);
+               rail->uniconv = freerdp_uniconv_new();
+               rail->clrconv = (CLRCONV*) xzalloc(sizeof(CLRCONV));
+       }
+
+       return rail;
+}
+
+void rail_free(rdpRail* rail)
+{
+       if (rail != NULL)
+       {
+               icon_cache_free(rail->cache);
+               window_list_free(rail->list);
+               freerdp_uniconv_free(rail->uniconv);
+               xfree(rail->clrconv);
+               xfree(rail);
+       }
+}
diff --git a/libfreerdp-rail/window.c b/libfreerdp-rail/window.c
new file mode 100644 (file)
index 0000000..39e7cb7
--- /dev/null
@@ -0,0 +1,384 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RAIL Windows
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/hexdump.h>
+#include <freerdp/utils/unicode.h>
+
+#include "librail.h"
+
+#include <freerdp/rail/window.h>
+
+struct _WINDOW_STYLE
+{
+       uint32 style;
+       const char* name;
+       boolean multi;
+};
+typedef struct _WINDOW_STYLE WINDOW_STYLE;
+
+static const WINDOW_STYLE WINDOW_STYLES[] =
+{
+       { WS_BORDER, "WS_BORDER", false },
+       { WS_CAPTION, "WS_CAPTION", false },
+       { WS_CHILD, "WS_CHILD", false },
+       { WS_CLIPCHILDREN, "WS_CLIPCHILDREN", false },
+       { WS_CLIPSIBLINGS, "WS_CLIPSIBLINGS", false },
+       { WS_DISABLED, "WS_DISABLED", false },
+       { WS_DLGFRAME, "WS_DLGFRAME", false },
+       { WS_GROUP, "WS_GROUP", false },
+       { WS_HSCROLL, "WS_HSCROLL", false },
+       { WS_ICONIC, "WS_ICONIC", false },
+       { WS_MAXIMIZE, "WS_MAXIMIZE", false },
+       { WS_MAXIMIZEBOX, "WS_MAXIMIZEBOX", false },
+       { WS_MINIMIZE, "WS_MINIMIZE", false },
+       { WS_MINIMIZEBOX, "WS_MINIMIZEBOX", false },
+       { WS_OVERLAPPED, "WS_OVERLAPPED", false },
+       { WS_OVERLAPPEDWINDOW, "WS_OVERLAPPEDWINDOW", true },
+       { WS_POPUP, "WS_POPUP", false },
+       { WS_POPUPWINDOW, "WS_POPUPWINDOW", true },
+       { WS_SIZEBOX, "WS_SIZEBOX", false },
+       { WS_SYSMENU, "WS_SYSMENU", false },
+       { WS_TABSTOP, "WS_TABSTOP", false },
+       { WS_THICKFRAME, "WS_THICKFRAME", false },
+       { WS_VISIBLE, "WS_VISIBLE", false }
+};
+
+static const WINDOW_STYLE EXTENDED_WINDOW_STYLES[] =
+{
+       { WS_EX_ACCEPTFILES, "WS_EX_ACCEPTFILES", false },
+       { WS_EX_APPWINDOW, "WS_EX_APPWINDOW", false },
+       { WS_EX_CLIENTEDGE, "WS_EX_CLIENTEDGE", false },
+       { WS_EX_COMPOSITED, "WS_EX_COMPOSITED", false },
+       { WS_EX_CONTEXTHELP, "WS_EX_CONTEXTHELP", false },
+       { WS_EX_CONTROLPARENT, "WS_EX_CONTROLPARENT", false },
+       { WS_EX_DLGMODALFRAME, "WS_EX_DLGMODALFRAME", false },
+       { WS_EX_LAYERED, "WS_EX_LAYERED", false },
+       { WS_EX_LAYOUTRTL, "WS_EX_LAYOUTRTL", false },
+       { WS_EX_LEFT, "WS_EX_LEFT", false },
+       { WS_EX_LEFTSCROLLBAR, "WS_EX_LEFTSCROLLBAR", false },
+       { WS_EX_LTRREADING, "WS_EX_LTRREADING", false },
+       { WS_EX_MDICHILD, "WS_EX_MDICHILD", false },
+       { WS_EX_NOACTIVATE, "WS_EX_NOACTIVATE", false },
+       { WS_EX_NOINHERITLAYOUT, "WS_EX_NOINHERITLAYOUT", false },
+       { WS_EX_NOPARENTNOTIFY, "WS_EX_NOPARENTNOTIFY", false },
+       { WS_EX_OVERLAPPEDWINDOW, "WS_EX_OVERLAPPEDWINDOW", true },
+       { WS_EX_PALETTEWINDOW, "WS_EX_PALETTEWINDOW", true },
+       { WS_EX_RIGHT, "WS_EX_RIGHT", false },
+       { WS_EX_RIGHTSCROLLBAR, "WS_EX_RIGHTSCROLLBAR", false },
+       { WS_EX_RTLREADING, "WS_EX_RTLREADING", false },
+       { WS_EX_STATICEDGE, "WS_EX_STATICEDGE", false },
+       { WS_EX_TOOLWINDOW, "WS_EX_TOOLWINDOW", false },
+       { WS_EX_TOPMOST, "WS_EX_TOPMOST", false },
+       { WS_EX_TRANSPARENT, "WS_EX_TRANSPARENT", false },
+       { WS_EX_WINDOWEDGE, "WS_EX_WINDOWEDGE", false }
+};
+
+void print_window_styles(uint32 style)
+{
+       int i;
+
+       printf("Window Styles:\n{\n");
+       for (i = 0; i < sizeof(WINDOW_STYLES) / sizeof(WINDOW_STYLE); i++)
+       {
+               if (style & WINDOW_STYLES[i].style)
+               {
+                       if (WINDOW_STYLES[i].multi)
+                       {
+                               if ((style & WINDOW_STYLES[i].style) != WINDOW_STYLES[i].style)
+                                               continue;
+                       }
+
+                       printf("\t%s\n", WINDOW_STYLES[i].name);
+               }
+       }
+       printf("}\n");
+}
+
+void print_extended_window_styles(uint32 style)
+{
+       int i;
+
+       printf("Extended Window Styles:\n{\n");
+       for (i = 0; i < sizeof(EXTENDED_WINDOW_STYLES) / sizeof(WINDOW_STYLE); i++)
+       {
+               if (style & EXTENDED_WINDOW_STYLES[i].style)
+               {
+                       if (EXTENDED_WINDOW_STYLES[i].multi)
+                       {
+                               if ((style & EXTENDED_WINDOW_STYLES[i].style) != EXTENDED_WINDOW_STYLES[i].style)
+                                               continue;
+                       }
+
+                       printf("\t%s\n", EXTENDED_WINDOW_STYLES[i].name);
+               }
+       }
+       printf("}\n");
+}
+
+void window_state_update(rdpWindow* window, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
+{
+       window->fieldFlags = orderInfo->fieldFlags;
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
+       {
+               window->ownerWindowId = window_state->ownerWindowId;
+               DEBUG_RAIL("ownerWindowId:0x%08X", window->ownerWindowId);
+       }
+
+       DEBUG_RAIL("windowId=0x%X ownerWindowId=0x%X",
+                       window->windowId, window->ownerWindowId);
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
+       {
+               window->style = window_state->style;
+               window->extendedStyle = window_state->extendedStyle;
+
+#ifdef WITH_DEBUG_RAIL
+               print_window_styles(window->style);
+               print_extended_window_styles(window->extendedStyle);
+#endif
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
+       {
+               window->showState = window_state->showState;
+               DEBUG_RAIL("ShowState:%d", window->showState);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
+       {
+               window->titleInfo.length = window_state->titleInfo.length;
+               window->titleInfo.string = xmalloc(window_state->titleInfo.length);
+               memcpy(window->titleInfo.string, window_state->titleInfo.string, window->titleInfo.length);
+
+#ifdef WITH_DEBUG_RAIL
+               freerdp_hexdump(window->titleInfo.string, window->titleInfo.length);
+#endif
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
+       {
+               window->clientOffsetX = window_state->clientOffsetX;
+               window->clientOffsetY = window_state->clientOffsetY;
+
+               DEBUG_RAIL("Client Area Offset: (%d, %d)",
+                               window->clientOffsetX, window->clientOffsetY);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
+       {
+               window->clientAreaWidth = window_state->clientAreaWidth;
+               window->clientAreaHeight = window_state->clientAreaHeight;
+
+               DEBUG_RAIL("Client Area Size: (%d, %d)",
+                               window->clientAreaWidth, window->clientAreaHeight);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
+       {
+               window->RPContent = window_state->RPContent;
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
+       {
+               window->rootParentHandle = window_state->rootParentHandle;
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET)
+       {
+               window->windowOffsetX = window_state->windowOffsetX;
+               window->windowOffsetY = window_state->windowOffsetY;
+
+               DEBUG_RAIL("Window Offset: (%d, %d)",
+                               window->windowOffsetX, window->windowOffsetY);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
+       {
+               window->windowClientDeltaX = window_state->windowClientDeltaX;
+               window->windowClientDeltaY = window_state->windowClientDeltaY;
+
+               DEBUG_RAIL("Window Client Delta: (%d, %d)",
+                               window->windowClientDeltaX, window->windowClientDeltaY);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)
+       {
+               window->windowWidth = window_state->windowWidth;
+               window->windowHeight = window_state->windowHeight;
+
+               DEBUG_RAIL("Window Size: (%d, %d)",
+                               window->windowWidth, window->windowHeight);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
+       {
+               int i;
+
+               if (window->windowRects != NULL)
+                       xfree(window->windowRects);
+
+               window->windowRects = window_state->windowRects;
+               window->numWindowRects = window_state->numWindowRects;
+
+               for (i = 0; i < (int) window_state->numWindowRects; i++)
+               {
+                       DEBUG_RAIL("Window Rect #%d: left:%d top:%d right:%d bottom:%d", i,
+                                       window_state->windowRects[i].left, window_state->windowRects[i].top,
+                                       window_state->windowRects[i].right, window_state->windowRects[i].bottom);
+               }
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
+       {
+               window->visibleOffsetX = window_state->visibleOffsetX;
+               window->visibleOffsetY = window_state->visibleOffsetY;
+
+               DEBUG_RAIL("Window Visible Offset: (%d, %d)",
+                               window->visibleOffsetX, window->visibleOffsetY);
+       }
+
+       if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
+       {
+               int i;
+
+               if (window->visibilityRects != NULL)
+                       xfree(window->visibilityRects);
+
+               window->visibilityRects = window_state->visibilityRects;
+               window->numVisibilityRects = window_state->numVisibilityRects;
+
+               for (i = 0; i < (int) window_state->numVisibilityRects; i++)
+               {
+                       DEBUG_RAIL("Visibility Rect #%d: left:%d top:%d right:%d bottom:%d", i,
+                                       window_state->visibilityRects[i].left, window_state->visibilityRects[i].top,
+                                       window_state->visibilityRects[i].right, window_state->visibilityRects[i].bottom);
+               }
+       }
+}
+
+void rail_CreateWindow(rdpRail* rail, rdpWindow* window)
+{
+       if (window->titleInfo.length > 0)
+       {
+               window->title = freerdp_uniconv_in(rail->uniconv, window->titleInfo.string, window->titleInfo.length);
+       }
+       else
+       {
+               window->title = (char*) xmalloc(sizeof("RAIL"));
+               memcpy(window->title, "RAIL", sizeof("RAIL"));
+       }
+
+       IFCALL(rail->rail_CreateWindow, rail, window);
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
+       {
+               IFCALL(rail->rail_SetWindowRects, rail, window);
+       }
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
+       {
+               IFCALL(rail->rail_SetWindowVisibilityRects, rail, window);
+       }
+}
+
+void rail_UpdateWindow(rdpRail* rail, rdpWindow* window)
+{
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
+       {
+               IFCALL(rail->rail_ShowWindow, rail, window, window->showState);
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
+       {
+               if (window->title != NULL)
+                       xfree(window->title);
+
+               window->title = freerdp_uniconv_in(rail->uniconv, window->titleInfo.string, window->titleInfo.length);
+
+               IFCALL(rail->rail_SetWindowText, rail, window);
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
+       {
+
+       }
+
+       if ((window->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET) ||
+                       (window->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE))
+       {
+               IFCALL(rail->rail_MoveWindow, rail, window);
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
+       {
+               IFCALL(rail->rail_SetWindowRects, rail, window);
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
+       {
+
+       }
+
+       if (window->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
+       {
+               IFCALL(rail->rail_SetWindowVisibilityRects, rail, window);
+       }
+}
+
+void rail_DestroyWindow(rdpRail* rail, rdpWindow* window)
+{
+       IFCALL(rail->rail_DestroyWindow, rail, window);
+
+       if (window != NULL)
+       {
+               xfree(window);
+       }
+}
diff --git a/libfreerdp-rail/window_list.c b/libfreerdp-rail/window_list.c
new file mode 100644 (file)
index 0000000..3408011
--- /dev/null
@@ -0,0 +1,200 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * RAIL Window List
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/memory.h>
+
+#include "librail.h"
+
+#include <freerdp/rail/window_list.h>
+
+void window_list_rewind(rdpWindowList* list)
+{
+       list->iterator = list->head;
+}
+
+boolean window_list_has_next(rdpWindowList* list)
+{
+       if (list->iterator != NULL)
+       {
+               if (list->iterator != NULL)
+                       return true;
+       }
+
+       return false;
+}
+
+rdpWindow* window_list_get_next(rdpWindowList* list)
+{
+       rdpWindow* next = NULL;
+
+       if (list->iterator != NULL)
+       {
+               next = list->iterator;
+               list->iterator = list->iterator->next;
+       }
+
+       return next;
+}
+
+rdpWindow* window_list_get_by_extra_id(rdpWindowList* list, void* extraId)
+{
+       rdpWindow* window;
+
+       window = list->head;
+
+       if (window == NULL)
+               return NULL;
+
+       while (window != NULL)
+       {
+               if (window->extraId == extraId)
+                       return window;
+
+               window = window->next;
+       }
+
+       return NULL;
+}
+
+rdpWindow* window_list_get_by_id(rdpWindowList* list, uint32 windowId)
+{
+       rdpWindow* window;
+
+       window = list->head;
+
+       if (window == NULL)
+               return NULL;
+
+       while (window != NULL)
+       {
+               if (window->windowId == windowId)
+                       return window;
+
+               window = window->next;
+       }
+
+       return NULL;
+}
+
+void window_list_create(rdpWindowList* list, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
+{
+       rdpWindow* window;
+
+       window = (rdpWindow*) xzalloc(sizeof(rdpWindow));
+
+       if (window == NULL)
+               return;
+
+       window->windowId = orderInfo->windowId;
+
+       if (list->head == NULL)
+       {
+               list->head = list->tail = window;
+               window->prev = NULL;
+               window->next = NULL;
+       }
+       else
+       {
+               window->prev = list->tail;
+               list->tail->next = window;
+               window->next = NULL;
+               list->tail = window;
+       }
+
+       window->windowId = orderInfo->windowId;
+
+       window_state_update(window, orderInfo, window_state);
+
+       rail_CreateWindow(list->rail, window);
+}
+
+void window_list_update(rdpWindowList* list, WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* window_state)
+{
+       rdpWindow* window;
+
+       window = window_list_get_by_id(list, orderInfo->windowId);
+
+       if (window == NULL)
+               return;
+
+       window_state_update(window, orderInfo, window_state);
+
+       rail_UpdateWindow(list->rail, window);
+}
+
+void window_list_delete(rdpWindowList* list, WINDOW_ORDER_INFO* orderInfo)
+{
+       rdpWindow* prev;
+       rdpWindow* next;
+       rdpWindow* window;
+
+       window = window_list_get_by_id(list, orderInfo->windowId);
+
+       if (window == NULL)
+               return;
+
+       prev = window->prev;
+       next = window->next;
+
+       if (prev != NULL)
+               prev->next = next;
+
+       if (next != NULL)
+               next->prev = prev;
+
+       if (list->head == list->tail)
+       {
+               list->head = list->tail = NULL;
+       }
+       else
+       {
+               if (list->head == window)
+                       list->head = next;
+
+               if (list->tail == window)
+                       list->tail = prev;
+       }
+
+       rail_DestroyWindow(list->rail, window);
+}
+
+rdpWindowList* window_list_new(rdpRail* rail)
+{
+       rdpWindowList* list;
+
+       list = (rdpWindowList*) xzalloc(sizeof(rdpWindowList));
+
+       if (list != NULL)
+       {
+               list->head = NULL;
+               list->tail = NULL;
+               list->rail = rail;
+       }
+
+       return list;
+}
+
+void window_list_free(rdpWindowList* list)
+{
+       if (list != NULL)
+       {
+               xfree(list);
+       }
+}
diff --git a/libfreerdp-utils/CMakeLists.txt b/libfreerdp-utils/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6757afc
--- /dev/null
@@ -0,0 +1,67 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# libfreerdp-utils cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set(CMAKE_THREAD_PREFER_PTHREAD)
+find_required_package(Threads)
+
+set(FREERDP_UTILS_SRCS
+       args.c
+       blob.c
+       dsp.c
+       event.c
+       bitmap.c
+       hexdump.c
+       list.c
+       file.c
+       load_plugin.c
+       memory.c
+       mutex.c
+       passphrase.c
+       pcap.c
+       profiler.c
+       rail.c
+       rect.c
+       registry.c
+       semaphore.c
+       signal.c
+       sleep.c
+       stopwatch.c
+       stream.c
+       string.c
+       svc_plugin.c
+       thread.c
+       unicode.c
+       wait_obj.c)
+
+add_definitions(-DPLUGIN_PATH="${FREERDP_PLUGIN_PATH}")
+
+add_library(freerdp-utils ${FREERDP_UTILS_SRCS})
+
+set_target_properties(freerdp-utils PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib")
+
+target_link_libraries(freerdp-utils ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS})
+
+if(WIN32)
+       target_link_libraries(freerdp-utils ws2_32)
+endif()
+if(${CMAKE_SYSTEM_NAME} MATCHES SunOS)
+       target_link_libraries(freerdp-utils rt)
+endif()
+
+install(TARGETS freerdp-utils DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/libfreerdp-utils/args.c b/libfreerdp-utils/args.c
new file mode 100644 (file)
index 0000000..cf10519
--- /dev/null
@@ -0,0 +1,695 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Arguments Parsing
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/print.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/args.h>
+
+/**
+ * Parse command-line arguments and update rdpSettings members accordingly.
+ * @param settings pointer to rdpSettings struct to be updated.
+ * @param argc number of arguments available.
+ * @param argv string array of the arguments.
+ * @param plugin_callback function to be called when a plugin needs to be loaded.
+ * @param plugin_user_data pointer to be passed to the plugin_callback function.
+ * @param ui_callback function to be called when a UI-specific argument is being processed.
+ * @param ui_user_data pointer to be passed to the ui_callback function.
+ * @return number of arguments that were parsed, or FREERDP_ARGS_PARSE_RESULT on failure or --version/--help
+ */
+int freerdp_parse_args(rdpSettings* settings, int argc, char** argv,
+       ProcessPluginArgs plugin_callback, void* plugin_user_data,
+       ProcessUIArgs ui_callback, void* ui_user_data)
+{
+       int t;
+       char* p;
+       int i, j;
+       int index = 1;
+       int num_extensions = 0;
+       RDP_PLUGIN_DATA* plugin_data;
+
+       while (index < argc)
+       {
+               if ((strcmp("-h", argv[index]) == 0 ) || (strcmp("--help", argv[index]) == 0 ))
+               {
+                       printf("\n"
+                               "FreeRDP - A Free Remote Desktop Protocol Client\n"
+                               "See http://www.freerdp.com for more information\n"
+                               "\n"
+                               "Usage: %s [options] server:port\n"
+                               "  -0: connect to console session\n"
+                               "  -a: set color depth in bit, default is 16\n"
+                               "  -c: initial working directory\n"
+                               "  -D: hide window decorations\n"
+                               "  -T: window title\n"
+                               "  -d: domain\n"
+                               "  -f: fullscreen mode\n"
+                               "  -g: set geometry, using format WxH or X%% or 'workarea', default is 1024x768\n"
+                               "  -h: print this help\n"
+                               "  -k: set keyboard layout ID\n"
+                               "  -K: do not interfere with window manager bindings\n"
+                               "  -m: don't send mouse motion events\n"
+                               "  -n: hostname\n"
+                               "  -o: console audio\n"
+                               "  -p: password\n"
+                               "  -s: set startup-shell\n"
+                               "  -t: alternative port number, default is 3389\n"
+                               "  -u: username\n"
+                               "  -x: performance flags (m[odem], b[roadband] or l[an])\n"
+                               "  -X: embed into another window with a given XID.\n"
+                               "  -z: enable compression\n"
+                               "  --app: RemoteApp connection. This implies -g workarea\n"
+                               "  --ext: load an extension\n"
+                               "  --no-auth: disable authentication\n"
+                               "  --no-fastpath: disable fast-path\n"
+                               "  --gdi: graphics rendering (hw, sw)\n"
+                               "  --no-osb: disable offscreen bitmaps\n"
+                               "  --no-bmp-cache: disable bitmap cache\n"
+                               "  --plugin: load a virtual channel plugin\n"
+                               "  --rfx: enable RemoteFX\n"
+                               "  --rfx-mode: RemoteFX operational flags (v[ideo], i[mage]), default is video\n"
+                               "  --nsc: enable NSCodec (experimental)\n"
+                               "  --disable-wallpaper: disables wallpaper\n"
+                               "  --composition: enable desktop composition\n"
+                               "  --disable-full-window-drag: disables full window drag\n"
+                               "  --disable-menu-animations: disables menu animations\n"
+                               "  --disable-theming: disables theming\n"
+                               "  --no-rdp: disable Standard RDP encryption\n"
+                               "  --no-tls: disable TLS encryption\n"
+                               "  --no-nla: disable network level authentication\n"
+                               "  --ntlm: force NTLM authentication protocol version (1 or 2)\n"
+                               "  --ignore-certificate: ignore verification of logon certificate\n"
+                               "  --sec: force protocol security (rdp, tls or nla)\n"
+                               "  --secure-checksum: use salted checksums with Standard RDP encryption\n"
+                               "  --version: print version information\n"
+                               "\n", argv[0]);
+                       return FREERDP_ARGS_PARSE_HELP; //TODO: What is the correct return
+               }
+               else if (strcmp("-a", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing color depth\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->color_depth = atoi(argv[index]);
+               }
+               else if (strcmp("-u", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing username\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->username = xstrdup(argv[index]);
+               }
+               else if (strcmp("-p", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing password\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->password = xstrdup(argv[index]);
+                       settings->autologon = 1;
+
+                       /*
+                        * Overwrite original password which could be revealed by a simple "ps aux" command.
+                        * This approach won't hide the password length, but it is better than nothing.
+                        */
+
+                       memset(argv[index], '*', strlen(argv[index]));
+               }
+               else if (strcmp("-d", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing domain\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->domain = xstrdup(argv[index]);
+               }
+               else if (strcmp("-s", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing shell\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->shell = xstrdup(argv[index]);
+               }
+               else if (strcmp("-c", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing directory\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->directory = xstrdup(argv[index]);
+               }
+               else if (strcmp("-g", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing dimensions\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+
+                       if (strncmp("workarea", argv[index], 1) == 0)
+                       {
+                               settings->workarea = true;
+                       }
+                       else
+                       {
+                               settings->width = (uint16) strtol(argv[index], &p, 10);
+
+                               if (*p == 'x')
+                               {
+                                       settings->height = (uint16) strtol(p + 1, &p, 10);
+                               }
+                               if (*p == '%')
+                               {
+                                       settings->percent_screen = settings->width;
+                                       if (settings->percent_screen <= 0 || settings->percent_screen > 100)
+                                       {
+                                               printf("invalid geometry percentage\n");
+                                               return FREERDP_ARGS_PARSE_FAILURE;
+                                       }
+                               }
+                               else
+                               {
+                                       if (ui_callback != NULL)
+                                               ui_callback(settings, "-g", p, ui_user_data);
+                               }
+                       }
+               }
+               else if (strcmp("-f", argv[index]) == 0)
+               {
+                       settings->fullscreen = true;
+               }
+               else if (strcmp("-D", argv[index]) == 0)
+               {
+                       settings->decorations = false;
+               }
+               else if (strcmp("-T", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing window title\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+
+                       settings->window_title = xstrdup(argv[index]);
+               }
+               else if (strcmp("-t", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing port number\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->port = atoi(argv[index]);
+               }
+               else if (strcmp("-k", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing keyboard layout id\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       sscanf(argv[index], "%X", &(settings->kbd_layout));
+               }
+               else if (strcmp("-K", argv[index]) == 0)
+               {
+                       settings->grab_keyboard = false;
+               }
+               else if (strcmp("-n", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing client hostname\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       strncpy(settings->client_hostname, argv[index], sizeof(settings->client_hostname) - 1);
+                       settings->client_hostname[sizeof(settings->client_hostname) - 1] = 0;
+               }
+               else if (strcmp("-o", argv[index]) == 0)
+               {
+                       settings->console_audio = true;
+               }
+               else if (strcmp("-0", argv[index]) == 0)
+               {
+                       settings->console_session = true;
+               }
+               else if (strcmp("-z", argv[index]) == 0)
+               {
+                       settings->compression = true;
+               }
+               else if (strcmp("--ntlm", argv[index]) == 0)
+               {
+                       index++;
+
+                       settings->ntlm_version = atoi(argv[index]);
+
+                       if (settings->ntlm_version != 2)
+                               settings->ntlm_version = 1;
+               }
+               else if (strcmp("--no-glyph-cache", argv[index]) == 0)
+               {
+                       settings->glyph_cache = false;
+               }
+               else if (strcmp("--no-osb", argv[index]) == 0)
+               {
+                       settings->offscreen_bitmap_cache = false;
+               }
+               else if (strcmp("--no-bmp-cache", argv[index]) == 0)
+               {
+                       settings->bitmap_cache = false;
+               }
+               else if (strcmp("--no-auth", argv[index]) == 0)
+               {
+                       settings->authentication = false;
+               }
+               else if (strcmp("--ignore-certificate", argv[index]) == 0)
+               {
+                       settings->ignore_certificate = true;
+               }
+               else if (strcmp("--certificate-name", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing certificate name\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+
+                       settings->certificate_name = xstrdup(argv[index]);
+               }
+               else if (strcmp("--no-fastpath", argv[index]) == 0)
+               {
+                       settings->fastpath_input = false;
+                       settings->fastpath_output = false;
+               }
+               else if (strcmp("--gdi", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing GDI backend\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       if (strncmp("sw", argv[index], 1) == 0) /* software */
+                       {
+                               settings->sw_gdi = true;
+                       }
+                       else if (strncmp("hw", argv[index], 1) == 0) /* hardware */
+                       {
+                               settings->sw_gdi = false;
+                       }
+                       else
+                       {
+                               printf("unknown GDI backend\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+               }
+               else if (strcmp("--rfx", argv[index]) == 0)
+               {
+                       settings->rfx_codec = true;
+                       settings->fastpath_output = true;
+                       settings->color_depth = 32;
+                       settings->frame_acknowledge = false;
+                       settings->performance_flags = PERF_FLAG_NONE;
+                       settings->large_pointer = true;
+               }
+               else if (strcmp("--rfx-mode", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing RemoteFX mode flag\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       if (argv[index][0] == 'v') /* video */
+                       {
+                               settings->rfx_codec_mode = 0x00;
+                       }
+                       else if (argv[index][0] == 'i') /* image */
+                       {
+                               settings->rfx_codec_mode = 0x02;
+                       }
+                       else
+                       {
+                               printf("unknown RemoteFX mode flag\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+               }
+               else if (strcmp("--nsc", argv[index]) == 0)
+               {
+                       settings->ns_codec = true;
+               }
+               else if (strcmp("--dump-rfx", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing file name\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->dump_rfx_file = xstrdup(argv[index]);
+                       settings->dump_rfx = true;
+               }
+               else if (strcmp("--play-rfx", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing file name\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       settings->play_rfx_file = xstrdup(argv[index]);
+                       settings->play_rfx = true;
+               }
+               else if (strcmp("--fonts", argv[index]) == 0)
+               {
+                       settings->smooth_fonts = true;
+               }
+               else if (strcmp("--disable-wallpaper", argv[index]) == 0)
+               {
+                       settings->disable_wallpaper = true;
+               }
+               else if (strcmp("--disable-full-window-drag", argv[index]) == 0)
+               {
+                       settings->disable_full_window_drag = true;
+               }
+               else if (strcmp("--disable-menu-animations", argv[index]) == 0)
+               {
+                       settings->disable_menu_animations = true;
+               }
+               else if (strcmp("--disable-theming", argv[index]) == 0)
+               {
+                       settings->disable_theming = true;
+               }
+               else if (strcmp("--composition", argv[index]) == 0)
+               {
+                       settings->desktop_composition = true;
+               }
+               else if (strcmp("--no-motion", argv[index]) == 0)
+               {
+                       settings->mouse_motion = false;
+               }
+               else if (strcmp("--app", argv[index]) == 0)
+               {
+                       settings->remote_app = true;
+                       settings->rail_langbar_supported = true;
+                       settings->workarea = true;
+                       settings->performance_flags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG;
+               }
+               else if (strcmp("-x", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing performance flag\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       if (argv[index][0] == 'm') /* modem */
+                       {
+                               settings->performance_flags = PERF_DISABLE_WALLPAPER |
+                                       PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS |
+                                       PERF_DISABLE_THEMING;
+
+                               settings->connection_type = CONNECTION_TYPE_MODEM;
+                       }
+                       else if (argv[index][0] == 'b') /* broadband */
+                       {
+                               settings->performance_flags = PERF_DISABLE_WALLPAPER;
+                               settings->connection_type = CONNECTION_TYPE_BROADBAND_HIGH;
+                       }
+                       else if (argv[index][0] == 'l') /* lan */
+                       {
+                               settings->performance_flags = PERF_FLAG_NONE;
+                               settings->connection_type = CONNECTION_TYPE_LAN;
+                       }
+                       else
+                       {
+                               settings->performance_flags = strtol(argv[index], 0, 16);
+                       }
+               }
+               else if (strcmp("-X", argv[index]) == 0)
+               {
+                       index++;
+
+                       if (index == argc)
+                       {
+                               printf("missing parent window XID\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+
+                       settings->parent_window_xid = strtoul(argv[index], NULL, 16);
+
+                       if (settings->parent_window_xid == 0)
+                       {
+                               printf("invalid parent window XID\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+               }
+               else if (strcmp("--no-rdp", argv[index]) == 0)
+               {
+                       settings->rdp_security = false;
+               }
+               else if (strcmp("--no-tls", argv[index]) == 0)
+               {
+                       settings->tls_security = false;
+               }
+               else if (strcmp("--no-nla", argv[index]) == 0)
+               {
+                       settings->nla_security = false;
+               }
+               else if (strcmp("--sec", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing protocol security\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       if (strncmp("rdp", argv[index], 1) == 0) /* Standard RDP */
+                       {
+                               settings->rdp_security = true;
+                               settings->tls_security = false;
+                               settings->nla_security = false;
+                               settings->encryption = true;
+                               settings->encryption_method = ENCRYPTION_METHOD_40BIT | ENCRYPTION_METHOD_128BIT | ENCRYPTION_METHOD_FIPS;
+                               settings->encryption_level = ENCRYPTION_LEVEL_CLIENT_COMPATIBLE;
+                       }
+                       else if (strncmp("tls", argv[index], 1) == 0) /* TLS */
+                       {
+                               settings->rdp_security = false;
+                               settings->tls_security = true;
+                               settings->nla_security = false;
+                       }
+                       else if (strncmp("nla", argv[index], 1) == 0) /* NLA */
+                       {
+                               settings->rdp_security = false;
+                               settings->tls_security = false;
+                               settings->nla_security = true;
+                       }
+                       else
+                       {
+                               printf("unknown protocol security\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+               }
+               else if (strcmp("--plugin", argv[index]) == 0)
+               {
+                       index++;
+                       t = index;
+                       if (index == argc)
+                       {
+                               printf("missing plugin name\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       plugin_data = NULL;
+                       if (index < argc - 1 && strcmp("--data", argv[index + 1]) == 0)
+                       {
+                               index += 2;
+                               i = 0;
+                               while (index < argc && strcmp("--", argv[index]) != 0)
+                               {
+                                       if (plugin_data == NULL)
+                                               plugin_data = (RDP_PLUGIN_DATA*) xmalloc(sizeof(RDP_PLUGIN_DATA) * (i + 2));
+                                       else
+                                               plugin_data = (RDP_PLUGIN_DATA*) xrealloc(plugin_data, sizeof(RDP_PLUGIN_DATA) * (i + 2));
+
+                                       plugin_data[i].size = sizeof(RDP_PLUGIN_DATA);
+                                       plugin_data[i].data[0] = NULL;
+                                       plugin_data[i].data[1] = NULL;
+                                       plugin_data[i].data[2] = NULL;
+                                       plugin_data[i].data[3] = NULL;
+                                       plugin_data[i + 1].size = 0;
+
+                                       for (j = 0, p = argv[index]; j < 4 && p != NULL; j++)
+                                       {
+                                               if (*p == '\'')
+                                               {
+                                                       plugin_data[i].data[j] = p + 1;
+                                                       p = strchr(p + 1, '\'');
+                                                       if (p)
+                                                               *p++ = 0;
+                                               }
+                                               else
+                                                       plugin_data[i].data[j] = p;
+
+                                               p = strchr(p, ':');
+                                               if (p != NULL)
+                                                       *p++ = 0;
+                                       }
+                                       index++;
+                                       i++;
+                               }
+                       }
+
+                       if (plugin_callback != NULL)
+                       {
+                               if (!plugin_callback(settings, argv[t], plugin_data, plugin_user_data))
+                                       return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+               }
+               else if (strcmp("--ext", argv[index]) == 0)
+               {
+                       index++;
+                       if (index == argc)
+                       {
+                               printf("missing extension name\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       if (num_extensions >= sizeof(settings->extensions) / sizeof(struct rdp_ext_set))
+                       {
+                               printf("maximum extensions reached\n");
+                               return FREERDP_ARGS_PARSE_FAILURE;
+                       }
+                       snprintf(settings->extensions[num_extensions].name,
+                               sizeof(settings->extensions[num_extensions].name),
+                               "%s", argv[index]);
+                       settings->extensions[num_extensions].data = NULL;
+                       if (index < argc - 1 && strcmp("--data", argv[index + 1]) == 0)
+                       {
+                               index += 2;
+                               settings->extensions[num_extensions].data = argv[index];
+                               i = 0;
+                               while (index < argc && strcmp("--", argv[index]) != 0)
+                               {
+                                       index++;
+                                       i++;
+                               }
+                       }
+                       num_extensions++;
+               }
+               else if (strcmp("--secure-checksum", argv[index]) == 0)
+               {
+                       settings->secure_checksum = true;
+               }
+               else if (strcmp("--version", argv[index]) == 0)
+               {
+                       printf("This is FreeRDP version %s\n", FREERDP_VERSION_FULL);
+                       return FREERDP_ARGS_PARSE_VERSION;
+               }
+               else if (argv[index][0] != '-')
+               {
+                       if (argv[index][0] == '[' && (p = strchr(argv[index], ']'))
+                               && (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':'))))
+                       {
+                               /* Either "[...]" or "[...]:..." with at most one : after the brackets */
+                               settings->hostname = xstrdup(argv[index] + 1);
+                               if ((p = strchr((char*)settings->hostname, ']')))
+                               {
+                                       *p = 0;
+                                       if (p[1] == ':')
+                                               settings->port = atoi(p + 2);
+                               }
+                       }
+                       else
+                       {
+                               /* Port number is cut off and used if exactly one : in the string */
+                               settings->hostname = xstrdup(argv[index]);
+                               if ((p = strchr((char*)settings->hostname, ':')) && !strchr(p + 1, ':'))
+                               {
+                                       *p = 0;
+                                       settings->port = atoi(p + 1);
+                               }
+                       }
+                       /* server is the last argument for the current session. arguments
+                          followed will be parsed for the next session. */
+                       index++;
+
+                       if (settings->smooth_fonts)
+                               settings->performance_flags |= PERF_ENABLE_FONT_SMOOTHING;
+
+                       if (settings->desktop_composition)
+                               settings->performance_flags |= PERF_ENABLE_DESKTOP_COMPOSITION;
+
+                       if (settings->disable_wallpaper)
+                               settings->performance_flags |= PERF_DISABLE_WALLPAPER;
+
+                       if (settings->disable_full_window_drag)
+                               settings->performance_flags |= PERF_DISABLE_FULLWINDOWDRAG;
+
+                       if (settings->disable_menu_animations)
+                               settings->performance_flags |= PERF_DISABLE_MENUANIMATIONS;
+
+                       if (settings->disable_theming)
+                               settings->performance_flags |= PERF_DISABLE_THEMING;
+
+                       return index;
+               }
+               else
+               {
+                       if (ui_callback != NULL)
+                       {
+                               t = ui_callback(settings, argv[index], (index + 1 < argc && argv[index + 1][0] != '-' ?
+                                       argv[index + 1] : NULL), ui_user_data);
+                               if (t == 0)
+                               {
+                                       printf("invalid option: %s\n", argv[index]);
+                                       return FREERDP_ARGS_PARSE_FAILURE;
+                               }
+                               index += t - 1;
+                       }
+               }
+               index++;
+       }
+       printf("missing server name\n");
+       return FREERDP_ARGS_PARSE_FAILURE;
+}
diff --git a/libfreerdp-utils/bitmap.c b/libfreerdp-utils/bitmap.c
new file mode 100644 (file)
index 0000000..bbcfbdb
--- /dev/null
@@ -0,0 +1,105 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Bitmap File Format Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <freerdp/types.h>
+
+#include <freerdp/utils/bitmap.h>
+
+typedef struct
+{
+       uint8 magic[2];
+} bmpfile_magic;
+
+typedef struct
+{
+       uint32 filesz;
+       uint16 creator1;
+       uint16 creator2;
+       uint32 bmp_offset;
+} bmpfile_header;
+
+typedef struct
+{
+       uint32 header_sz;
+       sint32 width;
+       sint32 height;
+       uint16 nplanes;
+       uint16 bitspp;
+       uint32 compress_type;
+       uint32 bmp_bytesz;
+       sint32 hres;
+       sint32 vres;
+       uint32 ncolors;
+       uint32 nimpcolors;
+} BITMAPINFOHEADER;
+
+void freerdp_bitmap_write(char* filename, void* data, int width, int height, int bpp)
+{
+       FILE* fp;
+       bmpfile_magic magic;
+       bmpfile_header header;
+       BITMAPINFOHEADER info_header;
+
+       fp = fopen(filename, "w+b");
+
+       if (fp == NULL)
+       {
+               printf("failed to open file %s\n", filename);
+               return;
+       }
+
+       magic.magic[0] = 'B';
+       magic.magic[1] = 'M';
+
+       header.creator1 = 0;
+       header.creator2 = 0;
+
+       header.bmp_offset =
+                       sizeof(bmpfile_magic) +
+                       sizeof(bmpfile_header) +
+                       sizeof(BITMAPINFOHEADER);
+
+       info_header.bmp_bytesz = width * height * (bpp / 8);
+
+       header.filesz =
+               header.bmp_offset +
+               info_header.bmp_bytesz;
+
+       info_header.width = width;
+       info_header.height = (-1) * height;
+       info_header.nplanes = 1;
+       info_header.bitspp = bpp;
+       info_header.compress_type = 0;
+       info_header.hres = width;
+       info_header.vres = height;
+       info_header.ncolors = 0;
+       info_header.nimpcolors = 0;
+       info_header.header_sz = sizeof(BITMAPINFOHEADER);
+
+       fwrite((void*) &magic, sizeof(bmpfile_magic), 1, fp);
+       fwrite((void*) &header, sizeof(bmpfile_header), 1, fp);
+       fwrite((void*) &info_header, sizeof(BITMAPINFOHEADER), 1, fp);
+       fwrite((void*) data, info_header.bmp_bytesz, 1, fp);
+
+       fclose(fp);
+}
+
diff --git a/libfreerdp-utils/blob.c b/libfreerdp-utils/blob.c
new file mode 100644 (file)
index 0000000..b08c6e0
--- /dev/null
@@ -0,0 +1,47 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * BLOB Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/utils/blob.h>
+
+/**
+ * Allocate memory for data blob.
+ * @param blob blob structure
+ * @param length memory length
+ */
+
+void freerdp_blob_alloc(rdpBlob* blob, int length)
+{
+       blob->data = xmalloc(length);
+       blob->length = length;
+}
+
+/**
+ * Free memory allocated for data blob.
+ * @param blob
+ */
+
+void freerdp_blob_free(rdpBlob* blob)
+{
+       if (blob->data)
+               xfree(blob->data);
+       
+       blob->length = 0;
+}
diff --git a/libfreerdp-utils/dsp.c b/libfreerdp-utils/dsp.c
new file mode 100644 (file)
index 0000000..c7d013f
--- /dev/null
@@ -0,0 +1,336 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Digital Sound Processing
+ *
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/dsp.h>
+
+uint8* dsp_resample(uint8* src, int bytes_per_sample,
+       uint32 schan, uint32 srate, int sframes,
+       uint32 rchan, uint32 rrate, int * prframes)
+{
+       uint8* dst;
+       uint8* p;
+       int rframes;
+       int rsize;
+       int i, j;
+       int n1, n2;
+       int sbytes, rbytes;
+
+       sbytes = bytes_per_sample * schan;
+       rbytes = bytes_per_sample * rchan;
+       rframes = sframes * rrate / srate;
+       *prframes = rframes;
+       rsize = rbytes * rframes;
+       dst = (uint8*) xzalloc(rsize);
+
+       p = dst;
+       for (i = 0; i < rframes; i++)
+       {
+               n1 = i * srate / rrate;
+               if (n1 >= sframes)
+                       n1 = sframes - 1;
+               n2 = (n1 * rrate == i * srate || n1 == sframes - 1 ? n1 : n1 + 1);
+               for (j = 0; j < rbytes; j++)
+               {
+                       /* Nearest Interpolation, probably the easiest, but works */
+                       *p++ = (i * srate - n1 * rrate > n2 * rrate - i * srate ?
+                               src[n2 * sbytes + (j % sbytes)] :
+                               src[n1 * sbytes + (j % sbytes)]);
+               }
+       }
+
+       return dst;
+}
+
+/**
+ * Microsoft IMA ADPCM specification:
+ *
+ * http://wiki.multimedia.cx/index.php?title=Microsoft_IMA_ADPCM
+ * http://wiki.multimedia.cx/index.php?title=IMA_ADPCM
+ */
+
+static const sint16 ima_step_index_table[] =
+{
+       -1, -1, -1, -1, 2, 4, 6, 8,
+       -1, -1, -1, -1, 2, 4, 6, 8
+};
+
+static const sint16 ima_step_size_table[] =
+{
+       7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 
+       19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 
+       50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 
+       130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
+       337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
+       876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 
+       2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
+       5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 
+       15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 
+};
+
+static uint16 dsp_decode_ima_adpcm_sample(ADPCM* adpcm,
+       int channel, uint8 sample)
+{
+       sint32 ss;
+       sint32 d;
+
+       ss = ima_step_size_table[adpcm->last_step[channel]];
+       d = (ss >> 3);
+       if (sample & 1)
+               d += (ss >> 2);
+       if (sample & 2)
+               d += (ss >> 1);
+       if (sample & 4)
+               d += ss;
+       if (sample & 8)
+               d = -d;
+       d += adpcm->last_sample[channel];
+
+       if (d < -32768)
+               d = -32768;
+       else if (d > 32767)
+               d = 32767;
+
+       adpcm->last_sample[channel] = (sint16) d;
+
+       adpcm->last_step[channel] += ima_step_index_table[sample];
+       if (adpcm->last_step[channel] < 0)
+               adpcm->last_step[channel] = 0;
+       else if (adpcm->last_step[channel] > 88)
+               adpcm->last_step[channel] = 88;
+
+       return (uint16) d;
+}
+
+uint8* dsp_decode_ima_adpcm(ADPCM* adpcm,
+       uint8* src, int size, int channels, int block_size, int* out_size)
+{
+       uint8* out;
+       uint8* dst;
+       uint8 sample;
+       uint16 decoded;
+       int channel;
+       int i;
+
+       *out_size = size * 4;
+       out = (uint8 *) xzalloc(*out_size);
+       dst = out;
+       while (size > 0)
+       {
+               if (size % block_size == 0)
+               {
+                       adpcm->last_sample[0] = (sint16) (((uint16)(*src)) | (((uint16)(*(src + 1))) << 8));
+                       adpcm->last_step[0] = (sint16) (*(src + 2));
+                       src += 4;
+                       size -= 4;
+                       *out_size -= 16;
+                       if (channels > 1)
+                       {
+                               adpcm->last_sample[1] = (sint16) (((uint16)(*src)) | (((uint16)(*(src + 1))) << 8));
+                               adpcm->last_step[1] = (sint16) (*(src + 2));
+                               src += 4;
+                               size -= 4;
+                               *out_size -= 16;
+                       }
+               }
+
+               if (channels > 1)
+               {
+                       for (i = 0; i < 8; i++)
+                       {
+                               channel = (i < 4 ? 0 : 1);
+                               sample = ((*src) & 0x0f);
+                               decoded = dsp_decode_ima_adpcm_sample(adpcm, channel, sample);
+                               dst[((i & 3) << 3) + (channel << 1)] = (decoded & 0xff);
+                               dst[((i & 3) << 3) + (channel << 1) + 1] = (decoded >> 8);
+                               sample = ((*src) >> 4);
+                               decoded = dsp_decode_ima_adpcm_sample(adpcm, channel, sample);
+                               dst[((i & 3) << 3) + (channel << 1) + 4] = (decoded & 0xff);
+                               dst[((i & 3) << 3) + (channel << 1) + 5] = (decoded >> 8);
+                               src++;
+                       }
+                       dst += 32;
+                       size -= 8;
+               }
+               else
+               {
+                       sample = ((*src) & 0x0f);
+                       decoded = dsp_decode_ima_adpcm_sample(adpcm, 0, sample);
+                       *dst++ = (decoded & 0xff);
+                       *dst++ = (decoded >> 8);
+                       sample = ((*src) >> 4);
+                       decoded = dsp_decode_ima_adpcm_sample(adpcm, 0, sample);
+                       *dst++ = (decoded & 0xff);
+                       *dst++ = (decoded >> 8);
+                       src++;
+                       size--;
+               }
+       }
+       return out;
+}
+
+/**
+ * 0     1     2     3
+ * 2 0   6 4   10 8  14 12   <left>
+ *
+ * 4     5     6     7
+ * 3 1   7 5   11 9  15 13   <right>
+ */
+static const struct
+{
+       uint8 byte_num;
+       uint8 byte_shift;
+} ima_stereo_encode_map[] =
+{
+       { 0, 0 },
+       { 4, 0 },
+       { 0, 4 },
+       { 4, 4 },
+       { 1, 0 },
+       { 5, 0 },
+       { 1, 4 },
+       { 5, 4 },
+       { 2, 0 },
+       { 6, 0 },
+       { 2, 4 },
+       { 6, 4 },
+       { 3, 0 },
+       { 7, 0 },
+       { 3, 4 },
+       { 7, 4 }
+};
+
+static uint8 dsp_encode_ima_adpcm_sample(ADPCM* adpcm,
+       int channel, sint16 sample)
+{
+       sint32 e;
+       sint32 d;
+       sint32 ss;
+       uint8 enc;
+       sint32 diff;
+
+       ss = ima_step_size_table[adpcm->last_step[channel]];
+       d = e = sample - adpcm->last_sample[channel];
+       diff = ss >> 3;
+       enc = 0;
+       if (e < 0)
+       {
+               enc = 8;
+               e = -e;
+       }
+       if (e >= ss)
+       {
+               enc |= 4;
+               e -= ss;
+       }
+       ss >>= 1;
+       if (e >= ss)
+       {
+               enc |= 2;
+               e -= ss;
+       }
+       ss >>= 1;
+       if (e >= ss)
+       {
+               enc |= 1;
+               e -= ss;
+       }
+
+       if (d < 0)
+               diff = d + e - diff;
+       else
+               diff = d - e + diff;
+
+       diff += adpcm->last_sample[channel];
+       if (diff < -32768)
+               diff = -32768;
+       else if (diff > 32767)
+               diff = 32767;
+       adpcm->last_sample[channel] = (sint16) diff;
+
+       adpcm->last_step[channel] += ima_step_index_table[enc];
+       if (adpcm->last_step[channel] < 0)
+               adpcm->last_step[channel] = 0;
+       else if (adpcm->last_step[channel] > 88)
+               adpcm->last_step[channel] = 88;
+
+       return enc;
+}
+
+uint8* dsp_encode_ima_adpcm(ADPCM* adpcm,
+       uint8* src, int size, int channels, int block_size, int* out_size)
+{
+       uint8* out;
+       uint8* dst;
+       sint16 sample;
+       uint8 encoded;
+       int i;
+
+       out = (uint8*) xzalloc(size / 2);
+       dst = out;
+       while (size > 0)
+       {
+               if ((dst - out) % block_size == 0)
+               {
+                       *dst++ = adpcm->last_sample[0] & 0xff;
+                       *dst++ = (adpcm->last_sample[0] >> 8) & 0xff;
+                       *dst++ = (uint8) adpcm->last_step[0];
+                       *dst++ = 0;
+                       if (channels > 1)
+                       {
+                               *dst++ = adpcm->last_sample[1] & 0xff;
+                               *dst++ = (adpcm->last_sample[1] >> 8) & 0xff;
+                               *dst++ = (uint8) adpcm->last_step[1];
+                               *dst++ = 0;
+                       }
+               }
+
+               if (channels > 1)
+               {
+                       memset(dst, 0, 8);
+                       for (i = 0; i < 16; i++)
+                       {
+                               sample = (sint16) (((uint16)(*src)) | (((uint16)(*(src + 1))) << 8));
+                               src += 2;
+                               encoded = dsp_encode_ima_adpcm_sample(adpcm, i % 2, sample);
+                               dst[ima_stereo_encode_map[i].byte_num] |= encoded << ima_stereo_encode_map[i].byte_shift;
+                       }
+                       dst += 8;
+                       size -= 32;
+               }
+               else
+               {
+                       sample = (sint16) (((uint16)(*src)) | (((uint16)(*(src + 1))) << 8));
+                       src += 2;
+                       encoded = dsp_encode_ima_adpcm_sample(adpcm, 0, sample);
+                       sample = (sint16) (((uint16)(*src)) | (((uint16)(*(src + 1))) << 8));
+                       src += 2;
+                       encoded |= dsp_encode_ima_adpcm_sample(adpcm, 0, sample) << 4;
+                       *dst++ = encoded;
+                       size -= 4;
+               }
+       }
+       *out_size = dst - out;
+       return out;
+}
+
diff --git a/libfreerdp-utils/event.c b/libfreerdp-utils/event.c
new file mode 100644 (file)
index 0000000..b3f0cdc
--- /dev/null
@@ -0,0 +1,167 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Events
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/plugins/cliprdr.h>
+#include <freerdp/plugins/tsmf.h>
+#include <freerdp/rail.h>
+
+static RDP_EVENT* freerdp_cliprdr_event_new(uint16 event_type)
+{
+       RDP_EVENT* event = NULL;
+
+       switch (event_type)
+       {
+               case RDP_EVENT_TYPE_CB_MONITOR_READY:
+                       event = (RDP_EVENT*) xnew(RDP_CB_MONITOR_READY_EVENT);
+                       break;
+               case RDP_EVENT_TYPE_CB_FORMAT_LIST:
+                       event = (RDP_EVENT*) xnew(RDP_CB_FORMAT_LIST_EVENT);
+                       break;
+               case RDP_EVENT_TYPE_CB_DATA_REQUEST:
+                       event = (RDP_EVENT*) xnew(RDP_CB_DATA_REQUEST_EVENT);
+                       break;
+               case RDP_EVENT_TYPE_CB_DATA_RESPONSE:
+                       event = (RDP_EVENT*) xnew(RDP_CB_DATA_RESPONSE_EVENT);
+                       break;
+       }
+
+       return event;
+}
+
+static RDP_EVENT* freerdp_tsmf_event_new(uint16 event_type)
+{
+       RDP_EVENT* event = NULL;
+
+       switch (event_type)
+       {
+               case RDP_EVENT_TYPE_TSMF_VIDEO_FRAME:
+                       event = (RDP_EVENT*) xnew(RDP_VIDEO_FRAME_EVENT);
+                       break;
+               case RDP_EVENT_TYPE_TSMF_REDRAW:
+                       event = (RDP_EVENT*) xnew(RDP_REDRAW_EVENT);
+                       break;
+       }
+
+       return event;
+}
+
+static RDP_EVENT* freerdp_rail_event_new(uint16 event_type)
+{
+       RDP_EVENT* event = NULL;
+       event = xnew(RDP_EVENT);
+       return event;
+}
+
+RDP_EVENT* freerdp_event_new(uint16 event_class, uint16 event_type,
+       RDP_EVENT_CALLBACK on_event_free_callback, void* user_data)
+{
+       RDP_EVENT* event = NULL;
+
+       switch (event_class)
+       {
+               case RDP_EVENT_CLASS_DEBUG:
+                       event = xnew(RDP_EVENT);
+                       break;
+               case RDP_EVENT_CLASS_CLIPRDR:
+                       event = freerdp_cliprdr_event_new(event_type);
+                       break;
+               case RDP_EVENT_CLASS_TSMF:
+                       event = freerdp_tsmf_event_new(event_type);
+                       break;
+               case RDP_EVENT_CLASS_RAIL:
+                       event = freerdp_rail_event_new(event_type);
+                       break;
+       }
+
+       if (event != NULL)
+       {
+               event->event_class = event_class;
+               event->event_type = event_type;
+               event->on_event_free_callback = on_event_free_callback;
+               event->user_data = user_data;
+       }
+
+       return event;
+}
+
+static void freerdp_cliprdr_event_free(RDP_EVENT* event)
+{
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_CB_FORMAT_LIST:
+                       {
+                               RDP_CB_FORMAT_LIST_EVENT* cb_event = (RDP_CB_FORMAT_LIST_EVENT*)event;
+                               xfree(cb_event->formats);
+                               xfree(cb_event->raw_format_data);
+                       }
+                       break;
+               case RDP_EVENT_TYPE_CB_DATA_RESPONSE:
+                       {
+                               RDP_CB_DATA_RESPONSE_EVENT* cb_event = (RDP_CB_DATA_RESPONSE_EVENT*)event;
+                               xfree(cb_event->data);
+                       }
+                       break;
+       }
+}
+
+static void freerdp_tsmf_event_free(RDP_EVENT* event)
+{
+       switch (event->event_type)
+       {
+               case RDP_EVENT_TYPE_TSMF_VIDEO_FRAME:
+                       {
+                               RDP_VIDEO_FRAME_EVENT* vevent = (RDP_VIDEO_FRAME_EVENT*)event;
+                               xfree(vevent->frame_data);
+                               xfree(vevent->visible_rects);
+                       }
+                       break;
+       }
+}
+
+static void freerdp_rail_event_free(RDP_EVENT* event)
+{
+}
+
+void freerdp_event_free(RDP_EVENT* event)
+{
+       if (event != NULL)
+       {
+               if (event->on_event_free_callback != NULL)
+                       event->on_event_free_callback(event);
+
+               switch (event->event_class)
+               {
+                       case RDP_EVENT_CLASS_CLIPRDR:
+                               freerdp_cliprdr_event_free(event);
+                               break;
+                       case RDP_EVENT_CLASS_TSMF:
+                               freerdp_tsmf_event_free(event);
+                               break;
+                       case RDP_EVENT_CLASS_RAIL:
+                               freerdp_rail_event_free(event);
+                               break;
+               }
+               xfree(event);
+       }
+}
diff --git a/libfreerdp-utils/file.c b/libfreerdp-utils/file.c
new file mode 100644 (file)
index 0000000..91746bb
--- /dev/null
@@ -0,0 +1,261 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * File Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <freerdp/types.h>
+#include <freerdp/settings.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/string.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include <direct.h>
+#define getcwd                 _getcwd
+#endif
+
+#include <freerdp/utils/file.h>
+
+#ifndef _WIN32
+#define PATH_SEPARATOR_STR     "/"
+#define PATH_SEPARATOR_CHR     '/'
+#define HOME_ENV_VARIABLE      "HOME"
+#else
+#include <windows.h>
+#define PATH_SEPARATOR_STR     "\\"
+#define PATH_SEPARATOR_CHR     '\\'
+#define HOME_ENV_VARIABLE      "HOMEPATH"
+#endif
+
+#ifdef _WIN32
+#define SHARED_LIB_SUFFIX      ".dll"
+#elif __APPLE__
+#define SHARED_LIB_SUFFIX      ".dylib"
+#else
+#define SHARED_LIB_SUFFIX      ".so"
+#endif
+
+#define FREERDP_CONFIG_DIR     ".freerdp"
+
+#define PARENT_PATH            ".." PATH_SEPARATOR_STR
+
+void freerdp_mkdir(char* path)
+{
+#ifndef _WIN32
+               mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR);
+#else
+               CreateDirectoryA(path, 0);
+#endif
+}
+
+boolean freerdp_check_file_exists(char* file)
+{
+       struct stat stat_info;
+
+       if (stat(file, &stat_info) != 0)
+               return false;
+
+       return true;
+}
+
+char* freerdp_get_home_path(rdpSettings* settings)
+{
+       if (settings->home_path == NULL)
+               settings->home_path = getenv(HOME_ENV_VARIABLE);
+
+       return settings->home_path;
+}
+
+char* freerdp_get_config_path(rdpSettings* settings)
+{
+       char* path;
+
+       path = (char*) xmalloc(strlen(settings->home_path) + sizeof(FREERDP_CONFIG_DIR) + 2);
+       sprintf(path, "%s/%s", settings->home_path, FREERDP_CONFIG_DIR);
+
+       if (!freerdp_check_file_exists(path))
+               freerdp_mkdir(path);
+
+       settings->config_path = path;
+
+       return path;
+}
+
+char* freerdp_get_current_path(rdpSettings* settings)
+{
+       if (settings->current_path == NULL)
+               settings->current_path = getcwd(NULL, 0);
+
+       return settings->current_path;
+}
+
+char* freerdp_construct_path(char* base_path, char* relative_path)
+{
+       char* path;
+       int length;
+       int base_path_length;
+       int relative_path_length;
+
+       base_path_length = strlen(base_path);
+       relative_path_length = strlen(relative_path);
+       length = base_path_length + relative_path_length + 1;
+
+       path = xmalloc(length + 1);
+       sprintf(path, "%s" PATH_SEPARATOR_STR "%s", base_path, relative_path);
+
+       return path;
+}
+
+char* freerdp_append_shared_library_suffix(char* file_path)
+{
+       char* p;
+       char* path = NULL;
+       int file_path_length;
+       int shared_lib_suffix_length;
+
+       if (file_path == NULL)
+               return NULL;
+
+       file_path_length = strlen(file_path);
+       shared_lib_suffix_length = strlen(SHARED_LIB_SUFFIX);
+
+       if (file_path_length >= shared_lib_suffix_length)
+       {
+               p = &file_path[file_path_length - shared_lib_suffix_length];
+
+               if (strcmp(p, SHARED_LIB_SUFFIX) != 0)
+               {
+                       path = xmalloc(file_path_length + shared_lib_suffix_length + 1);
+                       sprintf(path, "%s%s", file_path, SHARED_LIB_SUFFIX);
+               }
+               else
+               {
+                       path = xstrdup(file_path);
+               }
+       }
+       else
+       {
+               path = xstrdup(file_path);
+       }
+
+       return path;
+}
+
+char* freerdp_get_parent_path(char* base_path, int depth)
+{
+       int i;
+       char* p;
+       char* path;
+       int length;
+       int base_length;
+
+       if (base_path == NULL)
+               return NULL;
+
+       if (depth <= 0)
+               return xstrdup(base_path);
+
+       base_length = strlen(base_path);
+
+       p = &base_path[base_length];
+
+       for (i = base_length - 1; ((i >= 0) && (depth > 0)); i--)
+       {
+               if (base_path[i] == PATH_SEPARATOR_CHR)
+               {
+                       p = &base_path[i];
+                       depth--;
+               }
+       }
+
+       length = (p - base_path);
+
+       path = (char*) xmalloc(length + 1);
+       memcpy(path, base_path, length);
+       path[length] = '\0';
+
+       return path;
+}
+
+boolean freerdp_path_contains_separator(char* path)
+{
+       if (path == NULL)
+               return false;
+
+       if (strchr(path, PATH_SEPARATOR_CHR) == NULL)
+               return false;
+
+       return true;
+}
+
+/* detects if we are running from the source tree */
+
+boolean freerdp_detect_development_mode(rdpSettings* settings)
+{
+       int depth = 0;
+       char* current_path;
+       char* development_path = NULL;
+       boolean development_mode = false;
+
+       if (freerdp_check_file_exists(".git"))
+       {
+               depth = 0;
+               development_mode = true;
+       }
+       else if (freerdp_check_file_exists(PARENT_PATH ".git"))
+       {
+               depth = 1;
+               development_mode = true;
+       }
+       else if (freerdp_check_file_exists(PARENT_PATH PARENT_PATH ".git"))
+       {
+               depth = 2;
+               development_mode = true;
+       }
+
+       current_path = freerdp_get_current_path(settings);
+
+       if (development_mode)
+               development_path = freerdp_get_parent_path(current_path, depth);
+
+       settings->development_mode = development_mode;
+       settings->development_path = development_path;
+
+       return settings->development_mode;
+}
+
+void freerdp_detect_paths(rdpSettings* settings)
+{
+       freerdp_get_home_path(settings);
+       freerdp_get_config_path(settings);
+       freerdp_detect_development_mode(settings);
+
+#if 0
+       printf("home path: %s\n", settings->home_path);
+       printf("config path: %s\n", settings->config_path);
+       printf("current path: %s\n", settings->current_path);
+
+       if (settings->development_mode)
+               printf("development path: %s\n", settings->development_path);
+#endif
+}
diff --git a/libfreerdp-utils/hexdump.c b/libfreerdp-utils/hexdump.c
new file mode 100644 (file)
index 0000000..1db8cd6
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Hex Dump Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <freerdp/types.h>
+
+#include <freerdp/utils/hexdump.h>
+
+void freerdp_hexdump(uint8* data, int length)
+{
+       uint8* p = data;
+       int i, line, offset = 0;
+
+       while (offset < length)
+       {
+               printf("%04x ", offset);
+
+               line = length - offset;
+
+               if (line > FREERDP_HEXDUMP_LINE_LENGTH)
+                       line = FREERDP_HEXDUMP_LINE_LENGTH;
+
+               for (i = 0; i < line; i++)
+                       printf("%02x ", p[i]);
+
+               for (; i < FREERDP_HEXDUMP_LINE_LENGTH; i++)
+                       printf("   ");
+
+               for (i = 0; i < line; i++)
+                       printf("%c", (p[i] >= 0x20 && p[i] < 0x7F) ? p[i] : '.');
+
+               printf("\n");
+
+               offset += line;
+               p += line;
+       }
+}
+
diff --git a/libfreerdp-utils/list.c b/libfreerdp-utils/list.c
new file mode 100644 (file)
index 0000000..9f7990b
--- /dev/null
@@ -0,0 +1,151 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Double-linked List Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/list.h>
+
+static LIST_ITEM* list_item_new(void* data)
+{
+       LIST_ITEM* item;
+
+       item = xnew(LIST_ITEM);
+       item->data = data;
+       return item;
+}
+
+static LIST_ITEM* list_item_find(LIST* list, void* data)
+{
+       LIST_ITEM* item;
+
+       for (item = list->head; item; item = item->next)
+       {
+               if (item->data == data)
+                       return item;
+       }
+       return NULL;
+}
+
+LIST* list_new(void)
+{
+       LIST* list;
+
+       list = xnew(LIST);
+       list->count = 0;
+       return list;
+}
+
+void list_free(LIST* list)
+{
+       while (list->head)
+               list_dequeue(list);
+       xfree(list);
+}
+
+void list_enqueue(LIST* list, void* data)
+{
+       LIST_ITEM* item;
+
+       item = list_item_new(data);
+       if (list->tail == NULL)
+       {
+               list->head = item;
+               list->tail = item;
+       }
+       else
+       {
+               item->prev = list->tail;
+               list->tail->next = item;
+               list->tail = item;
+       }
+       list->count++;
+}
+
+void* list_dequeue(LIST* list)
+{
+       LIST_ITEM* item;
+       void* data = NULL;
+
+       item = list->head;
+       if (item != NULL)
+       {
+               list->head = item->next;
+               if (list->head == NULL)
+                       list->tail = NULL;
+               else
+                       list->head->prev = NULL;
+
+               data = item->data;
+               xfree(item);
+               list->count--;
+       }
+       return data;
+}
+
+void* list_peek(LIST* list)
+{
+       LIST_ITEM* item;
+
+       item = list->head;
+       return item ? item->data : NULL;
+}
+
+void* list_next(LIST* list, void* data)
+{
+       LIST_ITEM* item;
+
+       item = list_item_find(list, data);
+       data = NULL;
+       if (item != NULL)
+       {
+               if (item->next != NULL)
+                       data = item->next->data;
+       }
+       return data;
+}
+
+void* list_remove(LIST* list, void* data)
+{
+       LIST_ITEM* item;
+
+       item = list_item_find(list, data);
+       if (item != NULL)
+       {
+               if (item->prev != NULL)
+                       item->prev->next = item->next;
+               if (item->next != NULL)
+                       item->next->prev = item->prev;
+               if (list->head == item)
+                       list->head = item->next;
+               if (list->tail == item)
+                       list->tail = item->prev;
+               xfree(item);
+               list->count--;
+       }
+       else
+               data = NULL;
+       return data;
+}
+
+int list_size(LIST* list)
+{
+       return list->count;
+}
diff --git a/libfreerdp-utils/load_plugin.c b/libfreerdp-utils/load_plugin.c
new file mode 100644 (file)
index 0000000..adab66e
--- /dev/null
@@ -0,0 +1,209 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Plugin Loading Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/file.h>
+#include <freerdp/utils/print.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/load_plugin.h>
+
+#ifdef _WIN32
+
+#include <windows.h>
+#define DLOPEN(f) LoadLibraryA(f)
+#define DLSYM(f, n) GetProcAddress(f, n)
+#define DLCLOSE(f) FreeLibrary(f)
+#define DLERROR() ""
+
+#else
+
+#include <dlfcn.h>
+#include <unistd.h>
+#define DLOPEN(f) dlopen(f, RTLD_LOCAL | RTLD_LAZY)
+#define DLSYM(f, n) dlsym(f, n)
+#define DLCLOSE(f) dlclose(f)
+#define DLERROR() dlerror()
+
+#endif
+
+void* freerdp_open_library(const char* file)
+{
+       void* library;
+
+       library = DLOPEN(file);
+
+       if (library == NULL)
+       {
+               printf("freerdp_load_library: failed to open %s: %s\n", file, DLERROR());
+               return NULL;
+       }
+
+       return library;
+}
+
+void* freerdp_get_library_symbol(void* library, const char* name)
+{
+       void* symbol;
+
+       symbol = DLSYM(library, name);
+
+       if (symbol == NULL)
+       {
+               printf("freerdp_get_library_symbol: failed to load %s: %s\n", name, DLERROR());
+               return NULL;
+       }
+
+       return symbol;
+}
+
+boolean freerdp_close_library(void* library)
+{
+       int status;
+
+       status = DLCLOSE(library);
+
+#ifdef _WIN32
+       if (status != 0)
+#else
+       if (status == 0)
+#endif
+       {
+               printf("freerdp_free_library: failed to close: %s\n", DLERROR());
+               return false;
+       }
+
+       return true;
+}
+
+void* freerdp_load_library_symbol(const char* file, const char* name)
+{
+       void* library;
+       void* symbol;
+
+       library = DLOPEN(file);
+
+       if (library == NULL)
+       {
+               printf("freerdp_load_library_symbol: failed to open %s: %s\n", file, DLERROR());
+               return NULL;
+       }
+
+       symbol = DLSYM(library, name);
+
+       if (symbol == NULL)
+       {
+               printf("freerdp_load_library_symbol: failed to load %s: %s\n", file, DLERROR());
+               return NULL;
+       }
+
+       return symbol;
+}
+
+void* freerdp_load_plugin(const char* name, const char* entry_name)
+{
+       char* path;
+       void* entry;
+       char* suffixed_name;
+
+       suffixed_name = freerdp_append_shared_library_suffix((char*) name);
+
+       if (!freerdp_path_contains_separator(suffixed_name))
+       {
+               /* no explicit path given, use default path */
+               path = freerdp_construct_path(PLUGIN_PATH, suffixed_name);
+       }
+       else
+       {
+               /* explicit path given, use it instead of default path */
+               path = xstrdup(suffixed_name);
+       }
+
+       entry = freerdp_load_library_symbol(path, entry_name);
+
+       xfree(suffixed_name);
+       xfree(path);
+
+       if (entry == NULL)
+       {
+               printf("freerdp_load_plugin: failed to load %s/%s\n", name, entry_name);
+               return NULL;
+       }
+
+       return entry;
+}
+
+void* freerdp_load_channel_plugin(rdpSettings* settings, const char* name, const char* entry_name)
+{
+       char* path;
+       void* entry;
+       char* suffixed_name;
+
+       suffixed_name = freerdp_append_shared_library_suffix((char*) name);
+
+       if (!freerdp_path_contains_separator(suffixed_name))
+       {
+               /* no explicit path given, use default path */
+
+               if (!settings->development_mode)
+               {
+                       path = freerdp_construct_path(PLUGIN_PATH, suffixed_name);
+               }
+               else
+               {
+                       char* dot;
+                       char* plugin_name;
+                       char* channels_path;
+                       char* channel_subpath;
+
+                       dot = strrchr(suffixed_name, '.');
+                       plugin_name = xmalloc((dot - suffixed_name) + 1);
+                       strncpy(plugin_name, suffixed_name, (dot - suffixed_name));
+                       plugin_name[(dot - suffixed_name)] = '\0';
+
+                       channels_path = freerdp_construct_path(settings->development_path, "channels");
+                       channel_subpath = freerdp_construct_path(channels_path, plugin_name);
+
+                       path = freerdp_construct_path(channel_subpath, suffixed_name);
+
+                       xfree(plugin_name);
+                       xfree(channels_path);
+                       xfree(channel_subpath);
+               }
+       }
+       else
+       {
+               /* explicit path given, use it instead of default path */
+               path = xstrdup(suffixed_name);
+       }
+
+       entry = freerdp_load_library_symbol(path, entry_name);
+
+       xfree(suffixed_name);
+       xfree(path);
+
+       if (entry == NULL)
+       {
+               printf("freerdp_load_channel_plugin: failed to load %s/%s\n", name, entry_name);
+               return NULL;
+       }
+
+       return entry;
+}
diff --git a/libfreerdp-utils/memory.c b/libfreerdp-utils/memory.c
new file mode 100644 (file)
index 0000000..d4d17a6
--- /dev/null
@@ -0,0 +1,133 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Memory Utils
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <freerdp/utils/memory.h>
+
+/**
+ * Allocate memory.
+ * @param size
+ */
+
+void* xmalloc(size_t size)
+{
+       void* mem;
+
+       if (size < 1)
+               size = 1;
+
+       mem = malloc(size);
+
+       if (mem == NULL)
+       {
+               perror("xmalloc");
+               printf("xmalloc: failed to allocate memory of size: %d\n", (int) size);
+       }
+
+       return mem;
+}
+
+/**
+ * Allocate memory initialized to zero.
+ * @param size
+ */
+
+void* xzalloc(size_t size)
+{
+       void* mem;
+
+       if (size < 1)
+               size = 1;
+
+       mem = calloc(1, size);
+
+       if (mem == NULL)
+       {
+               perror("xzalloc");
+               printf("xzalloc: failed to allocate memory of size: %d\n", (int) size);
+       }
+
+       return mem;
+}
+
+/**
+ * Reallocate memory.
+ * @param ptr
+ * @param size
+ */
+
+void* xrealloc(void* ptr, size_t size)
+{
+       void* mem;
+
+       if (size < 1)
+               size = 1;
+
+       if (ptr == NULL)
+       {
+               printf("xrealloc: null pointer given\n");
+               return NULL;
+       }
+
+       mem = realloc(ptr, size);
+
+       if (mem == NULL)
+               perror("xrealloc");
+
+       return mem;
+}
+
+/**
+ * Free memory.
+ * @param mem
+ */
+
+void xfree(void* ptr)
+{
+       if (ptr != NULL)
+               free(ptr);
+}
+
+/**
+ * Duplicate a string in memory.
+ * @param str
+ * @return
+ */
+
+char* xstrdup(const char* str)
+{
+       char* mem;
+
+       if (str == NULL)
+               return NULL;
+
+#ifdef _WIN32
+       mem = _strdup(str);
+#else
+       mem = strdup(str);
+#endif
+
+       if (mem == NULL)
+               perror("strdup");
+
+       return mem;
+}
diff --git a/libfreerdp-utils/mutex.c b/libfreerdp-utils/mutex.c
new file mode 100644 (file)
index 0000000..38cd226
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Mutex Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/mutex.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#define freerdp_mutex_t HANDLE
+#else
+#include <pthread.h>
+#define freerdp_mutex_t pthread_mutex_t
+#endif
+
+freerdp_mutex freerdp_mutex_new(void)
+{
+#ifdef _WIN32
+       freerdp_mutex_t mutex;
+       mutex = CreateMutex(NULL, FALSE, NULL);
+       return (freerdp_mutex) mutex;
+#else
+       freerdp_mutex_t* mutex;
+       mutex = xnew(freerdp_mutex_t);
+       pthread_mutex_init(mutex, 0);
+       return mutex;
+#endif
+}
+
+void freerdp_mutex_free(freerdp_mutex mutex)
+{
+#ifdef _WIN32
+       CloseHandle((freerdp_mutex_t) mutex);
+#else
+       pthread_mutex_destroy((freerdp_mutex_t*) mutex);
+       xfree(mutex);
+#endif
+}
+
+void freerdp_mutex_lock(freerdp_mutex mutex)
+{
+#ifdef _WIN32
+       WaitForSingleObject((freerdp_mutex_t) mutex, INFINITE);
+#else
+       pthread_mutex_lock(mutex);
+#endif
+}
+
+void freerdp_mutex_unlock(freerdp_mutex mutex)
+{
+#ifdef _WIN32
+       ReleaseMutex((freerdp_mutex_t) mutex);
+#else
+       pthread_mutex_unlock(mutex);
+#endif
+}
diff --git a/libfreerdp-utils/passphrase.c b/libfreerdp-utils/passphrase.c
new file mode 100644 (file)
index 0000000..d207cc8
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Passphrase Handling Utils
+ *
+ * Copyright 2011 Shea Levy <shea@shealevy.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <freerdp/utils/passphrase.h>
+#ifdef _WIN32
+char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz)
+{
+       errno=ENOSYS;
+       return NULL;
+}
+#else
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <termios.h>
+#include <unistd.h>
+#include <freerdp/utils/signal.h>
+
+char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz)
+{
+       char read_char;
+       char* buf_iter;
+       char term_name[L_ctermid];
+       int term_file, write_file;
+       ssize_t nbytes;
+       size_t read_bytes = 0;
+
+       if (bufsiz == 0)
+       {
+               errno = EINVAL;
+               return NULL;
+       }
+
+       ctermid(term_name);
+       if(strcmp(term_name, "") == 0
+               || (term_file = open(term_name, O_RDWR)) == -1)
+       {
+               write_file = STDERR_FILENO;
+               terminal_fildes = STDIN_FILENO;
+       }
+       else
+       {
+               write_file = term_file;
+               terminal_fildes = term_file;
+       }
+
+       if (tcgetattr(terminal_fildes, &orig_flags) != -1)
+       {
+               new_flags = orig_flags;
+               new_flags.c_lflag &= ~ECHO;
+               new_flags.c_lflag |= ECHONL;
+               terminal_needs_reset = 1;
+               if (tcsetattr(terminal_fildes, TCSAFLUSH, &new_flags) == -1)
+                       terminal_needs_reset = 0;
+       }
+
+       if (write(write_file, prompt, strlen(prompt)) == (ssize_t) -1)
+               goto error;
+
+       buf_iter = buf;
+       while ((nbytes = read(terminal_fildes, &read_char, sizeof read_char)) == (sizeof read_char))
+       {
+               if (read_char == '\n')
+                       break;
+               if (read_bytes < (bufsiz - (size_t) 1))
+               {
+                       read_bytes++;
+                       *buf_iter = read_char;
+                       buf_iter++;
+               }
+       }
+       *buf_iter = '\0';
+       buf_iter = NULL;
+       read_char = '\0';
+       if (nbytes == (ssize_t) -1)
+               goto error;
+
+       if (terminal_needs_reset)
+       {
+               if (tcsetattr(terminal_fildes, TCSAFLUSH, &orig_flags) == -1)   
+                       goto error;
+               terminal_needs_reset = 0;
+       }
+
+       if (terminal_fildes != STDIN_FILENO)
+       {
+               if (close(terminal_fildes) == -1)
+                       goto error;
+       }
+
+       return buf;
+
+       error:
+       {
+               int saved_errno = errno;
+               buf_iter = NULL;
+               read_char = '\0';
+               if (terminal_needs_reset)
+                       tcsetattr(terminal_fildes, TCSAFLUSH, &orig_flags);
+               if (terminal_fildes != STDIN_FILENO)
+                       close(terminal_fildes);
+               errno = saved_errno;
+               return NULL;
+       }
+}
+#endif
diff --git a/libfreerdp-utils/pcap.c b/libfreerdp-utils/pcap.c
new file mode 100644 (file)
index 0000000..6de19a6
--- /dev/null
@@ -0,0 +1,217 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * pcap File Format Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#else
+#include <time.h>
+#include <sys/timeb.h>
+
+#if !defined(__MINGW32__) && !defined(__MINGW64__)
+struct timeval
+{
+       long tv_sec;
+       long tv_usec;
+};
+#endif
+
+int gettimeofday(struct timeval* tp, void* tz)
+{
+       struct _timeb timebuffer;
+       _ftime (&timebuffer);
+       tp->tv_sec = (long) timebuffer.time;
+       tp->tv_usec = timebuffer.millitm * 1000;
+       return 0;
+}
+#endif
+
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/utils/pcap.h>
+
+#define PCAP_MAGIC     0xA1B2C3D4
+
+void pcap_read_header(rdpPcap* pcap, pcap_header* header)
+{
+       fread((void*) header, sizeof(pcap_header), 1, pcap->fp);
+}
+
+void pcap_write_header(rdpPcap* pcap, pcap_header* header)
+{
+       fwrite((void*) header, sizeof(pcap_header), 1, pcap->fp);
+}
+
+void pcap_read_record_header(rdpPcap* pcap, pcap_record_header* record)
+{
+       fread((void*) record, sizeof(pcap_record_header), 1, pcap->fp);
+}
+
+void pcap_write_record_header(rdpPcap* pcap, pcap_record_header* record)
+{
+       fwrite((void*) record, sizeof(pcap_record_header), 1, pcap->fp);
+}
+
+void pcap_read_record(rdpPcap* pcap, pcap_record* record)
+{
+       pcap_read_record_header(pcap, &record->header);
+       record->length = record->header.incl_len;
+       record->data = xmalloc(record->length);
+       fread(record->data, record->length, 1, pcap->fp);
+}
+
+void pcap_write_record(rdpPcap* pcap, pcap_record* record)
+{
+       pcap_write_record_header(pcap, &record->header);
+       fwrite(record->data, record->length, 1, pcap->fp);
+}
+
+void pcap_add_record(rdpPcap* pcap, void* data, uint32 length)
+{
+       pcap_record* record;
+       struct timeval tp;
+
+       if (pcap->tail == NULL)
+       {
+               pcap->tail = (pcap_record*) xzalloc(sizeof(pcap_record));
+               pcap->head = pcap->tail;
+               pcap->record = pcap->head;
+               record = pcap->tail;
+       }
+       else
+       {
+               record = (pcap_record*) xzalloc(sizeof(pcap_record));
+               pcap->tail->next = record;
+               pcap->tail = record;
+       }
+
+       if (pcap->record == NULL)
+               pcap->record = record;
+
+       record->data = data;
+       record->length = length;
+       record->header.incl_len = length;
+       record->header.orig_len = length;
+
+       gettimeofday(&tp, 0);
+       record->header.ts_sec = tp.tv_sec;
+       record->header.ts_usec = tp.tv_usec;
+}
+
+boolean pcap_has_next_record(rdpPcap* pcap)
+{
+       if (pcap->file_size - (ftell(pcap->fp)) <= 16)
+               return false;
+
+       return true;
+}
+
+boolean pcap_get_next_record_header(rdpPcap* pcap, pcap_record* record)
+{
+       if (pcap_has_next_record(pcap) != true)
+               return false;
+
+       pcap_read_record_header(pcap, &record->header);
+       record->length = record->header.incl_len;
+       record->data = xmalloc(record->length);
+
+       return true;
+}
+
+boolean pcap_get_next_record_content(rdpPcap* pcap, pcap_record* record)
+{
+       fread(record->data, record->length, 1, pcap->fp);
+       return true;
+}
+
+boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record)
+{
+       if (pcap_has_next_record(pcap) != true)
+               return false;
+
+       pcap_read_record(pcap, record);
+
+       return true;
+}
+
+rdpPcap* pcap_open(char* name, boolean write)
+{
+       rdpPcap* pcap;
+
+       FILE *pcap_fp = fopen(name, write ? "w+" : "r");
+       if (pcap_fp == NULL)
+       {
+               perror("opening pcap dump");
+               return NULL;
+       }
+
+       pcap = (rdpPcap*) xzalloc(sizeof(rdpPcap));
+
+       if (pcap != NULL)
+       {
+               pcap->name = name;
+               pcap->write = write;
+               pcap->record_count = 0;
+               pcap->fp = pcap_fp;
+
+               if (write)
+               {
+                       pcap->header.magic_number = 0xA1B2C3D4;
+                       pcap->header.version_major = 2;
+                       pcap->header.version_minor = 4;
+                       pcap->header.thiszone = 0;
+                       pcap->header.sigfigs = 0;
+                       pcap->header.snaplen = 0xFFFFFFFF;
+                       pcap->header.network = 0;
+                       pcap_write_header(pcap, &pcap->header);
+               }
+               else
+               {
+                       fseek(pcap->fp, 0, SEEK_END);
+                       pcap->file_size = (int) ftell(pcap->fp);
+                       fseek(pcap->fp, 0, SEEK_SET);
+                       pcap_read_header(pcap, &pcap->header);
+               }
+       }
+
+       return pcap;
+}
+
+void pcap_flush(rdpPcap* pcap)
+{
+       while (pcap->record != NULL)
+       {
+               pcap_write_record(pcap, pcap->record);
+               pcap->record = pcap->record->next;
+       }
+
+       if (pcap->fp != NULL)
+               fflush(pcap->fp);
+}
+
+void pcap_close(rdpPcap* pcap)
+{
+       pcap_flush(pcap);
+
+       if (pcap->fp != NULL)
+               fclose(pcap->fp);
+}
diff --git a/libfreerdp-utils/profiler.c b/libfreerdp-utils/profiler.c
new file mode 100644 (file)
index 0000000..13b560c
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Profiler Utils
+ *
+ * Copyright 2011 Stephen Erisman
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/profiler.h>
+
+PROFILER* profiler_create(char* name)
+{
+       PROFILER* profiler;
+
+       profiler = (PROFILER*) xmalloc(sizeof(PROFILER));
+       
+       profiler->name = name;
+       profiler->stopwatch = stopwatch_create();
+
+       return profiler;
+}
+
+void profiler_free(PROFILER* profiler)
+{      
+       stopwatch_free(profiler->stopwatch);
+       
+       xfree(profiler);
+}
+
+void profiler_enter(PROFILER* profiler)
+{
+       stopwatch_start(profiler->stopwatch);
+}
+
+void profiler_exit(PROFILER* profiler)
+{
+       stopwatch_stop(profiler->stopwatch);
+}
+
+void profiler_print_header()
+{
+       printf("\n");
+       printf("                                             |-----------------------|\n" );
+       printf("                PROFILER                     |    elapsed seconds    |\n" );
+       printf("|--------------------------------------------|-----------------------|\n" );
+       printf("| code section                  | iterations |     total |      avg. |\n" );
+       printf("|-------------------------------|------------|-----------|-----------|\n" );
+}
+
+void profiler_print(PROFILER* profiler)
+{
+       double elapsed_sec = stopwatch_get_elapsed_time_in_seconds(profiler->stopwatch);
+       double avg_sec = elapsed_sec / (double) profiler->stopwatch->count;
+       
+       printf("| %-30.30s| %'10lu | %'9f | %'9f |\n", profiler->name, profiler->stopwatch->count, elapsed_sec, avg_sec);
+}
+
+void profiler_print_footer()
+{
+       printf("|--------------------------------------------------------------------|\n" );
+}
diff --git a/libfreerdp-utils/rail.c b/libfreerdp-utils/rail.c
new file mode 100644 (file)
index 0000000..a89329c
--- /dev/null
@@ -0,0 +1,184 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Remote Applications Integrated Locally (RAIL) Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/utils/rail.h>
+#include <freerdp/rail.h>
+
+void rail_unicode_string_alloc(UNICODE_STRING* unicode_string, uint16 cbString)
+{
+       unicode_string->length = cbString;
+       unicode_string->string = xzalloc(cbString);
+}
+
+void rail_unicode_string_free(UNICODE_STRING* unicode_string)
+{
+       unicode_string->length = 0;
+
+       if (unicode_string->string != NULL)
+               xfree(unicode_string->string);
+}
+
+void rail_read_unicode_string(STREAM* s, UNICODE_STRING* unicode_string)
+{
+       stream_read_uint16(s, unicode_string->length); /* cbString (2 bytes) */
+
+       if (unicode_string->string == NULL)
+               unicode_string->string = (uint8*) xmalloc(unicode_string->length);
+       else
+               unicode_string->string = (uint8*) xrealloc(unicode_string->string, unicode_string->length);
+
+       stream_read(s, unicode_string->string, unicode_string->length);
+}
+
+void rail_write_unicode_string(STREAM* s, UNICODE_STRING* unicode_string)
+{
+       stream_check_size(s, 2 + unicode_string->length);
+       stream_write_uint16(s, unicode_string->length); /* cbString (2 bytes) */
+       stream_write(s, unicode_string->string, unicode_string->length); /* string */
+}
+
+void rail_write_unicode_string_value(STREAM* s, UNICODE_STRING* unicode_string)
+{
+       if (unicode_string->length > 0)
+       {
+               stream_check_size(s, unicode_string->length);
+               stream_write(s, unicode_string->string, unicode_string->length); /* string */
+       }
+}
+
+void rail_read_rectangle_16(STREAM* s, RECTANGLE_16* rectangle_16)
+{
+       stream_read_uint16(s, rectangle_16->left); /* left (2 bytes) */
+       stream_read_uint16(s, rectangle_16->top); /* top (2 bytes) */
+       stream_read_uint16(s, rectangle_16->right); /* right (2 bytes) */
+       stream_read_uint16(s, rectangle_16->bottom); /* bottom (2 bytes) */
+}
+
+void rail_write_rectangle_16(STREAM* s, RECTANGLE_16* rectangle_16)
+{
+       stream_write_uint16(s, rectangle_16->left); /* left (2 bytes) */
+       stream_write_uint16(s, rectangle_16->top); /* top (2 bytes) */
+       stream_write_uint16(s, rectangle_16->right); /* right (2 bytes) */
+       stream_write_uint16(s, rectangle_16->bottom); /* bottom (2 bytes) */
+}
+
+void* rail_clone_order(uint32 event_type, void* order)
+{
+       struct
+       {
+               uint32 type;
+               uint32 size;
+       } ordersize_table[] =
+       {
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS, sizeof(RAIL_SYSPARAM_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS, sizeof(RAIL_EXEC_RESULT_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_SYSPARAM, sizeof(RAIL_SYSPARAM_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_MINMAXINFO, sizeof(RAIL_MINMAXINFO_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_SERVER_LOCALMOVESIZE, sizeof(RAIL_LOCALMOVESIZE_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP, sizeof(RAIL_GET_APPID_RESP_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CHANNEL_LANGBARINFO, sizeof(RAIL_LANGBAR_INFO_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS, sizeof(RAIL_SYSPARAM_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_EXEC_REMOTE_APP, sizeof(RDP_PLUGIN_DATA)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_ACTIVATE, sizeof(RAIL_ACTIVATE_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_SYSMENU, sizeof(RAIL_SYSMENU_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_SYSCOMMAND, sizeof(RAIL_SYSCOMMAND_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_NOTIFY_EVENT, sizeof(RAIL_NOTIFY_EVENT_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, sizeof(RAIL_WINDOW_MOVE_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_APPID_REQ, sizeof(RAIL_GET_APPID_REQ_ORDER)},
+               {RDP_EVENT_TYPE_RAIL_CLIENT_LANGBARINFO, sizeof(RAIL_LANGBAR_INFO_ORDER)},
+       };
+       size_t i = 0;
+       size_t order_size = 0;
+       void*  new_order = NULL;
+
+       for (i = 0; i < RAIL_ARRAY_SIZE(ordersize_table); i++)
+       {
+               if (event_type == ordersize_table[i].type)
+               {
+                       order_size = ordersize_table[i].size;
+                       break;
+               }
+       }
+
+       // Event type not found.
+       if (order_size == 0) return NULL;
+
+       new_order = xmalloc(order_size);
+       memcpy(new_order, order, order_size);
+
+       //printf("rail_clone_order: type=%d order=%p\n", event_type, new_order);
+
+       // Create copy of variable data for some orders
+       if ((event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS) ||
+               (event_type == RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS))
+       {
+               RAIL_SYSPARAM_ORDER* new_sysparam = (RAIL_SYSPARAM_ORDER*)new_order;
+               RAIL_SYSPARAM_ORDER* old_sysparam = (RAIL_SYSPARAM_ORDER*)order;
+
+               rail_unicode_string_alloc(&new_sysparam->highContrast.colorScheme,
+                       old_sysparam->highContrast.colorScheme.length);
+
+               memcpy(new_sysparam->highContrast.colorScheme.string,
+                       old_sysparam->highContrast.colorScheme.string,
+                       old_sysparam->highContrast.colorScheme.length);
+       }
+
+       if (event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS)
+       {
+               RAIL_EXEC_RESULT_ORDER* new_exec_result = (RAIL_EXEC_RESULT_ORDER*)new_order;
+               RAIL_EXEC_RESULT_ORDER* old_exec_result = (RAIL_EXEC_RESULT_ORDER*)order;
+
+               rail_unicode_string_alloc(&new_exec_result->exeOrFile,
+                               old_exec_result->exeOrFile.length);
+
+               memcpy(new_exec_result->exeOrFile.string,
+                       old_exec_result->exeOrFile.string,
+                       old_exec_result->exeOrFile.length);
+       }
+
+       if (event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_APPID_RESP)
+       {
+               RAIL_GET_APPID_RESP_ORDER* new_app_resp = (RAIL_GET_APPID_RESP_ORDER*)new_order;
+
+               new_app_resp->applicationId.string = &new_app_resp->applicationIdBuffer[0];
+       }
+
+       return new_order;
+}
+
+void rail_free_cloned_order(uint32 event_type, void* order)
+{
+       //printf("rail_free_cloned_order: type=%d order=%p\n", event_type, order);
+       if ((event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_GET_SYSPARAMS) ||
+               (event_type == RDP_EVENT_TYPE_RAIL_CLIENT_SET_SYSPARAMS))
+       {
+               RAIL_SYSPARAM_ORDER* sysparam = (RAIL_SYSPARAM_ORDER*)order;
+               rail_unicode_string_free(&sysparam->highContrast.colorScheme);
+       }
+
+       if (event_type == RDP_EVENT_TYPE_RAIL_CHANNEL_EXEC_RESULTS)
+       {
+               RAIL_EXEC_RESULT_ORDER* exec_result = (RAIL_EXEC_RESULT_ORDER*)order;
+               rail_unicode_string_free(&exec_result->exeOrFile);
+       }
+       xfree(order);
+}
diff --git a/libfreerdp-utils/rect.c b/libfreerdp-utils/rect.c
new file mode 100644 (file)
index 0000000..08cdea7
--- /dev/null
@@ -0,0 +1,56 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Rectangle Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/types.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/utils/rect.h>
+
+void freerdp_read_rectangle_16(STREAM* s, RECTANGLE_16* rectangle_16)
+{
+       stream_read_uint16(s, rectangle_16->left); /* left (2 bytes) */
+       stream_read_uint16(s, rectangle_16->top); /* top (2 bytes) */
+       stream_read_uint16(s, rectangle_16->right); /* right (2 bytes) */
+       stream_read_uint16(s, rectangle_16->bottom); /* bottom (2 bytes) */
+}
+
+void freerdp_write_rectangle_16(STREAM* s, RECTANGLE_16* rectangle_16)
+{
+       stream_write_uint16(s, rectangle_16->left); /* left (2 bytes) */
+       stream_write_uint16(s, rectangle_16->top); /* top (2 bytes) */
+       stream_write_uint16(s, rectangle_16->right); /* right (2 bytes) */
+       stream_write_uint16(s, rectangle_16->bottom); /* bottom (2 bytes) */
+}
+
+RECTANGLE_16* freerdp_rectangle_16_new(uint16 left, uint16 top, uint16 right, uint16 bottom)
+{
+       RECTANGLE_16* rectangle_16 = xnew(RECTANGLE_16);
+
+       rectangle_16->left = left;
+       rectangle_16->top = top;
+       rectangle_16->right = right;
+       rectangle_16->bottom = bottom;
+
+       return rectangle_16;
+}
+
+void freerdp_rectangle_16_free(RECTANGLE_16* rectangle_16)
+{
+       xfree(rectangle_16);
+}
diff --git a/libfreerdp-utils/registry.c b/libfreerdp-utils/registry.c
new file mode 100644 (file)
index 0000000..04a8352
--- /dev/null
@@ -0,0 +1,194 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Registry Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/file.h>
+
+#include <freerdp/utils/registry.h>
+
+static const char registry_dir[] = "freerdp";
+static const char registry_file[] = "config.txt";
+
+static REG_SECTION global[] =
+{
+       { REG_TYPE_SECTION, "global",                   0,  NULL },
+       { REG_TYPE_BOOLEAN, "fast_path",                1,  "1" },
+       { REG_TYPE_STRING,  "resolution",               8,  "1024x768" },
+       { REG_TYPE_INTEGER, "performance_flags",        4,  "0xFFFF" },
+       { REG_TYPE_NONE,    "",                         0,  NULL }
+};
+
+static REG_SECTION licensing[] =
+{
+       { REG_TYPE_SECTION, "licensing",        0,  NULL },
+       { REG_TYPE_STRING,  "platform_id",      1,  "0x000201" },
+       { REG_TYPE_STRING,  "hardware_id",      16, "0xe107d9d372bb6826bd81d3542a419d6" },
+       { REG_TYPE_NONE,    "",                 0,  NULL }
+};
+
+static REG_SECTION* sections[] =
+{
+       (REG_SECTION*) &global,
+       (REG_SECTION*) &licensing,
+       (REG_SECTION*) NULL
+};
+
+void registry_print_entry(REG_ENTRY* entry, FILE* fp)
+{
+       uint8* value;
+       value = (uint8*) entry->value;
+       fprintf(fp, "%s = %s\n", entry->name, value);
+}
+
+void registry_print_section(REG_SECTION* section, FILE* fp)
+{
+       int i = 0;
+       REG_ENTRY* entries = (REG_ENTRY*) &section[1];
+
+       fprintf(fp, "\n");
+       fprintf(fp, "[%s]\n", section->name);
+
+       while (entries[i].type != REG_TYPE_NONE)
+       {
+               registry_print_entry(&entries[i], fp);
+               i++;
+       }
+}
+
+void registry_print(rdpRegistry* registry, FILE* fp)
+{
+       int i = 0;
+
+       fprintf(fp, "# FreeRDP Configuration Registry\n");
+
+       while (sections[i] != NULL)
+       {
+               registry_print_section(sections[i], fp);
+               i++;
+       }
+
+       fprintf(fp, "\n");
+}
+
+void registry_create(rdpRegistry* registry)
+{
+       registry->fp = fopen((char*)registry->file, "w+");
+
+       if (registry->fp == NULL)
+       {
+               printf("registry_create: error opening [%s] for writing\n", registry->file);
+               return;
+       }
+
+       registry_print(registry, registry->fp);
+       fflush(registry->fp);
+}
+
+void registry_load(rdpRegistry* registry)
+{
+       registry->fp = fopen((char*) registry->file, "r+");
+}
+
+void registry_open(rdpRegistry* registry)
+{
+       struct stat stat_info;
+
+       if (stat((char*)registry->file, &stat_info) != 0)
+               registry_create(registry);
+       else
+               registry_load(registry);
+}
+
+void registry_close(rdpRegistry* registry)
+{
+       if (registry->fp != NULL)
+               fclose(registry->fp);
+}
+
+void registry_init(rdpRegistry* registry)
+{
+       int length;
+       char* home_path;
+       struct stat stat_info;
+
+       if (registry->settings->home_path == NULL)
+               home_path = getenv("HOME");
+       else
+               home_path = registry->settings->home_path;
+
+       if (home_path == NULL)
+       {
+               printf("could not get home path\n");
+               registry->available = false;
+               return;
+       }
+
+       registry->available = true;
+
+       if (home_path == NULL)
+       {
+               printf("could not get home path\n");
+               registry->available = false;
+               return;
+       }
+
+       registry->home = (char*) xstrdup(home_path);
+       printf("home path: %s\n", registry->home);
+
+       registry->path = (char*) xmalloc(strlen(registry->home) + strlen("/.") + strlen(registry_dir) + 1);
+       sprintf(registry->path, "%s/.%s", registry->home, registry_dir);
+       printf("registry path: %s\n", registry->path);
+
+       if (stat(registry->path, &stat_info) != 0)
+       {
+               freerdp_mkdir(registry->path);
+               printf("creating directory %s\n", registry->path);
+       }
+
+       length = strlen(registry->path);
+       registry->file = (char*) xmalloc(strlen(registry->path) + strlen("/") + strlen(registry_file) + 1);
+       sprintf(registry->file, "%s/%s", registry->path, registry_file);
+       printf("registry file: %s\n", registry->file);
+
+       registry_open(registry);
+}
+
+rdpRegistry* registry_new(rdpSettings* settings)
+{
+       rdpRegistry* registry = (rdpRegistry*) xzalloc(sizeof(rdpRegistry));
+
+       if (registry != NULL)
+       {
+               registry->settings = settings;
+               registry_init(registry);
+       }
+
+       return registry;
+}
+
+void registry_free(rdpRegistry* registry)
+{
+       if (registry != NULL)
+       {
+               registry_close(registry);
+               xfree(registry->path);
+               xfree(registry->file);
+               xfree(registry->home);
+               xfree(registry);
+       }
+}
diff --git a/libfreerdp-utils/semaphore.c b/libfreerdp-utils/semaphore.c
new file mode 100644 (file)
index 0000000..e5a6aa3
--- /dev/null
@@ -0,0 +1,96 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Semaphore Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/semaphore.h>
+
+#if defined __APPLE__
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <mach/mach.h>
+#include <mach/semaphore.h>
+#include <mach/task.h>
+#define freerdp_sem_t semaphore_t
+
+#elif defined _WIN32
+
+#include <windows.h>
+#define freerdp_sem_t HANDLE
+
+#else
+
+#include <pthread.h>
+#include <semaphore.h>
+#define freerdp_sem_t sem_t
+
+#endif
+
+freerdp_sem freerdp_sem_new(int iv)
+{
+       freerdp_sem_t* sem;
+
+       sem = xnew(freerdp_sem_t);
+
+#if defined __APPLE__
+       semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, iv);
+#elif defined _WIN32
+       *sem = CreateSemaphore(NULL, 0, iv, NULL);
+#else
+       sem_init(sem, 0, iv);
+#endif
+
+       return sem;
+}
+
+void freerdp_sem_free(freerdp_sem sem)
+{
+#if defined __APPLE__
+       semaphore_destroy(mach_task_self(), *((freerdp_sem_t*)sem));
+#elif defined _WIN32
+       CloseHandle(*((freerdp_sem_t*)sem));
+#else
+       sem_destroy((freerdp_sem_t*)sem);
+#endif
+
+       xfree(sem);
+}
+
+void freerdp_sem_signal(freerdp_sem sem)
+{
+#if defined __APPLE__
+       semaphore_signal(*((freerdp_sem_t*)sem));
+#elif defined _WIN32
+       ReleaseSemaphore(*((freerdp_sem_t*)sem), 1, NULL);
+#else
+       sem_post((freerdp_sem_t*)sem);
+#endif
+}
+
+void freerdp_sem_wait(freerdp_sem sem)
+{
+#if defined __APPLE__
+       semaphore_wait(*((freerdp_sem_t*)sem));
+#elif defined _WIN32
+       WaitForSingleObject(*((freerdp_sem_t*)sem), INFINITE);
+#else
+       sem_wait((freerdp_sem_t*)sem);
+#endif
+}
+
diff --git a/libfreerdp-utils/signal.c b/libfreerdp-utils/signal.c
new file mode 100644 (file)
index 0000000..8f9f675
--- /dev/null
@@ -0,0 +1,115 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Signal handling
+ *
+ * Copyright 2011 Shea Levy <shea@shealevy.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stddef.h>
+#include <freerdp/utils/signal.h>
+#ifdef _WIN32
+#include <errno.h>
+int freerdp_handle_signals(void)
+{
+       errno = ENOSYS;
+       return -1;
+}
+#else
+volatile sig_atomic_t terminal_needs_reset = 0;
+int terminal_fildes = 0;
+struct termios orig_flags;
+struct termios new_flags;
+
+static void fatal_handler(int signum)
+{
+       struct sigaction default_sigaction;
+       sigset_t this_mask;
+
+       if (terminal_needs_reset)
+               tcsetattr(terminal_fildes, TCSAFLUSH, &orig_flags);
+
+       default_sigaction.sa_handler = SIG_DFL;
+       sigfillset(&(default_sigaction.sa_mask));
+       default_sigaction.sa_flags = 0;
+
+       sigaction(signum, &default_sigaction, NULL);
+
+       sigemptyset(&this_mask);
+       sigaddset(&this_mask, signum);
+       pthread_sigmask(SIG_UNBLOCK, &this_mask, NULL);
+       raise(signum);
+}
+
+int freerdp_handle_signals(void)
+{
+       const int fatal_signals[] = {
+               SIGABRT,
+               SIGALRM,
+               SIGBUS,
+               SIGFPE,
+               SIGHUP,
+               SIGILL,
+               SIGINT,
+               SIGKILL,
+               SIGPIPE,
+               SIGQUIT,
+               SIGSEGV,
+               SIGSTOP,
+               SIGTERM,
+               SIGTSTP,
+               SIGTTIN,
+               SIGTTOU,
+               SIGUSR1,
+               SIGUSR2,
+#ifdef SIGPOLL
+               SIGPOLL,
+#endif
+#ifdef SIGPROF
+               SIGPROF,
+#endif
+#ifdef SIGSYS
+               SIGSYS,
+#endif
+               SIGTRAP,
+#ifdef SIGVTALRM
+               SIGVTALRM,
+#endif
+               SIGXCPU,
+               SIGXFSZ
+       };
+       int signal_index;
+       sigset_t orig_set;
+       struct sigaction orig_sigaction, fatal_sigaction;
+
+       sigfillset(&(fatal_sigaction.sa_mask));
+       sigdelset(&(fatal_sigaction.sa_mask), SIGCONT);
+       pthread_sigmask(SIG_BLOCK, &(fatal_sigaction.sa_mask), &orig_set);
+
+       fatal_sigaction.sa_handler = fatal_handler;
+       fatal_sigaction.sa_flags  = 0;
+
+       for (signal_index = 0;
+               signal_index < (sizeof fatal_signals / sizeof fatal_signals[0]);
+               signal_index++)
+               if (sigaction(fatal_signals[signal_index],
+                       NULL, &orig_sigaction) == 0)
+                       if (orig_sigaction.sa_handler != SIG_IGN)
+                               sigaction(fatal_signals[signal_index],
+                                       &fatal_sigaction, NULL); 
+
+       pthread_sigmask(SIG_SETMASK, &orig_set, NULL);
+       return 0;
+}
+#endif
diff --git a/libfreerdp-utils/sleep.c b/libfreerdp-utils/sleep.c
new file mode 100644 (file)
index 0000000..3612fb5
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Sleep Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/sleep.h>
+
+#include <time.h>
+
+#ifndef _WIN32
+#define _XOPEN_SOURCE 500
+#include <unistd.h>
+#else
+#include <windows.h>
+#endif
+
+void freerdp_sleep(uint32 seconds)
+{
+#ifndef _WIN32
+       sleep(seconds);
+#else
+       Sleep(seconds * 1000);
+#endif
+}
+
+void freerdp_usleep(uint32 useconds)
+{
+#ifndef _WIN32
+       usleep(useconds);
+#else
+       uint64 t1;
+       uint64 t2;
+       uint64 freq;
+
+       QueryPerformanceCounter((LARGE_INTEGER*) &t1);
+       QueryPerformanceCounter((LARGE_INTEGER*) &freq);
+
+       do
+       {
+               QueryPerformanceCounter((LARGE_INTEGER*) &t2);
+       }
+       while ((t2 - t1) < useconds);
+#endif
+}
diff --git a/libfreerdp-utils/stopwatch.c b/libfreerdp-utils/stopwatch.c
new file mode 100644 (file)
index 0000000..daf1641
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Stopwatch Utils
+ *
+ * Copyright 2011 Stephen Erisman
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/stopwatch.h>
+
+STOPWATCH* stopwatch_create()
+{
+       STOPWATCH* sw;
+
+       sw = (STOPWATCH*) xmalloc(sizeof(STOPWATCH));
+       stopwatch_reset(sw);
+
+       return sw;
+}
+
+void stopwatch_free(STOPWATCH* stopwatch)
+{
+       xfree(stopwatch);
+}
+
+void stopwatch_start(STOPWATCH* stopwatch)
+{
+       stopwatch->start = clock();
+       stopwatch->count++;
+}
+
+void stopwatch_stop(STOPWATCH* stopwatch)
+{
+       stopwatch->end = clock();
+       stopwatch->elapsed += (stopwatch->end - stopwatch->start);
+}
+
+void stopwatch_reset(STOPWATCH* stopwatch)
+{
+       stopwatch->start = 0;
+       stopwatch->end = 0;
+       stopwatch->elapsed = 0;
+       stopwatch->count = 0;
+}
+
+double stopwatch_get_elapsed_time_in_seconds(STOPWATCH* stopwatch)
+{
+       return ((double) stopwatch->elapsed) / CLOCKS_PER_SEC;
+}
+
+void stopwatch_get_elapsed_time_in_useconds(STOPWATCH* stopwatch, uint32* sec, uint32* usec)
+{
+       double uelapsed;
+       double clocks_per_usec;
+
+       *sec = ((uint32) stopwatch->elapsed) / CLOCKS_PER_SEC;
+       uelapsed = stopwatch->elapsed - ((double)(*sec) * CLOCKS_PER_SEC);
+
+       clocks_per_usec = (CLOCKS_PER_SEC / 1000000);
+
+       if (clocks_per_usec > 0.0)
+               *usec = (uint32)(uelapsed / clocks_per_usec);
+       else
+               *usec = 0;
+}
+
diff --git a/libfreerdp-utils/stream.c b/libfreerdp-utils/stream.c
new file mode 100644 (file)
index 0000000..5435175
--- /dev/null
@@ -0,0 +1,76 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Stream Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/stream.h>
+
+STREAM* stream_new(int size)
+{
+       STREAM* stream;
+
+       stream = xnew(STREAM);
+
+       if (stream != NULL)
+       {
+               if (size != 0)
+               {
+                       size = size > 0 ? size : 0x400;
+                       stream->data = (uint8*) xzalloc(size);
+                       stream->p = stream->data;
+                       stream->size = size;
+               }
+       }
+
+       return stream;
+}
+
+void stream_free(STREAM* stream)
+{
+       if (stream != NULL)
+       {
+               if (stream->data != NULL)
+                       xfree(stream->data);
+
+               xfree(stream);
+       }
+}
+
+void stream_extend(STREAM* stream, int request_size)
+{
+       int pos;
+       int original_size;
+       int increased_size;
+
+       pos = stream_get_pos(stream);
+       original_size = stream->size;
+       increased_size = (request_size > original_size ? request_size : original_size);
+       stream->size += increased_size;
+
+       if (original_size == 0)
+               stream->data = (uint8*) xmalloc(stream->size);
+       else
+               stream->data = (uint8*) xrealloc(stream->data, stream->size);
+
+       memset(stream->data + original_size, 0, increased_size);
+       stream_set_pos(stream, pos);
+}
diff --git a/libfreerdp-utils/string.c b/libfreerdp-utils/string.c
new file mode 100644 (file)
index 0000000..c3b2a3a
--- /dev/null
@@ -0,0 +1,39 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * String Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/utils/string.h>
+
+void freerdp_string_read_length32(STREAM* s, rdpString* string, UNICONV* uniconv)
+{
+       stream_read_uint32(s, string->length);
+       string->unicode = (char*) xmalloc(string->length);
+       stream_read(s, string->unicode, string->length);
+       string->ascii = freerdp_uniconv_in(uniconv, (uint8*) string->unicode, string->length);
+}
+
+void freerdp_string_free(rdpString* string)
+{
+       if (string->unicode != NULL)
+               xfree(string->unicode);
+
+       if (string->ascii != NULL)
+               xfree(string->ascii);
+}
diff --git a/libfreerdp-utils/svc_plugin.c b/libfreerdp-utils/svc_plugin.c
new file mode 100644 (file)
index 0000000..72379d5
--- /dev/null
@@ -0,0 +1,410 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Static Virtual Channel Interface
+ *
+ * Copyright 2009-2011 Jay Sorg
+ * Copyright 2010-2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/mutex.h>
+#include <freerdp/utils/debug.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/list.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/utils/event.h>
+#include <freerdp/utils/svc_plugin.h>
+
+/* The list of all plugin instances. */
+typedef struct rdp_svc_plugin_list rdpSvcPluginList;
+struct rdp_svc_plugin_list
+{
+       rdpSvcPlugin* plugin;
+       rdpSvcPluginList* next;
+};
+
+static rdpSvcPluginList* g_svc_plugin_list = NULL;
+
+/* For locking the global resources */
+static freerdp_mutex g_mutex = NULL;
+
+/* Queue for receiving packets */
+struct _svc_data_in_item
+{
+       STREAM* data_in;
+       RDP_EVENT* event_in;
+};
+typedef struct _svc_data_in_item svc_data_in_item;
+
+static void svc_data_in_item_free(svc_data_in_item* item)
+{
+       if (item->data_in)
+       {
+               stream_free(item->data_in);
+               item->data_in = NULL;
+       }
+       if (item->event_in)
+       {
+               freerdp_event_free(item->event_in);
+               item->event_in = NULL;
+       }
+       xfree(item);
+}
+
+struct rdp_svc_plugin_private
+{
+       void* init_handle;
+       uint32 open_handle;
+       STREAM* data_in;
+
+       LIST* data_in_list;
+       freerdp_thread* thread;
+};
+
+static rdpSvcPlugin* svc_plugin_find_by_init_handle(void* init_handle)
+{
+       rdpSvcPluginList * list;
+       rdpSvcPlugin * plugin;
+
+       freerdp_mutex_lock(g_mutex);
+       for (list = g_svc_plugin_list; list; list = list->next)
+       {
+               plugin = list->plugin;
+               if (plugin->priv->init_handle == init_handle)
+               {
+                       freerdp_mutex_unlock(g_mutex);
+                       return plugin;
+               }
+       }
+       freerdp_mutex_unlock(g_mutex);
+       return NULL;
+}
+
+static rdpSvcPlugin* svc_plugin_find_by_open_handle(uint32 open_handle)
+{
+       rdpSvcPluginList * list;
+       rdpSvcPlugin * plugin;
+
+       freerdp_mutex_lock(g_mutex);
+       for (list = g_svc_plugin_list; list; list = list->next)
+       {
+               plugin = list->plugin;
+               if (plugin->priv->open_handle == open_handle)
+               {
+                       freerdp_mutex_unlock(g_mutex);
+                       return plugin;
+               }
+       }
+       freerdp_mutex_unlock(g_mutex);
+       return NULL;
+}
+
+static void svc_plugin_remove(rdpSvcPlugin* plugin)
+{
+       rdpSvcPluginList* list;
+       rdpSvcPluginList* prev;
+
+       /* Remove from global list */
+       freerdp_mutex_lock(g_mutex);
+       for (prev = NULL, list = g_svc_plugin_list; list; prev = list, list = list->next)
+       {
+               if (list->plugin == plugin)
+                       break;
+       }
+       if (list)
+       {
+               if (prev)
+                       prev->next = list->next;
+               else
+                       g_svc_plugin_list = list->next;
+               xfree(list);
+       }
+       freerdp_mutex_unlock(g_mutex);
+}
+
+static void svc_plugin_process_received(rdpSvcPlugin* plugin, void* pData, uint32 dataLength,
+       uint32 totalLength, uint32 dataFlags)
+{
+       STREAM* data_in;
+       svc_data_in_item* item;
+
+       if (dataFlags & CHANNEL_FLAG_FIRST)
+       {
+               if (plugin->priv->data_in != NULL)
+                       stream_free(plugin->priv->data_in);
+               plugin->priv->data_in = stream_new(totalLength);
+       }
+
+       data_in = plugin->priv->data_in;
+       stream_check_size(data_in, (int) dataLength);
+       stream_write(data_in, pData, dataLength);
+
+       if (dataFlags & CHANNEL_FLAG_LAST)
+       {
+               if (stream_get_size(data_in) != stream_get_length(data_in))
+               {
+                       printf("svc_plugin_process_received: read error\n");
+               }
+
+               plugin->priv->data_in = NULL;
+               stream_set_pos(data_in, 0);
+
+               item = xnew(svc_data_in_item);
+               item->data_in = data_in;
+
+               freerdp_thread_lock(plugin->priv->thread);
+               list_enqueue(plugin->priv->data_in_list, item);
+               freerdp_thread_unlock(plugin->priv->thread);
+
+               freerdp_thread_signal(plugin->priv->thread);
+       }
+}
+
+static void svc_plugin_process_event(rdpSvcPlugin* plugin, RDP_EVENT* event_in)
+{
+       svc_data_in_item* item;
+
+       item = xnew(svc_data_in_item);
+       item->event_in = event_in;
+
+       freerdp_thread_lock(plugin->priv->thread);
+       list_enqueue(plugin->priv->data_in_list, item);
+       freerdp_thread_unlock(plugin->priv->thread);
+
+       freerdp_thread_signal(plugin->priv->thread);
+}
+
+static void svc_plugin_open_event(uint32 openHandle, uint32 event, void* pData, uint32 dataLength,
+       uint32 totalLength, uint32 dataFlags)
+{
+       rdpSvcPlugin* plugin;
+
+       DEBUG_SVC("openHandle %d event %d dataLength %d totalLength %d dataFlags %d",
+               openHandle, event, dataLength, totalLength, dataFlags);
+
+       plugin = (rdpSvcPlugin*)svc_plugin_find_by_open_handle(openHandle);
+       if (plugin == NULL)
+       {
+               printf("svc_plugin_open_event: error no match\n");
+               return;
+       }
+       switch (event)
+       {
+               case CHANNEL_EVENT_DATA_RECEIVED:
+                       svc_plugin_process_received(plugin, pData, dataLength, totalLength, dataFlags);
+                       break;
+               case CHANNEL_EVENT_WRITE_COMPLETE:
+                       stream_free((STREAM*)pData);
+                       break;
+               case CHANNEL_EVENT_USER:
+                       svc_plugin_process_event(plugin, (RDP_EVENT*)pData);
+                       break;
+       }
+}
+
+static void svc_plugin_process_data_in(rdpSvcPlugin* plugin)
+{
+       svc_data_in_item* item;
+
+       while (1)
+       {
+               /* terminate signal */
+               if (freerdp_thread_is_stopped(plugin->priv->thread))
+                       break;
+
+               freerdp_thread_lock(plugin->priv->thread);
+               item = list_dequeue(plugin->priv->data_in_list);
+               freerdp_thread_unlock(plugin->priv->thread);
+
+               if (item != NULL)
+               {
+                       /* the ownership of the data is passed to the callback */
+                       if (item->data_in)
+                               IFCALL(plugin->receive_callback, plugin, item->data_in);
+                       if (item->event_in)
+                               IFCALL(plugin->event_callback, plugin, item->event_in);
+                       xfree(item);
+               }
+               else
+                       break;
+       }
+}
+
+static void* svc_plugin_thread_func(void* arg)
+{
+       rdpSvcPlugin* plugin = (rdpSvcPlugin*)arg;
+
+       DEBUG_SVC("in");
+
+       IFCALL(plugin->connect_callback, plugin);
+
+       while (1)
+       {
+               if (plugin->interval_ms > 0)
+                       freerdp_thread_wait_timeout(plugin->priv->thread, plugin->interval_ms);
+               else
+                       freerdp_thread_wait(plugin->priv->thread);
+
+               if (freerdp_thread_is_stopped(plugin->priv->thread))
+                       break;
+
+               freerdp_thread_reset(plugin->priv->thread);
+               svc_plugin_process_data_in(plugin);
+
+               if (plugin->interval_ms > 0)
+                       IFCALL(plugin->interval_callback, plugin);
+       }
+
+       freerdp_thread_quit(plugin->priv->thread);
+
+       DEBUG_SVC("out");
+
+       return 0;
+}
+
+static void svc_plugin_process_connected(rdpSvcPlugin* plugin, void* pData, uint32 dataLength)
+{
+       uint32 error;
+
+       error = plugin->channel_entry_points.pVirtualChannelOpen(plugin->priv->init_handle,
+               &plugin->priv->open_handle, plugin->channel_def.name, svc_plugin_open_event);
+
+       if (error != CHANNEL_RC_OK)
+       {
+               printf("svc_plugin_process_connected: open failed\n");
+               return;
+       }
+
+       plugin->priv->data_in_list = list_new();
+       plugin->priv->thread = freerdp_thread_new();
+
+       freerdp_thread_start(plugin->priv->thread, svc_plugin_thread_func, plugin);
+}
+
+static void svc_plugin_process_terminated(rdpSvcPlugin* plugin)
+{
+       svc_data_in_item* item;
+
+       freerdp_thread_stop(plugin->priv->thread);
+       freerdp_thread_free(plugin->priv->thread);
+
+       plugin->channel_entry_points.pVirtualChannelClose(plugin->priv->open_handle);
+       xfree(plugin->channel_entry_points.pExtendedData);
+
+       svc_plugin_remove(plugin);
+
+       while ((item = list_dequeue(plugin->priv->data_in_list)) != NULL)
+               svc_data_in_item_free(item);
+       list_free(plugin->priv->data_in_list);
+
+       if (plugin->priv->data_in != NULL)
+       {
+               stream_free(plugin->priv->data_in);
+               plugin->priv->data_in = NULL;
+       }
+       xfree(plugin->priv);
+       plugin->priv = NULL;
+
+       IFCALL(plugin->terminate_callback, plugin);
+}
+
+static void svc_plugin_init_event(void* pInitHandle, uint32 event, void* pData, uint32 dataLength)
+{
+       rdpSvcPlugin* plugin;
+
+       DEBUG_SVC("event %d", event);
+
+       plugin = (rdpSvcPlugin*)svc_plugin_find_by_init_handle(pInitHandle);
+       if (plugin == NULL)
+       {
+               printf("svc_plugin_init_event: error no match\n");
+               return;
+       }
+       switch (event)
+       {
+               case CHANNEL_EVENT_CONNECTED:
+                       svc_plugin_process_connected(plugin, pData, dataLength);
+                       break;
+               case CHANNEL_EVENT_DISCONNECTED:
+                       break;
+               case CHANNEL_EVENT_TERMINATED:
+                       svc_plugin_process_terminated(plugin);
+                       break;
+       }
+}
+
+void svc_plugin_init(rdpSvcPlugin* plugin, CHANNEL_ENTRY_POINTS* pEntryPoints)
+{
+       rdpSvcPluginList* list;
+
+       /**
+        * The channel manager will guarantee only one thread can call
+        * VirtualChannelInit at a time. So this should be safe.
+        */
+       if (g_mutex == NULL)
+               g_mutex = freerdp_mutex_new();
+
+       memcpy(&plugin->channel_entry_points, pEntryPoints, pEntryPoints->cbSize);
+
+       plugin->priv = xnew(rdpSvcPluginPrivate);
+
+       /* Add it to the global list */
+       list = xnew(rdpSvcPluginList);
+       list->plugin = plugin;
+
+       freerdp_mutex_lock(g_mutex);
+       list->next = g_svc_plugin_list;
+       g_svc_plugin_list = list;
+       freerdp_mutex_unlock(g_mutex);
+
+       plugin->channel_entry_points.pVirtualChannelInit(&plugin->priv->init_handle,
+               &plugin->channel_def, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, svc_plugin_init_event);
+}
+
+int svc_plugin_send(rdpSvcPlugin* plugin, STREAM* data_out)
+{
+       uint32 error = 0;
+
+       DEBUG_SVC("length %d", stream_get_length(data_out));
+
+       error = plugin->channel_entry_points.pVirtualChannelWrite(plugin->priv->open_handle,
+               stream_get_data(data_out), stream_get_length(data_out), data_out);
+       if (error != CHANNEL_RC_OK)
+       {
+               stream_free(data_out);
+               printf("svc_plugin_send: VirtualChannelWrite failed %d\n", error);
+       }
+
+       return error;
+}
+
+int svc_plugin_send_event(rdpSvcPlugin* plugin, RDP_EVENT* event)
+{
+       uint32 error = 0;
+
+       DEBUG_SVC("event_type %d", event->event_type);
+
+       error = plugin->channel_entry_points.pVirtualChannelEventPush(plugin->priv->open_handle, event);
+
+       if (error != CHANNEL_RC_OK)
+               printf("svc_plugin_send_event: VirtualChannelEventPush failed %d\n", error);
+
+       return error;
+}
diff --git a/libfreerdp-utils/thread.c b/libfreerdp-utils/thread.c
new file mode 100644 (file)
index 0000000..14b6d58
--- /dev/null
@@ -0,0 +1,95 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Thread Utils
+ *
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#ifdef _MSC_VER
+#include <process.h>
+#endif
+#endif
+
+#include <freerdp/utils/sleep.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/thread.h>
+
+freerdp_thread* freerdp_thread_new(void)
+{
+       freerdp_thread* thread;
+
+       thread = xnew(freerdp_thread);
+       thread->mutex = freerdp_mutex_new();
+       thread->signals[0] = wait_obj_new();
+       thread->signals[1] = wait_obj_new();
+       thread->num_signals = 2;
+
+       return thread;
+}
+
+void freerdp_thread_start(freerdp_thread* thread, void* func, void* arg)
+{
+       thread->status = 1;
+
+#ifdef _WIN32
+       {
+#      ifdef _MSC_VER
+               CloseHandle((HANDLE)_beginthreadex(NULL, 0, func, arg, 0, NULL));
+#else
+               CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, NULL));
+#endif
+       }
+#else
+       {
+               pthread_t th;
+               pthread_create(&th, 0, func, arg);
+               pthread_detach(th);
+       }
+#endif
+}
+
+void freerdp_thread_stop(freerdp_thread* thread)
+{
+       int i = 0;
+
+       wait_obj_set(thread->signals[0]);
+
+       while (thread->status > 0 && i < 1000)
+       {
+               i++;
+               freerdp_usleep(100000);
+       }
+}
+
+void freerdp_thread_free(freerdp_thread* thread)
+{
+       int i;
+
+       for (i = 0; i < thread->num_signals; i++)
+               wait_obj_free(thread->signals[i]);
+       thread->num_signals = 0;
+
+       freerdp_mutex_free(thread->mutex);
+       thread->mutex = NULL;
+
+       xfree(thread);
+}
diff --git a/libfreerdp-utils/unicode.c b/libfreerdp-utils/unicode.c
new file mode 100644 (file)
index 0000000..6524a35
--- /dev/null
@@ -0,0 +1,240 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * Unicode Utils
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <wctype.h>
+#include <freerdp/utils/memory.h>
+
+#include <freerdp/utils/unicode.h>
+
+/* Convert pin/in_len from WINDOWS_CODEPAGE - return like xstrdup, 0-terminated */
+
+char* freerdp_uniconv_in(UNICONV* uniconv, unsigned char* pin, size_t in_len)
+{
+       unsigned char *conv_pin = pin;
+       size_t conv_in_len = in_len;
+       char *pout = xmalloc(in_len * 2 + 1), *conv_pout = pout;
+       size_t conv_out_len = in_len * 2;
+
+#ifdef HAVE_ICONV
+       if (iconv(uniconv->in_iconv_h, (ICONV_CONST char **) &conv_pin, &conv_in_len, &conv_pout, &conv_out_len) == (size_t) - 1)
+       {
+               /* TODO: xrealloc if conv_out_len == 0 - it shouldn't be needed, but would allow a smaller initial alloc ... */
+               printf("freerdp_uniconv_in: iconv failure\n");
+               return 0;
+       }
+#else
+       while (conv_in_len >= 2)
+       {
+               unsigned int wc;
+
+               wc = (unsigned int)(unsigned char)(*conv_pin++);
+               wc += ((unsigned int)(unsigned char)(*conv_pin++)) << 8;
+               conv_in_len -= 2;
+
+               if (wc >= 0xD800 && wc <= 0xDFFF && conv_in_len >= 2)
+               {
+                       /* Code points U+10000 to U+10FFFF using surrogate pair */
+                       wc = ((wc - 0xD800) << 10) + 0x10000;
+                       wc += (unsigned int)(unsigned char)(*conv_pin++);
+                       wc += ((unsigned int)(unsigned char)(*conv_pin++) - 0xDC) << 8;
+                       conv_in_len -= 2;
+               }
+
+               if (wc <= 0x7F)
+               {
+                       *conv_pout++ = (char)wc;
+                       conv_out_len--;
+               }
+               else if (wc <= 0x07FF)
+               {
+                       *conv_pout++ = (char)(0xC0 + (wc >> 6));
+                       *conv_pout++ = (char)(0x80 + (wc & 0x3F));
+                       conv_out_len -= 2;
+               }
+               else if (wc <= 0xFFFF)
+               {
+                       *conv_pout++ = (char)(0xE0 + (wc >> 12));
+                       *conv_pout++ = (char)(0x80 + ((wc >> 6) & 0x3F));
+                       *conv_pout++ = (char)(0x80 + (wc & 0x3F));
+                       conv_out_len -= 3;
+               }
+               else
+               {
+                       *conv_pout++ = (char)(0xF0 + (wc >> 18));
+                       *conv_pout++ = (char)(0x80 + ((wc >> 12) & 0x3F));
+                       *conv_pout++ = (char)(0x80 + ((wc >> 6) & 0x3F));
+                       *conv_pout++ = (char)(0x80 + (wc & 0x3F));
+                       conv_out_len -= 4;
+               }
+       }
+#endif
+
+       if (conv_in_len > 0)
+       {
+               printf("freerdp_uniconv_in: conversion failure - %d chars left\n", (int) conv_in_len);
+       }
+
+       *conv_pout = 0;
+       return pout;
+}
+
+/* Convert str from DEFAULT_CODEPAGE to WINDOWS_CODEPAGE and return buffer like xstrdup.
+ * Buffer is 0-terminated but that is not included in the returned length. */
+
+char* freerdp_uniconv_out(UNICONV *uniconv, char *str, size_t *pout_len)
+{
+       size_t ibl;
+       size_t obl;
+       char* pin;
+       char* pout;
+       char* pout0;
+
+       if (str == NULL)
+       {
+               *pout_len = 0;
+               return NULL;
+       }
+
+       ibl = strlen(str);
+       obl = 2 * ibl;
+       pin = str;
+       pout0 = xmalloc(obl + 2);
+       pout = pout0;
+
+#ifdef HAVE_ICONV
+       if (iconv(uniconv->out_iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
+       {
+               printf("freerdp_uniconv_out: iconv() error\n");
+               return NULL;
+       }
+#else
+       while ((ibl > 0) && (obl > 0))
+       {
+               unsigned int wc;
+
+               wc = (unsigned int)(unsigned char)(*pin++);
+               ibl--;
+               if (wc >= 0xF0)
+               {
+                       wc = (wc - 0xF0) << 18;
+                       wc += ((unsigned int)(unsigned char)(*pin++) - 0x80) << 12;
+                       wc += ((unsigned int)(unsigned char)(*pin++) - 0x80) << 6;
+                       wc += ((unsigned int)(unsigned char)(*pin++) - 0x80);
+                       ibl -= 3;
+               }
+               else if (wc >= 0xE0)
+               {
+                       wc = (wc - 0xE0) << 12;
+                       wc += ((unsigned int)(unsigned char)(*pin++) - 0x80) << 6;
+                       wc += ((unsigned int)(unsigned char)(*pin++) - 0x80);
+                       ibl -= 2;
+               }
+               else if (wc >= 0xC0)
+               {
+                       wc = (wc - 0xC0) << 6;
+                       wc += ((unsigned int)(unsigned char)(*pin++) - 0x80);
+                       ibl -= 1;
+               }
+
+               if (wc <= 0xFFFF)
+               {
+                       *pout++ = (char)(wc & 0xFF);
+                       *pout++ = (char)(wc >> 8);
+                       obl -= 2;
+               }
+               else
+               {
+                       wc -= 0x10000;
+                       *pout++ = (char)((wc >> 10) & 0xFF);
+                       *pout++ = (char)((wc >> 18) + 0xD8);
+                       *pout++ = (char)(wc & 0xFF);
+                       *pout++ = (char)(((wc >> 8) & 0x03) + 0xDC);
+                       obl -= 4;
+               }
+       }
+#endif
+
+       if (ibl > 0)
+       {
+               printf("freerdp_uniconv_out: string not fully converted - %d chars left\n", (int) ibl);
+       }
+
+       *pout_len = pout - pout0;
+       *pout++ = 0; /* Add extra double zero termination */
+       *pout = 0;
+
+       return pout0;
+}
+
+/* Uppercase a unicode string */
+
+void freerdp_uniconv_uppercase(UNICONV *uniconv, char *wstr, int length)
+{
+       int i;
+       unsigned char* p;
+       unsigned int wc, uwc;
+
+       p = (unsigned char*)wstr;
+       for (i = 0; i < length; i++)
+       {
+               wc = (unsigned int)(*p);
+               wc += (unsigned int)(*(p + 1)) << 8;
+               uwc = towupper(wc);
+               if (uwc != wc)
+               {
+                       *p = uwc & 0xFF;
+                       *(p + 1) = (uwc >> 8) & 0xFF;
+               }
+               p += 2;
+       }
+}
+
+UNICONV* freerdp_uniconv_new()
+{
+       UNICONV *uniconv = xnew(UNICONV);
+
+#ifdef HAVE_ICONV
+       uniconv->iconv = 1;
+       uniconv->in_iconv_h = iconv_open(DEFAULT_CODEPAGE, WINDOWS_CODEPAGE);
+       if (errno == EINVAL)
+       {
+               printf("Error opening iconv converter to %s from %s\n", DEFAULT_CODEPAGE, WINDOWS_CODEPAGE);
+       }
+       uniconv->out_iconv_h = iconv_open(WINDOWS_CODEPAGE, DEFAULT_CODEPAGE);
+       if (errno == EINVAL)
+       {
+               printf("Error opening iconv converter to %s from %s\n", WINDOWS_CODEPAGE, DEFAULT_CODEPAGE);
+       }
+#endif
+
+       return uniconv;
+}
+
+void freerdp_uniconv_free(UNICONV *uniconv)
+{
+       if (uniconv != NULL)
+       {
+#ifdef HAVE_ICONV
+               iconv_close(uniconv->in_iconv_h);
+               iconv_close(uniconv->out_iconv_h);
+#endif
+               xfree(uniconv);
+       }
+}
diff --git a/libfreerdp-utils/wait_obj.c b/libfreerdp-utils/wait_obj.c
new file mode 100644 (file)
index 0000000..a2ba5b9
--- /dev/null
@@ -0,0 +1,225 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol client.
+ * Virtual Channel Manager
+ *
+ * Copyright 2009-2011 Jay Sorg
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/wait_obj.h>
+
+#ifndef _WIN32
+#include <sys/time.h>
+#else
+#include <winsock2.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+struct wait_obj
+{
+#ifdef _WIN32
+       HANDLE event;
+#else
+       int pipe_fd[2];
+#endif
+       int attached;
+};
+
+struct wait_obj*
+wait_obj_new(void)
+{
+       struct wait_obj* obj;
+
+       obj = xnew(struct wait_obj);
+
+       obj->attached = 0;
+#ifdef _WIN32
+       obj->event = CreateEvent(NULL, TRUE, FALSE, NULL);
+#else
+       obj->pipe_fd[0] = -1;
+       obj->pipe_fd[1] = -1;
+       if (pipe(obj->pipe_fd) < 0)
+       {
+               printf("wait_obj_new: pipe failed\n");
+               xfree(obj);
+               return NULL;
+       }
+#endif
+
+       return obj;
+}
+
+struct wait_obj* wait_obj_new_with_fd(void* fd)
+{
+       struct wait_obj* obj;
+
+       obj = xnew(struct wait_obj);
+
+       obj->attached = 1;
+#ifdef _WIN32
+       obj->event = fd;
+#else
+       obj->pipe_fd[0] = (int)(long)fd;
+       obj->pipe_fd[1] = -1;
+#endif
+
+       return obj;
+}
+
+void
+wait_obj_free(struct wait_obj* obj)
+{
+       if (obj)
+       {
+
+               if (obj->attached == 0)
+               {
+#ifdef _WIN32
+                       if (obj->event)
+                       {
+                               CloseHandle(obj->event);
+                               obj->event = NULL;
+                       }
+#else
+                       if (obj->pipe_fd[0] != -1)
+                       {
+                               close(obj->pipe_fd[0]);
+                               obj->pipe_fd[0] = -1;
+                       }
+                       if (obj->pipe_fd[1] != -1)
+                       {
+                               close(obj->pipe_fd[1]);
+                               obj->pipe_fd[1] = -1;
+                       }
+#endif
+               }
+
+               xfree(obj);
+       }
+}
+
+int
+wait_obj_is_set(struct wait_obj* obj)
+{
+#ifdef _WIN32
+       return (WaitForSingleObject(obj->event, 0) == WAIT_OBJECT_0);
+#else
+       fd_set rfds;
+       int num_set;
+       struct timeval time;
+
+       FD_ZERO(&rfds);
+       FD_SET(obj->pipe_fd[0], &rfds);
+       memset(&time, 0, sizeof(time));
+       num_set = select(obj->pipe_fd[0] + 1, &rfds, 0, 0, &time);
+       return (num_set == 1);
+#endif
+}
+
+void
+wait_obj_set(struct wait_obj* obj)
+{
+#ifdef _WIN32
+       SetEvent(obj->event);
+#else
+       int len;
+
+       if (wait_obj_is_set(obj))
+               return;
+       len = write(obj->pipe_fd[1], "sig", 4);
+       if (len != 4)
+               printf("wait_obj_set: error\n");
+#endif
+}
+
+void
+wait_obj_clear(struct wait_obj* obj)
+{
+#ifdef _WIN32
+       ResetEvent(obj->event);
+#else
+       int len;
+
+       while (wait_obj_is_set(obj))
+       {
+               len = read(obj->pipe_fd[0], &len, 4);
+               if (len != 4)
+                       printf("wait_obj_clear: error\n");
+       }
+#endif
+}
+
+int
+wait_obj_select(struct wait_obj** listobj, int numobj, int timeout)
+{
+#ifndef _WIN32
+       int max;
+       int sock;
+       int index;
+#endif
+       fd_set fds;
+       int status;
+       struct timeval time;
+       struct timeval* ptime;
+
+       ptime = 0;
+       if (timeout >= 0)
+       {
+               time.tv_sec = timeout / 1000;
+               time.tv_usec = (timeout * 1000) % 1000000;
+               ptime = &time;
+       }
+
+#ifndef _WIN32
+       max = 0;
+       FD_ZERO(&fds);
+       if (listobj)
+       {
+               for (index = 0; index < numobj; index++)
+               {
+                       sock = listobj[index]->pipe_fd[0];
+                       FD_SET(sock, &fds);
+
+                       if (sock > max)
+                               max = sock;
+               }
+       }
+       status = select(max + 1, &fds, 0, 0, ptime);
+#else
+       status = select(0, &fds, 0, 0, ptime);
+#endif
+
+       return status;
+}
+
+void wait_obj_get_fds(struct wait_obj* obj, void** fds, int* count)
+{
+#ifdef _WIN32
+       fds[*count] = (void*) obj->event;
+#else
+       if (obj->pipe_fd[0] == -1)
+               return;
+
+       fds[*count] = (void*)(long) obj->pipe_fd[0];
+#endif
+       (*count)++;
+}
diff --git a/resources/FreeRDP-fav.ico b/resources/FreeRDP-fav.ico
new file mode 100644 (file)
index 0000000..258c083
Binary files /dev/null and b/resources/FreeRDP-fav.ico differ
diff --git a/resources/FreeRDP.ico b/resources/FreeRDP.ico
new file mode 100644 (file)
index 0000000..0864d1c
Binary files /dev/null and b/resources/FreeRDP.ico differ
diff --git a/resources/FreeRDP_Icon_256px.h b/resources/FreeRDP_Icon_256px.h
new file mode 100644 (file)
index 0000000..497048b
--- /dev/null
@@ -0,0 +1,8195 @@
+static unsigned long FreeRDP_Icon_256px_prop [] = {
+ 256, 256
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 541756835u , 1615498659u
+ , 2152369571u , 2940898723u , 3209334179u , 3209334179u , 3209334179u , 2940898723u , 2152369571u , 1078627747u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 541756835u , 2152369571u , 3746205091u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 3746205091u , 1883934115u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 541756835u , 2672463267u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 2940898723u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 541756835u
+ , 2672463267u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 2672463267u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 2152369571u , 4014640547u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 810192291u , 3477769635u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2940898723u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4014640547u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 273321379u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 810192291u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 810192291u , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1615498659u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 2404027811u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 2672463267u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 273321379u , 3477769635u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 273321379u , 3477769635u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 541756835u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 273321379u , 3477769635u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 273321379u , 3477769635u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 3209334179u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 273321379u
+ , 3477769635u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2404027811u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 273321379u , 3477769635u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1615498659u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 273321379u , 3477769635u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 541756835u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 273321379u , 3477769635u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 3477769635u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 273321379u , 3477769635u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 2404027811u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2940898723u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 810192291u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2672463267u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 3746205091u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 2404027811u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 2404027811u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 810192291u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1347063203u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 3746205091u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 810192291u , 4014640547u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 1883934115u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 273321379u , 3746205091u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 273321379u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 3477769635u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 2672463267u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 2672463267u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 1078627747u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1883934115u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 3746205091u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1615498659u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 541756835u , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4014640547u , 273321379u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 3477769635u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2152369571u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2672463267u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 273321379u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1615498659u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2672463267u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 810192291u , 4014640547u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 810192291u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 273321379u , 3477769635u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 3477769635u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 2672463267u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1615498659u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 273321379u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 541756835u , 4014640547u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 2940898723u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3477769635u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 1347063203u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2404027811u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 273321379u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 2940898723u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 273321379u , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 1615498659u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2940898723u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 541756835u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1615498659u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 3477769635u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 541756835u , 4014640547u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 2404027811u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 1347063203u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 1883934115u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 273321379u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 541756835u , 4014640547u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 3477769635u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 2404027811u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1883934115u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 1347063203u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 541756835u , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 541756835u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 3746205091u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2940898723u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 273321379u , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2152369571u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2940898723u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1078627747u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 273321379u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 273321379u , 3746205091u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4014640547u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 2152369571u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 3209334179u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 810192291u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 2404027811u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1883934115u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 1078627747u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 273321379u , 4014640547u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 273321379u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2404027811u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 3211638728u , 3211638728u
+ , 3211638728u , 2154674120u , 275625928u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 810192291u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283668652u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4016945096u , 1617803208u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283800239u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1349367752u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1347063203u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284261046u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 275625928u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284392888u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284788159u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 544061384u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 273321379u
+ , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284919745u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 2672463267u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 544061384u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 541756835u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3211638728u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283536810u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 1078627747u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283668652u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 3748509640u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283800239u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 1347063203u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283800238u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4016945096u , 275625928u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280836731u , 4284524473u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2674767816u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280573046u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4282417045u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 3480074184u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278992474u , 4284524473u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1886238664u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278597203u , 4280309360u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 275625928u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278860632u , 4278597203u , 4278597203u , 4278597203u
+ , 4283273123u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278992474u , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4281165439u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3748509640u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4283668395u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1615498659u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4279453282u , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u
+ , 544061384u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 3746205091u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4282219924u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 2943203272u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 1078627747u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284129202u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1349367752u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3748509640u , 275625928u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 810192291u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282417045u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 2672463267u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278992474u , 4284985281u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 812496840u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 541756835u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280704632u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1617803208u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279453282u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 275625928u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278992474u , 4284524473u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 541756835u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3480074184u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4283668395u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4279453282u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u
+ , 544061384u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 2672463267u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278992474u , 4284985281u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1349367752u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 4014640547u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3748509640u , 275625928u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 1347063203u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284524473u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2404027811u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 544061384u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3746205091u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 810192291u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1349367752u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1883934115u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4282219924u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284129202u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3748509640u , 275625928u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 2940898723u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 4014640547u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4284524473u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 275625928u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 810192291u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 1615498659u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4279453282u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 275625928u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 2672463267u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278860632u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4283273123u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1886238664u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 3477769635u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280704632u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3748509640u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 1078627747u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 2674767816u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 1615498659u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280309617u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4280704632u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4016945096u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 2404027811u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280836731u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280836731u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2406332360u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 3746205091u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4281429125u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4281165439u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3480074184u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278992474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284129202u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 1347063203u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4282812574u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282417045u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 1886238664u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2406332360u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 2404027811u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278860632u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 3480074184u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 3477769635u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284129202u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280836731u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280836731u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4281956239u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1347063203u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4278860632u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4279716967u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2404027811u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4280309617u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283207845u , 4283668652u , 4283800239u , 4284261046u , 4284261046u , 4284524474u , 4284788159u , 4284788159u
+ , 4284788159u , 4284788159u , 4285117123u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284524473u
+ , 4283668395u , 4283668395u , 4283668395u , 4283668395u , 4282417045u , 4282021774u , 4282021774u , 4280309360u
+ , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283536810u , 4283800239u , 4284261046u , 4284656316u , 4284919745u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4284985281u , 4283668395u , 4282417045u , 4281560710u , 4280309360u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2943203272u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3209334179u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283207845u , 4283800239u , 4284392888u
+ , 4284788159u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4284129202u , 4282417045u , 4280704632u , 4278992474u , 4278597203u , 4282021774u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283207845u , 4283800239u , 4284392888u , 4285117123u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4284524473u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 1349367752u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283339432u , 4284063667u
+ , 4284788159u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 544061384u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283536810u , 4284392888u , 4285117123u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3748509640u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283339432u , 4284063667u , 4284919745u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2674767816u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 541756835u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283800239u , 4284656316u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1349367752u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283207845u , 4284261046u , 4285117123u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3748509640u , 1617803208u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283339432u , 4284524474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 3748509640u , 1617803208u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283668652u
+ , 4284788159u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3211638728u , 1080932296u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283668652u , 4284788159u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u
+ , 275625928u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283668652u , 4284788159u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4016945096u , 1349367752u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1615498659u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283339432u , 4284524474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 2943203272u , 275625928u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283207845u
+ , 4284261046u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 1349367752u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283800239u , 4285117123u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2406332360u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283339432u , 4284788159u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3480074184u , 275625928u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4284261046u , 4285248710u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u
+ , 812496840u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283536810u , 4284919745u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4016945096u , 1617803208u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4284063667u , 4285248710u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 1617803208u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283207845u , 4284788159u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283668652u , 4285248710u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284261046u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283207845u , 4284656316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283536810u , 4284919745u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283668652u , 4285248710u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 1617803208u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283932081u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284261046u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4016945096u , 812496840u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284524474u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 3480074184u , 275625928u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284524474u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 2943203272u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4283076003u , 4284524474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1886238664u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4283076003u , 4284524474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 812496840u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4283076003u , 4284524474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3748509640u , 275625928u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4283076003u
+ , 4284524474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2406332360u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283076003u , 4284524474u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283076003u , 4283932081u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3748509640u
+ , 275625928u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283076003u , 4283932081u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2152369571u , 4283076003u , 4283536810u , 4285248710u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 544061384u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4283207845u , 4285248710u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1078627747u , 4284919745u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2406332360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 3748509640u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1617803208u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 1617803208u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 544061384u , 4016945096u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 3748509640u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3480074184u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1617803208u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 2154674120u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3748509640u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 812496840u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1617803208u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 3480074184u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3480074184u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 2154674120u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 544061384u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 3211638728u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4284985281u , 4282021774u , 4281560710u , 4280309360u , 4280309360u , 4280309360u
+ , 4280309360u , 4280309360u , 4280309360u , 4280309360u , 4280309360u , 4282021774u , 4282417045u , 540702606u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1349367752u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280704632u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4010161747u
+ , 805713491u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3748509640u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 3473290835u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2154674120u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 1611019859u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 275625928u , 4016945096u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 3204855379u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 2154674120u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4281165439u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 268842579u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 275625928u , 4016945096u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4282812316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 1342584403u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2154674120u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 2147890771u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 275625928u
+ , 4016945096u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4283273123u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 2667984467u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 2154674120u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4284985281u , 4283668395u , 4282812316u , 4282021774u , 4282021774u , 4282021774u
+ , 4282021774u , 4282021774u , 4282021774u , 4282021774u , 4282812316u , 4283668395u , 4284985281u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282021774u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 3204855379u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 3748509640u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4282812316u
+ , 4281165439u , 4279453282u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278992474u
+ , 4280704632u , 4282417045u , 4284524473u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284524473u , 4281165439u , 4279453282u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278992474u , 2402578311u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 1617803208u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4282812316u , 4280309360u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4282417045u , 4284985281u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4284985281u , 4283668395u , 4283273123u , 4282021774u , 4282021774u , 4282021774u , 4282021774u , 4283668395u
+ , 4284129202u , 4285380552u , 3748509640u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 3211638728u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4284524473u , 4282021774u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u , 4284524473u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 544061384u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 544061384u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u
+ , 4282021774u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4281165439u , 4284524473u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 1886238664u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 2406332360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4283273123u , 4278992474u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278992474u , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 2943203272u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 4016945096u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4280704632u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4284524473u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 1349367752u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4278992474u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278992474u , 4283273123u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 812496840u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 2674767816u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4282812316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282021774u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1617803208u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 4016945096u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4282812316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4282673278u , 4284711316u , 4286815145u
+ , 4286815145u , 4283725193u , 4282673278u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 1349367752u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4282812316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u
+ , 4284711316u , 4288853183u , 4292929258u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4292929258u , 4288853183u , 4284711316u
+ , 4279649118u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4281165439u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3480074184u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 2674767816u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282812316u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283725193u , 4289839305u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4289839305u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4281560710u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 3748509640u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4283668395u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4284711316u , 4292929258u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967033u
+ , 4294901234u , 4294900973u , 4294900972u , 4292863195u , 4284711052u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 812496840u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4278992474u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4281687155u , 4290891220u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294901235u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4291876815u , 4280635239u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4284129202u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1886238664u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1886238664u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4285763230u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967031u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4293914854u , 4285763230u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279453282u , 4284985281u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2943203272u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282417045u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4289839305u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294900974u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294967033u
+ , 4288853183u , 4279649118u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281560710u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3211638728u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 4016945096u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284524473u , 4278992474u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4291877343u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4288853183u , 4283724934u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294901235u
+ , 4294967295u , 4291877343u , 4279649118u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 812496840u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4281165439u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4291877343u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4292929258u , 4282673278u , 4278597203u , 4282673273u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4291876817u
+ , 4288853183u , 4294967295u , 4291877343u , 4279649118u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 544061384u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1617803208u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4284524473u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4291877343u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4291877343u , 4279649118u , 4278597203u , 4278597203u , 4280635238u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4290825158u
+ , 4278597203u , 4284711316u , 4294967295u , 4291877343u , 4279649118u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 2674767816u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4281165439u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4289839305u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4291877343u
+ , 4279649118u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4291876815u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4287800745u
+ , 4278597203u , 4278597203u , 4284711316u , 4294967295u , 4288853183u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279453282u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 3211638728u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4284524473u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4285763230u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4293915380u , 4279649118u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283724931u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4280635238u
+ , 4278597203u , 4278597203u , 4278597203u , 4288853183u , 4294967295u , 4285763230u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4282021774u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4281687155u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4284711316u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4286749088u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4284711052u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4293915380u , 4293915380u , 4280635241u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280704632u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3211638728u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 812496840u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4279453282u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4290891220u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4292929258u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283724931u
+ , 4291876815u , 4294900972u , 4294900972u , 4294900972u , 4290825158u , 4282673273u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4285763230u , 4294967295u , 4290891220u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 1080932296u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4284129202u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4283725193u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4285763230u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4282673273u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4294967295u , 4294967295u , 4282673278u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2154674120u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4282021774u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4291877343u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4280635241u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4290891220u , 4294967295u , 4290891220u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4280704632u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1080932296u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2406332360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4293915380u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4286815145u , 4294967295u , 4294967295u
+ , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278992474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 1617803208u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3211638728u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4288853183u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4290891220u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284711316u , 4294967295u , 4294967295u
+ , 4288853183u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4284129202u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2154674120u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3211638728u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4283668395u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4290891220u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4293915380u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 2674767816u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282812316u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283725193u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4290891220u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283725193u , 4294967295u , 4294967295u
+ , 4294967295u , 4283725193u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 3211638728u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282021774u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4287801268u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4291877343u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4286815145u , 4294967295u , 4294967295u
+ , 4294967295u , 4287801268u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4016945096u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4281560710u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4291877343u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4279649118u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4288853183u , 4294967295u , 4294967295u
+ , 4294967295u , 4290891220u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4283725193u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4292929258u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 812496840u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280635241u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4288853183u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278992474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4280635241u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4290891220u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 1617803208u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4290891220u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4283725193u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278992474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4285763230u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4280635241u , 4293915380u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4281560710u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4284711316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4279649118u , 4291877343u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280309360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282021774u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4286815145u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4281687155u , 4293915380u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4280704632u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282812316u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4291877343u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u , 4287801268u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4280635241u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4282021774u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 3748509640u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4283668395u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4291877343u , 4285763230u , 4281687155u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4280635241u , 4283725193u , 4288853183u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4292929258u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4291877343u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4284129202u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4289839305u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4288853183u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278992474u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4283668395u , 4283668395u , 4282021774u
+ , 4282021774u , 4282021774u , 4282021774u , 4282021774u , 4282021774u , 4282021774u , 4282021774u , 4282021774u
+ , 4282417045u , 4283668395u , 4283668395u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 544061384u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 1080932296u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4282021774u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4285763230u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4284711316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4280704632u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4284524473u , 4282812316u , 4281165439u , 4279848553u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4280635238u , 4282673273u , 4286749088u , 4286749088u , 4286749088u , 4286749088u , 4285762966u , 4282673273u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279453282u , 4281165439u , 4284985281u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 812496840u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4284129202u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280635241u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4280635241u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4282417045u , 4279848553u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279648861u , 4286749088u , 4292862937u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u
+ , 4293914850u , 4287800745u , 4279648861u , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4279453282u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4291877343u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4291877343u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284524473u , 4281165439u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281686896u , 4293914850u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4289838780u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283273123u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1080932296u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4282021774u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4285763230u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4284711316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4284524473u , 4281165439u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4292862937u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4290825158u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282021774u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 1617803208u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 4016945096u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4284524473u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279649118u
+ , 4293915380u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4293915380u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4282021774u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4292862937u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u
+ , 4294900972u , 4293914850u , 4283724931u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282812316u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3211638728u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4281165439u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4286815145u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4286815145u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284524473u , 4280309360u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281686896u , 4291876815u , 4294900972u , 4294900972u
+ , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4294900972u , 4293914850u
+ , 4288787123u , 4280635238u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284524473u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 3211638728u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4284524473u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4279649118u , 4293915380u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4292929258u , 4279649118u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4278992474u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281686896u , 4285762966u
+ , 4287800745u , 4290825158u , 4290825158u , 4290825158u , 4287800745u , 4286749088u , 4282673273u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2154674120u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4281165439u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4284711316u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4283725193u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282812316u , 4278992474u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 2154674120u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4278992474u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4290891220u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4289839305u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 1080932296u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282417045u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4279649118u , 4293915380u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4292929258u , 4279649118u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281560710u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4284524473u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4284985281u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 812496840u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4281687155u , 4293915380u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4293915380u , 4281687155u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279453282u , 4284985281u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4281560710u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4279848553u , 4284985281u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2943203272u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4278992474u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284711316u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4283725193u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4284129202u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4279848553u , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 3480074184u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4284711316u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4284711316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4279453282u , 4284985281u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 2674767816u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282812316u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4293915380u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4293915380u , 4281687155u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4281560710u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278992474u , 4284129202u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1886238664u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4282812316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281687155u
+ , 4291877343u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4291877343u
+ , 4280635241u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4281165439u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4282021774u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278992474u
+ , 4284129202u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 3211638728u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 1080932296u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4282812316u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4286815145u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4286815145u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4281165439u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4280309360u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278992474u , 4284129202u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2406332360u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4282812316u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4281687155u , 4290891220u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4290891220u , 4280635241u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282417045u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4282812316u , 4279453282u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4283668395u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 3480074184u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4279453282u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282673278u , 4289839305u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4288853183u , 4282673278u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278992474u , 4283273123u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4281165439u
+ , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 2406332360u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284985281u , 4280704632u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4280635241u , 4285763230u
+ , 4290891220u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u
+ , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4294967295u , 4290891220u
+ , 4285763230u , 4279649118u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4280309360u , 4284524473u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4283273123u , 4281165439u , 4278992474u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 1617803208u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4283273123u , 4279453282u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4282673278u , 4285763230u , 4287801268u , 4290891220u , 4290891220u , 4290891220u
+ , 4290891220u , 4290891220u , 4290891220u , 4286815145u , 4285763230u , 4282673278u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278992474u , 4282417045u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4284129202u , 4281560710u , 4279453282u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u , 4278597203u
+ , 4278597203u , 4278597203u , 4278597203u , 4282812316u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u , 4285380552u
+ , 4285380552u , 2154674120u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+ , 0u , 0u , 0u , 0u , 0u , 0u , 0u , 0u
+};
diff --git a/resources/FreeRDP_Icon_256px.png b/resources/FreeRDP_Icon_256px.png
new file mode 100644 (file)
index 0000000..b43d8c5
Binary files /dev/null and b/resources/FreeRDP_Icon_256px.png differ
diff --git a/resources/FreeRDP_Icon_256px.xpm b/resources/FreeRDP_Icon_256px.xpm
new file mode 100644 (file)
index 0000000..2a0ca21
--- /dev/null
@@ -0,0 +1,347 @@
+/* XPM */
+static char * FreeRDP_Icon_256px_xpm[] = {
+"256 256 88 1",
+"      c None",
+".     c #4A8DA3",
+"+     c #6DB7C8",
+"@     c #5398AC",
+"#     c #559AAF",
+"$     c #5CA2B6",
+"%     c #5EA5B8",
+"&     c #64ADBF",
+"*     c #66AFC1",
+"=     c #5195AA",
+"-     c #559AAE",
+";     c #28627B",
+">     c #60A7B9",
+",     c #245C76",
+"'     c #205670",
+")     c #174C67",
+"!     c #063653",
+"~     c #407F95",
+"{     c #0C3E5A",
+"]     c #0A3B58",
+"^     c #4D8FA3",
+"/     c #67AFC1",
+"(     c #2D667F",
+"_     c #5397AB",
+":     c #134662",
+"<     c #3D7D94",
+"[     c #3A778E",
+"}     c #39778F",
+"|     c #5A9FB2",
+"1     c #265E78",
+"2     c #46879C",
+"3     c #205771",
+"4     c #316C85",
+"5     c #46889E",
+"6     c #194E69",
+"7     c #4C90A5",
+"8     c #60A7BA",
+"9     c #69B2C3",
+"0     c #62AABC",
+"a     c #336E86",
+"b     c #4E92A8",
+"c     c #599FB3",
+"d     c #6BB4C6",
+"e     c #579DB1",
+"f     c #346F87",
+"g     c #44687E",
+"h     c #638194",
+"i     c #839BA9",
+"j     c #547589",
+"k     c #16435E",
+"l     c #A2B4BF",
+"m     c #E0E6EA",
+"n     c #FFFFFF",
+"o     c #B1C0C9",
+"p     c #FFFEF9",
+"q     c #FEFDF2",
+"r     c #FEFCED",
+"s     c #FEFCEC",
+"t     c #DFE4DB",
+"u     c #63808C",
+"v     c #355C73",
+"w     c #C1CDD4",
+"x     c #FEFDF3",
+"y     c #D0D7CF",
+"z     c #254F67",
+"A     c #738E9E",
+"B     c #FFFEF7",
+"C     c #EFF0E6",
+"D     c #FEFCEE",
+"E     c #D0D9DF",
+"F     c #547486",
+"G     c #446879",
+"H     c #D0D7D1",
+"I     c #254F66",
+"J     c #C0CBC6",
+"K     c #92A5A9",
+"L     c #EFF2F4",
+"M     c #547483",
+"N     c #8299A0",
+"O     c #254F69",
+"P     c #92A7B4",
+"Q     c #738D96",
+"R     c #16425D",
+"S     c #DFE3D9",
+"T     c #EFF0E2",
+"U     c #355B70",
+"V     c #B1BEBC",
+"W     c #A1B2B3",
+"                                                                                                                                .......                                                                                                                         ",
+"                                                                                                                            .............                                                                                                                       ",
+"                                                                                                                          .................                                                                                                                     ",
+"                                                                                                                        ....................                                                                                                                    ",
+"                                                                                                                      ......................                                                                                                                    ",
+"                                                                                                                     ........................                                                                                                                   ",
+"                                                                                                                   ..........................                                                                                                                   ",
+"                                                                                                                  ...........................                                                                                                                   ",
+"                                                                                                                 ............................                                                                                                                   ",
+"                                                                                                                .............................                                                                                                                   ",
+"                                                                                                              ...............................                                                                                                                   ",
+"                                                                                                             ................................                                                                                                                   ",
+"                                                                                                            .................................                                                                                                                   ",
+"                                                                                                           ..................................                                                                                                                   ",
+"                                                                                                          ...................................                                                                                                                   ",
+"                                                                                                         ....................................                                                                                                                   ",
+"                                                                                                        .....................................                                                                                                                   ",
+"                                                                                                       .....................................                                                                                                                    ",
+"                                                                                                      ......................................                                                                                                                    ",
+"                                                                                                     .......................................                                                                                                                    ",
+"                                                                                                    ........................................                                                                                                                    ",
+"                                                                                                   ........................................                                                                                                                     ",
+"                                                                                                  .........................................                                                                                                                     ",
+"                                                                                                 ..........................................                                                                                                                     ",
+"                                                                                                 .........................................                                                                                                                      ",
+"                                                                                                ..........................................                                                                                                                      ",
+"                                                                                               ..........................................                                                                                                                       ",
+"                                                                                              ...........................................                                                                                                                       ",
+"                                                                                             ............................................                                                                                                                       ",
+"                                                                                            ............................................                                                                                                                        ",
+"                                                                                            ............................................                                                                                                                        ",
+"                                                                                           ............................................                                                                                                                         ",
+"                                                                                          .............................................                                                                                                                         ",
+"                                                                                         ..............................................                                                                                                                         ",
+"                                                                                        ..............................................                                                                                                                          ",
+"                                                                                        ..............................................                                                                                                                          ",
+"                                                                                       ..............................................                                                                                                                           ",
+"                                                                                      ...............................................                                                                                                                           ",
+"                                                                                     ...............................................                                                                                                                            ",
+"                                                                                     ...............................................                                                                                                                            ",
+"                                                                                    ................................................                                                                                                                            ",
+"                                                                                   ................................................                                                                                                                             ",
+"                                                                                  .................................................                                                                                                                             ",
+"                                                                                  .................................................                                                                                                                             ",
+"                                                                                 .................................................                                                                                                                              ",
+"                                                                                ..................................................                                                                                                                              ",
+"                                                                                ..................................................                                                                                                                              ",
+"                                                                               ...................................................                                                                                                                              ",
+"                                                                              ...................................................                                                                                                                               ",
+"                                                                              ...................................................                                                                                                                               ",
+"                                                                             ....................................................                                                                                                                               ",
+"                                                                            .....................................................                                                                                                                               ",
+"                                                                            ....................................................                                                                                                                                ",
+"                                                                           .....................................................                                                                                                                                ",
+"                                                                          ......................................................                                                                                                                                ",
+"                                                                          ......................................................                                                                                                                                ",
+"                                                                         .......................................................                                                                                                                                ",
+"                                                                        .......................................................                                                                                                                                 ",
+"                                                                        .......................................................                                                                                                                                 ",
+"                                                                       ........................................................                                                                                                                                 ",
+"                                                                      .........................................................                                                                                                                                 ",
+"                                                                      .........................................................                                                                                                                                 ",
+"                                                                     .........................................................                                                                                                                                  ",
+"                                                                     .........................................................                                                                                                                                  ",
+"                                                                    ..........................................................                                                                                                                                  ",
+"                                                                   ...........................................................++++                                                                                                                              ",
+"                                                                   ..........................................................@+++++                                                                                                                             ",
+"                                                                  ...........................................................#++++++                                                                                                                            ",
+"                                                                  ...........................................................$+++++++                                                                                                                           ",
+"                                                                 ............................................................%++++++++                                                                                                                          ",
+"                                                                .............................................................&++++++++                                                                                                                          ",
+"                                                                .............................................................*+++++++++                                                                                                                         ",
+"                                                               ..............................................................++++++++++                                                                                                                         ",
+"                                                               ..............................................................+++++++++++                                                                                                                        ",
+"                                                              ..............................................................=+++++++++++                                                                                                                        ",
+"                                                              ..............................................................@++++++++++++                                                                                                                       ",
+"                                                             ...............................................................#+++++++++++++                                                                                                                      ",
+"                                                             ...............................................................-+++++++++++++                                                                                                                      ",
+"                                                            ................................................................;>+++++++++++++                                                                                                                     ",
+"                                                            ................................................................,'+++++++++++++                                                                                                                     ",
+"                                                           .................................................................)!~+++++++++++++                                                                                                                    ",
+"                                                           .................................................................)!{>++++++++++++                                                                                                                    ",
+"                                                          ..................................................................)!!'+++++++++++++                                                                                                                   ",
+"                                                          ..................................................................]!!!^+++++++++++++                                                                                                                  ",
+"                                                         ...................................................................!!!!{/++++++++++++                                                                                                                  ",
+"                                                         ...................................................................!!!!!(+++++++++++++                                                                                                                 ",
+"                                                        ....................................................................!!!!!!_+++++++++++++                                                                                                                ",
+"                                                        ....................................................................!!!!!!:/++++++++++++                                                                                                                ",
+"                                                       ....................................................................<!!!!!!![+++++++++++++                                                                                                               ",
+"                                                       ....................................................................}!!!!!!!!|++++++++++++                                                                                                               ",
+"                                                      .....................................................................}!!!!!!!!'+++++++++++++                                                                                                              ",
+"                                                      .....................................................................}!!!!!!!!!~+++++++++++++                                                                                                             ",
+"                                                     ......................................................................}!!!!!!!!!{/++++++++++++                                                                                                             ",
+"                                                     ......................................................................}!!!!!!!!!!1+++++++++++++                                                                                                            ",
+"                                                    .......................................................................}!!!!!!!!!!!_++++++++++++                                                                                                            ",
+"                                                    .......................................................................}!!!!!!!!!!!:+++++++++++++                                                                                                           ",
+"                                                    .......................................................................}!!!!!!!!!!!![+++++++++++++                                                                                                          ",
+"                                                   ........................................................................}!!!!!!!!!!!!{>++++++++++++                                                                                                          ",
+"                                                   ........................................................................}!!!!!!!!!!!!!'+++++++++++++                                                                                                         ",
+"                                                  .........................................................................}!!!!!!!!!!!!!!_+++++++++++++                                                                                                        ",
+"                                                  .........................................................................}!!!!!!!!!!!!!!:+++++++++++++                                                                                                        ",
+"                                                  .........................................................................}!!!!!!!!!!!!!!![+++++++++++++                                                                                                       ",
+"                                                 ..........................................................................}!!!!!!!!!!!!!!!{/++++++++++++                                                                                                       ",
+"                                                 ..........................................................................}!!!!!!!!!!!!!!!!(+++++++++++++                                                                                                      ",
+"                                                 ..........................................................................}!!!!!!!!!!!!!!!!!>+++++++++++++                                                                                                     ",
+"                                                ...........................................................................}!!!!!!!!!!!!!!!!!'+++++++++++++                                                                                                     ",
+"                                                ...........................................................................}!!!!!!!!!!!!!!!!!!_+++++++++++++                                                                                                    ",
+"                                                ...........................................................................}!!!!!!!!!!!!!!!!!!'+++++++++++++                                                                                                    ",
+"                                                ...........................................................................<!!!!!!!!!!!!!!!!!!!|+++++++++++++                                                                                                   ",
+"                                               .............................................................................!!!!!!!!!!!!!!!!!!!(++++++++++++++                                                                                                  ",
+"                                               .............................................................................!!!!!!!!!!!!!!!!!!!!>+++++++++++++                                                                                                  ",
+"                                               .............................................................................!!!!!!!!!!!!!!!!!!!![++++++++++++++                                                                                                 ",
+"                                               .............................................................................!!!!!!!!!!!!!!!!!!!!:++++++++++++++                                                                                                 ",
+"                                              ..............................................................................]!!!!!!!!!!!!!!!!!!!!^+++++++++++++                                                                                                 ",
+"                                              ..............................................................................)!!!!!!!!!!!!!!!!!!!!1++++++++++++++                                                                                                ",
+"                                              ..............................................................................)!!!!!!!!!!!!!!!!!!!!!/+++++++++++++                                                                                                ",
+"                                              ..............................................................................)!!!!!!!!!!!!!!!!!!!!!2++++++++++++++                                                                                               ",
+"                                              ..............................................................................3!!!!!!!!!!!!!!!!!!!!!1++++++++++++++                                                                                               ",
+"                                             ...............................................................................;!!!!!!!!!!!!!!!!!!!!!!/+++++++++++++                                                                                               ",
+"                                             ...............................................................................;!!!!!!!!!!!!!!!!!!!!!!2++++++++++++++                                                                                              ",
+"                                             ...............................................................................4!!!!!!!!!!!!!!!!!!!!!!(++++++++++++++                                                                                              ",
+"                                             ...............................................................................}!!!!!!!!!!!!!!!!!!!!!!{++++++++++++++                                                                                              ",
+"                                             ...............................................................................}!!!!!!!!!!!!!!!!!!!!!!!|+++++++++++++                                                                                              ",
+"                                             ...............................................................................5!!!!!!!!!!!!!!!!!!!!!!!~+++++++++++++                                                                                              ",
+"                                            .................................................................................!!!!!!!!!!!!!!!!!!!!!!!(++++++++++++++                                                                                             ",
+"                                            .................................................................................]!!!!!!!!!!!!!!!!!!!!!!6++++++++++++++                                                                                             ",
+"                                            .................................................................................)!!!!!!!!!!!!!!!!!!!!!!!++++++++++++++                                                                                             ",
+"                                            .................................................................................)!!!!!!!!!!!!!!!!!!!!!!!|+++++++++++++                                                                                             ",
+"                                            .................................................................................;!!!!!!!!!!!!!!!!!!!!!!!_+++++++++++++                                                                                             ",
+"                                            .................................................................................;!!!!!!!!!!!!!!!!!!!!!!![+++++++++++++                                                                                             ",
+"                                            .................................................................................}!!!!!!!!!!!!!!!!!!!!!!![+++++++++++++                                                                                             ",
+"                                            .................................................................................}!!!!!!!!!!!!!!!!!!!!!!![+++++++++++++                                                                                             ",
+"                                            ..................................................................................!!!!!!!!!!!!!!!!!!!!!!!'+++++++++++++                                                                                             ",
+"                                           ...................................................................................]!!!!!!!!!!!!!!!!!!!!!!'+++++++++++++                                                                                             ",
+"                                           ...................................................................................)!!!!!!!!!!!!!!!!!!!!!!'+++++++++++++                                                                                             ",
+"                                           ...................................................................................3!!!!!!!!!!!!!!!!!!!!!!'+++++++++++++                                                                                             ",
+"                                           .....................................................................7@#$$8&&&&9++++>____~[[''!!!!!!!!!!!!(+++++++++++++                                                                                             ",
+"                                           ...............................................................=#$0*+++++++++++++++++++++++++++/_~a'!!!!!![+++++++++++++                                                                                             ",
+"                                           ..........................................................7#%&+++++++++++++++++++++++++++++++++++++++|~1{![+++++++++++++                                                                                             ",
+"                                           ......................................................7#%9+++++++++++++++++++++++++++++++++++++++++++++++|>++++++++++++                                                                                              ",
+"                                           ...................................................bc&+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                              ",
+"                                           ................................................=%9++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                              ",
+"                                           .............................................bc*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                              ",
+"                                           ...........................................#0+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                               ",
+"                                           ........................................7$9++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                              ",
+"                                           ......................................b8+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                            ",
+"                                           ....................................@&+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                          ",
+"                                           ..................................@&+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                        ",
+"                                           ................................@&++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                       ",
+"                                           ..............................b8++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                     ",
+"                                          .............................7$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                    ",
+"                                          ............................#9++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                  ",
+"                                          ..........................b&+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                 ",
+"                                          .........................$d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                ",
+"                                          .......................=*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                               ",
+"                                          ......................cd++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                              ",
+"                                          ....................7&++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                            ",
+"                                          ...................@d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                           ",
+"                                          ..................$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                          ",
+"                                          ................70+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                         ",
+"                                          ...............=*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                        ",
+"                                          ..............@d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                        ",
+"                                          .............e+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                       ",
+"                                          ............$+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                      ",
+"                                          ...........8+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                     ",
+"                                          ..........8+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                    ",
+"                                          .........8++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                    ",
+"                                          ........8++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                   ",
+"                                          .......8++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                  ",
+"                                          ......8++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                 ",
+"                                          .....8+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                 ",
+"                                          ....e+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                ",
+"                                          ...e+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                               ",
+"                                          ..=d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                               ",
+"                                           7d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                              ",
+"                                           *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                              ",
+"                                          +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                             ",
+"                                          +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                             ",
+"                                         +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                            ",
+"                                        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                            ",
+"                                       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                           ",
+"                                       ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                           ",
+"                                      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                          ",
+"                                     +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                          ",
+"                                     ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                         ",
+"                                    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/[a''''''''[~                                                         ",
+"                                    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1!!!!!!!!!!!!!                                                        ",
+"                                   +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!                                                       ",
+"                                  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!                                                       ",
+"                                  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!!                                                      ",
+"                                 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++(!!!!!!!!!!!!!!!                                                      ",
+"                                 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2!!!!!!!!!!!!!!!                                                      ",
+"                                +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{!!!!!!!!!!!!!!!                                                     ",
+"                                +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^!!!!!!!!!!!!!!!                                                     ",
+"                               +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/_2[[[[[[[2_/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[!!!!!!!!!!!!!!                                                     ",
+"                               +++++++++++++++++++++++++++++++++++++++++++++++++++++++/2(:!!!!!!!!!!!!!{1~>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>(:!!!!!!!!!{f                                                     ",
+"                               ++++++++++++++++++++++++++++++++++++++++++++++++++++/2'!!!!!!!!!!!!!!!!!!!!!6~/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/_^[[[[_|++                                                     ",
+"                              +++++++++++++++++++++++++++++++++++++++++++++++++++>[{!!!!!!!!!!!!!!!!!!!!!!!!!!(>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                     ",
+"                              +++++++++++++++++++++++++++++++++++++++++++++++++/[{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                     ",
+"                             +++++++++++++++++++++++++++++++++++++++++++++++++^{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!{[+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                    ",
+"                             +++++++++++++++++++++++++++++++++++++++++++++++/1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                    ",
+"                             ++++++++++++++++++++++++++++++++++++++++++++++|{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!{^++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                    ",
+"                            ++++++++++++++++++++++++++++++++++++++++++++++2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                    ",
+"                            +++++++++++++++++++++++++++++++++++++++++++++2!!!!!!!!!!!!!!!!!!gghiijgg!!!!!!!!!!!!!!!!!!!(+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                   ",
+"                            ++++++++++++++++++++++++++++++++++++++++++++2!!!!!!!!!!!!!!khlmnnnnnnnnnnmlhk!!!!!!!!!!!!!!!(++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                   ",
+"                           ++++++++++++++++++++++++++++++++++++++++++++2!!!!!!!!!!!!!jonnnnnnnnnnnnnnnnnnog!!!!!!!!!!!!!!a+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                   ",
+"                           +++++++++++++++++++++++++++++++++++++++++++_!!!!!!!!!!!!hmnnnnnnnnnnnnnnnnnnpqrstu!!!!!!!!!!!!!2++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                   ",
+"                           ++++++++++++++++++++++++++++++++++++++++++/{!!!!!!!!!!vwnnnnnnnnnnnnnnnnnnnxssssssyz!!!!!!!!!!!!|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                   ",
+"                           ++++++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!AnnnnnnnnnnnnnnnnnnnnBssssssssCA!!!!!!!!!!!:/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                  ",
+"                          ++++++++++++++++++++++++++++++++++++++++++~!!!!!!!!!konnnnnnnnnnnnnnnnnnnnnDsssssssssplk!!!!!!!!!!a+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                  ",
+"                          +++++++++++++++++++++++++++++++++++++++++>{!!!!!!!!kEnnnnnnnnnnnnnnnnnnnnlFssssssssssxnEk!!!!!!!!!!_++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                  ",
+"                          +++++++++++++++++++++++++++++++++++++++++(!!!!!!!!kEnnnnnnnnnnnnnnnnnnnmg!GssssssssssHlnEk!!!!!!!!!6++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                  ",
+"                          ++++++++++++++++++++++++++++++++++++++++>!!!!!!!!kEnnnnnnnnnnnnnnnnnnnEk!!IssssssssssJ!hnEk!!!!!!!!!2+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                  ",
+"                         +++++++++++++++++++++++++++++++++++++++++(!!!!!!!!onnnnnnnnnnnnnnnnnnnEk!!!!ysssssssssK!!hnl!!!!!!!!!:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                         ++++++++++++++++++++++++++++++++++++++++>!!!!!!!!AnnnnnnnnnnnnnnnnnnnLk!!!!!MsssssssssI!!!lnA!!!!!!!!!_+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                         ++++++++++++++++++++++++++++++++++++++++[!!!!!!!vnnnnnnnnnnnnnnnnnnnnh!!!!!!!Nsssssssu!!!!kLLO!!!!!!!!1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                         ++++++++++++++++++++++++++++++++++++++++:!!!!!!!wnnnnnnnnnnnnnnnnnnnm!!!!!!!!!MysssJG!!!!!!Anw!!!!!!!!!/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                         +++++++++++++++++++++++++++++++++++++++|!!!!!!!jnnnnnnnnnnnnnnnnnnnnA!!!!!!!!!!!!G!!!!!!!!!knng!!!!!!!!2++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                        ++++++++++++++++++++++++++++++++++++++++[!!!!!!!EnnnnnnnnnnnnnnnnnnnnO!!!!!!!!!!!!!!!!!!!!!!!wnw!!!!!!!!1++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                        ++++++++++++++++++++++++++++++++++++++++'!!!!!!gnnnnnnnnnnnnnnnnnnnnL!!!!!!!!!!!!!!!!!!!!!!!!inng!!!!!!!{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                 ",
+"                        ++++++++++++++++++++++++++++++++++++++++!!!!!!!lnnnnnnnnnnnnnnnnnnnnw!!!!!!!!!!!!!!!!!!!!!!!!hnnl!!!!!!!!|++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++_!!!!!!knnnnnnnnnnnnnnnnnnnnnw!!!!!!!!!!!!!!!!!!!!!!!!gnnL!!!!!!!!2++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++2!!!!!!jnnnnnnnnnnnnnnnnnnnnnw!!!!!!!!!!!!!!!!!!!!!!!!jnnnj!!!!!!![++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++[!!!!!!PnnnnnnnnnnnnnnnnnnnnnE!!!!!!!!!!!!!!!!!!!!!!!!innnP!!!!!!!'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++a!!!!!!Ennnnnnnnnnnnnnnnnnnnnnk!!!!!!!!!!!!!!!!!!!!!!!lnnnw!!!!!!!'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++'!!!!!!nnnnnnnnnnnnnnnnnnnnnnnj!!!!!!!!!!!!!!!!!!!!!!!mnnnn!!!!!!!'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++'!!!!!Onnnnnnnnnnnnnnnnnnnnnnnl!!!!!!!!!!!!!!!!!!!!!!gnnnnn!!!!!!!{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++'!!!!!gnnnnnnnnnnnnnnnnnnnnnnnnO!!!!!!!!!!!!!!!!!!!!!wnnnnng!!!!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                ",
+"                        +++++++++++++++++++++++++++++++++++++++'!!!!!gnnnnnnnnnnnnnnnnnnnnnnnnw!!!!!!!!!!!!!!!!!!!!jnnnnnng!!!!!!{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++'!!!!!gnnnnnnnnnnnnnnnnnnnnnnnnnA!!!!!!!!!!!!!!!!!!OLnnnnnng!!!!!!'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++a!!!!!gnnnnnnnnnnnnnnnnnnnnnnnnnnh!!!!!!!!!!!!!!!!kEnnnnnnng!!!!!!'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++[!!!!!gnnnnnnnnnnnnnnnnnnnnnnnnnnni!!!!!!!!!!!!!!vLnnnnnnnng!!!!!!1+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++2!!!!!gnnnnnnnnnnnnnnnnnnnnnnnnnnnnEg!!!!!!!!!!kPnnnnnnnnnnO!!!!!![+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++_!!!!!!nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnEAv!!!!Ojlnnnnnnnnnnnn!!!!!!!2+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        ++++++++++++++++++++++++++++++++++++++++!!!!!!mnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnE!!!!!!!|+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                               ",
+"                        ++++++++++++++++++++++++++++++++++++++++'!!!!!onnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnl!!!!!!{++++++++++++++++++++++++++++++++++++++++++++++++++++__[[[[[[[[[~__++++++++++++++                                               ",
+"                        ++++++++++++++++++++++++++++++++++++++++[!!!!!Annnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnh!!!!!!1+++++++++++++++++++++++++++++++++++++++++++++++>2(6!!!!IGNNNNQG!!!!:(/++++++++++                                               ",
+"                        ++++++++++++++++++++++++++++++++++++++++|!!!!!OnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnO!!!!!!2++++++++++++++++++++++++++++++++++++++++++++/~6!!!!!RNSssssssssTKR!!!6++++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++++:!!!!!EnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnE!!!!!!!/++++++++++++++++++++++++++++++++++++++++++>(!!!!!!!UTssssssssssssV!!!!^+++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++++[!!!!!Annnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnh!!!!!!(+++++++++++++++++++++++++++++++++++++++++>(!!!!!!!!!SsssssssssssssJ!!!![+++++++++                                               ",
+"                        +++++++++++++++++++++++++++++++++++++++++>!!!!!kLnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnL!!!!!!!_++++++++++++++++++++++++++++++++++++++++[{!!!!!!!!!!SssssssssssssTM!!!!2++++++++++                                              ",
+"                        ++++++++++++++++++++++++++++++++++++++++++(!!!!!innnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnni!!!!!!6+++++++++++++++++++++++++++++++++++++++>'!!!!!!!!!!!!UysssssssssTWI!!!!!>++++++++++                                              ",
+"                        ++++++++++++++++++++++++++++++++++++++++++>!!!!!kLnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmk!!!!!!2++++++++++++++++++++++++++++++++++++++|{!!!!!!!!!!!!!!!UQKJJJKNG!!!!!!!6+++++++++++                                              ",
+"                        +++++++++++++++++++++++++++++++++++++++++++(!!!!!hnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnj!!!!!!'++++++++++++++++++++++++++++++++++++++2{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2+++++++++++                                              ",
+"                        +++++++++++++++++++++++++++++++++++++++++++/{!!!!!wnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnno!!!!!!!_+++++++++++++++++++++++++++++++++++++|!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(++++++++++++                                              ",
+"                         +++++++++++++++++++++++++++++++++++++++++++~!!!!!kLnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmk!!!!!!a+++++++++++++++++++++++++++++++++++++>{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6/++++++++++++                                              ",
+"                         ++++++++++++++++++++++++++++++++++++++++++++'!!!!!vLnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnLv!!!!!!:/+++++++++++++++++++++++++++++++++++++a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6/+++++++++++++                                              ",
+"                         ++++++++++++++++++++++++++++++++++++++++++++/{!!!!!hnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnj!!!!!!!|++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6/++++++++++++++                                              ",
+"                         +++++++++++++++++++++++++++++++++++++++++++++|!!!!!!hnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnh!!!!!!!2+++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:/+++++++++++++++                                              ",
+"                         ++++++++++++++++++++++++++++++++++++++++++++++2!!!!!!gLnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnLv!!!!!!!a++++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!{|++++++++++++++++                                              ",
+"                          ++++++++++++++++++++++++++++++++++++++++++++++2!!!!!!vEnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnEO!!!!!!!(+++++++++++++++++++++++++++++++++++++++++[!!!!!!!!!!!!!!!!!!!!!!!!!!!!{|+++++++++++++++++                                              ",
+"                          +++++++++++++++++++++++++++++++++++++++++++++++2!!!!!!!innnnnnnnnnnnnnnnnnnnnnnnnnnni!!!!!!!!(+++++++++++++++++++++++++++++++++++++++++++'!!!!!!!!!!!!!!!!!!!!!!!!!!{|++++++++++++++++++                                              ",
+"                          ++++++++++++++++++++++++++++++++++++++++++++++++2{!!!!!!vwnnnnnnnnnnnnnnnnnnnnnnnnwO!!!!!!!!~+++++++++++++++++++++++++++++++++++++++++++++2:!!!!!!!!!!!!!!!!!!!!!!!!_+++++++++++++++++++                                              ",
+"                          +++++++++++++++++++++++++++++++++++++++++++++++++|:!!!!!!!gonnnnnnnnnnnnnnnnnnnnlg!!!!!!!!{^++++++++++++++++++++++++++++++++++++++++++++++++|({!!!!!!!!!!!!!!!!!!!!2++++++++++++++++++++                                              ",
+"                          ++++++++++++++++++++++++++++++++++++++++++++++++++/1!!!!!!!!OAwnnnnnnnnnnnnnnwAk!!!!!!!!!'>++++++++++++++++++++++++++++++++++++++++++++++++++++^({!!!!!!!!!!!!!!!!2+++++++++++++++++++++                                              ",
+"                           +++++++++++++++++++++++++++++++++++++++++++++++++++^:!!!!!!!!!!gAPwwwwwwiAg!!!!!!!!!!!{~+++++++++++++++++++++++++++++++++++++++++++++++++++++++++|a:!!!!!!!!!!!!2++++++++++++++++++++++                                              "};
diff --git a/resources/FreeRDP_Logo_Icon.ai b/resources/FreeRDP_Logo_Icon.ai
new file mode 100644 (file)
index 0000000..f7e55c3
--- /dev/null
@@ -0,0 +1,4650 @@
+%PDF-1.5\r%âãÏÓ\r
+1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 51395/Subtype/XML/Type/Metadata>>stream\r
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:dc="http://purl.org/dc/elements/1.1/">
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">FreeRDP_Logo_Icon</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+         <xmp:MetadataDate>2011-08-01T20:34:57+02:00</xmp:MetadataDate>
+         <xmp:ModifyDate>2011-08-01T20:34:57+02:00</xmp:ModifyDate>
+         <xmp:CreateDate>2011-08-01T20:34:57+02:00</xmp:CreateDate>
+         <xmp:CreatorTool>Adobe Illustrator CS5.1</xmp:CreatorTool>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>204</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAzAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FVskkccbSSMEjQF&#xA;ndiAAAKkknoBirxbz7+aN5qM8mn6JK1tpyEo9yhKyT9qgjdU9up7+GZ+HTgbnm6fU6wyNR5IT8nh&#xA;dv5yVomb0lgla6oTQpSg5f7NlyWprgY6C/E+D3bNc7p2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5J+bnnhnkfy5p0lI0/46Mqn7TdRCCOw/a+7xzN0&#xA;2L+Iur12p/gHxeV5mOre1fktoa22hz6vIv76/cpEfCKIkbfN+VfkMwNVOzXc7ns/HUOLvei5iue7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWOeffNK+Xd&#xA;AluUI+vT/ubJTv8AvCPtkeCDf7h3y3Dj4pOPqc3hwvq+dZJHkkaSRi8jks7sakkmpJJzaOgJtbih&#xA;9Efl1f2E/leztbaqyWUSR3EbUB5sORYU/ZZq0zWZ4kSs9Xe6PLGUAB0ZPlLluxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8/8A5n+YzrPmeaONq2en1t4A&#xA;OhZT+8f/AGTbfIDNlp4cMfe6LW5eOddAxDL3Ediqefkh+Y7MVE7kzWlIbtO8ludkkp/Mvf3HvlWb&#xA;HxCnJxZPCnxdDzfSUciSIsiMGRwGVhuCDuCM1bvgbbxS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUv8w6gdO0LUL4Gj29vLIh/ywh4j/gqZKAsgMMkuGJPcHzC&#xA;SSSSak7knNu801irsVeX+V9ZfQvM1vdAlIVl9K5XxhZuLg/Lr8xi5EhYfZ35b6xJc6fLp8pq1mQY&#xA;ievpvXb/AGJH45gamFG+9z+zs3FExPRmOYrsXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq8+86fmxZaU72Ojql5frtJMTWGM+G322+W36sycWnMtzycHUa0Q2juXl955784Xcxlk1e5Ria8&#xA;YZDCo/2MfEZmDDAdHWS1OQ9S9O/KPzfqesQ3lhqcpuJ7QJJDO32yjEhlY9+JAoffMTU4hHcOy0Oe&#xA;UwRLo9DzFc92KuxV2KuxVi/5nSmLyLqrDusS7f5cyL/HLsA9YcbVmsRfPGbN0CMttKvbgBlTih/b&#xA;fYf1xRaOTy4afHPQ+CrX8ScbRxMN1L8mjNNNPa6mFaR2cRSQ/CORrTkrdv8AVxttGZ7v+VJS2u2i&#xA;uZ0E/wBWSIAkD1HBFeNaV+zmJqgeEOX2dIcZ3eoZgu6dirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVeT/mZ+ZL85ND0Saiiq3t7GdyehijI/wCGYfLM3Bg6l1ms1f8ADH4vKMzHVOxV67+RmnMt&#xA;rqmosPhkeO3jP+oC7/8AE1zC1ctwHbdnQ2JepZhuydirsVdirsVYr+aSs3kTU1UEsTAAB1J+sx5d&#xA;p/rDi63+6Pw+945p2jxwqJJwHm68TuF/tzZPPkplixdirsVbBIIINCOhxV6N5G83SXhGl6g/K5Uf&#xA;6POx3kA6q3+UB375g58Nbh3Wh1Zl6Jc2aZiuydirsVdirsVdirsVdirsVdirsVdirsVdirsVed/m&#xA;n59OlwNoumyU1Gdf9JmU7wxsOgPZ2H3D6MytPhvc8nA1mp4Rwjm8VzPdM1iraqzMFUEsTQAbkk4p&#xA;fSnk3Qv0H5bstPYD1kTncEf79f4n+dCafRmqyz4pEvRYMfBABOsrbXYq7FXYq7FXn/5ka8zSLo0J&#xA;+BeMl0fFuqJ9H2vuzN02P+J1HaOf+AfFgmZbqku1LzHoWmPwv76G3k6+mzjnQ9+Iq34YshElV07W&#xA;dK1NC9hdxXKj7XpsGI/1h1H04oMSOaMxQ7FUk8yeYfMuhvZXWhacb+USFnKhyYylChog774CLFNu&#xA;LY3dU+gfKmtvrvlvTtXktns5b2BJJrSUFWjkIo6UYA7MDQ03G+aqceEkPSY58UQe9NcizdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVSDzt5rt/LeivdtR7uWsdnCf2pCOp/yV6n7u+WYsfGaaNRmGON9Xzr&#xA;d3Vxd3Mt1cyGW4mYvLI25ZmNSc2gFCnQSkSbKjhYuxVln5X6Mup+cLQSLygswbqUf8Y6cP8AkoVy&#xA;nUSqLl6LHxZB5bvoPNY712KuxV2KuxV2KvD9VvGvdSubtjUzSM4+ROw+gZtoRoAPL5Z8Uie9i3nL&#xA;VdRsdNht9KQy6vqc8dlp6KKn1ZjQEDufD3yRNJww4pUyS6/J78vPIHkS+8yea7JvMuq20ay3kkks&#xA;io88riNY4gCKKZJAObgt39swfGlOVDZ3ngQxxsi3j+tah5NvrrTL7yFaz6Pr6WklzqVsrubb1YI/&#xA;VlijErOxHBXp8VGoBwBOZMOMXxcnFyRxzHp5vSfLurprGiWmpKvH6wlXUdA6kq4HyYHLXVSFGkxx&#xA;YuxV6r+XdyZvLaITX6vLJGPpIf8A43zXakVN3/Z8rxe5k2UOa7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;Vk00UEMk8zBIolLyO2wVVFST8hiAgmnzp5481TeY9cku6kWcX7uyiP7MYPUj+Zzufu7ZtMOPhFOg&#xA;1OfxJX06Mey1x3Yq7FXrX5GaeBFqmosNy0dvG3yBdx+K5hauXIO17OjsS9VzDdm7FXYq7FXYq7FX&#xA;gpBBIOxGxGbh5NIfMkkdhqXl3zBMGa00TVLa6veAqy2/MCRwO/HbIzFxIcrSTEZi30Fr2iaL5r8u&#xA;XOl3tLnStThALxOPiU0eOSNxUbEBlPTNXGRibeglESFF4+/5OeR/yu0fWvNt3qEt9cQWdxDpqXIR&#xA;VWS4iaJUCr/eSPz4+FCTTwyPGlkIDjjDDGDJjvkXTrjTvKenWtwOMyxs7qeo9V2kofcc8znQZDZV&#xA;/MnmbTPL9iLq+LHmeMMKCru3Wg7D3JxRGJKUWf5jaBc6A+oG+hi1bkVtvL4juZLiUhiqr6yx+krP&#xA;sRSo33NdsrMpcVVt3uWNNHhsy37nuP5WSs2mXasOJEiMU6kFk3/VmLquYczsw+kjzZvmK7N2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KvMvzk82G3tU8v2r0muQJL0jqsVfhT/AGRFT7fPMvS47PEXXa/PQ4B1&#xA;eO5nOodirsVdir0r8tvNsmi2EdpLEjWM87SSyAH1AWonKtaGnAbUzHzYeLfq5em1nh+kj0vZVZWU&#xA;MpBUioI3BBzXO9dirsVdirsVdirxnzRp5sNevIKUQyGSP/Uk+IfdWmbTFK4gvN6rHwZCEpkjjkja&#xA;ORQ8bgq6MKgg7EEHqDljjoXSH83eXoTaeWvMEljptSY9OuYEvYYqkkiH1CrxrU14hqZVPDGW5c3F&#xA;rpxFc1C/07V9c1CC/wDNWrS61LaHlZ2xjS3tIm/mWCP4S3+UxOShjEeTDNq5z5plk3FS/WtB0nWr&#xA;YW2pQCaNTyQ1KsrEUqrKQRiyjIjkxTyl5N0PTPNeqLEGnksFt2tjKQxj9dWJOwAr8OxxbJzJiH0D&#xA;+V8RGnXstNnmVa/6q1/42zB1R3Ds+zB6SfNmuYrs3Yq7FXYq7FXYq7FXYq7FXYq7FUJq2p22l6Zc&#xA;6hcmkFtGZHp1NOij3Y7DJRjZpjOYiCT0fM+sapc6rqdzqNyazXMhdh2APRR7KNhm2jHhFPOZJmci&#xA;T1QeFg7FXYq7FUy8o+Yba/N5puy3WnSMjLX7UZNQ4+n4T/bgWca3e3/l7r/1ywOnTtW5tB+7J6tF&#xA;0H/A9PuzA1OOjfe7js/PxR4TzH3MuzGdg7FXYq7FXYqwj8ytGMtvDqsS1aD91cU/kY/C30MafTmX&#xA;pZ706ztLDYEx0ed5mumdirsVdiqF1TUbbTbCa+uSRDCtSAKkkmiqo8WYgDFIFmkt8raZdQxXGp6g&#xA;CNU1Vlmuo+0SqCIoR/xjU0+eLKZ6Do988m6a1h5eto3FJZQZpB7ybj7loM1meVyL0Gjx8GMBO8qc&#xA;l2KuxV2KuxV2KuxV2KuxV2KuxV5Z+dnmEpDa6DC1DLS5uwP5QaRqfmwLfQMzNLD+J1vaGWgIh5Hm&#xA;a6l2KuxV2KuxV5qmvXOi+c7jUbep9K5kWWPoHj5EOp+fbFvq40+gvLmviN7PWdOfnGwEsZ7MjDdW&#xA;+Y2OQnESFFpxzOOVjo9v0++t7+yhvLc8oplDL4jxB9wdjmrlEg0XpMcxOII6ojIs3Yq7FXYqsuII&#xA;biCSCZQ8UqlHQ9CCKHCDSJRBFF435j0ObR9TktWq0J+O3kP7SHp9I6HNniycQt5vU4DjlXRK8saH&#xA;Yq7FXEA7EVHXf23xVPvJ2gnVtWQSLW0t6SXB7H+VP9kfwrlObJwx83L0eDxJ78g9dzWvQuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV80+cNYbWPMuoX9axySlYf8AjEnwJ/wq5tsUeGIDzuoyccyUmybS7FXY&#xA;q7FXYq8j19eOuX46/wCkSn73JwuTHkz78oPMrCSTQLhqq3Kayr2I3kQfP7X34C1ZY9X0L+XfmD6t&#xA;dnSp2/cXJrAT+zL4f7L9eYmpx2OIOV2fqKPAeRekZgu6dirsVdirsVSPzhoK6tpLhFrd24Mls3ck&#xA;DdP9kPxpl2HJwy8nF1eDxIeY5PIM2TzrsVdiq6ON5JFjQFnchVUdSTsBikCzT2Pyxocej6VHb0Bu&#xA;H+O5cd3I6V8F6DNXlycRt6PTYPDhXXqm2VuQ7FXYq7FXYq7FXYq7FXYq7FXYqlnme++oeXNTvAeL&#xA;Q20rRnp8fAhP+Gpk8YuQDXllwwJ8nzHm2ebdirsVdirsVdiryjzOnDzBfClKylv+CAP8cLkR5IXS&#xA;dRl03U7W/h/vLaRZAPEKd1+kbYpIt9KWl0HSG7t3NGCywyDY0NGUjIuHuC9w0e/F/pdreDrNGrMB&#xA;2alGH0NXNTONEh6fFPjiJd6MyLY7FXYq7FXYq8T16BINbv4U2RJ5Ao8ByNBm1xm4h5nURrJIeaAy&#xA;bS7FU88lNZDzNZC6YAMzCDl0MvElB+G3vTKc98Bpy9CB4ot6/mtehdirsVdirsVdirsVdirsVdir&#xA;sVdirE/zTuPR8jajT7UnpRj/AGUqV/CuXacesONrDWIvnzNm6B2KuxV2KuxV2KvMvPEXp+Yp27Sr&#xA;G4/4AL/xrhb4ckhxZvoLyJctceUNKkbqIBH9ERMY/Bci4mQep7t5AZm8r2wJqFaQD5eoT/HNdqPr&#xA;LvdB/dD4siyhzHYq7FXYq07qiM7GiqCWJ7AYqS8N1C6N3fXF0es8ryU/12J/jm2iKFPLZJcUie8o&#xA;fJMHYqh9QEv1ZpIWKTQkSxOuxDIeQI99sWUTRt7L5K8zReYtBhvQQLlP3V5GP2ZVArt4N9oZq8uP&#xA;hlT0mnzeJG0+ytudirsVdirsVdirsVdirsVdirsVYJ+czlfJ4FPt3USn/gWP8MyNL9bha8/u/i8L&#xA;zYukdiqpDBNM/CJC7eAxVM7fy/K1DPIEH8q7n7+mNseJHxaLp6dULnxYn+FBgRaIWys1FBBGP9iM&#xA;VtRn0bR7huc9jbytSnJ4kY08KkYpEill55C8oXYPqaXChPeEGGny9MqMUjJIJppOl2uladDp9pyF&#xA;vACI+R5GhYtufmcWMjZt7H5EutPbQLe2t51kniDNPGNmVmYtuDv3pXNdqAeKy7/Qyj4YAO7I8ocx&#xA;2KuxV2KpJ5zv/qXly7cGjzL6CfOTY/8AC1y3BG5BxtZk4cZ+Tx/Nm847FXYq4gEUPTFVvkbzK3lb&#xA;zO0UzEabdMIrodlUmscn+wrv7VyrPj4o+bnaPPwS35F76rKyhlIKkVBG4IOax3zsVdirsVdirsVd&#xA;irsVdirsVdirz787SR5UtQDSt9GD7/uZTmTpPq+Dgdof3Y9/63iWbB0ya2GhvJSS5qidRH+0fn4Y&#xA;oJTuKGKFAkShFHYYGC/FXYq7FXYq7FXYqq29zcW0yT28jRTIao6GhBwEA82UZGJsc3pPlLzvHqRW&#xA;x1AiO+O0cmwSX29m9swc2Dh3HJ3Wk1vH6ZfV97LcxnYOxV2KsA/NC/q9lYKegaeQfP4E/wCNszNL&#xA;HmXU9p5OUfiwPMx1LsVdirsVSPzDBSSKYftDi3zG4/XhDKL0r8pPPAuYE8vahJ/pMI/0CRj9uMf7&#xA;rJ8U7e3yzB1OKvUHc6HUWOA8+j03MR2KR695v0rRyYpCZrulfq8dKivTkTsuW48Jl7nFz6uGPY7l&#xA;jLfmffPKFh0+P4jRVLszVPToFzI/KjvcL+U5E7RZrpdxqk0PLULVLWSgoqSepX57Cn3nMWYA5F2e&#xA;OUiPUKRuQbHYq7FXYq7FXYq8+/O0E+VbQDr9fj/5My5k6T6vg4HaP92Pf+t5jpekrCBNOKzHdVPR&#xA;f7cz3SEppixdirsVdirsVdirsVdirsVbVmVgykhgagjYgjFXq3krzN+l7IwXDf6fbAeof506B/4N&#xA;/bmuz4uE2OTv9FqfEjR+oMkyhzXYq8h873ZufMt4a/DEViUeHBQD/wANXNlgFQDz2tneUpFlziOx&#xA;V2KuxVL9dTlYE/ysp/h/HFMWPQzSwypNC5jljYPG6mhVlNQQR4YSGwGjYey+XPzTS+8t3Iu2VNdt&#xA;I6KCAFmqQqyKPEE1Zfp6dMGWmqQ/mu1jrv3ZJ+oMOlkklkaWRi8jks7sakkmpJOZoDpiSTZaRmRg&#xA;6mjKQVI7EYqDT2nQdWj1XSoL1aBnWkqj9mRdmH39PbNVkhwmnpcGUZICSYZBudirsVdirsVdirzz&#xA;8y9Ytrh4dJRRIbaQTyud+MnEqqj34uSczdNjr1Oo7Rzg+gMHzLdU7FXYq7FXYq7FXYq7FXYq7FXY&#xA;qjtF1WbS9TgvYt/Tb40/mQ7Mv0jIThxCm3DlOOQkHtUM0c8Mc0R5RyqHRh3VhUHNWRT0wIIsL8CX&#xA;ivmHl+n9S5Vr9am6+HqGmbXH9I9zzOo/vJe8pdk2l2KuxV2KpfrrUsCP5mUfx/himLG8LNcjsjB0&#xA;JVlNQR1BxVkumait3FRtpk+2vj7jAwIRuKGfflddyH69aGpjHCVfAMaq330H3Zh6oci7bsyZ9QZ7&#xA;mG7Z2KuxV2KuxVL9e1VNK0q4vW3ZFpEp7u2yj7+uTxw4jTVny+HAyeLzTSTSvNKxeSRi7sepZjUn&#xA;NoBTzJJJsrMKHYq4kAEk0A3JOKpJeed/KdpIY59Ug5jYhCZKH39MNizGORXWPnPytfP6dtqcBkPR&#xA;Hb0yfkJONfoxU4yE5xYOxV2KuxV2KuxV4Z550jzFa+Y76aSO4e2mmeW3nUO0fByXChhsONaUwuXC&#xA;Qp9Df84ua7rd95S1DTdT9Z0024X6nNPyr6U6k+mpbqEZCf8AZZgaqIEr73baOdxrue0ZiuW8e85W&#xA;5g8zX69mcSD/AJ6KG/jmzwG4B53WRrKUqtbdri5ht02aZ1jU+7Gg/XlhNC3HhHiIHepYWLsVdiqU&#xA;eYpKRQxeLFj9Ap/HCGUUixZOxVVt7iS3mWWM/Ep+8eGKs00u0u9UEf1GB5zINggJp8z0FPfISkBz&#xA;WGKUjQFvWPJ/ls6LYMJSGvLghpyOgp9lAfapzX5svGfJ3uk0/hR35lPspct2KuxV2KuxV5/+Z+os&#xA;ZbTTlPwqDPKPEmqp91GzM0seZdR2nk5R+LBMzHVOxVDalqVnptjNfXknp28C8nb8AAO5J2GKQLLx&#xA;+91fzl+YOtLpGi200schPoadB04j9uZtlp4ljxGMpCIsuZiwkmhzZ7pX/OJvm+4tll1LVrOxlYV9&#xA;BBJOy+zEcFr/AKpOYx1Y6Bzhoj1KF8wf84reebCAzaVeWmrFf+PdWNvMf9USfu/vcYjWQ67LLRS6&#xA;G2E+XPOWv+UtSfStWjmNtA/pXVjOCJYCOvANQqR/L0P45kggiw4GTF0Oxez2l3bXlrFdW0glgmUP&#xA;HIvQg4uIRSrih2KuxV2KuxVmH5Z3hj1ie2J+G4hqB/lRmo/AnMbVR9Nux7NnUyO8PS8wHdvN/wAz&#xA;bIx6nbXgHwzxcGP+VGf6MMztLLYh0vaUKkJd7HvLahvMGnA/8tMR+5wcvy/Sfc4mmH7yPvCEvoDb&#xA;3txARQxSOhHhxYjJRNhryRqRHmoYWDsVYlqeqRXerXNsp3taJ89qsfoYkYWwDZQxV2KuxV7T+SWo&#xA;STaBeWTmotbjlH7LKtaf8EpOYGqHqt3PZ8rgR3F6NmK57sVdirsVdirsVeQ+drk3Hma9NarGyxKP&#xA;DgoB/wCGrmywCoB53WyvKUiy5xXYq8v/ADe1O5uL7T9AtasXpM8a9XkkYxxL+B+/FyMEbfTP5Vfl&#xA;xp3kXyxDYRIj6pOqyareAbyTU3UN14JXig+nqTmsy5DM27/FjEBSh+dHnm78meQ7vVLED9IzulpY&#xA;uw5KksoJ9QjoeCKzCu1aVxww4pUubJwRJeH/AJW/85GJ5d0i7sPM9veapPJNJcwX0brJK7yAVSX1&#xA;WXao2YE/LL8+j4jcdnFw6zhFSYlfald/mZP5jvLiEJrNjFNq2nlTVvqcTgzWbNSr+mj84yenFl/a&#xA;AF8Y+GAOnJqMvFvvG4/Umf5N61JLaXekSvX6uRPbA9kc0cD2DUP05cXXZo9XpGBodirsVdirsVTr&#xA;ybceh5msG7M5jP8Az0Ur/HKs4uBcrRyrKHsOax6Jj/nrSzf6BKUFZrU+uniQoo4/4EnLsE6k4mtx&#xA;ceM943eaeX34a7pzVoBcw1PtzFcz8n0n3Ok05rJH3hF+c7U23mW+Wm0jiVff1FDH8ScjgNwDZrI1&#xA;lKSZa4qF1W/j0/T57ySlIlJUHu3RV+k7YpAsvKLNdRubxp7epnLF3k6CrGprXxyTkGmUW5ufTH1h&#xA;UD9yhJH4gYGsquKHYq9o/JCyePQr68YUFxcBF8SIkG/3ucwNWfUA7js6NQJ83o+YrsHYq7FXYq7F&#xA;XYq8V8wknX9SJ/5aph90hGbXH9I9zzOo/vJe8pdk2l2KvPI4Fl/P7QFuADGbyydAf8ihX/h1yGX6&#xA;C7DRi5RfX2ap3jCfzj8i3HnTyLd6TZsBqMTpdWAY8VaaKvwMTsOasy1PQmuW4Z8Mras2PjiQ+K9T&#xA;8u69pd++n6jp9xa3qNxNvJGyvX2FN69iOubMSB3BdSccgaIfQ3/ON35Tarp7XvmbzDaNbJe2zWdj&#xA;ZTgrI0UpBlldDRlBChVr1BJ8K4epyg7BztLhMdy8o/KBAvmq9CHlEtpIA3Y/vo6H7szXVZ+XxewY&#xA;HFdirsVdirsVRWlzejqdpNWnpTRvX/VcHIzFgtmI1MHze45qXqHEAggioOxBxV5F5j0ltB18emD9&#xA;X5rPan/JDV4/NSKZssU+OLz2oxeFk8uYTX8y7Vfr1nfJvHcwleQ7lDWv3OMr0p2Ib+0o+oS7wwzM&#xA;p1rz7z35giu7gaZayB47Zq3JU1/ejbjt/L+vCG6Ea3a0WONNOiKD7dWY+JrisuaOxYuxVG6RpN9q&#xA;+ow6fYx+pcTtRR2A7sx7ADc5GUhEWWePGZmg+kvL2i22iaNa6ZbmqW6UZ6ULud3Y/wCsxJzVTlxG&#xA;3osWMQiIhMMizdirsVdirsVdirxjzPEYvMWoqRSs7t/wZ5fxzaYj6Q81qhWSXvSvLGh2KvP/AMyb&#xA;e+0vVtH84aeKz6XNEZPAGKT1IiaduVVPzGAixTk6fJwl9T+WPMemeZNBstb0yT1LO9jEifzKejI3&#xA;gyNVT75qpRMTRehjISFhNMiydirCPzi88WvlHyLqF40oXULuN7TTIq0dp5VKhh7Rg8z8qdxluGHF&#xA;JqzZOCJL56/KDQpLXTLjVZlKvfEJAD19KOtW/wBkx/DNoXns0uj0HA0uxVhfnf8AMW30GRrCyjFx&#xA;qdAX5V9OIMKjlTcnvQYtsMd7liPlP8wrWTzKlz54lvr3RQjVtLCT0B6m3AskbQ8kHccge+/Qwyxk&#xA;Y+nm5mCOMS9Q2Zn58/M/8qLrQZLLynpeoRa04C2d8sktuImr9okSu0h7cSu/jmPix5RK5HZyc08J&#xA;jQG6f+Wv0mmh2B1FmOoCJDOX+1y6/F/lDvmW6eR32fRead6pjXnT8xfKfk/T5rrV76JZ405R6ejo&#xA;bqUn7ISKvLfxOw7nJwxmR2YTyCIsvnrzN/zk1NrkqQny9FDZRuGjczs9wo6NRgqpv4cfp75n4sHB&#xA;1dXqcwyiqZRL+enkDWPJMcF5dTWmq6cyCG3lhdmmUDj8LRiRPsnfkw3GRjjMZ2ORRMieERJ9UXm/&#xA;mb83YpLRrbQopEmkBVruYBeAO37tQTv7np4Zk04UcXe8xEkgcuGPMmpaprU++FvT/wAv+cLvTW9K&#xA;55XFoxqVJ+NT4qT1+RxYShb0fRmutZQNplhfXVdyIrS4enzKIy/jkDOI5lA08zyDMtG/KrznqLK0&#xA;tmNOgYBhLduqkiu9I0MkgPsyjKZamI83IhoMh57PYfKXkvSPLVp6dqvq3cgAuLxx8bnwH8q16KPx&#xA;zCyZTM7uzw4I4xsn+Vt7sVdirsVdirsVdiryv8xLMweYnlp8N1Gkg+YHA/8AEM2GmlcXQ9oQrJfe&#xA;xjMhwXYqpXdrb3dtLa3MYlgmUpLG3QqeoxSDTFPL+p+evytv55tBjOs+V7h/UudMcksniy8alG47&#xA;c1BB/aGwyvJiE/e7DT6wx2enaP8A85QflreRJ+kDd6VPsJY5oGlVT3o0PqEgf6oPtmGdLIcnZDVw&#xA;Pkg9f/5yn8k21uV0K0u9WvmFIkKehFU/zM1X6+CZKOll1RLVwHLd5bc6b5y/MTXl17zm7W1kn+8u&#xA;nKCgWMmvpxoTWNdviZviP4jMhARFB1WfUmRZ9FFHFGkUShI41CoiigVQKAADsMk4S7FXYq8785/l&#xA;fc6rqU+qaddIs09GktpgQvJVC/C61606EfThtuhloUXnOs+Vdf0bfULN4o60Ewo8ZJ6fGtV+jFuE&#xA;geT0T8t/IH1VY9a1WP8A0o0eyt2/3WD0kYfzeA7fPolqyZOgejYGh73mneseGaz/ANCr/pa8/Sf1&#xA;f9I+s/1uv6Qr6tfjrw+Hr4ZlR8WtnGl4V71aEj/6FH5rx+q1qKcv0jSvvy2p88P75j+58k60n/oV&#xA;36yPqv6E9Wop9arwr2/3p+DInxfNkPB/ooDzP/0Kl9df9Jfo/wBfl8f6O+t8K/8ARh8GGPjdGOTw&#xA;etfj3InRP+hV/VT6n+iOVRT676nGte/1z4fvwHxfNkPB/ovRfL//ACrX1U/w9+hvV/3X+j/qvLt9&#xA;n0d/DKZcXW2+NdGS5Bk7FXYq7FXYq7FXYq7FXYq7FWP+af8ACXO2/T1OdH+r/wB9Wm3L+6+jrl2L&#xA;j/hcTVeDt4n6f0JF/wAgq/z+uZd++/FOJ/gn44nf8gq/z+uY/vvxS/4J+OJ3/IKv8/rmP778Uv8A&#xA;gn44nf8AIKv8/rmP778Uv+CfjiSfVf8AoXv1T+lv0f6u3L636vL2r6m+P778UzH5bpf+yX6T/wAq&#xA;B5f7iPqPKn/Hp61af888f334pB/Ldf8AfJr/AMgq/wA/rmP778Ux/wAE/HE7/kFX+f1zH99+KX/B&#xA;PxxO/wCQVf5/XMf334pf8E/HE7/kFX+f1zH99+KX/BPxxO/5BV/n9cx/ffil/wAE/HElfmb/AJUd&#xA;+g7n9Of8cv4PrH/HQ/34vD+6+P7dOmP778Uyj+Vvb/fJkn/KqeC0rSgpy+u1+mu/34/vvxTH/BPx&#xA;xL0/5VZzXj9qo4/719fpx/ffikj8p+OJ/9k=</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+         <xmpMM:InstanceID>uuid:3f9dfa49-13c5-43ef-b449-19dceef32d35</xmpMM:InstanceID>
+         <xmpMM:DocumentID>xmp.did:A52CEDF16CBCE011BC36B4B7420BD8A9</xmpMM:DocumentID>
+         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:29e17876-faee-8948-9286-1741a44a591b</stRef:instanceID>
+            <stRef:documentID>xmp.did:F77F11740720681188C6A5613A2C864B</stRef:documentID>
+            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:A52CEDF16CBCE011BC36B4B7420BD8A9</stEvt:instanceID>
+                  <stEvt:when>2011-08-01T20:34:52+02:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+         <illustrator:Type>Document</illustrator:Type>
+         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>210.001652</stDim:w>
+            <stDim:h>296.999959</stDim:h>
+            <stDim:unit>Millimeters</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>White</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Black</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Red</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Green</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>14.999998</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000004</xmpG:yellow>
+                           <xmpG:black>10.000002</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000004</xmpG:magenta>
+                           <xmpG:yellow>84.999996</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>80.000001</xmpG:magenta>
+                           <xmpG:yellow>94.999999</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>35.000002</xmpG:magenta>
+                           <xmpG:yellow>84.999996</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>5.000001</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000004</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>19.999999</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>84.999996</xmpG:cyan>
+                           <xmpG:magenta>10.000002</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>10.000002</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>90.000004</xmpG:cyan>
+                           <xmpG:magenta>30.000001</xmpG:magenta>
+                           <xmpG:yellow>94.999999</xmpG:yellow>
+                           <xmpG:black>30.000001</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>75.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>80.000001</xmpG:cyan>
+                           <xmpG:magenta>10.000002</xmpG:magenta>
+                           <xmpG:yellow>44.999999</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>69.999999</xmpG:cyan>
+                           <xmpG:magenta>14.999998</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>84.999996</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>94.999999</xmpG:magenta>
+                           <xmpG:yellow>5.000001</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>25.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>35.000002</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>35.000002</xmpG:yellow>
+                           <xmpG:black>10.000002</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>10.000002</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>50.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>94.999999</xmpG:magenta>
+                           <xmpG:yellow>19.999999</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>25.000000</xmpG:cyan>
+                           <xmpG:magenta>25.000000</xmpG:magenta>
+                           <xmpG:yellow>39.999998</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>39.999998</xmpG:cyan>
+                           <xmpG:magenta>44.999999</xmpG:magenta>
+                           <xmpG:yellow>50.000000</xmpG:yellow>
+                           <xmpG:black>5.000001</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>60.000002</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>55.000001</xmpG:cyan>
+                           <xmpG:magenta>60.000002</xmpG:magenta>
+                           <xmpG:yellow>64.999998</xmpG:yellow>
+                           <xmpG:black>39.999998</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>25.000000</xmpG:cyan>
+                           <xmpG:magenta>39.999998</xmpG:magenta>
+                           <xmpG:yellow>64.999998</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>30.000001</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>75.000000</xmpG:yellow>
+                           <xmpG:black>10.000002</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>35.000002</xmpG:cyan>
+                           <xmpG:magenta>60.000002</xmpG:magenta>
+                           <xmpG:yellow>80.000001</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>39.999998</xmpG:cyan>
+                           <xmpG:magenta>64.999998</xmpG:magenta>
+                           <xmpG:yellow>90.000004</xmpG:yellow>
+                           <xmpG:black>35.000002</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>39.999998</xmpG:cyan>
+                           <xmpG:magenta>69.999999</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>50.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>69.999999</xmpG:magenta>
+                           <xmpG:yellow>80.000001</xmpG:yellow>
+                           <xmpG:black>69.999999</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Grays</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>89.999402</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>79.998797</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>69.999701</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>59.999102</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>50.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>39.999402</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>29.998803</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>19.999701</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>9.999102</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>4.998803</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Brights</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>75.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000002</xmpG:magenta>
+                           <xmpG:yellow>94.999999</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>84.999996</xmpG:cyan>
+                           <xmpG:magenta>10.000002</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000004</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>60.000002</xmpG:cyan>
+                           <xmpG:magenta>90.000004</xmpG:magenta>
+                           <xmpG:yellow>0.003099</xmpG:yellow>
+                           <xmpG:black>0.003099</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+      </rdf:Description>
+      <rdf:Description rdf:about=""
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <pdf:Producer>Adobe PDF library 9.90</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\r
+endstream\rendobj\r3 0 obj\r<</Count 1/Kids[7 0 R]/Type/Pages>>\rendobj\r7 0 obj\r<</ArtBox[82.7622 289.593 492.274 612.439]/BleedBox[0.0 0.0 595.28 841.89]/Contents 8 0 R/LastModified(D:20110801203456+02'00')/MediaBox[0.0 0.0 595.28 841.89]/Parent 3 0 R/PieceInfo<</Illustrator 9 0 R>>/Resources<</ColorSpace<</CS0 10 0 R>>/ExtGState<</GS0 11 0 R>>/Properties<</MC0 5 0 R>>>>/Thumb 12 0 R/TrimBox[0.0 0.0 595.28 841.89]/Type/Page>>\rendobj\r8 0 obj\r<</Filter/FlateDecode/Length 2930>>stream\r
+H\89\94\97Í\8e\1c¹\11\84ïõ\14|\81.\91Éÿ«eÀ'Ã0|ð\ 3\flïA»ÀZÀ\0z{\7f\91dwW[\12´Â\0ÓÍ®"\99?\91\91\91\1fþö1|øëÇ\18þôç\8fáøý\88a\94t\8e\19꬧\8dpÛËÿþëøgøíøðñ\1f1¼}\ eñ\9c³ó¿ë_á½xæVBøüÆ;\7fá\9dÿ|>~\ f)DþRH±\9e\14\8c\8d\1cÞ~=ôè×\83í\87\94C*g\8b%\94³6\vï\87åÓÌX¦\19\8a\fi\9c\96{(õ\1c±\86ÔÏ\19gx;Ê8{2­ë\bc\9e\15³R:{«aÚYS
+ãÌ\95[\ fî/EgÎ\92Â,ç(ÓMÏ¡ð1-Ü*«Á\9b¹\9e\95ÓX\8fÞ\82\röÍpË\9c\97ÃÚÙ±àVN\
+\96Î\9c\9bV\95\93Þ\8f[Ng+=ÜúiØ\15Ï\88í·t\96\<"oÇ¿\8f¿\1f\91\v\14>Ìã\1f!\á»\84MÇôAxz?sïå\196\1càÈ|\ e\9eê\12\8e×q\95Ë'×LÙ¢\f¥eÁÍ?9Q\ fs¸ap\9cò\92\16~àõQ\ 2\rG¸¸´p\7f\98\89\9eÇù¾½´ÓZ\ fû¦jX/cræ¦ÒÉ\97ñòÍ@\87BÄcb$»¿l¿¿\8f\9d«óv\9ab\;àÑõwßçiUá,g\ 4Iä¹\18F\ 2\8d6\ 5\9b¤ÔÈ¥yÎ<\ 4ª\9að¡\9d©c\0Ö\r\9døûéP\ 6ã¸üð˶q¸y\9e \ 1\82\fñý+\eË\99\8bå\90\89\8cE uI\90\1fÛÏ\91\1c¨\9d\92B\82\89y\82_¬0®!u,s$¬)\9f\89è\13]9v#ꦨ7vÕ\90\1d[J\85îãMsTê\95½"?¬s½¯¯\11ÿ\11Òf;§'±NÞ²K\81âB¬Ô\16uDz³\aÙ¨Fî%Öù\8c\94\13\93ênÔo
+\19¯b×\8fcÙز\8cÃtK¬ë9û\f&C\148²×\83\bqjÅ\8bOáVj\87\80\11\1c\9c\85íZ\f¥Ãª@Ʋ&¯ÒÖMw9س\17\98i\ 1Å\ 1I"\85f.\19s¼D§+Z\84Ná±é\ 5\9b¾\ 6$,3;eQ \86&¾zÄ\88{'þ«\12*&\1aÀ+¾\82ôB\19«\ 4Û<£3KS\98\94_"Ósè«\bn)F\87A\93£\1c\9604\11G\aÀ\8c\ e\1f8)p¬à\9d\92P\16%±Vò=x\136ìë\17
+\rkcÖ\12\88Gà§Øκ×Mç\93·²*J¿xzWIq@\82u\0w\16ù%\8e\1aàëíÀÄm\8fA@*=â\82ÅüN®¡G\ 2á>)\15Xg¢]-á\ 2J\9d¬YNëq3\99ÀÍ5ê
+%\8bì\98R¿6\b|T\ 4¹¿M<s|$|è
+!°e?EÜ8\16\8e®íB°ÏÜÑ\ 5¨Ã\12*\16ö\82÷Ox\13Mp\r\0\eÁT}\16o6àøýPyõÐ\ 4\r\87ª°A\aIê p/¡\9aÊ¥ÐMV&Á\9d\9cCLk\849é:XdU\ 5-\92èS\9d\f_\17!\82\87IU\92-#6e:¼y\96§×CvÌ:\17\10\0Ný©\82\9e¢\12BL^é\1cùJ\9e\8a2Vg\ f².»\91\9d®^ѼGÜè®\ 6\9aß\ eYϺ«­\rJ\7fÉ\ 1\87\0¼ç\98\12fëBD\9c¢0ѱ2\91¦Ò\ f\a\ fóº.«\12\17Ò¼ïD\13\b\157A.\83Y!¢\ eÐ=\14\0S§I\ 4\7fF] :w\92lpNÇ3ÒQÖRú\80û\8bö7©\15uzmt\8bªî$\17rV6D0\87\89\ 1¦:\8d!+Ô­À\ 3ÃÝ/JasGoä'ÂäTe\86%Ô(\8bg\91l\8aì\94\83\91(u©\93\19\86³|\91\90й\1dCUDb3\8f6±3·ÇKD$PE\87­
+Ù¬#÷PRÉ»©Ã\8böQ^\95Ã\1fë P÷\80Ô\8b¤\´Kw\8aÔ\12á\90ûPYwR\8c['\?ÕÅ \9fWæ~BË\93\81÷ý{)Ëîß÷\93½Ñ÷åÇþ½|;öÍ{\1d÷®\8b\8faý}åT\16'\r\9câ¶\96ê\8b\8cpÝ(\9aE\91Ûô×O9¥Æ{y\ 3[\87\83aíß˸ý×w=©á¾Ñ÷\8dÇþ½äíuó^ǽëç\13Ç-\96ä#0\18ýÕGÎ\16®á(\15H\ 3Lu}´û
+;¨;µÅý\14\16m.\82ÖÖ½t÷ö÷ýdm{9óqäºp-ãÞð-®\85g)PJµ\fxÅDïOQÔ¨\9dvÎGÞ%;¥\98mu\1e\8a\0És\82eÒÚIêºÈ\9eDçÿ$òo\vº2\88ò\9cîyqÊf+\85\88\1eð¼P=^D±doð*?ÎöT­ãQå£\96\vµ^\1ciR;°oé\83|pì5\rÕ\85ä'\9dSH¡ê\18·\PNa\88N3Aç'abx÷\1c´¸¦\1fHj©\ f\11~SKâ1c\8bU\1f\1e¼Ý¨`f\95Hd
+ÊKÅÀÊ_À\90uo¶\bÖ¤px°njú¨+ºYQhz÷°º\10Ô\f\83P^ïA\94Ã#Óª\aÃ9Jg5\8d\10\8a(\fÞ5\15U\9aiòÆ\v`¥m½í\94\9d\97oG¬Ib¤Õg[¿0\ e\ex\13u\85\89J¤Ìedkj;^gÄF_¥à\877\1cúlÌ«\19é-I!\13!\ e\19\8b8{\87\8cd\81\86©v\98¼¥&×]\89`ëU\8c¹¿\ 3\12º\16ªà¸è\a\10¼\94i\8c®\ 2£ê4ꪯjT-:\92\88\1a\95ð«bæ0\ 1\82\98\865\93á\837;áÖ«pxËä\r×\89T\85ä~^"\8aî°0«±U;£"¯±´\8b§\89ÌJbS\8aüXÎ3s\17ʪÓÚ=Á\9asd\8b|ýN©v\9f\9aáóË\15á¨~7Ùe\18Gª¹¢\1a\96¡Ù\v§w[¦5×\93à=9\85zCA2f_i§ÔÝ&ýºXO¥X=\97iu:¼È\9e¹¾BÓ»ìvv\96-JÄxé\81ßë\ f\18K2\reFÉ^\11\98Öè\80\rÉ\v\14×»\8f\89è\ 2\9c¤í\8bºm3c&/H\16©pÑ\9f>\0\92@±È\93Ò\97¬\ 5Ú\ 4DÚ_V¶Ò_ ô\ 3¥\86(áäÙ<\aÌvö¢ÕðD³cÕ\18ëb\8chE\9f¼ ¤êmXè×\1c\8a\10¿ùgÑ\948ô²\94fqy\8dxkBÕô$ásìj\ f&Üß\1f¢\84jNkRóí¨æ\92}\8eò«\12H·¦\16Ð4-Ð\7f­Ï\ 5\80*>C\1aÚì/*õ\8f\12õ\1e\95ª~1\85\88G\0¸¹¸d\92\1aªkì$Þè\1a\81ë]Ó_\16¼ª\87PãßT\14:$£)\84\98å"\89ERz_Ì[\94ÄÇ\ f¿üÌ\0\98¹?u\1aX\86æLró\89-×"¡V×½ÄC2°úHCª¤¶¡#z\%\9c\ 4½JBL\8dc9\fM\1e0"ÁÖà£ÙFt­\178Md\16ɹ(»+ðE³\8cä$BÙ|òØaO\1aûÀ3½*s\ eÊ¡s,\ fÕ\96ª´­8\87Í\91äååë\1f\9f' :\1e\ 6Jë$\97\97$-®\8aêEJ!' ­C*vÉrjr \83Ò\10zMÖ4\1flåDRÕ\13\84*f1Õx\92äòy\94J\16¿[m\8b\13²T\ 5\83ͪæ\9a\13\10~V_\15)\b9\83\949±Á^\1a; ëÎv\,&\ 3d.)ü³>ÖÂ=\99\90\9d÷7\1aTÒëó\84½vªØßï\8föÖÿ;ûyô¾|ÿ\10ïû~H\7fp\97f¹é`\1d]õyu­ø 'í0EÙ\ 4º\8f¶?\9fkî/\8aýó\ 5X±öçþµt¿ÖW\7f VæÛ|W\7f\1c»\97òjÝ»\7f\88÷m?\9b?ð-ѧð\0(ͬW'%/§\9a\8b\ 6*×·>©ÚîZk-c\18àÒó\ 5 @ë¹ï^«5\0ø×ýûÚä{Úãн\­\90K÷:îMßê¼ô\rH\13Y\98#\"]{a}Ó\0HæùØÀ\80¶©ü÷£\883$\92<Åâ uú\ 1Ç\7f9Hx+Ë¡,\99\89¼\84¨\1cÇ\8d\8b4Q¶é\8f;×AK*Õä\8dOÅÉX%\1d\ 2ñ£¹n\9c«ò$\12\92õß\12~¥!n\8d\81À©±${\11~¥¸¦\93@WG\11C»êz?P5É\9bX3©GQ\8f\ f\96]\vo*\10Ãtª \96\9aéÐ\95\13gàÖ*A×A\87P\ 5{,­+¡\98«_$èyÓ¤\1dð=íïë-IZ©åäý[c+êfÎ\17,þP\ 4æ\89\8aìhº¬tæ«ÚHN¿\12c2×\9böÿ(/c$\84B\18\88ö\9eÂ#\10\12øP;\96\1eÈÛ\9b·ñ;\166V\f\ 5\ 3\84°û\96p\b\13\ 1ÛBtJ\9bØ3\15¼|è¶\1d\14Ìbò=3Ú\98`oï\12\ 5\ e-àCá\99\ 2\11+§ð       pV#f\fCæKG\ fç²c¯ßÍx¤¸ã\94\9e]g\98È\17\ 6Z\81ß\12\8c¦É0@\ 1\9cu\8a\ 6\87²\81\ 2  A\ 6\1c\95T,SÂ\98"È8ÓVk§ÀµP\9f¹ô\88*ʶ¹Iöi§\9eU Á;®z(Ã9sÑþ[4b¢:ý\97\83\ 1pF\81b\8bU;4\96\86îLPíP"«\8f\90[EA¸«5º¸ûyyOÛ\87\8fÛ5\87\97\0\ 3\0WÆ<#\r
+endstream\rendobj\r12 0 obj\r<</BitsPerComponent 8/ColorSpace 13 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 105/Length 679/Width 74>>stream\r
+8;Z]!4-mc<#XqBgbZ%I$`CQ70UZG2bD.`isr'QVTG6:%!30AicDB:bt>?G!0=BJ[-
+kRk7i$@1fA.^Zmbah-pd9r-tn9o^X4pdQR,j<;35Lab?;q,MgeWfg0cn<r]?Y$#Q2
++n@A&k)#s'AL,<MR,hFLoVADG:_?X[<glQP/G[,ElL;l7Zn89XU^76j>bSOkJjb<A
+1;].&<[fUXq$7iLd)U'*DqcZl]7:1W91YGbR\in1Kt&V_3?b6)hC(Bh\Y+8*njbKK
+VaR)d/62X:RZu>lM*"YdI#.3gUf?WDUba*S.Yk=\.Bt4ip1@0%81@3&dM<B9PL>aX
+V9Ok[QC8#BG"t@:oP9JU$7Dt-bDbm8+!;@t8nSa0m^J@c6@D$HD9)6iT3mbF9&39*
+(#sQ`KGY5KPFQQoOn)R\Km5i%Q$*M"b,J4Kk<r7D^qMgl\.FgVacg_B^s4s'.%_`3
+f\_,2O2ekLU%%R%4_IB]iQIEmd\$3XJWkRFl*+)0qHOBhN"8%ih,O;O3pa*<kbSjK
+04nHQ(Gg86p!``I<[c?%PKGSKA*k5srpKXT(FlL81Fn]6prtT6,ahN=VuQSM!n'*'
+&0"Y:cSN^L.(-TcIrpcnQqgDN5kcXuh#8Op:9%/XT&rC7`O2@UqqcJTX5WIt/1`>'
+/1`>'rd"DN!*0i#D?~>\r
+endstream\rendobj\r13 0 obj\r[/Indexed/DeviceRGB 255 14 0 R]\rendobj\r14 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>\r
+endstream\rendobj\r5 0 obj\r<</Intent 15 0 R/Name(Layer 1)/Type/OCG/Usage 16 0 R>>\rendobj\r15 0 obj\r[/View/Design]\rendobj\r16 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 15.1)/Subtype/Artwork>>>>\rendobj\r11 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r10 0 obj\r[/ICCBased 17 0 R]\rendobj\r17 0 obj\r<</Filter/FlateDecode/Length 389757/N 4>>stream\r
+H\89\94\94uTÔK\eÇ\7ftK\88\94\88KJI,\8d\82t(Ý\8b\b\ 2»4ì\ 2KÇÒÝ%Ò¹´H\974J#\82Ò\92\12\82(H
+\bw¹÷þqÏyïyßó~Ï3çùÌ\99gÎ<3óÌ\0\84\ 1\bY\ 59El
+\0@¸ ]äÕ!OÔÌ-@\ 4ã\0\ 1À\0à\ 1\\80\88¹¥+BVKK\rÀè:\16ø\ f\1dO\ 1X×~òþ¿\8fÿW\11Ca®\96\18\7f\81iHKL\12\0\80\85À0\8f\a\12qÍY\18¦\96\ 5Ë        `ø5\0\14àc\18ü\ f\16\ 4\80Âæk\96\ 3Ë
+\0X\8a]\0¶x=\86\ 5\ 1\1c\7fäß\f\ 6ð\9a8¯ÙÚÜ\11      \10üX\0\80\84Ŀ׽\16\83>\9f.\1fÈ\10f\ 1\92\87\9b#aP\10§®¡¦\16\17È\1dü\7f\7f                óD^{y8ÂËÅÖÚ\ 6    \ 2\v\b\b\80d¡p\v\18H×Ë\15  stå\ 5©:Yò\ 1\80\11Ä\18ô׬\ 6c\0xc\r\0I\ 2\8eVÈ?SÂÅ!\ 2þ:ó\7fè_ú\18ÃÆ\18\eî\1d¼9\ 2[ÂYbQ\92PÒ~²+rA
+SÊhª¦\9b«·HhÀ´\86t^ôé\f\r·'\18\7f0±ß\85\80Â\99kYæX¯ØY9\14îYq\86q\95p÷ólÝ'äãäW\11°\15\8c\ 4£\85z\84\17EÎÅèÄE$´%\1d\1fD>,\96ê\91^|t*K)Ç%/§`¢è¦\14¯\¦Ò«úùñ\89\1a\95\86¼&D\v®\1d¦\93¥[«7¨¿dplD\ 6a5\96|ªmbõÌÓ4Ê,óy\95y\87Å{Ëeè¾\15¶5\95\r«­\90\9d\9c½\8e\83©£µ\93\e\11ì\1cã\92â\9a\85,t+w¯ñhòl÷êõ\1eð\19õ\1dó\eõ\1fA\r\a\f\ 6ö\a½\rî  é\fm\vk
\8bx\15Y\16U\14\9d\13\93\1e\9b\18\17\16ï\93\80H\84&\19%«¥È¤
+¥q¼ O'M¿zù3ãKæTÖ@v[NUnn^\¾o\81]¡a\91\10\1aTr£ä¢t»lºümE]e~Uü+¿jû×\90\1aåZÑ:¶zª\ 6 a·q®i ¹¡¥°5¡Íÿ\8d};¤C¹S¤\8b¥\9b¢û²ç[ï\_ÿÛ\86w\85ý\89\ 3þ\83\ eC\90a\85\11¾Qº1¬±\9d÷\9fÆ;>\94L$Lz}4ÿ¤:%8M7\ 3ÌlÌ\8eÎÕΧ/ø}¶XT^â]¦X>\\99Ym[Ëùâ³n¸!´ycsk«ûkƶó\8eÊ·;ßöv{¿§ýpßÓß\17úIþsû ÷0ëÈõXõ\84éäàôݯÔ3ós®ó\9d\8b\92ß&\97$\97õWÆWW\98*ØÂ)ÁãÅ\ f!è$Ü$Æ%¡!e$cºÁHNOAKIMEq\93\84\1a\97úâÖ\ 1Í\ 6í\fÝ\bý\14Ãâí\15Æ\95;KLów§@\1f\98\87YúX;Ø\9aÙë8^Ý+çDs\15pçñäðfßÏàKåO\14\88ÅTC\98P°p \bJ\14%\86\12\ f\90\b\92D=ð\7fè+å+íûÈO\ 6%\e$\17*\1f©\10«\98¤\94®\9c¡\92©\9aý8÷I¡\1aZ½\£Z³^«U»K§_wLï\93þ´Á¬á¼Ñ"dÙxíé¦Éö³]Ó}³£ç§æ\17\96\0\14\a\86\ 5»²º°>³9µ=²;°ßsøî¸ã´\ 5_G¬8/ºÌ¹N!GÝzÝ[<ª=\8b½2½\13|B}½ýàþP\94Q\80z l\90H0W\bc(EèeØnø|ÄPds\14::5&8Ö9îy¼F\82T"oÒídâä³\94¯©³i\83/ZÓK^&g\ 4d:f\19g«ä\88æ²çQçãæ\1f\15l\14Î\14\r\15·£kJÐ¥\99e\89åá\15¨J\8f*ø+ëêç¯\8dkôj5ëÔêU\e\94\1a\15\9b\14\9a\15[\94ZUÚ\1e¿Ñh×é0ì|ÖeÙm×ãÒëÓ\17ò6ê]B\7fÚ@ö`ñPÕpãHçèÀØÄû\85ñ\8d\ fû\13ç\1fñ?QM1MsÏ\88Í*ÌiÏ\9b\7föZ\f[JYÎZ)X-]«úR»Þ¸ÑºÙ¾ÕõµwûãÎú·£ï¸?¨ö@û¼?Å\ fä\ f5\8e Ç\96'v§N¿àg\ eçÐ\v\83ß
+\97üW´×÷\8f\8d\873\83g\83ÿ\8e\10\9f\bL¬C\ 2#u!ó¼áMîMáMéEåv\13AmsË\94F\87V\91N\8c\9e\8bAø¶\14£Ì\9dGL\92w\85A¼Ì¬,ô¬äl¸l¿Ø¿s¬Ý\9bá\1cáêænä©àͽ\9fÌ\17Îï+\80\10\84\82!Bê²"¢¢<bÌâ4\12$\92\80äñ\83Ý\87kRóÒ\93\8f\86eúdÛå\9aäk\15*\15ÑJùÊY*/TS\1e'<\89S\8bV\8fÒ\88Ô\8cÐ\8aÐ\8eÔ\89Ð\8dÐ\8bÐ\8f0\884\8c2\8a\86Ä\1aÇ?M4I~\96f\9a\8eù\17²Ís-ò,ó¡\85°"+´u\89M©m\99]¹}¹C\85c\85S\ 5¼\ 2Qæ\êRìZ\88ÌsËv\7fé\91ê\99è\15ã\1dî\13äëëçî\ f\ 6\98\a\1a\ai\a«\84H\87\8a\84ñ\843GÐF\92FaG\9dDïƬÆÎÄ\8dÆ÷&´$V'\15'g¥$¥F¦\ 5¼ðLG¼´Ë°Ì4Í\82dëçèäjåiæk\16h\15ê\14é\17CÐf%V¥Ne\9eåA\15q\95YU\15¯ÚªG^/Õ\1cÔ\11Õ\83\1aÄ\eµ\9b\1c\9aÃ[\8aZ{ÚVÚ±:\98;å»`Ýá=å½c}ûïnõK\f\98\ e\ 6\r¡\87\87FvÇ(Þ\83Çõ> 'R&k?¾ÿ´3\8d?Ã4+:§6o¾\80ü\1c¾\98¾T²\·Ò±Ú¿6úåÃúÄÆøæÈVß×ÖíÊ\9dÌoá»ðïF?Lö\9eî\eüT;\90:ä>¢::>\9e:©;\8dýeqÆ\7fvx^saõ\9bòwÝ¥úåÊ\95ó\9fï\7f\16'\16\8f\b_\8f\0E\98F\94O\D\92K\9aL\16t\ 3AnF¡F)FÅ|\93èæ\1eõÔ­6\9a\Ú`º@z?\ 6äm+Fý;²L¼wiA\0h\9by\92¥\9d\15Í\96ÀîÍ\ 1½§Á)ÁÅÎMÁý\9bg\9bwú~\1f_\r\7f\8e@\8c \17ØZH_XA\ 4,Ê"F)\8e%¾/±*9ù ïa\83\14Z:ýQ\94\8c\9f,\ÎB^_AUñ¡\92\80
+­*\89êÕã\83'[j\vêã\1ao5[´ª´óuR1uà­ïh`f¨m$\ f\111æxJgBdrölÇtÁläy»y¥E¦e$Ô\13fe¥g-g#`ËdGbwj¿î0áØáT\ eOC\ 49;¸\18¸Ê ¹Ü¨ÜÎÝ¿x\8cz6zåx\87ù8ù\1aøIû³£ÈP\87\ 1ó\81=A¥Á±!.¡\86a\ fÂA\11x\11Û\91\7f\0\ 3\bü÷Ï\8a³\8b\98\8c}\8db\8eG\8f-\90\12\90ø\91Þ\92Ä\93ª\94\91\95x\96`\97G\98/\99\18\9a\ 1\9aê\9bÔ\9c¿\9dª\9e\96\9f\83 q¡_¢O£?¤0¥"¦\15§\b§ý¨ó©êªâ«Û¬Õ­Ð®Ë¯Ç°Ä±Â²Á³Á´ÂµÅ¶È·Í¸Ó¹Ûºã»í¼ø¾\ 4¿\11À Á0Â@ÃRÄfÅzÆ\8fǦȾÉÖÊñÌ\fÍ*ÎGÏcÐ\80Ñ\9fÒ¿ÓàÕ\ 3Ö'×LØsÙ\9bÚÄÛïÝ\1aÞFßsà¡áÏã\ 2äMå\99æçè6é\86êØì+í\80î×ð1ñ\90òïôMõª÷\ 4øZù«úöü:ý{þ»ÿÿÿ\0\80\0\80\0å´\7fÍ\7fTÌ?\7f¥~ò\8c\7f\94~i\98\7f\7f\9e~L}ã\7fÁ~cbA\7fþ~\92Da\80\7f\7f\ 5\1fd\81þ\80\1cü¸~t\8b\ f~W\89²ÊÛ~O\88\14±>~\\86´\97/~\82\85\9b|\93\84º`é\7f\ f\83ôC\0\7f\96\83x\1d¢\80ä\83ßú£}%\97\bâH}\1c\941ÉX}%\91z¯Î}K\8f\1e\95Ö}\86\8d\r{N}×\8b<_´~7\89\89AË~À\88-\1c\ 4\7fÏ\88\11ø¿|\17¢°à\82|\17\9eÉDz|+\9b\14®E|[\97£\94s|«\94¦z\ e}\f\91æ^\95}w\8fO@¶}ÿ\8d-\1a\8c\8bÉ÷      {G®uÞÚ{D©zÆ\e{]¤Ä¬Ò{\96 f\93\10\9cZxÚ|[\98»]\88\95M?¹}R\92\8b\19<}Æ\8eðõ\85zªº]ÝYz\9f´Hħz³®\8b«|zð©=\91â{L¤Nw²{À\9fº\\8b|=\9b\8f>Ó|¼\98v\18\17\90Iô8z/ÆrÜ\rz\e¿;Ãbz'¸sªMzd²6\90ßzɬqvÒ{D§\10[®{À¢0>\f|;\9f\ f\17\1c|\a\8f ó\1dyÑÒÈÚñy´ÊaÂIy¸Â\8d©?yð»a\8fçzY´Îv\ 6zÝ®Æ[\ 6{^©\87=c{ФÓ\16I{R\8f\11ò*y\8cß\84ÙýyfÕÓÁUy`Ìî¨Vy\94Äâ\8f\13yþ½\92uKz\86·\aZi{\f±Ü<Ú{z©%\15\9e\8e\9díí\89\13~+Ö~\88\0}±¾Í\87\ 5}W¦µ\860}3\8e\1a\85\84}HtÐ\84ü}\8cZk\84\9b}è=\8e\84\9f~\8b\18\8b\86z\80\ 1ëÉ\87®\89\bÕ\0\86£\87\8d\85¹\86!¥~\84ø\85\ 3\8cÐ\84d\84*s}\83ô\83\88Y\ f\83¨\83\a<9\83¸\82à\16ù\85w\84\ 3éû\86p\93øÓS\85w\91\10\84\9c\8f\19¤\14\83õ\8d\13\8b\89\83u\8bVrU\83\17\89ÕWÿ\82Ø\88|;,\82ë\87\94\15\88\84{\87¨èR\85s\9eøѲ\84\83\9b\81º\7f\83²\98;¢¡\83\ e\95:\8a8\82 \92¡q)\82P\90CV÷\82\e\8e\1c:4\82.\8c\96\148\83\89\8aÉæÈ\84ªª\18Ð2\83»¥­¹\ 6\82ñ¡\82¡?\82U\9d¤\88î\81ã\9a\12p\v\81£\96çV\ 2\81u\93ÿ9S\81\86\92\f\13\15\82\9a\8cçåc\84\fµbÎÖ\83\1d°\ 3·µ\82Rªê \ 5\81¹¦.\87Õ\81N¡Æný\81     \9d¼U\1f\80ã\9a38\89\80ó\988\12\1f\81¼\8cAä/\83\8bÀÚͬ\82\9cº\82\92\81δz\9eô\816®ß\86è\80Ó©°n1\80\93¤íT\\80e Ø7Ý\80t\9eX\11T\81\ 3\8b·ã)\83\95̯\826Å;µ\98\81e¾C\9e\ 3\80Ê·Ë\86     \80i±Ýmw\80\8d\80\b¨V7M\80
+£\\10®\80l\8bGâN\82ÐØ»ËÚ\81æÐN´Ä\81\13Èa\9d5\80\14\85N\80\12ºzlÕ\7fß´ÍS<\7fº°H6Ñ\7f¼¥\10\10*\7fô\8aîÝ<\92a|\98Çk\90z|C±V\8e²|\10\9aÇ\8d\1a|\11\83\97\8b·|Ik\9e\8a\82|±Ru\89\88}26\8e\89'~\ 1\112\8bÖ\7fÞÛF\91-\86ËÆ\ 5\8fB\85\84°*\8d\83\84o\99²\8bü\83\90\82\83\8a­\82òj\8c\89\8d\82\88Q^\88£\82@5z\88I\82`\10\ 4\8a\98\83\86Ù³\90\0\91\9d\8e"\8eí®ý\8cc\8cß\98\80\8añ\8b&\81U\89³\89²ij\88¦\88|PJ\87Ë\87v4v\87y\87\ 5\ eú\89V\86»ØG\8f\b\9b\92Ã.\8d2\98\81\8b\86\95\97\97\1e\8a\13\92ý\80\17\88è\90¾hS\87æ\8e¼O[\87\13\8cÿ3\9d\86Â\8c\1d\ e\14\88(\89\84Öé\8e\15ÁÑ\8cx¢&¬$\8aÔ\9es\95Ò\89h\9b
+~æ\882\97êgK\87>\95-N}\86o\92Ì2Ù\86\1c\91Á\rN\87%\88ÿÕ§\8d±°ÇÀ\9b\8bâ¬\0ªö\8a>§w\94´\88Ö£A}â\87¤\9f\fX\86§\9bÚMµ\85Ý\98ù2,\85\8a\97ò\f¨\86K\88\8fÔ\90\8d3»¥¿\92\8b\ 5©ò\89°¦\93¾\88[«¤}
+\87\be\9e\866¢çM\f\85_\9f¯1\9d\85\v\9d?\f\1e\85\97\881Ó£\8cËÆǾ³\8b\ 3ÀI©\16\89\14\92ç\87ô´I|B\86̯\ 4\85ܪwL\87\85\ 5§e1$\84¢¡:\v®\85\ 4\87æÒà\8crÒW½û\8a°Êñ¨]\89\rÃá\921\87£½S{\9d\86z·|di\85\8b²ÇL\r\84½®g0·\84\ ð\vU\84\8e\87©Ìû\9bò{[¸\93\99G{!£ö\96¸{      \8eÞ\94`{&y\15\92E{xbi\90e{ùJr\8eÚ|\93/c\8e5}~
+~\90\1f\7fÀË:\9aâ\84ý·f\98#\83ç£\ 1\95\99\82ü\8dú\93M\82Kx+\91C\81Øa|\8fu\81\9aI~\8d÷\81\81.y\8dW\81ã  Ï\8e\9b\83\bÉÓ\99ß\8e­¶\1c\97%\8c¡å\94\98\8aø\8cá\92[\89\89w!\90^\88T`\83\8e\9e\87^H\98\8d*\86 -§\8c\8c\86\9d   5\8dG\85èȨ\98ç\98\8e´ã\96=\95Π§\93½\934\8b»\91r\90ív\ 3\8f\86\8eÿ_\7f\8dÒ\8dRG±\8cf\8bû,Þ\8bÌ\8bÍ\b¯\8c\1f\85ßÇ|\98\86³Æ\95\84\9eú\9f{\93\v\9b¬\8a\84\90Ò\98ªtì\8eÙ\95ô^\8f\8d1\93 Fî\8bÅ\91Ä,;\8b'\91¾\b<\8b!\85\91Æ_\97\9b¬¥²²\94õ¨Y\9el\92~¤J\89\84\90\8dt\ 1\8eS\9d#]¸\8c\9d\9a'FA\8b4\97÷+®\8a\94\97;\aÛ\8aL\85PÅf\97&¶ì±É\94\80±Þ\9d\89\92\b­\ e\88ª\8fÕ¨\9as@\8då¤\8f]\13\8c\13\8a´\9eÓ+:\8a\12\9bÈ\14Ö\87SS    \ 2\ 6𧠨\8c\aêjVPp,\10<\14X\15Q)\82XV\ 5l\80(Js\95&\ 2ÂJ\ 2!\8f\90\ 4ÒûK{é½@B\80ÐE\8a.\v\9ce\17°íÙWqQä\86\93³â½ý\ 3~3ßÌ7ßÌçF£HI^ý\¨¯§¬Á\8dïÓ¡\83\7få\18\9c+j&YÅöÉb\16\83dMLÅÑ\1e\18Å{#©©úè\8d÷)Fø£ÛA\8a;q²ï\19T0\8c±_à\r^¿\a£9Iݤ\9axÖº¶Æ¢YFh\93\85ÆhX\16;Jõ²Æl¬ äÀín+jÅÄ¡®(Ým,Ö¼J\9d\8d\8d\83î(Va÷V\7f\a\16\17ÈÄaØ\91\94@ÈQ~.æ8_]±È\7f\9a7]ñÕÕÌÃãõ\1d\8dÚgÕ|ÓFÕ)\ 2\f-\97/ªºMH\97\8a¼øP´\13\9c8\99\ 5oF\13x\9dàCÿ­<÷ªR×l®\vAÒ^«\99 ÷\1aQÊlÚ\1cÁzÙrJAU\9e\ 4U\e\90ÿ\1fá\99\1aÿd*ÿ\1dùüîNî$iÜ\8fÉ\r#\9fv\rb7\11FÚ*4Þ\82÷ú¯
+\r\ fËû\ 6§pv\80iâxÖ\96¼÷\90\8cÁIªão¥\87ì\9eËÝJÛ±á#ç
+í¾ËW\16\97àh\85Ô\89\8alý"ùkx\vwVj\16\93Dz\88\96ç*¸Çß\9cx\9f\8d\8a:Æ©d¿ÙPÀîæ$¹üÎ\14\13 \16\8djÀ4W·M\9e¨[ÎÝ,]¢Ê«$\88\96ÈWæî\10$I×&®åN\88¬\91}ì7¨\rsØþ\90»\8b\8d1@À9\87\8e.íEÙÓz\1fN¾Dfº\81\e\14*uwr þ\84úØ   \88\v*ª#\13Øùò\13ë­,¥hØ\85Ãð"ä8=\94³\9d\r\19¡%\83=(\89p¤â\ 2\85QuÃ9søLÓ\93\13(î&Ãâ\88wì¥Ú¾õ?±\82ER\17\f\9dAHi.RÚ~  Ô\84Ë6õ ØÑâ¿:Ò*tÐ\943*»\96¿Û±ôx#ç\89m?r\e~3\19×û2ÿ+Êwù\89¾\9ap¸ÞÇ6\8by\ 1\aX\1ea\9cTOÃ#\8cã
+U\8b¼<·_)Â\1eIø(»\8c}¹ÓW2SÎX\13 \11U\14\ 1\80àwü õ¦\r\96f\9b_T\89)\95ú\aà\93\9f?k\96\81YYF\85\14ôK8\ eãÁu;J$óÀþ*1T\85\ 2\0>\13\ 4,\8fë#h\9b%TÓ,\85QÛ¥{[ëõs\88:\98ü9ó\85¼\93¼&^!Õ\93\98a£â@Ò!ßÍ"\vy\1f\0ð
+\11µ´.\97÷Jl6mçHj\86uÁ,bé\11U6£+s©ì\výhܸd\9c\16\16\16-Ê¥ª}\ 6\85wi\8d\0À-\ 3\ 1s´u\10n\12=0\8aĽäi-_\88*)UÞâ_Ë\88\93\1dâÚãb$\11\1côöna+;ϧTø\1d;\ 3pçpA7\13Û\1a¨\e\16\ 5\19¾¨CÈ\a4\1fåÏ.\ f*·Iߥ\9ba\878õ°MÌ\12æm\8f\13.\82þôACiü\93\80\1f\j|fi³¹\bÕ\ 6\9c¹\95Ô«)Ö÷]Þ­°jö¤\aÀ¡Ê\84ÃÑâUò]¡3\10(í\9e\16\fðw\ 3höJÐÛ\18cÉh-\11®4x7\96\93öh\16׿*\1eP\1c0¿Hë\90\8e\19L\87\9e\8a®ë\9e\87Ú¡uê\89ÕÃ\82\ 4¾\1f°\85Å\ 2×\1aÚ,Ë{ÏBz}\7f§\858¦v¶\14\15gÊg\1c\9fÒ²¤d[û!XTZç\eZ.ø·vlµA°\90¿\18\b\ 1Ñ
+{;\11\1cm¶`vâîØ¿`~È?g¥a.\9c
+3\9eÃ\8cì{§­Çæ\86L¨^\96»¡¦ÔÅåW\ 1\80\83\ 6\ 1¹¾ÍY¥eÆ4õ\82]¸Lû<pqÞ´\85\8e\97§´\1aÎá\8b÷åkêñÕ!ùÊGø\1e\94\vl\a\0v\ 1\bÈþ×:D\19eH\1a\1fÕþXqËæE\9eÌK4kHoS|ôXÒÖ½OÕ7\88ÃÁ\9f\14o\88ý¨*å*²+\0°\86\10\95Ý2Íõ¤\7fhô`½ªðª?Æø\9ck6ݤg\9dÄé,´M{ST3Ôä`\81b\195\10\95ªXEµ#*\12\ 4àÑ\96}\92\1cz¦#C¨//¯Ó\v¶æÎ7­ç}\9füV;Å9\13ûT\15ÅÞ\16\1c)?ÆÞ\88\8a\94\872[\ 1\80Ù\8f¨]Înõ$í~Ã\1d\ 5\17û©Î\ 3fåÐ\8c\87d\8cö\94p,\16§äB\85A\1fdrH\8bò\97]`\19\11u\16\ 4¤\ 3ÎP\8b\92\10kÐaEV\82vYN\90ÑU5/y\83fD.\8cÝ¡\ û1¨\1f\9e\82ýQËa#K\8a¨E\88:Ø|·\89N[k\1f±=Ä&[],\96ì×\ 6\8c1$é±æ\90ξç\8b\95\aÁ0Y\19\82(Ôß\8aq\1d\ 4\9bÉ]\13Ô!{Ik5ö\1f\16U£3Ûjð¶=Or¨ßÕ)÷<V\84\99\rA\1c8H\19\80ò\95:YjD!ûâL_ÏÂ|Oðíþ­l¨xE{EY[\86¦9§ì¯#Ev\ 3æx¤»õ2æE\80Þ\ 4as=Î[RÊÝ\11µ\aQÛûiàË*çÕiü\87¢Þ66þ`ÆÁ¦\8b\95Ï\8e,¶É+û#ê,i\95\7f\ 6\9c1\9eÇÿàA2õ\81±\0@\9f\ 5\ 1ö¿ú¸µÆªýW\17Ôø\17\9dm\95\93þH\7fØXJ\9cNPÕ+\88)\11Ç̧\88+\ 3Ö\19\ e\12ã=lÆ\ 4â$¢z\10UÕkbç\81ã]ë\98i\85¯[:é\82ô<\a\99æ\97°³ÎAÝ\10\ 1\98r)<ô\8cþ\0å¹Ç\ 3\83+e.¢è\88
\19\17%\80üÎÓ\82æB®s\8aW\92îÞÐÁ\11Ä\8f[ÇØ~á}F.+\a}W\97ÅöötÕ=¥\8e 
\8bõKÏ\11e&\18ÓÑ,Û^\18çÜ-¹\9cv«a¡(0¾Þê\a\15\85\v\f·\ 5\ e\16\12tzþSû\9cúwÂ0D\9d¿6jäã¿tlÔÞ.\ÑlVÕ¤©í\97ä\8fã)\16\9eÌ-\1cgØ   [Ñ­\9a'\92\ 2Ïxí|Ú|D­D\94ßµ£ö÷øáv\95\95wi¦Ù×8\94Æ°=×Ý\8b¿bY¨õ
+¿¤ïT\7fC7j\8eKI\9eù\9aX\9a7\0о\81\0s¤{ªíW|}û¦&饷MRû¦´\1aÛQë§ørs¡%5\1cÔ¯1¼Gÿ¡\1e\90*=íêVÚ\ 1DM\80\0±é¶¢lºôî`JYõùúþKe§\93\97\\1d+Ãíklã\95=ØæÖ¼\0srÍ\8cã
+æÿ\14Ïù_L\8b\ 2\0ð\¤EÜ\8bʮܤH)¥B\96\87¡"\85\16\95)J¥Û\99õ\9c3g\9fµYªi&M{&MÍ´I\8b\16¦B+!%÷ñ,O\84\9bå=Y>7oÞ\1fðýák\98õ¦ö!w·\99\99ð«Iý~»\0I\ 2r»a^\1c=¥C\ 2ë#\ 6Z\1fÀ»hç\eÓ`Wï\87u}p¨Ãçê)¸À"®z\9c7ff&²3© \ 1\92ß\ 5\ 2©\1dô\9dF\92ø\16\91ÓÒJ8Ò¶5\ 4ãùÞmµ
+\1cu´®Râ_,^V¹àS&åaR´~Pf\aÄÜLL_Dw¸\9e*\8e\8b`\Í\15-¦9]q\11îõ®¯¡\v¦\1cÝ\f\81Â\17\96Çô¹T¸Ií6)ÿ>u6        DÝ`eÍ¢/»\96¢x\1fq¶Y%\ f¤9ÖÛÊ\9c¼;«Ã¥O\1c\8fê\1dd\˾Ê\7fP\85&\15eRËzïç;\ 2¡]¥¹\8bé.íRµ<\ 2oªÊΡù]öP\ 6{?¯:¦\fr̨\\98µÝÊ»b       õÒ¤â\113|ª×íâm ¨s¢Ø\9fîÛÖW°9¢¨ñµæoZt]Rn\93Ï\1cÃ\85\½c\7f\85Wö#+\85n\ 5\7f\95I\ 1&õgÏ\ 5½\16ØÝy¸\9cA\ fjsÑN\8b06\ 6\94HiD­±¸È'@ÿ¥ðõJ+\1d¦\9aa5V~\80\1fcR\88IµõÌ«ï\ 2vwtU\8fÓc[3+?F|l(ÑÑiÆÚU\97\9eø\bô\11¥^+O\97?Rí°Þs©\9aÿÿ\97\01ûHqilÑè$Wþhü\9bû\99\83À(ÎRE
+ØÁ\111¯B\9b¹vÑ\9f¡\ e®nÛ\ 3\98\ 5F/±ã\rBsßG³åÄÄÃM\9cYø«ëç9\b>£Ü\963\85\85È\97qIô\16\83\rÚ£±¿5\83µ¨ÕV\15\14\87Ü_\ 4À1È£¿Î²\9cåiÃñ¬JiXû0ÛW\12V\96Áî\13\15H[8g\84«\0_î/ü¡£
+n3¥\f`\80 ¤Ðþ38A.|«f|Ñ\98\ f\150Iõ½6\aÖbå v\1a«%Ó&ý ;Y®ýã¿\9cÕÒ\84#\0ç\91dÿ\96D.)Âì.p\ 5\82'ãï\193ËJî\9b12K\12[DÌu\ 5É¥$s8·I<ÁR¨i©mì£J·¨8\8e}\86ÿf\80Ó \e²\8dåDJ\16¼Æ\80àº\83ws\80!ÃÊ«®\8cÄr\97\12\1fæ¢RXÔÊ\1c-\y^Í*ÓÌ\8fLd'¨é\9b²9?)\r\v"Øqé×^\85¦5µ/\e<\a\ 44þ§i
+\18¨ýQ<\9fÁÑÇ
+\9b\98;/¹¥Ô±ìJB"\14¬\91ü7þ\ fØtÍ\9aù©,mºóXdÚ¾^ë;ì´\9e\8eñ&sà`«YÑ"àë\15\86 \8fÑY\1d\9fü\8a\99¯{\1a\8aÕ.õßÀz^48¯\89e!¹ôR\916}Øõvc\1aûöìÆMi\9foz\16î\ 6²Úoñ\7f\e'\93=\98~µ¯Âi,3Ã:?-\8b©Ý?o\15S,Ùõô9áÎüwß\ 6¼\84µ¹þ#îÎRçOa\83ìÙü£\98\98\9d\97ô\1e;Æ     \ e?\81\1dàþäï\8cåpïÍ\7f\81Ò\7f­À
+±Ö\9e\15\9d¼üO´\vÝ\9f÷\ 4e#}Ô¯èN$í\\1dê\8al?¼\1c]\8f,÷ý\vÅ\11·y,Ü\ 1Ñ>&Рô\8aî\10ä©øq]\18Â\17yhâ\900A\aq\1fñâK\12\9dB\ fÍF¶\93Ò\8dcH:ñì\97-h-ñÇ\9f\1aµêf)¯K9T£ã127]\18çÑä÷q\90·EjL\88âí\95<>hÁ\8b\15;ù|ãU
+\9fþ¼\16\ 1ø×\1f\9dà\ 5\94dÜp\82G
+Æ«½`¹&!\a\85Ïä8a\1eðÉlû³\9b`83>Ì\16.\91\7fòq\84\9fÉ\82ænç\9d\16\85\8eÚÀ¤Aß9
+;è\9c\fï ¡\8b­ê`¨¦H\86ÚBÕyåg¼ Þ\vKBý ¯*kïã°\972f\ e\17F\84=#\9f OMã\1d· éeT?
+m­òTm\81\16ê\1c\90_¡å\17\93ãOBÛ\8aV\1f\0¡¸<É\86F('\97n3\ 2u\b£G~\86È®#Æ7Ð\8aö9\95\1fÁ[\8dÃÙ¡`NísÞ.°P\7f..\ f콤\f\19\ 5'K\1fnp\83\96\14\1c\82\\84?\rÇB>\83öÆ-à\9dî±Êõ`\92ñ\86\12\ 3½¯NÂ\ 4èWßO\9f\ 4OW«B\ e\83ªÊl¯f°¡xßìW ^Ð<x==\8c\91ÑZ/~Ã4/\9f.*gÂ\99°Pʲ\84<\ 5*V-}&¿\8bÍÙ\9fÏwá\ 4zùñWq=g?\10:\81ì;[Ä\1f\90\9b- (\aÙZ6*<Å\eÈ\88\17\84ó`p\ 5?\89\17\19û\9d2ðÂöeQËyÑ\9e>Ôb\9eÚú-_\8c\1c\1dx&*\17/¹ê(\8c\11\95\82µ\ 2_\85\a\7f\86ó\91\8a¢æ\9fzF\96\93´`\19éLd¯ßE:\12»¬\97SN¸±\1f\16Ê\94@S\8d 0Óþ¢3\7f\95|TÖO¹Ko³kÈÄtëßo\12}bF\90\86\b\13Ùz$\11\11«\ 4â-ÕÐç,¨.\18m\8cä'j*J\ 6¨\90\9c|)J\1eË6²\bB\9dµü¤\91°P\f\ 6^Ã3ewÜ«pXúÁò.þ\94*íù,0ÓÅ7xP­Ú³Å:2¿X\90\1eOTç\8f21|"7ùÄ=<J}|ïwl\ùÜ}\16vGic\19\86\9bQûº¿òSë\17]ñ¥<«C\8ajȹ\15*   @8\94-f\94áôâÉ\13öØÝ\82={ñ(\r°\8e\8bù]\b´x\89Ѩ\19Ýnüéí?êÏ\91]Íq\85O\88\82Ë\8fÅExyU\ 6ð\18\9bÐ\19câ0º¶tÏMô]É×u3Ðæü\14\v\19j »o)(CoÀå~2­s¤Ð\83\b\88ÆñàÆxÀ\a\93Ö\99\1d\1fÂÌ\rõ{\82ÐLÝ\ 37\15z<ßÙ"\bõ!s\8d³²[\ 1¢êH\96\88a­±ÉÀ\19*þ{¹\81¹1õ\8bl\16óÓ1óô,Vïî&I*[»vº$\84#1/\97ü\05×Z\94\10ÏÍp(3\14îÍ] 8\ 4Ãüi2\ 1|(Õ2ý\1d| z©D\0\9fÛ5 N\86sÖ¬\16ï\84¿\99»\89\13\11ûviV¤`D¿0Ã\9b\9f\97ó]¾\91\ 2È\17R\16)Lù!\19'nüæ"Π<v~\10¡x³ë)Ñ~¼if\9bÈ
+wnKÎÜ\91QVñBá"ÿ\1fÃõý×Ô½\ 6pü  *Ö+ت\80\16ED¯ È*  ¡¶\88©\17\81(\16¨Ê\ 5\19²o \10B\82'{p\92\9cì½wHØ\86Ê´*JѪmA-n¬¨Wj\15GE­íù\ 3Þ¯çy~ú~?rÙI^\1cWO\1dåÔ@÷«\9f´¼l)ÎÝƶ±WïògiX¾\9b\1c¬"æC¯#Ìk\14ýànA\89\8aæ¸\f§Ë»¤rî\7f¥ó)bÈ!¢UýÚ²I\90\92\83b=\81³>Ç0\7fã\9eß´\90©ã\8ey}ĸB)\e\ f[èö\11\9eÝðF\ 2s\ 6´\f²\14òV¡+\9f±\19ò̯+Y(I\7f\8a\95\99(º³\91Àx&Úá9J\7fAIìÏã'tXm\8fy\e\9cGÄ=\9cX[8éTK³)¦2\9cí©\93\1d\1cTSRü\19v¥x£\ fã\80\93GO¤|Òg\82/÷{Ø>ã\ eº\ 1Ñ\1c4Öù/\92gËRçá\8aF\96ȶíà&æAÓ5\94\9a\81\fuЯ*B<ói\16òë¾\0\980Ògµr+OÍ\17åA¸¾,0\9fíî\99-\9fbÅu¤g[\19ï\~¨-ô\19ÛÙÐ4:I>å¹\83\16A¾ÕuF\87Ç\9eѧ©\99ué¼DÅùº)B©,©\1e\14?nÀ`\1e 'qQIzÁ\97\8d\97\bö4\8e{ á\1cB_g\876\9f8­#ªÊ\892.Aî$\1669¤!ÄÌ\92\19Ñub1&Dð3Q\9dx\83\8f\v\8fnÞï\11νxüVG¿&\95±TÛ¨ü\86ö\92Ã\93)©sx·d-5ºÄKx\8b¢ÊÊàߣD&®\811ä§Á\9f±\94\1d\1e¾\9cjðdû\80\1a\ 3GjJ\15\95Ü|¨JÚ\ 3¹\e{ÅÛZ¢\8b\97\vÞ²Þf6ó½\98/vTñpÌ\84ub\1e\9aÙ\r¼\85P ½mBU#g«ëåB©gË·\92)\91\15×-*\12Ô\16E
+\ 2ar\86\e\8eæ>Ý>Ƶrn®[É­äF\0Ó-I ÊõByѸPå\94=ÕþĶKâUC\rw\85\ 3ò\aG\vùDéÁ}\7fóØâ¤íñ\9c\ f"¿µvN¯à.p\95]\bò]QÊÿ8uÊ\19Yµí{Ö#q¯éCÃ\ 6áv}sa\1fü·¦x_\15o±òyÂiN\99rÞÚ\ 3\9c\15â\9bÀ(«\rd8aÅ\13w\992CöQç}V\9a8ÓUWO\13\²g\17®\85\85æ\véÓ\«\11\9d\90Ã\ 1ôyk\97@°¸\15\18d\ 5\82 óc\85ê\94\8bt¨¿\9a9$\ 6ÜÙu\7f
+p\9d\86\ 2-\9càú1\1dÏÝÛz(þ=Ôf)
+\1a\82v\8aë\81\1e¦\19Ä\9b\169øØ\ 4¡Ö2\83\1d w\1a       uûþç\85¼çï\ fתÑõ#è\ 1\85­Á\10{P6\84+\ fDÉËq3HIi\8eû\1a·Ù%\84ûB\1fóC\82\92\1cb¨!ÔÖÔkc\b5\87&U  \ 4):X®$Ü\8e\19\96º\88[\ 2®Èb\89\1d*@ÀPkcÓ\98\82dÓoT\1a©B_L1Uwi"É\1f\ e\ 5)\13ÉÌ=\8d2#ù\8b\98pI\179, RêO>\87T@>\bè;¬bn\ 4¿Ðø\1a¢\80D\1dÈþPuCý\ 5«ë\9b\ 3\8a\1cfkÚ\ 5é\bã^´^ü\13\ 3\17°\\12À\8cG~\95\r  »o\19\97LÃRc¬HqÜ®=-8^5OÅ\84µy*9\8bû:-\ò\17g8:T<\8f\13á?*Þ\ 2ý\8e´C;¢¶[\82µ·y¿\e\17Íïµ+\14±\95ÙÊI©;÷\8dlRLß­\93$\b\1f\8bv\bYþTQ6ü\7fDy\83\80VmÖÛfy%\ 6/sIs\83\86mXP1ªLռȭ\92¥«òvo\16w)\84Q\ 5Bµb\99\7f\86ÐÀ_\ 3\0L\ 2¢V\98wuÅp§õ¦¶eÄ\97\9aõ\8eO*Ò\14\93\16|Î+é]£(uH¼×°4ÊW¸U\8bõ\ f\15.ã{ Ê\a\ 44\ eÓ\ÿm.Q¿¿w\1d\91ª¾ÒÕR~MAiÃçÀRz+%µBô\87ýóÈK\82ëzçª?\ 5'à{\0Àè\0\ 1ñó\13\vkÏÒ\89\1dßaãêa§\ 1{ºè\ fÛH]Åþ\12sX}d\8aÁ°°a~ø3í\9b\ 6§_\95au\83\13¹«\19Q\az\82       \1eô ö\91¦\9eú\98VM\13\ĵv5I0ïL¾M£)ñºÇ\84\80p\9eæ\aÂ1¿ý:5¡\1dÙð,\b\88&ºý©á4¨í\f%¦®Ã!$\17\1d}o±\93®cª\8dÞ¤ã¨Aí]R^x\84º\87\97¬M&/BÔ:D¥w\ 5A\18ê\8cë2û4ö\9dÝÄÊ?\9acîd&g]5¬b\94¢\924³ôëa?«úèßû\85i\16ÐÇ\90»\84  ìïÄ\88\ 4Ôý.OA\r6Çv\13f\16v\99\1esïd¡õ(\ e5yT\13\ 4éÃHÊ\e\90Í/Põ\94=\85(¤a\85\9b;zUs\94\vÎbÅWµã¶xéDa\84)Eìʼ¤\13  \1f$\17«s\ 4gÂPJ\1fár¿eÊYè3\0 w\83\80`¨c\83\99FÉo\9d0|U[j5kÑ\ 5ç\8c.\955³Jç¡à&\aª\86åø°e\8aT\99Èo\91r     \14\85¨Ã\88´\8f´}I     l­pàjC­á\96û\ 58c\90ñ\87Ì5ÚJ=gç%U\92®oó¤|L5çç­8\ 4E"
\90ÿ®\1dß[A\1ek]Ùíûí\84åJÛó\82Í\86áVBÆMí"{íN\8drÜòãæ\ 1ùQÕ\ 3¿\ 5òih\e\0Ц@\80Y?ü 6³ñ^ß«ZWÙ¯î]Ø°¼\8d\9d\8bh¶KSÇ\88\17:>®O\rɲ\85Õ÷.þÚáÝ°\12\99µ\ 4Q\9f\ e{5mm<Ù·\10?^Öv"\11ïÌ}ÙÑ\8aw£÷9«ðOã\8fØ&\9av\85ÄXÎ7\91\16km[       \ 5È,7\b0n\ fÎ\92\1f7\16\17éeÙá\9ePÒÖ\I;\ f<±çuë^\10\e\1f`u\82\15!ËÍ$P´ø\8e\85B
+ET9¢¤\ 3\ fÙ²F\8fÞW¬Àc\ f»\83\19ã¹ám$úµ="G
+}KÜe\8b\9a6±~Ö\94G_å³ÒìMËDÔ¿\11µs`± \1fgî]\ 1\17\1c£v¥p-9§\\1a\9ed{:´:\8egv¶HÖ_3fC;}ÐÆ\93\f\ 3\0P\9f\83\0ýN\7f\81\ 2\83Ëp\97\1e\8bíd\8aU9uÎ;ÂÁ´9\e$8\10wÈô\vÿÜú3\86rþ#\1f¬AÄ\18FÔiD1ún\e\8eà\16\9d\98Ô\1e-}õ\ fÉtþ\ f\0\0ÜÚ\10\93D´í\87HÒ!5$É\1e\9a,I\8aQ:¤È\96RÂÜÏ1Ï3ÏÌ<Ï\187\19Ç\18Ç\fãj\861\8c[ÎÐ\8aTªÝ\ emõ¾¨WwzU»xßù|ö\ føþøÕ¾+Ö\84{×úÈâöõW¿\96>öò®p\95ª\9c:ʤùJRqY®ø¡^Éôê`ǯª<à~ó\89jûØ!m\9cr.ÜB­+\8bÙ'«\8e\94OyY+«äfN*żt\r©WÑ$þ¨W\½2ï°Ôù\0½M_ê½c[ëgÕøñÿª\9djjö%WuU{{­,_¨°pêW\9c\96n%}P¬I^©WÑ|\ 3\88;c!¾p°\85é\15\17cʨÌN!k#¥´å)k\84ì¯sd\9fµ5nøÂ\8eû6Q{\10H10À×ëUì\r
+\9c\1c¯\1eè\87-£"{â \87TZG ô\88RØ,\86ÍÉ\87\1ajࣶ\ 1Zw8j   ICFöêÕ:½b\f[     \1eÆ\17\+å?\88
+èþ\99oA\rn'a
+
+Úô\ 3\16O¦j\ 3\16Õä`ê%\ 5µ\81|¶^é/si×_¦XÇ£ýLqiÔw]\96Iç©Î­÷D"J¤î\e\91!y\7f½!ñÔ¶®n\8d\880²R\15á zå W\11C¯³câcúh\99üÈÅ«KÒ_R\r[úÓ*)!\rOSo\91©u\13©µ¶OÕ·ÓÜ\8c\ 4WÖãíze¯WÞCÎ\ 5\93ña½²¼ìÈÏ\9d\ e\92Lê·Í÷/ÏQB´o³_\93£kÇ/\7fcg£ªÊ&\19MV?ÇÿÖ«5zõÝ !gÇ\aôÌ\14ë"?w\9c\96\ 5\9a\97IÏQ"´Î\ 5§ÈP­A\ 1d\17tE)q4þ±j\8cðúGÁs\83ÆÕnñ»{"\94\v\91óí}e®ÔUMÑrkÊùzvi89C}´ø®\1dXóLB1\16W¾".ê\95\9d^M\f\94ÔûÄût?WK¢LÛwÕDP]t£U\1e\14\91æ\8f\8a1r»J«ð·ÓÕ¸KÎ\eÿV¹\97ÈÿGM;phÌÕ·m\81 æ\87v>èÀ\1a-w\ 1gØõ©ë¡FN\19ý\f\8c\ 1ÊcIÜ\10Pþ#\19q\87òW\95 \8eÐËI\v\96\98\17;\16ÇNáÙ¶þÅAÐ)Å\b\10\83ÞH~\ 2\ 6¡7iÛ \ ftòh\ 4l\83~ýÁ\ 4~dz²YË\rCûþåÎx\9f2>*c\19&\9fm\89b\9b\89­ä{9f¢\ 51\ fX*²L\98\ 5\8d    ß#>à\1c\ eíú
+\r\b\aV\ e\85¤g\17è\92¼]7n249=MÅÌÞìK%\r¬;\99\a\92,ÙÓé\9cøFÎ\j\7f\98\vð1ÅÑk\11l\14·Zå\82i¢×\7f\ eÓØ\8a\92áíô\9c\12²Î\90¡.|Q¼\859\98\7f\9fа¦$_.!\1c\93Ë\17\ e;\ 1¤Ì¿¼l\80ÎôEË,\80\9e²ûÉ¥Di­ùõ\87´¦ê\8e\ 6\15}D\89É\1e3^Êa\1c`Y\14\1dg{J=\ emãìɳØéËy\9e3¸¢\89\ 5M\ 4'¼jM\1fê£-i\8cЦÑmêÜ\v»\19n5?        \19ÌSJÙE\ 6+U~ ô\ 4\88í\99Åq.t¶Xd÷¤Þ~\9c\98\10\7fÍ~p*QÐeS¯¤%·.\91\8eÐ\8b\1a\9c\ 4"Æ°ºöB\ 5s¡ª\85ZÏ6-çîøÄ\16\956[\d;¤^z4\92`;64è\97¸ùú¤æ\15ͱw¶à\7fô\8d\1d\9d\8c\10Ý|ì+&®A©f¬LUà\8e\ 5å¦å\9fXòT»ßm°åô\96¾)l\ 5ãFí'l\róV\81\ 3æɺÃgcGÙObßbÉ\9c9ª;v\v\ºCÆ\ f\87L,\8e\v>B?ÝKGC\11¬·\11e"°z\f-@\90¼E´\17ÉÂ\ e£³Hûù»</äs\88=/\ 3Ýá\91\8d\8cå{øûPü®\ 1w\Lí1A\f\93|U{\10\ f\91\0¡\13\89è"Ò\89w\9d+Gmð\rÁ$\94#\94n\97 o\84Îæ\a\ 2üN\ 2\9c\94³º+\ 6¾\9aý}M\19ü9ÓMbÎ¥¤_@TܲÔ'1 ²,\85\14á$;º×!\7f\8aí\97\81h\ 61\7fk\16b\14ÿ§ó\1d¤\92\91ª·Bo
+ö\®\80wçJ¹çàÊ\1c»³\11ÜuY/\ e\95d<w\9bàΤc¤~\ 4\10Ï\8eéÀ¢êñ\ e\1dx¯Â¡ò#d£ g3 \8bÅÓð~è÷ÂËg\8eÂ\87ó\89 \1fxT2íæȵÉ\11\926s3Äi75À\87Æ»íZÐE\13\1\ 3Æ\éɺ\ 4¶W\86A' ×²\1d¿\8a M      }?\ 1\82È8|RÊ0SÁ#â\9d£\93\0³ëCÛ¿\ 1U\9b¢b\ 50¡óÌL\ 37Ö½\ 2\ 5\15Óè\ 1hcEkà\14T\\16·m\1eê+  6ó\85·&½\1f=\ 2Ø\ fû´í\aB¯9)£\0àê³\8c\11 ¹¥\1fø\r\ß@\8e^\vjk¹\81aÐÆ\9a\8fÛPh\8f<Ñô=T\9fÔ6ÄK^MKÕÍ\8b=èÝ\8a\9c$\ 6ãQº­è\ eó-§U\14À&\9d>ILp<÷5\11¥À\91­\83Ä'ðÐÒ\89¤\10èôàÞ$>ÜÖ8#ê\84gäLÑ2®m\9a       Áæ\1ec«ð¯Üê¨\b¼\181\rèÀc\91\v®\ fðF¤w)\99P¡ì\ 1+ÑrâkC\rq\92p/\8dÂu8#å!î*\1cg\89\85\1d°ÈPa\9c`vïu¡\9f@¾åo¡H\90`"Ž\ 5¤þ:üz\96\8bÖ\1d_\95\91Q<,DÒ>'Ó\85\ 6©\bÓWP\93²ó\94§ .ÙÊÿ¾`¿xå\16W\ 1\98Ä3±\16|!6õ\85        »
+£5\ f\84æù\vEl\ 1\9c["Þ,0Ê      eØòµÙ[Ozò\89Ì0\7f\ 3~lúU\17\90\9b\1a+ùÓ\ 4Úë&x£ì®k\13P\14ù²c|uÉÙ$kþ.\99\ e{Qp""\14kÉí÷óÃÊr\9a6ÿ\81isV\1aûa\8bÄÏ=~\82@\8d\b
+.<Ë7ª
+\12­Å2Ë#h?c~¥m'r°ÕEÂ_ªxs\85ë6\87ò¾\14ø\1aÍa»\89¥ÝÙü±¶Gµ+ø\e\9a¶K\v1¢þ4\11\8c\19ªä\89L^kUpø\ 3^^ù\95_\96ñ\0\ 5mÓS^d\91Ш\85§Ä'º­ùàµ>µ\10»Û}¦à5¶¾­\ f\97ð$:Ï\84!\1eE\13\18îÏ[«búJx&Õn\9b tº(Ò\bçmÀ;ZÿÏs\9dF5u¦q\0\8fX´.¡Õ\82£Bq\aK\15P\ 4Á \80 *\b£\82¢\ 3¸ l\82\86\84%{¸Ù\93{³'÷æf';\9b,\1aTT,¢bÁ\8aâh\1dë¾Uq\19µ2Z\1d\94¹ç\8c3çýü;ç}þ\1f\9eóüóT9Ävw´ÂRñR;G\1eD\9e
+\fKû*ÃË/@hUv\8e\ 6\84«\85\89¯$÷j\9c!\1c\90\8c\rÃvy×\91m\8aû´,W²|-Í¢  \96\rÕ~\80\84²_Á\9dô\86­\8d\92"ÆüÄ\89â\ e\ 6ºà\90ø#cØç¦\98Ï*íX/\87¸Ï\9c\93e>Ü|õXHÍù;û:\98Å)Ý÷\8bd9gÆ\96\13â4àaB\8cÈ\ 2\1c\9fÿQ4\0\1có\81\0»w\91,C
+Û¯B\17 UÊ#à>ÉSV§$Lì-í\12Ï\125g\ f\88V    Ï¯*\13¢Büü\8dÂ#\82ß}¶\vnp\90þÒtd½­\a¼ \8dU\98$Dõb&$^¡\^Ò&Z"/˺+Ü-}¼Ò%è\82\1d\16\9c\85:}\16ðû9\95\87ÆA\82ºYu§À        æírTÜlP0Ô"\9aî·â~!        ÎÍ\9a*@5Kâ?óß«Zæ-â¿PÍ\19ó\81÷\98³µ=\1a\1cjô³>\97\90Ü\88¬[ü\8d\ 3O?)¼a5\17û
\99\18\9b÷ñ?é¯ÆWóÓÐUs»ù\91°yÌ5^(ge\9b\1a${C­\89âÏm>²        "¤é\14ÝG¸Õ£+Ú$Ø踿©\97Ï«\e&¼æ\rXwÎÝÍÓê\12Æ\1cãÊ8?´Í\ 6g\9e\82,'Å\8d\9d\ 3"\82·\97\96/xÕúÏÂNþ\83¦îM)üïê\7f'Ôòöº\96Ì\19åÍEFÆÔq§rfÔ\e\rCįQ9ZY\91$r!ñ¤Òê6m<YZС.©<\9a©V^«z\12{UÑS=\1cìP
+køX\e%3Öxúõfj¨î\8an%\15\10^\87ý¨·«\1eið´µ»\9f«\b´s\19\97\15Íô\8d±3ä0ý\97àq\8ahÆ$¬\13Ý`kܯÐ\1c\ e\ 1\19D&\0ý\82!ÍM °ò¥ê1\10´ÛWù}í\9b\8c1r´öîò=2Ní¯ßSd\9fkßbí\86\fà\ÿÒÅ\80\89p\8fö\99d\16¿W}^\8c'¿S^\14}³+Pñ\9d0iC\9c\f\11À1ÝR¶ 0hDz[P\84µ\0\ 2¦&!á\1a\92v@óBåà]P]V< ½SÜ\92GíL\95O\93\1eNgK]\10+&\f\92\82-A
+è2ø\10»Ì#\ 1\9cs\19L4õjñ\9a\bÃ&ÞD\95\9fî\ ei¾b&,ÜA\91ýMS\92Ö\ fÝUµD£à9åù yà\1f
+\15vÁþ\15À98ÚßÜá\9aÍj\8bc\ 67MI·~¬(\91sL#ù}Ò3\86¬´\18(\15M\88^\0NÓi\ 3\aÁEêKØE\ 4\ 3\emië u\97zIó$N\93r|}*ñ¼ü+§'\7f±4Å\ 6®w\83\97¬{\97y%¨ùF $\11©­8\1c÷\13¦@í´N\83z\9dê^G.g\9e¢¥í-1Vfkþ)¯\11úGÃæõËÁ]\9euË6K"í×\ 3\97K¦«\8b\ap\86ÍÎ\9b\aøP¼í8±\95±Ýr»âÊ>\86)\96\rÖ÷V\ 6®9 k­J\88$#\85Õ\v\ 3\8cê\85X\86³Ù¥úC\8e\13\94pÐ[ç¤\bèģ)C¥\8f\8cS¨;rFP#õIÊm\84K£G<\83Ãh/\ 3ÜÈUÚ-,C\1c\80ÓO²\vkOK\9eYYµ;è\13MH-¾t\96þ%û^Nª\8eξ\9cB\80\8bØ7"
+´ãÙO\ 3²ají×X\86_\ 184ÍV(N\93à-{D)´éF¡0«$\13½!ào\ 5\90JþÃd\8dv/\7f\1dõ(ÿÇ\80ñÚUØH8ÞB\0§c×1\95·ÅÉf¦b5u­Á&ë*®Ò½\97nÛ2\b\99«G4\f0:¼\=Y2è߯   \94$bi\94\ 38亵Mß$Ò\99:ut\8aN\7f\17Î)êÓEh²¶Dh\8fªd«\19j£21|²*Téç¯VûË°îÀ\19ÀTª5È®\10M7-´^¢\ 4èSÌø¢8\ 44Te\9bµ\ 1hRÒ¨j\ 4é[ìUîG\ 4þ»U±²\9f1\95\ eàà\ 1K{\93Nh6vÕgÖ¨Ñ+Î\ f\85G\10?Ûõì`\r\94$Rq-ß.Þ¦\182Þó\8fSòeÍ8\1cp\ f\96\ 2ïk!ÁXÖþCÍ\\94z0µ0  nlhÉòjÂ<~I\11ª©®\15\8bý\14,K\8d¿\8fr²L\84)\bÀIM­Ë\ eàØ9M\fâ_\88ùõc+"vÒ\9cݤôL©í\ 4¹$>ɺ¼\92\12zÑü¾j>>¢îXå9,\8dZL-j\89«Ib\8fk¤×È\898÷Ë\9a?vÎtÀ\94òÌ\1fëx\94\7f\13\9e\9a\87©ÒP¾IO}\84_ay@\1dÄæ:\aà ã\añì|VeÃ6Öè\ 1¦«\87ub\ad/eÙ3<Ö­¬z\ 2Ít\9eÕ\e\1aeÌaÝÁ'\98\ 4LaM
+\8alz&,f^ª_! ì?ãlâÛó\9fÛ2x\1f2¦X\92y\1c\ 2ÎèåÅ\84Ü3Dó\16ã\13\8c\1d¼)Ø\\1a\0\a\1a\e?ÈyÌe\9e\f\19~\7f°ã4äÍOª+\09\e\r\12É
+\99á´øE\88V¿D<\8aO0ä\89Vbj&¦¾mLBÎ2ZÜ\88öb9êðU¿È;nµ©â6L0  \14\83+\96êoË\87CrÑ\ 4E.~µ>Tü\1e\93Ô7X¬³\19\89®?MMå!ö½\86Ô¼u\96Oèôt\9bñ\ e\92\17÷P\1f\ e\vCbt;´·ðiè\14ñÈ\17\95Þ°Ìãaøº@gWÙ\13Û#Û@î\9f\96\ 2ë¼ô4c\9c9.\ eDõ¦æ\ 5o\91\vz2>M\17÷\7f5¶þi\e\97\15u0¬\f¶q\eºs\1dæwî®´QÃ9çǸLt\96ýì\82\9f\91Mz)>\19©ûß\ f\9d£ûËI÷;º\ f\94îioï"\92²\9b\ e\ eU\0)úÆ]$YÔ\18\8f\86L\r\1e$\9föíò$Tîÿ¢¢:gUo$\9d÷öUK÷¨Ú,ÕCÙ`sCMAJMÃ\84\9a×K\9f»C(ÕÁg]\91\14õ¸Ù®9ÔsÿUì\ fGß0?\93\88\87­Ló\9e5­ÅÌ\1dÙQM%Ìì\940O\ f³lé\11ç5&\12Üéè`ÚÆ\91\1d1,Ç\17Õxä'¾\9aä{\88Äk+èmYÉ}\93Õß\18Ë-Jîs#\ÿ¥d\87\93ó:Øi/àNû\ fKõþÏäÂ\0\0\8©H½\9d£\9b\8estQ#Åá-­ND¥)\85.s*\8aZÆØõy\9emÏnÏf\9b\19³\8dÍ\\861lØÅÂä\92\8e(Eé=õVGW¥Û9\9dêsÞ:ïç\93?àûów¶½\92Ç\9f\9cQûZºsCÈÕ6ªôAò1óöìÆ\83\87ë6KÌ\11@\8d8ëõO\81U\ 5Yå^\8aÊ`\89ßì7\15\9f\84¶¯\8aóºù³j6ù@£9?,y\8e\89¢Ð\1ct4&Ë}"ÖT×ç-
+ü\Y&kñâëVÉî»x\97ë\85£3ª¢9µô1ÙµqQ±=ébÃeMq\\97Áª\1e\b\7f¨\7f¯\12\ 4\8eêî©`/nÅ\86|\83Ëþ2\86ðÍ\8cJkz¦\7fDºmÍ«\8cIR4ü\~5NlðÔÖ\85\9bôÇKÉ\81Z]TÉC¯3ål\95Ì\85©\85Dî3jSS©)\92tÍêWw$IXß[\9b\10wºV \9f
+WT\99«ú\ 3U\15ò\8aw^PÙeU±\8b®ô\82hÝWEµ^Ø\93~\ fWÓcÊh\8eÿ¾s\v±\ 2s£õ\ 5I\8d\ 6\9bg\91ù¨\83¶`\8aÿw\85¶gäs\ e\ e\r(\805£ª\ 6è\0\19×ßm\ 3râÑ\1dÎÀ\18æ\8d]\f\86¡\vÏB`7JfåAÞ\1e\1eÖ\ 1°ÃaAÝ3Æ\93\19¥ïG³Îáê»þ?{¼O[\vü?ÌxËjø/´ÄæÄZ\84*7¿e\85x\10Í÷XÎ\ e\rÎ\86\19¥î})¸\83CÎûð?`\9f\9c\87c\8cM£È\10ú\8cÕ\8c\14¢´&)¢ð°\9a\ 2\90¡YÞ5\1f\90\81\19\ 5õ\8cJ]q':]$\83Ø\9eÖ]Yv\fxÖ(¾\83\8eµÐı¨ò\86H1Æãe½U¬\98¥¬>Ì_0£b»?*ñ¸¨\8e\1fä¿bÏÚ÷ç\1d¤Ø\8c²\95è\1dæôÜD\94±Þ;W´xm]|Næ¬7UÏù13* ;¦è\ 6.´=¹ð>ÖÒÂSÏÃ\9cj\1c)\90¡CM\8aü>\94½.¤ÀeñI£¿ÜÛ1²²\99/\9dQßvÝÐ\9dÄýÜ6T¾\1ckk\1e+\9dÆ\9cn\\\82\eF\8bí¨V#§\88¹Xd\88\96£\1deº&~ûWEùÜ\ 5\197á"Úbjª°\1dÍ\11úu\18\82\95^I@ïj@ébQ×\fW´»\16\ekåò8Çö\8awüÛ_ÕD\v\85\9f^\7fÁ\9dz\8b¸ÙÚ\rx\92Z\8bKA\fÅ_`\82\bT}Ú\14]
+xÆ}ÃÐ\81\82M0S\aõ,r\84\99\90ùV+   K¿×O&ÿÆ\88´`¨;\18­E{irf0\1f\0F\99\97 w86f\8a\1e\f\8fÿ\eÏðfm_8Ìè\83Íc\ f3\84\99ß÷V\93<\ 5\16r1¿¯p\88êÀÇ +h\89Ès|\ 1p\16Ñ\1e\98\0\1f!QÁéP'ïÕ\82\1eú\ eÞÊ\9bË\bÏó¢ºÇ2òr\15õÓ¤eÒ×j4Y\93\rr\e©î\92À\14,\rÊrÞ?\ 44\8b\1e\ 6! Uø\1f÷qð]fÀ(\9c¦*&umM\ f+\1cª;\94
+-°\90\12\95c\9c8òC¹êÌ\1aj¢L\19=L«Î1þT\ 3DJ\97º»\ 37ÅÆë>©Òê²Î)BHå*£cúHY}~\12ñxI,{\ 5é©Æ\177\8f\82W\85îû\9djWÖ\ 6Þ§\85Ê\87çãh¿g»_óÀ·YovÜMKi\90ÖN\11>\1aü\94\98\f\13ÖRÒÒòǧ}È\15¥Aû\96Q\9ej^\ 5¢©G\v¿s\9b yJ\1aG"ñ?txt,LýÕ>«Ö\8dp°±_\91\98>ÞP\ 4o$¦Õ^<\85%}¨ÊØK¦D\94\ f\ 6ÔS4¥
\14*S\92\96Òyñd;\92\9aÔéIJ»Ó~J®M\8fn>ÉÌȸc\19I6\90ðu¯¢\86É\96Ú\98\80åä©\8ai77Ê_\925W\8e2'        9­\1cøtÆ^}/ü\988%wdáÉ\0ó0k\9aò)¹\85ͦñ¢F9\1eÀôÆ\a\9ck\90\97ë\16Þihóà3úSh\9b\1dËPB\93UÕL\7fz¦ì\ 5s\80±\92\11\ e'0®$Yá/L\183Áª\82\97\93\8d\81\15ó\b\1c\e\84\83|\91Éf\vô\18ɪ\AW#ësi\8c\bÞSè-ãO^ÛI\11ÓÌ+Ú3\ 2\1fåÑ6¸À\8fxasíì îø\85\e@M\ eÜä
+\12¤A\15\fh­äm\8e\134\995\0VÑ-âî\13'\18\fѵÈ1¦¿ð\95\7f\0S+\f\9e»\f~* \ f\1c£%\14~kÓ\0¾\ 5ïË\9d\81×Ê\89l\rØ*¿
+à lÙ\83Ä=ô3¹þ»_2~\94\96­OgP³¥s
+\98\82þÕÔcº¾ÆdÚú²[ÚaÚÛ\92{\12<Ð¥ù\83\16\ 5jÔA      {! ß²Û\93\1e¬Èñ;O'Èá9+\19wEH\9f\1fEÞÀµ\9e¡&\19\86J¯ÒVé?fáiÓº j\ 20¢5\1dç\80¶bhW\1a\94ZxÝo=\94¥Æº\f0\96\88Âz\89ä\ föhK5å\92m¢ä\13\95o\ e\14çÑv\1a\v(Y\80Ouô±óà¿t¹;\87ÁËe=¾\16ðRÉ*\17\ 6\1d\12ÍïyMVõn²,¡$v:\95ÄQçÚ³EãÔ.\9b\17y\8cVlò;æ\ 5\b\8dsvn\ 5·Ö,ôõ\ 5Wi\ 5.[¡÷ÂÉ\ e¢@\95¦­\ f\14\84¤34Sü\8fD_!\93\7f\9dÔMú\9bßF\89>Jæ\9f£ND ü»@$ÊYÀ\a\ f~³-³\ 3\92µïCÎ\ 3Mu\v\11\19(+lBpÐ\91Ì\ 3È^ú\12â#$\9c\172\12è\r/@\18Ì£ë6 \7f3\a\9d\a\ 5nðhÛ
+\9e;÷ª¡\8fû\91Ûª.âþ\97«\15¬æÞæ\8a3F¸¿q3ã\99Ü\ f\8evÞZnþZ"/\8fËvNF\94ÜüÖN\8eJ2V{\9c\9aV¹sØâÏÈe\ e\91®àT\88öa\938C¢°!Î\97Ì÷>FîÎL¡ó\Þ\1eþM{\ 6û\97ü\a5®ì\18eH~7;FÎã       Ù       ²A\ 2\9d\8däú\1fÁ³»¤\97B?³ÿÈV¬ùÂY\9a=Û©\8b»Q i9ÌJ.sÓ¿c%\96è\95FVb\91\17\17d\11Õ¥iL\96º`Ûa)kDé\15º\9b=W\ e®Á³\17È\1d\9c¸\9c\1d\82ãÍ \nÀèçÃeÕ>\8aN¸X7Æ\91Â\862Iª\ e¾Y\ 2\1e\1af-Òto7±¶«/®~ÁòUýè\84as\ 4[\9a\86`W\9b®*\1ev3_\94\7f`~©û\87æ:\7fkêÌâ\0\1eÑjêR(" \ 2\ 2E
+*\8a\80\82
+è´\ 2¢\ 5\ 5e\11)DDIØ\12\12\ 2Ùss³Ü,÷f_n6\b\ 1Â"¸\80\8a:hm±h+Ô]Aqñ\95ÑQq¡âS\9da\9e¤\7fÀç9ï{~8ç|\ f³~bÌh6âG\18«\eîíZÄ ×\9dN\Èh´ü+\84Ë(E3§\a\81~Ýùô\96ÞÀ\86\96\1eT\91MGºÎ²¼èüÎ1ü:zk\9ba'L\7fáøG\82\81±¨\91\152\87>\88\16ºýÅ,\0gt\fÉÎ\10îX&¥@Ù?e\1f%\9c
+\12ý\9c¸\8d\88=@\80ÆIhÆs¨\88\1c²á)\14H\11\ 6\1d\85ÞU§OeX^mÈÁ7R7Ê~Ë,ñûê,é\vñ\j\14í\14´±\ 6»¿J\84Ô\8c\12ͬíÝð¥ð\1c\8d\168!*¥]\98JR:æ\82öWâRÖ]ÓM\88É\9a\94\f\8b\9cZ«ð\ e;¨¸J\18ÃNÞ\11.8ɦ®Ï\10\90ÙÆÀ,Á[¶r*\13ýÎ\91¶]\15M\88ò\8cM"wa\8fX)L\14bjd\ 2\91`ç>:ÿ?ü¾íù|:?u\9d\83\1f\a>^ÒÏGÁ©û\ 1$\ 2\98Öfa\9fâ.\8a
+\1eÊ¥\10\83\ 4S\8bø%²\13EDð\96´8½\f¤J¶Æ=\ 2£Ä\95K¢À\ 3â©{\83·\12À´\1c\14Ü6r\f\a\ 3GÄãGêò«\89  \89Þ\vóÆU\91ií<\91\82\16\97ÄK\92g\ 6\1cçå"÷¦¶^ \80q\8c
\1a£ô\17ùI6±°\13¬±vP¦¶\91éWÜy^,\1a\9a\86\ 1\ 6u¯c/\05ÚÓ\ 1\19@¹:ǹ+\1d\8aN¬þ+ðlÛiÁ{Þ\1f\8ePò#^¨\1dÆy\ 2\86úìïv\ 2ë,ñ±Ü\aæãþï¹-ÚÍNÕü\98\1fѳH×\ 4⺣\ 5\ 5<Ö¡gäx ­ÝVÈ\ 2<\1c/·Ýæ\1enb¬\1däæ6Ðýë¸ó´³\9cªÎ¡\v ¤+nhB˾â¾PÑËoT\ e(§W\96æ#ò#Ä\89TwÄZU\1d}\vñ w-\84ävòÄTç½\19½Öç\1a-9Oá­ºHIãz)¿®\8e®ø ï zí9\8fäR'·dÁI5ÃÑa²ÎZ©ïG\ 4\9fêa\ 3g\89ÕW=\9f\99.÷P\16\9c y?³¥\ 2\83ä2\87ò\1eÂóX¾)rÙ4Va\14\8f¥òåÈX¬ò©\17æ\ 1\18ËBe\8f`9üQ1\87ßÍ\9a@8ü5å\9fÃ\1eàÉÝ\1f¤·ÀÜäß$×ÁÏW?\91\ 6}¿\94\86\9dÿ2\87*\ 4È
+\18\83\8cÂ\1eÌ÷p\81\f+\9d\90ü°;Br\Ü\95ì'>\v\8d¬Þ-ö\81\1c\11÷C¹NeÊ\94Ûô\19²\8dÈL-Ê\8c\95qÔçK×H½\94¯r\vÄ7\15ÉI\15Ð\rd<ò\12\14\8e¤ù¤B\1dðgNelB^Ö\83R\bγF2èÒAÓq\ 2CR\80&ät\8a\83ô³7ß\84ü´{"\vD9\9a·Þÿ\15u)\10\97òCð­\ 3\92w²¡æ1ú\88t³}\10?"þ¥¾'Ç\13\12[Ý7o\12ÉÌ©«~\17\9e1\85{\9f\15>Rìu*ô\f\82íÊ\96\bdÌCãôlÉÈÁuøtqf\8b2[\ 5ÍlÒ~{S4Ã>±J$\8c«÷÷.\13nQ¸nlåPÝ#ü\0xÛò])By`r+\8fÙwÞð²âçLH?\87\98ºñ¹VD:º|«æiU·G¹þ~Õªÿ+ö\15å&+Rµ\ fÜbö gPâÑ>Êú}¡úÆêà\8c\13Ô¹\e÷k\96\96]WSk\18\1eqÚwÔ×ÎZ
\12D\1fæQ\8d§\19\9ed¶¡\82\91V\84Óídè2\12\8c±ÄKªGÌMËv«ü\98U\1e35«\98K\9dJ~Ù4\0&\0\92w·J \8fàÑ÷*µóy¡;\98êXàß\89Ë\94ÝÀOá÷\15£@\9bû5\95\1ahw)\8cñ\98´\95ÛoØ-9E:¦ó\17\1dÓÌ\82îo¿¥ò\83æ&\98\156\11#¼Vþ£(ѽSé-te\a$\víפp}ô4Õ%Ò4m¼r\13n¶z\89üôöhe4\82KX*¯\87\83\91\13ð÷î2ù9\89Ê©à~Ô×ü'Ǥ»l|O\ 45\12Ã\8dB\86
+§;\95^§ jÆã\9b\91Qõ`ØexHý³;\ 1±JË\*Ë`lú\81\13¬Ë´\7fKÄh¦×k
+&\94\83\96ñt\7fù\88éF|(²Ý8\12V\ 6Ç¡\8bÜ·Á\1d\ 4\80§\19\12:ϳû´oÛG*UjSKk\ 1¨ÌnR¥\1d\93ï±gl¸\f÷ÛÞ\85-\91\1d6\a¹ûÉ&¥±NÅ\97´ÍÇÇÖÄ7O\10\1eâ\174\ 6\94ÑrGm´òO[du_T\92×vYÖ\10{\82\vÌ\8fIyØ\ëaR Ky¶¼&\95Pï7ݪJ)élø\83¼"\97Wÿ5Å{K¤å åÓÚ\12S_õ¥àå¦\14j\0\160WSW;\15¨wèixêÆF1Í^\12lÓÐ\9eä¼´^£'¤\1c1ï¢ÛÖb\8c%ôOAÏÐ\ 1Æ\ 2¬ÕXÂhq)Ló7À\8ej¥}=\809PX\9fÎ=\91\93n\81¹`\8a\9fÉ\97KX#Cù\85A\r\ 6*7\17{È ãj\9c\8aWÜ´T\9cByÕ\10\ 2Ñö\1f¯\8b\17uf×\9béÂñd=úA\98¿f±Á]è\16\94§ÿFè\85íÕ=à_u*`¨q\9b²\90\82·¥+\16î_iÝ\8b\Ê^`BaEò|ÔS&\8e¹¨\9f%\1d\ f\v\91\15a\a´8á\e\97ª°+Q\88üg½Qÿ[ñIK«Î-Ëj¼£IKr\182T¯cjuñª=A\v´\ 1ʧØQÍ\17"7\97ò²{Ù®\93ûê\17×\9d*æX|,\15Y\19Æ\15¦¸¤\1dz\1dê\88ñÑÊѽ\81ý\1a¢\8e\8b}ªÆ\88f:\15÷jCo[>\99]×ãx^¼Òìh\8aÚõ\ 1ílhNrÓϳED\ fkþªc\ 5\1aÕCúÙØǪ\r\7fת9Öýc  \97ðîH\1c\ 1\9b\ ft<)\85Ó}ÛzËÝ\12!ÇhE~DBÓ³Ê2ßSÍ\86Êòi\12{;éo\95×u\85\98Iøõp\18É??ç \834\996Ùº«ê^"©¹\80Ü\e±¾1\95Rêû¸±\85\92\93-\96ê\9a65s\8f²j\9e\12p\9d\8bóÝÚSjqi6dzھİÆç´\88\b\8f\86\v4\81ï\8b\861Ú.·\ 2ë$Ã5E©\1dGü9ßãÇ:Ø\1cï=µ­oØ÷Òb\9aµì¾\84\vv#»\7fÅ\15[éÿx¬ï¯¦\ e\ 5\0ÀAFë\ 2+Tã³\ e\8c\80\b¢\8c\1e\a³\80\13Ô(C@RQFöº7¹7ã\ 62\80°I\ 2$\90Á^a$Ì\10Eq\83 >\1eµ.ôAE\ 4\15õµb\8f\8aëõ\1ciÿ\80ï÷O0\82\9e®\8c\13\9c]Т\99K5ΫPÃ\9b\8cG\84´æ\98\f\8fãÖ\rÃéÒð\9eZªdÖ\1f¨J\92\14ºË*¼$dôýò·\92ó\v^ª}E\1f¾*Ö¤Á>?\87°©\89\9d\aÄ\19ë\1fçÆ\84\9f¨áæÄø¯­$d«ÝO\94£³      è_t¦l\89%¦Ô$^7¯\8a[\93KüñSú\8bECq´z\8c"$\1c]Ý*\eóûµB]øÊ}\9bÎWö\rzT[R\10k\19­"\89\83ç\15®å®n\ 1¾]¿Eã\eçU\97Y\16\1dv¯ÚFUãW\þBÙí6£-RBè^M¿ì´e¶2B\9c4¯<ZRëVâ»\1aûjVÅyÔ~¬üO\98¹
+W>èÇ/wÕͺÍhú4Eè\11õkÙ5Ë\96\92<1òU\91¼Î[¦táþÝ\eD°Å>îQ\12\19!\98.kR¿Ï涧ä7\98\0Jµ­cû>òc\14ªÂ
+lûª\88/ûüi^¸á3;i÷°\7f\9a\82éÚ\90Ý\1d0\83æsÜèÁôÄ\80­\a\98ZÛnÃSÆ\14
+¥»Àq\9dW7ÏN³\93p:ó([\88½Ý5Ì6\878·½\84\1ci\95A\b\9c\ 5\19ì~h¹\ 69£PÚldüjì\ 5\102îdO
\16+íÄñ\9f\ 5¿6Âü1\9f--\ eüß1Eú×üwvø¦   þ=\14JCH«\9aW¼3\9e\92\8f&\8cx\14\eÝñ½8,¸Ëà&ºëãÐÔ#Rc\8a\e3Dåvzý6\91\ 1\85RS\84¨yuè´_N/nm÷\ fÙ\83ØÐvTÖÃàòÖ¥Y˼?êåR\ 5F×°KzÁnª¡9ó¯ã\95ÉþQ®æ4ùg\9cC×^Ù5l`\eºP\1c\ܲº\80âýG£&ÿ\11¦¡Þ«`÷²\rõ±9ÏP¨Òñ\7fÔÒ\9eÙ²XÜÊÎrÕ\14\18«\8c
+V4\1f,ùÖ{²a Ø\84ÑÖý\tcY`]lÎÇ¿Ô¾¿\15a®§°r\ 6\87é´¯Ø\8f=bèÖ!ÁÊ&\8dÖÉûYÃb\r\rÓ^[\ºaYt­$w  
+¥êø[ÝÄR¨)¡§§iÛ\bìº[ô{$\99ì7f"¥\98o\v\8cÓò\93¢X\87\19\82p
\16Àz¶BzðÎÒ\ 1\8e'hº\1eO|Å\8c\90§\ 1|-\95j\ 2áÂ
+:\9e\95É}Ì´a«\12\ 3\0%T\17v\12\9c\835ÛÚY\ f9QK¦ \16üd0\v?\88$\98äÄ\87H|õ#òuäD\81\f\11päôh¤éÔrÆ\17dì@,@\17Xmí\aÝ\ 4VK\1c\10É@oò\84\14Ûu\89°(\13\9a´8#!OM~\9d.\857SoJn%< çI¶î\8fdZ\8bó=\9e1ËD3\8b!P#4÷£\93ö(|:]S\10Yd\85\84\90_\90\9akG\92äõ²ïRh¹+OtÐB²«÷%Ð/eýä±\96á&]·h\12à¤\1f½r5\11¥slÿor \9a\ 3\1f¥êÎ\1e"F\94,bÕ\93÷*2~®£:ʼ÷\8a\ 5®[\88´©¼«\8b\bÌtéÂ˦\93\9f\1aíÛ~M
+ªUé6§DUÎeõ\12"udPO:ª¶Ç]£x+¿ì\19 ¶\17GºÿB½®\98\80q:óÊ¥\97'ý:\17¶-ML3\ÑF$ç7\85K\1fà3ê\1e\0CÄô*sü\172µÜzÏFÊsõ'÷Ã\94û¥ñ\v\8d\f\87̼K¤\84Þs\9f\8d\19§æÌÓ\9a\8e¤w\9dER§\94        Ã!`%aT\ fÆãH\97ê\ 2vçR¶W\a¸õSPÚÆ\85TÆòÌ\13}FVArB«\15[\8cïSS &ñ\7f\99}p\1cù\13`Ç        ¦~\88\8fãºÓ_í\8eàÙ1{Ý,yãàªo\84\82\15 àÜ\1eÀ\9fþ{ó30\85é[\16Çb\ 3\8c\f\13\e\ 2K\99\10È:w\9c\ 43Ùã¡\10\a\aMnÞÁµ\86e6\7fò\8fs\1cz/0<xä¦\0&À3©n\ 1jÞûô@ÐÄ\ f¦_d\róKâBÙ\93ü\17! t\añr\8d\81\ f!\816<î\1d\84\95\86K\1fjTÓ;Ò½\95\9e\8c\17\12¥ø.°Zü\99Æ\ 1\ f\8b\85±.,\8eØ68\83M\13Ul\92³{D\1e6v\9c\f¡§Ù@\19)tmp¡yå_.>OGò°"
\9c3NÝÃ|\9b\9d\1eó/Ð'ëèO\8d¬-R_\971Vh&׺\vN\92Pz8de\99ºî\rå\8b\8aZTH;X\82\11\86Ðå\8aQÊ6Æ}\99ñ\98+°¢ 'h\ 2´Ï_î\12\0\8b¶ÆCc\92\ 6\93\98¤©u¨ýHù¶j£BA\8d,·NÛOS«§È{é3ª÷Ñ    L\8f\92è \0`]Ñ\ eç³Ì1\ 5ÆÚ\ 5> Aº¯\13Ç\rªÚ\0rxÓ´ü*E^ÿ.\15¢\ e×Ø\90\86\8a\93Q5\f\9av{`=\13W6ë¼\9fñ\9aõ\ 6®\92ÄvG\13O\9dÞXc&\rvõÈ1äÏÆw\82~êÖæ\0â0\8dWÿ:Ê\8e\ 6\1f\88f\18ª\96:\r0¾/˵\1a\82§%þm\fäKRKåAÁ\1aü\9aÂï\ 4\91Äc\88R %ã   \9f\ 5\7fP\93#CS£é\11\ 1ߥÞfÚmD¥5\ 3Î\16oEx\96\851\827B«¬ðæ»0ìóÇù<&\81Ïæß\ 6ôøYd\17ø8"\ 2\1düw\bÜ¡5\98\10Á TaaJ3p\98\865\9cÛ\1c¹î7îA>®\89\85ñ\9c\94I\9e\96\a\1dMá¯ã½ôcðuüð\rZd\ 1?ÒB\90ê\86\1ck1ÃËÄx-\b\97\8a\9dr·sV\88\869s\1c¥\bH6p]DÎGâ¸g\85O|\v\845\8eS¼$a´E\98`$íLs
+[\95\17¤Y\ f\rÊ~\ 2uå8Áíp`6*I\vß\95Î`S8\82Ì\ f»\ 68s\99n\8eû9O3nX¬OE\v/7\1df\11\95\85lËbNÖ\b[®PBµ\10F¦O¬\82.\16Ü9¬\80\13ó·ïZ\ 5\8fç¾_\7f\1e.Í5¡>¥F   \9bõ\f\90S¹µÌ\89µR×'}ΪѬ`_dÿX\9a\ 6{´dâÐ\ 3HXÔ¾3\a\9aQlZ\7f\ 4\ 2e7Pã©R¡ªq\b¸Ø´³\14\ 4O5¬\90º\81OkZþÏr\9dx5u`a\0Ç\82:\82£\b*`ØT\96)\9b¨,\ 1¬\ 1
+\ 1DPQÊ®²\ 6²°dß\93\97\97¼ìûJÈ\ 6\8a \83£Rk\ 5=H+
+*­#u)£èèh§Õ) \85Á)B§6ü\ 1¿sï9ß¹ç\9e\8fø\e\11ïHªZGòµzçG\92\86ÍTø"9ªÕ3h\8aD×ͺ\f³Ïs¡îr|ÆÅbã4þÅy    ¤$\94õT\11\8fºá\95\ 4"ù$\90×IÚÖ~\1eÎ$\81v(\88BìÖ#].²ïqi\1d\1cÁ\8d\1a?­C°¹N\f\1aù\96ú¯ñ\b~\16úÞ±Ë|\ fìíÜ·àLcO\ 2À\ fnÎö¯\15T~ø³Üýäþv\13x\19\ajºÀ̦5<.ïÇf\K<ÏÞ2pô:\ fCpËõá\95\12\ay,\12\1c6\ 26\91ê>|\az\9fC
+\8c\93\1f¨ë\0\11E
+T\0)ÔÈf/À\95:X1È}J+Ü\aç>¢½\8c_Éý\85~\0\96\b\98éQ\1f\14;Ù^Çõã\86ªvs&¸Û¸>\9c.®k\937\87ÆyZþ\98SÃù:\87Ë©ã\9c\8d£rØ\1cÝ\96Û\9cç\9cåÆaKa\9f\17³\94!l\96è.g5û ð7ÜKv¤0 ì!;\10Ú\97­fï\12´îîe§\vþ¼%\89]"XëTÖ\f\96J3©\baÕªõlwV²j=v\86姠\94αÖÉÞe=bùI/ìög\85H&ü\86\99\v\92:§²°\98g,(y   \1327°>a\16\99b°aÌ8ýËÒ8f\8cöVV\1c\13®qßÕÉ\8cT\87ùµ0\86\15ãNÕö\8a±Ðù\8bì\12ãÉ\89\82ÑåÀ`(\f\9a\15_"f´\98o!\95\fÐt}W\10\ 3\9f_0}Hµ¸¬X\fÎ9»,\89QÕÓÈxÏØÚ=\8e~J\7fÙ¹§x\89\11\80ô£ÿÓ±eç9úM«Ý÷2mFõ¥Séî)×Vk \19¹µö-eZF«\ fFÙ¥btøg0É\15ì¦O?\91\9eÇ\90%\1f7ey\8fÈÚ\9a\91WªÎS\1e\8d¥C\91ÒyÜ\12e\9däUS}Ý\1dñló`a\898\14ï\91®\16i      \88èg"\161лJÂ"ô|P¬KÚ\9dÒc¤,\81¿$\8f¼\8eì+Î&\ fÕÞ\17ÕP\9a\8f°\84\96´GBoj_t\ e4I\vòv\15q¨fç\86\9a(ñeÖ\ 2ßCÔË\ e\b¿bÇ×¼\86^°S\ e\9f\86bØYi1\82Óì¨;\ 2\88W\1fä`/7\ eu¬h?4
\17\1e\86\8a\bï!\8càzõ\9c@#\b(\98ã\8fó\81T\v¿\9c¿6ª\8c\1f\f^ó¢ð\7f\ 4!§R\15     S\94\ 3¼#Ð>E/áSÁq9¥z\e\v/\b\ 1G%Ó\88\190Câ\129Æ[\14Û¼\82@\94(Ù©\94ÝP\95é\vÀ, \1a\ 2¾X\9fT\85\ 2Ok\91\87\19µ\ 4QÈ«U¥G6\ 1\vª\80\r¯x\812¿e\15,¸Ú>\0¬á\8fÛ\r-?\81Ï­°ÊQÞ¬Yzð\ 1/ÑTº·\ fè5ÌFL\ 3É\ 6ä\86^`\83tÞ©\14\ 3\82Ì3ó\#¿¶»¨¥\1a¬ê̬Dðª:¶\1e,\ 6\8cvÓÞÏ\0w[mD\e\16¿¡\85\9b)½ãTB¦ÉZ½\89Þ`0Õ\96`3tÿBQË\9fkk\1aðûs4ë1yÉ ê`ì\è¸\1aÞ¸Âc\8fV\8f\91\17\12z`XÄHhwõA¸\8f0­Ú\86FTy¦úqӵܫ*F˪¤\ 1%\80\ f\ f¥*Éø\11\8f\18µ/>Ó9\v
+Ög\13\1eS'µ"b'zL=Nª)c¨\ e\91\ 3s×*æÈ÷\93bä¿R\88¡ëä÷)W<ü\15#\14\96S ²µç\99\9b)Kê÷Ìý\r£ª
+&¡ô\94â\1fLã¾\¹\8c9\bWËtÌW!\16Y1ó\a\8f\15²«¬å«ä7i*ø%\94\bÕ\ 5þêúwJ_°½ä¦Ü\fîÌé\96¥ñnÁWJ\ fñ\84!pÉ\12\ fåþ³ä-0éT`¿:K6BÆ+»¥Sõ\bÅzÉl\89¯L,~\93³J\1a#ZL´HBEeÛß\88\aE\18÷q1
+Ú¸¬ÂTD}\ 6é­bB;\8dº*OÑT\15CÒnÕ\8dl\8c$OY\9f¸Q\9c®0m·\89z\157Ýo\8a\ 2\849NÅ» |hý\96DV¤[V¢\92eÆÖ©b7É\7f\8d£Y¯ÅZÃ\96\ 4¥H¦Çl\8f\13þ¤Ûä~Iè)Ü»¬J\955§ø¤ÍòoO\96ÕÝ\91ù´\ f\17©%(û\8e,¾hÞZ\90°GøÊÒ¼mR\98d´¹ë!¤ð/NEWutV57z;ÂjôÇÿj\9d¬s\14\ 4·ý»^\92^l\ eDçǾ0-a®û\ 3­_a\11®ÏLíØ\81\ f\8aówÚûö44\ 3ç°\8db^\1c\8f³ppi\87úÌ\15\8dúô\15&nÓXì    ã¾æûþuÆ»-«Ý\82\r\9e-cÎY4\8c½\ 3_\8c\9d´¦\13\1e³\9ag       ?\1cÚjºGìIã\19fHõ±\19ú\v¤%ÿ\ 4ÃJÒ\82[\81ö\ 6%Ï©¨C6Oz\0vWÛ\15zåÑoZ©tËA¦±\98þ$õ?z\80\11°ã;Ý\1eÆ\ 1ؼ\ eÅØéFT\ f2÷/+\98å\1a0\85\11\99ñ@ßÑ@S<@>0bð\ 6¢SëuqÜw;j4SÜ'°/4sÜïÝ\14ÊE®Õ©(P[¿ø\19ú×V\82\18^¡5Æ\8aH\a\92õk\84g\11/´Û\84«wø©û \v0¥Ú*ÜìÖ­ \83aËj\83yBý\bÍ5ÙTC\15\9b\fÅJ(¿_\17©ÈFà4©òü\98!ÕmÙ,\fRÕÊNº\rË?\ 6S\9c\8aü¹9³õ\r:×´Ê\ 4\96Oèÿf¸\93OÐVê×"\ 2ÕµÚ\871ÕÊ\ 5í\18,V)S\7fâö@æ\ f._
+\19Óú°#\12ý\91Qî`\94Kõá¶ò|\7fͨ%cï\98j¨Í/&\\99Û:\r[­øF\83tû^Z\0"\9dªqÕÙ¤Jm\95ë\99\8ajMar×\97µ`VCg
\b\9ew" ~><¡Ã\a\ró\8a8Éièú½µ}×XåT8°Ç³\ 1\7f\1a\86V\1eY<\85Ä<ÏJ=áÀEÀ\13Û\8f7\1e\ eG8v6Á¼Z:¢\e%¿·¶hBòò9\ 34\7f^\99Ô¥m!\1c1\9d¼\88OD>íp%¬HüÙÞGè\ f\87ÙðÄ\18/\8dÃ\9b`rqÑ;¨±N\85mï~MýÓñs§\©\87\ f/\9e\88¢Z\90h\a\9d:\95(¶í¦¥\85MX\9eа^FÛ.ê\9c\8b\8b.\96Y½¬þÏs}\7f5\99`a\0\8e Òö(\83(X0\88\12T\88+JS°\ 3\82\f\8a4©&¡¤~ù\92|i\10B\ 2!\ 1\ 2!\r!\ 4\ 2)$ô\18\ 1)\ 2Ê°\8e\8b\fºØWFÆY\17]EÁ±ë¸\8e3x,\7fÀó˽ç}ï¹\e\9bå|\0\1dd´ðcâ
\93|ï°i-\82¿0ÐWs\85÷
+Q_Gå½pRj\8ayÓ0\98òÑ׿\92t¶©¤ø\ 5j²ÑTÌ\8eóÔ\8d\8aî\87\89\1a\1cD1\ 1·ëÚ\85\ f\10\94Ú\8dÂ\9bNÊ:ka?\f¦øç7\95\93æ£\14\86k\15\96Ø_µ\ f%]a;ë×\96\ f\ 6\14×\ e\95¯F\ 4«=Ë\ f9\99Ô-b=\f&¿óMm0-­vDÅ\e\10'^Çj´Û+µ¡/5(erÀ^õ+E·çL\rF1ä$¨1K\8aæ\95×WE|fÔ×O£\12õFMK¬º¡¦ömèí:\83:1`»Ú¥fÂó\83\8aXýЩMÕ*i\809ÈÊ
+l?+Lw?\17-NxÕÃÍ\88\8dÔwɳ\C0\96óÙç\91\83f  Îs\8dÒ\1c\8aë·M;iÄ\91`°Ê$èö\17µµO\81»\930zú\bÁ*RÙ¹\9c\18\14B9é@Â"\1f´k\81¬5ÏÚí\81\ 1Ûç\1dvÀü~\95.lð³B?îu\0g\13Ø]Ã\14edº\ 5¢\86\85\1cè8J³AÞjý\17­Ù͹u\11mÌ.­ÕD\9bO\96ü^^Á\17Õv:\8by;Á³s\15keÄ\1fæ+,LȶvÖ\0²­Å\9díàæÒ¼\8d½Ø®¥\99Ã\ e\82ÁdÃü\15_\14¾ë5÷Zü\8c¥\83;\1cq®#\9dk\ e>ÓêÇÕ ¥MU\\83ÛJ\93\94«¶{l*Í\9f¿\92Ò\91¯3Doéü¹èyüèÉÂ"UDcû\86¢ÍÁuÍÏ\ 5#H\8a)BPäæit\14èì½\1a/       vÀ`\15Ó_\15ê\8fS\1fÊ\9dã{Ì\15\115mpñPpyÓ=±-2Ýè[Úëæm¸+v·Ï6\1c*.\9dWÛ¿©ÉSÇ\94áñ]\1dã
+^DMk\84\9c\15,2ý.\13\1a÷ɲÝ\õ³Ò!{®\1e\ 2\83I4ßÔ\88å\17µ.~°Ã§ælDc\8bBU\18\bò«\16"c\räj¤Ûvý\82ÊÃöJ\9dGÉ|ÏH`_ÕÈ2ÜrÔÜÉë\84\1d\19§ëæH»³Ñ¥\1eä\r¸§t\ 2ø\8eHHï£\9e\ 1®\86\8fBa\14G\9f     :\82ú\8býBÖf\9aó°{\96'ñª9
+[\ 6\88j¥øaЧø\11ñ\1ae\1c
+\a&hè´\16°\13z\126F\8ddÄy?¢>g¦Û\91\19x&él$¦\8aÙÜ^\9cåÎ:¬¶Áæ³^\8aèøn¶\89ú\8ex-'-µ\10¸\92û]èO 5×â½\14\9cäØÛÎ@S\1cä \e\15U\90ÞÚ\8fy]°Tu \và_,z\8a\1dáWPT\84\ 5|BJ,É\95\1f}`\ 28Çß´y?p\9f7gË¢uó\8aÏ\JO(_Øâ\8ev\11OUue4\95ö\b\bÙ\7f+Q\81±¸\8cbi²?A.jÞÿ\90´Cxy\93\98´R¸ÊÖ\19J\16ì駥þPÕÝt㸲rð\ 4\15\83\14úf\1ad½d$ÖºâFR\b>Pâ¶\7f\15aºL·ñ\ 1\81'î´\19\81\1e\88v÷¥¥äê2M\97Ò\13ë\e*\89¨×µ\ 3\ 5¾\19TÕ]`WÖÝ*ßcDÜ*å\ fûhøA¹e#\1aï"ûÉ\86KO\169öJ\93ùíKL\8bÒ2\9a¹JÍñ\8f\8dçø(\fKgK\ 23\1f\89\8fZ¶÷\16nLåå5\8býo\95\87M(½_ø¸×>éFO\87\91\97ÚÓ¹Gi}<´ÃÄ\e@w¶¬#Ndº\19­\13áÙh\1doo4öY\ 3Ü\v̾¨FÙ¸2¬\85\97º\ 3ÁYÔA\83\9az$ÃW±\84Ö\9c5ÃÃCoplâiÆ\1eÂ\Â\f³\10\88Þ3Ä2\82l\84\15;\85òaá¶<;\9aSç?\0\1fB»>\8f<A\92Èa\94\18rL>\89z\16ü\93p\1er§j\13\96Ðs m»ß1tôZÏcÌ¥\8c\1cë{¹\10\94\87þJ{\99Äcü*Í#»3ûóÞ\80f\96\ 4Ï¡ne£ãæhú\9c-»>Bc9S\eJ ÿå"¬Õ¹O8á'\958\ 1\ fÞ\80 `yHÉϤu¼-\9c*`\94·  \17\ 4\12x[c')OyÁ»ÖÐ\x!ë¯Qïñ\1c­S9q<o³c¶¶ô ¦\eWSR^\ e\10\bÅ\ 3¹[Hî¢{ØeÀUÑò£ÿ\ 6\ 1!.$\8a¢,\1a]¿\95²¸(Î\1aÁ1\17
+Úoe¹*óë
+°pù\87²}¸÷²ä\9c%\84á
+Kö"\12G²*æ\ryE\99\ 4¸S\ê¡#§\8báVï9¿\v¬Û¦2¦4=µâ¬ÙZH\1c\85\1dW}dÃñUU¢ù$¤UúÇ\ 4\90>*\10;ÿ$;Éd\1e\7f'=\96NYÝÌ\v,|ܶ\1e3Û4§¾\94ù±q¦T\98=©ka%â´õ\19\99h\ 2±\16\80䬺º\13\ 4ÖU¯X7Fl«\94[õå\11\v\9a1a\9dpuxf¼9µäQ¶Gk4³\13;e
+˸\80\8d\87ß\13\ f5ôîxB:¤y¿î\b¡¬Zd¥Í«,¼`2²\97\1f?_Ía[0\ 3Å~9iY\fFs®3öÿ\98g¹×     ¸Ã\8b9u¤¾ ò<,yxí87\18¼þ©\ 1 ´1\87\91\8b¯¨JaÆ\13¥¢\ 5,O\80@/g½\ 1½ÐOÙã\94\9bÑ\1e9\8d4 ð|.\16\1a]»1÷6ýè'Å^Ô\18\0¹@1'¬èp:Xt\9f±\84Á\80ð\8cwL,j\96ù\1fVÜ÷á¬Qv@àwl\11{έ\9e­Ì±ù¤ò\õ?R^ç½UVÐ\¸G\ 4I\10\9c+¡­¤¯å\9e9ÞÏðäÎD\850×æ»\ 6ø3oæ\a¬yÉdç[\7fR<\83\ e\0\11"\8d"\88\92"
+.´¥2\85}\94\e´"!<ý4t¢H~(\81®-rñç2¢\ 5æ5DºH@ùÜlÚ\18À"K\94»\93\7f\93îæ¿£,\93¼\ 5/S}ÊëÓÎÒÂÊ\12"+ ïÅ\ 1~w \17¥\99«\7f£\8d\97F}V\rdR\81z\99,\ 4¸¨:Èw&?­ÚC~Fq¨ôJ}JÝ¢ð\8b\98¢\ 5ÊJý\92i\17¤´ÕrjzEÒgUÿ#±Úp]ZF\9aÖ\1dã%\91\17Õ+Èþ [íPj\0e\7f\8dwÄVjlõÊíW©7ªà«wRü\15\9c/*\9eð¼C%µ%íj\85òG\80\v@EF\19H)&0_\eý\17Ëõá\15Õ\95Ç\ 1|Xu\88
+D¥¸àRNX\1d\ 1\\140JS\8a\ 1¤£H\87\81é30ý½7åÍ\9b7½3\fC\95\12Wc\ 3+\96ÅU#Ær\12\11\15#\ 4\vaQOL4\ 4E\10³Ñ\99?às~¿{ïïÞs¿I§èªÖ\ 5\11yô?\9by>ßÒ\92L\8eÔÖ¸Kd-Þ£J\111Êv\0\7f\17ñ*fH\r¢6\ 2§à\81h¸æÞö\ 1ñz²+~BÜO\19ó:\ 5\7fIÝøQqöZ³¡UÕ\8dÊ\1dP\14±[à\ 4U\92åD#ÔBMË\7f    \8dÓ>$Π  ã\18z|\94ð?Ìë^\91¢\13Ìó\1f\95 º!J0ÌèW8\ 1\ 1µN¼  ¼\ e\ 3zX\9bòfÁÏØÑ\89\e@\ 6'h\83\15\1cá<ð¼
+%sd\9f\94e\11ï[þ$z\81\1f,¨åZù2ÁH5\9fÿ\ 4\88Ê[&H\at    LÁ\7f\81Ñ\r\8b\81\12O\ 2à\vì·¯Ë<Äu\96ºÉ\8erEð\14\aá¾\80{\bi¼,8+×\9fwM2\17ßÀO\96\9c\\9fÏ7I8\1eÏùi\92l»2Ýewkv"\a9kÔr6±ª\8cU\ 5\¬R\9a\13Í\15*¤q\8f¹oäGC\axxy¨\87\84;\80:j\99\9cY°E)\1da»Ô\a²Î°!\13Xidÿj¸\94\rq(ú ¸8ÎSí\93Ð=\9c÷Úl\8f(\8ePíø9\18Iu\7fe\14é&\16¾å\ 6k)«­\89W1Éþ¬Ñ=k\98\8dZ¦b;8\98zBÈC\8e³ù\83û4\9b«\15Ú\95a¾vþÀ?àsuú¯UuPÝ\1f\9dæ\8a\Vf»>+\9b5Ð2\1f\eÁ\8ej&\85\116\8d»\9auR»É®Ô!
+aÑ+árù\91Òkô!¹o\ 5©4       í«\1aÉ`¡Ì\1aÜ\97ëP\ 2)fí\ 5ô%ù¬\e\81\9côQñ\87T\99èFÂ\11(ZÖ]s\8aö\8b,\94ÔTR\87|O)O?\87¨h\9foÑ# ]¿6\16yÄл\ e£)ôéOçU ,F\9céÙ ¯´\9bÑE})\8dg\8e\14sá©ÚÙ´GðyÖÒ\98\ap/k\16w\ 2\96»¶I'Y¿Ù;TdÀ\1eÜg\82YÉU\9e\95Ò'áñ\83\8b\10I8ÿ@\1aFâ*ð\8b    \948\v\10I¸à\90+A2((²+yª8O¬æÏ\8bW\89»È\97E\8fÄ\r{Õ¢ýbÚWÕ"@\9c\12}@\ 4\89\8c\8atâe®Y¢\ f¢gv\85Ö\88\9c\95\19üHá\ 3Å\10ùoÂfE`áea±<o§V¸     µFÍ\vCÐÅk2\85ÿ\94ýèê*\14 ]v%ë\85¦LËy|è\96\11KJ\82´ú3\85®PºnWê(\14¤ý<\8a\0yiBVO\83ã\9ah\97\17P¸¢Á¡¾\80|\9bîq'Á9["±\a<c-ÙÃ\aé\96òÔ\14p\87ùøæ!p£©w5\füÏ\94êr\13Ä)\1c\13\85ô\81¢®^.\v,í8LÜ\0º·oÞý\ 6¸ÐÒ\9br\1f\907\1dÞÌ\ 1ȶǫ×\0.Ö@\17\15P¢p¼\0Â\ 4ã»"\ 2ó¡ÁXêSIÔ3Ë÷ç\9eÓI«\9c·÷k¯TGmô×Ö\12WùßÑå\91VbÓu6\92ÇG\ 5Þ\84\0ý³ª\ 3Ì`]Oõ¾\8aãZ\eQ\94ë­é&'l\8fT\8fR&"N©!Úv\7f\9d\ 6G{\8c%©ßÐ^}T¢1ð¨v\98\88Ö\¥\a\96ÿ¬¾À(ÏIWÝfê\12Õ*×Ú®\88õÊ\83\7f¤*°î\16\96«lg­³w\b\W¿d?§'ª~å|S6¦|ÇÍÉ\96)ݹ¯\13\86\15E< ¼Kþ\867é÷\93b\aï%\16\94\9bø\17íJð\\95*\Dã)\v\84\89
+²°2«G®\13\92\12\9bBjx$Z-äúµ¢\1aa\ 5V#\e\10\1es¨/\14³h"õ¬ÂK6WZ,\ f\96ɳ\96¢ñÈLü9\19\880Ã~GÞ"\ 1~4ä\1d\12\835"[à\11»âKå\7fè4Ôh¹\8föû\92q\14§¹\91É\95áÕÿ\8e÷F\88ªãa¥Ò1U¸_\90´K¥Äªá)\84âP\våÁ\r?Q΢9\96Þ\92"ÙîzÜ®i$×\ 4Æ5I¥Æ0ü]xÆð\9do\1fܬ¿\8fUJ&\10²]ñ:QS{\1a%KÖßz³ø\ 5Ò×<°\v\96~më\8c\8b\84/7®Æ£ð\1aëi_\89ä\98y
+\vI<\10G®d\1ek~°÷xÕkÛÛ\92øÝ1\8d¥e'w¦7¼¯\98Û²Äò\90à\1cüÔ\ 2U·y­·Êª¯ý\95¤\\89\9föP\94ÊxÛäV©©ªnL"Ð\vN6tÖĦ>±\ 4\12gbN\9b_\90¥ÁÇÌ4Ê!/¼e%¥\1e³ÁÐO;m¯ÅÈht§ÄWv6\90¨º\ 2·ú\9b´[©ÛÌiô¹\98\8d¦åÌÅÁyF\98yÃËÓ4Ê\94aêt\fV\84]ÑÍ\rauã\15\83õ\r¬#ùëÌÎìª\14­QÏY\11m3\14r\ e\ 4Mè/q\17{\8e\19\1cÁtjÈüD»¢\r×7\ 3\86\8a\95f\17ài\1eÓ\b\83¾É·\r\8bÁ\84è\15º\1fÀê ¶.\f\ 4=[ôn`4æ\8aê\eÈqSháæBé\9erÐx_º5wÔ\90\fÏ%ÇènÀ\1dQ\88\16\85ó\82ð\9a~x\93'G[        ×`\1e+qb«]Q\ f\9b2Ô¸²iÃ=UGn\8e~»òç¤\13Ú\8bJÏ(¬\86£à¬ýAݪÈôd«Ç\15\v\9d\16È\1f\89\1d\13E\8d7ªÍKÊz\r+MÿÊ]¡ã\e\9d\92\88\9a!}ïæ\vj\96nh-CÕ¦_èé­º¦Ùçä\83\ e\8aûí\8aò\9ba¦Ù­¬D\ fÙfrÎjï6\96$-Ó\ 44ôn®UõZ\ 6×F)¯Zp\1eï\95×ux'\1cº@ü\9d]U\95ïÏ/ìÙ³¢Û¿Ø3íUg`iUì¡}\85åÚ°ßÛ\17\ 4L¶»W©\96Îu\9c¯òù+ëÕSïØUå\89î[\15¸Ýû;u\95¯ÓÌû¨\84\9eXJ\eP\93\17v§åOâÅ\80©\96{$\95KFÛ,q\1e\83QÏÕÞr¨u\9dÏHìÝ.ûúÈ}iÞmõ\94×ÛfZ\9ah~a¢æåt\9f\80ÛM\97è\16\17¨\85BÇb0*\80ÛiW\15­\1dÎÌC\ 5䶧µ\82¯jZ®×mÙÆn\1a¬\9b\ e[nKfi\ 3\f\8dc¬+.º&oV.\ 6£ô\0&\1cÊ­\9dÆ{\95ÿ¤5\9b_°s¬9\86\7fdë¸m\eÿ\17üIëA\ 1. Í\1a*\bsÑ5:     \821\18ù ¨Å®Ê\rm!â¼|f\8b\97¸l'Û6#NÞ
+Z§Ä>øÿó\ßoM\9fk\18ÀC\ 5Z8à)*\11\a \ 2\ 1µ\80b\0EE@¥§\18(2ÂÌÎ7{\93IÈ"       $!¬\840\ 2a\85=+v\0U©ZÅ\81`-x´E½ \8aJU\1cǺ
+\16\ fê\1fðùå~®ë~ï7¹<Nöz\83\8f©QöÒÉTî!w\ 1\81ò¾ýð\eÅB,þùC)kªÝòE\87¼+\1fç½\f÷+\9fÌ#\ 4¾6\ 5å-÷\9c)£ç\1dpê*ãª\9dA õè\a\85\99¨A\16o\85\8f\98c\8aªc~­\_xbï5Ó¼þ÷À\9e²\ 3z¾g\81QªïuÒ\1a}Þµ®zãGeª¾X~ >TÕSî\1d\82V6·÷¸ÉÏØ\15Øi\8c1\12=\8f\182Jç\9c\86J\1fhê@ UÍ\a\95æu¤;\1d\1f·¶7!³0
+ß½\ 6Ù\11\Óé\86®õý¢ý\ f¬\97«±\13\83%-;Øþ=.\1d\ 4ÒÜeÏ/©TÖ7D\8c$v°{\1a·.Ê«\93\82\1f\b\96µ\a\10Â|ÃZ\8f\13Ñ®³mcDÖ²+-C¤Åu\9d_Ïï{¯>ë1\90H±1]ÿ"\97D^n×R¾\rÞÙº\93:êëÖÜE3\83\1d[²h9¶»¬ÏèÂÅ\f\89Ù7\96TJOW+3\f\ 3Â\9c\8fLimc\r@ï6'³é\90[Öcì\a`Ǧ8v§­ª!\93ó÷b\1a\91RÝ{\95Ð1Ï_\ fÓµåòu\91¶Íoù³P\9dµE°\ 32Øð\@\a;4"\ 4\9bmOÕÙ\v§\16Ó\bÿ\90\ 6üm{·Ä\v\16ߺE\12\131Ñd\91ÄA\91\8d¡\92}\10C=W²\ 3¼®¾B\ 2¶}[3']\PJäG5ØV¯ò\87mnY¡\ 2G\fXyÊahdÃ'J\1a\84[\aU~     v¯óWæÛ\85WoÌ]¼Wn÷G¥n½R°\1f¶²9H7\1fÑѨÔ\11¡Au\vÚ1\b¢v£ö\82ëÛZ\17m\88]lU§rñ\1dÏ\ 5\7fTØV¨A
+sjÊ6l\8ahm\18,M\86\ 6Ôy\954A\88\96À\92*0¤æ¯ÂÛv\94J\96²\1d\ 4RÈ?¨ï \98Ä´>ë\ 2î\17Ä2C\b!\10\1d*Ë#±q0êMJ\1d!:Å\8fÖCö\89ÜÂÀRÇ|ÿdüF¿a?Àµ2Î\1cÝ\82\18Åc\1aÙh3¡«d\1c\17B\9a\91\1e\ 2\9fS\ 6IÎt?¸\a%\82\19\10\11\9bmïëF[ÁAÚãxÁY\91GâÒ\8f0mê;\10GY1űh%[\9fs\15\aá\8c\92\19@\17×9é\rq\81·\7f_8ùG>\1cr\98\f\b\1cíWó¾\13nêå¦Ü\11)jod\80E\93\85z¤Cö.q\1aúJv\ 5i\15N&¶I\1c\afÅÔð8b\9bøg\9f
\rñ\9fv\13\1c\89d¡ò©%:uTÉÓÛfü\91û\97è&òL®\880\8dÑç~\96p\ eï¢èÝË\a.(R½\9fâU
+\17;\v_)§w%$ò\8b\bÕ/à÷\vÝt#é«
+~\12ö#\9cu\14`\14u[ëwø.\96¥qÜs\ 2ï\93¿Æ\e\8bååYì\18ü_\95-\9dþ\87Ç*'̳ɩåßk/§\96\96)\ 5\172*\riø9¤¼$é°7fU\91zÏfl\7f¡\93×cô9}£]´\0¬,í\88\8fWYCÌ\1eIëê÷k\1dSÒ-¡\ 2§t¼y7>\14\91T!\8f\17¢\9e\98<v×`tF¸W\11\8aVúÀ\ e"\80)Åí'¿®ìæU\19\12¡íõ\1a!\9cÖ<À\17¥±\1a^â¾ÉDÖVÅÛ"_W\9fÙí\87\96\99í¼6!\ f\96{Ø9\v\ 4JJÛjÒïi_Uâ(í\99½ùc4*j\86ïÃðÄ>Æ\ 1Ì\vÀä×26\8aÔ\1a\89ÓKݲá\1eç mÄ\ 6&\19c<kQ\0\1a\9c \ 2Jl\ 6\1d'\9bIÛyþT>\ 5\87\95Ó£h\92¸£\8c'\fÙ..+\9cupC\ 6ë\136Ì&@j\935Üt\13«¡\17\99døëÌåêPÂ\e\96\9fô\96=\8eÙI\99Ë\82Ä\96Óú¹ä\9d
+ú</ÇÓB\ fིY%õ\17\ 2V(ê¿\ 2\8dq\ 2\e/ܦ,Ç\97 \879(B¿è0j\81tI4    ÓS:²q¡\9dÔ\99ì1\8f×\14\14h^\9a\94ChhCÈ\14\12\ 3\1a½F\81ÈõÇæ( ¬\ 5|¿|\1ay\8f0%o:TA\1a\97\vBîQ\96É\ fyPI\¹;hVÊ\93\8d×ã2J
+Ä¥[\91Qºr\85\ 3º_k`ÞÇ9h\94\88\19 "?7æ<18Ï\1a²\9f\94ª~éþ\88Щþ\rt]Z*7Ö¡Ò^\99¸%A\99Ç\8c#òµ¨ðÒ7L{Lu\89\ 57]Ä\8cY Lê\9f\ 5\ f\11î\14\17\ 3;
+ô \11i\9b\WkIý±\ eS\9c\95¡©y!KC:\9b3\181hZÅPf:¶ß\84ù\8a\84\1f0\92\83C\81>C¨{\18Þ¶$\ 4tR:(Ï­uO¹Ö\1eR4\9bÞÜâ$=\8dðjl¥÷¡Äuq\19\971?פþç9î\94ùSèi|cå\9dõ\17qÎF!¨_z^\9eS\1dÂêK}¡\9f`\8fd¢%DÎ\13T      í\18w\1dV\9f>Å;\0à¿<É'\92V\ 6=\15\90(è5HÁ%jú»\ 6à¸WMÑó±\85\ 5VÆ#àß9ÛY\91D2ÕÊÖ\93\eÒîp~¡\9e\88\9eá~J\1f\fÚÉ}ÎD»]á\9egN¾Süs\95jJ\ 3m\83n\1f-\82>,v¡\1fg&SÔL\bëlê#\96\92ã\17íÆ>\9fÅÝ^Åiææ¸á8\10®ñ\9dÊ\9e®°%Ùñª4'É\17ùR\91\92J\14D\93Ãh\ f\ 4¯RN0hBëA0ó\94(rÛ0K+úaõ\ 5æ\ 3\91þ\9d\92²MõÀYÙò|"±E¶G¸\83\8c\94E\13_R^ÉvÁÏÒ4²/\ eì¢?\94ùm[˨\95y¬N`ØK\1f/5[\99\187«1äÁ\80[\1aG\ 1\84Ø\92\ f'¼ 'æé\93¯R\1eªGöËhqê­\81\1aÚ]Õ\10ø>\8d£úiI\19\8b±XÃ
+5\80'\94\ãG\13B\8a     \84\8dÄ\87\85ÓÉÎd\83^\12u\95ò¿\ 2x +\95¢ë\ 2[¨^Úá%e¸\89       ¨Öªúp»«\1axEÀò
+\1eÀ \9c6\85%!ItãÞ¨@ò\95Ò¾\0#% Ô\a\f§¸\16¾ß\e\ 6\ 2:¶é\99*\0\8bh$rßà7שð×\81«55\89×\88ÙæÕ\91'I×+\13\ 36\91Ý*ЮwÈ°¢Ñ%U\94\9bzDá+JÈtàü \9aBùa\17²UØ\95        6âíøñ}\16ñ\1c\11¹uOÎ\19rÆç7¥ñdôÿïåP\98À\9bÂ\fþCu}FEuæa\07£R\ 4\19\ 2"KS\91ª\82\82T\91¢Ò\19\b20\fE\18\86éåN\9f{§÷^\98\19\ 6\10Ä\1alk\ 3ìëÆ\95$vW\8d\9a(¨,¢F7\96\8db\fË¢Ã\9e\13¿ÜOÏï¼ïyÿ÷¾÷<"_\96³)\93ÖÉ.kîh\98àÀ[n \829Wñ?gÜçÚ\887¢ºy\eÈ\99¾*¾\9côöÓ¼\82uA@ ¾Op\9aáIäRù\8c\11rPý(ó$e[i<ËH\9b\97±\90\8d¦££¼Ø/\80\ßt®/ýâG\ 5õinQ­Àa\88\9aq\96\12Iïaî¯{\ 2èYÊ\92\12\ 6\8f]\90\8ee\96°?D\1a\98§98ß\99¬çìéy©­d\ 2x\0,¥8¡?\93½¨½Peí1ÚN\88W\8c¦wAíi\1a\0\82N,»\ f\fBçà=Ì%P\97K©ÔÄ\1dò~þ\ 6Ò\88\9cGò!OʽÑßR=e\92"!Í]:\99:BûIê\\86¢MJ1ðj Gò\9bK)\ f\13b\f'xL"W?D\GêÔ\9dCÃÈ{µæÂAÊA\r?u#U Þ\15ñ\e\95ªÆÁãèUJê´òÆÃ\1cǹ\97      H{\ eÁF\ 4[Å5h\92ÚÒ[\18N6\98á){((ãÛ\b\11%Âø\1c>\83VªYâR
+\anñÖ#Ü\12¼°ë(a\ e¡«\13\81ºFìq\ e\15ì&mqü3%\97\g?\10ñ%ÙÓ\86ñÙM5«\9f¸\94ø¶X\8bD3\91b$Ê\81\1d\14W×ö \9f\8b¡\ 6öÆ¿\8b\8f5\ 5\94D4Ó®K\83°ã\1e\1dØá\8f\8a\v\88.
+úë\1f1Z\ 4\17\1aë\9ao
+^`ú\90~¿`Ç6z    ëq¯\13©Â\v\84ãaX\91\8cø½Ç°ø)±ýÓ¼Ü\84'À¹84\90\fn"Db.\83\ eâ\9dÊ\0ð\1e¹yC<\14K¹³ú\fd§Í\ f},ð§õ{\9c\17*h\1d®\1d
+Ú¸»h\17è>¼¹ôwMv^\vcö¦8ÞIÆ»õ(~\bóÆj?¾\92¥
+eðo²®y\1c\86¨l/\97\82Dl5¯\80ú\9eãŻרãpùy\151\9c\1fùÎܣܵü\87«´Ü^004\80{\16\fñØÃï\ 1í.\ 5\1a\99·%CÔ\18\16A2¼ù2ë¡dÿWuìõ\92\9a\9cQö>\89oÂk\ eL<\1cÒÍ\1e\11ßò\90ò\82Å5.Å¿È iñ\94f¦¯fh³7S­ñ-ßÉ|¥^\96³\8a\85\13jX[\95wCòY©*¸\a\9dsG^1­V\ 2\97ä+À\aË\83\ 6\80\ 1\98\85åó\19·L³²·3\93\r\97â/2y\86èà{\8c\a\86¹\1e\8dì+ò½.Å;Cçt\82äJ ¢}¢þ\rÐáô-³\ 2¯\1d>Ù«\19y6q<\83Á³Í\v\16\ 3ý\96\1f<bØsä
+\97b\16k\ 6*\7fÄ\89Ô\1fª_Ö\1cV\83è¡â\1dê\88ú\8eµ«Tÿm\f\8c}£ÎÇD\ 6\b5ï1o¾øU³\0ëÿQ\81u\f¤*°n¬å\88Ò¹¹\1cõD\19×ÔU4®¸Û|>£W±·åx¬Añ\b_\10P¢Z\81\8bQ\12     \9fÞy¡\14ÀËÍØ1ì>y\ 6î\bÊKö\94Ð\\14.ë!¾O\1f\97qÈM±î²\1e
+\140Cî¤l\85\15ËçÓ\12];¤S¥k)ÃÍ=R\ fZ@Õ[É·ô5\85ù\12\1d\90\91¾JBe\84Ç\90$\ 6Æ\ 5ÿNi"ã0\f-\9dúìR4H\9cÅ~\809.\ eâ\98«|Dϸa\ 5\0·-Í)²r\7f\8f~"êåeùo\14MòæÃÈâ\1cþôÝKÝ%4      _7ý"\14\8aÂ\91
+QD~\9f0Tä\9dæ.\18\17¾\8c>"x*\1cõO\10¼\11>\81é\85§\85ã.Ey+HVy55\bR\94\83\95W\ 5s\95éùÑÐ\ 5Ek*\1dêPxEGB\90ü¦ß;(J\11\ 4³\vXâéµ(8h©iqãmh¹\91^\99\vÍ0`óö\80}ú´\94_APW\1fµ\ 3DèÒüLü£Z\14¬\eÂ\8b\a]\8a<\ 1\96·\154âÁzGÖ¦\e`\8cíoy©ü\1fZÃR\1c|½u^\14\8a\9fg\99ôCð\98F#Ì\ 4n\15\9fr)ÜÌVaå\1cô5ëƪw\88\ 3\96\8a\9aó9\b³­nój®yIÃÁÅtó¶Æ
+xI«®1bªIyâ>}\95\82\9b-A\96ðÚ¯ÑÁæ\ 5õ\13\bOShã\9aìKF\ 4¦xµ\9fá\126xq\86qQ\v
+\8e3\93°SóU\84\91\9b\ka\11Æþæ¤\9aÌ©ÌDi©~\f·?{\91>\90\90¾J¯3\13\8f\90ÈðZ\83\84øtªÝÔ\ 2»]ªY §\91N¡ju]äÉ\92ÍÚï©QY\18ílZZÂs\8d\88\1e\12NÑ´Ñ·À\93´Wé>S\8dã\14§Ý¥0\7fÕBÌÂj»æ\14ëËâ\ eõ+Ö7ëºÔqìÒ\84fU7û»ð\99ªmì  ¸·º\9cÝ:Õ8\8aÁé¿^Ó;õ#ðeÕ¿Õ+ \82â\19*,Ä_ç©ì\86ôñCÊY\903ì®â\12´\1dî¥\9c\aõMå\ 3ÿßS\9aªU*\99¶ªLùXÆ.jQ\86È\96\14_I¯ÅWË\ fJ5a"9Rª\86'ÈC¥\e\y׳qH)ÒåVÍUü¢\1d-Z®\bÖ.Î\+\8fѤÆ/\97\aÃ\12en\9a/|F¥[\95¯?S âPk\0r¿"Ô
+\16^\94\17YÊ×>\94\95\98ÝV\8eH\ 1\139\f&ya\8aòùI\82ÖxýQÕ<èzU1\\96µ¥
+Ù½þl§\a*7ù}û\aô±hu;Twfa^Çåúcn²Îü\86YS\rq;)oZ¹uÞG\a!öuTÕU¬Orþ§\81\9blk;ÛH\8fF´-Àx/,uþ       sÔm¸í>fdêä}é+]
+U×.oÊ.ýÕ\19\88ù=·Ûq\1a»-y¶]\86[\1aõÌv\1e¿iáR»\12ßçîgëÄÿk*ï`/p©êþ¶LBué\1aû\18±+çºÍAº²\ 6ßÚ@\1e\89Â[»)\87\ 2î·&P®¸ÇY\ eQÃ?æù\98iåm/¤\8bK,¶Y\0*g\85u\80±(iÐ\ 22\ 6¢`æ½ÌØ\80VË"f¨ûJS\14sèÓ=\13çRU@ë\0÷»\127+ÄËÎ>d\89ãÙ\92\10¦§¼s\91m¦Y¼á\0\9a)\96wÉ=U?οþÇ3D¾´\12Äó\8bí\96\fqjv¡é\998<ñ\85Ñ!z\1e\19gØ)º\12\10\15ýì^ª[$zð\99RYjTõÅËÍ)ªÔ¬1ãcå?\12M\ 6\852qÙ=½@éæ? \a\94\eÜ£5Ûew?SIf\83q´ØÓD7þ\8fÊú\fkò\ã\0\1eL\8f24\15\10A<\15D\101`\15\a (T@@\b+\90½\937{½Ù\ 4\ 2d°IØ\81\b   3*8\8aå\12\9cÕ:@-\a\aí\11m©âq´*îÊå8r\ eà\aýþü><÷uÝÿÿݹã\\95\87id\8bÈXmümÍÝJ´ñ¬×ÛJÇÊö\ 5\92²¬"§ÏUú\9e\1ej\16b'm_\13êz$bï"ì¶uOì÷ð\1cßbûMÂ\14¬q_'Ñ\11\ 2is¤äͼ\a?M#mp_=~müù=ÃÄ°­§í+È¡ë\8a:\7f¢Lùâ;\ 548lÈþ\ 3m\ 1\ 4\ 3\1e3ïå\9f\92-mÛ\1e$õY|H\97\99nÚú]ÇcÀk\9dk{>3Ç×½}\ 1\v\ 5»Ö1Ár\86@vÿÁy:{­EÍ©Ô¡.\17öÞ¸Î\ e\8f\88®¶~\9eCH{k\12\1fâsÆv\9a_\ 3\el\8bæ¯\81@\9a\94"ølûO\7f\1d."0\ eÞÆ\13§Fl´]\0]CàÖ\14°Ë§²Å\ e¾\81\9d±Þ\ 4M\90Íf\88ü\8bi n´q\15\94Ø˶QÅóð{Ö5ÊìàÇÍ6e\8d\ f\re\vl¬¹[I\82\80u·ÔY_(i«»&;¶Àª×t\84ïo¾¢é\r\1eØ\1d¦±ù¬¶\105\95°k\96ûÿßýÞZ§ü\91/\94¿\rjÀÆîj\91\1aÀpíî~Ch°Å⨿íãÜ䦿\aëiRês!Gª-\85¹\9f«\94\17Ö \8aªØ5Íõ\15Åá\fËÕ
+Çàâ¦Åå&\1fwó«òïa7\eW\94ÆAÆ«X\85æÏU÷\bî\11²Ûr\908\84Î+}E)ÆoV¦Ó\83\8c}ÀqZlú\ 4Û\ 3h\88\19gw®
\88¹\7fA\1fæ°ø?ï=\8bê$ù6-ÁÞ¡|,)!<¥\ f*\16\91Ç\98*z!­\95³8íß\80\1fϸu\94ùPpÕ\ f\0ÆD|èÅ\9c\16\90eÿ=s\98m4' ²¹Ò¢÷ؽü\14Y\ 3aPøOZ(ù\84èvj?\8d\ 4VGÜgxI=V\1e¦\1d\96-\83\1e̹¬ u¾MCJÆëÕH_é-C\14ª]ö\8bÔ\aûB~\912A\¢8\81°\90¯*÷E8PóTª\95Î\94¯To¡\r9/Õ\7fw\84¦Äh¾©½\93\9e¨\89Óý\88ü a\83ߣ\ 5\9abòy\\9f¦'ÅF,Õ\8c\85o%¯ÌwðU\13\7f\ 3Õª\97äßnëMê*ÁÖT Æ\8b{µ5\19Ç\8a¦ÅÖìÔ¢TÒ9L·¡;y\f_fX\11ÖD\¤ïóuÀ¿Ö·AÅêõ:x«"\ 1¬)¯V%\8fV/*´¥]1\95\88Î#\v\8cÎÄ)Ô\8b\8a\9eä@ìX¹"Ì\e\1fSVåÓ\85\93\97\99¡4u¢.Éf\88?ÐÜUÕ¹k\9d%¥àNj´ù¹È;cº~?\11\9d]PÛºË\84áWßÞÒ\8c=VÕë\93\8d\8d
+E©     º\1dÖ»qd{qÕ×\89Ï;\92
\11\1eÂæô\91\96¥\84ÇYH\8bd×fttcâ\96\18\fÇì»â#&®v\1a\8aPótQÖ\12Újd¡©\8b\ 1 1ùo\98\røù­ì\ 1R)\81ʽ@}\90\94Áï\ 6<7õ   ç³&\97ß\10è8³w¯àyóyÒb¢ÌH¢\1c¦04·è\81ôÍ\82\1d@>ð\0o`\r°\95\89µ\9c~î½M\9e<¨Àa9\8b\8b\10úÎ(Éèn\17\1c\8e\85­°\11c9̼4òß<\ 2o\98\96/\88ÂE1î\8a\9c\12\94Ì÷â\93\eáì\10É:ïã¬\1aÉ\95\19¥Ô7e¢þ\v®.{\8aó\93\90Õ\87\88Pi        WEî\97\8e´xùÞ\9dr\ 6¨è
\ 2EJ\857\1c\88TöÏæ¶Ù|4ë\1fê'¥r41\97\9c\93\84ãæ\9e⬠nÏsÆÌ#?ÊCÅ\9bhkòº6\1c¤/Ï»¿¬\97\1e\977\9b\1e\ 5n\r\8c\f\9dáHIT¶\83\81¡\82c6èß±=ð\ 1z\1dz!ñ?z·¸_)þºc\e¼)¯uÚe\89T»®}nSê3ÒØ&iq4r¾\91¬\8cE¥UÂYÑX\ùKÔ\ e\ 2¼ì\9788IXú`}7yIi¦×\a
+¢ôSëÕi\11G\9b¼\8br3\ 4æ8EiÖ\85ú$f\rú·ÚÌl+n º.¶\92ð®*d}0QeÊó:F\8e¨\9c\9cSµ¯S\94í\8d\86Éô°Ö¯äSȺ\96\ 2Ô~\8b%;\0\98\14\e\8c\1fl0~{\89à^ÿÞ\vKbV+æT\r\86s\0IÓÛx)èoe¯øÏqÃÀra5),k±x\15UõÝ\ 1°\89Q\18"\97ØYNîפ\83¬¡ÙܾWu\198GøQ\87d\9d!\ fHû9í´2\ 6\94'\ 2Â\90Ë\ 4\81¬31cÂC\ïà!Q-\7f\9e;Uü\90\9f\14\r¦dÚZ¦oá8CÂN\92T1+¹hÚ\9fl-?63\88\8b\12zÆ,å=\16]\b\8eàÛA\ fw7!\11üz6·û*\aH\7f\8a\84\ 5H*[|Cü\91¾_\12@m\a\ 6¥\98ô\8f¬s2Uôr\ e]^\b\a9\8f\15ñnµü\ 4ÅÂÙû0¡"\9e°PuTó\92t$\87#:HõÍù@¡Ð±jyúb\80¯~°=\81å\99\9b±ö*\8b\9dkuÛÄUç\8aæ¦Qî\8amÓ9æ]'pu\v\84\1d¤\97ÚÛd\80ºSÛ\96\16Hgi\19Û¬\80\8b6r-\ 2ð×\ 6»>`Oi#çTÙ2´¥"-÷!NSn\13\ z\95\9d$\99É\ 5¥\17S\19ÔC%\93QïèÉ%;\82þ¢\a\16O»ö±z\8bcçT)!ûM½.w\ 3f².Pà\8ao¨1\11\9f\90æU=B\9c¦l1åFá©#F0HD\15\1a\93\uÌ\9e\9c\99uÜjQ÷ O5·òu8\96\ 5E$\11®7:"âÉÐ\86¥\91ï(Uu£ANägulW\7fàYEã\9c*Z\ fÖ"cT\\89\19õ\8ak\97öáTx»l\8cx)\99$\9f¢<\8chTÂè'\ 2,Ê·À\r\97ãêóÌy³={V?$¸N\80)ÃDëÉP\8eVl \8eàìà¿\18Ò]:é|ædø\84Ì\8fã\1fà"»Èíw1*§¸=3*gB'æ\12\19ãòë|\a\96'\e#ÐsB±FáS^PR\938\86?\1d¾
+$      mþ:ð¤è\a\17\13\95Ïöl¡\16ÆÚ(è\95\899\vEa,\b·_Ü\8eiàÇ\80/\13O        \ eIýÂ4Âa\19ÜßS8!ûÙ%UJ\92õÍý«à8C¢(\94&2¥J:ð;{»Ê\ f\8c«~J¸ÂÃådméâ«rFW      ø\11j\ f\17g°Yý?ªë;®©s\8d\ 3\80\80Ò\1a´\8a\80Z6\F\14q\80D\1c,\81²ÃH\b      Y'{\8f\93ÍÉ\1e$a\13@QÜÞkÕ^½÷ºÐ¶\8aÕr\1dõªh¥Ò"jÅ}+\88mÁjÂ\1fôßóy¾\9fsÎû¾\9fçù½Ó\99\83°D]Å_CJQw\92\ 6)Áê/ʹÀ5õ®¬×´2µsµ7\1d§v\86½¡}§Þå7Ä\rT\7fëVÊÓø\18S\14¯\86\806~Gú\84\94oLF\1d¢ø\e\fYHÀ©\7f²\8aKmÖkÂv\ 3»õ\16¿~öUÝô.+ýj\1a\e\1ep\8fâo8Æ\89$Â5û)Ô\R\8b\8d\91¹\9d²´¾(ù\ 6àgÝ\13\96H¾m}ìw\945j\9cN)
++¶¢£\89\9b\84Ûïü\8cp·vO[n\99\8eHj©Í\8c%=hº\95\f\92Ï4\ 5\87^"\11\1a\8bý\18l\92q:i\83\93Òç%S,\98\8cPîÀûË=ªÆ\8b\aäG°±\9b²\15Tü²åï\94\e       \87B\86ULR8LW÷\98äê\eÒÏ$GÅxL\ ecL\12S\83À},ù?þEÑ;ð8Q¿±Eª$?\.\94e\ 3£!&¹\17õ\15¬K\15Kûç\a¥øJ¬\14ø\13ÛéG\84\8bÈ7°\7f\88|\81_\vÿ\10\8dÒ\9el8!>Ë8\8eè\93(Y«BæIúY·`[å}ì\13®.úB\94Áõb\fÑ\ 4¼T\96²ú$¿\90=U8O\90Éŧ\ f\v\13y\9d\88\10¿-x¯ð$\7f\18¶]ú¥0Æý_Âù¬
\1aj\1eû\88(\15³\93sO¼¤À\8bûH|/=\8dwKR\9fØÁ\97\83\ 1Á\95¼ç`\18ì\vp±túl\b>f\ 4\ 1\ eÓ¡\9c\8fþ\81uU\89þ<\89=¬T­§s®(·&zpK\94½A?sLÊo`N0M¥q+~*m¥î-¥\87~F7\82^ÈôÓ5æ\83¬H]\18ò${\9eö|\ 2\9b-Ò¶\a9Y&í=X'¸V£u+^\13°Ï\96Eñ m®ÿ²
+¤·Y/ç\8d0\8eX® c\98Í\16ïøAæ\90ùdP\1ccÜü_X\a\98ª\r\99V\9fRx­6²\8e\1aÔb¯|Cã6\87å\91éÚÆî´^FeC]¼\85¡oÀ-¾F?f7Á\98 Q3éVÌ>Í\9d\12y­Fs\19õ\b\95£y]\15\9fݯM©F®½¥íÁÍ\8a¾£\ 3\ 3^\eNÕ¶¾¿I¥\92\ f¹öë#F\9bZ\87.À7¨¿Æ\86\96Qêfã®eÏ«C\11J×n®;Aj\88\16B\fJFÀ\80æw
+îýmÔ\97îê6êÕt\9d¢\94\10\8eã(úI5¥be\12E\91\95¨l ²×X\95\13ôè¨Q\95\85\ 1\ 4´¨Í\8cô\ fõ\1c\99û\vi,)\856QS \831zJ\8aezVBf\9eì\rÛ¹ú¬\9cʹ\12\95/¿Ëí      HQ8¸9\1fê\85SnE%\8aoòþ\87-\934ðÇ\8a±`¤`,£\18Ü)ü~u¸t\8eÈ\16yQ\8a\17\7f\ 4\1f\93N\88º]çvØ­\0\81p\87´¯\9a+\ 2e\84"\93x©ìææNñ6yä*µø\9d\9c\14©\94,\93\a$'äx×\\98Îç\94\8bÐQL¿ \17º[8.d@}\9bç\bïCõÉ\8fE)\10\8d\b\ 1\91à\aD?@æ\99¹\97\12ÀÛbîÄ$ó?7£
+       \82Y¦ÞM\1a\81Ðä\95\f\bN\19­\11|\81ÙØ\ 5Ï\13Ò\r_ÏTd'wa£\ 1}\86\17Ó0Zð\84÷\93ãî¦ùü<ûÑä9|\95Ý3\ 2Á\ fµ¯\86Ã\ 5é\96\973\15~o=§ØY>Ûú¬l0Wb=P1\89ÜjmE\8f \82¬\ 3XòR\1f[lÍo¾uv:.öC=\8dæú;.Îa.©\9c\99á\98S[þnºW\83J\e3\9dÇ\9fNì1='\XrÉü\968á»Û²\9fè:KìX÷»j¶\e\89e   \86\15\ 4\80a\11ép\1aÂ\0£´%z\19"¨±K\b\861ê¤ï.c1õÉ\87z\ 1É­°G´TàRi\92VB\93eßÔò\18þë\0-\9d)K@iͬ­!÷u\11ì@_\83\ e`»&2\88q«ê\vu¿p\90%\ 5P\0\97\97õ\1a
+áéS­Ð§|NüWP´ !\ 4\80ì\ 2¢o-t_à\9a\v\8a\83n\85y­úV|¾Ø¤ö\93è³\90êe`HÊ\8fêE =>\½\0\1c\ e\89\80¯|ÑêcÒ\8e\99k\88IS¼T!\8b\ 6\94\85ª¦Ì\ e%Gu,%[IRý'®ëý\93\93Áß+#Tç}mÊëê\953\15ú \ªï/\12Êßê¯df)\82õ`\8a·ü\95n2\8e#ÿ·î\°M\8eÖ\aû\96(ªµC\7fQëd¹6f\91\97\16\97qGö®\9eµv\9fì²µ).Z&²æ\ 4\13¤w¬I¾ùò¿\19¶ÌTe{Ú\ 6\8b\90¹õ­¯JQéæÖÂòÜ\95\9e\95¿E\m\95`\16\ 6¼p\96`öÏÒ´ìÁÚ\éz\81[\95v7OV¤o9Ý\9cQõÓú¾¦}ÕØ$SSFMW\ 4ÐdÂ\17\ 6Üny\84ï\98u£Ñ\8fà:\15¼    ·*éo\9c[\93\9e3Ø Å\ 3ëý\1cO       ¬\15·\1dFRJø\88ã0Ù\18ÐÕ¸\9bl÷ô¶õ\ 3\80\8dL+\ fû&ò\86\1coÛEÊ+d\8c-\8f
+­@Ô?¦ý\1c^f\9bE¿\16\90ko¦oó\fyÉÜíJ×Óó«8Åz\91\89ÊΰÒXmi\fË\eö¿\96\v-\ eNwØ}\8b\85\8b\84OYÏp\1ez&\98@>ÚÕg¼ÝªHcþ\87 .«Ã\f\b«×]7M\8aü\11£¦z\91#\8c\8a\ 6àÃæe"\93\ 1\ 5æÎ\ÃÂaã°ì@Ö\ãqyºJc\99\\84¨3Ü\94·\87Á\fÍò½ðý\86\ar«'W§QVüEá\rDè|¦ÉP\ 2½L½­\1f\87\ 6\10sõ\h_h\97\1e\ eí\85\81Ð9ÏZ-\1c\12ÍT\ 5\13údóÊL´>˼!õ\84îWS/b\9en­iAè3­Ö\14\ 4\1fÑ.1Fx\ e@Ç §3UNåN^\ 1nýPOZñ¦dÚ\ e t<¦jGLyÁâs=\82\8a³>»v\ 5W¾O&\8d-8×\9as§»hvöö\87eSÈ\89î§\15\92\95`wPU_´cÛaÌéÅ\99Ý=Õ·}öm\17`«<<ì\83$\95\15»UV×6\7fÌ6dòÖ\ 4ìÁ¤oº88{ÔÝηµ\11\81çºzkG}Ú»®\10\8a<<ê7Ó\õÒ\ 3Ójvg\1a!5M×Á!\ e®\18w\9e&\97GmpfS¬\81ÙÎg\80·O\9d3\1fx?\17Ì÷Ø
+wZs«LRûqê/ë~l\9fK\8f]QÓVÉØ\10¹¿õ:ÓoÑïmùÌ<\1fQë'ÌÃ\1e\1eÆ\v\7fR]çAMXy\1cÀ\8du\ 3¢¨\f\bº\1c\83È©¢\80\9cá\fä$÷}ß!ä \a9LHÈÁaH8\ 4\ 4«µh¥¥Ê¡rTtD-Å*\15ÐífY]]wu¤®\8a¢²®u[bgÚÿßgÞ¼ß\9b÷û¾\9f"î÷ÕȹÚÔ \19I\ 5\95\9d\8c\7fØH\94\167\8cH§B\ 6\1a\97H\7fðu»£d¿t\18ë\1a\r÷\ f*µá²²=e¢\81 J\8e¯t\7f­j\8e\ 6¨¾       á¹#T­¾\95ÎIõ/\13¨¥W?þ{\ 5úÎ\9d¥¯O\11»^ë\9fÆ'º`ú·\91£õv½'$»^®\1fóEÖ=7¨\7fIÉÜßÖ\7fTF×2˵\94­õ7-¯â^Ô'Zú"[\9dx\v;\ 4ìü\93Åæ[U\8b\96\94þQ\1dyWr\erÛ9\86õE\86\e\97\116cà\12\12y'\81I§ À\17\19g\19\ 1IR\16\93m\8a 2\9b¹¯\0Z½Q¸¾ý\16´
+ç{0\b\19K\94\18,è^ÊH©/>\80>G\92\90@l`á\97T\1fîë=FZ\8bàÓðnZ¢H      ¨Ñ³$\13m\9e¯\18鵩\90K¬AÝ3D;w³¨\1a\9dÅ×\127â¾\10\8e\14Ô\11«Å\8f\91^J<á«È`i$ M_¤xÐò8w¿\88U-,ì\13/h\13\12»p\ 3bPê\8f÷ 1²ª|\ 3\ e*\7f¾k\f_U¾;ì\0Á£\ 4\ 2\9345\87ü²\92\94jûõ<?Õ>Í\b\9aç_\80:Õ]¸\1f\91$\r\1dÍ«X³+\ 4éè\vóÃMiw\0\91z{\13\94Ñ`\13fO\eEêÃù5F\12o´hÆX\84}\ 6»fLÏ}\83¼k\ 4%ºJ\8e\1aq¡_b£\8c_\0\86ôAÆ\7f5ú¥4WK­àÌÕ\ e»ª'\17h?É\ 3\14:lÓØTH\83mm.     ÞmÕ&Æ"öX7\85rÑãV7à²Þ×\14ï\9eß\al̨b§]r+\95\vÙOë¯pKó[\9c{0\83EÃuwrf Óµç\12FaëjCC\13P§k®\ 3ÆtïM»Ý»\92Vwô[FRç\ eû(¥YÙ-Vî²¼åÍE\18\11\91\99Ó       Á»ÿ\99à\80PÜð?¿)\99p>\aÜÐÍ\9bö5\98 #\90ÿT\81ÈtäF%\91ú\1e\93ÌÑ3ª      qh\13k\81ü\ e\94Æ\r¡;ã`¼LVOp\17¿\9c\83ZìÛ\93.\rº\15Ûj¾\8d\e&ü\\1eC<G\ 1³\ fPêèJÔqz\ 2K\9dmd
+¸àØA\16\99\7f>\18Ê¡    <¿*Ù\19g\eü!½°r)JÌü\8b¼\15\81³\96\12&x§K0äNÁ\\16\93úB¼&æ\16­£Ô³¶\87ù\ fï$¥bÔ\8d\177\bf\8dùp¹è¤t\1e\ 5(Å0ú±HÉ\1c2\8a\80\97ª3\ 5¤Ó²G1\81d?źµûè\ 3
+ùbßVÖ\86\15|­°\1a®\16ÿ­\[æ\86w+\99t\1aj§j?b7\96¤öÏhÄ\ f«§wJñC\1amÐmê#Íb.\e^V÷ä\16\18\96Â\ 1\ 3DR\ 1¹b\90Ñ8\b¥¡\16\ eE]4\9cJ\7f\85\r7LGÏc.\1dX\1ed£°\ eà¼/ÅaÏ&Ú\8eè\fù@\9b\7fé¡¢\1c«\98z\ 4\16Qu\ 3Ö\884T\81Òq¨i˽èèbË\95 4ù3Ë\7f½Ê~,ãyý\amoθ³[ü 0þ \98
+\80l«}   û\ 4ÞTóCÚuäLõBt\f2¿úZÐ\ eò¬ã°WÙ>¤\a´EhÃ@+[\82Å\98üê¦y\8aµÈÝ0\a=
+ósç¦U"r]á;îû]\81\81÷(üºÌ\8f{\85Ó\7f\82®¬\18eù ÃE=\9cm\98\10òa^2þ'\bF\10Kv¥~.ôÐ\9em\9f\13µ0O­j(\9b\16s¶ßº\9d´\80\rÕ\14Pk\b*!\93þ3ù\1cIËBЦ\8añ\1c\19s4å{^\14§|{6ÏÆk\\ 5*\rà}XÌY\9e¥\14Ç å©ú\89DÆ=A\f%\8cÍ$\92hǹW\8bø\8cÇ\82ORV°\8e\89ü·\r²ÜâÖU\81B\9bøꯪ¢¦r\18\15Ïç+C°\1aa6¯\89 \10¯ \ 4\91ãK\87À\19Ô£eàä :ZÚ¿u\816&»à?ÀWË&\16ïk\8b)\11.\94Ù\15]%¯ä]Ü,l\94b\107MX]Þ[H"}ªìØWL)RI·rÉfõr\7f\ 3?A\9dâ­Æ\81YÈ&íI¹\11~_\17ÂIBåë$Ø{X\8cîl\81\16ÿZ·°·\97\aE¾&|¯wø#ùºßþØ\86û`\88¥_v\10ºß¢f\13\11ã\96õØu¨·æ3ù\97°\9dfüÞõømæ¨È\138\97\7f?ÿ\989ð£
\9f¯ë\94N\16ûÕ\8e²º`çjz1*äÛêöüíè.Ç@\92\ 5ëç\88\8eÜ\8b¹ì`øoå\8fÙ\92¼J_\99·±\99+-\0\974α6@\ 3\1a\92Ð/\11DWEÞ\10jE}HR\ 2\1aæDl¹\87\86;Y+ï\vöÛÏz\95®\89/\87\ 6\96\ 1\85þ\88ÿ1\86DçÑ\93(z)\ eoι&ù;éÝ.§4\9a\16¸aZú\15#Ùg\97ê\1csÍbÎZ+úX½\18Wi;ç<~\86\9d"¯(Á   ô´µ \a¢M\8c'\89\93b6\9b·!G\fãúùlP<á^\ÌÙnM8-\97\1a-\ ea\9c \7fG+dyXPä^\8e\87s:û\ 5¯\95÷0q\r\7f\p3b\88\ f\11¾ññW¬\15u.æ,Rå&År§\84m\14\ f\7f\84ò\90\9e#<\84HeÊĸì\10vQél\82\98Ã.Ë\8dÀ±ïJ\ 1\14\81Ò\9bÞs)·àlej\ 1\85(\91\9f¥,\97=\85/¥¡\14\80¬\18FVù\92ø6fjù\9dð\ 1Æ;e\1að\91\ 2­²x\95â%ºD³\89\9f\8dãk¾%\9d!FW@a\ 1äæ\8ao2QT\87vs¼\ f\r§5\87Ãh\ eí0ð\8eB¦{âUò÷H\97i\90GCO\98®\11ïãzL' pb¢I\9eq\94¼Í\ 4\8b+'_1\15\85¯¤\18Lvà\8f
+\89\89ÿQ¥ÁAÕÉÜÓ%Ç\1d\83Ä$Ì\11û[H\1f~\87}{\86\ f1Øf\8d½KÔÙ²Â:H\ fmW\81S
+µ¥Ã«d}Ð2w\e7\ 6ñÔõ\19á\fj¾¾\b\12\87­<ø ½\ 5\9b\8c­Æ7ÖiÂ2\89GêÖ\ 3;\14S\16\8dW\95Ý\92Ê!\ fØ@Y\ 3âs\9cZ~\ 3\8d\ 6ß*\aâî¦ÞPÆ\906îx¤\ 2\1aÜ¡\8e§\ 5/9iø7cñGªöHV\8bfÑ3ÌáR\ 1>\10K\95Ìü\9fí2\ 1jêZãxH"Z\82"²)û\1evH\80Dö}\r\82\13²\90}\ f       YÈJ6\b4\88T(P_Ý(*¨C]\9e\8e¢mi­öéS\9eJq·OZÑg­\ fAåé(\ fn\9cy8}wν3÷Îÿ7÷\9cï;ó?ß\87\8b*x"D\11ü\92Ö6²H\13ae¢Z
+Ä5Kü   e
+tE=H÷\ 3º\15\ 3·\97±\1fÿ\9a\92\11·W¢8\ 1\r\8eù7¹\7f¡2\13\83y÷èm¡\ 3ü]L´Ë\ 5\81\8ay\18ô\8bÚÄ \ 3ªß1N<å8Í\8d¸@û\81±\ 1û\90±\93ù:ï>\vÅ>\9b\90Ë6p·\84ü\9bãÈÓ¹à¹<ÞAÐ\9c\9a*ìµ®\8b5M
+àå\12N5Ðø\83åg¨\14Á³Ü¿ÑÝ\1a]7ïcðDþ!\Æ÷¢\19\17\ fÖO¢Û6Nê(©·\95b\9e¯\87H´õ\17\89\12éÖ²\19r¯t1g\9e\82\93u¡ÿNÝ'w\84ߢ\ eËeÎG\18\ 3rºÍ\ 6u\8cbÞJ1îÖaÔ#øgøiõ|\99\aÑGc\9f\83"½ÐÀÐ\1e\rá\1a'x\1eù¾&ÚYH;£¡Ù\ 4ª\9d4\1f\1c\9b\11T\ 31}\8bÏ®;cÚV*¯\87\99ܲw\13¦\8df\94\99´Æ\18\1a|\9cH2\ 6;ÛR±Æl\9b\18Õ{í\87ÝKÿ²*²óGÜùZPgìÖ׸z\v*Û¿\1eù©?Ê\97\90ÖÁ
+¦×\93:ÌN£\94Íæ9\e\au¼ö\94\95¢L7Ûo©­¹Û|jëBñjE\eV\97\ 1QRªî!Ū¢Ú;~;ÔZüZûËÚÝxÙ²\9e
+ì(Åñ\86\9c¦qì\83ê\ 3\92ïªÁE蠟ëV¥\87É\ 6ñ7\11\17å:b¹\9fg3\9dìh\7f\y\88\9c²¬gå\ 3.:O\9a\15îÇé«ð\8d\7f\10Ü0\7f\887\90ºÒ¢\9b\1c\1a¦bÞ4=¢Nø¶Hdto{¥<\83çWZgH\1cåNR\90\95\1eüRZ\á¨às\86W*Zx\88ù Æ»QÍ®ñ\99l<ÆI³\8f\91Ts|\97õâ\7fX)\82\81\85c?®\80p \BÁ \97É\eK\89àuðç¢eü\12Á\7f|0|/a\eì½hBÈ\ 3|æ¨\95ª\97ÐsEG±¶ÌMâÁüs¬\9dMâd\16û\82Ä?ê*G,\19õ\81°ïHÞÁæ\85ýR\1fÀg®[)|\1få3\85¬\1cCëQÌå{0b\95\89\98\ 4%9*\96ùXÙáÝÌôR\1e\82MñÇU)+ë^Ü\f¹P\8f,\e¤põ\19y*\9a\9f~uR\16½Hw,r\84~L×îõ;í_º\93°v\1eN§ø\88"\13¹í¿\97\ 5\93\87Û¿Ê]¤ðÌ/\13/S{Ì\91\91\18êͶË^\a¨Áæ0X\r7Õ4¼\92ª\9eÓã\8a\88Å#úÞ\92{Y\ 6\ 3´<\15mg\18¨$\85\8c\19µ5`·ÊVs-\ e*l\9d¬Û»¬gÆ\ 3ùr¯\92i\8aË\95[\f\9aÉÊöL¹\96X#DEhgq\1e!N-_×\17¸Îêc    YP\8ba\r\11\88!wÖú¯Ê|Emí±"¬Ò\a\9f\9e¡PþD\18\8eOU\11HSðr5¸a»+[ý\96\12\rm×þ\95
+äW\14h¥*Â¥{I/1\bYwûôJy\ 5õ׸jùkú@p[³\86ñÈåzó\ 23\1a*RÝeñ\ 1\9fñµRXwq\ 23¯0´©\8cu%­B\12ÍAÅ\92%\13\NÐC)\9a\92'5ð꡵
+&\7f\1að\99F+U\1e,\8c\10\8c\14d5ò\85gR\r"Jã\10r\8fØVD\ fB\8bSDO]V\89[EסdyVÓ\83\951,+åIevù"þ\8cì`Ê\ f\82WrwÄKa¯\9c\1d¸Gø\85|\97óÞÆ`¹\16Ú%+T\88VR¥C\1c¸F\9c÷\9c{Ys*¥\9a÷Zó5â\0߬±\ 4Rùe\1a³s¦ Q3
+ÅÉöjá\1fQA¬4Ó\8b<>ÇÆô$ù.7Ã$C$p¯\18ç\ 2\1d¹\14ã\1dçõ¼Aã)h©ì\84îéJªè¹ewáT\16ÑÂ*Fm\9e´èK\99\11g-\8bØlï\8am\84Ê*{íö{\95¯\96ºÑv\ܲ\9esØJa>3_*Ý\91¹Ùü\bÛ\81>ÑîVµ5ü|»¦æ\9cW\7fG_\1dÇ>ÁâR÷óR_YL\ 4¢!ì´R\85\9bjz\86§ Sû\ 45fÚ\81O\ e\9b\11\92<ï¶Þ \1a`¿¶}I\:ÁõXêi Zk³R\ 5\16\1d\96\90\97H*\89\1fÑ\a4\84\87Ùè[(ßxú\1a\10Ô\11X\9bá$u|I9̺\ fTk\1fV\97ÿ\85z\96\96\9c\ 6×l£_\89\e×¼g¢C½µ%¬*\8f\1eíw¬\ 5XR\v\91õnY)\0N.õ9+\95wZñ\90[\94ºE9Ê\13ľW¡ø\8c\10¡J%ðw\7f«\1a\12p`Nj\93 \15\98[ÅÊ\18æ.È\11b|JOsd\93W,®ùRÓ~ø#Å*     Ä½±yFâdwC\89\92p\0\ fÌû\88*\91L(8ÉOe\10Å\ 4ò¬lL±\0ÇË\9e)A\9bÞÈ\f\8a·vÜf¾\12\88¶F¶\92ʹ.¾£\eKn\95dë~Aò¥¾º]ðDi\82\ eã\1e(iÔÕÙ]YʯíJ½õ\99Þß\9f\93?\82>Úw\18ó[ä¾¾\1dÅ7ü\86ûKK\936Èw"ËÊ!eýç°D\10Èp\94\0ô5\82µV*\rÝ3V\ 2Ea{:KoEDôôcɾ\98ÞôJ\9a#¯oOU4ä\93\1e\97\9a4\10¨å\b\ 5¨ä\9bl¬TjF·k\85,>±{SÕ?ý»SkÁ>\89ÝSu»×ïÞñ=Î\a|­ëj}\14à\18\ 1\80\8b\8a­T
+¿SU÷.nkç.ü«°\8d\9d\93\84\83Þôm\14âc\87Å®)R\18xØbÛ\0TÈ<À\ 1TÕV*y Ã\99<\10+î`R\82C³;\ eSÅ^ý\9fúÓ0\ eû-ëitp¿ù<\ 3È\97\18º2\1aI\97Z_0ñÈ¡¶VVKHWÛol¶\97­9\93\90f\1edÿ\f\1ej\85ðb\80¹%}D¹\18C\ 5¡\88yã{Ásø\82I*\94{ZLß\b\8f¯\9b1\1d\11\9aÀ½\86óâr`n}+©D¥î\8cÔ\ e\81×_\95\12\ 3UzÄ3Êð¹ôÀº}\86\ 2i7\98§\a7\87ÿ9_\89kµÃjxÌLË+u     \1c¦;¤FxLë.«mÖm×áÔQ`sK\9bzñÏ\14\b´¸ø¿\9bK\13#\97>\81 \90¥&Á\ 6ôñõ\7fÞ\97\ 6xi\ 4B½VÝ^Í\sË\ e\ 53Ú_X»è\80X_ïرá¤ÓC\17\98+Ò­j£|S\9fû     \8fk\9eϽ\83|j|[ý\8eúß\ eX\f
+\bÎ\86ÓBL¡ûÃ.\84?\8e\\13\15\12\9d\1fÃD\98\91C±ãq÷ãߢ7n\8eO(Mä&\99\93¿J\19\9f\90á\98\19\9a\95\99\8dËiÊÝ\96w0ÿ¿\0\14\bë÷ÃIÝJ÷L\12M,NCOYPoQ\86R\9cS²TÉUßVöX\rY#Z:[Q\f]x^\8a_\9b`­a¾bÏcàdñf\ 2g\12h#i3jBkRl^mgnqozp\83q\8cr\94s\9ct£uªv±w·x½yÃzÈ{Í|Î}Í~Ì\7fË\80É\81Ç\82Å\83Â\84¿\85»\86·\87³\88®\89©\8a¤\8b\9e\8c\98\8d\91\8e\86\8f{\90p\91d\92X\93L\94@\953\96&\97\19\98\f\98ÿ\99ò\9aä\9bÖ\9cÈ\9d»\9e­\9f\9f \8e¡|¢j£W¤E¥3¦ §\ e§ü¨ê©×ªÅ«³¬¡­\8f®}¯k°Y±G²6³$´\12µ\0µí¶Ú·È¸µ¹£º\90»~¼k½Y¾G¿5À"Á\10ÁþÂìÃÚÄÇŵƣÇ\91È~ÉlÊYËDÌ.Í\18Î\ 1ÎëÏÕоѧÒ\90ÓyÔaÕIÖ1×\18Ø\0ØæÙÍÚ²Û\98Ü}ÝbÞGß,à\10àôáØâ»ã\9eä{åWæ3ç\ eçèèÁé\9aêqëHì\1dìðíÃî\96ïvðUñ3ò\ fòêóÃô\9cõsöI÷\1e÷óøÆù\95úaû)ûëü§ý\þ\vþ´ÿZÿÿ\0\0\ 1è\ 3§\ 5,\ 6\84\a¿\bç
+\ 4\v\16\f\1c\r\1e\ e\1c\ f\19\10\17\11\14\12\10\13\v\14\ 4\14ü\15ó\16æ\17Ø\18Ì\19Ö\1aÞ\eá\1cá\1dß\1eÛ\1fÖ Ñ!Ë"Ä#¾$¸%³&®'ª(¦)¢* +\9e,\9d-\9a.\95/\910\8d1\892\863\834\815\7f6\7f7\7f8\809\82:\7f;~<|=|>|?}@\7fA\82B\85C\89D\8dE\92F\98G\9aH\9bI\9dJ\9fK£L¦MªN¯O´PºQÀRÇSÎTÕU×VÙWÛXÞYàZã[ç\ê]í^ñ_õ`øaüc\0d\ 3e\ 1eÿfügúhøiõjókðlîmënèoåpáqÞrÚsÖtÍuÃv¹w¯x¥y\9bz\90{\85|z}o~d\7fX\80M\81A\825\83)\84\1c\85\10\85þ\86í\87Û\88Ê\89¸\8a¦\8b\95\8c\83\8dq\8e`\8fN\90=\91,\92\e\93
+\93ú\94é\95Ù\96É\97º\98§\99\93\9a\80\9bm\9cZ\9dH\9e6\9f\14¡\ 4¡õ¢æ£Ø¤Ê¥½¦±§¦¨\9b©\91ª\87«\7f¬w­o®g¯`°Z±T²O³L´IµF¶E·D¸E¹FºH»J¼N½R¾W¿]ÀcÁjÂrÃ{Ä\84Å\8aÆ\90Ç\96È\9dɥʭ˶̿ÍÈÎÒÏÜÐæÑñÒûÔ\ 6Õ\12Ö\1e×*Ø7ÙDÚQÛ^ÜkÝyÞ\86ß\94à\9cá¢â¨ã­ä²å¶æºç½èÀéÃêÔëåìõî\ 4ï\12ð ñ,ò8óCôNõYöc÷jønùoúlûdüVýDþ/ÿ\17ÿÿ\0\0\ 2\ 5\ 3Ø\ 5h\ 6Æ\b\ 6 2
+R\ve\fr\rx\ ez\ fz\10z\11y\12u\13p\14h\15^\16R\17E\187\19)\1a4\e=\1c@\1d?\1e:\1f4 ,!#"\19#\ f$\ 4$ù%î&ã'Ø(Ì)Á*¶+«,\9f-\93.\87/|0p1d2Y3M4A566+7!8\169\v:\0:ö;í<ã=Û>Ó?Ë@ÄA½B·C²D¬E¦F¡G\9cH\97I\94J\90K\8eL\8bM\8aN\89O\88P\88Q\89R\88S\88T\88U\88V\89W\8aX\8bY\8dZ\8f[\91\\93]\96^\98_\9b`\9da\9fb c¡d£e¤f¦g§h¨i©jªkªl«m«n«o«p©q¨r¥s£t u\9dv\99w\95x\91y\8cz\87{\82||}v~o\7fi\80a\81Z\82Q\83H\84>\855\86+\87!\88\17\89\f\8a\ 2\8a÷\8bí\8câ\8dØ\8eÍ\8fÃ\90¹\91¯\92¥\93\9c\94\92\95\89\96\80\97x\98p\99j\9ac\9b^\9cY\9dU\9eR\9fP O¡O¢P£R¤U¥Y¦_§f¨n©xª\82«\8e¬\9c­«®»¯Ì°ß±ó³ ´ µ8¶Q·l¸\87¹¤ºÂ»á½\ 1¾!¿CÀeÁ\87ªÃÎÄñÆ\15Ç9È^É\82ʦËÊÌíÎ\10Ï2ÐTÑtÒ\94Ó²ÔÏÕë×\ 6Ø\1eÙ6ÚLÛaÜtÝ\87Þ\98ߧà³á¾âÇãÍäÑåÒæÐçÌèÄéºê¬ë\9bì\87íoîXï\ð[ñVòLó=ô*õ\12õööÖ÷³ø\8dùbú/úôû±üfý\11ý³þMþáÿqÿÿ\0\0\ 1Ù\ 3\8d\ 5       \ 6T\a\7f\b\96  ¡
\v\9f\f\93\r\82\ ep\ f_\10L\117\12!\13     \13ð\14Ö\15»\16\9f\17\83\18\81\19}\1at\ef\1cU\1dA\1e,\1f\17 \0 ê!Ó"½#¦$\90%z&d'N(9)%*\10*ý+ê,×-Ä.±/\9e0\8c1y2g3U4D526"7\118\ 18ñ9â:Ó;Ä<µ=¦>\98?\8a@}AoBbCUDIE<F0G#H\17I\vIÿJóKèLÜMÐNÅO¹P­Q¡R\95S\88TzUmV_WQXCY5Z&[\18\     \ú]ë^Ü_Ì`½a¬b\9bc\89dxeffTgBh0i\1ej\vjøkålÒm¾nªo\96p\82qlrVs@t)u\12uûväwÍx¶y\9ez\86{n|V}>~%\7f\r\7fô\80Û\81Â\82¨\83\8d\84r\85W\86;\87 \88\ 5\88ê\89Ï\8a³\8b\98\8c}\8db\8eG\8f-\90\12\90ø\91Þ\92Ä\93ª\94\91\95x\96`\97G\98/\99\18\9a\ 1\9aê\9bÔ\9c¿\9dª\9e\96\9f\83 q¡_¢O£?¤0¥"¦\15§\b§ý¨ó©êªâ«Û¬Õ­Ð®Ë¯Ç°Ä±Â²Á³Á´ÂµÅ¶È·Í¸Ó¹Ûºã»í¼ø¾\ 4¿\11À Á0Â@ÃRÄfÅzÆ\8fǦȾÉÖÊñÌ\fÍ*ÎGÏcÐ\80Ñ\9fÒ¿ÓàÕ\ 3Ö'×LØsÙ\9bÚÄÛïÝ\1aÞFßsà¡áÏã\ 2äMå\99æçè6é\86êØì+í\80î×ð1ñ\90òïôMõª÷\ 4øZù«úöü:ý{þ»ÿÿÿ\0\80\0\80\0æO\7fÎ\7f\99\7f¨~Í´Ú\7f\99~y\9c\14\7f£~e\83L\7fÆ~\85j\85\7fþ~ÀQ¿\80c\7f=9\0\81\12\80\ füÅ~|\8b4äµ~c\89lÌ@~]\87̳\9a~n\86f\9aØ~\98\85C\82\18\84OiZ\7f/\83gP®\7f¯\82¡8\14\80v\81æú¼}6\96qâû}0\93\92ÊË}>\90ϲ:}i\8e^\99\93\8c,\80ï~\a\8a\f×\89_L\89\ 3\0p\8b´²\87\14K­-~~,*éü\84~\8aÄ&E()D\a9Òvüªyo\8ew¿yóæÍ=ÓTS3ÝwI÷!\1d¦D)\8aJ²ª%»­\84ßOBvÿ\8bïwý\ 5\1fN<iâÛÂý\ 6_àìÎ\9dD\8agÇA\e]Í3wÐ^Ó|Û\1e<¤~]Þ
+bÊ\80ä}àS\99\19÷\ eÛWôö¼?»\8f®ò\99æ\80üCN\ 4÷<\16üÞ\19\b-Yô4\a\88Èû³£\10 ²\8cÊB\80Ûé\91ÊYp«z\96S\ 1\96)j"¢Ø{%î>6ìÏ4àø;ç\1d>ý¿FVWíñÑm¬\8e
+Sý^ÖD±ié\1aÀ*÷¬b\ 4Pk\87ÙÙà\86ÔÀp\ 5Ø©È?\ 4³%"È1\88#!ϼK`ùµ\15\8eL±<\eín-e\9dª2*þÀÊ+Ý)\7f     Xä¥\82C@µv2l\10\fQ?ñþ\8bí(=ì0Éqåç½\rMz\7fï«Ç\83Iãz·¶¹¤7M\13EïY;ª¦ä\vYµ¥\e@K (×-ì\0¸\ó»÷Uð\ fù¸\ 3\9fý\9eºõ&>©røäð\9fIª^»¶ï\932ôò¢ÕIãM\17e;Ya\95\17\81\ 4àÛ"·ÐVà®Né½\14,SÙ;¸²o\bª_\1d%\1fs\9c\1eáD;»õf\ 6ÞÆ\8e. ±çìãR?l\v;\1e0Dq¶>´\1d\99á8z\8b\90DÎKG)ò3oÁ\94+Á&ï<4ý§@nÍ\970\ 4\eÏ\ fE\eÐ\16ÉO¨9ò4©\1f\91#ÖçÒ\90µ°ð \14n\83W9\fÂb¨å\ f\16¾_\16Þ\1f\87\1d\12\ f7}B¯2±yË\90\84è/Ä\85JHì\82»È¦³Õp$±È«\eÞ\88y;ØÃ\86ÈÕÉÇ\98¯fþþoè\99\94¸F\16¨Ls\8aà\17²I¦\12\8e\91,Kh\80W2î!\ f¡\ eA\98×jHE^°Ï\84\ 4Øâ\17Á¨ _Ûw\19Ñd¯lX\ e÷gÔg\aÁΩr!\ fjU)þ[\ f\1a\86\D\15¿ÄCf\82\r\90\ 5\ e<_\80Ì\?Øk\8e,.©¯ë\86\9fȲ\83²²¬i\0rJ·\8cïä½R\9b\9eñâÝ\90=>0Á+cvØÕñZ\88{\13\ 3HlÓlÏ\1cLÔø×VA\8dåc\99Û \8d\85ù\82\f^{6\15oÌCÒ\8f\9fÎã\1d\1d\88ä\1d\15\ fÙ\85ðbÈ\8fã\ f\91ï:sz\fà\r7ÇjôP@ÝQ\9d\17¯ùÚ\1cÕË;[Ø\10w\89g\93\15|z3Ï0Uq`!ÏP¶Óî\a\9e-\7f~|\ 1ÜôàX·3ô°+°z\ e2lIÑ\92¼¨:\13ê_<ãòÌØaîXþ\92S5\}úçýEÜ^\85ÿö\11îGêÑè
\18XÞùJ4\ 3\86^¿Æ¬\ 6w¤ï¤/\80ûI!5
+\8abnñ#ÙF§\8c\89Oìüý\0®æÈì\8e`.Ü\99\91-âJ\Õ!gZ0¿
+)ý\ eÝ¥q\12\ 4 A\ 4Ã\9f\80«\7f½O\92°kðVÂ\1e\1aô¬Ã^B\99Ûï \99\90f8KÄ\88\15z\17a>\13p-Fð\84þOÚJ*\80\8aÆ\13ÉYr(º\97¨".\ 4\1dÀ\13°O\9e\ 6\98'\9a±ý\18º\ 6q\18Ú䦨Ú\aéfÕårC\81¡üRJ'\1f\96dc~¤\8bhíÕ!Â\80Î?\89`\83ÔÆ}WÑzBd;\85hѲG¯\84ϲåm\ 4½T\v\95ÖSAi©j\119\9a<\81î \84
+ߨ×ø%É@`\ fæÅ8xL¢®T\90­\ 4\97\12\1e,Mk\r\16$\14hJÔü®ìöd\98ôÓþ\80x\13_§r¢Ì°gʱÀ­h\8ft­G,ÒK\7f±Ý\a\ f\13\1e\ 3ytomVK0õ¥¢¼XÇ?R<¬J%\9eäm\81q<UG]IÀX©½'tè9E¯Ç
+$VtÙÖ\0\16\92þý­ôÅÖÜ\9b8¥i¨(ºGÎTö+û\b t\ 5Ô\83»æ\ 5]\1eÇ6ká\13Nè*µÏÞ\16d\93$m[\1fìÃwï_L\9bÜ-h\1e \ eµk\8b,ȬÆ\1cå&ºò\ 6ä\8cÍ\14\8f^>\8fþ\96=\10Ð\8f\f¥]Ù\9b\b¿\93aÛò`sÊ Ç7Õ\1càÕg&\a\ 2Gr§\15Å\80ç?>Ý\ 4Är&Åz`øb>\13\ f\93ôz¶Ë\1e%¿\95sxÛ\1eb\ fwì®&å{ô~\1d¤Ú\85ÜÈ]"WÁ\ 3R\a©%¼\81c"z\0\95D\ e\v\93¡ÐãzA ´Ýý\13ß\18\99Æs!Ö\9d=jcf]­\87r\1fm\93ýA¦¡NJl$Îä\0Û\92\99\91\vé>ÜëøwT\ e\1eGF£F69¸9<×µ.ù'\15S³Z\11*¯Ëº#½-ýJl.\ e\10ÑàZÆZxä\82%m*Ø|ì\ 4ÿ\ 3ùÁí\rñ\18o±      Ç2ÐÓ\9d_T\11ÚÿW\eÊK4\1e\99eRsu33'jRF\ 2\96B¾Ìþü\11\ 1Wl|ô\ 6ÿ
+ÝíF\11§øgml0\aL×1¥\1c,\f©\9c\97¯Ïy¤+\95HuÑÌ2\91\8bf;Ë[¸T½0BEÍÊ{\8e:\91¯Åqn¶ø´à\81õ\17t\10\7fT\86]o®´\94\95\96úk\1fI,
+\f\84îLgV_R:­KÏ\8b0¢dêP?=   ËÆv¿ÀEÌ·Ö\83(M4èm\94\8b\9aÖ\\ f\97ùT·k×\89o\96\83´\94\89,ôH\9c§=³\8dÃù\94\87¦Þï\12é¤Zµ»\10w\17/³®E½Iñ-LQ¦ÿµ¢[ú©ùÇ\f¾8¦F/\98\96'$\ 2\82\8f\ 5?\87[òçu\15~fÄgõÔîhÜXÒj\9d\81\9añÝ\9a-³        VIñmí\1cK\98ÂÕ\80,%i\9a\1a\8c\8fQ\8e\ 2þç*e9à7\87·\88\83À\97®ÏèW\1c\8bü\9dÜ\aM\99YiHtÑXÆ\e\18T÷¤ÅBUD\94Ú\ 2úwÜ-Å4ïþ9#i\a¯Ô\97/\12ñr]£hGÞ\88Õ/¤
+
+lD2\vh§Â\91\8c%TTòT*FÞÃédw">ö­âGüðY?é"ì°Ï[f\b\rr5\12\88\11ÌÊ\8a4\80Û\e\13ùTAoº\874H5\94rWô\ 1S¨8ÂÖX\13y\98 ;$Yr\8cÿÜ'\82q ævUP\1fñåV&\ 4\8a\1a×çèÌ4mù/5LJ¸òEÊ:\95\ 3ªS\ eË7Æì\92\15Hv\9fy..ø\9b ø\0kâP\0\0¬X¬¸Al\85¢â`È\14\ 1\ 5å¥
\10¨,eª\91:\ 2\14\fEÁ$@B\92KrÉå².!{\90A\ 6$AÂ\14\ 5,ÈCåY[EA;|\8a\vTJkU>°ý\7f¸4í1\eaÕÆ\9cd\9ecT\ 5.Ð×\ 3ÿéîUs\fRã&ùBc±h»\ 4R¢)¿\89\92¥Ä
+\86 Pd;\91ÆÝÊ\9fH«b¯\87\9fÄl\ 5?1;\ 3_Ñ:i\a»^«½mùMh9Ó\9c+,\97xê+(\91Â\87j3ö=\7fP6uü>§¯a}Ú&¨\89¿bß\f(\83ú\ 3\1fÒ0ô\80®=ªá.\17Ã\80\92\1f2&îmÎ%ë\85u\ 6\92_ª~z¼\8c\83\95­L½\ få!\7fî\e\ 6S`(ð6Í\9f>Õ©Váú\1d\ 6\94l¼ûW䨸¤m5y\87pgó!ì2¾·\1e<îÉ    PêR%\90wCý>\15èÅu\ f\1c\ 2þb\80v\85Õ\1fï«b\9aFñ.0¬¯Ã\7fUKÒ$áK¾;¤Ø\82ÿPà,\9e\1frAÔ5­Ñ%\×Ú\7fvüÈò"\ eÚ
+[2Ég\94w\8dãõdx©\8eJú±æ\93:\9d\94_Ú'ßEÚ\9a_+^CÚ\98Ì\16Ü í\8eÞÂI!   vüÎ,­\8f¶V7\972UJ§¦÷\8c÷ìL­\82N¨ITUÒ\12K×É\8e\ 1Iy/\e\ eR+\93=\ 5+(Ö¨§°\8c²vÇ\eð6\99×â°Èø·\15!M\11Ü\12¨²ñ       ¼\8b@P¶B\91%\85R-\13\9b\97-â3\ 6\92ì|4Ý-ÊÆþ\ 4\94ï\98\ 3\13)#ͯÍ\vÒwò\12\83¨á.ËÜ\98\8c<Ç;\94\1eü b»ä#\87\92;*\9c\85>$eó\86\98G£Èì
+º>à3Æ\1dêïÍñæ"í\1eÙ\88~A\95ÉZ¡±Ë$xO\ 5U¼¬x\9bä\f\ 2ä\1e\15\9c\93\9cx;Ù¥QùÐ\fh\vXÅ(\aîZ\94¦·\96ã²x=É`dÂ\9aàÆ\r8\85b\91Â\86i\13¿\95dç, Ï\90ÉÄ!îenZ\14
+b°è\ 1î\f/\9aÞ²ÔÔÐ\86\91þ ßÜ2ÁôPß0~\87\v\93\9b1Ùb\81âa\8e\1d\11\8ak\12\ 5Ü\12þtT\0\14Éö ð ? g\9b)¦Ô˧¤9º\11Ç\vС¾`\ 5\93§\19\ f`>\17'4ºä\DRdí\89åÜPaxÔ\97Ð\12\98\1c°\89®¥?i|Ü9\8f\e\16,¾t\v§¥Ä´\98q]\95\17\8c"¼ë·\12m-¾9«O\99D Ä'\88\7f«¡E\1e\12xÕ>÷#BãÄ\ eÍÓÎàz6¿ºõ\ 5ÉN\1ekî%­¬tmÒ\12\8dß\ 66BDzV®â\18Q\19÷GÃ\1cq,2\88\1fO:â×\vyÔ{i¾îH\0cy\ f[]èvòaË\ 3ZÚ÷TÃ5 ºÈ¨±R\v3§ä4\8a5Nß\10@q\8fü\82G!\eýfYXr\91º³ý{î3^¼\1d\ 5ëëM\167HX1­\9fe\ e\16\9f\83Á\99õ²ëôÖ8´¨\82¶7Ò\99;N\9dðßÂü\95ÂP\a9\86Åtn§\8d/Dê=ÌÅüñ\8a\ 2}*÷ðI\83:\9cý2s\9bÌ\8b%\8bó\13þ\ fÜ\1fñ\81\eG{ê\9fÄ<Ie«d\8e\ fw\8fí39\8e¤5\8dI\9c°ot=ÂÞ\93ñ*\1d\1f̸'­ã\1c\89ý(\8c\82Ü#^sú\18\ 3þÅà{ \\15ÒÖÓdç\8cYñÚý¤dSªj       V®\8b\94΢\17T>¢7\19\1a©\13ÿaì\18b\81Í\11\93\9c\ 4æ\19\7f\0TÓB\95\9dm\856\ f\ eÛºÒ4JZmüIçÀ\1e׶ªFÑ×\94zé\F\85D*r\8díE²yÎ\11\93ð\eÖ\84¿\fÌ£ÝV¦µ-ï8Ë\89i±Ú#\887\8d\95æ\9dX\7fm\8eî\14Z®LW:2
+$Iâ·±\ ed­`UÄ+¸\83íæß\ 2zÓ3\84Ó\ 3\v8"}×åY\úE^û\a\Qñ¼í\1fܵ\82³¦)<&uZ«!\1cFM)V×\14\85\ 1"çÚ\9f}ÎÃç\88&aÌ\80\ 1íÎå\rÄ\8f\17\ f¶»\13\v\8b­¶5ÄÏ\vÖ\eÿ¬\9bO546\11\83PWäë\88¤0\81ð\vÒf\9fGlEýbd¼\7f\17c\r­´'\9cƪ\9er\ 4\ 2û\8aÓ¬[©\aò{\8dK(ÔÔ"M/y\ e%\95\ 5\93Á0=²\9f\9câ»\ezF\8eBx}é\9c\10\9a{w6{Y5¹í0Ë\ 3óº%\ 6,ËÇ4ù0\9cR}Ô\93´vT\9dô\ 4p>¬K@¥fùR¡$Ê7HìU\81(   ¸ÞÅ\17àªÃ/1¹¯0\92f<,È÷1äB§S>¨ý\98Ù¨RI3#&ì&ÿÿ´pßaÖ5j¬àé\95\ 5Å1\80Ð9#yTõ®õ±H\869cùIÀÏû[ßÎÕ§\8c©jÙ\ 3¨\13\92\9fÃ~á\1f¡?óýÄÊ\ 4Ö\vÀ+\14Ý7ÀÞN\8czMÕ`k\86|-ækË\ 1qJÞ\ 3}(Ò\98\9cçþ\81Ê\15SØÁaÓ¼Gài¿ æ;ຠíÊbË:`uǤayU\93}T\93\80      2÷ÉûòFtmâÌ\94\1e%Op\ fuDìÁ\89\ f\9bãU0m~\19L\13-_°¨·±µ\9d:ÛqÞÒW¥²g\18Ü0~æhuwÞ-]\90\fN\19\89rPå\r=<×]\ex;Y×ýÎ1Ëiw@á­í8,áÝÐn\9c\7fù\99«\18\(zº\13Æq²¸ö\8bø\98\84b\93\v!$zB³§&5d©øníÈ6\1dç1Q\ e\f \9d\r\16\11«ÊC¯Àu÷Ð\8e\ ey\1d#«À\86­c%$7ý]w'z\½\91\18\13\12×0Lük{8<Oz  \86ßð¤o%4üP\ 2¨Ë\97õ
+¨9hz»\90\82Í\8a°\9e$ßLØmxEFGOª¾$»\85\90DcõóÛíðnò:0td#û*\ 1¼v\96ÕTöâ2\17¼\8d.q0\18û³6·\14Òæ\12vêg\80ûÑï\95AÔ¡\90n\91\17\9f¯Øl\8a'¸í¿±H:\81<@âIË\9eõ¨8!è\13mR¶SÖÆæ\12\96sÂ^½\e\18°×U\81¦g\84¼\11f\0B\9f\vÐ\ 2u\11è2L\95\10ú;\1aªËfºG\91\v\97Fx¬P\8b\ e~\9e\90®K\83\92÷\86Êm %t3ÒM÷ö\19\80\0ê\10cúúcM(¡ª\7f¹bCÙB·§$\e\r_Ú \9cÈJ±,âÿË@\9døÕ\9c \0\0\1f\86¬%Ó¸Z\9a\1d\91\98.\9d6\84\92B\98\9a)éPé\98é Tï~¿û~÷Ùù:_÷«tH·NI¥TØ\ eS\84\91c\84ÖΤ5Ùýþ\11_Ø3¡ð\9aÂb¿Oö6É-[o­\vÃ7ÿ$ý\96\8cc\86\95ú\b\93:¸zN\82q\13\96³\18n¨E2\a~\8c7\NíöT\14º¨\1aö'ë\f²"[\96fTT°Ë^2Fþ\9b©í\1d©²\17&µ¿+¥\13Ì\e\97ô®ác5\1fr\ 2\95¿Í(ôìÑ÷jæ÷\17é¼\15ûl\v4´8mW\90DC]X¸#\8cä×<\98\16¶ñÇn\94\ 1_       ÖT\99\ 3¸ 45        øC0\rV\81\80\10\8b~\vm\ 1\ e\9dñ\80&AGçAø\ 5\ 4¾­ã7\13w¦¬\ 5\8eø@Ïw\82«Øó\8a\ 3\98½ÖQ8\82\1a\0\ 6à îQ³ \ròä´?d\82ä9¯\80÷#1ó·y\81Ê\95\13q¼_eS]y|\9e\10*Ø&6Q¿\14ô3 0J(¡WG>\ 5ÂHê\14\b\ 6ãËN§ \1dvøµ\11×Ag÷¯+Ü[éo:\16y1Ú\89²Gümª\ 5U\ 6\7fVá'p\13´J{"\16\84¥âíÞM@3íåX\ 5­Çÿ|\15Ëñ*ñ¿oÆ\99Ñ\7fÞ\9eÌ%sfJ¹<·Ìß\94§ù[ÓþÎß-0R'G\18\v\8däiÞ+\ 1+q¢ãNPFæ¼\ÅÖÔ&ÞíàXT~yýkÎPÉxÉ>®¢à\8eÂ\96\97\90ý\8c·\83\1f\9bþç\ 5\17\ 1 ~u2LX'»äP\rî M\9fO±W·     ÇrØ©\r\eZ?qöU·\14ïäü·\+wå>-\94q}y/sRÂQ\81Qúú\13÷\84ÞJ\a\87Ó@7\1337ÇÊîK\1a­a[tÌ·\9a°»\9b\84Eû8X­¥,\9c\9bT¾ÈÑñpý\95°\ 5¾!ëã\89PÁïêVû\8f\0K$\9d³`ù\8f¹\8düÎ\9aì×µ\9cbÇu~*LàìlB¤zî¦\9a-ì÷<ËR&,\8e\1f\9c+?þAP«]²o\ 3\9cÅèãLâK\9eÙ\90\f'y¼¦¯ð\r¼Yý?±
+~\94t-\16"XÏnÃv\b\10ô­°ç\84\18øÍ\ 1ÀVAìG³\98\1c+¿\1d\82\99¢Ï\1a7¢WÑÃ\ 5»Ñh¤Kü\ 2µDâYùèZÄ%4\ 5YF¶\1dg£[\90\1dö\8fРäÄC_ÔMæ6Ð\85LJ\12®¥!\98¨)¯\17\1c\12Õ!6ÔÛ\14\87l?¯@\9c\b±W\v\12\85\9f³?\8bt`k¦;\90Ýé½ýæp\9fö}ý
+\18P»ç\86À>\8af\86\ 5\12\92i8Db\17Ò\bÃÌ\13¯Mp/Ų\9bF\1cñÊ_<`w½[ßUèq®°.\vÊÏ\1aËY\ 3!é'i7\bÓL'\89 \83R\13ü\ 6z$û\87§\10v\11]²cÁ-äÞ©%HYÙ~\93\ 5Ù\95­ª\8d\ 4ç\vÏé\9e\80ws{)WðaÖñ˹ÐúÔ\91`\17è¬ÊùØ{¨[zÀÎ\fö¥ä\93Ï¡\95\8dö½\17Á¢Z¨&\ 4\f­èËz
+\1e\86\f\ 5\83òU\89Ï@uÖBP.8\9bjz\f\85Bä£{G \ ftϤ1\98Þ\95q#\rÜßò¸\1a\ 6^×oÍ2\ 2\86ªN\13*`®D\97è\ 2\8d\am\aé\8c\9ecß@\7fQYîÕ@ÕÌðÄOàÉÁù\9ey`þ\86Å\95^ £Í)Ó\ 3H¬?\80?\ 2\98Ês      %Àý¢ðÀJð@öf\8f»à-\8dëÞH\88\1a{#}Å\99ìPK\0n@Åu±5w:=\8c\ 1X9ý\8c\7fôÒ(5#p\fü\e9#ôô\10\12ï\80\82½AÄv(~\94-Ñ"]íQb'ä ¡\90y\ f\8f¦\ 5Ñ÷a
+­¦Æàè\8bÏÉ'ðÏç\8e\10\7f£·    +¸Åv\1eO@¾\eÙ%ö\137_ß*Z-r*Çé~z Õ\91ê 4\88\8e\1c!ñøwÄ\aB\15p\89°ÂõG-q.Öa+Ãî¡cÃÃ"wmqk=½¨ÞWfB\r+\1ek^\90\83²«0\87ø\8f¤>n\89p\10u\9f\0Ýã\9e\83= «m]0oüü\10ÊÄæ\12-1ô·:Ç\92~ê³ô%u\1d\9d\84¢\b;ÕpÜV\9c\94Où/a3\92\eî;0\1f\86\ e½Kܼ\1d\97Å6\9f¢\ 4EÎÅõd@þZU%\11¡{\ròñÔô\87±^Ø\vÍ°ÿyÌO\91íV\87NHLm®¢\17©u\83\ eu\1eM¡äB\95EQ\1f1\úIÙ\8f\1f\ 2u¸iÎ@L\11\96\92\91ï7\89Nk\Ý\ 2Ðd\19d\83 [i\8b\81|ª¯í\8bÆlRÜ°¢è3"²ú¾r\15\1eW^ ü\88\19
+¹1ë°Í9ö~±(\9dVì¶\ eýZQjs\16\19\ fü\95\ e5~N\1elï,\f$L\1aAE ¾±Æ\\18\81ù\96ÝûY\86v\16Äø\19¡\873k\8eô"³*ÆÆ\11Ie\9eö´¦.²gj\a4u\9cä¼D\95\92k"Õ*TÜ~~\88¬\9cg\88^\96\fò\9b~\18\14½\12¼<|\831\ 6â­c©\9dPx7 í\82\1dkFÔ84\91K(/A\1aI\83\\0%óH©\1eâG;\89'¡â\1f6\8b¾\80æ\ e\1f ½à`kK\92\85¬ï
+Ôè\19¸Z¯J¤\8fä\b\15AÔFqµ\8cK\9aqÓ$5\84GT´è#.ö\8da<±ñC]\94\16s¶zO\8c£9\9dÇÔ\1aÕÄ\15@yQÑ\92í-\8f\96\19D¥RPÒÇÉ\15ß\16\eGªD{\98\b\9fn\9a¦ª\ fù\90o\88\ 5«^Â\e7é°PµëvU±\14\19\19\83²ôT_F"éT\8bØeâ\r\8añ\88^\ 6\919ùì¡^\8b9®¯É(Zi\95\8d\8f\11\11í\16*³¢\94J\8e|1¿"Ë]º\98ý\9c.\90\98g:±ÆE¼TIÄFzNõË÷%T\84|\83k&ñJ´lÅÇãIùõ3Ê\8cª+\15År^¹qf\8a\94S\14NM\89\8bò\1a\99eÝÆ\v$\9d\92vî{\17ò\85ꢫ?\81I\9d¬Bð-\94º-Oi×0iX\92\rÈè\91\9aT\£¬Å.%kR\18&-?(ü\13m\9a¥=ó\80Ôþ?~3ÂJncu\f\e¦/·mS<ìøÃ\90,»ÙLeØH:ë\1e\90i¢_+MSVü\8f\fkò@\0\0\83*ÕÃ+w¸­\ 3\bqDS\ 1!h\94²e\1c
+ô4\80\96\ 49"(hÂ\b\19d}+É\97½7\19\8c°\12\11\10)T« Þ b¹ÇªÔªhmõê`Y­Õ»÷ÿ\vís\1d\ 4\86-´,@\98­Í\8b\7fÀ\9f\91þ¸\ 5ÏSC\11g\97ZwÓñN²    C\1fU\16ëcª\19ÜW\9a\92\9a¤Ê-JGm\Q²ìA]Q\86\19]Æh&D\8b¶0\13±íÐZvnw %\92õÎá0\86°z\15\1dº\b\16ÊMT\93XÈI¶ÂÉò\15:¤Ól¿\8cÅ\12<\9b\1a7\81\1cå\ 4aÍ`      çù\995æP` ±Ý°Dh\93\8fk?\13Ø\1a(ªbþø       \9fü\1c?²`Fº\82gÝÏ\16\97ñÖűà\16îy¬\14¸À=î\8b4EJ\8bí­ú0   GvQ³O4À©W²\91\90\8a\1fd\8f SA\12\9a\ 3nMÿCä\15\ eÄí\80\17
+Ò±|`\aï\8a7ø_·ÎvY\97£¦Io©«\15\ fÙRÅyYqE¨,Dò;É&Q\89\éBÑ\ 2xWì\7f¡rÀ\87­\13v\v\16\f\1eÛ\1d[\80¶Ë\"]£º©\7fË\1aU¬ÐØË\8b¥\rÊ\ 3¤ÅâwÒ\ fé«\90\1a±<¶\v|\ 1Mc+\85éÂå\9dç\rÛZê¬9Ú(W\1cZ¦Ê³Í°Âäf\93ïø¨t\91\8e~X)\86Uái\97á?¤m±<P\80¼Á\96  ¦\81\8f;×ëG½ï-_k&Ú\9eI&\94ÓM\83L¥<º\11:\9e\8a:͹\877\8a·é\ 2Ó\18°K\ 1Æ\92ÀÍâKX² \15¸ÙѪçöW[\925P7W\92«tt\1cbþE6Õ¼\9az\vý»ýÁ¡\7f\89~0¢iÑðWêűÛ\81i4\r[$¨\ 4k\9bü\9aûi\17´lç$\9d\ 4öÙ×V\7fRc4Ó«\1f\96ÆêGk~Ê¿¤YQ·:Ù®HbÔFßG\13\99X\f\ e~ÏNuã\9b\16kf\1c÷\99c`´m\r³·f¥é4óê±³ºqVP~\9a:\82U\9b\1c#/bûE7K*ØW0ûá]\9cq\17Ç=$Ü­ù¼ñ\91 \ e\90X×òÿQM52ymÇB´S<lÞ\ 5U
+÷ZÒ¸LÌeD×\8a\f\f\ 5\ 4ç°kLBR\1f³¿\13Y\84\1eä#z«A\ f¡%¥Ú¥`r^\8c\92\ 5\ 4'UIo\bîFg\88>ð;1\fp\9a't.t-SSUn;Qñ\9bà¹Y(sÑ\9eè§Ð*Ê\15Mº8=÷\9câ
+BHZ#\r\83\96GcD\14áS\8c\ 4¬ä{\1cd'Ù,U\ 5Út\86£\82lÓ=í\17´,}¼*\96\12¯vËcrÓ\15+Ð]\89\13(_\14\11ý1r\e\9cÃ\98@?A[ã\98ã±K£Dl¡v'\7fÂ\94oî>=¦ëÔ\8f\92\87Õ\eÔÓ\a\7f\95[\15\8b\12µ¨?úQÔ\v¤\14\1eô\0n!Ü\98å\80Ú\19ÊeÖÞæoø\85ÆiÇÜéB]²u3ù\88ªßPzP'ߧ\96%\1e\954É4Qw\91 Ñ  L7@\ 2\12ì?;\88gS\15\1dVjg\1foÞhoùpê7í´s\ fy\91ªÄ\ 2\1eüRö\7\94ø¹ä\88âVÔ%xL|\r3\0¬\ 3nëÛ|å´2Q|û\bí-ÓÜ\12Go¯\18t\9e©\16\17uÙVÖ\98³\e\8dGk\1fî}¯©fdã'å\89Ì\90°yQ/;^¿Ò+bÆ#\8fÛ&\99~Ìôæ\84úÙ\8a2\87\97¹¼(ß\1aÊ<\95\9dc 3\7fß;¤n`9ðã2\12[\1c\1e\8fLqztö.\98ÿ\14)ô<äÍ×ßlJàaË\7fnìæ\9a\v\1fX>ãîÉ\9aÑ×p\ 3öòTÖ\86\87ø\11)Òð$\9c\81Dr\83u\e:5¢zøjë,|·~\9bû0T\~È>\ 2®*,6\13\81\ 5Y
+\9d]è·7E9!\bÀ\ f¡7ùëÂ;a\88\97¢Õu\8c*\17Àñ­8Y?ÃäÒ¢Úã#ö\0±¦àW\13\1dñfÅi\1fA\ fö~ª\\ f\ 6âûÐmB\ø$ô\9e\ 6wD\19\0h°E©\9516:_«º\8fçÙJä³\ 5 qB\9a\90ùR\e%\96\13\9f*Xð÷ø3\12\v\18\1cá\ f!\82ý\1aO»Ëþ\12\12`Iª»è¤\1a\9a©o¬ßk×\14ì2¦+õ\99}\9a\ eY\10ñºü'1\15ß%Y\rõG¬\87°ÂPMJ{rK\f´²Ùæüw\1dà\98³\1d¢\9eµæ\18_\91æ\f\17µúL¶&N¹\8bè\91óÑ\vøNñy\ 4\1fA\0'\85\17Õ³mﺾ\ 2o4gz"ëv;L®     j\95\ 6\90\86\f\9cÌÃê{\9a\10¢N¾S6òÿU'*\8fÈ\ 6Í@\86dÙÀ\ 1ÚjNcÏ\14Ívêo^\ 1=\87Bi\v­\8eÉ7¹95¹©Ïl\1dµ\1eÂ\80AÇÀⶫ62ý7ùIÒØÛÅCçkëy\1cV\8f_}BÕË.I=\81\12ëYR\7f2¿ÂU^ÿcê°ÕÌ\14\12<z\11+\ 3w@¹\91ýå¦\13b
+Ç"\16ô\9fàù8Ûº?pGªZ:\ 5ÜOÈ¿´ú7\18òÃ\9dä\86ÂT\95ÅÔ\90IÐéÔ\r¹¸J\ 5±A¼éºÈÜð\8bxß¹rx\90ý\9fn?(ª\8aØ\81\0wÈh\8b¿°?ï\96ã\84àFê\11³OàG\10j{ùD\1c"§óLaë\90W¼e¢\17}jÙ \9bw\ 6\8bê*\9f´ûÄ62¾y3r3OÕ(\831©;LS \8e\99\ 5\ 2p\8d²a\ 1?\8c\82\1cáÿU¤í}¥ícïôqT/+íí~\8aýÅ3MµÒ«y$û=IQêRS$ò\81@Õ¤@&\\8fl+\10\1ff\85\1fñçEI½\95\161kÆûÚ¸ª²¬í¤v°xÈ}_ÅÉÛnÏ\90ç§Ì\1aMèfB\89º\13y\8d»"m\ 6¿\r\e\859\82nQpϼ\vϺìeÚÿ\Iô¼2Í\17\eÝGt3yÁ¶ëê\ 5)w\8c\91ò%\84\ 2u¼$\18w[\1a\ 5\7f\1a6\ao\15\1e@&zÜ\9e¯Y^ïZ÷w\95;<\û\9db¡ë®ém\9e¿\8d¨û"å¶Á®\94\11¨ªïÐ{¸\97è3\ 4\17\1e\ 2=\13\8es\97\fSNÏÓ\90ovÒ(¥ïûÿD\ f"\95\9di£ÏdM¶\aÖ¬Là¹\83j9ÑßZº\19K7_Ó<®\9fÛ\90\84ö°Ã¸\81\979\8c74ýP6£é\9f\vÏ\ 50,¤R\9f\9cñ?\86èÄ\1fêD\ 1\0¸¤óm§­\8d\8b.\86D¬t\ e±©¦he3
+\95«\96æ>~÷oîß\Æ\98a\183\18Ƹ2\8c«è@e»ÔæU*Tl©çm«cÕÓ±½ý\13¾\9fï\0å~í x\98¬¨\18\84\96\ 5ÿn\92ÂN¾îú«ÈÚïûU\9d¨\14\9f\7f)\19o`IÏ\87a]é¯ÚþÀæP£\e³ÐFÊÅ\9aVTC&ÊÏ£Öà¿\8bYè=ßd]/\16æ\19§\1cÃ.ãó.FÈBX´s+$íé=­}b\16uMÃ>\11\8bRWm\116\93Å\966á¢\90ÅFX ÷5ç½\12x{v*\ 3ñÇØÇîýj;\8bzv­²<½¡¥_~\8bú\95ý\0\94VUJÏ\90\89²^Ij\88\7fQ\85x\89ï½¼uÂQ¯o\15\ 6Á=l°K§_ÎÚÕ\91¬EÒkZ\4³¨sêqU7¥ÔvOa ëJ?\11Â\90èÂQ)\9b4C«\14\83^\19\8aÅÂ\1aì\ç¤ñ\bk[{»Á3½¦y¿~\1aÕõÔMí|JµÍ'g\ 3¹¢4Ay,$µ0\9c\ 5j§H\86¼lò:Q"VÒ\89\941X¡í\81&eº½©»°\83úí©\rùs)M\95\ 5Z\9cì(éW\7f\b\81\f×\14|ÒϹ\1aÙ\¯\87ò8Ñ8&ít³ícýp¦ÓÒ\94ÞÞ\14aö \92ê\1c\85Í\94«\95\8bô\fò­\92\9bC\8a\fGU®$^îfb¦·³|\818u´\8dÓÈ̸\1dÇÍûÇ&áÑØAÖ\8dü\1f9kÕe\80\177\94;\ eÎ㥦ì\85æñk¢oÁ\9bÁÕAv¤\ 3úò´\85Õ\8f0o5±\87\11\9föy\9c\87ò\97Ü\ 1ø¹\8aÆ\e\80ÿâ<ä\8f!îÉûÁ¹HôÎ÷P\12\92\1f4\1dþ\88|\1ayÆÜCÈ{_³2eî§ÅlTrÉ\ 2sôâ*¥\ f·Idg_à\8d\b¯'\1d\ 3V
+Fv\ 6\81z|"\90\ 6ïÆ\9e\ e¯¦\7fÒ©n\ 42=µ3[ï°"s¬¥\9fÙtÕ    ù}N\9dâ8«\94û\9e`\1e\86ùñÒÌ\1f1`X¼iý\1f\90]àx¬£½(\ 1®U2\\8do[v1·\ed%J\16OO&rØ\97´ß0\15ܵ9³\ fYx\16Åݨ\ 1 \\96´\1e\80¼D\87\1fm§¹ÖÄ]=Hßjíovfd\97¥\98)Ì:Ót\19\8díbèdH9\\1d\94ØÏ\9b®Y\12\15É?«8°Þ\r<%þ}ÈçdV\8bÛ\95h\9aÁnu\8cÓ»kV\98¶3\9d+ª¥(+µ$\8aÞÁ\1e\9b¸\8a\8bë¼#¯ð£Õ\8b\ 2®\82QÒ°ÁØì·\17Ú\7fåÐ\96\9eÙãX@ßâh-NdðëÜ$\15Ìa«\9a>\95M3¿¡\16q\97\18\9c"\13yÿÕè\ 2$À[YÚ@S¶õ\9agÏÃ\93\8eÆ\14ÚP\87³±\981·)L<Æd×"´döìr\eÕ\95sÎÈÝñ\9eW¬í    \88\ 1ìDJÿ
+t\11Ãýb\11êÆ\fµcèj\16¥è*º\8d\9d!®A\8fq
+hGÐ|î3j z\9fO\89ôÀ¶\0\13\ 1\bö\bú|·\1cN\83
\19°\ 2*ªÏ\80\9b òÂÓð\bÔ%2#\1eÐÇ\93\99H\16¼7!\ 6¹\r;v¤¡\87\90\90\0'ì;äé\1dOð­ôëÎ~hµÄ¥î%\94,v6ÄBÕ¢ÕÂTx\8aðDv"L\13t\1f¤Ã¯\ 5K"N#\ 6\9c¶.\17ecÍ}fÀ\91˺\10\ 1\8cçdÖ&\83\eTÙù\13 R¡\14øAS\88;Yq\10!óþ¹\ 4ö\96¤E,\83\9f\8b\14ëü\91AAúm?~\95±çÜ\10\7fÌÐ[ý7\10ª\1fÒ[\0\93ö\13>\r\¦!ýB\ 5;U¬ø!\88)/\b×À»¥¸ÿC$NøþÖ$ïAå³uüe\96uU}ü,3Y'äß/JÀ\9c\81cùð    .8_[\1cO\ 2\1f¨Íá®Ð\15ùN\7f-<"N¹ù\99·¡awG\13\ f¨\85mý¼_+\95yj~P\99\ e]Å¿^\y¼\v\10\15X\ f\18À\ 3Ú,r-\14¯|à\1f\ fã\92\92\9b¡Ü³í\19íã<§æ\1aÛL^T}½ö,Ï^eDRø»,êãn\80kqÖ\81%Àë|\17r,ø!g\8dÿJx\9d´±×Î=~ép{"·î\ee\12÷E«N;\93·Ã\9e\0\9fá=©òÊ$øöÒ{q\15@Qá¦í_À\86\?¿/иL\7fe\96´\8f>­u£ä\ 5#²¼M²\9cÉÑpÄ'Y¶\7fÆn²_e<\16\85q\13ã¼\85\8d¼±íRa8pÖ\ f\14LB\93=\83\92(àYK\90\18\ 1\97[l¢«`B\ e\ 6´\82½B#4;c\8að;HñS\92 \19^±íOA\1a<è·J°\11¹~¹I4,ºÖì$"\89\9cË,B\HV'\b&\ 4fà²\80/pO_*ø\ 6¯Û_\82_Ã#¶¥à&l\94ô\bWcÂK   B«Zí(\14ü¥|Zú½à b\93ê+|\90°ñKpT\16\9c
+ÿAr3v\ 4\9f*>¼õ\11ö§ð>É\84½\13x\\9c+¨0lk¤àïôçÍOðÔ¼`Å\0öFÓÀÓcfupê.\8c®øwl\18\16CÄnÍÂöKJIi\18]¨ï\9aÀ\aÊ&\1aÂðõf£©\ f³\18½ä\ 3XPA\ 5·\ 1ý\8fnÍ1\19Ú©©\8f©FÛTK·ÎBo\12\eI!è\17ÑÓ®\85øæZ£ý f°\1d)~\89¹XÞ\11\93h\81\99Îy\8eÆ\17¾9ú\fݨO\8dñC\ 35§¶´¡\87\15&Ò|´T2«ó\18ÖÓ²¶¾\12ón\98SLB\155eD0ºØ:\8b³\1eyPÂ;\1a\85Ü(ìßw\1aéÓ9m¡¡ÎªnßWh\8cÔåÂK\8cu¾¬Þ\ 3½{Ú`\94£\ 1\ ew\19\81Øk\93ØùÈÉ
\91kH¦éÍ>*\ 2ç\7fÚ²\1eéÈ1ùö£\v¥wÏp5õ´Èê\85êQº¶à\7fªÝ\8cß$\1e\8a\ 5ÌÛòLvvJ\ 21\83óf¯\9bÔÊ3n\9e\aäøT\8ag@oO#9\11|}\95¯ª\98?V0Mù5\10.\ e\91Û\80zÆ{"\1a\fNÖK?\81C\94_$\rPÑ&BÌ\86e>\88(\1c\ 1ªIÁu\9b\8bò¨`«þ£|\18o\15ù\12b|\17ã_²0l2©Wê\82\9dßsCü\e¦Ü´LT\8f\1d÷I\10æa?µf(/+\9d¬\ 3\8aP¹Iw\91¸B\ 4\vWÊhÿg°ÌÂ\9aH\f\0¼»\1eEiÝÅ®´ ®(G6\1c
\80\b®\1c\8b\1c\ 2¢" \12À
+"(\10®\ 4H2\99Ì\99\99dfrß        $\90\b\88\axàZ\8fE\14\ fP>\8aÅ£\8aº\1eµúéÖóC¬ÔÇÿá\7fû\1f\19×\e\8bE\8f\17ÎF½\11:}\15<\rï\{
+\9a\84\82\83¢%\93àø±\frH\13Ð6N$(ß«Ná·\98_%ó1\9a¢«\83Ñ]²2Î:$\9fÈÜØ\ 2\17¯-\868È¥ \1fI-\14qt;ù'k\8aã¾TjJW^Â}ôkÀ\10ô\8efQU\11r\ùu\81\1aî¦\1e\83N\90\1dk\17Hná«\82æH¾\82÷õ*\89\ 6W¶ã¯ø\a\a¦\98Æd6\99¸\1cM2  *{\10¶®¼`\ eÌV%¥\9d\85VR\1f£oJJ\89²À÷`+"èyO|s8ÙÎÃñ®6ÅVÌËy\128\87\fµ:+¿\87\8f\98\15;ÄÐ9Ýî´\ 2ɨÒ=Ú.q\93q\ 2\9f\82\9bÑ\9d=¸ôàÉ¥­\1fñ¨^\eÓ\8föw÷\ 2ld¯\8bÞGÁ\19­å;<¡bShÚ\1c    ¨\1e\88®\0\a(÷ÀÛà\9f±%]Û\rçªN\99}uAܹ²\fõ`MVó¨\12¬µ\97?g\12ê=ò&¨o\1a:R¼ÉãüÒ(£tWS-{66Cð¢S¥\aø \89«ý\9aÿ\94¤U®ÆÜfoEIã½òhzE\13\9c\17'ûÜ\9c\96¬&ú\ 5ÁQÉ8,\8cgÿ\ 1]-2t\9c×%\80ÁF@}S|\86èQJÄ\9c¦h&S콧\86b\ 3or\r2wàqò|éoÀÃÈÏØ/À$Û\r\ 1Ĭý7´AÒ£\ 6±ê\ 2\8e\15MXIc>\9d\8cf\96¹ä\11H^Î\a2\10®Ø`\95zBÂȳØ\f     Å\9e\ 3O\80*×{M\902MoR\8e0\ 5øi\86¦¸ü:ªT\ 6ï~%Ë$\9c9ED\1e~cÃj<\17}\1d\89£\ 5ð${.\9c\97+P]c\9cÐ=VzëÃpwz\SÍ;!?¬ìØ\1dC:èGÛF¤ÝòÅI×±¿\13q\91\18\16Å\9e\vÝ\87>;\ 1Õ\ 3Ç\16]\84\82¶ý\86m§SÌ)¼yr\1f½¥ÔEz©_nË\95²\15aI"lµ|sä\8f\b\8eí\ e\ 1ð\87ö\ fªº®vm§Âßµ\17\1d¤îØ_7\be]Ö­¥>\84ÓÐ\93ý\18ÿUý)i\ 5:ÊøDÎ\82ÿGº}±V WÚ5*ßÞ{Ú\18füà?Ñ\14
+ë(¯ÿ$Ëp\)9D$ZYÙr|§¾öçç(¨4DÜ\81OÊH¶»ä\15ʳ\f;Ü«òévÛ±j\87xÒLr_rû\rµµ©;Wi·Ô\rnV¨|\eª\13\9büu«ÊdܦÂ\0;þ@ðÈ\12Ñú\96ç YÖNþ<qµIÈ\97scôE\8d¬â^M|ã\93ÍK\94\8b\9a®Æ¿¢î6\ f­\8a#Qáì\80«¸\9bHl6´\\ 6\ 6¨r\v\ 5ì\ 1\ 6\8dEÀ²jJ·\11øªØK\1d-\9aβ+ü\0ïx\8dü=\90´j1Ñ\ 3(\ 3\92\81)ÓC[\ fvQn1\8bÐ\13¢ÿ\18ò\91¾ª\eÚ\14x¬¨V\95\fÏËòa\12 Üøuò\0I[ø\94ô\1d8Åú\16m\ 5·\9a\96Y¯ÓGe\ fLVù¤(X/\96%W}¯©%\1c\85\13Ê
+éÌM]4\1fãǽ\95íAî\85ß\97n\84×°\ 2Q\ f\89Ô\88XÝtGdñÆ\87\9aD¡\wQy­R¤>Ál-ÌQôÈïnJ¦úȲ¸cä/øÓðËø14\99µ\1eÑC:Ã'K£\8d&\87\8cÛÌ\95BOÝJ\ 3{ß´z\91f\8csWñ\83\12Ê|F-§Ùq\ 22\98ì\v?\8a¯Á}Y[\90pXd\90Y<\\89ävÃ+Ç\1e\81M{Á¶i\1f©r\9a¼8µÌ~í£LJÞ¯´ÇÅ\11\17¨\rávlL:ÀÚ  ?@Ö\e¢Ì\ 3\ao\13Ó\ 6[g\8c`\8d¶²}ý>?Ur\8b\17Ç\9bI2¾ËL\95\17k.Æ}Gp\19I8\89QäRV%Ü\82L0/\ fPU³ \13ûEÕñ\r?´É¹TÙÂ\16cÍÛ¼Ûf¢\ eHÓës\1aÖÄ^QMò½C!º¤)Ã\ f$\f\82;\fÒej¸\ríuIy    õW\1c\18ïêîË6\84ÏÏ#LÜÆMi9ºÄ¦Í±\16å«æ\9aP\9c*\17\8cø\8dH\8f\88Ê\98\85\9d\8d¢FÉ\13g\8d\88]\9f\10¾ß\9dnÝ+|\93·ÄX$Z\906K\e\1e»OñQÔ\13JÊq Ü\7f\ 1þ\ 4ø\amì(B~\97ljçÀSu\87Z\váÅ¥\ 3\96bhW®ÓP"¹\9ez@³U\92\1e»V±\18¼\11JÈÎ\82\ÿ,<\ 2\H\7f»¿A\9e\vö·5\92çë\16\0ÄO¥af\b\1fÎ\8dÔC\1875O\r¡þ±ó\98<xì\8b\vÀ\98M\12KQ®óê\93à\ 6Çe%TÛf»Ê¤\95\9c6\rS\vsFtÃäëTOU¿t(æ\ 5íÄ\1c¡2²\ 6Ùë\7f\10[
+ES!.?Ó\94ø¡#ÔðCí:[\986¨$ß´Rµ2G [ÍD§ÜU\85ÈcbÆé\99Dx(M<Å\16ù\8f¢}°\87|ÜyÚá%î¶\ fÚ\14µ³­}¦Ñ\92¿\18íº©\9cHm\8bzy\8aEy\80)\8c9Didh(C\bp½ÿKôoð\ 5¹ÊYÓ9_\n¯i¿QsÆ\9a×úÓ®kÆX3¶í£6R7\91ÂU&ª"c´T4E\84Ê\880éXÀ,t      \92\ 3\9f:\9eTÙÉ/>\ 2UÝ®¸xà\127\80óÌõªF\9bõÜ>Q\17öóL\8bª~:Ê¥ÿ#ï]ð[eTSì2»\8c%\18\85Ác\95\r\9eüÔÃ\86\ 6~EW×\19\9e\egØ9Ì\eÌ\1aiíå÷%¾3W4Þ\8a: }Þ¼0Ä_Á\12X|\17\90¡¢-ðƣ鵼\8f\87\84\82ÿV\94u\1a\ 5×8H{»àßYê\16F¸"qÄ\94-´F95\ fE\ 1!\19L¸è\8e/\9fÈ\ 5\ eÁ3z\7f\84\97óL\aw@éå\93\1d"\89\9c\13ÒF\82\9f²Rm\10¨O´\e·\81éQ&õ[Ð#¤\8aÎ\17¿ö\1d\96ZÅO¡î/©xð\12ºË¤Öró~9\9eT0ä0b³³Ü¬\fò4±ÁP\aß\8bbÔ>_nMFY%÷ý<ñip
+Ê;R¯xÑðá@\17ý¤|\8bë\8aüq\ 1j\1f#ßlºjù?Ap\ 2\ f\0\0Ü[ÇÛ\8aíx¶{ý
+ÑsäHýt\18-bM\97#¢²¥t8fÆÜß5ó}sßcÌÁ0\86f0\f\rCcB¤KèRê\95mc³EÑíµÕÖk÷ýÿ×¥ÿJH×[ÅÛ¢Å\9a<!)´Nñ\89oòO\13CÜç¼ùöI}5£ûôâ2\97\82å\rÁ\9a\94\9cÝæ0\959¥Ü\18¤tMب÷\92\9d\8c\16©ûÄ7B»\15ùÂ0\7f¾Ø\8b×Î\1d·ç×ø0äÍzÃDþ\vK\83\1eÉYe²è¼R\88U§J\9b\12\16\96«\94\89Ñ\90:N:\15:,\7f#\12ùÛD\ e~6·Å¾²\9eË\104o1\9dÊ\7flÙ`ÌÏq5­¨X\96\92U5Gû"Á³ì«êZ4¯tXÞ\11ú»Ü ¶øß\14\11ø\13àò\váÄc\ 4V÷u\12\96\ 3_<\90\15£Äà\93¬\a©S¸Nó\ 4}hýµª%Ì{ÿnÔ¾\82"V}V\94"Càw}ùt\12¡¼ë)ýbî3ÇzFj¦oK\12Ó\a\7f¨Ñ\e\bÄýj2\80'¢þQ9
+]\ fòÐ\BÈ«\15r1\e\a.8\8fC|\b\9cÎ.x8÷~ûßpG¦§m\ e<\8dÏ°\8c"i¸©S\ 5È˨µ\15\1d¬Ú \fu\17[æë)«E\95 k¯+WE8x\96ÃéÊ5µ\rqæg<k~\80\99ñ[ëÛ0\ 2n²&\rË\8aÚ®·cÙAúÒa\8cí\vJ\7fú\80gçþ\10¿"Ä:©"].fï\16æfô5\r       Rñ¡uõüBÜTu6Ï\12u¸|\88;\134Rú\r÷'ßûÒhN\1fpõ\@I\ 2!´£Bq"\97Ö:*«ÈpX'%Oð¾µýâ$ÜK#(¼\1c\ 5\95}\15ì\bvW¥ñ&ýü$§¹§\80Æn\81®\88àï\98Öxä\16·®T\95eØ­k\94\91øUµ^²IÜûªk\12K\94¦l·\88\1c\1cYÒ+Hõ;"ÙÌË\ 1\94Ý^\86\\82¯#G_\90KmáèR2Ú\1a\8dø\95fbI\14î\8fª-òب:Ý\90$;8³$N(ñÓ\89Çx\9f\ 1¸Ëa
\ 4\9e\991\96æ"¶¿*.d8\e\9eãýMOÔa±î\86N¥$Ê¡Ë\96~\f&(\9f\8b$~çÅ\1a>ø°\9eü\96\10tÕBM%^i\ f¦Õ\15ï3®¢Ï\90§E\ ef8UB   \0\ 4ô¸\83\1dà\7f\99ß'\11`-è\17icIaͨ\93ô+°¬\7f    ¹\10\90دR\9e\80î\86§´= Z¨¥\9f\87¢È¾Ì\18èÅ\81\eÀ=¸5Ñ\ 6U#ÚÈ5H\17«îþ\eâR\9eûå\ 3¤>njk\ 2y/§¥\12¦\8cs6\böÑHØ\83âE\foLº\7f\86y\a\8bÙþ\15ìCßGØà/¨ñ?QE%\8aá\8bFâv¹\97MMz)=ZáB.\15ßçÏ¡Æ\8bèÄ/ô¹Â\95ûç3¦ùÎíû\81O¼è\88\ 48\95\ 3Ý5\17&éY\17\16\11¾Õõ\9f\9eKìÕ¬(\97\17ST\ 2î e\8bÒ\9dð\8a¶ZV\95\1dËð\91x'ô\ 3xaVø4ÔÃ\8b\1cÉ*H®]z~¸h~\r£i\900d\18,ÛK\12ëý8ÍäCZyÑ{j¦êC\16F')\92\12b\99\1d\12|x\15´\85\7fñNJ>ÇVÞ{½0Ùêeí#|S\97¥ÛEì¯1bç\8b\9b*_\17\85RÚË"÷\8dÑ\1e\96ÆÇ\ f37ÊÝÂ\ f\80ÃBßÛâ\93oξìõ(p¶3\e_\14\9d<Ý¥%\13\ 3-ãèt±·É«\10 \ 4\eB÷eÐòtßÆ\93\18·\94px H\17¥\ fÿuRuɵ\a)H?§mü©ð£ã\8aæ\1cÁf\e@£IzËÍ\82qrgM_æ\bõ«þDü|\ 6Ce\ eû
+\86\88Ó¯_\81\96\15ùw\95\84YK/¼\96Ô¨  \81\9d佨/²\93êY0\83¼£ý\96y\9fÕ̸\1d7Í.\ 1]Â*ѳ°þÚa \8c!ëd\ 1\8f\99[ëm \98\ e\84Â\ 1#{-ô;\98\ 1[¡¸Ìï\10   \1c\19·\9bU\8e$\87mb?ci\ 6\9f3¸Ø\98s\92\99\8cqê6\ 1ÿÄ\82T\ 3À\rt\ 6ù\0Ö }ù®\90\fµdl\86\15¨êÇv¤\aå­{Â\ e\ 3yt/Ù¼\8e\84¤ÇÜÌ°\8b\8bK\8a\99\12Q8Ü\ f°\84\v\81\87½4ÈÊ»ûc\0ü'׸NÏâs6ôÿI½«\v\96fWÏ\9a\95*§Ò\87ÁT² \v\13\96ï9á\rÔI#Ò{Á ÑÇmVx\97@µ.\v\99å\8e\¹EyT³©}\80ÚWå\7f*\80fÒ¿S¸Ñµ:'ØÀhP³\8fof\8e\95ħ/\ 57ÈÞnÛ\fu\8b3Ö­FèüÄËc\94åÖȶ\aT\97úÍ5ë©\13¦yòŴѪ\ 1à\ eý\93\9e\7fLÂÄiÃÓ\94\80¹¤%v\1cÂI\1f\87¾Gæ    \14\97\ 3É\923îm?PH-k«\v©;\1a?ÉvÒbkk\80\ 5ôãÕ\89y\93\8c^ýÃ4o B\13\11[\ 2\8e*\82BoÁ\ e¡åR\v9¨§Þ^Fñtþb¼Iyd¯\92\9a¨W\9b\ 2\99$Ú«Ú\96¼\1cÆNãêT3óVYzl\f((ñ\ fm\83\89"Uïa.\\98vz\8cëC\885H8\8fHó$?sZ\8a\a\196\8e\9c¢=:È\ 1hhêB\ e\85\898
+`,ä\fg\146ô$cNú\8aæ!LÄp©<\8a\1db<\14ïÀ\12\99Nz;¶\ 50\1fy\8d%\80\r)\a°\1cè"Î\r«DÜB@\8e\a\v;\17\80.aÿÒ$G=ØW+²ØïØvÑFö\ev-­\8bý\85Ý|d%º\8aÝ¿Ç\81îgOŨÐ\1eÔ;$\11KF\93»î²lb\9au#«^$(\9fbÕ   ¥\82\8f,\87 \94jdMð[sÃÙkx÷vÿÍ\86¹ïc\96³?sÝB\96¡fl¶S\8d ¥ÿkø\80 ªMeÍ\88Ly\98\7f\ 3i\92Ã\143òTZuøgÖvñàî#¬\ eáøV'{\ fÿFð,º\90Ë8+\845\ 6\8eå%\©\9fÑY`kY o\ 4¾­ÙC¾\88,VQ\ fÕ"\98B½k\945WjØ\9aÃê\11\1d\r\1eaëx·\9d­ÐhÝkË"è©    Õ\ eA³Æ\9bÜ/ð\8a\8a\8fd\17\98XöÃ!\ fxJ\1d±ë\18\ 2(}¶~ÏÚ&¹\14|\96\1dÊÿËé     íh\89®?\ eí·¾Ò.\84òê\13¸ñ\90øÿ\ 4Á\aXS\a\ 2\0àªçÕýqX×}|Ö\13\10#CiÁc\bhÙK\99\a\bÈVF @ d\92·w^ÞËNH L\11\a\15
+jkÅuÖjµ­³\88V´JE)\9e­£\16Çý¿swmºü^\v´«VQe¢\92^*\17ð\85¡7\94cô¸·Su\13\9b5Ô.\9b:\92Õ5!{3°A/\97ýu@\ 5vÉ?êaD§åUNCþkù\8c\8dH2)ú\f1¡z%­9ì­Ué±\9bý»éÐÊ\ 1çvò¹°\97Ë!Æk\9aÕ0>]\e[#À?¬wÏsb\82\ 6÷Ä,4U\12\1f²\15á¤_  fà)\85ý\10EêÄ\8fÛ*    uä6\1fG\1ao7\e°6ɵê\1dèù¦{¹¿ \1fÈæ'\1cC¶É\13\82Ga\87â+Á¯ðRUõA=±@ù¾5\ e_ªrgs1OU¸\8aGÿ£*\16\8a\10\83Ê\9aë\ 3\1e&øÂQÍ¡Á\104ÒÜ%¸\ 1¥©×\1c\80°nl¡c=ú%Z¨\11 ÷\90\ 5Y\rÿZe\82ëà¨\9d\b4\ 6í\8b?\feC\8b\83\ 3Á\97`\85à\1cØ\v\1cÞ_\82ªÙwv\1fĦ10\eáKÌB\ 5\ 3/§ê*\ fBrâvÎ\b4\aÏ\8cw\aMèñ         0\ 1ù\9bà\18¸\1c\93 \ eó³\96`ø¤ñ$\1d\ 1½Ðï\92÷C\91Ü\9d\8aGàa6;g-\18N_\8d\e\ 4&É° .`\18\13  \ e\ 1\16¸`ß0üØù\8dM\ 2/s\¢\14P\9c\8d\92M\83fóª\8a`p\89¾3Û\ 2ìåÖÆå\0\19\f\1c$\ 2\82\88\ eA7°    iÚç     \97î\ 3¬c\90±û(y\r<ÓNÉâÀù\ e·ò6\0¶ôe/\ 2ü\fëcÿPOj± mê+\94YЪ\1eCËzÏÂ\7f\1fXa-\85\1cT\91Ñ`ao¦t\10°tÜ._\r,q\14gõªO\98ïÄöªI]@\90«\1af"\ 5\16µ       \13´?4|T¹]ÿT7[\18\81úr¾5+\eí¬D4UffNÕ]Ϭ¦ç\8b'¢Md\92dõæù¸YÚã%A'\15\81:\9bx\96>\9c\ej\98\87\94±Ó\8d\v\eÆ5!\92\8fiMSDÆ-rB\8aF\7fL\84É&\ 2¿ÁÚ\14Í^\ 4:O\95ã\14ò\ 2\85F\17¯-Tü\17Æ4\9d\8aw\r³è÷ÊèÒõT©²3c\vq]µ2ª\ f\8f\ 3\19ôdó\16/3²µùU\9b\;\ 6?åãØUp=ÔÀÔ@Ób\ fê
+TYRJ¦\803éÝøO )*\12+\0\ 3\ 2s\90WÀu¯.\98\aê[\8dì\17L6\97Ǽ§ÝA\9a. Çê·\92ß\13\10\91\82oN_\85=Cÿ\88|\80òHW \ f\12        Gz}\ eý\ 5\9ew\ÒÜ2\8ch{\19?ÝUà\16År_סä\a,[<\17§\99¼4\ eÛDm\88D\91\aøã\80·ð\ 1\14òú\12\92C/\1c\ 2ÍFÇlö\rMÙr\ 1\91¹¾ög"ÇP\T\8bMñIiÿD­¬wä\16$\99ú=`\föÆI¯Ó\90\vü§}\1fÓßíÆ6Ò.íÃj\aYîx^\9b\86ÿh}]ø\e¶Ûø"µ\a]Ëßÿl
+¾«\19\ e8\ 1\9d"Ó½Î\83Ç\90«ö\1dLúÁ¥ì"êHï\94Ú\9dü°k\9bè:^Ö\96T\b¢Ïm©©éÈ\17ÆøÏ\ eÂ\0·.À\ 2\89©\e^\97@1\8a\e~qxT¼ÅÇlùU\ fä¾æóÕ#U7\8d\91¢Öü5º\81:ÓöLÎE|4â\99&W2Ëÿ5e\95¶xzãß*Ì\86Ì\96\9fâÙÖMâ0\99ÕdoØ^\95lpm¬ÍëâaI\7fòSö7©kD\ f\13#Óùß'Í\8a$Ï"lL\15­?b\ 3åA\98ÑüD\ e\8d¹ò«\95NÝmEh\9e\v\97«8\91¬Ô\8c*ó"vÒ±ªEþß\11ýª»\9e\1c¶ ù\aÝ\8c5\ 4Z\81\9e5\1d\ 2\87¤\8b\r¾`zÅ\13~\bx\9f[«M\0N&Ïaî\0|Äbª\b\1fÂÇ\81$Ïch\ 6\10¤\v±ø\90ãè|c\ fq«)Mï\8b_¨ðá¾Æ\86w>bSÐ\9e$\vý\1aé     ¿Dòp«\7f\17¾\1eÒz\8e!G@\19o3Çñ\83È\1eÃ\ fÜ\1cÉa]\ e\ePnÑN2);K4 U\95´\8dö"¨p+q\rëð7b\18Òáù\1aù\14ÒóËLíÖ\12ø\85a\93y¡$\82\1f04\94»iCøc9\93Ì(û6ñ>E3aá{\88 Rä\8f¡ï0`Ý?às0Âí7y9'`L\7fÔq·ñ\ 2\1f`Sîéc\aL\ fr\0&M\9f\90\88P.Ú½á\ 2ü,ýÒ_\86rÄÚu\1e°\10ÙÁå\e/÷FÀ\eõ»º°Æ=Ü\8fÎÄ=1ltËÅ\9c\rô¸9>1\8a\9d
+\9bÁKX_ÿ\12t+      ¬\v\80=\91ç\ 4Ð#¬Ø«Líø³
+\14u¶uWç\17Kìñ¢Ø̹\96\vu)±F£@\8c\86´ó»\eïû\85jÔRÎý_$ Ð\13®ÝYuBÅ\9böGõbQl+$Ö\14»·,o8\93qÜl\90¸Å\16èg\9a\1c!\b\17)\v÷ÛÁ\88\14nî2\ 2Qùãή\ 5Òß\15UÎ>YtÍw\8e(Ùþ¢^ë\1dù'\19Y¦ÝòÑØ\15º\9f\15\1d!\85Ú %à\97GËU¸û9¼·ù\0¾¼ã,\90 ¿Ô&\ 4>¨YcwU\8f\14­±\f¨Mé÷\8dÉj"æ\1cÿ\93Z\eòo6VÝéWF9Õ\17=æa\93Àl\fm\1fÄyù\96Ö\12¬¿\9anqA/\162æAäIºÌ\90\8a¬\8eiâþ\aï
+qÑÔAN?!9\ eNxlÅbÀO°¹Î{ìeÙi\87Y\93Q½Ì¶\8d>S¸Òô\80Z\9fîª\87    .&\8csÃÞ\ 5¿búÑj?1\19\ 4\10¡Ç¡P´Ãék\9c\90åÙ\9fè¿\17\1e°\1ax²`дY»!í¸n\94ù6f®VJ\95\ 5?ffãoý\9a\89n\94ð0¡\89°\e\9aÒ6l¿)ó±7Ø\ 4B¹u\89yMA\83Ñ¢\7f\98&×mæ>\8f>ÃNjÔÁ#4J%û\81Ä&|\9eÇ\10ò\14\1eE]Û\8a:íÒiû2g¢0ÀÒio*ð6zX\8aÓÂø\13\86¬h\v+æÒ\82÷Ò\1f3;ü\9añ1"Æã2Ò\8dÔ+Oô?©\88¨KÜ\7f³ja\19½÷´ðÿ\0\ 5\bú÷èY|£\82nßMH\9f\ 4püA/\9aLsI5§\95cu¿*Î\90Dx\84!W\8b\f{\8d|m¯\ 3p\9dq%ªØq\9deh¦\9drÁYb¢Bt\vM7\9d»u\81A-\99
+w%5»\94,xë+\v\8f\1fzî!Î\8a\ 1}\1f|%­¿w¬pÈ©\99x\ 5e\1f¥Xx|Y\1a üy$M\ 2\9c}yòA\12\97Üzè5À\93\ f{ù+=\8e\1a}5"6\89\19~\8b{άq~\84p^¨Q~Md¨¤\19~*XÂ\9fÄ~,L¹\9bU~S@é\96Æ~\93\92\r~å+f\8d2\7fT"\8f\88P\7fÒ{p«U\85Ip\0§<\84\8adG£\b\83ÓX]\9e\83'Lz\9aJ\82\98\95Ï\82\1f\91)\81¬+\87\8cg\81I"Û\87¥\80ó{\19ª~\8c\ 6o³¦e\8a¾cþ¢,\89dX\16\9dØ\88  L;\99o\86»@¡\94ò\85}5³\90^\84E+£\8b\83\11#\1a\87\16\81ízЩ×\92\96oy¥»\90ÃcÆ¡z\8eÁWÜ\9d\1f\8c­L\ 4\98»\8a£@\83\94E\88¢5·\8f¬\86¥+½\8b\1d\84¦#N\86¡\82Áz\9f©O\98ïoK¥/\96\8ac\93 è\93ÝW©\9c\88\91\f\98$\8eB@W\93¼\8b|5¨\8f%\88À+×\8a\9c\86\ 5#x\86A\83qzt¨ù\9f&oM¤É\9c9c\8f l\98ÇW\8e\9bò\95\17\97\82\91\82@V\93\1f\8e\0\8e¨\8a\91\8a@\87)#\9a\85õ\84\0q\81¹£hÜf«µ\ 4j\92[Å°1lmPʪÿnpEÐ¥ip¢;\r\9f\81s\v\99Xu\9c\92éxz\1fÂ\8cr{\87qD¸äo×f«´\12pÈ[Ô¯\ 2qñP䩪sNEñ¤\btã;=\9e%v¬15\98\ 6x\99(
+\91®zÄ W\8bW}\rq(·¢vsf\80²ÊvÉ[º­°wLP̨Ox\13E뢳y
+;N\9cÞz11c\96Ò{v(_\90\95|è ×\8ab~mq\a¶C|ÏfL±o|¢[y¬[|\99P£§\ 3|ÃEÒ¡t}\1f;O\9b²}\9b1\85\95¼~/(¦\8f\9d~ä!E\89\90\7f§pÞµ\14\83\14f&°B\82p[Q«/\81àPt¥Û\81gEÁ S\81\18;P\9a¦\80è1£\94Æ\80Ã(ã\8eÄ\80·!£\88Þ\80ºp¸´,\89Rf\13¯O\886[Bª5\87\11Pc¤á\85õE°\9f`\84ð;U\99·\84\ 5\93ë\83*)\17\8e\b\82^!ð\88H\81§p\97³y\8f`f\v®\8b\8dÈ[>©f\8c    P[¤\10\8aAE©\9e\97\88\8c;Z\98ø\86é1Ù\930\85U)F\8dj\83Ò"0\87Î\82op~²õ\957f\r­ð\93![B¨¼\90ÀPY£_\8eEE\9f\9dé\8bÜ;T\98\\89\85\92 \87C)k\8cç\85\12"d\87j\83\15pm²\96\9aÙf\17­r\98=[M¨,\951P\¢Ç\91üE£\9dS\8eÜ;`\97Ð\8bÔ1ð\92'\88å)}\8c\84\86\17"\8d\87\1c\83\9bΡm\18fú»ènìi=¨µp­kq\94êr^m\9c\80µt\12oÎlVuÚr\17X w¿t\7fD\1dyßw'0É|Yz>̾j´qźjlÁrä§`n­t\ 6\93¾p\8bu0\7f¤rnvgkbtgw³WIv~y\12CtxÏz\9b0b{x|bÊùh§|~¸´jÒ|\81¥èlä|\8d\92^næ|¶~ppò|ój\s\17}AVtu[}\96B×wÚ}û0\az¬~lÉ;f×\87\r¶øi\e\86
+¤9kD\85\16\90ëmh\845})o\9c\83viNqê\82¿U¥tX\82\ 3BEvÿ\81=/·y÷\80VǧeP\91{µqg¦\8f\8b¢¶iå\8d\9e\8f|l\1e\8b»{õno\89èhLpã\88(Tâsu\86SAÁv@\84Z/ryX\82\eÆ_d\1c\9bÖ´2f}\99\ 3¡}hÆ\96\1a\8eMk\10\93/zámt\90Lgdoþ\8djT3r²\8axAKu\9c\87I/8xÏ\83´Å[c&¦\12³5e\8f¢[ }gÜ\9er\8dQj.\9axyýl¥\96\86f¥oD\92\88S\9fr\f\8ed@êu\12\89þ/\bx\\85\1dÄ\99bp° ²vdÜ«\81\9f²g%¦\94\8c\80iw¡\84y3kø\9cyeøn¬\97bS\1fq\89\92\13@\97\8co.àwý\86\1aa÷¹ë±ôd`´R\9f\19f\9f®W\8bØhè¨-x\91kk¢\aemn)\9bÐR§q\15\95\@?t@\8e\8c.Àw°\87\82tÿf4¯\8fuþh¦\9dåvÿjõ\8bxx\ 1m0x\8ay\ eosekz.qÐR|{itP?Ä|Öw\14-Ó~\90zK¿'rÈp{®\81sÿqÔ\9cãu#s\1e\8a\84vFtgw£wtu½d\9dx¾w*QÏz%x®?E{Äzb-\8e}¯|X½¯pÑz\9f¬êr'zò\9bssj{@\89(t¯{\99vxv\ 5|\ 3c£wy|\7fQ\ay
+}\ 4>ºzÓ}\9c-R|ä~H¼(o\17\84\99«Yp\82\83þ\99éqÝ\83^\87Ûs=\82ÁuPtº\82;b°vS\81¼PPx\v\81<>Ayû\80¶-\1d|0\80\18º»m\9f\8e{©øo\e\8d\ 4\98\8dp\8b\8bz\86\8dr\0\89èt?s\93\88^aÌuQ\86âO¦w+\85T=Ôy>\83¨,ï{\93\81¹\92lu\98S¨Ômü\96\0\97oou\93\86\85{pú\90ùsGr \8ela\ 1tq\8bÝO\10vk\89?=tx\9d\86j,É{\r\83@¸¦k\88¢\v§èm\16\9eÜ\96\82n\92\9bl\84\96p\1f\97ÝrxqØ\94M`Ws¼\90¯N\93\8cï=&x\15\88ñ,©z\9d\84\8f·÷j׫\98§4lg§\88\95Ámá£\1c\83Ôom\9e\82q¿q0\99å_¹s*\959N uI\90_<âw¥\8b6,\8fz@\85¯·\86ja´è¦³kí¯í\95)m\ª|\832nà¤Ïq)p¥\9f _<rª\99`M¶tÚ\93l<\95wJ\8d),zyõ\86\9e²Õ}!e¤£u}Dh,\939}\81j\89\82\1c}ÐlÏpp~.o\1f^\92~\9dq\8e\7f!t";\8d\7fÏw\ 1+\b\80ºzU±Ä{\foK¢j{ipÏ\92\e{Çr>\81\13|2s§o\84|­u\1d]Ê}@v¬LO}êxT;"~Âz-*æ\7fÕ|L°\9cy(xá¡*y«yr\91\rz$yù\fÖgWT\a\ 2\80a\15Ë¢¨Ä®kTd@D\dPPp-HGÀ\84&]¤30Àô¹½ß;s§\ fCg(\ 2\86  1DE²*n\ 4\ fº6ܵaïz\ eê*«&\9aå\a<\9fÞ//6\ 5è\ 4\10±\r\f\ 6\17¤O\ 3?\83ýQ}Ð0$   8\v_\84·{\ e¡\8e\88[w¨\12 ¢\1a/«¾!f\18\9bUmx\17rI\1d\8c\7fWB\ 3\ eø\94´5À(Ö\1fµ\10¼\8a)\ 3\8fØ\ 6Ï.$\1e½Ý5U±\90\e\15}Z\83!O¹O\93\ 6·ªæq\8b\8bmªÇÌõÔ\fõ\ 3º>\92\ 4>P\89\ 13 ­Ä¸g\15|\f\17\1dú,ûXñ¦\81\93ÿ`\9d£ÏS$\9a>BG\94\8b\fçDÇ\95\1fu\86\94#êiÚï#§\ 2þÜ\8c-ý`\1d­ó\9cxJâò!wÙ\ 2ûÊú\1eÙ\85:\91Î(\87«\8bÁ\a\8a`[HÑW¥¿eQÊ2U\82áFD\83º\82\87¶`à|ö\99§\1c:CÍèd¥\ 5\a\ 5õ\8e\81\1a~Tv­±\13\14Êkêè¢dEeUb2¯<o]\18á¯^jèÚ\12\ 5´j'{\16@¹´sçJÉ»î·u\ 6iW§\86\8f\96Å··\0õòo\9aå\85W\15së·%¯PFU\8e\87ßV\1d6\13[f\ 1»ù\v\9e\19Ðrúu\eOC¹\81U(5\94?Äé©à"/Õ/äÝb°à;\92\14ßHú\95ô-O
+\93\10o¤_ý%Ä\ 5Å{\8f"b\ 4Hkí&9q\¥\8d\9cW:Æê\88îr\99ò\1c\91&\19ÏG\88%2.i6þD±1ô%~Fù\87¿+~ZýÉC\84?\87\1d8\82\9fV\86Ø
+ð2\95#\83⮪\93\8aÓØ\vui^#v
+ðNLÁ\ e\83\ e¡\ 5Ø\8fàS¿ÛØEèñ\84Z\84Ln©Ã\96\15áè=l\15\1d\87va\ eò;(\8b>̽\85\ 2èp ʠÿ\b\9d\86¶£½~íè[ô\90\87\bË@\9b\9aQd\80\e³F!\95\9c7\95\8c\bÙ\ 5$\9d\89Ìù\8cäÐÑ   \8e\88\85Ú\e\ 2#\97Èd¿Lt\13\11æ!BOáK\9a\9fÌG-i°ÙäC\96Ãr\83\1e.ÒUål\81\11mO¼\ 2\r\86,Bæ2Wü<\10+Õ3¡6\13¹\8d\9bµß\9bíÐ@µ\13Ñ\v\1d´)¤Û &KO¶\r\1a\8fû\0ÏÔO\ eþ\r\16igmú\8a82\ f=DÈ É4FB\e[\86ÌÓ!AãIb\ 14½~\97¤\ 5ü£Z\97í\0     *\86â¤\10fz\17\\ 4½ÕOÚt\ 3®æF&\94\88\ 2íÏÁÓ\9dN&3xôàFÜ\0ê[®H\96\81\8aýz°¹&3n14µÂ\10¼\ 2b\8döM\aá ­zB¹Ð!Õ\r\ 6\9f\9c\17|\87®+¿\18\1eå\v
+/\97\ 6hw\16{ìûV³\lÞs\97ýT¾jçgæ?Ò\9b¾\12ú¼â©Û\9fÔu «ê¹®¨D­}û\94.\83\9d5ïʺÄ(wM\12\92  °ýÒ±=ÉL·üÄÎjú\ae³o(u\ý\9b»\vy\1fÚPµXû³ü\9eæ\83Æ¢8\ 1ùp2¥¶¤\9d\15©23Î2"uhì0\r\0Á;ý(3\98àû-y\ 6bÝ·\913àÑÊÕ\1aWd\19÷\89sFÂ@wÖ    É,¾É8#å\19óè¿!ÆØH*\159¾ã)iF^
+¿\10\8fP7÷½D\ 4\9agÛÄ\ e3I\9c33D_\ 5Âè«ôºâ)Ô\13J\9c\ eQNdOÌm2\91tØa':\89=ÂûÄJÜê.ÆÛ±¡
+\11sÞ`d³é+ú\14u\13u\97\7f-\8a Çµ\89i\97ȵ\\7fL
+\ 1±kw\84á/i\83ð\ 4®&GÜ1|91É:Hÿ^ÙÈ\1c£gWü¢ú@-µ\0Eí¤¯if\9a?Q®·F?Â/óKvü\ 5ßÅ\99\84MØkzÔÝ\88u\90NÖ0:Ó\8e3BJ]÷PU@âÕ×\8aV\12V\e\92z\ 2\1f±¸D\8bñPCÿöãØ9>R¨ÅTl\87{=\16E\8eY^Scí\ 1ôyjNË\13å\189Ûþ¿Â6b~mwj\1c\1e[\99\13í\8a\rZ\16l'±d}¯°\ 4[¡YïÞ\8eM¢:t\1eU\ e9\87±\15\15\97óWI\93-#\85dî=ÓsÑ£½S\r¯ÄI\91Ku\ fÊÆ·6i/JO{×sý\8a\17\98c@6o°©\8a\aP³U,Þ'9cV\96~ÉM6²åíI\16½Q\9a\1f1ÀWÉwoÍ×T+ã¼ml³ºF0\87î\85\´O­·d­È?Íoä\1a\89³iº¢4ç\90ÁM\99\954M·C%\8aHÑf©M[×r0pÑ[Ï\1c\80\84\82\1a|R»Â\92\ 4¥Ã/L\10d/_c8\b\1e×\8dÀó\12\vùYpFøKM(Ü\1fø\8cE\10wo\8c\1e\ 4jj\ eê£I0/¢¦Àk\8dad[\99H\ f\92>Ùþ|/Ñ\93ðLó\8eð\r§¹\b|0ð0S\87ïõVR\9f±×\82V2\17C¸Ã¦¹ü\8f\10a\88Ñv\94\ eé4\1ax\7f«ö,'LÈÓ82\8fÃ\ 3'ú7\ 6âô¿&n­\84\8a&\1d\ 4CÄ¿ñ\16ÎÍ\18f]\ f9é-f]i<?h´ï_£ù]\8fÇ¿â"ùýa·\98\9f5!\81       ´+ëê\9dCöQ\8f\ 5O\88}D\ 3{Âp´\16\ 1íúÉÕ\9bÅ\ fx\1f\e\9dէɰ\98ãi¶ÛX\e\ 61ktÍ\81\16M\9bw:\19Äh\ 4_\88Id)[`\b\83¡:\9bý'1ªí¯\13f%s÷ªÒã7²^V6,\88î0ö\ 4¼¥|ù\eÞÑÄ3ö¥\9b3~\94ú+\16Ôä\94\93*\e\9cwªPPK\14º¤\rW\r\88ô{ÖW\8c\8a\17îª0ß.\eöÇ\f§¤\9d^\ e¼Mq×å\ 6'\ 6rÐ>{\9fè\8bÌT÷¾¤¦à×\1aaéÎ4EeNÙ\9f±¯¬¨äή"\93VöÐ_ªÇ\94\ 4Ú\12µtõf6\13\9a\87ú5\b¥ÙÒ·µ¤,®  jP\1e\93úÑ6E\91\15«±x)Í»Ö\19£U\8füSu©@\8c×6M6ødµ\8e\91Àõ\88½®\17¨\93FÔÌ\aþ\9bÏV\16\80»SˬGÀÞØŦwÐÆ û\86uÐyÿ@>\ e\8aåTÈ\86Õ×éVäOdj­\ 2?#驺\8fsyc¶¿ãA)w,zl<æ¨ñÿ\0\ 1\bþ÷Ù\80»B\96\8d*\80\907\1a\8ai\80j,\\87©\80P#\12\84õ\80;}}\99~\88Ýr4\96ñ\88\12fx\94O\87"Zh\91 \86\1fNM\8eð\85\1eBe\8c@\84(7\a\89\97\838,i\86õ\82A#F\84a\81N}\12\98®\8fÎqÇ\96*\8elf\v\93\89\8cÍZ\0\90Û\8b\f\8e2\89HB-\8b\8c\87\867\ 2\88ß\85Ç,y\86Y\83ý#p\83ç\829|½\98\1d\96\95q\97\95\9e\94¨eÛ\92ï\92NYÆ\90*\8fµMº\8d}\8d"Aî\8aí\8a\98\88U\88\15,\80\85Û\85\81#\92\83\84\82ý||\97´\9d(qW\95,\9a¦e\95\92s\97\8cY\7f\8f¦\94!M\81\8cö\90¾AÇ\8aj\8de6Ã\87â\8a\17,\81\85}\86Ã#®\835\83\9dtë©PcèjO¥ãf=_`¢rh¡T\1f\9eÐk\1e\9aîm¾=o\96Ùp\90\92\9fs\8c\8eHvÙ "\89øzbtu¨5k#j\10¤¸lº_-¡$nnSÿ\9djpDH©\99\83rB=t\95ytn2Ý\91Ov½)\a\8d\ eyL \9e\88Û|\ 3t\15¦¼r\14i\9f£Is\r\9fµt\1c\9býuSHt\98#v­=_\94.x02ë\90\1ayÎ)B\8bö{\9b!
+\87â}~s¬¥<xÑi'¡Ôy?^W\9eLy¹SV\9a¢zOH-\96Ü{\ 5=:\92þ{Ö2î\8f\ 4|¼)p\8aý}Á!g\87\v~Ós@£ö\7f|hÀ \97\7fg]ð\9d\16\7fORí\99r\7f:Gî\95\7fA=\14\91ï\7f^2ì\8e\ e\7f\85)\96\8a$\7f¾!µ\86U\7fÿrá¢û\86\1ehn\9f \85\85\9c\1d\84ÏR£\98y\84\ e\94Â\83Z<ø\90ÿ\82¸2ì\8d3\82 )´\89h\81\8e\85¼\81\ 4r\92¢7\8c\8fh/\9eÛ\8bu]j\9bR\8a\1cRh\97ª\88¦Gv\93ú\87:<Ù\90A\85Ù2ô\8cv\84\83\88Æ\83*"-\85=\81árY¡\99\92Ågû\9e<\91"]2\9a¯\8f$R1\97\ 2\8cöGD\93T\8aÏ<©\8f«\88¯2å\8bä\86¡)ð\88?\84\90"Y\84×\82\99r+¡0\98Õgý\9dÈ\96½]/\9a&\94\ 4R\1c\96`\90üG;\92¦\8e\f\8f\ 3\8b42ö\8b^\88u*\ 4\87Ú\85¹"|\84\85\83/j      ²×cj_ü®èe©U᪹h\rK°¦$j\9bA\80¡+mX7\89\9bèpM.=\96tsk%½\90ÙvÓ\1e \8b\z`i\98±òj@_×­ÒkËUÖ©im\89Kº¤±oxA\9c\9f®q\9b\9atsó.\85\95\ fvp&(\8f\8dy(\1f6\8a0{õi[°\84pÂ_\93¬`q»U¬§òrÛK\99£5t7A\92\9e<uÁ7Ë\99\15wz.¸\93ÇyQ&\82\8ec{V\1f·\89+}di$®ùw\b_OªÛw\83U_¦vx\1aKk¡ÈxßAv\9cáyÐ7Í\97Òzã.Ý\92\9f|\ e\8d\}[ '\88K~ªhê­¢}9_\1c©\8b}AU-¥)}TK4 \81}wAd\9b¨}Ä7Î\96°~..ü\91\97~§'\v\8cv\7f\85\87\8d\7fÊh·¬\99\83c_\0¨z\82ùU\17¤\15\82{K\1e\9fo\81þAO\9a\9f\81\97\95°\81L/\19\90°\81\13'A\8b°\80æ Ó\86î\80Âh\8e«Ê\89[^ñ§\9e\88~U\ e£0\87jK\12\9e\8b\86EAC\99Ä\8517×\94â\841/7\8fé\83D'r\8b \82b!\14\86k\81\93hn«/\8f\e^ï¦ð\8dÉU\ f¢u\8c\eK\r\9dÊ\8aEA8\99\b\88\81\949\86Ð/A\8fO\857'\98\8a\7f\83«!H\86\ 1\82AhZª¾\94¡^ö¦b\92ÙU\17¡Ø\90\88K\ f\9d'\8dýA<\98g\8b\83\93£\89$/L\8eÍ\86ß'ª\8a\14\84¶!r\85­\82ÍÂÏh\ e`à±JjNc¿\9fQlyf\8c\8cÂn\99iMyÃpÃl\13f\96s\bnðS\9furqò@èx u</\b{,y\ 2ÀîeEk\7f¯ÓgÈmE\9e\ 6j*o\a\8b\9fl\80pÌx¼nãr\9ae®qdt\7fRØt
+v|@Uvõx±.Áz={9¿)bØv\ 4®"e\86\9c\95h\18wl\8aEj\9bx6w\8fm0y\10d±oæyüR\11rÄz÷?Ìuç|\11.\81ye}S½i`°\80Y¬jc\83\80\ e\9aêf6\7fÌ\88Ýhã\7f\96vRk©\7fyc®n\90\7fgQNq¡\7fY?Ktø\7fS.Jx¥\7fL»Ï^Ù\8a\8cªæaÉ\89Y\99qd\9b\88%\87vgf\86ôu/jO\85Îb¼mf\84»P\9b\83\9d>Ùt(\82o.\1a\81\1cº\81]^\94«©©`c\92\97\98CcH\90l\86Vf+\8e;t)i0\8c\ faèld\89çOþoÌ\87µ>tsw\85[-òwn\82¿¹w\-\9e¦¨®_A\9b®\97Mb0\98\89\85ke#\95SsShA\92!a7k\91\8eçO|o\14\8b\92>#rá\88\v-Ðvö\840¸±[D¨n§ð^a¤\8c\96\8baS h\84ªdL\9c%r\9bg{\97ç`\98\93\9fO\an\82\8f-=Ürf\8av-µv\92\85m¸3Z¤±ê§p]­\v\95û`®§Ü\84\12c¤¢\8dr\r\9dC` jR\97ëN\9fn\ 2\92b=\91\8c\8e-\9fvB\86wµ~o®`^¥£q&cc\95\16r\9dfB\83Çt\18i\vqõu£kÚ_ôwInÅN1y\11qØ<¸{\16u8,-}py\17´\18m\13jy¤\94nÎlp\94\19ptnR\82Þr\18p/q\1fsÏr\15_;u¨t\14M\9ew§v2<Tyéx\89,\ 4|~{6²\99j¿tn¢ül¦uf\92­ntvT\81\89pEwFoür+xF^Jt8yZLâvkz\7f;Ûxà{Å+à{¦}6±\fh¯~4¡lj¶~F\91(l¦~L\80Fn\99~Qnßp°~e]erê~\86L:uM~­;swô~ß+Àzæ\7f\14¯\9b\87á \ri\f\87\1a\8fÒk\19\86<~ÿm*\85RmÞo_\84n\\8f\83\98K tU\82º;\17w&\81Ï+¥z@\80É®oe~\91\7f\9eêg²\8fà\8e¼iÑ\8e\18}økù\8c:lðnH\8a[[ÕpÊ\88~K\19s\80\86\99:Ævw\84\8f+\8e\82\81dX\9aù\9e\ 1f\9a\98\7f\8d×hÂ\95Ç}\1f\92ð\fÕ\87_S\a\ 2\0àÃVN±u\9f¸\15\88ØX\81\ 4DYâ\0dÏ0\ 5\91@\ 2\99/y{¿äe\ 1²§`\19â@­\9e=ÜP´öª§\888\8a
\9e\88x§ç\8f+Úûþ\89O±¾pOé¢T±ò£Ý+ì\98æg\8b\9f\9f\11xjZà\81@\9b\99\8ec}9`k`cTnwó?í+ò^5ú¢²\82¯j³ä¤¢¹\92\93\1eT&ïo
+\vÖl±×øE\ 2ùæx\ f\v{óXföPg@C_®[ÇG\9b=/¬5\16éÏg\9a4\ 5\1f\14ÓêÊ¥^E×*\ fízªþ¡´ÂÏ   ø³5È#\13´p½\1d&\ 3\9fåX÷ÿ\11s\96Y>\80ãû>\83\9f@?Èn\17\ 4ÀíòC)\85HKÑ\81\9d#èEu·ä$þ%àí\8e\11­\90û¡\ 2`^>[»
+ø(?`~¤\7f^x\0úÍ0¬¬ÈÏ\0_©+\93\8b´§v&"YÀ\98D\8a>\ 3sÝ5x'²±]¢¹£\19«~¨\9dÐ-ç\a\80iÀfð¡~\85>NF\18"\r\ 3Ø\ 6\9eÙñ\0^\ 5O\97ÌGî# »\fëÇ\96´\ eªî ëª0Í<\947íÓ\86 7\r\9d:\1csÊÓ\ 1ÃXL\92\87!\akݱ\ 5\1dÄçá×x\81{\166\17\7fÜR¦tå"+·¨@ö\89q£ú*\e§7k\971Ç÷Uèª\98Y\89\1a}(­Ù~\1e\HÝ\13ë`\17\9e\82æ\93à·\áµâ¼
+±ÒÓþ5ç£2[{\81Fõ;\8bOn·\96çÛ\12ú\81ݦ\ 5ÛÃ\r\81\1c*\16C\1aæª{\1c2H\8d\1e<¡è¬N-ßS´º2\81ÍUråÓu÷U\1fKm¹³5\1dų\12Bu\9c\95
+}£·ñÏÄ3À!ãJ÷H$\87\11\1c\9c#\1fh^Qv¾0ªq\eÓUô·ºY:\91Ê«ªa¯Z=V.\88¿ }VÒ\12\9ffsôy\fîå½ÝÃ\10\aÖ§¹MîßÑP\16¬8Û:Æx\16-kîÕ¶(+\e\92rÞ©ãªGãSµIå²Ð­\80¥øºO\vø¹ùw÷\1dðiιþ9Ñ\98y»¸\97\80³\9f\92\97\b\86z\908,kÊ.$\86äxì=rm\11\15RM\12êï¼ÎR\8e\80Øí\ 3u\ 5\12×Mb;d\97íw0yÁ\vâ2Ö¤\98\e\9c¾§\1d\97¨WÆ\8añ6m|\88\ e8êE\12C`\90ð\vòGd]í\eÄMm²µ"\88æWü\ 2rSç¦\9cD¿\ 1ò²~A\8fêÿ\1aS\83\ 5\81\8b\82»° ¨Ä+\12ïG6\bW\10#èÿjnA>p\80Õ\0uÂw0\eì\82D(\17ÃMHOÖB$\0õ\8d\99\8eü\8ev\aKÑ»X¬\97\0{\8a½\13®'VáíÕ'\f5ôc\v
+
+èsh\19ø\1d]T4\17ÚIÏÌ\f\83ÿDµG§Ã£TDÐ(2BNlz\8d9\93eB_\1c Ý«.ë#­J³UÿÒbG\8e\18\18³ºÐ\17ôà¿É°\80\1f\8c¯¢ú¡       îP\10\8fÌc36õ ûèß\85!Ø3\8a¬ü\ 4\ 4\95?ào\0/˼ᠽ¥4Ta1l-vK\1f\ 3WZ§¢\92¡õæ\eAÁp\9aɾ©\ 5éã<\84\11\98\82>\©Ð©\eæðÞ\80kía8\ 1¸Z5$\7f¯GÊï§ç\18d¥W#\87À\12{{à\e¨ß¢ßÄ!        ¦eÂ8l&ÓVé¨\1dlu4õèÊ\9a\87 \ 1@Ô¸Q®\a\9eÔú¥½×÷WJ"­àçû×\ 5\1e\86Òì\8e\9b\92àÿò\17\85)è9\16(©6\8dg\1ef\f¦yÙ'ô¼1?·Jö\ fî¡L)­ábåÉ\11¡ì­¢ü­©l\92º]4ÂL\ 1þkÛ\98ëPpñuîï²¹ô)nCA ÐŶ+2d\8bØõEHÊ'æ\9cêHøm&Y3¹u\ eó\19 \10õÑ·ÁÕkïѽ\88\8bý\ 5Ó­\8a¡\8e1\89ênÝ]ú_Z\97<\7fÚ®£RvÓ\9b\81\89ðpjÊ\0m9GÝ\82\96\8a¾§®À#\ 2\aj\10}d\e£ÆA\15ù-u\0Ú í¡¢¡\aû
\190\94\C\ e"\82°\1fÉ\1edhK>Ù\85\8b\1aÈ\ 1\8c\11\b©Ù¸Æ:IF\93\14q\9e\BVhF\88'$\97[I\9c&3\92\97\13\15äæ°B¢\99tÙâK\ \9dDåÄ'â\9d`;\99I\f[¿"\96ð%\84#þÖôNã\87÷\9a\÷¾Àë\8d\1eI
+|?·a×\eü8+ñ\1fÅ\9f3\81"-\11\bö\10שÕ\16\ 2_ZZ\84K±O%\ 2u\ 56`·î\8dÄÎX{\12\1fcçͯw1Ø\vÞÙÿ$¾Ñè+ÊÁO±\ 1\ 2\ 3\11M{\9b'±ø\9aEØ],¸j¹z6¶¸¼+§\ fý°\7f\f\9bQ\9c½k    \16a=â_\88µò/E      ¸\97q¦À\8c¿bV\9akÐÞ&\16S ß7<R5 |m[N\16\9aSµ<ñ\vT[Æï¼\87ö\14¿ö\17c\9eÖ\9d"16`²\bªñ\ 6f\88i+mÈÔ\82Ò\12§ì\1cE\9eýhîöÌë6©Ì=¶Ï2%w        ýÉ\W´Íw3/VWxú\eG\80­kÌÜ    (\9c\1e+îÌK6\°Gå³òk6\aygf¨¥«p86×,W   C       ~­¦Â×Ù8\f¸y\86q'\rSkî±õ\883½ÑvIù\17ý\88Õª*\95/°ÄkffÔ\9b]´æ\98_MãÀÊÐ5Æ\9fô·$Ϲv°Ñ3\9a­\87ë\\972\1dèe*Ëò^\7f\?ÃüÐÀ\17|Í_\ 2\13Óÿcj\86\841ñÆ\12xÚ¶+\9c\ 5\9e\90\9cemÈ[Ï8¦\1d\9bë\9a@ßÅ\83Èr³\1a\17\ 1\f×ä3¦4¼6=Ø\18\8b\1f\8f\1eãvã׶Á¬\1c\7f+©f\8a\895\9e\ 6\91æj¢W\13µÄ\10ïËuêÚM!\\84ì7c\0{1í\1c'a¿\8c\86Ø`&y[8#£ÏH\bú\18½Ø3\9d\9eCi\OR<y\8d\880m·O×y\e3lN2\ 3'µ\N\v`£Ì\81QSL\9e©'ä\ 5\18)\91Rãì°§\94R3I®w('êgü\81ÑV!ÔöpGËJeÓضR.u\80©.ö\8aj O[GC¬´\83ù\80d5\95aÊðL!_s\ e®ãd\vÝ\82\13F\87ú\85Ú\nMͳ¼&Ö¹j~*ÀüA\10\9c\80%y\0\0\0µÚÊ2[Î\¹\95\8af\16â§-:HÐLeyby \9a
+¨ \97È}ÈýsüÜ\b\82â-j©³»Öü\965+Ú²kE\99\9d³Z5׺ֵÒÚÞ\9bc\7f\84Á¨\96[GS±J\96©oÓ\1cŤÞ\1a\97¯\0µ¤\95\9f\ 3\85ÂunRÅ\1aÆ\89¦o\89þÄQ'¤j
+»Ùñ9y<\8bi;M½\9b¼ÏB¯]
+\97\9aüYÒ5SúA\1e*bPW#Ê\13X\9a~$u2Ðξ\1a/1×a£¾+ºßÀ` ³¾µ®cv&ÛL/Ù0¸Ì°\9bû;t)H\11Ü\84|©E×\aòß9ï1îÑÝ\8eçÌjÂÉ\86'u/\8aðÖqvC¦Ï|\88\9b\99\l´ðWÃÙúja\14\14©Ë\14çC\18\9am\92^~nc\ 4÷=í¾=\857E\98m+àO\14\14  |\99\ 4Óvádò\97\86,ñ<8\ eL«O\85\16j³%=\90\9fÔ\fY0o\97}·Ä\8f¶ÅvCBÀW[ÞK\ e\15&\9açI>füg\"Å&]ÐÇKOÃ\91\f\ 5%ije¿B>\ 1\aä%¼à\ 6\99j\86:l=®ºT1e~ ª/ð\1aߪ\16\r\8b\94\83I\1e0^Y\b\8fÕV)\ 3 <õ^ÅÏ\91ë\81%
+\ 1·Õ¦Õ\8fQS-Wõ\ 1\15\ 2ÓGpa\ 1θDû8\ 3¥ß 9\95\91Õ\83ðXM'Ð
+\ 5ÕóUÊÈJ\95]Iå"­\97mtª¿e\8duuE²)ÓÌ-\b3`\8cÒ\8cù SoO\8aÓ\1eÕý\0\9f£\99«\99\826\ 2Ju@$¨Z­ZÏùÇ\9aá\1a§\8c\9a;\9cþåo\8cÃö\96ü\eúaëõm>Ý\8492)@\em\90¯{«Öêþ\86\ 2¡\9a\1d\91»\94>Õ-ÆV\ f³|\7f¥°³\97 À\95´\8dWUæ>rß$\13Ó²]\1eª\ e\91¸\1fÿÆz\96EYuÉ\94ÅÛ\1a>\ füGT@\1fè\9a©\1e©\Þ\ 1'ßÇ}Ñ\9aG\8dÊý¡9\8d\ e¤mp.d.@L4\1cc\8d&,·\94r;bÂ\rÓ\82ãá îdýlúÚÎÍt3Ñݦ©]Q<ä\1eb\9eÌ-w\r°ô©\9f\1c\1aN\1dÂkÃð\94 kÍ\v\ 5\ab\búKâ%áï´Ã\12\ 3íH»\84\93@\fj\99à"\8aW4\añ²sf\9c\91|Aêa{¨à8Âc\9d%\8aJ@\18ï\8a»b\9c W\92\12\81Õ\\93þEÛÔæ':EhsÓÅ\99Ø=®}âó9fǹú¼T¾ÍWÿ\f!3ß\94ô% \fפÔ\98\11Ý]YzÄ\80&X\1eI\1dk\19Wd\11PÍÙ\8a\1dØb§]±9g\8bý bIê\ 6ëiù\f¢Æä\93Ï$ õO\14þ1wu_)¾\89xª®S$P\19î)m/þU\13I\vÃ.m\1cÔpsf5\9cUwl}oy\bø\10\1c 4á;=DU\eóIKS\9e\80D\ 3\10j\8c\ej:\81\1a2\9e*\1aw¼0P²Ï4\ 4\82¿oýÅ\12§+G\84\18Ë4O\126\82jµeu\98æ\ e\10\vÙ\ 1H\94W)Ï\9b\83øÝ®È\86\8c¢s\ e\9c51û \roº½Õkæ\19Ü\b¨a\ fÈIÈÓ½Ö\92WoÐ0Õ%\10>\10­ª#\ e}?Vþ5NÚÏÁ_ÏÛØû r\ 4}¹ë%é7\14¥­\8f\1a
+ßÔ¼\82Ñ\1e{Ä!`åD}°üÂK_á4\14\88
+\89!\83¶ªQ\üîHÒ½¼ÏzÈ\94\ 4ôHçNÚ>\14«uA-\11^á²°²bg\1a¦¹%+kÌ5\82\9e°8ýWâ\7f  #ýwi+\8b¯öqéÇ0Þî\9fk\85hcû\8fuTT\99[ÀÖÁ\19Î`î5ØZ[\9b`ËJ¯      &º\11\1f\9c\10êv\7fÍ**\96ö\1ccs0\94®\10Î\0:¿-\8a7\1f\95Øô\81o\873\1cG\84(\18ÖZ!\9e\15\1dd\f©\7f\14\1e¡\v\91z    Q}v\81°x\93'E\bÁ¬éð\b}èà\96aQ#*ÚÕ'\96Áévi½\16Æ·|'i\8fÞn\88\92\8e\85˵Y²çø;½eR{ñ\82îEÒ1ÌÜv\96ôiúk·Y¶\18\15èTË2á¼\ 6\8a¬\17æ4o\97/\8a\ 6õ;äªðK\9a\1eù\v|O\ f       \10cÿê
+\ 1Rr_´ñT\97Ó'\9b\eU\18ät£Ky\ fγ\19\95zØa\93L\99\1e=\fz\94s#\16k\96)Æð|O¿\1e\8a\9dèÄ\80\8aÜ\87­ý:aúxÓim&ò\99ã¼&\1e^c½®\86Â\8e\19o\ 1\93`\90
+\e\91¦îWÊñ8Ï2K/ÖױϬ˽ßò\9fñ^º¯i©Á\ fùÊ\ 1\ 1áp\91\16\80\8d\19óÔO£ßè:\ 1JD­:W\15t\14G<Z2µë]uyy±+\96ü\960¬¾H5W\a²?16×\90        ~u\81´[\184'\90)BÝæ\97rjâXâ\ 5\82\a\15Ôê\82>\19±\8a<Ü8Y\9dJ]
+\fÕ\84Ñy¬iZPí-|xm\1c«4×Ä\12r¦Qe¼`þd\1cZ´H\f;4°SÉìí¹X1Ì\9aå`\11¯±wª\8aª\9fp¼u>Ê7<dE,]Ìÿ5çJÝ\ 2!\1dù\98óT¼%\ e"\8c\95\14\1eø\ 37%:ã  -+\12Ç6\Àw\8b\9d\8a÷\95Oêç1=ä\92zsù\ 6ê[ITNXí\19\89\17)bOIUq~\82JYéþ\14ì÷À鮦Òt Í\86/?¦\1a\95w\12ãU[j\e«Ï+Ï\96\15Qz\95UÙRÆ\1eÅ'd(Û_Ñ\ eû\83\7fX±qïÃB\9fy ³\14g5m³¢ÊV\19Æe\ eüq}\19£»J©ûsg[\8d\[\9fõ\9a>¢       Hô²2\0\1dì<?\ù`ÏÅ\ 2L\13©£¬8Æ\19nÉ/½j?*ý©BgK¥ß©d\98}¥Ód\9b±"KK{      ÞLT×õká°a\9e\a(\1d\9aÎ\87t=noÃ\ 6´\1f\94\9ciÁH\ 3ËA×-:\92¨s0J\19¤\vÖ·Ya´<Sebv]\14Ø
+\eà%ª;\868;2\ 6\17¶/+BöM\98\83qÿvs$`Ù\89öY4/á\ssi iUcdæ\18õ\94U\9bø\ 5ó\88a\ f¬\8dû§fhð6uaÉPë\aÚÇòõ&>ã%¡C\82d>«zES³?«É+éæ&ÓÎe\ 6ð{\99\15Q>\87\aÝ+)\11ú\r\94\90^T9ZîPàäåF\ 1­ê\7f\86ëü«\89\ 3\ 1\0ðV+ú@Á£¸\8a®\16\81l@\f\ 5A      \88\8aB\ 4\84
+r\873\90\84\84\1c\93L2÷$\93\99\1c$\ 1Â\15\b \80x ¸¨ë\82Õ*,^-à\ 1Ú·[]ëù<**è\96R\1f®ÚíßðýôI\e\88<E\8b|Nù\0ðB\89ç¾\a\85jÏÄ*ÈKó=×\8cºÃÃA\1d\ 4\1fÿêèua\802«%VÜ\ 5¼²/\92.RC¸»\f\a\7f\97v(Ý´®Ü¥ªKp\Â\ 3Í       t!w-<\81Ï\vªÃar[×fA72é:%ÌE;­Õâ),\11ýAjÇ&%\ ey\1aÞ\91\13\ 5$\10\82\84xPM\86E\8e@\13ºµAf¬W\1fxx¨\88¦¥Mé%|zWÅ6ÑJÚ\vi,»o¸VÖ^>npdk\15\9f\fŻΫ\v\r\11\91:ÈÃà\15\84£\1f©\89\82\ 1û­ÆÐâ>Û\1dKXi­õ<¼_\8cTT\8a\87¤Õ\96¼¬qùcsØ.\9eJmZ\10¹E\9bÂ\8c\ 5\81¨\84Æ\ f\13\9d\84¢\9cúhsVIbm8tS\94äX&^ a*\7fÉ\8a\91ÍÚnð^\ 2Ý\15m\91î\9aãæ=A2ä\15s§ó^\1e»mICca|k\91é°`\87K\ 2±\85{\9d©"YÙ¡:nf¿,Ú±\9aW  xØ_n~   ª¨
+\12!fÓç\9d¥üÜ#\83\rÞ\ 5äA¶É§\18o\8fÖ\1e(u´\ 6
+gį\9bVgæ\94·ÔÏçE)\8dÕ?nî\ 2/Ø  bd£éSû\11u3ßQ·\ e¼Q¸\96ùI»B`×\\81\10áC!\e\9e\92Äd\bÑ
+ÙPÜ,Î\ 3À\88\192QC³\97ë[P\9f\12å\91Ò»µnª`±\9e\1eR\9f\94º\83£\9aXYUé^í\94Ò'ý,|Y5\1c\174-\11}Ä<¸\9fí«kÀC÷ûÈf\14Þ\8eo\15\ 3ÊÛ\863\0¨²«¯«7\82á%\ 6ÍRÍëôå\90/4\18ç\85ä!=\11\14ö\b\ea¯'\8f\91\7fmý»´\ 6fUgÉL\88\ f\95¬(CfU]@::& Ô
+¬wo²¦\1fß¿\93\81ÙD[D$ú\94<ÏÞHÜ×½k\11\94\19¨ÕUÞÒ\16*Iï#;He\ 36Åi*µø80C¥¤\1d\0ÕTÎN/h\ 5%\8dø\fu£hv\14\11Lµ5'\8bÆ­s*=%s+Ä:V9˲OÙ%ç\9bû\8b\9e(\aLWÓ\96¨s\8dÏw\9cÐn0~\1e~\vI`¼ÙÛñFÚÛ\ 5\båµ\83v®¸¿&\93äK^U÷*^Ê6U>,\8aV\9cµ{¦:T\905zG\89Fd\11\84\9f\84\8f\9a\14ìx|\ 5\93×4Z\9aÙ²ÅÖ êuÍ'úʦ\9c¤"¥\9cWw±°[þ°f^ª'0X\15·c\11\ 6\85×Àþ\16\9a\9d\88\9d\9brKì\9dJÛJáD»\8cà\94\ 5·¾\93\8fJm®äB®|CÃ\81\8055oc/\83¼ªàð\ 2\1aÏNÁ\8aL9õ'0\ 1ßjIÁî\15.ÆÖá\94\0\91\ 5\11ÑÂëùÿ =$!_û\903²sÛ^è>\ 2pX0µ]S\1fÐc¸\84\86Ô¹`gi\9c9\ 5\11\88¦Q?\94+©,OÄ|ekòÞák\15C)6b«\8aÞf!)\8d,ÌM÷\ 1î\b\18§úð¯jQ­\9bì\89É\e\18FÖÀ_\0û¤Y\b[-ÉÛ\88fiv&¿Ãþ\ 6\16Hø!\89¡ÏÈÿ`5\ 1\97\9axu¿\16d\1e\80\93P#ôF»
\94\10P&ÒÍÇàÓh_2\88nÁnm½\87M\10sC¯\11?\92\99¬\85ºÿê¾wø\0\83äÏôOê\15ºtí[P¢k+Ój®ènæöA  ú\ 5»Ç\90¹ú\94­\0úHß\1aÚ\81Ïê§Y\ 1º\18*£z\9dÒ×\9c`\98\0\1aLïµ\8bT\1fL\98ø0\b\19ïäü®ý³1|w:4Å4oý\12\99¡\7f\ f¥ð(º\90Å%\ f\19úªøò±jÒ\10¨Ì¨\ 25YÀ\8dJ_ÑÿÔ|ÛÑ\1c©f¥\95\9dô\18ò´\1c\8dy\86l0û\87Ê0\97±\9a\95DúÓO+/Ê.5ÂT­"»á$8¨¼[g\17)T`MHö³?\8cÆ\93\94Ú\»<f\1f\o\9d\13\9a\8d-1\13¬\1cb\80y^\99Qþ¾\8dEýEÞÒÚ\ 5Æ*׺º\85¿\ 2ç\9de\7f\14ÊU·.É_3P}7&\ f^l·\84\86 ½\15«X¥\84ÔxÞò\96VðM\ 4CG\16|\0òé0A~\89\9e\8e\13\9eÎ\f¡\v%_î\1a£­²o¢\1eÓÃ\80\9ec`Â4]~rf\1c\8d5Ïêo\96\9cÅ{ô/DRe\ 5å)ñ\10\8cR±å'2:(FQºKLÝUÅDu\19\924Û9¤á%ìðë¥Oã\1cÓ'²¸ü\aÌEöÉG\14\ats\94ýÅÓº|U[ú´n\ 4láMèÓ´§¢
+õ¿Â/8*ê;,Óï\89a\90øÍ8\8dsÀk¨\rïÖ~!¯!Ö@)Å\1c¢\19Ö§ï&Ã\91s<-ù\1as\8f\eÂ\95\9c2ýEbÆ\7f\19õTçb~AãðA¤\16}Däʺ0\88¸S\94\89{\91ñ{Gðaò\1co\19qB\17Í\9d$\8fëF8¥ºûz±ÿ\16*\88òd¼á\ 1¦\1d¾\83¨\99\9fÐ\95Lza\ f:JÏìeaûéæø\1e¼\8dæq\8f\11\97\r³\9cTÝ*Ã1ÿ"}µ!\87\16@¸ýk\98\ 5ÇÚ\1a˳á߬ÎB/älEyÚ~ô\90eKü\ eì\9fæ¥\\12\9f5¾ä$\90\10ÓçOè=h­áßZ¬î\ 2Ô\ eí©Í\93Þ\82\179\1a\v\9cðíªæ´`ä_ö¦¸\87\98»ÕÉÝ\8eç[ê9±Ä¤\89ô¯×u2B\83\s¦ù\r\14®u5=\95\96@¹Î\8c\82õp@\1d\99z\e   t\1c\88;\8c*+¿ã.ÆîZ\7fæ°\b\8bù\83ÿa]²1\90Àl\17ùRÕSëó\82\e¢o¬á\82ÀÜÉ
+\87Ð\9arÕòHòYì\11K\84¬gÓ<³\13`ÖÏ7/Õ|ë+4\9dA÷àû*òKÖ¨8\96\8bÂ1\91»%¤\fÏ-1w\94\87¤\94\98\17Ë?Æ\96\9aª\80é\88)ÓrÍÒõ~ÆK0é;h¬Ã\ 3±+f\ fé\19\80g:"\e\10&\9b6)\86\8dÃÀpò\ 3c\81úyìB£\9b6 b\94\19\84Íë#\98&lõ:w¦\86¸\8f>fÞ¨Ã\95yL/Ø\ZÌü\9fáúðjò@\0\0Î\9d(­W\8fÚ¢u\94\15\10\81\90Ó\14\82\10d>\ 5ÂP\ 2"Y\92\90\ 4\bd'$\84$ßÊ\97ïË\1eì©V\14¬J+W·>p\14G\8b\9e[\84ç^\88\8fº\ eG\11Ú»ß\7fñãªß2|M\v5\eòò\90kÚci{\91\1eÝZJ\ab«»ILF<\86fB>ò\13P­óC\bº­R7<]'äwÂçõ\8bKÖÃ\8dú\81ÜQXb\90¦\15Ã\12ã*\8a
\19ÿ$f»\81\87\ 4\1c~   ^¬Í\84:¡)É]È\ 3\a\95}\82\14pèæA(\1f\9e\9f+\85R ©´X¨\0zE©\82ÌÐ;b1t\17\9a!\1c\82óá9ÚÝ ÈB\90\94\81jü`\99\vdã>\9b\vÀµ\18\aL7g¥Þ\ 1åh\1d%\ f<d:@dA±ÈCÂ\1dè<²@\e\ 5¨Üß\88\9f\ 3\ e\97\7fÙ\12@ïè.\9e\0ø¶é\9c\1e ÆZ\92j\ 3\8eã\ 3\94@p\11\16\82»Q\aa\ 6b!\93\9a\vÆÃMÃb«q¤q\15ï¨ñ·zßb¯ñ Û\95Ã3\ e;\97§²\81@ÛA\8a\ fà¶\14\13KÀ$óË°EÐ\1cÓN\85¦¡\94\15TÑç\1dÛ¢àH=jÞoô\ 3n_a|æ1§¾r(é²ý±\18'ëmùrÝÊQË°úlp;®Ô±ä{¼qe¼\8a\0÷\ 3á\ 2ö\13\97­â\1c\19\90YcÿI\ 2$ýÛ\96(o%ã\96\vªÑÈ\0\¡-\ fù\1c\87ÉÞ»þ\14ÁåÅÎ\91ê\ 6v\9e£KÒW0d§Ëng\ 6Xg\95ÁIFË~µ\93\8cà\95Úå\91\19X\92îQHµ\99l8'Kr¼\96\9b\84\8dögJ\1f\96Íö«
+*XcÝZ3\7f}\8fE®Ù\93DÅsj\85d9FªK\8cä\9b\89\ 6JÈ \9a\r¤I1{\8cV!xnK®-e>³ÆëÒ7n·\ 4×\85¬§á\vô_Qg1\7fÃR2Ǽĸ:\12@\93\ 1nè\\13\ 2ÖK\9eX\8f\ 3ù\ 2¦å\11°\9f)Â'\80W\eIØC0hݤù!XL}\86¾\ 1»É\1c4\18\9c\89l5É Vh\1a2\ 6\1d\96°,\18ú\96\7f\ 3?\83\9ebLb#(sÃ\80yÌtk]\ 3:ibP\ f _"ÏÈ2S&\82\8c\f ß\86*\11:Ü/~\89·Ù5ü\ elÒ6Ä\18ÄþfÝ»¡   \9d²\14¯Ó óð¯©v\13Í<NÎE¶¡×"\7fA¢MûBÛá\a\88\86\9eäÓ°D\8f\9d!5\17¹\8eoÈG³\1d]ëÒMl[\eU\8aôZ~$g"þØHäUø(ú>ô(l1\91Êïu\92\99;8ãí\9fq\9e\16µ·\8cóÒi¿7m\17\9cL[Ú@¨\14ÅWxlâ<R\89s\Î]1Ç^¢>\1fäg\99ÑñË        íY<\80#nM\15D\15ý«yYù\eZOÃEÑXê;/C<\11\1a\95\13IfG\89ªu\ 5ÛúR\9b\13äÄOè\ 3\85M­++cØ7\9aS«ò
+\8f\8aaZ²÷\ fé­Ô\83î\1d\8a\9cøÍÎuª\17¤í¶     Mß\8a]\96>]o°\ f¶ÓÐ/ôm^&=ÂNhÌ\95\17\14.®g*>d_ò$«\ e¥
+]ókÜñßÙoj-¤½Ö]º\8e\15wðzýí`\81ùg`¹@ÝXR\13Ëê¯ïÖÐè\1d\9eSZ^6Ãu¸V\9f\1aîø^×\1fïo«×ÿ\9dÔg±\18\84\11~X\97ñQð\11ô  Èæ¿®\7f¡ïa%{s\r\1a·Æp4{®³ÖHLydW\18û)\7fYUÀ&R?î\0çFD\9a/\80'\83\ 4HÅ7yOÃ\13ÌG\1e
+âS0áª\84ïg\r:¤poÊ\ e\9b\16\ 6)·-.XF:\81\1d\80e\11Ùæ\0¸*d\8di\ fÌåG{.ã¯\99nw\11n.ètº±ÓY\80½Í<\92"³þ`ö¡ôâ7ÑdÒ\1eìsSC\84\b\ 5\90»!\15¦x$¼ì©g\89ó:SîÚíøX\09\1eÛÍY\15¶»Öá\14\95å\89%\81r\ e_\82\9d']4KÌÊ\b\f\9d\87.\fq cÈYvã.\ eã\8f¢\82\1dM\1crÎÓm½Üú\8cìÎ*ADbWë\83\8a\8fä\95M1â\7fDq½by\1e¡Ô9 ¾þm\8f­T'b\8du÷q\15\857¶Oñ\83r\80®÷Âé\fßö}¢y\89XK\888\8b\9cÜ`\94\9d\8aÚå¾®â\11.;²´ÔÀ\14«¿~1Kü}wù¡ÂÒ­³\95ÏrB;\ 3ª\13Ò\8f¶Þ\92\f&\966    åRrº÷\81*?jÄÅÒä\86\91l\1f\81gðIC\17kþ¶\16ñMú\7f»|¥\ eÚþv²\9c\9d®hùZY\98Hn8£V\92×z\ 4\9a\83Q3N?Ý?ÃôÖ«zGP\1cöÖø\91ÙÓ5¬|Noî(RGÐJ[Ý5ªô°&Hs)qq}^í&2Õý\95n:z¹ý®þÇ°\13\96kFmP\13\16\ 4Æ03;7ÕNÑsÛÞè\ 6i+Z\12ê\8c\8d±úµ      Ó^\7fÃ\12òzçsã7ÑTÛm ,ì\rþ\ 1\8c\ fzb\96@\14Æû\ e\ 2p\85¾°õ2¸2{¦9\10¤§\8d6\84\82Ê\84û\9e/À=ä\fÇ4ø)\9a\bñ   x
+t&8\ 2\1d\85\173\ eµ¯Bõ\ 5ã-ã(;û^S\82éeÚÙúdSyÂ\157\19yG^íH@¶Es­¹\b7<\aëA\96\ 5³Q\ 1|\95áh\93\15\j\89²\96eÿÚ\bZ\8aÒ\8ey1|iÂ-\97Þ<C^ow¡³Ñ5\96Ãè¢p\ 1\16c\8a\vÆP_¤ª\ fâ<.&ný\8e\8cpa\82\85[\16\ 1y\15«y\9f$Û«j\84ãì!É\vÑ«Ü$E³42éË\9a\89\18?Ý´öé^\aãwnYg?GÎç9c¹÷ËK\8c+\ 5%¢<qWÅ\94\98Æz^}NV\96ã\94]QvS{Ôq\9a\87Ú·u)?\f\14WVÁí³Ì\141l\1fâü%\ 5õWy¿ÈÑj\9dpÿÿ\8b0#º©>M»']£ý\82\9a¦|§k!¾¨õ3h{ß\16&«Õm¹\9b\ 55&[\ 4K¨iª\83K%Ú}UEüÞÚkÌ\80Êåu\vhTñ\7fô[\12\9f\19F\89÷´k\0kOÆÆZ £e¸è\ 1 ³\9ce\10\80v]\1cG\b\f\89ؼ;ÀG\ 6­¼\13LÉÞWÝ\ 2º\13\93à\14ñº\ 6\85d;oä\87ào\9a\1dô3xòÿ\b\82\ f°¦\ e\ 4\0ÀêY\ 1{\15\11OEk[@\8c\81|\8d\ 1\822\84\80ì\84\90\90ý²^ò\92¼\97÷òF6\ 1\ 2a       \ 2ò¹9«u\81UQ[¨EÎmË'*u\80W\11A¨»\ eä³wÿï:^\18WfA×\17w:\7f\ 4¨R\9ecºè $DZ9-Ná±7¬É×~c\e
+?µ\ 5í;\94A¯34VfO×\f\96ý\96ßæ   5â\9cÄ*Dv\83ÿUe_ÑRqr\85_ê°ü¨«pM\90\ 6v\96\87]\80\15ö½{ûÒ\9b[;¶õfÕ4¯(\vÌc5Ú\91Gìùõ÷d\9bxþµ±\85»EÒjOª\13\98®ü-n
+|â\9a\fë\86g8\9eî\rK\83öٶŲ\88\9d{r3ÚJ\10¨(°ù?Ò±\92µ\8dq\85lá÷u;S7\ 1¢êÇqWA}ÅÇ°³\86ÃÎé=·Åo
\e\14\9cxgº|\8cGC\ 2T\98p\8eT§aH\9e\17ìÓÍ\97O¥0áU`ll\18Ú¤»Cç\12ltîî0Ájþhý~±¯pÚ±Yú_é,x\9dü'ù,ÉIU·jnÁ\Í[Møæ\vz©Î\1eóÆÈDBéb<Ã\94¾Ó]ò«ÜT7S0CùoÛ}ñ2õ%ýsÙFÍ\98¸MQ«óÏ\ f\ 5\ 3\fÅ\9b\ 3¡!¤7f\17ü\ 1\95&.!m\9bàôéFk´¼õ\86(+OÐ\fãºóâOÈ\8f¢í@\vê\95\ 21ù¦f­ÙôG\fÛ0J¸èZ¬\92âî\90\17-#¢=¾ÅýÄqËb>@\ 6@\1eÑg¤IxFz\9f|\98û½â\ 3ÅÞ´\\93E=\88\7fg6ÒatÀ\12Òº*ÿ¡SYõ\8cÝçô5û\97T9vh÷\vø\8e\7f    Æ%2{}n\80ü´}Iò90Ýv zR\1ff\8b¢\9bÐ8kOËʼ\99\1e¨jV\91oõ:*¡xÚýH3Ê\7f_      \v6\88WWxç4\ 1Ç\;\935juÙêèK:«ã\a:iì²\a7\8brʶ\87»Y\ 5\1d\8dAd\13§«~XÃâõ×:J\7f\101<\8c\9c¥²;î\81äeªî
+(ú;èMÙsºÅÈr\14l\1fÚªÜU[y5ÿ»¶ýä\ 2vw\8b\ 1\1c(\19k
+-Í\16\16×Olí\97\ 5Ö\1cHº«¢WeGã\90£ü\16Ý\86L9s\9b¸ªè\82Â\8aFp6§\90 i&xëÁÙÐ\98p\11\1f0üC2\9d}\bÉTxmÌCûÀôH#îѽZy\97Ú\87\86m{\ 2ìç+ËE\8aAa\1dî­ö\91ìWÏÓd\ 2\1d¼V¨Sy%ÛÛ\90®\99\9d8bôש"SLL\84¶ò\ 3é1å4Ø$B\0sùÈ&\14\17±¿\15\97j±ê±&©d@ã\81ÜY\88\ eÒ?O¬\80+\1082\18}\8d­£ù\13-D^½\97\10\86\84ÎÝ\92\bÚ(ûËP¤\98R\9c\84\ fÔ\a\8dѬ.í\0ús¢\8f!Ê$\8a\984\8e\10á´Pü\17êÛÚ£ü§¦o\1d\84iÒ(\93ÜÆëä#Àu"\84»Dù\9e
\0¤:¡]ïC­\8c¸\80¼¥>Ð6àÞæá\9aÚ\92\8b¶ÇöÜÒ׶û\b*ö±\1d\91ûÈÂm@1GQm\vÊl\ 5ìO\13rus¬g#ö tk\15-Û¤²ò<\87\8aÿv+l\ 4\9f\ 2w
+]\15õ@\91äV9È9'ç¹Ò3\ 3Õ«Êè   \v¡Pç?#Ü0e\7fDãaã¶ÃÕS\9cº\86#Ö[%\1fë\17Àó\ 5\99µLY\9fø\94\87Æ\89\ 4\ 4U\81\19\87U\ 5\95_n¸¢¥Ê\17\86\17η4\ 5FÙ/V[Øä\8e&+\87\12k¨+å4\19e[D7\e\ì~YCm[\86D¹¯úÄ\ 6·æÏÊó\11\19\ 6»ë4M\8fÑ\1c\9dn/ýé\ 2«9Ó0ÌÑéÆ\10:/[Òo¬\11\ 6\17¥`\9fK½Ó\ f\98\8e(\ 2Öá\ 4\ 2
+\99\83T\99Þo\85Ír\vM­8«Íæ\7fFECw\85LhT¯\96l\11¿\85ç\ 1¢ÂíÈ\r¥;=\18í\ 2\a×ÑL×t¹Ì^r%\12´¢Ë|ÊTXN©£d\ 4ñR3O>¢\1dÖ\ e«\12Ä^º\1e°¹à\9e¡Gû)­\ry®·¯ý\1dÛ\82\842\8fã\7fbþ+\9ePg\88DW\8c\19Á;T\14äÑ\1c\ 3+ô4Q\94v\97¡§\80¡{\88\14§\85À9è¼µ;\8c¯°!f»é6~/Ä\97|@Ír~\92½EÃMí\8a$,\ 4<ª²`ÿ\13\8b¦+ù\10´\ eoM­Ò¿$ȵk\90ë¤\86éÄÆ)<$\82\nnu|\94LX\0ì\18À·´«¯+z-]\ 2\89:Ör"ï\82æ®åXê\97º.KWü;øªå\1a\13Â\96YFC² Ê:ÃA\17Ç\94+ÐIéU×\vu\80\9cå\8a+íU>.+Í\8b\ 4\8f;ËSN@]\8e\93ñ\97\rÏìãL\0\17\86Èñ÷¶X»Kx»6\fÍ\918=Ó*\aðUµ±4^qÃÝ\97Û¥>Sé\9f\92¢\1d+\97Å»\f\89eÝL®ñ\81sf\b\81»í        v?Á¥ímÆ!±»ñ'Õç²\88\ 6\80\7fYþ¢v0\97«zæÙ\922G\eãî\8dÏÒwTÄ1×\18µe{BªðHÇ\12óM\9c\rÏ&fr(y\eÑÁË)©%\rÂ\90­ßPÉÒùÉ\aÍ\fEhl§%
+$\18EVD\1f\15Ķ\8d¡¥Ô\ 1t\vo§Á\1f\v\13\\ 2~6-\12\8fs\87ð/\80\9b\89EÊÔä\f2\11<\14뤪tñ\f\91Å\ fù:¨ÝÚmb\93Õp®´V÷\1a±ÊçÈn\1a\ f(Q®7: \1eÏziZ¢\ 5\93îàN½\7fl*é\a\ f3ÄÔmôiÐ\98¥\8b`\10\90®\1d\ 4 ß\r\91ÒnX
+ýU\9c\82\9fÈb¡i0\99¤Ä^\19Kc\17à=\18\9f!!{pwp y\80\1cÄK´\99H´ö&ôÈ\98/ùU¯D\ 5\1cµá\1dÆgõ#\aM@\92\1fêÁ\1d1\93¦\ 6¢\93¡&®\90ÓÁyf_s\91I\a\17ÚùÚÅ\94\\12\fýB\9dc\9f×\e¨7¬H\98e\ eßxÔXl¶Åtbuæ!\86\10ÿhI
+&)¥å Ö©êrÂ\9abp\9b\98Ô\16;î²Cu\fGFæq\ 3Ý~~c6RbO\8cñ 'l\97\19"<Í\96\19¼\8büÃz\r\94T\9d\ 2ÿÏ0}°5y \0\0Vá|\14E­W¹r\8c\84Ñ\84\0\8d\\982\94a\10\ 2A\bA\10\82¬0\ 2 \84¬/É·W&aã\80\13A
+¨å\11ÅAK]×\9e\vñq\k\8bP­µ\9eU´"ÎJÑ»÷?¼Wåù¶{¥¯j#¬'rG\94^\96\82ô$U¤Ù)~VÓH\8f\ 1ÎTup©á\ 4éæ7\ 6©ð\7f\ 1\ae\92ÖÃ\8aâ\9a\8a\96\98R³"«I\98\9b^Çw0Ó^Ô+m¯âO©ïX¾\8b\bÖiM£Ái\86-T\87ß5È\9d°©'\88\86\9cNÙ]¢~{e\91\9c\0\vÃÄr¢©Ä5Õ\83è-w\8e»A\9c\95\85\84º\11Ï\15-\9c\15äV\95\98YF~\a¨UgÐÖBOÙJt¼8yÇ0¶´¬.{\12KªèO\19Á(Ùë¸vlJ¡    uÁSë\19\9c0ü¾Ö\83y\81ØkØ^?\ e\9d\916W­\85c+Ý
+\1fÂC²½ÙlÄ]\1e\9cÂE\9akoÆ% ¾õݼ§è\84¦\99\93\89õ\0g}<p\aø\89ò?ÆÏj~¯t7ÞQ|/y  Âu£"-äQß½¥\eº¢Þ\19{\1fÞ¥ý\82w\1e\ 1\81iN1j2Fû\94c½Ðáºß\809uTE\82þª\86\94\ 4\1aÚµç²\8e\19\vt¯·\84\80¡ú\r±;¡HC;o\10Î\ 4\17sTH#dõù\1c½\85¸×}¬[aT\97ÃÀ*Ч\0\ 4Þ\80G²Xú;PpòiÃ\14t$V\ 6.\82Óx\9dP
\82CÁ_"ý>\93h0\9a[[¡Ñã\88tVÛ\83w\14,ÑíÇU\99£À^|}²X?\86½\8aõ4:a\13<\13X\85\rs\9aá%\98Ã×\19Ù\87U)¦Õ<\8b@Z§Q\9b/ç[µ6ÓóÌ\fÝ.ú   ÿ\1d0A=\8f¹f\88 \9cx\12ãIÒ\97³\a\92\13Q¾lä3\¨P©B\1aoJ]Ô´ã\>[3Ô\10²õ­ö\82­\8c?\ 6,·ôÆ\1cÐ\9bMOyIÆOi>§\r\9c'»|\93à\eÄ2\19Óök\8e¤x¥Ío»ç6\87\15\96<Jßc¹^|5±Ü²Zz;*Õ,\94\97M;\15]¬åô\aU\9d÷\ 1º\ 5 «¸\16¦DQ$6\1f\93óÈ\1cXz#ÝËÔUá\9dèfZ,k\8câÐu\8aõÜ)jF¹À\12R6í:\ 6\83\12\1aò*\8bhyYÍ\ e\94\ e­pÊI ~©êK³SpMnÂQjm-+ò\ 5\9eɽMÊ4q,\9cÜ\ 4t0L$\ ft®h!f«³\v\87\89_åyb\rqº¶Xð\96 \95@ÂFb«ª/r\84àhf¹\13ÄZ`;k\90ð4<aÜ%â KùEìb}°ä9v_Õ\93ý\rö³ÆU\90\8b\8dk\8dñw±3À¢Hõÿ/us¿ÆþkÌ`\9dÇ\99\90;3\10\97Ã÷Êÿ\8a¼\ 2æ$B4\\7f+;\14ÝjèK\9d\8c\15ñ Z\rFF\8aÐv\88Á\1dE§áu¬{\18\1fqcÊ°S¨«T\aK\11¸àkø
+rS4\82,FæS\15\88\ fúQ¼?\92\89\86D\ 6 »Ñ"îuä%º\8fí\8cZÑiæ^,\b[U6\ f\ 5Pw\vª¡ãÔ°¨\1e\9a§\ 2S7Â\9e$\18¿\fÎ!îE.\85Ï\12\ 5ÜãH\1cþ\98ý7ä\19^ü\88\9eÀ\1e\94u\82\81ö¿\14¬\ 6Çm[E^\90\9fõï)\7f@Yæ¡MSP\87)'b\16^E»q\8fÂ\ 3äc¶?¢'F\99¿¡¹xû\8eûm\16ñä¶îÖuym\19\87$\15|¯¦O\8bKb\9d\1d\88´1ôcû¥ªw\81Wln\8aÝ~B\vª¢½XfO yDzæù\ 22çMÓ\85\1d£B QWê´ù¨ci¹2æ\92Ý [\1eêb},ÿ1ðµEª¼éwÈô^»Òk\98¾bÈ)Ìk¬,]\97ÃwH¥ß¦Ï4ÄU\92\9b£mϪKc`«C!åÍZ¸Ê\8e 5¦IõC¿Wô  ÷fQýÆ9ÉQû|U«¸Ëάþ2=Éæ-\9fIºd\99¯\8b\88  2_ªïåM\98º4Ü /Ú¨»å\1fB\81\86>o\ay\0*\97¸Zo×9\89\97XYÊýi£\16¾\8a\9f\94fNP?\8f\9e1\85kÏð¾ £\80Á \7f*ÙÐã_B\ 2à\11ïûÄuøp\81Ö²B[\92\r\9a\11\1d\94¶Å4\ 6X\12\9fÑ×õ\1dÑ\ 3ÔÏ\86\93¼}ä\aãë \7f\90\91P¼¿\95Ø\ 573\82\b\ fd"\7fÎd\ 6\1dÙ®&\ 6Ä\16<¥ÕÐîÄ\83T\17ô>º\96ü\16\ 6x4ñ\1eY\16´\85\10"\83þGð\1fÑXF%N£góÍt2®\14õS\v8.h¢ªpq¢\84Ü\8f¯\8d\ e#~Â\1eð2\89Hl<h\13Þ\86ýÛ\7f
+çaG\18»ð\95\98-?\94J1§\88p\8am\9a\11\18È\ 1ÓòÄ"â\1aõ2º\14\9f§Vñzð|R\18\ 4aw\89~ÿ\ 5l\ 4\7fÌ8\8d\ráëÅÓÿ4\89ý\84öÎüÜ\1føó»\99\ 5Ã\e\19\1d\87\8bÎE°ZßKݸÅÍáUGÙ|\87B\ 11\9fÙ&T6\8f\9b\16\ 4è\14;wÆæW§ßÙ\9d]8ÈÏÙ\19\12÷yÛWÒîðG-««ª¸%\8d\85r9\9b\9fPvø\94X7iÞx*ÌL\83(\eÞu¶¸==½ãϲüÍ\93m\v\15qq\eZ\ 6e¢ð¡&\1f¹\83\9bß°§n\9e=jc¨i\9foÌÓ@\8cç\1cýÌx/{Y\87¨¢/írÛpÕ\93Í\19-×k²b§\9b\ e(n\87«\1c\99J;7ÃöN]Ä\9e²\1cÓ      |×\98\ 6\f9^Rê\11\94,²¶qäýi\19-Çj5I\ f\9b~WfÇ\92\8e;*~x\86ý\98FÊMµÚuûÙoÌ\80~Æ7\93î\ 4\93½ÎS.0.rm\11«ú\ 4¿4¯P¿MÚÙX¦\15Ä
+\e\81ðõ6±\9eÁ͵¤\1aN\a|b*\ 1¥¾4u\1cvõv#3\91Ö¬Þ¦q½V`i\1c2d%\89\1d\1eÆ5±\9eö0ãµð\15Ö\bð\10\9c\fõ\ 6ÄÐjxÀ÷\ 49\87ôxç\11£¨!KÐhFÜ\ 5      \ e\abLb4¬Ezc\16láÈXØ\1f\16\92\eeÒ¢ü\80(j\f=äû\13\99\89~ðn$¢±\rY\1f9P²KàÚÐCÂ\89/íqä¢\98\aÖ\1a¢&lÁ\8câ\7fr³èSøÁ\0\81Ë|\17\88\e8Óû+ü\aìûýáÛºþÇ\10\9dp5q \0\0¶Z­«\82ô\89(\1eõQ\10Ó¸©AX\82\82\ 6!\\ 1\12\8e$$$CîsrL2É$\99\90\10Â%,\87 \96*OQ\96uÁ«OÅ\82ú\8a\aBuUXëµ\8a]\8bx®¶V\91î~\7fá£\1fn\9a,ÿ\8a\11[\99\ 1|ÏnCÖ
+-ÀbY@ª\10\ 6X?(Ûe±92í"Õ¯)fÃm\88\80\1f6\7f@>íÄ\15_æ|ÓXȼ\r\10½ÿæL\vN\19§+VJ2¥v\11&¿Á\9c\92Ç\82\95ÙgÕa:yÊ*=\e>\88\1fC¦,ê½\85\85zq¨¡©øw\19Σa\99\15çáVîbP$©àßÔ\863\17H¦ \89ìµ*
+|\99t\11\9ac^\8c\1f7½Cûv\9bó¼\1afÝC\1a¦\9bïºUÊ\86N\19\18ì\\83A\9c\vX\8d)\8cM¢×È\8a¬\1aÅQËr\92K{\ 3¥ãï\99¾ÄFÛ\8feÍ"\1fj\ 5ù\ 2ó%§§h·¥C¿\8aùÀª\11i¸24¿Ô.$ÛÒ²\96ɹ\18\99DÑüÓ®Â?2ª\1c\ 3»ð\19Ï]HMtî\11\97Ôa¡¥»\18PZé¸+CØÍ9èJ*\99á_r%QNÊH®4Òrõ{W)þ     |Õem}\98^\10\1c\b\85e\v«ÎÙ»
\a.év\96¬ö_\13.e'TÞ)ñV4û¦(Fé\ eïoÉÿUgzfðÓ0Õ=Ûr\7fûºÆ£Õ[(hÃ\ fØGjKÝ\ 3ÝÒ¢\9eÚy\82}¬÷¡\8d\80\ 2Ê\9f\80(y\ 2ì­¬À¿0Üóæ·àÒL\1d1Á½\99sÚR1w^N³JÛO÷7ö\v\84ÌÙ\86yÅoxõ\99\94OÅãÕ`òi0) Â¿6Tù\84­\12@J\9f­\8e\16\b\19JL#\86Ù×´©²C\0\89¿[\15!ì)º«9!ËÊ\bêw\81+\93\8e\99î@,Ü&T\8e\10\9bQö0GU5ÌËãýaãò¯
+ê5\1(ù¢â¡<U~¼¨\0¤\81Ú\8cxÝ·:vRÈÈ\86»q\ 5VºÅÞt\8aÑ.\1a       ¬d7J½Öç<L\91¬\ e\13ØUSÀ\88ä¨æ0Ý L\80ªwÔk^Â\8dIÙp\182\8d\93ZÊÐ\ 3\8d\v\8b®«#*\9dÌÍ\9ai\vÌ1ë.ª~\ 1®é»x×E \M;.Ï7\85vDª5æ\9e¤\býÏèB\9cÍlÇ\ e\85&\13É·¦\84\88\90Í\89¬Qs¦r\88k³dò\16
+\14ÖBÚ2i\17ªNÿ\eø\85í\9bÄ\9f¡'Øï¸:dÈa­\8f¥Ö9Ò<oé­\ e=\92Âð:Ú\15O8\ eÇ\0\97ZqÜñ¸°]\92â\\9b\ e(ÿp\8a\12/@\11Î\93¸½H\8c+ºnind`±gA¡Ø¯0iJ\1a\15©eW}oËû\80\1c߶Âxñ"omz\9cr\89çQâßu\1cÏ_p=¦=n_í\96ì%õ!w~~S]\84ñJѯ5VùQ\96¼z¢<\95\17\15L/8#\8a\fô\90ï+¨þ¨ÄÝÚó>-î¸\89è9]³\8f\82¶¶¸\86¨\e\9bs\8d4ú±Æ1y\1e3¿\81ÆyÊ\8d©ý©À/Ì       ÉÈGä\87«~IÄ´4\7f1î¬ñ_Þ35g%@\91Ø\ 5É.1N§\94\fN¸Ì¡þ\ 4P°ïi'\847ó×ë\9fÈ4Û\1e\98\12@rÂzË8äZ?\88\r ìêiþ;Îfç
+ÑcÞEÃNéO\82ri@ñDü\9c\1d¡\8e\93ï¤úu{Aî6\ 4.ѱ\13>1óá\13ë_Ù:,¡ \83ûJ\14f?È/\95Lèí¢CòNÉNÙç*E\19]Ù­!ç½×ø ämqú=p\19ñ)²\18¹\1c¿\ 6Ý\8dî
+\9cc\17«F±M¼Hõ\18´\8c\1d\13£b;t\95%\90\9b\r7órÁ~ãû´£\10ÎL&\9e3>µ\ eÅï°\9eÁ\1c~6s\15lD'9\ 4ã?´ÿ\ 16\9a\1e\89T­æÏ\99\87¥^\v5÷;Õ
+k[\1a }\80Î\10»ágX0^h\99q$WâKJm3ÖqV/fÔÌ\94¿Æ&\84í|ª}3ã\9dø¶½1\97ªèsÌO[­9ï¨"6Á\91εñ6\vÇ9àK¦ÿæ+´|dÔøæjÒ8aÞ&Ák Ë\eÉ\90\88\8c\9e=9wåU\9eÍ©ÏÔ?º¯\13\83\ 6®Û\10¿Ó|Í\1dáµÒ\16Ô0,\8c\92«¡lug\99³z®\0äeU\1d,}*Ì\v\94å\18e-þ\88Ô^u\84ïG¢S\7fÁë\8dßo\16y\88\9e7\ 5\9e¦7æñbC#Q½\81\95Ý\10Å\9fánª½[Ú,(\võçl\95^ 6¤¢ !\0\11ùúâÊ\8cø>ó"ï:Ïj°®è<rB£a̪\9eë NfE\8f¾\1eøkI8<*\9cÍ\92"Ûe­[Ò,÷A\15¡×v\1d:\12ks¼Cl.\91\99cÒ+¿ã5*ï«W\vÖ\ 3£Ú&ñ÷Å\80~\93\K\99\ 5sR^\98\95\12ö£\1cx0vÐ>biq¼\10\87\84¹Æå2\9a$V1¦\$\9båÝ\ 3Ç\95w\8aökGÔ£\14\81þ£îQÊ\ 1\93\0\8e%´[ÿ\84ôÅÎ`çÑ\90½J\10¦\f\1aÎ\89    `·¼]\96ª\19æ\85+Yº)ú\au\97!*ó5´Ñ(H\81áId\84Ða¾oEâ\12lw1\16\957£ïÓ\1f\12ÈáhY³xÐ\88r\97ÈãM·èyªA39S¢Ýc\19LYgèBÙ\84*d\12\8b\8e\ 3lQö·¶\rå¥ÖÓP/ð\11\85¤Ç\85m¶ðòl)ÅÖIëRÆ`i\99ÿ?Ä\9e\91¦ôAû\11\82\13Yè¨\8có :§\18Íe\87»ët\8f¹/Ý\rÒyüsn\ 5ç\90¸ÛM ­\91\ fº>dìSG¹&HÃP³ë\ 2Áe*p\1d\8bûÖ:éê´v°¾\ eFëòÊÓ«´\12}\ 59àà|%*öC\85\87d\1d\95Ú\8cíà\ 6\9f\95T¯»ám Ø\8dý\9eθSVØÝký\82\81ª½Å~V÷Q<\v\84×f±Ï
+ÓC\82B¦´'\18ÌøL\ 5\ 4\86H\ 2\1dÉ?\97 6¦û¶Ç\8dZWzªÍjxAñ|õ+c\19s£h\8di\84#aÝ43\81¾ü\fËKÑZr?Ú'\eH:\82µ\81mø2Ç\ 5èA\8cĽ\fÙe\9aЭd\ f\80cÐM^\81ðkÃ^þCÖj#,®¤\9e@DòL2Ëâ\0\89I~tHGÇ«í\14øJÌ\80ó¶e\8fñ\7f\fÔ      W\13\a\ 2\0`_qÕZ\95bµ¬
+\84\ 4"\ 1\81p\eÄpß\84CH\ 4\84\10\ 2æ     I&Çd2÷L\12Â)x\82ʪ­°*j±XEt\17J×J]«EZ\10_=@±X\9eº\15Y¥¨íî÷#>§\1a(§Uûª÷TªÊ#tgåÛE        Àíª¬ÌU¦O4E±\8fÁ\1a]cD®\95ix\16`FfÁ\ 3¬åøw0b\14\94ÑU
\1e\95Yâ®ù]sA\88êvjßfh\80w@A,búÆx#\82\ 2\94\ 5\10ðu+\8f\95\8dÝE¹\ 6\86Ì_÷X\99¯x\ 2\18˼U-ÆE\ 5\9fW'\9a\1aÒ_ë½@ÿØ\0c\98e2b1(·\9e\vh±^EN±\1cØ
\17`V´[@\ 5-k\85¤b½\92°nÎ_PëáÅéeÚ:ø\ 1ÿ60\8e\8c\84\8f\9a³Ðñ\80\16è\17l\96u\ 1-'\õ\ 5åj|Dþme;±®tHÞGDæ˪&\88ø´\87Õ¡D!ߪ¿@Ðá\97M\85Ä?\ 3\ eB\1câ=ë\1er\9bäéÎ\95\1dt<\91GHß8\9aJ\13d  öÿlûM¹×\1e\9e\ 6iÜlv>Sw\9d\9e\ eo2î§\8b\ 3\8eYê©!Ö;DL\85é¢Å¾\8d]²¡ò®\86\81\92±\9d\9fÖ˶íRÔÖþ\9c\16¬f;Ë·¾Ò-rü\1e®0ÌÛ\8f\ 6첸ÛR}Ö"\8b¨?5#ðÍmk+3\11§(¸¸\1a­(.ÏõÇRÄÝÉ\1dxP\ 5{K\b\11$\1f\r\11\91\99ê~?\1eu\bXÅ m\8bÁ\1eµÒÂ(\12U$C[K\9e\14í·\96Il9v\98®\8cLæ"ç\15\1fF¿À\16«]C2q\83.ÍOI®6\8e1\9eQ\ 3Ðçªxã     É1i\90\99QÑZx\ 5l\90µe_³Ì)O&uZõê±èCÈj\1d7$\ 4\1d6ôøÕã} â\9dA~\ 6««8zXþ°ÜÓÀ¯âm¿b|®nÍ^i>¢]\9cäfQêë¢ùÖBchÈJDj^ðû\fk\82æ½\ f\12]èr¥ou\87ö#I¸î\94î\9ah
+8\bÐ\82Tc£1)±Ã¼ßüWÞ+Ë-Ë*îkx\83u\9dße´\ 6I÷~\80ßÁPE\8c:À¼±LR]\r&\8b\82t\a-¬^à*$M\8c4-µb¼\9b \ 1îãÎB\vè\12¿\9f\90c\98\9cé\8e³ñA9Zµ\14u\13ÿKíDÛ\84§«§Ñù¬T}\ 2\96\95pËp\ 1;dz\9b\85x0w
\vÞï7\r? r\99©Ø\1eâ\8elJÁ§ûÄÑU/è3B®\ 6¥K3\1fhÿ f\13\9djçm1©¨Rî×\96D*Øï¿p\1cù\96©ÁÖ\93\832ÃÿOö(\1dVvÔÚ
+n¨\8b\9cd¦³úmMA\ 2Oßë\88á¹\e;í1ÜS`§Mà÷Òú\1d-a6 \97)²ÂNßË\9b,\9e£_
+ßl[có.\ eHûÑ\96%¶Å\96Ø´\15+#]l\87åc\81Ù¶\9fÕã¾\15ö$ ÒsÔ~\15\1c\92&\11ªÂÞb\17â~In^\1a\99Yö6-\8a쪸Ê\9f£\96É/F\8cR\88êa` ý\81\8eçÛE\7fi|à\95o\ 3 Îò$Ô³¬¥h\ 5:)=\92kÇZvö¥6ãÁ\8ag|\12\1fV'E´\11\8dÚë\81;ÈR\ 3èû\88Ê\ 5¥^ýt\ 6\"\11ZWÉÊ
+Y°»ânN'â¢\92¤ü\86Li\16øKÑ[º\9e\b!6bØ\1d\98\83ÿjnf¯$= +\f\ f*\ 3\99\83¹\1aÆö\1cK\9bvIöchP÷*%Õz\ f\98ÙÚ\89,1-\8apGsÀ¨ÀDì8D±C\b7x\86¡&µX\9a¸Ó8e¸!j5kLÌì4ð\96Y\9bü\rÄ\ 4\a·&Xq\88\13¾\0ÏY¿\bLA)$\95]\80sÐ_\19g\89^\1c.\9d\ 3®[\93\85³Æfx\99 ×Ì\81{\92sÀÓHqÌ\f\14\89®   \1f\8e£¿\ 4\8a\11\aöo¶\15\93àÝ\8cÇ\ 4\83 Kåú\ f\88Fa­a)1$P\18o\13×\92×\99\8dDOÌ\90Å\83¸\12þwè\19q?0\11\1e$×°\9bÑ\7f\90ñÞ®x\aYZòNÛâ8$ôÕ\ f8\ 4\82\8f\f\8f$ý`\82l·cZÁ­6\9fðÝ\90\1cÈ\87Y´+û0\9aH5z\87á\89\94kQ}Ã\96<iÞ|ý>!\95±¾~QQ\7füýº2ñ&\1eP{BúcH\98ó\85|\90ó7g¢z\8a9^s\11\10y\94×l\ 3ï\16\ 2Î÷Ûïä­u^ÚA¥\v\9c;ÊRâck\1eU\ 4ó>®)\92§\87¬vÜQ\1dá\f8ä:oV¤c\83ñ\91ÇsûKèÄö6û¨8#7Æ>^nNk·_ª<\1f\ e*>ÙÜmç¨Ú¹3¶§Ú"Ψ­Ï\10Å¢lÝ`ª§ÂÖ\ f\vD#ÔýÊî\1c\90ö\94\17¤Þ£7W-\8dó¡#Ôã\9bóh\8eö\aî\0\1d\b<ãLÐqf6«\9f6@\94ç0}\11\19\12¹\11þª\95Ù\83ÄiÍÆÔhâ\ f­ ¶\95\fÕÓ\9b\97\93RÃ$÷0Ùa\96p\9e\92s\96\17¬\97T9¼ÛË\9fú   s\17JЫú\92lO¬\1e\98\12w7±A8j^\eÕ\8fß\ 3ork\89\ 4ç\151\ 27øx\90&Ôäe¤Üñ\98\82oáó U°\ f¹d!S\12Q\ 42ñïb+¬Ú(\ 4k\85m\5\1e\86ôø/ÃÇÐ\17>ÉD\17Îô:G"DxA\ 24\8d\16\v>\85¹èXò(²\11\vâ× \13\18\1d\15\8f6b³Ü-X>\ eù»à®Ä*\1f\1dþ'qÀk\92xOºäOX\0Ú+ë{è5í\9e|\ffP\ 3|\0~N\15E\89\90ãÔz®\12EÉy\7f\92|êS\8fãä-Æ2¢\8d<\933¾÷}îñôÌ=ö\82\91\ 4`·[\91ç\16~³£´#l²é®\14Üt¥ÑG¾\97\9dP\ f«§\18ûj_\ 3º\rë\9c_\81ÓÙß·,\88úÒò\9b\9f\17cñä®n±$\1ak\8a\93\ 2a\9a\86³²ÁM\aê=U¹lMíQ\9d\8b÷"g¾ñÉ\86\v5iÐ\89ì5Mó%7R\e\9b\ 2%\1e\8dþ\15vÞLýS¹G\98[]]ÕãMÖÚÐê    vKÍsà\8dw\89ã>Èõ\88q|\bÇ
\ 67épÊL=º³#.´®[ÑÌCjϨ\8e\86^wÖUOl\92Õè\80Tv·CeúÚû¤½\15Êöè¶Íÿ\8f\8aj2Íã0\96\19uuFfÆÕ±®\8cʪè:\84\86"E©*\82\15\11±S\ 4\ 4¤¤'_
+\ 4\ 1\81\0\ 2!\84ô\90\1e\12Z\b\90\10:\84¢\88Qpt\ 5±\8c4»â7\9frv÷ì\9c½Ys\9bÿ9ÏÅ{÷<¿óÂ\ 5\9eFràù\ e×\83\10+G1       \1eF\86~ /b¶m1¡&ªÂ&\0x\10\93¼Æ\0,\8a\v\f\8fLtZn\89·D<ót"\8c\847º4\10Æ"¨\8e»\b×£.9Ô\ 3¯¢\ 3\81\916§ñIq¬5£¸±\ 4£\955.\ 51gù)\9c\ fj\86\87\1aß\19\9déâ\ 5¬\8c¹»ã!0ýÊO\ eD<%\ e\85{\19?ns\f\17\9e\88³þ\1eû\1a±Èê8¶\16\9c\85\15£F<¼p\16    \9b\9c\1fár\12ÆwPq\92DºÃ!\ ü\88íFì\13\ 4ÌÆ\15KA®´^\82\85¡\16Z\ 1ØŨ·Ë\8dØ\rèR÷÷\18\ 4\8aí\9c\83õEÝÙá\8f¥¡\86\1cl±a¨·¶«±óÑ?ÛøaZÐ\bëµ\98lt\97U\1e¦\10³tÅW\98z\8c\9f\85\ 5\bþ\87ðs1¶\16ÐÍ\98iea1Íâ¿ï\7f½§M\9f1ó«¯gÍ\9eó\97¹ó¾ùv¾åwßÿ°à¯\v\17ý¸xÉÒeËWüm¥ÕO«V¯±þûÚuëm6lüǦ\9fmav¿ØovøuËÖmÛw8îÜå´ÛÙÅÕmÏ^w\ fO/o\9f\ fø\1eôó?tøÈÑcÇ\ 3N\ 4\9e\f:\15|úÌÙsç/\\f      \r\v¿\14\11\19u9:&öJ\|B"\1c\81D¡1X\1c\1e \10Iä¤dJÊÕÔ´ôk\19\99YÔì\9cÜëyù\ 5´Bz\11£\98Ébs¸<¾ D(\12K¤2¹¢T©*+¯¨¬RWkjjë´ºz}CcSsKk[{\87¡³«»çÆÍÞ[}·\8dwîö\ fÜûíþ\83\7f>\1c\1cz4üøÉÓg¿?\1f\19\1d\e\9fxñòÕë7oß½ÿ0ù\11´\986múô\193fB\e|=kÖìÙs \1dæÎ\9b÷\r4Å|KËï 5~X\0í±p\11´Èâ%Ð&Ð(Ð*Ð,Ð.Ð0\9f\96ù<ÍÔ6\7f\1açó6Ð4^Þûöû\1eô?|äX@`Pð\99s\17BÂ#¢b®$ PX<1\89\92\9a\9eA͹\9eO£3\98l.O \14I¤r\ 5\14ù¹ñO\89S\8d\9f#?UB\99P'\14
+\95B©Pëà\10T;ü\18ê}ú\f*~>22
+E\8fOL¼\80º_½~ýæÍ[¨ýý\87\ f\93\93\1fÍý g\v\f,vó\98\ e\1acy]\1eâz\ 1FÞþl\ 3ç(§\91}FVÏ\8dPÕq㫪¹ØÚJ6©AÅ$µ*\8aH\9d\12\1a¹·$\8fÒÏΡ\ e\99\8aÙÁì`v0;\98\1dÌ\ ef\a³Ã\979¸zL2¼\82ÆÙ\9eQC|\ f¼QàM5ð\ f±\9bx§¤zA¨R+\8c­Ô\94 k*\ 5\8aGj\91sH\9d%Ť^VaÒݼ¼´û¦\ 2r~\85\81LÈ¡Ø3h\9cã\1e5$Ø\8b»#òÈì\14ú2\9b\85'$\r\92ó
+\9d,ª¼F\91P].ÁÖË\ 5¤V!\87ØÉf\12oÒèDc&\8d2`* ÷_\ e\1e'ǹ{#\1f     Ý°w%{2º¥>\8c\16ÙaQ\93*Xª¯\fSV*â5r1V/\82\1c¸\\82¡\88\ 5ôä2\b·Òèd£©L9¸x~dº\9f\9cà»E\f\8b]0ý
+çô\1eÕ^z[Ù\ 1AKm\80°º<¬L!\8f¯\15\89±\r|\ 1±¥\98\atä³\81®,&p#\85Aºe* ×aÊ\81½'pBàré±Ì    }¯Ü1µ·zw¾AçÁÒj\ 2$ª²°
+±,¾\8e\ f9°K\bÍ\85| -\97\8b7\c\ 3ÝÉLâ\rS\ 1y\90\ 3\vrà¸\ 5¾\10í\ e\7f\88¼_½\8dblØ\9eÝÒ°\97\ e\90KTáU|YB\1d[\8cÓ3\84@S¾\0ßJåãÛÓ¸\80!\89Cì2\95)\agO\90ç|â¥dgسò­\89\ fu\ e¤þ\1eûôºzw®¬2PÉW^R³d\89µÅ\12\=M\ 4
+\81æ\f\ 1Ðz\95Oh'ó\88\1d¦\ 2ò7Ã@önOPà\14ðJ¾-äyõæ¸áV;Lg·]f¹Î\93\b\94\91j\86\1c^[(ÅëòÄ\80\9e
+y¤C\1e\94\12B\vI@l3\15\90o?å ÜqìM\99Ãù±zÛ¨{·6Àõ\9döT©Ö\87Ï*?]FW^VÓ\14\88\9a|\19¾.G\ 2è2 \8fT\11¡!YHl" Iͦ\ 2
+~\81\81\9c]\9e tË\91·Õ¶Á\8f:6^ìüm5ºÂà\90ÃÕúò\v+Ï)ó\94ÑU¹
+¤&G\8e¯Í\92\11êÒ¥\ 4ÝU ¡>ILÔ\13Ť\ 6S\ 1Kì` `\9b\82\1d\1cm\\7f¬oÀê\9cöÞj\9c¨c{.]w\88{]}A\9e]\16[\9eU\8a¬ÎTà5×ä\84\9aT9±\96"#Ö\91¥$-QJÖ\99
+(²\85\81R;×7µë¼îõ®òn\1c^\19¢\18°\ 6\18\ 6§ì\9c\86£¬ÌÚ\10aº:V\9eV\81\95áËST@e²\92 &\97\12«\89
+\92\ 6P\90kL\ 5\94l\82\81\15ëv\ ew¬ØÙ6´Ô·ì¹U8{`\ 3>§Û5#½õ8-E\1fʦhc\ 5É5\b\11I\83\96\ 2j\8c\f¯ÆɱUx\ 5º\12(EU\12\95¦\ 2Ê×ÃÆ\1a\96Ùu=X°U=±ô\10ï¹uxî}{tj\9fG
+¹ó\ 4\95Ø\16\9a\ f\14a\eã\99(=\9c\8d¨Gràõ(n\82\ eÃ\8b×âøqZ¼ÀTÞi\96­ííÿvUíè\82\9dÂÉ\15\87\vF7\86¤\r:&\10\a|ðؾ\93\14ô\8dÐôĮȬ8CLNlG\nt{BÞåvx~T\e2?²\15]\10Ñ\8a¡\99Êíî¹?Öÿþí:éäB':¸ÚÿÚ\vû³¤§n\91èA¿\ 4øýSè+ý\17\80Ëw.\91"nG%\85÷ÅPBûâRBz\13®^ìML½p\13\91zþ&*ÍT@æ\96õ Ým\17HÛïÿ®hÿÙ\11æ\81Ø\87¬\83Dcññì΢³¬&Z¤T_\0Wj\vð\155yI\1a5\95¢­LOÑ\97§¤5«È\19m
+ Ç ÇÒ»Eèâ\9e/Åì`v0;\98\1dÌ\ ef\87ÿË¡p\9fß;\86Ï\99\11Ö¾ØAÎ\ 1\82\91}\84ÚU\1cÌl¦\87Kôô8¥¶\10SQC#kÔ×\93t\15Y\94FUÚÕVErºAF̾!Æ\17Ýâb\197¿\94Ï\ eE\9f\1c|üÞ\15{\9f\19eûÄ\fòö\ 1w¸þYÝì\93\8c\16æE\91¾8¦TË@VÔ\14\114U4²®<7©I\99Ii\97¥¦ö\88\93²û¸\ 4\9a\91A(êýRþí@÷öû\83ý:\rj:¿ã8þ¸\9döÑÎvÚî´\9d®ug\96±«Ö*t´â\ 1\b\ 1E@EQ\8b\80\1c*\97r\18 \90ë\9f\84\1c\ 4\b\ 4B\12\92\7fî;ä !\84\10r\11\ 2I\b\86C@V@Å\13]\8fîº\8aÝ_³¶µÓ\87äQ\1føàýü5ßù<ùn\88Ò.>\97¥UßW\1cÃ/)³\18aÅYØ/-Ry%\95F·¤Þ2"Æ\r\ f       InK/iÜÈ"\87t\9dôY\15£{\11¦p\978dþ|´\ 1Q\Ä\90x\0Ài'6Ä©\ 5/ä©U÷Uiø¯5ÇÛgÔ§y\ 1e¾bLYª÷(kÍ\ ee\93Í&\87\\161qÜ(h\ e©¹-³¢®ÎEv;w©\8bÎ\9b\8f6 þ\8f!5kC\82(x¡H¹ö@\83ÀÞÖ\1dm\9bÕ\9däNêþ&\e×\95ôy\rUF·\ 1e\19Öa\9cf5n\+#\84$\ 2Ê,\97Û¾Èìá.µwò\16¢í\83A\80ÈÚ\90&ç¿T%_}Ø\97\8cY6"ès¦\fö\949G\1c°\14ª&\86¯j\9d\83\ræ\ 1\ 3Æ¡\8dü½R9a²WL\9aé\84éót~Ï-\1a\87·\10\r\82\88A\98\92õNv$ï¥&©ò\91!       ½2p\84¶0t¬{z$\9b?5Z \1euTj¬\96º\ 1]Ä Ð\10Æ`9\14ì\96\10Ât\ 1ù&       f,\90\ 4Üùh\ 3âØ\88\0\10%g¾S$æ½Ò&T<6\1dn¼cK /¹\10\1dó\13'z&¼ùbÛp¹Î`F\ e\18§8bà( @\87\14\9a¢\88H3x!}\ e\8a: yo8\bÄI\99ÿP&\ø»þPù\13ËÁ\86{ÎCÄå@RËt(³ÛéÉ\93\19\87Ê\8c*\13rH\121ðµ\90\97¥\82&ÚäÐd³\94x\ 3'¦McÄ\8c¨û`\90$fü >\94ûm\7f|éSÛ~ä\83±\ 3Ø\95¹$Òx0\83mq]Pª­e&\89 i\83#\ 6\8e\16\1aeF6AWB~\92\9c8\89\93QChiëT´\ 1É\9e\18 <|\10È\ e\1f\aÚøó¯\aö]zîÚ[u\7f*¾nz!\9eb÷gôö9òÔ\92Ár3lª³q\rX\a«\ fr3"· ©    >\92\924\81SP\ 2h\ 5=\18m@ú£áÐA 8\90\ e\f{Ͼ\19\8e+\÷Ç\95--íF\8eÍí§\eÇ3a\99£@Ã\1f¬4³Mõ6\96\ 1;Ò©'¸Zû\b\1eª\968JÔ\90Æpj\8a\ f­j\19\8f6 Û\1d\ 3D\11\83zßQ0°'ûåè®ÜÕ¹=\ 5Á»;QÖéøv\85ï\84\80ï(ÔôX¯\99ºÌ\rÖN#ÎÎ0\10\1c-z¢\93¬#¹\89\1e\9c\962\8aÑÒ¢\ eÈÿ\1c\ 3¤ûã\81>\16ñƾ#óAhûÉ\e\958Vw 5áC\1d°/[Àr\16«:mU\ 6\86\ 55ÐfÆYéý\ 4\eÕH´7\eH\ e\82\9eìÄë)N¬\8eæ\8a6 øS\fPÅý\15X¶'>ó}\99<·¼5Ó½þe©~y'N\10NdtOäðÛÝ\97\91jM\8b\r¥§Z±ýÍ\83x3Á\ 2\ 3ÄA¬\99dE\9bÈCM&ª-Ú\80jG\fÐo\8fûÎõž¥Åßíõ>Ù\92m\\8f©\10-ïÆuÍ ÚZ\83çÙTß\15\ 1ÙS#%º\1a\94xG\93\1a;\82Ñ¢í8]ã0^ß`#\18ê\87Hƺ¡æ¨\ 3\9a¯b~\18Úºãnø×\7f\1c\7føÙAóë-9\92õ¯*ºV÷¡ióéTR8·\ 3
+\96ö`'ªyM>¤ a¬ATçm\14#GÑ\92Z\ fVZãÆ˪Ý\90¼ÊETD\eèÿÃÖõ\89_l  ®}²mð»Ï\92do¿8Ëz¶»\94\96P\ fÝÎÂc\16ò)¨ÙÒVdøjGÍT\r³*\84ì¾:YϪ\f¢z*\82Mìò\0\86S\16ÀqKýPÔ}ëüôW7\96\7föKÛ«Ov*Áo\8f°ßm;C\7f¹¯\18z\9cz­qít}ÝJ\ 1¦úöe¨òV\ 5©l±\8a|e¡\96ry\1eI½t³\9eV2\87j)\9e\17Íbè\85³ØÖh\v\87\7fú\93\91\87?ÿ\8d\ 6|º«\17lIl\ 3»N\10^\1fÎmz\91Qr}ý\Eå£üê+\ f\8a¯\97¬\95Õ\15Ý«l(¼[ÕXp§¶1\7f\15Ù\94¿Z\87Î[m@_XiÄä® ±Ñ\ 6à¿ü\1ep\93ö\0v\ 6\ 2ôf\9eyÍ?qé)\9c\8d¼Ë?GZä\163Ã=\95\82@W\83ÊÛ        \19=\1dT³«µÕê 2lv\12sd\18ÏrÚ°\1c÷P\13ì±¢¤Þ\81zµ×\14E\1f\r\1f\r\1f\r\1f\rÿ÷\86Þ\1f\rÇ\11\80\97qæ5\9cYòTp
+yO\90C¼Å»Ø\19æ\94Ã\ 1\16Réeb\r\1e&Ùìl§[GhmÃÃÍ\1d\ e\eÔí¶b9£\83\98\ 5\19\1a\94>]\14\ 18îó\88!\16\11\80\9f~æ{áñ\92g¢¬ëkâlÂ\92ðBÇ4ï2?È©V\8c±\1aõ\9en¢ÙÙI³\8e´Òí6
+Ãe%2G-8¶o\0\rûûQ²\80\1a¥\98P6n¾\7f\19\12c\ 1÷\18\ 2ÀÇN\7f/J/þF\92Q»&=  }-9ß>#,ê\rò+å>n½ÎÃÆ\99\9d,\8aÕΠ\8d\fµ´z,Í\1d>3¾'Ð\8f\11\84Ô\8d\92\90´I\16\10£åþÍ\ 6\ 4ÿ6ô\1eM\ 1\82´Óo$G\8b¾\91¥×ÜWdáoËsÚf¥ùÜ\90¨T:\ e×jGyh\93\93K²Ú»)\ ek[\8b×Leøû\9bÙ\93\ 6¢ø\86\14\ 1ceA>V\16Ølï\r¼\88\81\97\96\ 2\84©Ùo¤iEÏ\15Ǫ\1f¨2p˪lúMe.{J~Iì\97T©½"\94Ñ\ 5C\83vn³c°\8bæ5µ3ü}-¬\90\92"\bÃ\90h\9a\ 3I'Ù\90,¸ÙþkHM\ 1"Dö[YjásUZÕCM:f¥ïDË\82ö\1c+¬)\12\ 4U\95
+\9f²Nç\96a\aì\ 2Èaâ\90½Zfk@ÞÎ\f  é¼0\9b,\9cî"IBL\92tr³\ 1AlÄ\90\10\vø\88\14 N9õV\9e\85:õÚ#ÝQôª1\83ºhÌaÎ\18\vx!c¹ÄoDªÜjÔ\80E\82\1déã\11½ò\1e\9a_ÀdLq\18\9ci&]8ÓN\93LµS¥\93\9bí\83\ 1NI\ 6\92äS\eÊä\8b/µ)W\1f\eÒ\1aï\98ÓÉK\96\9c5\8f==\\ 6\8f[jTv]½Ù¨@\8f(\85\90WØKñsØm!fwO¸\8d)\9cii\93LÑÚ¤¡Íö?\ 6é\91\93\eª#\ 5¯tÉ\95OL\bÔ=ë?Ù¯\93¨¦ï\ 4\80ã\879Íë,oÚ9̳³´t\9e\87Ú2ÏâÀ¨UA\14ÙÅ\ 5\11\10P\ 4Ù×@C6²\87¬\84-!d!û\9e\ 1BB6²BØÄ\82\ 5QDÁ\8e\88\16§ãop¦Ï9ÿç4\a\ f\9fû÷úM§Üre²\97½\179ó¾*¡ß\ eÓ\8d\9a\9b\86û\8c\18\97RMð\8bdÔ0WÜ:Ë\16\19BÙ5*G1GëRÎB\ 5d;\râ\9d\ 6ib"P'dþh8^øý`Bõ\965\11\95J\\v\9e¡¯L\17¶Î\84*\ 5nW\9dÎ2\ 2\1fÒ\ e \9db\ 3Þß­¦L¶)\983t\19ç*E&\9d'       \94sd¾r\16\8bÞi\88\8f\ 1²\84\13@sìì?ûâ/=\1f:Vùh,\ 1\97\82½;{\96´ôu15\14®àÛÆkµ}6¸EnA;øýxo\87\81\1cbhéS$uÇ,N%\9cÃÉ\95³8©j\ 6ª·\ròã'\80îè\99×\ 3q\ 5/¬qåO=Ç`\9bS)\88ÛËçг\vù,÷T\99Àì­×¨í\b\10ÖÞ=@\1co5\92\ 3-zê$^Ë\9aFk¸3(\8dl\1a¥UA\ 6ä?5(ã\13\80!ö4°\1cÎÛv\1c¹ò(\14_uw1­fáf:Þw-»}hâ\8aXë©ÓKv\1az\86q¶®A²\9bÙOñQ\8cÔ NÏ\9c@ë:&\91zá$B/\86\fÈÿ\1a\ 1$Gc\80*î8è?\94ñÚz0û;ß\97\97î]\8d/ZZ\8d\87\85V\92É#sY\1c]°X&q×\1azl\bK×NC»\99ìd\fP<d\13Õ\8bïcø1ƶ\0Òؽ\83\ f\19\8b\0Ò¸\18 =\14\ fÌûÓ¶\9d1\99\9bS\a²oÜ<X\18Þ8\ 2·/%Òô3Y<I XÁs×\19:íHs\9b\15oe\ e\91vn\95â$\ fÒÜø\ 1\86§ÙÄ\1eG\99º¼H\13\17²\7f\ fG\ 3ãþ8`Ý\97ø$\10\95¶º\14\9d\11]â\?\882^OdJ¦Ï÷t\aJ\14\1d\9ez}«\ 3ebÚð\16ª\958B\1a!\8f\12\86¨v¬\85î@\9bYN¤¹Ý\854wB\ 6T_D\0Õ\81}`0êÐKwäÑõù¿ÄÍ®Gfº\1eGUô¯\1dl\96,&³¸3¹=m¡2)Ó\vÓÐÜ(\ 3Å\89í'\8cá\aqv\92\19\f¡F©Ã\b+c\ 4>¶ÂGÚF¡\ 2ê½\11À\10µ\17\8cî\89Þ\9cÚ\1d=¿¶;Îóø³\1cÓèjéÚ!,çz\1a\935\97Ï¥\85+D\94`\83\8cèCª°^\8c\16íÁé\91n\82\ 1á"\19áNJ\7f£\93f\829\98\ 30\a\v\8dü\18\98?ÝóÌ\1fñÙâ­ß\7fî}øÉ\89Áí=y²­è\1aÎ\9d£\18Æòi*ùë\8bm\84¹Jnó\14L\80\9a\84÷6M $_\85\9ae\rA\9c\1c\16 (êü$e­¯EUí£««½\fÈ\80áÓ\8f^9þ\14±²ôþ\87þ\a»¢,¯>I\96oGæs\1e}YEßHB\10\11\9a\97\8bhÈÅÊÖ¯®ÕµÃæ\e»êæ\10\9c\9aYTwÕL3¯r\ 6×S1Mà\97O\93\ 4eS-ÂÒ)*d`ø\8f¿[\9fûÕ\a¡û¿ùhhûÃ\18\9dÒýjß\ 5ÆÓ£¥\84Í\93õè\8d\$|­\b[\7f«\9cX½RK©¼Ñ@-_\82ÓJ\97\10\8c\92\8c\9b\99Å\8b8VÑ"¡õò\ 2\99]ø?¸\1füå/&\97ßûõÈË÷ÿ¬\ 6\7fØÏ\ 3{\92\98¯\ fd\11_$]B?É,kÜʯ©¾\7f¹¡üÛ2xÉF5¢x½\1euùn#ºð\ e\1c\ e¢ùâ\1a
+[°\86Á\16ÜÆâòo\13ðy«DÈÂs?ÿ\99íÎ{\1fhÀowóÁÇ1,°÷8  Äf \7fL?ßðCVAÕ÷yE%Ï
+K.?)-¿ô¨²²àamUÞÃú\9a\v[\8d5¹[ðÚ\9c\a\88º\9c\aȺìMtýùMì\e\80ðo»\0?ásÐ}*\ eðÏ\9c|-ÌÌ\7f.Ì©Ü\12\14 ×{JZV¸u\1d\v\9d(ál\eI\11neêCô6\93¿¥Ëâ%ñFÆñ\82Q\ f¶×æÁÈìn\94\8dÐ;\M\83\ e{\93\19\92w\rï\1aÞ5ü\9f6\88Þ4\1c\8f\ 4Ý\19q@pê$\10\9dÍ{Þ{¾bK\94\87X\17\14QVxÕ\1d\v\9c&á\\a^\11fÓôA\16{ÀOë\1cò\92»­ã\ 4¾m§ÁîÆÈ\1c.\94ÚéB\18\9dö¦\ 1ç0b\10\92·\r¼\93±@\94\91\ eħ/¼\90d\96?\94ä4m\88/\92o
+ËÛ\17y0Á\1c\a£\bw\90õA6kÀÇl\1f\1e\8cz\88=v\17Vätbd.\a\1eCô{,\b\93Ç\844¹¡\0¢\98]@°ÓÐ\93\1e\vzÓÓ\814#÷¥ìLÙ#y\16ü\9e,\8fxK|\85}]XÿÊCÈÃ\1c\82>ØA\eðµ²\87Çi\9d6\17\89çpàDî1\8c\8eÒù,H£Ï\88êóêPý\1e(@ï\9b\86c\91\80\9f\16\vÄii@\96\9eûRqªô±2³ñ[e\ eaU^ÈúFRÁ\9b\176J§z\9aµ!\ eÅäë`\r{\98ív'\85ë\1aÃ\v½¶f\85\7f\ 4­\ f\1a\80\1amô)0}^(Þ6\bRc\81$5\r(Òr~P\9d,y¢9ÓðwM\16î¶:\9f¹¬(å^\93Ö\89gDHõD\ f±ßÏ¡\ fyØl»\83ÆñØÈ"ß0A\114át!5F\17\925\eübl\9f\17\8a·\rÂ\94#@\9a\9c
+\94)ÙÛ\9aô+Ou§`÷õ\99Ø;ú\ú\rmq×\82ªZ4+\87+'Å8\83¿\87bqu2Ǭ¬NÏ ­ÇßG\91\86t$í\84\14§\9d\14â\r\ 1\ 1Þè\83\ 2ôFï\ 2Â7\rÉG\80,)\15¨\92³·µ©ÅO\r'ë6ûÎbîögSoö\15¶/\1a+øWu\8d²°\12£÷\88\88\96Q.ml°½Íc`r\ 3j\9a($oQM
+\88\9a0\8f¨\ frIF?\14ÿi\88\8f\ 4¢¤#@\9e\98\ 2ÔIç_éS\8a\9eõ¥×>\188\8dZ7g\91W-\17[\97ÌåÜ«\ 3\8d½\ 1\rJ?&Á[Ìü\961C\17k\ÕÖ\15\90°\ 4\13B\86"ÌmÑ\84;[ô¡\8e\16\83\1f
+ þ©¡7q§áD
+Ð$fýÃ\98tù;SjÍ\96%\ 3qÏz\8e¸fÏg,ÛË;¦-°^\8f\1e¡\eQ`-}"Ò\98\8aG÷HºÚ\ 3üvÞ\ 4\97-\r·35Slº.ÔJ7\ 4 øoÃ\89Ã@\91\90\fþÅ\1e\9d\ 55\81\1fp\1c\9fNgÚmwº³ÓÙ±\95Ù\99\9dmu»£ë±*ê\8a¸\82\80\8a\12\ 4\ 4¹/#7H äNH \1c      \10\8e\90@\ eHB\80\84\ä$77!á\10\11P\17¡\88\8ax\0¢EÐ.øo´v\9fÉ[\1föáóþ\9dßOâ\17¶©8\97¸¦¹\90¹b\bD>±\86æÏ÷Ä\16ßîΠÙõ°\ 6«\ 2)Q\8bðÚ6A\81YÀ-ía×WÚj\99LGU-o¸¼F<B­\948¨4\99Í\15¿4ðüN\81\16_\7f õ\rÝTú%¬w\9cO_µ@à\8b½¡Ø9{\ 2q¼/­¢ß\94Ý`PçµÉ¥X\8d°\85\b\8a{j\e*\ 6h\9cZ;\95Õ0TÌ\12\ f\17×J\1cÅ5R\9b+\0ÏÝ\r4xï\a|_O ò9\ fäg.¿ÓøÄm\98Φ¼è      È^p\84åÍÜ\80bFl©\15\9d\9dY\u\a\,R¢Õ\8dR\82\89ÑJ       ËúK\ 55\83d\1eÛAä\89\86Hl\89½ ^js\ 5à\7fl\10øx\ 2±÷9Ðî\15\ 2:¼c6:ý®-\r\ 6¤?¼\15\9ey{"\ 138\94\nìÍäÈ,9"A\aRU¯Â\e\ 5\9d¥\12J_\81¸Ê\86\17±ì\18Q\8b\ 3Û$µã\ee6WüÒÐä}\12HN\9f\ 5êSA[¦Ó\11ÿêó\89\7f2\ 6¹:7\13\91<v7\1eÝ=\96DUÛÓÙ­½Ù­\1c\v¢½Ú\80ÕSt$K\81º¤\e¯¤õ¡\14Ì\ 1\84\`Ë\93ÉlÈVù\80+\0ÿ\88\ehôÚ\ f\9aO{\0\99§/Ðy@6ºN\85.\rûDÌO\aFNÎ\ 5eئ#ñ\86\89Ä2é\8dÔz\9e\rÖÌèFÊif\82¶D_h$iK¬8uy\17ZEïA(9½peko\8e\12 8ü¾á\0\10y\9e\0Ê\13g¶LÇýWm\1e\81\ f§|!Só~qö\a\17`¦Ù`\92l*ª\927\92ÄaÚ²\9b+»QRª%_E6\16ê\88ú\12\ 3®£Ì\8cÖVY\90Ú:+B+°Â5-\9d®\0\ 6þ©ý@òÃ1 uÿq½ÛÝgqì\aß;s'/9\16½ æ\ 5?\84l\ 6\9b\88¬a\8c$siÎ\1d¨½hIQ\17AAt>\817\15k1Fj\aÒ@3äééÆ\=Û\89ï\12 <ä\ 6\84\ 3\8a#GÞ\99¾?±<tÐczöÐ\8fC\8bÇC-K\9e©ò\ 5\1f\1e¤¤v"º¦b$\85SjÏ\11\90ûÑ­Ä^¼\ 4×M\92£;\8bÚ\91ÖR%ÜR¦Î1Wi²Í\fíu\13Û% ù \e\10¹ï\ 1Ú\ 3\a×úö|ÿÏ»{÷\8d<Þïk}å\1e)_ñÈà=òÁÒï\ 5\95\94MÆV\15\8f¥Õ\17\fç6\10ì(\ 1Æ\86kFö\13[óú
+Ź½Åm°\1e\8aôzw\85,³»F\9eÑÅp   h9à\ 6äûvoZþñíÂͯwÝx´ëpçËïü\15o\ eÇð\97=3é\8fÎb¨³\97\8b
+ï$\94çßʨÁ\8eåÔ!G\91lø0\96\9b3DhÌv\90øYv² s°¤)ÝF\15¦ÚhÍ)\ 3Õ-®\0¢ïÜ\80n÷WK\ e·/o>Øùu×êß\8e·oí\rà¿q\8f¥¯xeP\1e\a I÷Ã\89ø\19h1ênzYî\14\8c\96=\91W\9du\v\18ÇÕ¦ÝÌg¦\8e\15Ô¥\8c\15Õ'Ý(e]\e-gCGi.\ 1\8a];^÷üå\8bɹÏ>ï~ñ×o\94[\7f?)\0û µoOÄP^\9eM!=\ f\86a\1eÇ à\ f øì¹tRæl69m\ 6^\9cr\ fU\9a4\8d¥\û      O\85Þ%\96%Þ-,O¸]T\11\7f\9bB\8b\9b*sÉ;ã\8e?MÞúôw½+\9fíPmîÜÓ\ 4v{Ö\82C\17)\9b§#Hë\ 1\89\98ÕðÔÜ¥¸ë\19O¡¹)\8bi\88¤\85ëhè£\LâC\ 4.á!\1a\1fÿ\0K\88\9b'\10\89ù1÷\v\89Ñ÷\8bHQs¥.\99´ÿá·ýwþø{õÏ\9fï\14\82/÷2À·\1eTpü\1c        ø\ 6c6\83#s6"âÓ×b¡I¯ )\89«©iñ+\99\19±Ë°ÌèexVÔ\12âzä\12:;â9\16\16þ\1c\ f\v\7f\96\9fsåYAnØS²KúG?ù\8d\93O\9bÁ\9fÝêÀW{ÊÀþ£$àé\85\ 6þça øR*\b\ f½º\15\13\1e÷óÕ¨è·É1\91oÒãÂ7²â¯lÀ\12ÂÖá   ¡ë\88Ä˯\91WC^£¯\86¬á Ák\ 4\1añ\9a+\0óð\17\80qf7¨      :\ 6êB|\ 1ëJÈ\16+*þu}Bæ2#\ 5½P\93C\9e«ÄѦË\8b\98S%eÜñÂ*Á\18\91Ñ:\8a\rc\e¥Ch\81Ü\81li·çµ)\aá
+Õ`®FmË5©{òÌÛökï\rÿ·\rôÿ5\84\ 5ÿ·!>s\99\99\8c^ ÃÈsUXÚt\ 5\999UJå\8e\93«\9aÞ7\8càYÎ\86\ 6\99\ 3-PØß7 $*g\83z0W«î\87\9bÔ]yÛ÷¡\81él`\:\ 6XA>\80s9ø\1d7<î5'&c\99\ 5E=ff\14ÎÑ\11\15Ó\95DædyiÃx        M8ZH\17\ f\13ë¥\ e<WaÇ\bT6T\8bÚ\86\94h\aò\94º\ 1¸AgE\1at\ 6\17\80º\8f\rLÈ1À\ eô\ 1\rÁAï\1aCc×\e#ÓV¸ñ\88EvrÁ}fNùt\r\961I#7ܤ\96        G\8b«Û\86
+\98r;\81£´aù\9a\ 1t«®\1f)ëèChô\9dH½^\8fê0¨ÑÛ\aê\9d\r\86º\80c\80\13p\ 6ð.]\ 2ü\90\98\r~xê\v^LÞ\93\ 6(q\9e\9dUv\8f\89¬\9dª&roÒ(Â\11Je\9b\83ÌP\f\12Ùê\ 1<_×\87\11é{Q
+c7Rg4 tF\15Zg\94a¶ïCC½³¡þâQÀ½x\ 6ð!\81 )(ú\8d04eµ)
+þT\90\90ÿ 1\8d2ÃÎ¥ßfà8ãÕEÂ\91òò6G      ½ÝVÀÒô\11øú^\8cØØ\83R\99\8d(\8dE\85Ö\98¥\18­Y\84Õ\99\v°>6°.\1c\ 5\8d\17¼\81à"\ 44\aF½m     IzÙ\12\9eó¬9\16ÿ°)©d¶1»ú\ e\vźŠ        F+)m\ ejuû@a½¶7\9fg°âDf\13FiUcÔ\9dR¬ÚÚ\8aÓX\84x­i»>6|\ 3XþG\ 1Ïß\e\b/@@+$âßâ k¯ÄaÙÏÅÑØ\ 5QbÑ\9c0\83ö\13/¯n\82\8dÒ\8bÅ\ 3\15\15í]%µ:c!רË\17ZTxY§\f§êjq\12\104ÖF\82Ö¼]\1f\1a\ 6öywÀ?ç\ 5þÃ\ e\9d=5a'\0\1cïÎv:î´u»]»»ã\8cµº¶u=©¢«,\82\19@n9Â\15 \84$$!\84+äàÊE\ 2ä\80@ÈAH\bGBB\80p\84\84\ 4\10EA.±"( hAÅ\vP×ë·\99±Ó\97\1fÐ\87Ïûw¾
+o\bPùE¼i\ e\84­·\84 ×Ô\919\ fÔq\ 5\8bÍ©¬[\r\19üq)Q<\UØh.gêºY\15\ 6}\89°WS(35Q\eû\95\14\9dEJÖYj)zS\rµÝh/Pók\83Èë\18¨ó<\ 3\94^~ É'ü­Ú?aS\e\84\8b ¬´AÉ\v:8}F\8d/¿R\9f\88¨\8dÝ|\9a®­\8ccha
+\8c\r4±Y^¬´H\8b´ÖjªÖZU 7\v
+Ûûìõ[C­ç1 ?w\1a¨<}A\8bwØ{­_ÜKýyÄ\93\8eð\8cû]Pâm\ 3¢p\\8b+¿Ø\90\r\85ź\16\1eË äð\8cRV\8d\90[\85\0¯X;À-ië¯(iï³×Ç\ 67[Ã9GPïq\1a4zø\0\8d\876\9fØÍÎ@ø£\9e0Ì=\134kÖ\88 \ÕcÊ-M\ 4±ANTij\v´Ê*\86AÂ+7V\97     Í|¶ÌZQÚ4Àf¶\ e°\19mýl\86Þd/ ²5ÔØ\1aÄ\1e\8e@áî
+\9aݽ\81Ö#ø]\87\8b\9e\80¤Us\18ri0\ e7mN¥\fw¢Ë\8c\1a|­®!W¥\92Q´RQI§°\8acä      \ 4f\ eWlerU\ 3ôòÖ\ 1:Gg¡³õ&{ýÖ q?
+\94n. ÅÍ\v´¹\a½éò\8a|fò\8f\7f0\14\96rg$\ 1\9aB¶ö 8\866\9c¨¥9»A®$µVË\8a:¹bVoi\rÏL\13\8a,EU\8a\81\82Jí@!Og)ªÐ\9bíõ±áÌ\ f@êv\144\9c>\ 54§=A\87[À+£gøÚ $fy4"nv,\ e9r1\99ÔgJcë:±5J-AYÛLÔð\1a
+:Jå\8c\9e\12\89*©îÏ\97È­y\12­5¿Zg!WêÍö\ 2µ¿6ÈÎ\1c\ 1\8d®Î@çâ\ 1ºÎ@6,\1eÁ\ fGüÃîÎD\86OMBÓ\86F`ù\ 6+¢´Ù\98^-íÄ+*u¹j¶\9a¢/i¢u\91U\1ccnC¥9K)ëÇ7hú³êÚúsÅz³½\80ØÖ ²5È]\7f\ 2ÍÎN ÝÙí­ÑÅûÙ°;äÁT\0d~><lt&\ 6a\1eKÌÓ]\82³\14VTUu_\86¼¬;»¹¤\83¤#ë\8b;st¥Ýx­À\88m\95ö¡µ-&ls{\1f^i¿\8f\r§\7f\0
+g\a 9y\ 2\18NºnZ\9dÏ®^sw¿s\eâ9µ\18\1cqq.\1aÞ5\1d\9fÛ4\96̨½\9c\18ÂJé\16\82\8alÊ×d\e\8bÚ2zY\1déÝü.d\97¸\eÑÕØ\93j0t£´\9d\ 2\92\80Øå{ :y\b´\1d?ö¶ï¸ÓÚ\88\93óâ-w§©»\9e~\97îB =wBÐêÙ(¢ôz\ 2\9d?\ 1ç1GÓE\ 5\97²äÄAR#ÁR¤Æ\99\99Úô¾\8a6T\9fP\9ff¬kG\18\94^C\87½\80ÔÖ sÚ\ 3\9a\1d\ f\80Î#?­\ f\1e9zïú        \87é%g×á\15· \9eû^\89ê»\10\9ct!\84Ì\9b\8da2¦Rx\85c\98\9aü\91,iöp¾\ 2?T¨Â\fÐ\9bÐVN\vÒÂW#úE\9aÔ~¥\ 6Þßj7 sØ\ 6ê\8fï\ 6Z\87½oû\ eî_\19;°wfÑÁáÒê    ÷\9eÇ.áêU\8f\14É/¾\99ÜÅ`
+c\16Ê(¸\ e¯ N`+³G³Dø+ù\12Ìå\82:ô%Z}ÚE\962u¨¼\ 1>T©J\1e\944&\r\ 6ê\ eo\ 3\8d\87w\82Î}»\9f\rïÙuóö?¿»¼zðXï\8bcÞêçÎ\91\92ggS¹+~\99ô¥P2u.\9e\96÷3\82M\98ÆVà&³\ 4éãÄ*ä\18¥\ 61Z,\82_e\88\93¯°%I#\iâ\88P\96pYRg/P\7fp\ehý×ö×ýßm¿sã\1f\7f\1dYÙý}ïÆ~'õkG\88ä\95s4÷ù¹Túj`\ 6ùÞ\85¼Ü\ 5X\ 1~>­\ 43\8be¢n\10Ø\88\99¼2ø4¹"yª\90\v\9b¤ñ\13'\99\82ø\89²Ê¸q~\15t¼Zh/ Úû5èÚùõ\83k\7fùòê\83oþfÜصOýa¿\8b\ 48ús߸FÓ_ø$\93\1f\87¦ç¬@3qË°<ôR\1a   ±\80¡Âïd\16%Íç\14'ÎåÓ\12nQéq·\8a\18±³4fÌM\16+úçòÒ¨\e|¶½\80îÛÏ×\86·n\19\9bû|\8b\9bíj°ë\90\ 4\1c\82\7fChïÝ#È/\ 3â³\9f_\80c×bQ\88G0lÊ
+\ 2\ fû%=+á>>'n9;7ö^^^Ì=\121ú.5?j©\88\14¹D'_X,¥D,\96QíµnúòÓÑñ?ýÁtÿ\8b/ÔàïßJÀ\9eÃ\pø\14\r\9cò&\ 3ï ìw!\91\98×\91±©\e±0Ø\8b¤\94øg\88TèStZô\13\1c*j\8d\80\8e|\9c\93\1eñ\98\88     \7f\84=¢bC\1f\16áB\1eÒ3\82WYx{\8d\ eoùÄt}Ë\1f5\9b[ÿ,\ 5ÛwòÀ\8f\aéÀñ$   ¸\9dÍ\ 2\10\1f4\b\ eL\ 1\17B\13ÞA# oaQQÿ\85Ç\x\8d\84\86¿ÂÄ\85½Ê\88\ f}IH\bÙÌN\bÞÌK\fÚÈ\87\9dß À\ 2×\v\93\ 2ÖK\92íeºúÙ'­s\9f}*\ 5_}Å\ 3;vÐÁ¾½$pâ\b\ 1¸;¡\80ï\99$pþ\,\b÷\8e\ 21~\11 Á?\14$\a\ 6\ 3Äù \80
+
+\ 4\98à\0\80\vñ\a\99!\10\90\15
+\ 19¡~\1fòÂ|?\90Â}ÞSí\ 6Ø\a·\82R\97\1d\80éw\bp\83ÿ\ 3øá^@\10\1dò\9e\97\10·Y\81H{ÊÆ\11V\19DòrqQÉ"\85Å\9e'VpoåTUÞ$ÔVÏdÈD×±Jñtz\93t
+Ý*\9bBµ×M"{ä\93i\96ú1äÅúËèa¹=~oø½áÿ\1aض\86R[\ 3ßÖ \bó\ 4\95Q!ï\ 5ñq/¹ð´§e\98ÌUV.y\99VH[(`²çIåÜÙÜʪ\e\9a\19¼L<\8dSJ§0Mu\93èVù\ 4ª£~\ 2Ù«\98@\ e(® \87\14Céö\ 1\1c[\ 3ÇÖÀñ=\ 4\ 4ç\9d\80\13\b#\82?\b¡±/\ 50ÄS.2s\95C -3)´\85b\1ag\8eÂáß$ò\85395µÓ\ 4©t2C!\9fÀ6+ÆÓµÊkhCÃ5\94Iu\ 5ý?Fç;ªé;\ 1\0ø»×?úz½Ñ{w½ö]-¯ï¼³UÔ§U\8b ""{*(CF\98
+DF\ 2\ 4\b$\10L\ 2\84@\ 6   Ù;\90½Ç/\89\ 4d:\10\90!\ e\14\90á¢Z\1cu]õ{©\7føwþøüÿ\19T\f\95\ f\bï\0Ê\87\83\ f Fï\0¬\84\0À9\16\ e\89ï¹éY¯Ø9E\eÌÂÊG4\ 4vµ£\9e¸Ø\8aï\98?ÛƸÞ@çÎÖ±\85ÓÕBÉÕJ¹|\ 2©î\19/7)ÇË\9cª±²\ 1Õ\10b@Õ\8b\86*¼óá@ñ\1cè\9e\ 3\1fð\12Â\80 é\18\10¤f¼æe\15\14 \1f1KêWiÕÄE2®c¾¹\959\87£rg0]¢«µ\ 2ÙD\95¬g\1c©Q])·¨ÇÊÜ\9a\11d¿Æ]ѯµWöiMU}:o\0ªç@õ\1c:£v\0N¬?\10Ä\87\ 2ѱ£@\94\9cþF\98\19?\17±Î.ª[cTà\97(\98öy\12\911\87oçM70Å\93h~÷8J¦\1c«Ðh.#lºQD\9f®¯Ò­·W¹õF\94[¯­öÎÇ\ 33j;àEï\aÂØ#@\92\90\0¤ÇO¾\95¤\15<\17ÃÊ~\16\9cª½Ç.;»ÔYK\9eïhê\9ck&ñ¦qtÉd=·çr\8dT}¡J£\eª°\1aú+z\8dPU¯ÑX}Ψ®9gTÔöz\ 5Ð<\a\9açÐ\15¹\1dð#ý\808:\ 4Èââ\80<1õ\7fÝ)y/ä\99%O$yÕ\ f\84ðÆevUëm:\96>Cnæ^!R$£\8d,Å@½Pë®í18Q\ 6\13\84r\99\rÕ.³ºÖeîF»ÌÒºs&o|<°#¶\ 3A\84\1f\90D\1e\ 6Ý1±@q4ù7å\89\9c_\95éðÇ\8a\9cÊ5y\11vATÑ<ËÆPÇhxî0\89,íÃw*\1d\8d\\9dµ^j4¢5\16]­ÍªD;­ò:§U\8cqZ\ 4\18\97W\0Ýs ÿ~\b÷\ 5Âð\9f\80,â0PDÅ\0\89·\9a¤¬gÚ´Â\87ÚlIJª\10}³»âì8\1fM\19aâ¸î\8e\16)ÔBU\99ð,½¶QdRb\15Ön\8cÉ&Á8ì\ 2¬ÃÆmpZ9\8d.\8b7>\1e8a¾@\14º\ fÈÃ\82\81*2
+hc\93\133~1¦\16Ü3ÁJ\16\8cE¨i\15¢é¢¸\86ÒÏÆr!:Aj$\93\16\86^Nà\9bÅMr\9b\0§·s\e!\88\85\83ìÌ&§\95Ñä´x\ 3tþ~8è\ 3¸¡Û\80øÈ>Ð\13\1a\ 4\91@\1fsìWóÑ´\9fm)9«PVÑ-kQŸ¶¬iP\8e¢8ùõ\1cS×Y©\9aFRÉÈ4½°\95cæ4Kl]\ 4\rÔI°C4<\ 4Q    \ e\e\95à´zãáÓsà\1dÙ\ 6¤!{\812ä Ð\85\85ÿf\8aNxfKH~èJμëÎÎ\9fu\9cF^4\94àÜ\8aÊ\ e«\18ÍÑp\e¥rf³J@ëг:ºÌô6\91\8dBRBd\92ÅÑÖ
+Am-\ e[[\8bÓê\8d\8f\aþám@\16¼\a¨\ e\a\ 2ChØ[kdì\86+>é~\7frÚÂ`vöä¹S\88\19\9cC\83ìÐËkØÝB¬DÈÅ+Y]d=­\93a&Óø¶\16J\ f\98\1c\84\ e;DlwØ\9bÉ\ e\9b7\0cû_\0Ãs\10\ 4o\ 5ò \1f\81æÐ\ 1`
+       yí\88\88\17\9f°6\9a\92tk4\v\97\8fè³\177Z\fåí*\15\8a-\96ÕKØ¢&%\8dת#qèfB\17×\86cÊ¡\ 6¦\1eÂ2 \bG\83ìMT\87Í\e\1f\ fÂC?\80\9e\83»\81\1fX\ f\a¿è\r\ f[\1f\8e\8bZ\9eH\8d\99¹\9c\915:\98Wît\156è­¥d\99¾\92ÅU¡EôîF\ 5IÒ¬Å\8b\ 6\ 1ËZÇ\97ØkxZ¨\9a\aÙÑ,\87­\9eé´z\ 30=\a¦ç >ø=P\1eØ\ 5\8c\81\1c\87\ 2\9f\ e\84\ 6?\18\8b\ fY\989\11=1\9e\9ey~4§ÔÚ\7f\1a«t\96\90\ 4V$\93\11¶i°Ýx%A\8dé!\ejäLs¥LdEÈÔ¶r\99ÃV!tZQ<§Å\e Ës`\ 5ú\0\16 öß ,\ 1{߸\ 3÷?¹xÄ\7fåÚQ¿ë·\12#/N§e¸Æ`%º\91\82zÉyx+ËUÞÙnGññ\96z)ÆxVY­'i\91ºNC©V`\82k\95æ"\9dÝ|FyÎT&ó\ e`y\ eÜ\ 3ß\ 2¹ß\7f\81î'_\0ùíz>\14°ûÞÕ#»n/Fï\9b\L\8c\18¸\91zÒ2\95\ 5ï\19ËCs/\14\11)\83¥Tb\7f%\eÓ\8b\16¡\8y¹£U        \87è\9aB\88¯+\80\14ú|Ȫ/°¸õ\85\0¶ç ðß\ 4\14{7\ 3Ó\9e\1fÞ¸\7fÜöhÌoëí;A[¯®\84\a\8c,ÇÅ8\16N\9cÔÞÌ(\14ÎäVÓ'O7µ\8c\95\90±\97*\18¨\vµÜò\11\9c¨x¸Uzj\88Þ\9d;ÄWd\ fõ(aCV%l`P\99ã\1aPy\ 3p<\añ¾\7f\ 1õîï\80}çæ\8d\91\1dÿ^¼±gÓÕ\95\80\9dÃ\ fB\82\1dkQG5wãaÂ\85\13gèó\19ÕÍ7òpØkÅ­¨Y\ 4¥lª\96\ 1\9fhd\9f¾ÒÂË¿L\15ä^b\8b²/IÄ°K\1a\ f§(ãâ\90Ô\e\80ç9Èw}\r\fÛ¿yÝ÷ý7«S[¾\9aZÞñÝðºß\1eh=(Lý0ì¸ð~l.}-±\94¸\92Z\83YÊn@Ý."\96ß@´Á¯ÕP
+g\1aè\ 5SDFîd{Wö\ 4\83\9d5Áãd\8e˸\19ã:nú8ä\15 ð\1c\94¾ÿ\0Ð\7f¾\¿¼éo3K>\7f\1f^÷Ý\ 2=Ý»_½\11\18%ø%4\85ö$&\8fø8±\ 4󠽪j%·¾|    \8e\83ßA\12
+oÕ´äßĶå^Ƿî\91:²f©Ô\8c\19&íä\f\9f\9e6-ïL\9dÖz\ 5H|ÿ\f\f\9bÿúbð«?ÍÝùâÓ\91u\9f¯¡\97[}U¯ö\ 4
+^\ 6ÆÐ^\85¦\12_Æåb6\92\8bQëY\88Òûù¨âU8úÔ2\12\93¿TÝ\98³\88i\82-4á3ï4\13Òo\93\89'çiÍ©·ºZRn
+Z\93oÊHÞ\0ÊÍ\9f½sþóÓ¹©Ï?\19}ôÅçöW>ߪÞmÝÉ\7f¿7\88
+\82b\88ï#\92\8f\9e§\15\94\8a\v\1f\17\94æ?\82#s\1e"*a÷Q¨Ì{u5ék\rµi«xtêJK}Ê
+\19\93¼LÃ\1e¿ËjHºË÷
+0}ùÉì\85Ïþ0:÷Çÿ³[gAM v\1cÇít»v§3ítÛÑ\99vZuÕ®]ïÕu\91Cî;r\86CDD \90\90@\ 2       !`\12BBHHBî\84\1c\ 4r\90;\80 \1c\ 5\B\10\15ñÀêZ\11P´X\8b\8a\8buåß\fÝ÷øØ\87}ø¾\7ff~/¿\9f÷¾ùô76Ø°Q\vÛ÷\88á@\10\eBbh\10\9f\1e\99\9cu¬èun^þR!êø\vlQöw\ 4LÖs\12\19\ 5\97±H-M{ÊÀ#\9fÖ\11R\9fpËR\9e\bÊ\92\1f\93\16\14Ä\ féÖ7k×\8cMürMßô'¿°Áï?ÕÂg\9bÄ°k\17\e\ eúS!"\9c\ 4     q8@&¡ \v\99ûþxæ±w¨¬¬ï\8b³3\96KsÒÞ\96\1fG¾!禼®:\91ü\9a\96\97ô\8a\91\9fø²® á%§àð\92\0\85X\12\17~Hç<\1f¯é½¾v\8dmñW\1fkaýïÄ°u\ 3\eö~A\85ÀýD\88
+(\ 6Dh>¤FåÀ\91Ø,ÈA¤C~\ 2\12ÐI)\80ó\9eo|J"\94§&\0\19\89\80ª´x ¦Å­Ô¤Ç®03bÞ×gF¿ç}P½ã\1f­±M}ô3-üz­\bþð[6|þÇ\93°oK\19\ 4î@Cø\97' îë£\90\14\90\ eéA©\90\1d\92\ 4¹¡   P\10\8e\0tD\1c`#c¡Ô{xÊ¢¢\81\14\1d\ 5ä\98\8a\89\0jl80bÃ\80\15÷!\ 1sÛ'À<¸\ ejc¶\ 2/q/\bÓ\83@\94\1d\vÂ|ä
+¯8ç-»\fý\82QMxFeU>¦ði\8fHRæ|\99\8aý\0¯ãÞ/1òç°ÖÆ{\18\97ð.ºK<[Ô'\99-<+\99A\8dIgPW¤7\v¯K¯¡ÿî³\9f\fÿg\ 6\96×À\8aÞ
+\82\84½ N\v\ 2ÉÑ\18\10\9fH]iDç¼åâÑ/X\14Â"\9dIY¨æÑÿE\96°æ\89M\9c\a\ 4\1do®Ô(¸\87µ
+g\8b]âYt·d¦¨_6]8ìí\82|ªpR~\r=)\9bÀLÊ}\ 5¬UÃz¨\8fÚ\ 2ÂÃ{@\86\f\ 4yf4HsRA\8c:öVPRô¢¾\82°X[CY qè\ f«Du\ f*\14ܹr­à.Þ \9aÅY%3X\97l\1asZ~\a\9c*\1aUN\15^i\9aÄ\U^,¾Út\ e{ÅgPç5Ôy\rÜÈ- Aì\ 1Er\0(Ó£A\91\9d\ 2²¼ìeQqá\12¯\9c°È>IY`ÔÕ<<)`?¨\94ñî\115ÂY\82^2]b\91ßÁ¶+§0g\9an£Ïªn\17]T_Ç\V\8fc/«=¸Ë\9a³%\13>\ 3¶×Àö\1ax\11[@\16¿\e\9a\12ýA\85\8c\82¦#I Ì=º,-B-  ñøg\r\94Ê\ 5VmÍ<\9dǾ_%áß­P\89fÊZewJ-ÊÛ¸\ eÕ?\8a{5·Ð#Ú\e\98     í%ì\84ÖSr©y°ô\92®\1fï»UC½× \88Ø\f\8a¸Ý >ì\ f\9aä\bФ'\82úXÖ÷Ê\82\82\97Rlé³F\12y\81C§Ï×rØsT\11\7f¶²I<MlQÜÆ[T·p\9d\9ao\8bÿÖ|\13s^7\81\e×\8d\96\8c·\fá/¶ö\10.¶v\97ù\ eê?ÿ\9fA\18¾\19\9abw\81&þ 4'\86\83\ e\99\0ÍY\99ï4¹y¯\94hÜs   ¾â1¿\8aþ\90ÍbÏÕ\b\ 4³U
\14I§¼I0k&K;tWp}­\13ØQýhé\ 5ý þ\82¡§ì¼¡³ü¼ÁEô\1d\ 6\8e× \ eÛ\fªè\9dÐ\1cë\a­\880Ð'#@\9f\91þ®%'÷¥\16U¼¨Ä\11\1f\89ÉÔû<FÝt]\ 3ÿ\ 6]"½JQ«ÆI\86æóeöV\ f¡ÛèÆ\9f5\r\10ÆL§ËÇÚ:\88cmvÒ\98ÉRá»U\ 3×o=HB?\ 3\ eh\89>\0\86¸\100%Å­\98Ò\90¯\8dÙÇ\9eëó\8aþÝ\8c!ÜW\92ªî\88iÌë\rõüKÌFÙ\18M¡vWéZ\86ÈfC?±½­§¼ßÜ]>jq\91F-Vò¨ÅTyÎl ø\ e¸?\1ad^\836b\aè#¿\ 2Sl0\98\13bÞY\91ÉK\96¬£O̹\ 5ÿ4¢KftDòuE5s¼\91É÷px²!¦DÓGS·vW\eL\9d\95v\8b\93|Új'»mm\95\1e\9b¡ÊcÕU\8fZµÕ£\16\1a\1a¼\ 6EÈ&Ð\85m\acÄ~0Ç\ 4\81\r\11õÖ\91\92øÜ\99\99ñÈy<wÎ\86ÁÜ4\10*&Ô\94Z\8f´\86?ȯ\97÷Ô\v5\9dL\85ÞA×µYNZ¬¦êSv}Õ\90CW=b×PGì*\9aǦ¤y¬¾\82\86\1f\rÊàMÐ\12ú\ 5\98Âö\815*`Å\19\1fñª#\19ñôT\ 6r¾+'{º\1d]xÍ\Z1¦«¨\1dRRù=b\96¼\83Ç×Úê¥z\13Scna\18mZºË¡¢÷;\95t·S^ãvÈ\18#6)Ãã³U\ 3ÏkP\ 5o\84Öà¿\829ôKpDúÿÐ\11\eú¢+1v¡'=é~ßñ\8co»P¨K6\1cÉm 2ú4ÕüNy­Ü&âj\8d<\91¾\99ÓdnªÓÛäL»CÂìq\8a\98ÃN!Ëíhd\8dؽÙ|\ 5\81ï5¨\ fm\ 4ám` Ù\ 3®p¿å®\98àïz\12"\1f\r¤Åß\1dÌAN\9e)@\8d¹°ÄÁ¶2FW\v\85gWÑeF\19\15\95\ 2\85YÒ ³5r¬N\1e§ÛÅå\f{s;¹õn;·~Äæ«U\83àëõ \rÚ\0Æ ÏÁ\16¼\e\ e¼9\13\1d¸8p8tÞ\9d\1e55\9c\9d\97_àîÄ\10{mø\1a\97±\82×ÖL\955«X\1a\85\9c§\17I¤f\9eÐ;Kc\9b\93%ètÕ6\9eu1\ 5ÃN\16ÏmgñF|\ 6|¯Aè54\an\0SÀ_À\11´\13ºBö½ì\8fô{<\8c\b|p!-ä\86'+åÂÀ\89üÁÓEå§ÚKèV+±¡ÅP-Uê\18j\91\86ÛÚÐ$n«\93«l52£\83*mwVK\a\'%n'M4b§\vGl¾\ 2\81× :°\ e\7f\ 6³ÿVh\ fØþÃ\99C{þ3\14¾ÿÑ\18âÀÝ\89\94à«ç\8f${¾ÉÍëí/$8»p4\83«\9c«²R$b\13]Õ g·0u\8d&\9aVi¥¨[í\15*\87\83¨îs\92TnG¥|ÄN\91yl¾Z5H¾Z\a­~\7f\ 2«ßfè<¸m¹?pÇ3OØ®\87W\10;oO&\ 6\8d\8fg$\r\8dæä\9e\1a\9bû\8a©ÚnB½´\9d,âý\97ÝúükÂÀã8N9Eíi«Õ\9e§ÐVO\ 4û:Åc¨\b\ 2²wØ+\8cì\90MX     $\81\90\84\f\ba\ 5E\ 3\ e\10\10Ð\9e ¢´® *EYÊ\10dHeJ\0q ½\8aþ.¯{õ1ù\aîÁûùçÁ÷Á·\86wRX%*åUÈËXåÊÊ\84²3\17ãÎW×ÐÏ7j5W3Kî]L8­\e(L6@\91Õ·PvØ\10j\ fï\86\86Ã{\97î\1c5\9dm;n2Öï¹ïI\1fâXKg(âú¯Q¨Ú{8ú¹Û$NQ\13#S~-I!ªç\14ñþ-P%_\96\9de^*(§Ö\94T\90jªª\885\rUÄÚ\96JrÅýJj\99n\90«m(¶Ü\ 6\17¬vÂO\96ß\7fn²ØµøàЮñ\1e\a£\81QW\93GC¾6·{\82}ê:#£/´a¨§îDz\15j\9a óvB\16ï\97\94üä&þɸëR\15¥1ÿ\fá\9aê<¶¡²\fs­¾\1cÝx¯\f{åa9þ\92n\90¯m(1ÿ\ 6ªÌ·C½ÙÎå;\avNw\9ao\1f\1c=º£cÜeß½1_ëÆ¡ ¯ê¾\bdi7\8a\94ßNH\94´QÓÒ\1eÆ\8b\93ï³å\8c\96ô|r³¤\b¯Î+F«UªhueI¤º¾\ 4ÙÜ\\12yëQiô\8dGgt\81\ 2mù\83[ öÀ6¸±ïÛù_M¾y>üãWí\13\87¿k\9e:nv}Üþv\fásv$4¢ðy4AÖ\8f\8bK磻°\9e\8c\98ÔÅÏÂuJ\15¨ÎüüÈ\ eUaDG¥2¬óª2´ë\9e2ôqwQØ\83®\13º\80RÛpaÿWPgòõ\92ú\87M/ú\f×uL\98nmÖXíi\9cµ³¬\99vu:3éí_0\1e\18%y\19\8d¡\18I/\88É´Q:\878\9aÌÇ\8c¤       £\87%bäP\9e,|ðTvè@\99<xà²Ö\8d\9c \816yP\7f¿NPl¼\ 1jL¾üÜd´aªsËÚÎñíëÕ\v&Û¯-Zì«^°µ.\9dwv+\98ó\ e\94Ì\ 5Fñ4\11øDM\f\952\8bg\12fhÉ\98©¤\94\98  \1e7ò¥(-bLÎ\ f}Q(\b\19U\89\82FËE\81\99\ 1#×µîê\ 4çv\e@\9dáÚW\ f6ý¥{ð¯úê\85¿olø`btqÉ|\7fÉ\92­Mþ\92\8b»xÉ'\80·\14\84L\\8a@Sß¡\88\84E"\ 53O§Gk\92\98ÈYNbø\8c )tZÊ
+\9e\ 4M\16¥\ 6L\94pü'ʸ~ãµ<Äx\9dNPm¤¯¹µñ\8b\8eö\rzÍc\e×\ýcÇæÊ\15Ó]ªO\16fy\9fìlÅ\9f]]¹à\8bH\80à\10êG$\12ÿ;\1a\85þ\10\8b\8dzO'D¼M\88\r{\93B\ eYL§\ 4½\16Ñ\ 2\16²èþóy\fÄ\Q\9c¯FÅôÑ\94Å{ÏV%è²Ü°I¯½e½ÞÝ'ëõê_\7feP\ 1\86[OÃ\8f»sÁÊ,\13\1c\8erÁÝ1\1e\10\1e\14\b\0\19\18ó\19\1d\8a\!\86\87}¤!Cþ\88\8f
\ f+&àw\ eÊo\99\8fF|ÈÄø,ea½\97rq^ï\8bð\9eïT\ 4\8fwg\89ºtÜ\«w»Õ@¯~`Ý\17\17`óúSðÃ6\ 5ìß%\82#ÿä\80£\15\13ÜmIàë\88\81`×(@z\86\ 3Ê;\ 4\b¾\81@ñó\aF\0\ 2\12\ 2}\80\1dä\rÜ`Oà\87x|Î\fuÿ,\vsû¤\bsù¤\fwY9\19¡Ëí»kôê:×è\95\8f\19è\17ÃÖõ9ð\8f­"0û.\15¬÷2Àþ\0\11\-Pàs$\ 2\ 2mC Ü>\0¢\8fû\ 1ÖÉ\a\88Î^@qñ\ 4\86«;$¸¹\ 1ËÝ\158\1eÎ\90îá\ 4BOG\90hO©ÜÛ\ 1òtºòP_¯¼__ïäò\97úrøÛ:!\18\7fÍ\86\ 3Ûi`ù=\ el\8c£Ài_(xî\ f\0¿\83\b\b\ 6¤¥\aÄ\1cr\ 3ìa\17 \1eq\ 6²µ#Ь\8f\ 3ó¨\ 3$ÚØ\ 3ÛÆ\ e¸¶Ç ý\98\r\88´$vº@²±\ 1°\ em\ 6¶³\11dx\99\82\12$\11ö F{\80\80\14\b¼8ä
+;\15»\9c("½\8fËa¼¡)\13^STÉó±çSæ\b\95\1c\r¾\967\8b½\92ö
\98>\83¾É\9fAµdL£\1e\v¦bú\ 4cè!Á3쨠\17÷bUÿoø³\81¥m`k\eR\9d\8c´S2\ 5i\80\ 5ÈÂí@\8aò\0\111\0Ò\19È\8f©lìr²\90ü>>\9bñ\86^\98¸@=Í\9a#\9d\10+¸³øÚ´W¸+ü\19lcÆ4æ\96`\1a}_8\85ê\14\8e£\9e\89\861C¢§¸\11Q\17~uÀÖ6¤h\ex\8eF ö0\85l?\vÈ      µ\ 3y´;Hñ\ 1 ¤!?ò\92°Ë)|ò»$YÜ"3?i\9eV\9c¢¡\9cå¾\8a­H\9f!ÖfLãë\84SØë¢IÌ\9dÌIt«x\12Ý#\1eÁ\ e\8a{ðÃâvÂ\90¤M\aHù³!ý¸!ÈÜM@\810\87¼\90c\90\eé\ 6r¬?HÈ\11+\19ñØe.\97ü\8e%f¾NÈM\9ec\9cH\9d¥\96¦Í\90/dL\13k\84\93\84ºÌ       Ü\rñ\ 4V-\1dÇ<\96¾ÀöIûðÏ¥\1d\84AÙÃØÁ¬û±\ 3«\82Ô=\ 6\90\192\1c\f!ÛÍ\ 4ò}ÿ\ 5\85A¶P\80t\85\1fdÇF¬d20Ëé)ä·©Bæë$9KÃTr_ÑKøÓ\94rádlMæ\ 4¡N2\8eÿYö\12Û\92õ\12Û\9d=\80\1fÈî$\ ed·Æ>\93«Iý9wÈ«û_\ 3GÛ ²7\ 4\85ë^Pú\1c\84\13\ 16P\14æ\ 2\85Ñ\bÈ%\84¯È¨\98ea\12ù-\8fÏ\`ËX\9aÄ\ 2ÞLÜé\8c)jYæ\ 4©Fú\92X\9fõ\eþ¦|\f×\9a3\8cëÍé"öç´\92ú\14jroî/\94ÞÜ&êê\80£màj\eÄv;!ÏÅ\18Nz\99A1Â\1a\8a\83\9dà\ 4Ò\a
+1¡+¹dÔ\a)\93ôVÀaÎsÅìYV.o*¾X0N?'\19£Tg\8dÄÖå<'ÞTô\13Zs\9f\10{óZI=yw)=ù?S\9f\16\9e\16\¥¯\ e¸Ú\ 6\9eÕ\16\90\1dÛ  \85ÎÆpÊã\0¨|\8e\80\11N\87\14£\82?(\89Ñ\8b
+\ 6Q#eÇMe\bX¿qåiÃÉJѳøRéSF\85¼\8bz9·\9dÜXÐFR\17\92º\94w©O\94M´nåUzwÑOqÝÊKqOV\ 5<mC\9a¶!Ûv\a\14\ 1\95Û~(õ>\ 4\1dþKx}E5\81åq\1c\8fc\eu\15Çî(\83\8aÊ¢2à\b\ 3\82 R¥\87^\8c´P\ 3)\ 4R @\12JH\83ô\ e\ 4\ 2\bC¨"B\10E0        A\Ð\19°\1f\v¸êè\18g\96\15ñnÖ\87}\8c\ f\9f÷ï9÷üï9? \r÷^\10Ç\ 5ÿ!H\8cyY\93\91ô\94\8eÉz@-ÄüF*#ÜÂ1KÇóø\15cH9}\ 4¡b_ÉR×h2/s/gÜàõfÝä©\11\13¼\v97y\8d¹7¹\rHóþßPå´\13ðÝö\ 1\89ça ÷±\a\8a\0çÅÚ0Ï÷\8aè\80WRXä3a\1aìA\r*ýv\15\1e=A)%Þ(¢\91¯âj*5ybf?ª¾¦7÷\ 2¯\vÑ+è@\\15´å\18\ 4MH\83@\892\b\14è  ¾ü\v\0ÑÔPôã7\80á¸\ 3\b\ 2\99ÇAPëe\aêý\9d\16\1aB<Þ*#ýæë\13Â\1eËáq¿
+rà\13ì|ôh%\89x\85\Né/bÒzð|V\aVÎièø-¨\ e¡
+5(n@éÅ
+\8c^$Í\e\17\89°\ 6¡\10k\10\98\ 3
+÷­\ 2\8d\80ub\a\10»î\ 1
+wk <sôS£ß\89÷MAn¯\9a\9e\ 5ÝkH\89\9e\94fÃǸ\18Ô\10\83H¼TA¦t\95VUµ\15Õ°\9b     b®²@)¬Å¶\89eØK\12   ö\86D\98¯\93ð\vôb.n\ÄÁ\8d\vÍùÜPbj¨þßîu±\ 2µn\a@ãiÛÅf\1f\87?Z\ 3\9d\ 2õxÜ\1eçw»))J_\9b\91zU\88B]ªÁ\11;éÅ\94Öò\8aªF2\8b]K\12ð¤D\85HHh\91ðð½R\ e~DVMÐIÙD\9d\84\8b\99Äq\919 ÈÔ@>¶\11Ô\1cß\ edÎß\81z×ý ÉÝf¡ÍËî\8dú¬ãóî0×û]1>\93­ç£F\95é)\ 3Ò\d7\1fKhe\17R\1a«¨U\8ar:[Dáòx%2Q5I%e\16uÊè¤aY\15I+£\91tÒJ\92^ü%\9f\e(G-\0÷¸i÷þl   \1a\~\0\17N\1dúSíyäU\8f¿ý\93þ0Çß.FyëÛa\91ÃMð\94\8bµ\b\18CPq       d\ 5»\94&¢ÓØ\9cÊ\1a\1e³L,¢Q\1a¤ådµ\9cJÖÈ)\14­\8cBÖJ)d\9d\84\8bÍ\ 1$SCÙ\11\vÀwØ\ 6\14\81Êyߧ6×\ 3Æ®Ó6/úý\8e>\1e
+q\98ê\8fô\1aëJ\88\18hMIîlÈÊm\96£ðµ"\1cYÄ+¦qªËÙ\f&\8bWQ%\14\91+ë¤Å\95mò¢ÊËòÂÊ\e²¢
\94\93\90Êõbs@±©¡ÂÖ\ 2\b\1d\82º\13»@³Ó\9eEµË\ foûÜ­\9f\ fù\1eº\7f-Ð~b0üÌÕÞøð\8bê䤶æ\8c\1c¥2\17'\91ç\97\85\95\f>\95UÎepKªyÂB\96B\82c^\90å3ûäX\96VVÀÐIqUz1þ\v>7Ðþ±\ 1\88í·\0åO;Aë\89ï\16º\9dö¾\1etûþé¨Ï÷¿\8eùÿ¨\1d\86z\ eöÇB;»\13\13\9b~ICÈ\9b\11\ 5¼\86¼\12F-¡¢LZÊ,\16Ó8\ 4\ 1G\80åKÅ(^\934\97×#Ëá\8dJ\91\1c\9d\ 4\17cØz\919 ÄÔ@·Y\ f¤ö\9bA£ý\ eÐî°ë}ßO»_\;¹û\91ÁÓê\96ÞÏnäz\98GßPLhÛ%\18¬®\e\9e%lÏƲ. Iå*\Y±²\98\8e¯«¨Æ(ؼ\1c\99X\98%m\14§K»$i²k\92\f\89^\9c-\18\17!øãBs@©ië±\ e¯\a
+Ó?Õl·u©ëØö·\1aûíÏô?o\9d\9dvµÔßô9ªÑ\86¸w\8eD\ 5«\86Î%HúS2ª{31\15\9dÈÂâö|
+®µ\88\86n)c!\9a\985é*!/µQ)Hjì\10\86\85I\r\ 6AªÂ \80Ë\r|s\0ÙÔPsp\1d¨3ÝF\9bí¦\85>\9bM/G\8fl|tûĺ\7fκì¾>ímÛw3È­U\17\19¨¸\1e\1fÇ\1dN\82Ó\ 6Ó\91¥ý98üżbt\ f±,»\8bB\83w2\98I\1d\82j\98º\9e\13¯Vsã:\86L&9çZ&9°&ó\0ÕÔÀ·^\v\1aMïÑa½áÝ\95¿ÿíɤõêé\87vë´\ f\1c¼ëeÓq'ÐEy+Ü_h\88\8dbhÏ'\93GáÙø\11D\1ez\18CȺB(\81kÈÔÄAzEÂ\0¿*f \8e\115ÐÎ\8c\1cÔ0"4Ó\8c¨Þ)ft÷\14Ë\1cPnj\90\1cø\1a´\1cXû±oï\9a\17º]+o?سBûì¨\85æ\89\8be÷ã36M\ f\ 2\9c$³Poö\9d\18(u
+v\8e0\99\9a\86\9eÈÎÉ2`òRõ\ 4üy=¹0^G/\89ÖñÉ\11ºz*T×N\rÓk¨¡ã·©a#3åÐá\99
+s\0Ýr%¨Û¿
+¨­V¾»ºeùÌÝ\rË´Ï÷¬\1e\9c?²¥sÎi\9fê\99Ç1ñ\13ß\93¬ÇA¾Ô\87\11a\84\añqèûÉI\99w3ÓSî¢\11°Y\ 2*v\86\9c\175Ã(\80Î\bð¡³õ\84àY51è®\86\18to\8a\104ý¨0xòQ\919\80ûírÐlµ|±\7fÓWÓ\86u\10ís\8b¯\ 6^ïY§~m»³á\95ã\ 1ÑKw\aæ¿|NQ^\ 4ùáç#B\91óqÑés\89ç\92æÒ\93\13æ\90i1s¸Ì\88¹\92ìÐ9ZnÐ\1c\17\190/GûÏ·`üæ{ò|ç®åùÎßÏó{ú\bc\ e\90n[\ 6:6-\9bº¶\ 62vk-äò»oV´\e÷ZÔ\em-\85FÇC\f£ûq²Ñ÷\14Þ\18â\834F\ 4¥\19\13\8d\89ÑqÆ´ø(c\ e\fjÄ&\86\18\8bR\ 2ß\95¥\9e}ËLó{#Èð}£Èôù½9Ëû÷®,¯×W²Ï¼\1e3\v¨, Sý«!×ÇVCúï¬\81´}ؼªîþMü\ fG¬è\8bN\87K?z8à\96üOæ.\ 5\97Âý`\9fb\ 2c?\9d\ f\8dø\ 4\ f\ f[BD\ 6/b¢\ 3>\10býÿS\1aç»P\99àýoö9¯¿\84°3\7f)Î{þ©J<ý¾#Éã}\8fYw:W@F4« \17ÇWAZï­Y¦\0Û¾æ\82ý[hÀΪ\ 48\1f,\0\9ev\bàë\98
+\ 2]\13\0Ô#\1aÄxA\ 1Ì7\ 4¤ú\a\82Ì\80³\0\19è\aò\83}@a\88\17 \87z\ 2Z\98\a`CÝ?    ÂO-É"Ü\96\1a#Ý>6\9b5Ú·\ 2Ò;²\ 2Ò2µ\12"{·þ+\ eøvM%°Þ\\fì-±Ày\7f\16p·I\ 6^vqàìñ\88ÿ2_gQM¦g\0Ç9\8e=Ç¥=Ggè¨ã>â(*(¨È\8e¬²;²\14H\ 2\81\84\84\84ìd%|   ä\v\90\8d\8b¬²\89\bê@EE\9cRµV\18OU\96\82 \ 2\820\8e\82l*\8eöéw¼o®{ñ»ÿ_¼ïó¾\ f\84;\87C\8cÛi z\ 4C¢g Ð½ý\81íã\a|_\1fHõó\ 2ù)OÈô÷\0m\80;\98\ 2Ý 0È\15Ê\83]¡Ê¬\8e\9b_Y4õ®²(\1fùÊ"\ f6¬ÒÀö5\19p`\83\10ì63Àq'     Ü­ðàc\1d\ 1\81\87~\843\87\83!Ê>\0\bGý þ¸\ fP\1c¼\80\13Ø\8e\1eÀwr\ 3±³+ ..\80º:\81ÊÍ\11rÜN@¾»\ 3\14\9a\8e\85Eùc\v\vãô*\8blظ
+\81­\7fà\81Õz\1a\1cÜH\ 4ûMQà´õ\f\b\ 6¿Ýþ\10²Ç\17ÂözAÔ¾\93\80ßï\ eDkW \1fp\86¤\83NÀ8t\ 28\87\1c@`s\1c$¶Ç@fk\ fèa;P\1f±\ 3­Y\90\1aèöë\80én       "¿\1d\90\16b\rHäQ\90ƺ\81\88ê\a<v\b°R# 9\13÷\1fª\9eø;¹\90´\92PNù@<G{\1fw>ù\1d¡\85±\8coc.᮳\17cºÙ\8bÑ÷9\vÑýܹè1î¯1\93Ü\17¸\97ÜÑØ\19³þ?\1aö`\r\80\8d5\88}w\0\12²\1fä\11G\ 1!¸Bj¢/ðY¡À\91D\ 2\ 3Å}¦é\88¿S
+È+¤³Ô÷ñ5ôwq\8d\8cåØ\16æ\12¡\8d½\88»ÁY\88éæ.Äôðæ£\87x¯cÆy/q\93¼1Â4o(v\867\14÷¿\ 1\ 3kHÆ\1a\96 õÞ\ e\19AûA\11n\ f\198ìx\91|A\9c\1c
+<A$°Óñ\9f\93\1f©y\89\1f\12Kiï\12ª\19ËÄFÖb\\vg\81ÐÆ]ÀßàÍãn§¼\8d\9f\8d\9fÁM\bÆ Süá¸\97ü\87Äi\819ÀÄ\1a\18X\ 3ßÅ\12d^Û\ 1\rÜ\a\99gìA\19ã\ 2\19ñ¾\90F\v\ 1\ 1/\12¸\bþ\13S\95°B3QßSJèËä*æbB\ 3g\81x\917\1fÛ\96ò\96Ð)\98Ãß\15Îá\1e
+_á\9e\8b&\b\13¢\11â\94ðQüKQOÂ\94Ø\1c`}¿\1a\98vëAäl        \19\9eÛ!Ë\7f\1f¨OÛ\81\ 52ã| \9d\1a\ 2\12v$ðS      \9fØ\99¤\95d}Ò»¤"ÆRb%{\81\9b\8f¿È\9f\8bk\17ÎÆÞ\14Íâï\89ßà\a%S\841É(ñ\85äqü¤¤7a2õ\ eù\85Ô\1c`c\r,¬Aâø\r(=¶\81æÔ\ f \v=\ 2ºH'P\13¼AI\ e\ 6\19#\ 2DB§\94\fÒ\a\966i\99^À\¤\96sçÉuü¹\84\8bÂYb»øMì­Ô×\84\faTú\8c8.}\9cð"­\874\81Ü!OÈnQÆe]f|i`\1fY\ fi'¾\81l÷m\90ã»\17\8cÁ¶`\fw\ 4\13Ô        A ¤\87\7fDxø÷"\84´ÈSÑÞ²L¬7ôRÞ+j\8dp\86Ü$y\99ð\93t2¾3m\82x\ f\19#>\91õ\93Æe=ä1ùíıô.êó\8c\8e\80³{5p°\ 6¹Ã× qÝ
+&\1f\ f\81ü0\aÈ\8b9  \86ø\80\1555l eãæ\90Ô\84ßÄJÚtJ\ e{\92\1f\10?Mj\90>¡´"\83äkò>Òí\8cG¤>EOâsE7å\19Ú\99ô\14ý+í©ò2Ý<àb\r)\87×\83âØ×\90ãò\1dä{\7f\ fÅA\a¡øÌ1(\8a\98\1fë·hH<=«fDÏ Âø\17H:í\99\1e\15ô±KS\1f2jd¿Ð\9a2îS\7fBïQº\94w)½\99ÝÔÑÌë´\91¬6úHV+c$«\89i\1eð°\ 6\81í:ÈÄþÕFç-Pä½\eÊ\ 2¬¡,ÔþSY\84Ër     Þg¶\80\142m¤G\8ekøq#(BíC²8\ fÄzáý\94Bé]NEz7³\1e½\95Ü\92ÕI¿¦ºN¿£î \ f©/3\86ÕÍÌau#kX]Ëy¢2\ax»V\83èÐ:ȶß\b\9b¡Ôk\17\94\9fÚ\a\95Á\87?T\869¾­\88>ùk\191`¢0)ì\89\91Kx¤\92P{\14
+Î]D#ú\9bØ\84t
+J2:xÕ\99í\9c\15V\9b¦\95ù³ö"ó_ºóì\7fëê8CÚjî\90\827¬1\a\ 6ÉÁuØÓ²\ 1
+\9c6ÁYÏ\1dPå»÷sM ÍÒ¹\1f\8f½>÷\17×Éj\82ïèYÊéÇù,BO\8e\90z;[ÆéRd\89:\10½¬MR h\15\96g7óë5\8d¼V]=÷\86¾\96{__Í\eÐ\97ó\a\ 4\83ºbÁ\90Ö\1càc\rÒ\ 3kA\87í½ENßB\ 5v?k¼÷|¬ó?0ß\10j7Ó\18á8ÞH89PE
+í-aàoç¦Poê¤\9c«Y¨ø²B#k\96å¢\r©¥ÙçÄ5Ú*a³¾\pÕP&¸k,\11ö\e
+E\ 3ú|ñ\80>O<¨3çK\ 3\16ôXC\89ã\9f¡Êm+Ôyî~\7fÞoß\9bæ`\9b©\96°££\17b<\1eÖ&\84ü£\9c\8e»UÈ¥\5\8a9\97´é¢¦¬lY\9dÂ\80\8bTgÓ*uÅ©ç\r\ 5\926c\9e¤ÛdJí3\19¥ýF\83t@\9f\936\98c\ e\b\ 6ùþµ`°Åö^GK¨qÝ\ 2\8d\1e;\97\9a}¬^]
\9eh;c;Ø\1aåÞÛH\fé®NÂ]/eS®ä\vÙ\17\f\88¨V«\94UfëÐRe¾ª ã¬Î$¯7èe\97MZYW®Fþ0W-ï3ªåý\ 6\95|@oÎ\97\86\flÇ1a\r\15Ø\9cªuÞü©ÉmÛü%¯]ÓíþVÏ;B\ f\12évïB\pW-%¦½\82\99Ø\Ìg×åKE\95\ 6\ 5R¢S£y*\93Ê\90UªÓ(Ï\19²Ñ\16\93\12íÌEÑ_0}&\14í7¢\8a\ 1½9 Ä\1aÐ\1fÖ@\9eÍ\9f 
+\9b\8eß®\tùn¶ÍcûÔu¿\9dO:\83\ e>h\8fpý{+!èZ#9úRM2¹¡\9cǪ*\16\vKòåH\9e)\eÍÑ\eT*m\91N©®6¤«\9aM2ÕµÜ4Õý\DÕgB²û\8d²¬\ 1½9_\1a2÷®\81\ 2\9b?Bõñ\rpÞÁòÝ%ÇM¿u¸m\9eøÙwËÀ­\80\ 3ÿ¼\16îÒu\ 5\1fØÖL\8aºÐ@#ÕÔp\98¥åBA^    \92\96S¨Tü\97Ï:\8f§:ßã8þ³·iQªi£\12m\8a\8alY"\8eÝY\1cÇY\9cÅ9\8e}Ï^ãPd9(RÒ6¡Å ê\96D©)L¥í\86I3\83      %Í8\87îÜ)Ûû\9e¿î\7füñüûóúãóø|¿\19'r2$\ 5E9)yçó\12¥W\vâro\1d\8f\95\1e?(}S\10\97Ó\91\9f\90Õ)\9d\râÖ© CO\ 3§¶ÏÇ¥]\8bðãî%c7M\96\ e5Y,íi±Yñê!iËãF²yÃ-_RM-Ï»¢RÌ?{9,¤èRl\8cô|RRF©$5õtÖÑäâ\13YqE¥ÒèÂËù\11\857\vÂ\v\1f)¼É\8f\91\17\9d×)\9d\râ\15\rY\e4P¢¸S\15F\9a\935;\17Êî\18/\1cx´W³û©åòg-\8e\ 6ÍÍ^f7ï2\9c®ÝâÒ.Ô\8a¸ÅU!AyW££2*\12\12R/}\7f8éBfzì¹üc\11¥%9¡gÊ¥AgjóÄ¥\ f\14\82NwJC\8bºrg\83\ 4ECîzu\9cÛ6\aW·ÏûzsëüáæmsûÚw©¿~a®ÝòäÀ¦\86Ç\1e¦5Íô\ 3e\8d\1cJÉm\7f\8d qæõÈ\88Ôª¸¸Äk\87Rb®\1c\91\84WH\8f\ 6\95\9f:&*»\94í_V\93Ë/»\9fË+ÿw\8eÿÅ_rDgßfÏ\ 6IkU\90¯«\86\8b[4Pe 1vGO}°MOµ»Ó@íÙ\9b½K\9b_Øo¼ùÔmÏ\95\16Úþ³\ fY\9e'î \98Yw\ 3\85\92úðÐÄ\7fÅFÇÜHN\b«M?\14x=Gâ_sò\b·úb\ 6§º:\93\94ɬy\95É®|\97É­\98\1d\ e¯RA\91b/+ôÕ¦êtUÿ|¸J¥÷Í
+¥W¿mR}Üm²øN§ÝúªW®Æ\17Û)6'\9føºå´ð|Ò\1e\ 5ð\92\1e\84\8acîÇ\84\856%Å\88\eÓâ\ 5\93ý\1a\8a\ e3ï\HeÜ©\92Ð\e\1a%Þw_Jè·{Ò\18µ¿§1®Ï\fGV(£d\8d2*uTþnÐVîy¾\80xÕ«E´ôé«5ö\9a.¬ýÝvmy·³áéN²¥ô5\83\94þÒ\8f\92Ü.bÆ<\vá\87>\89\16\aü\9c\18Êo\93DrZ³c}[\8bâè-\17\12¨­U\89\94ÖÆ$rÛËDòãþ$jÓû\94Ù {\99\12.¬TBí2¥·\8fæ\11/^Ï#\1e\ f.Sj\18Ð\9fS3°giù{\eÝ\92>'Ãü\1eOó£¿Ñ\1d\92ßqÜbº\85´Ð_B\98\ 1]Ñ\~g¢\90Ý\91&ftä\ 4{w\9c\f£t\\f÷ê¨\8eðèl\8atïz\15áÞ9\14éÑþ)z68±D      W\96\10o\eæ\12ÏZç\10?uÎ#ê\87\97«T\r\e,¸ôiÏÊÓCÖzÒ\8fNFé\1f<,\92\ 6iöQ\ 3L\97 \ 1¾\97°?Ð\9bÛ\1féËìO`ÓûS¹Ôþ,\81W\7f¡Ð}à\9cÈuà\9aØeð¶Øy°ULúÐ+véûSìÒ;3\9cÕ$~­S'\9eÞÓ \9a\9fj\10·ÞÍ#*eß©]\94o^T,7Y\9d+·ÑO\93;\19'Ê=Ì#e4Û@\19Ó\91/ã¹rdbO\86,\9cB\93\1dô&Ë\ fùxÈ\8fúºÊóY¤Ñ\12¶ãh\99\9fÃØu®ýX#wÿ\97v\9eÝ\97\8f
+C3ê¹¢L<»­FÜ{¨FÜx©A\\19ÖT:÷Ï\1a\8d¢¯Û´²¿\9a®\91|³ÕO\18\8c\18w7\15\8fS­xã\f\ 4×\81>!r¢L\84:{NF»ºN&º\93&%\9e\a¦²ÉöS\85\14»é³T\9béË´}P<4ÓMt«éç
+/fô¢V\99¸wW\95¨kS%*º4\88Ò©ÅÊÇ¡;÷\18\fµRa¾:\ e6\eÃp`«\b®F~ \9b0àcF\ 5ÇÒ\13þÖn\b´uF¸\9d#\ eÚÛ#ÅÁ\16G\1c÷!×É
+E$K\9cs¶@\85\8b9ª]ÍÐ0«û·\94\89Ú\aÊDù\v\15âT\8f\1a\91\8f\19Ø8ç\10v,\8e\81ÉÊ`X­\13`¿\1e\v¤ÍÞðØî\ 5ÚN70\8dIàî>\0¡É~\ 4\9bÚ rï>Ä\99["ÅÂ\1cé\96fȱ2Eá>\13\9c±Þ\83\1f¬w£Òf6uw\95\88²\9f    ¢¸\8b rþ3W)\1dË\95\13¡«\1e\81Í\vÄ0Òâbï
+\ 6¬WSà ã\ 6\97\r$xé9À[ß\ eL\ 3kp·XB¸Õ\ 2AÛÌ\10¾Ý\14±\86{\90´c7$;\8d\15\9fC#ä\eí@±±!Îï\9aMùO\8aù/      âX/A¤b\81ÒAh)\a\8a\0ë5\98Ø2\9f
+ãEî0Ó"ÁZÛ\1e\ e+làò\9d\15<W\99\83ºz/\18kLÀ^»\eüuÆ\10é\18!Xw\a"u\r\11·~\eR6lEÚÆÍ8¶Ñ\0\ 5\ 1o\93*XFêà[h"Øn9"\t\10\82\bÖ.\84\b\ e·\830É        ¼#nàäy\81YL\ 5ã<\1d>\15\fxÿÈ\ 4­\8e\ 5j=\e\94û\9cir\9bß$ù5w«\8fûÕë\13÷\vù/î\b\1d¢\8dr\aèc3ú\7f\83À\\13¡¶Ë\11å¬\83\16D1w!Ìß\ 2\81av\10%8\81\9fî\ e?)\19¬b\1a|ÏùÀ§Ü\17ôJ\16¼ëØ Õs¦©Í~S\946î$ù\roÜë=ï¿äO¼QÊ\bï3MÆ\e¤\8fòþð\19\9b\11ø\8a\ 6¶¢Ad¦\89p\emÄ:éà ×fÄ2\8c\11É·@H°\1dÄq$øKÜÁË¡\80\ræY\ 6\18eLøT²§éµ~S´zî\14µ\997I}Â\1f§t    ¾\92\a\ 4_(Ã\82¿h#\82\ ft\99 \8f!\17üÊ\18õ\9f        \ 4\8a\ 6ÎNu\88M5\11\8dxÇuHðØ\8cxº1b¹\16\b\ f´Cp\f        \ 1\87= È¢\82{\82\ ev)\13ÌKìiÆ5¿)\9fZÞ¤w=\7f\82ö@0A}êÿ\8dúNø7å\83PFû,\1c¢\8f\bÿ`È\84ݾrÑ\e¦<`&\10è©ÂOÑ\10\89X+m$9¬C\8a\9b\ 1\92iF\88g\9b#Zd\87Ð\b\12\ 2\93= Ì \82\0§\845ÍúÁoÊ÷*o\92Q+\98 ßñ\1f÷~(üF{.ú\87Ú\130Fû\180Lÿ\1cðÞw$à\1dsDü\9a%\vlgËg\ 4\7fE\ 3w\87:Âv/@¼Å2\1cÚ¿\16©.úø\9eb\84\14Öÿø®Ï°¦î=\80ãl.R«¨-Õ:¨{R\15¥U¬¸p#V\86$\10BBÈÞ        Y$9Y\ 4\92\b$\8c0B\8caod\8f\82\88¢ (PW+^!,E\8a^íµÖëÕûïyú>÷Åç9/Ï÷yþçwÎù}\ føq\a\ 1\93z\1cPù!\80 \b\ 3\88O±Æè\8f(\vúCT\19ö=¢\16÷gd\vþ\8fóW o#\ 6\88\9f\12_F¼ M"æ\88#Q/IÃѯȷP¯(7bì\ 3¸5.\0³Í\r0w~\ 6\12áýB~`9P\9dX\aT?ú\ 29â; Æ\1c\0<ÒqÀä\84ü\97
+\85¿'j\90ïp\191ÿÆ\980oÐE¸×¨*ü«¨Fâ\1c²\93<\8bè£Ì ~¥L!f(#Q¿Q\87P/iý1sôkè9ú\95Ø9\86\1enÀmq\ 3\9cí\9f\ 1©ÿb\90\14ø5Ð\1c_\v4!Û\80ú¼?PÄìÿ(Æ\1f}Ïc\9eyËJ\f\7fMKB¾$¥¡gãsâf°\16ü³Ø2ÒdL\1de\1cÕNµE÷ÒF£ïÓ\1f£\9eÑ\ac~cÜDϲº1³¬\ eì\vvK\9c}\0\ f7\10\ 1¾¯'Pì^\ 4\97\81Ôc«Aê\99-àB¸ßÇ\94è}ï\94¸ 7bjð\1c\9f\1f\96#§èÚØqr&î)ÞD\1cÁ\15Q\1ea«é÷c\9b\99ÃènÖ ú.{\0=ÁéÅÌpº°3ÜVÜsnCüsn\1dÞ>@Xí\ 2È\e\\81\bþ¯Vïò\ 2©?,\ 5\86 \1f\90\11¼ñ\93!tÇ»4äÞ×\1aÌ¡Y%éÔ´\94\ej\13H\90#\1c\ 3z:~\98\92C¾C´ÐoáËX}¸:No\{Â5ìMÞUì\b¿\ 3÷\8cß\18?ͯÅOó+\89Óürâ3»þn ­w\ 5\92Íó\80f×B`Øç\r²áÙÈ9µþ½ñ\9cï\9b¬HÿY}Là\94\96pü©\8auö¡D\88\1c\12(0·9ZÂMF\ 6õ\1a5\9fÙM.ät\12+yí\84&A\vþª°  ?,ª'L\8aª\88\93¢2ò¤¨\882%´þ\1f\80ø\8d\v`¬u\ 5²M\1eà\82ß\ 2\90\15ð%È;¼ü\93éÄ\9a·¦\90Ísyá~ÓÆè\80QC|Ð\ 3\ríì\1d%\ fÙ'\91bz\ 4jb\177\8dÖÆ2²\9béæ\84zj© \96R\97XMþI\Iº-)'\8fK\8a¨\13b\vmB\@\9fḨOÚ\ 5Hß8\ 3Ö\1aW Øè\ 1Òw~\ er\ 2\96\80\82CËþsñ¨ÏkËé\r3\96s¾63ÒÿQ6æÈÝ4rÈÍ\146¢[!¶K\14Ä&¡\96~\99\97Á©æäóË\99\85¢\12F\95¤\90Þ"½D»\ 1]¤?\81L\f\9b4\979.5²Æ%Y¬       ±=\7f7páóHÚø\ f`Ø1\1fäï]\ 4,\81Þ\7f\14\1eY1W|rÍTñÙMO¬çw\ få£\ f÷e\12Cº/0\11mÉ|L\83\ 2"ÖHÕô
+Q\1a§\98o\14\J¸\98\94KóÙ\8d²\1cÖU¹\91}_\9eÉ\19\93\19¸6HϵIÓ¹ã\12{\0\19nàù¸\80ä\rî \v\9e\1e¯O\85?|ñ{ÉÁe/Ê\8f­²U\ 6¯{P\1c¶ë¶\19u¨''þL\87\81\16Ù KÀT«ÅÄ2\85\92^\bé¸fq¦ Oh\12góK \f^\9d\ÏëR¤ñ\ 6\15©üQ¹\8e?&Ó
+l\10Lj\ füÉw\ 6\ 2xÇѬw\aÆí\9eÀòÝ\82\ fÅ{\17ÿ«"ÐûYMв\7fÖ\9e\;T\1eêwÓ\1a}°Ë\84\vnʦDÖ¤³cËtB¢5YN7)S¸92½ C\9a'N\13ÃE¢\1aE\8a¨C\99,\1a\13G\15I\89£ò¤Ä1YR¢\r²\a\ 6ÑJ\17 [ï\ 6r¿\9d\a¬»çÿYöý¹\9a}\8b'\e\ e}ùKý±5\ 3Uçvö\94 \ f´Y°§/ç\91Î\97g1c­é|\82I'¥\e\1cCR\9aà\82Â(N\91Yd*¨R!\87Z\952¨_\ 5É\9e*!hT\ eAc2\99Ô\ 6Ù\ 3¨p\83x¹3H]ç\ 6ò}=@\91\9fçÛÊ]ó_ÔïY0Ö\1a¸è^ÓÑÕ}µgwt\95#\ 2\e\vcOU\99   \11E¹ttAV\ 2Á¨\17Óô©J\8e\13¨S²ÄrµY&U\95+\12UÍJ¡ê\86J\90ô\14¾\8eÊEÊ1\99Ha\83ì\ 1´UÎ@ú5¼÷ÂóiÞêþ¿Òí\1e¯kwxN·ìö|Ò¹Çk°5ÈçzCÈö¶êóûëÊÐ'K­ñá\17ÍÔ\98\9c<\ e^\9f-¢j3äì$½\86/K5\88\13u&\88¯-Qp5\rJ¶æ\9a\92­\1dQr4£rnò\98,Am\83ì\ 1\8c\95Î@\ 67dÀïìK[Ü>Tlu\7fÙ°Õ}¢s\87ûëþ\voýtxÕ\95\96`ߦË\11û*«P'¬¥¸°¼B2Êp\91\15¯5       (ª\\88\ 5\19Õ<afº(Á\90+eé\8bät}\9d\82ªïVR\f\ f\15´ôQ9#uLÆÔÙ {\0\v>\aåR'\90\rÏGÑ&×w5\e\gZ×»\8c^ßì<|}÷ç½Ý\aW´w\9cÞVÛ\1c\16Pr9ê\98©\1a{.³\9c\14¥+aÄ%\15òÈR\8b\98!(Pq9ù\17\84\8c\98\92c\85\88952|N§<>÷g\19Þ8\ 6\113mR²aÜ.\90°Ì   $\7få\ 4ráç¢t\9dóï\r>ÎSWV:ýrkµÓí>¿ùW®\1fXÞØ}rKEGè\1eK\v2ÈØ\809\9bZG@$UÓb¥\15\\82 TDc\17+Ø´B-\8f\12â.YÄ\18K\95\14\ 36(E[Æ%XÓ¸$.wBl\ f\10À÷×y;\ 2ó
+§OU+\9dæÚ¼\1dGû½\1c\86î®r꽳ݳ­\7fÿÒ\9a\eÇ7\16õüè\9fÛ\15y(½\1d\1d¬n\89\8f\80\1a)(A=\eÇ®\13\92¨52:¡ZÃÆVf$ +Ì\82è\8aJ\11²¢]\84¨¼#\8a¬\98\12E\15O\89PÖ)¡=@ò\85\13Ð/q\ 4Ö¯\1cßÕ/qxÜãépoÈÓ¡ÿÞrÇÎ\9f}=ê\a\ 3¼K\a\8e®+è\ fñ3ôF\ 4¦ô NȺãΠ      :É\bV\a\13Miçãð­\10   Ó\92LC5\e\98\88æ\ 2vDS\ 57¬©\8d\eÚ<\0\9bâ\86]~\9e\10Qm\1fP.r\ 4F/\aPîåð¸m\9eÃ`¯\87Cß½y\ eÝ\8f\97:6ýºÅ½âÑ\9e%\96ûGVg\r\a\7f«½\e\16 ¿\1duDÐ\8f\r\91B)7\18\88ø^^Lìu)6úZ2>²Çð\17Ýu\16Õä\9d\86\ 1üc      Ðªh](VED$\ e
+È*\9b¬²dý\92/ûF\ 2I\b\ 4\ 4¡
\15\vÖâÂ\8cb­Ö#ngT\1c-.u\ 1GÜ·º\ 2Î0µn\80
+£B\8a\80\84\0ê39½\98+rñ»þ?ïù¿\17ï\93%ºR\9dC]9\9cË»R·\84¼zÇêU.y¡;\8fw®;ß\16l\98\aWâñq\17âþy\17âú-g¢á?c\88S­_Ù\1di\9dç¼ïyÄÄíÏ\12=*\1f³|Ë\1f      BKZä±\ 5ÿJO6>Ìbë\9bó)MS\91XÑT*\974V¨\ 4\8dUj^cu:·ñ\1fZvc½\96ÕtWËnêÈ`>èÓ³~íË´\ 5\11Ï\ f9\12\ fN;\11W/9\11çî¹\10'\9e\8d%j:f8ìéð\e³­#Âmã«\ 4ϲ\97Lßâ\17¼àüviTv\9b:^Û\96\99\9cÖ\9aÇ\94·.ç\8a[Wó©Öï\ 5\161§u\97\84ÕV#e´\9d\91¥¶ß´j\95¥´¾\93%?\1dPØbªv$\9ak\1d\89«õ4¢î\1a\8d¨mv!\ e\98&Øí2yÒ¶\9aü]7tGº\7fÛ\9d8«¨\9bé\9b×Í\vÌì\12/Ôt)£\15]º8IWN¢ «0\99×µ\92Áé^ËbvWrR»·s\93Lûy\89¦cü\84?\1aøñ=÷¨ø\9e\ e*ÎÔË·åß\a     âú/\ eÄÙ\ 6\aâèm\1a±ï\91\v±ãý$»Í\ 3ÞÎ\15\ 3\81ãKÍQîËÌ     \9e¹æTºÞLú¥\r\8a\ 2e\83\8aPÑ`F8\7f0+\8acÉ_Ä´\14ŦXJã\17\ fU$&\fU%Å\rïJ\8e\19>\94\12=r25jä"#òC##âÃK\9b\12D]\9d=qä\9a=±§É\91øáågDåGwûï>Ñ\9dW!p|!Âݲ\117=\ 3É^Jp|Ä\10øR\90ùq¡^À\84>(\ 59!\8bQ\10\1a\8f\92\85±(\v\8fÆÆÈHü\10\15\8eÝÑa¨Y\14\8a\931!¸\18\13\8c;±¶ÔÿB\10G.\10Äî;\ 4QõÈ\9eX?2În\r¦Ú\17ÁÛ)\ f~c3\11:Q\8dè/¥H\9c&\0Ã\83\vr\16\13"ïd(|\12¡¡Ç!ó/1Èñ\8dBá¼\b\94ø\85¡Ì?\ 4\e\ 3\ 2­ÇÈ\ 2T\aúã`\90\1f\8e\aÏG\9dMGë  bÏ\r\82Øò\90 Ö¶\11Äj\8c·+\84\9b}\16<\1cÓAw\91#`¬\10\v'p\113\89\81ÅnI`ºÇ\83\9c\1a\ 3Ñ´(ȦG@=#\f:\8f\10\fÂRÏ\0\14ÏòÃ\1a¯y¨\98=\17[¼éØ9Ç\aû}æ Æ¦½\97­óß·¾ÿ\84 V\98í\89|\8c³Óa¢½\12S\1d\84ðtä\82î\94\8a\0\97D\84}\1e\8bè±ÑHp\rGÊøP°'\ 4\83ÿÅ\ 2\88'úC>i>Ô\93\9f<\179S|Pà6\e%_z¡ÌÝ\13\eÜ=P5u\ 6\ 4\11ü \1aÄ¡ÎP/r\85\r\99Ü\99ÐIéHÏ\b@Z^(ä%Q\90|\17\váæDð\7fJ\ 6¹/\15Ü\1a&8ÇX`\9fa\83ÕÀ\ 1ó:\17\8c\a$\18ÏI¤¾á!µ\8f÷\81\r²\86x½ìa²\8b;Â{K\8eîÿ\19¤!ÎÈ\88r\85\e²93a\10Ó¡Õ\ 4@\93\13
+eq\14¤åq\10ýu1\ 4ÛSÀÛË\0y\88\ 5n-\a\9cÓ\°\eH°nðÀlä\83ÑfÕÅÿÄè£\86X\83T?g\88o"\87ù\9d¼aªÃ\ 6\ e \ 2i\90\a9C\17é
+c\82\erY3a\14ÒaH\v@FV\18Ò\96ECþm<$\9b\92 ü1\15Ôn&x\aÙ k¹à\9e&Áià\83}\83\ fV3\ 5æ\vëê\9a\ 4#¬~Á\0{Pð\ai\11¼æ\r       Ú©aa\e5,\1a\r¤>\ e\10. A\15è\fC¸+\96Ĺ!\9fá\81<\8a\ e£2\0úÌ0¤\17DCµ:\1e²õÉ\10oe@XÍ\ 6u\80\vÞQ\1eÈS|pÏSà\\17\80Ó(üÄn\13\8d°»D\16ö{Ñ;rPô\86o\11½ ,â'Â!Éï6@fÍ ñ§A\13à\fcØ8\14ÄLÁש\1e(äû _î\ f£6\fú¼h¤¯L\80j]
\9b\99\90üÄ\81h\1f\ fÂÃÔ'ê¸à#¿Nô\81wY<LÞ\15[ȧ\92\ 1ò\8d¤\8fì\97¼¥Ì\92vÁ ô±È"k\16\8d\99A>\9f\ 6\9d\9f\82Çaù¢)X\91<\ 3Åä\1c,\93úa©&\14Fc42\8b\12\90Q\96ò)m\13kD±\8d\1c\92í¦,\92\ 3B³øgñ\80ð´¤_Рí\13Ü\92½£ZäÝT§ü\8d OÖ.\1cPü&6+\e%\83ª_e\16Õ-\e \9fã\0\95/\r\ 6_'\14\ 6\8dE\89µë}\934\1dßp¼±R4\1fËÓB\90o\88þ`,L\18Ê\\9djÖV°ûÕ[x½ª\9d\82\1eÅ~±IvXÚ%=!\7f+9§x-¾¦ì\147+_\8a_)[ÅïT-\92\ 1õ=\99YsSnÖ\V\98Ó/*G\a\855\83f.\r9s\9dPlí8¥\91\93P\96ø\15ÊY^X#ðÅ*EðP\91.r`i^|onIª)k-ç­®\92ÿßô\1fE\1dêÝÒ\97ª\83òvE­ò¹ülÚSÙeõcÙ\ 3M\8bì\85¦YÖ\93~Gþ>ãªò½¶Aõ^W\97Ö¯;«\1e\1d\94Þ\ eÐú8"ß\87\86U\ 1cP\1eñ\ 5¾\8fwG\ 5Ã\13ëøs-å²\ 5}«5á¦bcÜëÂå)¯òÖpÚ³×SÏ2«$¿kwÊ[4ûU\ fÕ\875\8dª\93\19÷\95çµw\95·t·\95Oô7T]úKª¾Ìzu¯á\94¦×p<½×p,ctPY3dz;¢ÐÚ/Jý?GÅ Ø\14ë\86Ê\94\19C\9bÈ9}ëÅ~ÝkUa\9d¥\86\98\15\ 5ÉO¾^ÅiÉ[+h2VJï\19¶©në«57µ\7f×^KÿY\7fEsÆpI}%ë\82º)û\9f\9aÎì3é=Æã\19=Æ£Ú\1ec\8d®'û\90þݨ\90\ 1Ù^\8e(²ö\8bòù\9faS\98+6ÇLþX\954í}\15ÛËô7\81oçFyPë:}Ôo¥K\92\9aV\14qî.[#¼¹´B~5wsÚ¥ì\1d\19ç\r{õõú\9a¬³º\13ÆSÚÿÑ]_QM¦i\0ÇßP\14\ 4\1d\e\8eÊXPÇÆ2*:\8a\82
+\82Ô Ò\9bR\ 3        éÉ\97\ 2\92 \90ÐIh\ 1\92\0¡%t!\80Q\14\82h\18\84ãx\94\ 1w\ 4Ç#I\90Y\v\96\1dfçÛoö:^ü®\9fç¼åâßOè\8e×\10»âç\88í\98ERSâ"±\11»H¬ÃýN¨ý
+8\1aÙáïæLAöȲ5\83\85Ç,á2§õ_*\7ÿ»Â{û|ùŽ³%a?<Ë\8f\88\8f?ÿ \rò\1dJI\r¾ÃäEÞ¢\15Ĩȥ\98\1e¢\14Û\85oÄwà:\88­Ø\eäfì0E\81\9d¦4à\16(²¤7\94\e²\84°H\12\7fÅÿw #­\95jc\ 2ç\1e\  \97Ø[À\95§¾Y\92ºX-Tylý­Ê×fº"Øn¢(êä\83<¬Û=\1eÅ·?\8d\1d|#åjd7+'æ\1aT\94ÐJ­À5\91k\89\8dÄ\16r\1d¡\87ZC¸K«&<¦K\89:Z%IO\15\91\16¨¥ä7\14\ 4Ù\108\16é+ê6¤9\91³(8°\ 2.?b¾\å°ú­ì̺ù:·M/ê¼·ý,\r°Õ\94]r\18\12`\ûsH¾×3\19A]i\9cȶ+üØ&vAB\ 3£,IF¯"I©rj%¥\8b^N\19\80Ê(ãP)õ5TLÕÑ\854=M@[ \16~\ 5\1c\8f̦#½\99¾Ã\18\16î3\85+\ f\99}\91\1d·Xlp\óJá¼~ZîþÝ#\99ÿÁ\91Ê\88\13ê\92¸sªB<º+\87\1eÔ\9a\99\12)¿\9a\1eSËÉM¨J)ÆW²Å¤2f=µ\18ê\80\ 4P\1f£\0zÈÌg¼dä1´P.SGÏaêi\bª!p\ 22\9b\81ô\1eo;Ò:È\1f\95Ú­Xª?f®k:a1ÛvzÍ\93f7ë\87õ~\aîV\85\1dï+\8f9§,Æù´\16P\ 2\esX\112^Z\8c$=+AÄ\15à\8bS+È\85)µ´¼äV(\9b­bòÙ#,^ò\v&/YËÈLÖA\99ÉzÚ×ÀXä\1eØHóf}g\ 4\97!ÿ´ÆÖô\9düð\8a×mGÍ\9ew\9e°\9chsÝ:¢¸°\7f 6ôÇ^I´K»(Ñ[^L
+\94\150"Ĺ©1eY¼\ 4af\ 1>?½\8c\9c\9dVMËä63®rz\99\Î?Y\1cî\fBËàr´\10\97££s9z\9a!p\122;\ 5\1ck#¸|·ñrÝ\ 1\93ß[þaò[×!Óg=Ç,Æ®¹l¹×\82Þw³1øXWÍeçf  Æ«VD\b\90\14ÓÃË\ 4)ÑÂütL^Nn\12\84\94Î\93Ò8\99rFJF7\8b\9dq\97ÅÊx\8a\98g°3´Prº\8e\9e|UO3\ 4& ³S¿5\82ó·¢`±\8dÑ\97ƽÆú\8e}Æ/®\1f0~¬²_5ªtÞ<Ðá³··9ðh[Cä\99\86\9axO©$É_TN\r\13\96²£r\8bÒ0<AvRZ¾\90t%OLcå4@Pv'\93\96­fQr\1e³¨9Z\ 6-K\vÑù::Ä×Ó\f\81IÈ=¤mBÁ\82Í(¸j;j©y\97ÑkåNÔôm\eÔxß\11ó¡ëg¾íSzíél\ f8¢h\8a8]Ó\10ëQ.Ãù    «È¡¹bæåÌrN<·\8c\8fK..$2\8aÊ©TA\1d\9dTØÁÀ\17ö3\93\ 4\8f\10Z\ 6¡@\a\91òô4R®a0\159\83\f+\14\\8cì!Û\8azÛn\8dzyc\13øY½\rõ ÿ\90\99ºÏɪ÷ºÇîVåÅÃuía\8eâ\96èóÅòÄ\vyõÄàL\19\14É­¾\12Ë\96d$Ò+óñä\8a22^$£%\8aÚ LY\1f\14/\1aC¼¦'\94êiØ"=\15+4\f\86¬\90÷¸\ 1\ 5\8b6\82?\e­\80\1eürÇ\12\8cß³F\rݵ[Ù§>µ¡ó\96»\8d\åg'í\ e9YÚ\19å\9aß\8eAóZð\81\1c\ 5-\9cÕ\98\1cM«¿\1aO¬ÍÁád%\ 4LM59¦º\85\1aU}\83v¹ú!â\155Jº@\8d©X Ä\96¿1\bf¯GÁyëP°d\1døв\ 6<S­\ 2\13÷V\81û#\9bÁÀðAÓ\9e!\87\83nÛeý¾¶¢¾àã\ 5ªKÎü\9e8/NWÒEÖ5J\bµ\9d\15IhãÆ$¶dcâ\9a\8b°QMR|¤¢\89\18¦P\91B\9bF\11/\89¡òEbD-Bf\18ÌY\8b\82\85kÁ'Ùj0uÍ\1c\8c÷\99\83Ña3pG³\11¨4ûLÚ\1f\1cÿ¦~ÄźrÈg¿`0ðh\96\89{;ö<«\ fëC½IòÇ«\18!     ×9\911=üèKݸ°nIB°R\91\18¨ìÅ\ 6tßGÌaý»Þá\ 2ÛÞâ\82Z\r\83\0Xd   f\14+À£î\95\7f%P\8f®\ 4ªÉµ cr·qãÄQKÉøÙÍE\1aÏ=Ù\ fü\7fàÞ\ fs`\rG\9f¥\f%º'Ý#ú`îB\17£\aS\83"ïðÃBÕ\82È µø²ÿ\80<Úo 7ÆW=\82\98\8dF\ f¼\8dõ½ù1Î÷\86ap\9e\ 5\98«6\ 6\93m¦`De
\aM@Ï\98\19h\9fZ\r\1a\7fÙi$\9d:d^üÔicÎ\13÷\1di\8fý\ e°&Cì)\13Q'qã\98³ñ?\11Ü¢~\82¼"Æ® C4<¿\0\8d ÀO#\ eòÕ(B|4½¡Þc#¡^c³!^\ fß\86y\8cþ\11î9²\1caÈç\12\13ð¤Á\b\8cv\99\80Û·\8c\81\144O\9a\83Ú¹µ@<gc\4{Ø<{Öq=÷\85\9b5óWß=ä\7f\ 5Ûb\9f\8f\9bÁ\9c¸<Cp\f\9f¦\9f\r\9e¾â\1a0Í;\7faZà\89\9e\16{{M+|<gzÑ\1eÏ\87ÑîÏ\7fE»O/¢Ý¦þãç:µlÐ\8c\14\0\11èï5\ 2Jµ1P<4\ 5UOÍ\81\11U¨ûÞ\84¯=j\91ªuÚ\biݬ       Z\9f]\98ù\80ýQóáváó1öÁó¸\1f\ 3æ)\ e~ólGô|úi¯ù¼³\1eZ\91\8b\9b¶öÜ9]\87«\8bî¶\9b³~\1cñÊÍYûÑÍyþ\8b«!ã\8d\0¨;Q@Ù\87\ 2òa# \994\ 5Es«@Þ»­¨\8cwûM\93ßÛ[Rß;nHzïº%î½÷\8eK\1f\ eù\10º/àC\94­ß\87\ 4\12ñ°×\12dï¾\94zÌu\89\7fÜå£ðÄ\99\8f\92\93§?ÉO9~R:\9eú<ètòË\84\93Ãg-â\8dA\83m\0\ 2 \1f\ 4@¬A\81Â)\13Àÿc\rà,[\e1\96÷\9a\12ÿ<¼*áO\87µQÿu¶
+ûËcKà_¾Ûüà \9d>pÄ.O8öûó0vï9\98´ß\19f\1e<\rsmOÁÙv\ eÿc»ÎÃbÞ÷8\80\8ffZ\88p\90µ(%-Ú$TÔ,ÍÚ,5ÓìK3Í4íëHDu\13Q¤P"K\aÙ\97déZN<¸9\96ÇÅå\\97ãv²updi\93ä}\7fÏý{\9eïóú>¿ç÷Ïçýûþþù¾Qã\1f\8a\86\80\10\1c\f\9c\8f\96 `´\ 5\aá>á7«ZN\91HM\17\89ùí$RåC\12©¸Ã\86´\ 2ãGdaª\8d\19î\94\ 4øÙ+\112Z\82\88±BÐ'pÁ\99Ä\82p2\1dñS£ \9a¾\14ú\19áHr]\8c\8c\99¡°Ì
+Áj· ¬\9b\1d\80\1a\8fyhðôCÓ\1c_\9c\9aã\83K^Þh³êàybþ5bþ=\12©è\19\89´lÐ\9e\94\86±#\fp¶QÁ\95\1c[\ 1üí8Xà\10\8d\bG*èc\96\82í\14\ eÁ¸E\10\8f_\0ùOó¡\9d\10\ 4ãD¢\18NòC®³\ fVNöÂ\9a)\9e¨\9aê\81úi³Ñ8Í\1dG§»á\84U;Û\88ù·\89ùÿ&\91²_\92HfPHZ\8c!IñÓ\b!q\16\1cÌ"ÓáE\89\84¿m\18\16"Ì~>"í\ 3Ápð\a\1f\ 4#½!\1eå\ 5ù(Oh\1dgÃèè\86ôÑ3a\19ã\82ÕNÓQî4\15\9bÇNÁ\ eBÃ8k\10ãC\ 6{¾-\84!v\90,t\80\92ê\ 4\19J\89\vd   \1e\90¤ù@T\10\0~Ù|p7\87\82µc1\98?\87#úH\ 4\18ÍKAo\8d\ 4í*áV\14¨\8f© ¾"tÓ@í'\fÓ@ì\83\fP{\99 }dY\a¾7\19Ü`
+b\83í \vu\80:Ò      Z\8e34b\17\1e\90¥ø@¼,\0¢¿\85\80¿i!¸ÛÃÀÞ\e\ 1Ö¡%`\9e\8cDô¹(0~¡\82ÑN\ 3ý\ 1á\ 5\1dô¿\b}\84ïôï\fâ\89\ 5úG6\18ï9Öý?CL \ 5\92 [(B\1c [â\ 4\19      q.Ш= 4ûB\9a\17\bqq\b\84\15\8bÀß\16\ eÞî%à\1e\88\ 4ûx\14Øg¨`]¢\81y\9d\ eæ=\ 6¢;\bï¢\87£{¢\87\88\ 4ã\13\87\ 5ó5\ f,k  2\bý)\90ùÛB\13l\8fÄp'\98\98Î0\89\ Wx@cô\852;\10ÒU\v ._\fQM\ 4\ 4;#Áß\17\ 5Þ\11\1a¸Ítp[\19à\\8d\ 6û6s\98ý\8cù\8dÝÅúÊþÂêc\7fc~æ\80õ\8e\aöË\18pþË\a×\1a\bç\92\11çG\81ÒÏ\16ú\0{\98Ã\9c\90Ê\98\84\f\98e\1e0è}¡Í\b\82ª \14²5a\90lZ\82¸º(\88öÐ~\b\9b\18ß\ 5\87øgYßb.³\acn²ûy\8f8=¼×\9cO¼O\9c\ f1\83ì·1àv
+À{*DÌ¿Dà[\ 3\11\91\87\ 2\8d·-Lóì\91¾h\f²h\13\91Å\9b\81ôøÙHÖú 1%\b:Kè°º8|H±!rPº\856 ÙÉè\13ïcöÆ\1da\7f\89=Íù,ºÀý(¼Îë\16þ\93÷^ø\82×%ìæ½\12~åw\b\7f\b\1eÇBx/\ e¢[bë\10ëE\86Ü\8b\ 2=!ÕÏ\ e9¡£a\89\9a\0\vg\1arãÜ\91©ò\1eN6\ 6\ e\9a²Cûõ\85á=ÚµQ\9fTUônE\1dó/Ù\1eö»ø\83Ü?%'bºÄçø¯ÅW\ 4/Åw\ 5\9dâ\ eÁsñ\aá\93¸\81Ø\aâá¸Û\92\1fâ\eR\88¯È¬C\1c\91AåI\86É\83\82L\1f\878bå\92ñXÉ\9c\82\ 2á¬!\8b|n\7f\96>àsZzè\as~ÄÛÄ\92¨7  \15ѯ4[Ø\9dª\9dÜ\ eÅ>þsùQáSY\8bè\89ôrìãø_ã\1eÆ?\13ß\93¾\17ß\91öÇ·K\87¥WäÃÒ\8b\8aaÙy¥u\10Ï!CçNF
+Ñ;óæÚ¢0x\14\8aÃÇ¡\84á<T\14ãÚ[(ñìÎ×Ì{\9b\93\1cò*#7ü\8f\94UÔßMk\99O\fUÜGº:þ\ 3ÍnÑ=uSÜ]å É-ÅyéMÅ5Y»â¾ì\9aâ\8dü\8a¢GqI9¤8§\1aR6k\86\94'4C
+k %º\95\81è\9c\19\84åD×+\ et@Ùâ1Ãë¨\13ûÖr¦w\97ƺw­Vút\16\18\83\7fÏË\f{\94¹\9cz?µ\84u7iC̯Æ\1aÑ?\fõâë     \8dñWµ\87åm\9aÓ\8aK\9a˪\vê[êVõ\1fê³\9a\8fêfí æ\98nPs8aPݤ·\ e\fL®dä\10½³\90ÈSæo\8f\r¡\8e_+\97\8eÿXÉ\9cüçz\81kg\99\7f\8aôA\ f
+RÃîäåÑÚ³V±¯¥\97ñÛR6Æ^JÚ\1aÿwc\83ü\â~å\19ýqusB«ödÂ\rÝñ\84'º#ú÷ºCú\ 1ݾÄ\ 1Ý^ã\80n·ñ«Ö\1a¨fÙ \99è{\16\17¢ëÌ&c½¯íð¦\90\91=ÕáNïªé\13_læN{Z!ñ¼¿F\13x«È\1cv½ \8bÖf)`_È)\11\9cË\\1f×\92¶Yz*e»ò¸y¯ú\88é°î ±E\7fÀxÅ°ÏxßÐhì2ì1õ\19v&õéëÍý   uÉÖA3Ó\ 6©Ól°\9cÈQêf\83JoÊ`M\90ýÇÚE\8eoê"Ç=ßÆ\9aü°*ÖãözUÀµ5ÆÅ\97\8bÒ©­+,ì\96\ 4'sËÄG³*e\a3¶ªö§5h\eS\ f$ìN>\99Ø\90|Ѹ#ù\8ei{òKcmJ\8fqkjobMZ\9f¡:­Oo\rtÄ÷g\10\9dw%Ñ;×\12yª¼È}µþ¶ïw,pèÜ\15>ú·zºóÝ­B÷\e\9bäþ¿\94ë\17\9d/M¡6\17å°\8f­\!8´¼D¼ß²^¾7§ZÕ\90U¯«ÏüÙP\9bq̸%½5©:½=iszGRUÆgÓÆÌ\1ecefobEf¯Á\1aâ
+b\83,g\e¬":ïz×\11ÄÕÃæË\ e_J×\9e Ûç\8d¡#\1fì¢Nº¹\9dïv¥F:¯u£náérsÔ±ÒLvSQ¾ ±pµxWÁZy}þ&õ6K­®&w\8f¡*ç°©2û¬yCöõäòìgæu9ÝIër¿\98Öæö\18Ër{\13­A"ñ\1fr\88¾YLtÞ\8a\19#¾os³éÞåeór\9f\1fùÉ\81`\87»{£&^ßÉ\9bu±6ÞïLµfáñJSdSy:«qM\1e¿¡¤P\·ºT¶ee\85ºª`KBE~Cbù²¦¤2Ëis©åjr\89åqòÿؤϷ&Ó,\0ãç%!\ 4\80\80 ; (]@\8a\94Ð{ï\12:!\ 4P\8aR\83B(\vR'ÒDD H\91*\b\88\r°\8f\8aº\8eîê\8eqwö\9a\19Pag\1cë\99÷\ fÈ\87ßçû9ç9¼\9cß\92\8bs×ÙÅ9\eI$\96(\98¤BÞãV\ 2K\94      ¬S%>\9eР~íÒ"^õé\88=ê7\91¸yÆ^a¡ÃsÇÔÉ`ýÑ&¦Eÿ÷\89\8c®\9aT·S\95Y¾ÍåùAü\92âðÚâʨcGùqå\85'\13yÜ3ì¢\82s\9cÂ\82ù\14nÁÃ\94\ 2î/\1c.w\9dÍ-XOâ\16l°DÁde1Ì%ßP®D _\99øý\94*ñs\8f:ñbh\aq\7fÐ\98v£ÏN~Và¡qþt Þ`ë~óî¦xûv>ǵ¥6Ã\87_\95\eTSq4¼¢üïÌÒÒºØ"Þ\89Dn±\80\9dW4ÌÉ9z)åpÑ}Òÿ8ÙEïÙÙG×\93r\8el°DÁ\14²\9d¯@`åVÀFExß¡\b³JðdT\8d¸=bH»2`#7Õë¦>"\bØÝÛ\1eaÖÑ\1ak{¢\89íÂ?~л¦>;°¢¶0¬¤ª\8cy¤²&6¿¢)!»¼3)«l09£l:å`Ù\1dÒ\7f9éeëì\8cÒõ¤Ì\92\r\96(\98Fî P\9e¼\ 5\16yXí\96\85\97#Òð`\\ 5\16ÇôÅ/\8d\9c\1fpQ\eèõÓí\12\84\99\9e<\1dcÓÐÆr®9\91æUÑt(\80×P\10Zø=/2¯®*æPmC|zu;+­êlrJÕ\14'¹ê&I\98Ì©Zg§Tn$¥Vl°DÁt²_$\vX'\v\1fÚ¤áE¿\14¬\8cm\82Û\93Jper7ujÜRzdÔYµgÐg穾P\93Æ3QÖµ]\89\8e\15§S<xm\99~\85­yÁ¹-E\11YM\15Q\a\1aøq\9cãm\89Iü¾¤Dþ$;\9e¿Dú\89´\9e\94X¿ÁbÕþ?Q\14Ì\92%°T\ 6ðø\16xÙ)     +\83\92pwB\12nL+Àì´\ ee|jïæþ    Çm\1dç¼´Z\86\83\8dê\a"-+ûâ\19¼\9ed7® Ý'§3'0óô\91дöòHv[}tâÉÖ¸ØÖ\9e\84èÖó,fëuÒËDfë»Ä¨æß\13b\1a\1c\8a-ðk\v\1d\9e\9c\91\80»#tX\9c\92\80ù99\98\9c×\12\eºd*%\98a(¶Nyhò'\ 2õ\8f\8dE\98óFcm¹Clçì\81\ 3\1e\19g\ fû¥öq\83\92zKÃâÏÔFFw·DEvwÇ\86\vÆâÂ\ 4WãB»ÿ\19\17*x\e\17Öù!6¼]4än\86¯5\92ðü\14\15î÷ÓàÆ\18\ræf¨páª4\f_Ó$z®\9aÐÛ\16l\15\8eÏ»©WÍúë\96L\87\99p§¢­\ e\18éçS]8ãY\9e¬±\ 2ßØÑ\92@æHuHÄHsxÈ°`\7fÐð9fÀð\15ÒóHÿ¡5¦ÿà'f`\9f\93\84\9f\1a\bxØE\85¥!q\98\9b¤ÂÄ<\ 5\86\967AÏ­íDûM\ 3Zã²µLõ¢\8bJÉu_-îÕ\10\83Ã\v\83\97\13¬\93çRì\13.e:ÇÌæ¹GÎð¼Ãfªü\82§\9b\ 2\ 2¦»\82|§GC|¦\17B¼g\9e\85x_\\rñ\9aú\18ê5ñ-L\94O\95bð´\15àV/\ 5æÏQ`b\9a\80\81kT\10Ü£CÛ\ 3%hx°\8b\83Åæ\92û\8e\8a\ 5w½4\ eÝ        Ò9p;Ò\90}+Þ4þ&Ç2j9Ã6b)\97\11ºTì\1c¸Xåê·Øäá½Øåå¹8êí±¸àí¾ôÌÛ}qÕÛíúG_×kè'Ê+>ÀÝN\80\85A\ 2&&Èþ¼\18t.\8bCË#I¨\7f.\ fÇ^h\8bñ\9e\9bÒó\7f´\97Ízæ±-õ\1f\ 1;XO#vÆ>\89Õc>N6\ e\7f\9cn\16¼\92k\11°Rlí³rÌÆk¥ÉÞ}¥\8báúxÔÁåñ\82£ó\93g\ e.+¿98=úÃÉñá7\17Q\1e\92;¸Þ\vpa\14``\1a ãº\184Ý£Aõ\8fRP.ÜF\1c}£CÉycJO\17ÚÊ$\v]\15ã\85¾jQÂPÍpa´v\88\90¥\eð:MÏ÷õaC/á\11\13\ fa\85©«\90oî,lßëøfÀÂáÍ´%ã?wHo,\19Â\r\v»×\9f­DY\12\0\\1c\ 2\18\9c\97\ 1\1ao\89Á±Ç4(^\93\86\82U5"kU\97\92ºfJg­Ùl\89YsV\88XóV\ e^\vR\rx»_Ãçm\9c¦çÛd-÷·\19;]Þåé:¾ãíf¼«Ö³{ßl`ó^`h½>jdµ~ÙØrã\ 1égc\8b÷\e"Íô\ 3\f\8d\ 1t^\ 2hX\ 2¨x@@á¿Ä!û\83\1c\1cü°\9d`ÿ©C\89ýÓ\98\16ùÑJ*ä£\83tÀ'w9\9fO~[=>\87*¹~fnsú\9c êð\85³ÝîK¦ú¾¯ù;¬¾\96jZ|­ûÎü[«\96é·\1eí=8¾Ó\ 4\17t\8cñ\a\1d#\14\8a42Bö/\92ýkdÿ\1e@Ás\80Ìu:pP\ eâQ\95\88D-J\bêSýÑ\8cæ\856t7tÚä\8c\9e[\1cÐ_Ú\ eCe÷!SÎ
\15ö"g«\19f(\9a\92\11\96*\e`\9d\8a\1e\9e\8d=ª»ð\9c\9a.În×Áe\91\ 4ä\1f4.\90ýÛ\0ùO\ 1\ e¼\ 6Hü"\ 1Q(\ 3¡¨Dø£\86\98'êP\Ð\88ê\80æâ¶hC³FG    \v\9b¡\ f}\ f\ 6J\1a\94\ 1FKé!kÓ.<°y'ælÑÂbé¿aµ\8c&6Ëj`\17é¬\9c:\8e\8bÔ<Gö\97ÉùW\0Òþ\r\10³
+\10\86\14ðÇÍà\89ò\84\10ö¨)f\8dº\94½hH1E3ª\11ZQõÑN|\17:\89ë »¸6úоÃ@\9a&\86ÓÔ1FB\r\93$T0\9d®\8cùtE,£+`\9d¤\ 2¶HÊc\87HèdHA'S*z\90|,hègKÇ\0wi\f\bRD¿XUôNÛ\81\1eyÚèZ¦\8bNõzèxÂ\0\19]FÈè7FûQ\13´»°\aíæLÑv\91\fm^\91~1G\9b\rÒgs´E³o¤/vhþ\a\ 3÷þ.\ 2:\ePÐÅ\84\8a^$?s\1a\ 6î£c°\9b4\ 6\ 5*b`´*ú¥h¢w¶6zðv¡k\8d>:7\e¢Óictì5A\87á=È\980EƬÙ_l×WXÓi\16\ 6ð?M±1\8a2¶qäÑ\ 1\ 5\14\10\81\80\91\10J\b\90Þ\88\84\16:&\b\ 1\12é\ 6\18\90*e\11\11QyPÔE\1dY+:긺ë\fì¢(«¢#\8a\8a\f\10Î~×ÊÅïú\9c÷|ßÍ\v\84\ 1G ÜE\86\9dÀí\15òÁ        \b3N:\ 28ͺ\83ã´;8Oz\0îý\ 2À\eí@¶5\0\9a­!\ 48\18\ 1ÇÕ\18øÞ&Àc\98\ 1\11\ 2ÂÍ\81®´\0ªÚ
+|5;ÀGk\v¤:{ðnq\0¯ã»Áó´#xö9\81Ç\15gð¸í\fÄ\7fã\808\86Ó\11ßãf\88Ó¸/\1eà<\85æ ù.o½ÀuÜû[@²1\0\as\87!pí\8c@\883\ 6\89§      \88if ào\ 4^\889°â-\80\91j\rþy;\81Rf\ f¾5\ e@nr\ 4\9fv' \9dt\ 6R/ÊÒï2ï}ÃeÎû¡ë_^£®SÞï\?z\7f\80fLxÃ\9e7$À¿ð\81½Ï\17\0>h\a\9a\95\ 1\fA¸Ã\b¤N\8bAF\\ 1\1a\90r6\80h\1fújÑ\96ÀI²\86\80,[ \17í\9a÷¯t\9c£Ö;ÍRZq3~\9d.Ó¾g\¿ø^Ø3E\1eÀ\7f&ÿ\8a\9f$\8fàß\91ßâßøNá_\93Áí%\19\bÏ|Áý\ f
+\10\9f,\0ÈÖè\ 6Û\f@`i\0RkC\bÙ½\18ÂÝV@8y5\84\ 6l\80 ±9Hä\96:¡Òf\86§¶\9bf\17ì\9e
+(wúĬÁMÒ\9b\?ÐÚñ\13þ'÷¾ó?ëö\96zÙí\ru\90ð\9a:L\18ó\1fw\e¥~v\1f¡Î{\fSÀó\91?xýJ\ 3¯;ôo\ 1e;º\ 1êº\12Ô5C¶\eB\84ý"\88Á/\83\18oS\88¢¯\9f\ f\17lþK\16lñY\1ak3)N¶\9f\10d;¾å\15áÆ9\95®¯Øuøÿ\ 5´º\8d\ 5t\12\9e3{Ü\9f1þN|ʸIü/ã\89Çï\8cW\1e\8f\18\9f¼\1eÐçI÷èàs\8b      >\ 3\ 1@þe\ 1@³Ð\a\99\ 6\10\81n\11gk\ 4J\97¥ ôX©ÛO]û%\96³i2BúÓ\9f¡\91Ö¯e\aìǤé\8e£â\ 2\97§Â2ü\7føÕ\84!n\13ñ §Ýó1»Ûë!«Ïû\ 1k\80t\8fõÀç\ ekÌç\16kÒ÷:Kç7À\ 2J?\a(}\ \9c[\00·ê\83øG}\bEbÑ=\12l\fAåd<\9fL0\99R\91×¼?ÀÜ8\1e/Úò":Ìê©<Þn($Åé_AÙ{\1e\ 6\16\12î\8bµ\1ew\85µ^\83\82fÒ-þqò\r^\8fß5^?e\80{\9bz\85;Bíç½ó¿À\9b¡õñ\80Ö#\0\10h]\v\0¶¹>HQç\8c@\14[ô!\19½MÚ®ÅÓé{\96½W{­z\9dê¿n4\89¿yX)Ûþ(6Úî~ä\ 1ç;ajüÍà<âµ \12¯«Ò*\9f+\81õ¾ýâ6êEÑIÿóÂ>ú9á?\18½ÂÇ\8c3¢qf·è\v³K\ 4Ì\ e10Û$H 0¾\ 6<\94_\86ú^\fê\9d\89h\9f4\v\ 3]\96­ÑÇ\Ü\92ñ\w\93Ñ,_³!5{ÓoªÀmw\94\eqûq\ 3QÉ{/Ë3=.\86iH}!å¾½²\1ajϾ&Ú)i\aãd`OÀ\89Àˬã\81÷Øí\81cì6é'v\8b\14ØMû\80U\1f\ 4¬º\ 5\80\0å\ fE]sÿz=HÙ¤\a\99[õ§ó­\rþ<ä°èE!~é°\86dú[6ó\87AµÈòZr\88Ýå\84\18Ü\85ø\ 3ngcÒ<{¢r}ºåÅ\94\13a\15´\8eÐ:Æß\82ÛX­²nN³ì\ 2·Iv\8b× {Æ«\vþÀ=\12¬ãV\87\0§*\148\95¡Àþ\1a\88P~¹\99\1e$ =Ô\eQï4×ûXh©ÿªÔÖp¤Üyñ£b\8fUw
+h\e¯eó-/©\83ìú\92#\9d{\ e(ܺ\15É\9e\9dq\99äö\18\r¥5ª\8c~4¢& A~\94]\eÞÉ­ ;˯
+»&¨\f\e\12hÃ'ø\87Ãçøeòy^©|\9e[\12ñ-\90¬Ó\83HÔ7\93PïÌ\¯§ÓlÒ\9b(Ý¢÷¢ÂJÿ\8fÊ]\8bî\95»\7f\88ºár>×¢/Kj{F\1dîÜ\95\12·÷XR¢gk\82\9aÜ´?\97Z\1fWL¯\89©dUE7p´QÇøå\91\92È_DÅ\91\8fE\85Qo\85\85Q3\82CÑ:~A´\8eW\10=ÿ\r\90¢ü1¨ï%£Þ\99³\16û«h\ 3öF»IïiÍV½\7fÖØ\19\r\99\-ó[\7f¡\90ýSO¾xgWV¨S{zôÞæT¥g\83*\95|$1\8bZ\95p\88qXq\98U\1a_Ë-\8ak\13hbO\89òc/\89sc\1f\88sâ^\8brâ¦\85Ùñs\82ìx\1d\7f!\10\84Þ!n\15꽫QßZ\83M\95}\8f½üy\1d6Tÿ\ 3v¿n§áõjü\8aþ
+òºÞÒ\80­'\v\85;\8eåË\1c\9b³#ñõ\19û=ªÓT>\15)éÔ2U>£(±\94¥I¨ææ*\9b\ 5Ù\8a.Q\86â¢$]qW¢V¾\14«\95S¢4å\9c\10á§)uß\80`\94_\81vP¯Â@c\8aMjM±çµ¦Øã¦õØ`£\8dáÕ:×åç«IkOk\19[\8e\97
+lZ
+÷í®Ï\97ï©Î\89#j3\13I%éi\94Ci¹ô¼ÔbVvr\15/]Õ$8\98Ô)NI</Q%\ eJTIc\12\95ê³H\954+T%Í    \10þ× \14½CÂJ\f2\91¢\95ØD\95       6Ò¸\ 2{в\16»Ñlep©\11·¬·Öëû®\9fiæmZ\9euC©Ô¡º(ÌU«\89!\96ä%\9049©\94ÜÌ,zfF!+M]ÁMNk\10$\1eì\10\9e\93(Ro"£\12ÅÁ\8f"ÅÁY¡2uN°\10\90£\e$~\87A\8e      ö©t\ 56td)ö¨y\19v·Í\f\ehÛfp¾ÅyééFO³cµþ\9b\8fVs¬\8eTHvU\94\87¸\94\94D¹k
+\15Þ9\9ad¿ôü\fZj®& )û07!«N\10\9fÙ.\8aÍè\95Dg\\97Dg\8e \93¢èÌYaLú\9c v\ 1\10¹\12ýG\13\fò\96c£ZcìqÝ\12ì^ë\12ìf\87)v©ÃB¿·ÝqÉ\89\16âêÖ&Ê\8fuu¬m\955"ûÒ*\19\8dpË.\8f÷J/MòM)Vû'\16æ1\15\9aRNlÁ\11~T~\9bP\9ewF\1c\967\80\f#ïEáy³ByÎ\9c\0á\7f\rbÐü\83˱ÉCK°ß«\16\e\8d±ÛíÆØÕ\13+±ó'¶è\9fêt0n?F0mlû?Ûu\16Õä\99\ 6püÉJP\16aTd\11Ñ@B\16 ²\ 6\12\13BB\12"$@Xª(.¨\85
+®U\86Q¬£\1cP°È (
+n Å\r\rµî#¨\9d\8eö\8cÆZ§*\82K\95M\10\9eyOçNzñ;ßåÿùÞåâÕºTÔÄxl¯6yo©\9a\13°q×Bi~ÅW\8a5å+Ôy;ÖÍÎ)-4,Ý^\1c»h[E|fI­)£øxÒ\9câöä9Å?\93ï[bØ\94Q4\92\98±u,̱\ 2\84§%4xPÉ\84ÛµL¸RÏ\84¶ã6pê\84\e¥þ\98\ f³æ{é\84ÊzµSÙ\11\ 3{ëÁ\ 4aam\9a_þ¾ÌàÕ{\97Ês«\96«²w¯ÕfUn\88\8f¢è\8c\9dåÆô\9dûãSÊ\e\13\93Ë/\98\92Êÿ\95\98\93\98ôݧ\84\94²Ñø\94Ò±0Ï\12ú6ÑáQ\19\rþ¹\87\9e\f8×H\87¦&+hhq¡\1ch\162ªN\ 5Ûì8¡r(j\8cr+l\88ãåק\8aV\1f\99\17¸üP\96tÙÁ\1cÅâÚÕá\995\ 5\11söm\89L­Þa0UWÇ&ìm0Æí=\1fgÜ{\9fè6\1a÷\f\1aãv£1n×X¸\86       Ï¶\ 2Ü« \92{@\83óõ4h:A\81\86V\16\1cl\9b\ 2{Úx´ò³\81ã\8bÏ(&njÑM]ß\14ë±êd²ðëãs}\97\1e[$^Ø\98-\9d×°24ýh¾*¹~³6¡®Lg¬Û\e\15sä¨ÞP×fÐ×u\1aôGº\fQ\87\a\fQ\87Р?8ÖP\ 1À£m\0·ª(pñ\10\15\9a\eI¿\ 5 æ\12\1dª.O\84òË\1eÔâv?Ö¦K2»õ\17´\8e+ÏGOÏi3q\97\9c\9dãµ u\81ïÜ3Ë\ 2SO¯\b1µ¬\97Å7\7f«\88i.Ué\9bö¨#\9b굺¦³Ú\88æ\ emDS\97V{²?B{\ 2u\7fæ×Í\0\1då\0Wj\0\ 34\9c$ý6
+T^e@é­ PtË\8dRxË\87±î¦ÄzÅ\8dð\89Ù×õÎ\8b¯%L\9fÿC\1a7ýj¦ ùÊR\9f\84˹~ÆËë\ 2\rí\9b\82#Û·KuíU2M{\9d\ÝÞ\1a\1aÞ~\97x%W]ìW(/`\98ò<*¿ôï\12\80ëU\0­\87\0\1a\8f\ 1Ô\9e\ 6¨¼D\85\92\9bL(¼?\1e
+\1e8ÁÚ\a|Zî\83 Ö²ûa¶\vïÏ\9e\94qÏè\94Ú\992ÍÔ9\8f\1d×\91Å\8déXÎ\8fêøÆK×Q(Òvló\rïØí¯ì¨\v\bëh\rTtÞ\rPt¼
+\b½Û\17$¿3\1a\83cÜ®\08_\vpü(À\81&Ò'ïÏ\92ë4ØØi\ 1k~\1e\ fyæ)\90mæP\17\9bý\18ó̲qif­m\929zb¼Ùä\10c\9eë¬7/r\9dý$ÇMk^ÃV\9b7x(ÍÅ\\85¹\92'7\1fæË\9e¶ðgýr\93?ëés¾ôÉï\ 2Éãa¯\90Ç#Þ_jß\a\bÀÁ\13¤ßFúW\ 16ܥª\87\16\90ýÊ\16²^9Sæ¿âRÓ»|\19¦.     +®Keex\1di\eùÚh\1fñ:e\92úõ<\a\12GEw®³¼{ÝTi÷f×\90\9e27qOõô 7ßÏ\b|s\8e\1dð¶\93íÿö\ 5Û¿»\8f\18\1c£\89ìÁáF\80]gHÿ2Àßî\0¬ü\89\ 2\98\90ùÑ\ eÒ?ºP\92z9Ô¸^\11ÝÐ'fÎî\veiú5ãTýz+Å@¼\8d| ÕV:0ß.dpÉ_\82\ 6ó&\ 6\fæOöû´Åaæ§ò)>C5\8eÞCÇ\9d¼\86/:  \87;\9d\ 5Ã/\89î1êÈ\1eìn&ýK¤\7f\v\8f\0\8bÌ\0é\1fX\904j\aFt¢è\91M\8d@\ 1-\1cýè
+\faÈPÁ\94 ÆB\8czV\0ÆYúa²åLÌ\18ç\83\85\98kÅÇ|kOÜbÃÁ\9d\1eX3Á\1d\8fÙ±±Í~\ 6Þ&î\8d±ç\14À6r\ 6\0È»OúO\0\92\9e\ 3\18G\98\10\856 ÅÉ DW\8a\1c\10ô¢\ 6¡\1fÍ\ f\83i"\94Ó½QE\17 \8eÁÃh\ 6\17\13\98î\98Æ\9c\81\v,Ü0Ûb*®e9ã·,'Üaé\88Õ\96S°ÎÒ\ 1\9b\883c\94\923°ñ\1aùÿ{¤ÿ\18ÀDúQï\ 14H\85\ 2\81\18§Püq\1aE\84\1e\14!
+¨<\14Q=0\80ÊÆ\10ª\eÊi®¨¢¹`\ 4Í\11\r4\aL OÂtº=.¦Ûa.Ã\16ÿÊ°Á"¢\9ca\8dÕDí\18\18ìCE©\88\86\8a\994TùÓQ\15ÂDU8\vÃc¬P\99f\87\8a¬É([å\88Ò\r.\18\8aÁ\15n(®\9e\8eA\87Ø\18ÔÀÆÀSî\18\ 3\ 3ÛÉX·9\18ð\90ø\8dxG\fr0\109£Äçÿã\ e\ 5¢ç\97þ\98AæCú\84Ú\97\8eZ1\13µJ\16j\rÖ¨I±GÕ¢É\18\96ç\84ò\82©8«h\1aJ¿\9b\8e\92\ 4µî\18\81Á'8(>M\ä¢ø\ 6ñ£'\8a\9f\13o<GÅ\ 3\9eÃâQî§`ä\ e\8a\91Gðûÿ\ 4\86\90\19\14BÒ't>t\8c\fb`\94\82\85\91\91Ö8Ûd\8fÚL\aT\7fí\8cÊõ®¨ø;YúR6Ê*ÝqÖ~\ f\9cu\98\83ÒF.J\9b=Qr\8e\87\92\1f\88NÞ¨ä\17þ°¤\9b?(éãõKGy½Rä\7f\94 à\83\ 4\85ï$èõ%\94zQQÅ£¢\8eGC½\90\8e\f\8c\95±0Vg\8dÑñö\18\95á\80º¯\9cQ»f\1a\86\17Î@e\89;\86íä b/\17C\ fxbèQÞ¨ü$\7fDÞ*ø,¿,\18\92ß\11\fÈ\1f\vûä]Âßå½\82\11á\e9zõÈЧ[\86¢\97ò±0\94OE-\87\8az\ e\r\1c    ¾\fL\94Z`¢Æ
+ãcì16Í\ 1£³\0j\85\eê
+Ø#Ú­\9caM\99ç\90z\17o0|?\7f@uDЧj\14ö*[¼>*/x}PÞô~¯|èÝ£|éÝ¥úèõBùYôß0\9cù<\f}\9f\85¡ßc%ú\7f   \95\*ÎfS1\96¼wM\\1a¦\92ýH\v¶Àt¥\15¦èíÐdr\18\8dÏt\19\8aÍq\e\88þƽ7j\13÷Cd        ï½n§à]Ä\1e¯7\11\a¼{´G}^kNútiÚD/5×D/4\ fD¿j\7f\13=Õ|ðý\8ffØÿ\91\1a\ 3~Rcà\ 35\ 6Ýý\1fÛu\1aÕÔ\99ÇqüI\10\14\ 5Q\8b¸â\8a\88\bȾCHrs\13\16\ 1\ 3\ 4\ 4\ 2Ä\10\92\10\12\b\81\0\81\84\84}\8bì;\82
+
+\b#x \ eZ¤Ê´êiëÒZ\19ëÔ±u´ÕZÛ>sû\16xñ9ç¾|Îï\7fß|\83\96\83\81ûñ\90\8aµnø.<\8cÙo\0ã±{°\1c\8d`\82÷ZÈ$\99ýÎ\bÛúkT¬åÿ"¹»\7f:-´~\19*?ô"Xuô9µâØ"Z\7fü{J«ÝS¤çÄ·È\ 5ûÇä±\93\ fÉ3\ e_\93î:Þ'/:.\90_;}Núè<G\82®·0³dè6\8d,\aI{ð0t'\1eFYâ!\13Û"  »G2v\8f\14\ f\9cÀ\ro\12iæ¯â£v¼`°w/Fñ­\9fFJ\ f?       WÚ<\fÓ\1cÿ*¤Úþ^°Þá\vZ\87ã\ 2µÿÔ\1dtØy\1e½æ2\87~æz\v}ìz\83úÊm\1aýà1\85B\8fk(ô\9c BÏQÚr\90b\85\ 3\ac1IØ\1e©Ø¿Á³]õá¬óê7<_Ó\97©äMÿN\8eØþm"s×7ñ©Ö÷bDG\16¢r\8f\7f~¦Ø~.Bçx+¼öÔlX\93Ë\8dÐ.·éÐA÷ë!c\9e\93!\9fz]\vùÒk<ä\85×HÈ;\9fË!Ðg(\14ú\Ä\f\84-\ai\968HÇ\9a3a\eÖ\9d;±æÚ\87ÿSxÄà­è¤áK\91\87É3\ 1aÃ#^¨Å=.c×\1d\819\16ÿèl\9cÄn\86¡p¸\1e]rj\92^á:q¦Þýjd«çhD¯÷\95ðaßáðI¿K§çý\ 6Ã\9fù\9f\ f\7fëß\eñ\97\7fO\ 4ôï\8a\84þí+\80¡Ûq0\ 6ë=ÎV\1c<\8bm!Ú\8d{\9f}\0ÿJfk°(s^ý(Û\7fÝ\17BêÖÛgéV³©¬\ 3Ó\9cT\9bI¶ðÄ8+Çq4^ér9Vã~)¦ÚëB´Þç|T§_\1f}0 \87~5°ëÌMB\aý  ¡\8dþ3¡%ê\ fBS\14$è£a`ã
+àil\838¬÷¸Ø;2-\0̶Ľ\91ïÅý 8\8c\7f\92\7f\97roÓÛÙ\88ù\rQ¸Õ\14?Îz<\9dcs\85Ë·\1fâH\9c\ 6Ùy®ý  *\8f\1e¦Î»+®Î¯=¶5 \85ÑGhb\!êcfH\r1\ fHu\8cÿ\92jc\7f'ÖÄBbU\1c\fª\8c\83\84¥`¤9\ e²°ÞKß\ 4 Ø\1c|ÌÝ\ 6^\15ì\ 4ß\17ïÃ=(¶5\98/ðXûO9qˤ4tç\98(ÆzX\90h3ÈK³ïK\13\9eêN\91¹µs\94\9e-l\8dϹÄjÿ\ 6Ö9B\1d³\9bXͼD®\8c\9fBÊã\17\10\1dó\ 5¢eýF.cA\92&\ 1\12Õ+\80ôÍ8ÈÆz\97¿\11Û`\13x\9f¿\ 5¼(¶\0\8fÕ\96`AmcpSåfr]IØ|U\1el9$¥ï\1f\103\8föd¦\9cèàg8µð$nú´<¯z®Ê·&¹< \92Ó\10¤c·\934ìA¤4q\82¢J\9cG\8bÙÏÑ¢¤wHQ\12$\17r YÉ\81¤¥`4v\a\ eÖ¼\99Ø;rÌÀÛB3°¨Þ\b\1eè,Àmí\11ü\8cÆÙxBå¿é²\92úÉ\80<r_\8f,îh[\16çD\93\90çÔ \10¹Õðs¼*y\85¾Ú´²\0ujm\90\8aÛJ.Lé§\14$\8f¡\8aä[Ô¼\94gÔ<î/¨\9c\v\11\fy%\90\815/\17kNÑzð1o\1døQµ\ e\99\82\85Jsp³ò ~Jç´fTã»ñ\82\8a²£W\19¾·=\8fqä\N¢]]vªc\95Xàª\13J=5\82|_U\86:°ðl\151\9f×\84ÈÓ{Ñ\9cô\11ª4m\96\96\9dþ\1dMÂ{\83Jx\7fQ$<\88`ÈKÁ8l\83´u\0JLÁO\ 5kÁCµ1¸Wa\ 2æk6\83\99\1aküx\95Ãê!\9d\8fY¿\86¼½C\15¶§I\19}¸NÁ:^\99\9bâ¨\95ñ]J³³<\8a²ò|\v\0¹°\82(\13è\11IF7*ʸL\13f|J\13d<¦e
+^S3\ 5\7fR2\ 5\10Y     db\e`Ýû\87Ô\ 4<)2\ 2÷µkÀÝjcp³~#\98ªß\87\e©µ7\1a¬òÚÐ]NÜÖ¢      Ù]_B?TU\14o«-à8\94(x.\85r\91\87"'×'GZ\14\90\11EY\r\88\89òÅC4\9eh\9a\96\1aó35]ü\a\9a.\86\14\9e\18"KÁ\ 4l\83\f\13ð:×\b|£2\ 4\vå«Á\Ý\1a0£7\ 3ãú=¸¡F;£¾:\8fõmÕ\ 4\8bÆ
+Ú®ê²È\83Zuì±\12\15û¤²(Í9O\99é!Í\97údå)\ 32åeAü\9c:r\9a¬\1dåÊ.R\93¥S4\8eì>æ\155Yö\11M\96AJ\8a\14"KA¶    \80Â5à©\ 2\ fî©\rÁí*#p£Ñ\bL6¯\a#-»p\ 3Ͷ\86\9dz7Ó¦ú\0óÚ\1aÔJW\15n]R\1ec£Ô&ØËÕÜSÙ¥\19î"\95Ä;£HáÏ+,%p\vjH\9cüVJ¢b\0e)®Q\99\8a\7fa^bß\1f(,\ 5D\12ò y)\98¼\ 6|ÌZ\ 5\1e)qà®n\15\98­3\ 4×\9b\fÁX\9b)¸Øa    zÚmVµ´º¬­oöÛR¡G,KëÃö)k£\8fÈ«\99\95É\8eÂò³®|­Ø3­Lî\9b¬V\ 5&\96V\12\99%ÍäXU?\85¡\9a@£UwÐ\18Õ\7f(1Å¿!1Å\90Ì(Z\ e¦\19\82\1fe\0ÜW\ 10Wi\0¦\e\rÀx«\ 1\18ê6\ 6}=ÛA{Ïa\83Æ.'ãÊ\ e\9fMê6Ò\ eeKÈ\9eÜ&ú!\89>Î6³!é$¯.Ý\99[+tOªÎñfU\15ùÅU\94\aFW\9c#ÒËûÈ\91åW\91\88òyÌ\ fä\bÝ{R\84\16\92\90¸\14äãÀwy\0ÜÕ\0\16\ fþÑ\8c\aÃ\9d\0ôõ\e\82ö\ 1\1f8\80¯>ï°ZÓﵡ°7È"·\9bf\95Õ\19i-hg\1cMoK´KiIuHl\16¸Ä7IÝ\19z¥7½Që\17ÑÐ\18\10ÖÐC\bi\18\r
+n\98\v
\7f\1e\14\÷+\ 6\12\82k\97{'\ 6à«B\0\0àº\1e\a®´\ 3\17\806¬?\e\877\82êË{qeÃv\86\85C\17\ 3·d]@?É\18\bß\93v>ú §\8fe\93Ð\9bb\17×Ãw\88î\968Gvå»\9dîÔx\ 6wÔ{S;º|)\1d\90\8e[\98E?rÛ/~äVè¿\92g9Ø\ 6j\0fj\ 1\18k\ 1\e\80\8e¿ûs\ 4\80òñõ@=a\85SN\1c\19w1\16_õ3ã\8f"\16Ü\91Ð\9dìÿ³]§QM^i\1cÀïû\86\10@Aö\ 4\92\90\85H ,!!            \84\ 4\12     \10 a\8dÈ¢\88\14µ\8a\vÇÑÓѶÚN­£\8eÓjkkGfܵ"¨hE\r\b\88âq´\12­\8aÊj«²\8aÊâ3·Ç/sÐ\ f¿Ïÿç½ÿ{Ï{\9e\93¹ü¢\13s\ 3fW/\bÎ=¾4Ìrl\954óØ:¹ùè&eÊÑ\1f¢\8cUûÔ\89U'b\12ª\1a±\ eµ¡r(ÆPñV\13_\ 1ÚÉî}\89P#>\ 3ëN\84\8eâ\ eöWüùý8ÿ,\81Ö×9¢uõ\f´º>\90üK½Ü~i]ìÔ\85\17\93Ü\8b/¤Óç\9cÏaå\9d\9fÃ\9dy®D\90U»D\98^»R\94jý<ÔhÝ\18\9ehÝ.\8d·î\95é­Õ2\9dµA®·>\91éÎ\fÉãNODÆÖÀ{Zñ\19\11¡êÝ\b\1dü\19¡\9d¸\83oO#´þ"\89V7ÑÐ\8a\16w´ì\1a\9f\12N)iQÓæ¶ÄOÍ¿jr˹jñʺZà\93Þ\Ì25/æ$7¯à'6}&\88oÚ Ô7}\1f\18×´G¤m:\1e¬i¾\8c=\16i\1a\a\83\8c\87ª\e l²ËÛ\10:\85\19wP^\85ÐÖ\1a\9c\7f\ 1¡Õ\8d\14´ì\ 6\rÍ¿ã\8c\8aÛ|Q¡MDäÛ\14\94\1c[\9c}\96Íè\94fËpNµåº\1aÛ\8a<\12Ú\16zÇ·\951tmk|cm_³blÛüÔ¶Ý\9c¨»Ç¸ª»\97°v®ª­\8f«üõ\r?ò6øOv\ 6wP\81;øÏ\11\84¶á;ðõy\9c\7f\ 5¡e­\14ôÑ\1d\1a*èpA¹\1dLdé\10\12\19\9dRÒÔ©¶3vΰOèJu\88ïÊvÒuåO\8dí*vÑt/v\8dî^é®ê^ë\19Ù³ÙKÞ³Ã[Ös\88.í=Í\90ö^cHz»\18\92îa\86¤kü=Uø\1dì>\8cðýGhùwùK[\11\9aw\87@9\ f©(ë\85+Jïc¢Ô¾\0"©_LÆ÷+)q\ 3Z;Í@\ 2U=h²\8f\1a̦E\ eæ;È\87\8a\1d#\86J\9d$ë¦\8a\87¿p\ e\1dþ§KðËòi¢\91
+× \91Z×À\91V7á«n7áË\81÷ìÅïp;¾\83\e¬8¿á]~Q\eB\96\87\b\99úiÈ8ê\8a\fc>H7Æ'´ã""zBJ*'T¤ü­\96"}k \84C\8a]\18dR\83!\97\1a\ 4EöBXd/\80\954\7føÂ\81\aß8p¡Ü\91\ 3\15\8e~pÖ\91\rÍ\8e,xð\9e\1fñ\1dÜx\16¡5\97qþu\9coC(\eç'u"4c\8c\8a´à\82¢Á\v)\81\85d  $\10L\84\82\84\10\81\82ÄË.9\1dt¤?$\92\0Qü \9bÂ\82\ 2\8a\ fÌ·£C\99\9d\17|nç       \9b©\1eð\13Õ\1d\ ePÝ \1a«}Ïfü\ 6>­Çù×Þågµ#\94Ð\85\90f\0!\15\108w
+
+\aW\14\ 2Þ(\bÏ\11\0\a\81\10\82\85\ 5\ 5Á\0\ 5q\84\a\9eÅ\r̤+Ì$\9da.9\15\16\93Nð       é\bë)\ e°\95B\83r\8a\7f\ fH$$(ÂH\88\12\93\10-¥@´Ê\ e¢õTP\99i Ìw\ 2Å\ 2g\90­p\ 5éZw\90\84ðï¼!ü_t\10ïÁ\ e1 ì¨\ f\84ý\82Õb\r¾\10v\ 3{\84ý\81\rcã¾ãbð\19\13\83ïh\1801Öd\10\81³U!$Ä\84\92         §\80Va\aÚ8*ĤÒ@=Ë  ¢>r\ 1e\99\e(>õ\0ù\ 6/\90}K\87\88\1d\f\88Øå\ 3Ò\ 3Ø\11_\90\9cÀÎ2AR\8f\1e`O\99\13\92!æ¨t\8cùZ
+ÌWR`\8dH\80ýR\ 2~\93\81\1cç«E$ÄbºP
+èev0CK\ 5\9d\91\ 6q\16\16¹@Ì\127\88þ«'¨þæ\rÊ-\f\88Üî\ 3\8ar\Ã>&È\ f³@~\f«a\83ü\ 2ÖÌ\1e\97ÛØ£ò\1eö+ù\0{X>Ê\1e\94\83ß\80\1c8ýràöÉ\807\19(q¶VH\82\1eï\99\86 \12\92p\1fIj*$&ÐÀ\909\ 5\99\ 6º\8fÝ!v¥\17hÖâê7ú\80z+\13¢\7fbMDíb\8fG\1dd\8f©*ýFU'9oTµ\9cת+\9c\11Õ-Πª\93Ó§êç<\8b\1aåü®\ 2ÞS\15ø÷ª@ÐóÎôÿ\aê?óýIHä\93\90\82ç0\8b)\90¦¢\82IO\83\14ó\140æM\83Ä\12\ f\88_î=®_ã3ª[Ï|\1d·\855\12»Ý略\9c3¤ÝË\1dÔ\1cæ\ eh\8eóú5gx/4\97xÏ57x¿k\9eðºµ}¼\ eÍ\eÿÇ10½=\ 6\84\ fc ðþ\a\80Ö\9f\80\ 4.\ 1)~\ 4¤\v\ e¡\80En\aÙZ{È4:½M³L\e5\15y\8c$\97Ò\87\92Vùö'¬c½0lô{\16¿\95ûÇ\8c\1d¼§ú]ü^ýAÿn}\95\7f\97î\94 SwQðD\7fMЮ\7f$øMÿ|ú\1dÝëÀ[:\10ÝÔAð\8d8\bn\8d\83\90É@\8fó\8d,\ 2Ò\98\ 4Ìä\11\90\17HB>î#/Ú~|\96ÁqÄ\92î2\90Uàñ<}\ 1ý©¹Ì·;u\r»3ù+î\13ã\16Þ£¤ïý\1f\14ÜOØ\ep/¡Bh3\9c\büÕP\exËÐ\14tÓp_t=á\99¨Ùð*¤Ñ\80ÿK\ 6\10_Â걺IÀÀ&ÀÄ À\82åã³(\9cNBQ(e¼(\92:\\18çð¢ Å¹77ǽ#g\1e½={   ó·\8cU\1c[ÚZþmóß\ 57S¿\11ÞHù!ðzÊ¿E-É\a\82\9b\8d\95!\8dÆ\9aÐ+Æú°ËÆ\9bâºä\1eñ9ã°Äj\ 4éi¬&\19"N}\0\18}     ÈÀ{o®7\ 1sñY\94ð\88·\v\82Èá\ 5Rʳùjû®âÄ)ís³\ïÎ\9eMÿoÞBVkN\19·Å²ZÐ\94õ¥°!c\93èRúÖ\90º´\1da\17Ì»ÅçÌ\87$VÓqé\19SmD\8déªì\17ÓcYµi@~Ô<¡¨4\83â\b\ 1\90J' \eï\9cs<\11\940\10,b\13¯K\ 5Äó%!dW©ÂîÁ"½Ãíùf×ëŹô¦Âböå\82R~]ÞÊ\80s³>\v²Îü*ä´å\1fâSÙßINfí\8c¨ÎÜ';\96Q©¨Ì¨\89<\92Ñ <\9cqOy0ã¹j\7fæ¨jo&¨ö`»³@9\19\98=     \98\85÷Ýyî\b>Æs,õA\83e\1cÔ½"\80x°BBÞZ®uh)M\9eÖ°ÐB¿XRȶÎ[ȯ)\.<9û\93ÿq]§QMÝi\18Àß$ì\ 6((H\95\82"\9bì\81@V,¸\81Êf\ 2\845@\ 2       !\90\10L\bK\ 2\81\84@Ø÷°Ëæ\ 2(¢´¨\8d\8cöh5x\989Óö\882\9dÎ\1c§\1d\9d\99NGǶsçöØ\ fÈ\87ß¹ç~zî}ÿï¹÷<\87gS*}.1UGfÎ5\ 5L%w\ 6]HÒ\87\8c%M\10F\12çÃ\86\12o\87ë\13\9f\10û\13_\10{\93Þ\10{\92\10bw2\12ÞõNØfÈ\19t\ 6)hßc£ÏQh\ao\85;à;±\13<\97ì\855\89\81\88h~·8Úf\99\7fÖq\91\9bòÑ|^\8eÛå\9cB\8f\99¬ÒÃ\93\19Rßq\96Â\7f$M\1d4\94Ú\1a2\90ÒKèc\8e\86w3.Gt2\96";\18\ fIm\8coI-Ì\1f#uL$²9\ 5\89@\11\9b¶@\12ì\0a¡}/\1f}\ e\81\rü(þ\0þrÞ\ e¾\949Á#\99'vå<ÁlY\1ces½$Îa¶è\9cóÅÂL·  N¾ÇX\9eÀk\88]æ;\90]\19Ð\9bY\17Ü\95Ñ\14Ú\91Þ\15ÞÊ\1a\8aÐ¥M\93\9aÒ\16É\8di÷)ê´\rJ\ 3ë\ar=\v!Õ§#\91ªw"6C\92l\ 1ÉÄ\ 3R\80\877%xxQ\8e\87õ
+<<©r\80ûU\1e\98Ûò`³E)Õz®ì¤ÃLiâî\vÅ,·a>Ûc \80çÕË)õëÌ\93\ 6´å*\82u9\1a\82\9d¨É\1a\88¬Ï\9c ×e^£*3W¨\8aÌuZMÖ?©ÕY¿Pª³\112\8a´\15r\ e}ÿìm\80ð¬àob\vøZf\ 1kÕVðPa\ f\ 6å~ÌRM é|%\19\7fQz|Ǹ$~÷\90(ŵO\98íÞ%à\1e\17ûê
+%\ 1ZnU°\9aSOPåµ\10\95¹½¤jö8¥\92=G«`ß¡ËØ_Ò¥¹¯hÒÜ\9f)Ò<\84ü\eÒf\b\13\9dA®%¼\16\98Ãz¹)¬U\9aÃ#¥%Ü«³\83e\95\ef¡î\88ÉeEä¶\89ª\98íò3»úÊ\19.\9dâ\f÷ÖÒ¼ÃMB¾¯Z \ ePñ+\82\95¼Ú°ê¦\b\9b\8eP%\9c+´2Î-º\88³\16%âþ\9d&âþD\15q\11\8a¨\0ýól\81¤Z¡»`\ eß\97àà+©     \18kÌàs\959\18\1alá¦Ú\ 53×àk2­"Z\8d*?¶ï¯\8aû°«"yo«\94u@+a{6\88\v}jKKü«K¤Áòb\ 5A*h\8c\90\14u\90Eü!j   ï\12½\98÷iT\11o5ª\88ÿ\1d½\88ÿ\96&à#\14\14YPô>\84e\81~\13L`C\ 4°&ÇÁ\83ZSXQ\9bÁr£5\kÚ\ 3\97´Þ¸qM\98¥¾>Ê®»ö\94SkMâ\1emeêþú\8aìCJ)×»ª¼Ø_V&    *\17W\13Ä"5QXÚN\12\94è©<á\f½@¸\14Å\15>B½ s\85oh\!B-\10"\14\14y3$Ã\14Þò0ðT\ 2`¬Æ½z\13¸­5\81\e:<̶ì\86É\96øáæP\8bÞF\9am[Ã\89\9dZUüGõJæ>EMæÁʪ|o©¼èHY\858¨T*\ f\15\9cW\11yå-$®¤\9f\92W6Ec\97-ÒsÊ\1e\94ý\15½¾Fï\11*\8a\82"o\86dãà¥\0í½R\80\aJ,\1848XÒá`¾Í\12f:\9c`¬ã ¶¿-ؼ£\85bÓÜtÌ¡¡ñ\8c³BÍp\93ק{\9c¯Ëõ\12+y~Â\9aÒ@~µ,¤ ª6<_Þ\1cÉ®è¥dULÐ2d\vôtÙçt\96ì[Zºì?Ôt\19\90!ä­\90\\80oJ\0\9eÈÑÞ©ÂÀr\13\16\16Ú1p©Ë\fÆ{\1c@ßã\8eíê\ e0Óu\92ðêöè\1dÊÖ¸]r]²Ky\13ë\80¨1dzX]àÃk\10úsTç\83Ùu
+BV­\96\98®ì&¥*Æ)LÅU*Cq\8fÆP|CeÔü\9b¬AÈ¿!m\86p\0ÖË\0¾¨\ 1øL\ 3p\ 3í~WÐþy¡\1f\v\83z{èÖïô\ e\1c1Õô\13·){\8fÚË»O9\95w&î)íHÝWÔ\96u° \85ã\95§\13øå4K\ 23´Õ!i\8d\9a0\86¦3"Y3JJTÏ\91ãÕ+¨\rr|Ã\ f¤\84\86ÿ\91\12ê\91È­^ñ\ 1þ\80\9eÃý:\80Ou\0WÑü)´ÿ\r¢ý«{ô\ 3h\1dsÁhF}pÊ\11\82¥|\98f+\19<áX¢?»\9bßÏpáôe\1c`÷ä\1dÊêæ{³ºÄ~ÌÎÊÀä\8e\86\90\84övÂ\99öáð¸¶+\11±m\ 6Ô3blë¿\88±-¿ \10b¬î}\7fFÏáqÕ»\19,v\0\DóG\86\0ºÐþÕ<e\rêéÝ \9cöÄVL\ 5\9b\95MRðÅ\13\85\17N;å\8f';g\8f²\ÓGØ\aR\87\v\ f\9d\e*õJ\1cªð=;¨ò\8fÕ·\ 6\9dÔ\ f\86\1c\1f¸\1czlàNhÌÀÓÐ\98þ\7f\84Æôý\1c\1aÓ\8b\10¶úºüÝ\f>i\ 1\98í\ 1\18\1f\ 4è\e\aÐÍ\0ÔÍZ@Õ\9c#HçÝ1¢¹\0\13Á\\84%wöc\eö\95Øí\99\97\13\9dÒ.¥:3.f»$Íp÷ÅÏ\bÝ㦥\87NNÕz\1d\9b\8d\9eÔû\1d\9d¼è\1f5yË\9f\95?}â\95?íÂO\ 1´q$\806\86\ 4nfDgpG\vp\r=\83I=ÀÀ\18@+\9a¯B;¨ô\ 6\16D7í xÉ\15xK>ؼ¥0³ì\9b4+ÖÍ\13\e\93\16\19\8eñ\8b\19\1f\9e¾\9eï|êº`ïñ\85r·è\ 5Å\81¨\85f\ fÚµþC\94k3\9eä\85eOÒÂ\1f=IW_zFοõ\8a\98C¼#fßw¯\1eÝÃv\80\99~\80¡Q\80\8e\7f¢ùr´\ 3
+oá\80s\17\ f¹+» kå \86µ\12\84\90L\93V¢-ãïÆáãî&Û\9e¼Ë²?f`;D\ex;£\fe»¨\86jg²A»'Òз\97h\98v       7|â\1afø½køg/]    ·ÿë\16z\vÙ¿Õ¯{x¥\17`\14ÝÁ®)\0Í,@å\r\80Ò[\0\9cß\99@ÚC\v8÷Ø\1e\92\8c®\90`ôÁ\9c6\12°§\8c4\93ãÆ\13f1Ƴ\16G\8dÌm4c\965Åȵ\8d4\96Ú\11W+·\87­jv\84®ö8\ 6¯Nî\fZ]Ú\19øäÉΠã÷\8e\81\8f_;\ 5<Bvm5ß\8dî\0º\83=\93\0Z4¿ê×üÛhþ=\80´/p\10¿f\ 1'\9eZñ§N\10½î\ eG×ý1ôgD,õY\14\8eôì¤IÄó\ 4Óðç©f\84çl\8b\90ç|Ë \8d\80\8d\91\8d6k¿?ý\9fí:\8djòJ\ 38þ¼I\80°%\84\84@Xe\v                \81\10\bA\89\18
+Avd\93\9d¸à\82\ 5qÇÚ£cÕâR·¡BQ,r° î\80\ 3V+Å]ZÆ¥Ö­\ eâ\88+\82 È&\95g.gúA8ýð;ç~ûß÷Þçýp+Y²'õ,YÇU\96GG\aËãñ;\96´}\84-mÿhö©Cc3X\r°ó$À\ 6rþ+Ï\93~\véß\0\88¿CAØ\7fô!ä\15\e\82^   `Z§\v¨;e0ùµ\92RuM¥\94]Z\9a¢;\8a.ïN¤{¾É`x¼ÉÖ\93¼É×\13÷¬Ñ\17õl1\10ö\96\18¸öV3]Þ\9ef:¿me:½{Ætêíc:õô\8fóýØ?p\ 2`#é¯ú«\9fq\13`Æ=\0m\e@`§\1e\ 4\f°À\7fÀ\12\94\83\93@1(\ 2ù\90\17È\86\95\94dXM\89?\ 4Sn\1fÂi®#q4ç\91TÚ¤?çÐíÿÌ£Û~\C·\19ÝÂ\10\8c~Ç°ÂC\fKldðñ\1añ\98x:NÑq\80M\8d\0\ 5Í\7fõ\7f\ 3\88}\0\10Ü\ e0ù)\80ï \1d¼Ñ\ 4dh\ e\12´\ 6\11:\82\10ÝÀ\19=`\12\1eý)[\f¤\ 4\18BYb\14e\81\89\14\17³(\ eæÐÌ°\80ÆÂB¢\98f\8a\ai&x\92h".\8c\0°\9aÌߢ±ó¿Mú\ f\ 1>{\f z\ 6àÙ\v¤\và\86LpA\168"\974\ 5`\83ö`\85Î`\81\92½pÐ\eÌP\ 5,\f\ 4\13ÔRF\18C\19`
+ÅÀl\8aÂ¥\14àzb'±\8f¨&jÆA©'\85^R
+½¥4TxÑP®¤£\97\86\8e\9eQ\fôHÕGÉ<\ 3\14/c¢h­\11ºm6F·Ý&èVj\8aÂrâ\a\16
+\8f\10µl\14\9e&\9a\89\16â\1eñ\9cèe\8f
+\87Ù#nÈ\1e\1e#DÎÐÿ\99\7f
+e¤¯\10SèëNC¥\aáCCß@:*"\18è=S\1f½æ\1a ,ß\10¥k\8cPºÉ\ 4%;LQRÌB÷ýlt¯$jÌÐý\84\19\8a\e\88s\1c\14_%nsFÅ\1d\9c\11÷\1eÎ\90û\90Ù\80\ 4ÍÞ»£9ÁísG^\9fx<\94\93¾RH¡?1YLÃ)Þ\84\9a\8eþÓõÐ/A\1f}u\ 6¨øÜ\10½W\99 ×W¦èµ\8d\85\9eElôÜk\86²\ 3\1c\94U\11GÉ·Ô\9b\8fÊÎ\98\7f\94]2\1f\91Ýà\ eÉþkÞ/ë6\7fë9hÞã\89Ü72´è\96!¿K\86\96\13¡ÏXß\99B51UHC\8d'áOÇÀ\10\ 6ªcõqJ:\13ý\17\18¡ß2ST®e¡o¡ÙG\9f\9d\9c?}\8aÍ?(ös\87\15\95Ü!E\roPq\927 hä½W4óú\14­¼^Å#^·â5ï\95Ï\80Å\v\ 5Z>W ÕSo\14<U u\87÷x¨\1aëO¢Pã@a\bY\87\92¹\b%3¡\9dÆÀàH}Ô$31p®ñÈÔŬá\80Õf\ 3S6pÞOÞÆíó/â½õ/åõª\ eX¼QUñ»UÇø]ªSüNÕ9þ+U\vÿ\85ê!¿Ã¿\93ÿXÕoÕ¦Bë\87~hûÀ\ fíî\11wýÐþS8e¬oKúÖ\14F\90u\94\88Âhr\1fQ\ 1\f\f\ fÕÿ0=\9e9 Í2~\17\9cÃê       ZÎéÒ¬åvN+ä½\fÜañ|j1ÿÙÔ2Ë\ eu¥Õ\13õa«Çê:«võYA\9bú\8aà¡ú¾õ]õ+ëßÔýv×Õ£\ e­\ 18é×\0tlù\e\188Ö·$}"Ö\8eÂx\17
+\13ÈlÆûÑ\ag\ 4é½\8d\8ebvE¦\1a¿\fÏf?\9b¾\98ó$t5¯=ä+~[ðVË?>Û-¸\1fTj}'¨Ü润Êö\96æ¸Ý\rM£ýuÍyûVÍM\87\96 g\ e\97\83ú\1c/hF\9d\9b5èÒD\9cÓ ëD\18dEa\18\170\96\a\98$\0L!g\91\ 6S½i=ÉjÆËÄ0\83\8eøD£G3t¬\aÑ9æ¿G.çß\8cøÒêzØF\9bÖéßØþ\12Zd\7f-t¯Ã\15m\85ã%m\8dÓ\85\90Zçó!?9ÿ\1cÒârNÛîú£¶GØ \1dq;¥EQ=QGÔN\80Z\vÀ(òîM4\a\ 3fÚÀ°Î\99êÑI©ç\99Jz{z°Þý\94X£[3ÓØ­    Ù¼kqyV\97cWÙ\\8cYg×\1cýµCSÔ\ eÇ\9f"÷8\9f\89(s9\1d~PØ\10~ÔíTx\83¨>좸6ì®øxx§û\91ð!IM8J\ eE ¤úo`\18\927g\8a\19`\16YÏáûl;x\91í
+\8fæÊ©ßg\aêý[\17at5#\89}!UgÑ\94¼Pp6i\89íé\84Õ\ e\rñë\9dêã6»ÔÆî\12\9e\88-\11\1d\8b)\17\1f\89>$©\89®\93VG7yTE_\97UF?\97UÄôËÊcPö=±\7fLìx\18IÚ     ¦\80\19d\1fsØ0<\9f\ 3¯\17Z@{\8e-ÜÎ\91R¿.\98¸\9c\1djøóì8ö\19]ºECF¶ .-×îDÊ
+Ç£É_:\1fNÚ ¬NÜ&ú!¡È½2~\9f´"¾RV\1ewÌs\7fÜ\8f^ûâZä¥qOä%ñïäÅñ(ß\93\80òo\13Ðk"\8c!ídc@\9d1\8cÌ3\81ÞE¦ð4\97\ 5wóøкXD]Êõc\9c[\14lظ \86]\97\9dlq|ö,ëú\85öÕ\99ù\8e\a3
+\+ÒÖ¹\95§\16º\97¥ì\90îM.\91}7ó\80×\9e¤ÃÞEIÿRìNºì³+©ÍgÇÌ^\9fí3?*¾IÆ1Þ\84üS8Ã\84Ì\81!9\ 3&¼Î1\80¶<&Ü_b\ 47\96ráÊ2Wªi©\ f½1_ìÍ\8dd\1dÍIäUÏÏ\14TfgÛ\1f\98\93ëT6k¹ë^Ý\1aQIæ\ 6É·\19Û<þ\99^äµ3­Ì{{j\95϶Ô:ß-©ç\95\85©w\95_§u+7¥\8dønJG\9f\8dé¨\98\bã\8dÈ=èCÿ<\ 6´çÒáÎR}¸¹Â\10ZVr y\95\13\9c^)§×.\9fjpdI\18«*/\8eWñy\9a`ÿÂÙv¥ós\9c\8aç-q-\9a[ Ú5g\9ddû¬BÙVÝ.¯ÍY¥\8aMY\95¾\e2O(×g6©þ\91yKµ.«ÓomÖ\aåZ\1dú\12>\13a"\93Ü\ 3\ 3^.\ 4ø#\9fNúzðK\81\ 1\82\rg×8@ý\17\9e´£\ 5\ 1\ 6U+´¦\15Ëb¹eùÉV%y:»¢Eó\1dwåä¹n_°B´uþÿÈ.Ϩ¨Î<\ eÿîÌPD\9a ½H\a)#\ 3L\ 1QA\ 5£\ e, "  t¤ÃÐ\86\ 1FpF\9a  \82RD\8a\8a *\821\16\18Qp]÷¸f\83%'nìf\8b\89=Gß}ý\ 6æÃsîÇçþÛ=÷WâR\99¤à*\12êxåñ-^òønAIÜ\90°8î¼·4î\86wQüSQQü;aQ\ 2\11Pø_B6ª\80Ä1x\90\ eüCÂÂT\11\aßÉT0^ª\85¯Ë,p¢Ì\95Õ_â­Ú-]©ÙQ\18¬×\9a\17\94\em^\9f\9d`U\93\99fW\99\9eë¤H+v)O­à\96m«áÉR\9a½\8a\92»\ 4\ 5I\ 3¢¼¤³Þ\92¤)\9fܤÇÞ¹ÉoE¹ÉD\98\9bB\ 4\14þLH$\vo\12\80æ­\ 2\ 6\1326.Ê98»]\13Ã\15¦\18¨pfõn\17ªt\96.\9fÛ*[;¯©h½Q]Á&³ê¼8+eî6»ò\9clDz¬B\17\9c[\94QÅ+Hoò\92¤u\b²SûE\99©g|2R¯ù¤§>ôÉH{-ÊH#B\8aàKÈ&àE20\9d\ 3\\97\ 2ß\96±p¾\82\8d\1c\f)\8dqXéÄt)ø*û+ü4öÈWëÖ\95\86\19VË"Í\14Ò­\v\17\96äg:Jóò\9d\v$¥\IîN^vN\83WFv» -ë\88h[Öi\9f\94¬ \9fä¬\7fQ^\89\88\90\12\12\ 3<L\ 5nÑÜyµ\ 4ø3ýí:£dp¢R\rýÕ\ 6讶gÚ«<9Í;\97ΩW¬Ò©.\ f1PÈ7\9aÊËb,e%\896EÅé\ eyR\89sN\91Ì-³Pá\9eVPï\99\92¿_\90\94wH\94 \19ñ\8e\93\89\93üDùM\14/!B\8aàKH,ðS\ 6\9dC!pY\ e\9cW\ 2#4{\rԲѻK\1f\1du¶LË.wvC­¯zMu\80¶¢2X_®Ü`,Û±Ù¢°"ÞZ²=Õ>K\9e³0½T꺭¤bQ\92¬Ö#¾¸\95¿UÚ+\8c\91\ e\8b¢¥\7fñÞ,½ï\1d-})\8a.ú$\8c)"\ 2
+\7f\13\80{ÙÀd1pq\að5õ\1f¯£¹k7ÐÙ¨\8bÖ&+46rÙ5\rÞj\8aú\15\9aò:±^qí:£üê(³\9cªX«Ì\9d)¶©Ê,ÇdE¡Kü\ e9wkE5/º¼ÙsÓönA¤ü\84p£ü¢h£ü\ e}þO\18QöQ\10QFø_ò,\85Þ\ 3\9dÃ\95\83\14õ÷Óüw \99\16m4¶\9a£¶Õ\85¥l\11ªÈ\9bý5¤{Vëæ5\85\1ad7D\98¤ïÞb\91R\9fd\9d¸+Ã>¶6Ï)¦¦ÔuSuå¢\88ª&Þ\86Ê.Ïu\95Cü°Êq~hå÷üÐ\9dÿá\87)\7f÷
+S\92ÏxÎägz\937è.^úÜ\83\18õ÷ì\ 5Zi\ 6ÜÝ>\175\9dÆPt:2e\1d^\1ciûRuIÛ*­¬ý\7fÒKÝ\17n\94Ô\1am\16¿7ÞrKsªÍæ=¹ö\91M2§\r\8dJ\97°Æ\ 6nHC§{pàOÜpÁCÜpËC¼ûß\1eâú\ f\1eâ:Â\13ï\9aÍ=z\ fW?÷ 
+\18¦þÃ-4ûµ\ 1\r]@e\8f*Ê{磤Ï\96)ìsgçö.VÍèY97¥[¬\93pp½þÖ®(£è\ 3±f\91\9d)\96á\9dÙÖë:¤v!í;\1c\83Úê\17®ikwýªí¨ÛªýçÜ\ 2Ûnº\ 5î{á\16Øú\9e\eØBþÀßé.^RÐ\1eÔÓ=¤õ\1fl\aöR\7fM\1fPz\94æ¿A]H\ 6-\91\95I\1d\14r\12\aýÕb\a\8d>\1aª\13u4B\7fcÿ\16ÃuG\92LB\8ed\9a\a\1d.X°æP¹õW\87\ 5\1cÚï°¢¯ßqyß7Nþ}7\1cý{\9f;úõ¼sòë&\vý\ eÎæ\1aíÁ9:\83\13tþ½´þ}\a\81ºC@Å\0\90\7f\12H\1fÑĶQc$\8e:2±£\9e¬\98Ñ%\9c¨Ñ@µð\91`\8du#\e´BF6ë\ 6\9d\8a×_s*ÍpÕp\9eqÀp\99éò\935\16~'[-\97\9e<lå{ò\fåº\95ï\89§V\8b\8f¿µö\19"6>Ç\88íL.Ø\ 4\1c¡óï õ7\1c\ 6\14Çhþ\e\ 62h\ e\8d½ \82è1=D\8d[!bÜ\8dY?.b\85\8e\ 4\8f¯Q\15\8f\87©¯\1e\8fÔ\b\1cߪ¹r<EÛ\7f,gÞ²±\12}ß±*\ 3\9f±½\86¢±>#áØicÁؤ±ðÂ\13#þù7&üsÄÔë,1\9bÉ7ô\ 6\aö\ 1]Ô¿\87ú+©_6\ 2d\9d\ 5âÇ\81\88Ë\1c\84\ÕDÐU#\88¯ÙcÍ$\ f«&\173\ 1\93+Y+&ÅlÿÉõ\9c¥\93\9bU}'\13Ô|¦2ç\88¦\8a4\ 4SJM¯©&-\8f©\1emÞÔ)\1d÷ë\13:îS\8f´\17]{­Ã½úq\1ew\82èÍäx+Ð}\80î\0í\7fõ\10P2
+d\9f\a\12.\ 1\91W\80à)6\ 2nªcémm,¹m
+ßï\1d°ø\9f<xÿ°\18¢é\0F0\1dÄð§ÃY\9ewbX¼;)l÷»\12\ e÷®\Åõn\9d\8aó½NÕ\85÷\86T\9dî_¢ü¨êx÷¿j\ eÓïÕ\1d~ø4g&}\9dt\a¨¿\96ú˨?ç\ 2\90ø-õ_\ 3\82þ
+¬¸ÅÀgZ\15ü\87Zð|h\bÞC+¸?r\ 6÷±'Ü\1eûÂåÉJ8?\113NO×3\8e\19ûgÉ,Ûg\12\96Íór\96ÕóFö\82\17Ýl\8b\17§Øæ¿LP\1e°Í\9e¿d\9b={?\8b6ºÿu´ÿòÓ@î\18õ\7fGýS\80ø&à\7f\e\10Ý\ 3\16=`Áí¥\16\^êÃéWs8üj\a»ß\`óÊ\ 3Ö¯¼±àµ?,^¯\86Ù\9bP\98¼\8db\8cÞ&2\ 6ïr\99ùïË\19ý÷M\8cÞ\87\1eÖ¼\ f#,Ý߯PîS\9eÍb÷ PNë\97P\7f\12í}$­}í-Ào\1aàÿ\b¸þ\f\ 4ì>iÀ\9aèb\ 11\8491\87       ±\81\11q\82\ 1áB\9fð¡G|¡KV@\9b\88¡EÂ1\97Äa\ eÉ\82:\913j¤\81Q!\a\19\ e9N¹À°ÉÄ,vP\7f>õ'S\7fÔߨ\9fÖ¾\8cÖîù\0\b°þ\ 5°ü\b\98\12\15êÔ¤N]ê\9bO}&ÔgI}¶ÔçD]\¨Òwa\93%\0      ¤\84R¢)i\14\19\85~\0\b=>B\aO\8eÍ\828º2ÄÙ\99!.\14g.C\1c¼XÄ~\19\8bØ®e\13ë\b6±Jà\10Ël\ e±\90Q\94*Äâÿ\×iTS×\16\að\93@H.!\18\90y\ e`bÈ\r\11´F\ 5d\90A@A\99\r4\faJ\98"c\1aD\10'(\8a\82
+\8a(\82â\80¨Pë\88\13\95¢Ï±´Úê+\15\95ê\ 3\87§\80â\0¸ß±ë}`ñá·Îþ¶ï:{¯uî¿\12«ÁêµÀ²I\v,\ ecÇé`ñ#Ö\81]ÅîÐÁ²\ f{I\1f·|OÿdùEë\83\15Ð?X\ 2\12\88©\80\8f{\93<
+8b¯µ3þ\1e7*ðý5\80\17®\ 13â5Á.C\13lU4°-¥\ 1§B\v8Û°::pöaÍØQ\ 6pÚ±³X'v\931Îée|â\f2F9ï\18\13ôa[ \86lA{\88\ 3Ì·S\0É¥À,\9cs\9dì0\;\8bð¹\80
+"_\r\10\86h\80@ª      |9\rfæÑ\80\ 5¼2:p·b5\fàîa|áî'&¸G\88qî b\8c{\9aø̽D|ä^'F¹\ f\89\0ñ\867B¼æMh¿ä\ 2ó\ 5\17X\83Ø\0\17t'\ 3\11î=\eçÜo¬) Æõ<<\9byb*Ìõ¢Â\9c \rp\96h¬$\1a8*µ¾\b\véãÂu\8cÏä&â#¹\8dø@îÒ\1e\15ìÓ~'8¨="he\ e\vN2\87\ 4\1dÌ7\82\7fÉ{Ì\17äsæsr\98ù79ÎzJ´'$°\1fc}$èM\ 6³¿ö6§À\ 23
+¸áoq\9f\89áy¸-¤\82\v\9eÇüpÍ1q¼Ö\87oÒéïçä3\86g\17\13o\9d7j¿qÞÂ|í\Ã|åT¯ó©IgÐé\88Î\80S\eë¹Ó9Ö3§«¬~ç\1eV\9fó3\9d^ç¡i\ f\9cÆõî;\81þ¯N0½Ç       \f~\99â\9fþ.Æ\bÜ\8d\10,²À+\8dçâ\8bwÓ{>uÜË[cÔ}\99æ\90[\8cÖk×\14ú\v\97\95ÄÀ\ 2µö³ùk\99ýó*t\9eΫf=\16ïbõ\89\etÿ\12\1fÔýS|lÚù§Ù\7fÌídß\9f{\87Ý#î×»-\1e\9a~C<fx]\fFÝb0þY\f&]SüÓßc:\ 2\1fÌß\ 4Á\12\e\8c\1c8\9b2¼x!õ\95o\80æ\7f¼#´ú\17%0ú<Óµ{=òt\1eº¯fÝ_¸aÚon\9bÙ=nÛõîºîÖ¿íÚ4ý\96ë\11\83\e\ 6×]:\f¯¹\7úٵרÓõµñ%×O¦\1d®`vÞ\15ÌÏag§\80\85\ 6\b¼Ù\b\ 2ô\10\ 4ãz¹9\1a\v±CCË\85\94Áày\94§K}4z\ 3\97Ó~÷\8faôø%3ïø*uoú¨Ø×½Kô»\17m4èòª4¼êµÃ¨Ó³Þø²ç\ 1\93\8b\1e­¦\17<N\9b\9d÷øÉì¬Ç¯æ§<\aÌ\7fð\1cµló\ 4«ãØ1¬u
+ð½ýX¸¿.\82P\G\18¢\91H\v4\101\ 3=\ ew¢ü\11êN½\e²\84vcY$Ñ\1d\14ϺºDÁ¾\12\90­\7fÑ_mر¸Ôè\9c_¹É\19¿­¦§|kÍOú6X´û\1c²lói·:îsÁºÕç\96u\8bO¿Í!ß\11N³/pöû\82m\13\ 2\1fÜ;\10çÞP\1d\ 4\91,ôIÂF/£\rP\9fÄ\ 2Ý\93\bÐ-\89\vµ;j1­3"\94¸\10\16Ã:\17\92¤wjY\86ÁÉà<㶠U¦Ç\97®3k]RaÑ\12Xmu8 Îú`À~Î\ 1ÿVÛýþgí\1aý»í\e\ 2\1eÙï xk¿;`bÆ®@°ÿjç\14°\18÷\ eƹ7\82\81ÞG\13hPª\8dþ\96²ÐýXCt3\8e\87ºbçR/I\17ÑÎF\a\11\88Òm\8b\8c×o\r\97\e\84)M\ e\85ªÌ\9aC\8a-\9a\96o°Ú·¬Òfop\8dm}P\83]]Ðá\19;\83Nrk\83~âí\bú\9d·-è\15¯*x\8c·5\18x[\97\ 1\14\10@à; ¡\8f\12Mô4V\ 3ý;A\vÝ\93\11è¶L\1fu%Ù¡\vIÎÔÓ2\ fZ{| Ñ*\rÓ=\1có­~st\92\8at\93\86¨\1cóú\bµU]x©Íΰïmw\84UÛo\vÝÍ­
+iæm    ião\ e¹ä°)ä\17\87ïC\a\1dÊC?ñËÂ\80¿1\ffN\ 5Khø\ e(h\10?/½2*êI¡¡[©tÔ\9dÊF\17\156è´\DiKuÕlIò#\9aeËY\8dñ\12ý=±ñFuR¹im\8cÒbGt\81Uµd5gë\8a\rv\9b£*gTDÖòÊ#\eù\e"\8e       ÖG\9c'×FÜ"K#\9f\93k"?\bJ¢Àáÿø\93A0\15M¬@èi\1cB÷SpîUh ît\1aº\92®\8bÎdX¢¶L\92Ò\92>_³YáÍØ\97\1aÄÚ\9d\1c©W\9b(5Ü\9e\90dZ\15\97nQ\19\9bcU!-ä\94\7f[j¿!¦\82».zûÌ5Ñ{\1d\8a%-d\91ä\8cp\95ä_\8ejI¿£:ú½P\1d\ 3äw1 À§Ãd_\9fØáh\84\1eáÌwW\81еL*º¢ÔDç\95\87\95fèèJ>¥Y)ÖhÈô¢×¥\aêÔ(ÂôªSc\f+\93e&\15Iró2\99Òj}\82\8aS\1a_l_\12WÆ-\8a­â\17ÆÖ\vTÒCÂ|é)Ç<i·(WúD\94\e\98\e\vdn\1c\b¦\82P\84\ 6¤\b=Äwp3\ 3¡«+)¨#\87\8a\10èX\9e1:\94Ç£4æÎÑØ\9díNß¡ôgVe\86°7¥¯0(WÄ\99¬\97§\98\97¦fZ\15'çq\8a\92\8aìÕ\89ë¹\ 5\89[øy²:AvB³P\99pR\94\95Ð%ÊLx$Ê\94\r;fʾ\b3e@b\82É \1c¡gx\ e¿ÉqÞR"t\19gÏ3\ 5\14ÔV@G\87U\86¨é;{T¯r¦Öä»iUåú17e\aO+SFN_\97%5.ÉH4+JO³T§åØ\14(Ôv¹òµÜìÔÍü¬\94Z2#e¿cZr»H\9eÜ9K\9eüç,yÊ[\91<eB(O\ 1R\91\ 2\82ɾD!ôD\86ç\80sgW\ eÎ|*\9c\b\1dUk¢\ 3\85úhï*[´s\95\88Z­v¡mRùho,Xª»6/\¿8'ƨ0;ÁL¥\94[æe)m²3UvY\19\19é\15|Ez\8d 5­Ñ19í\84(Qqy\96\ 1öF\94\986.LL\ 3aR\1a\90\93½Ã»ðW2\9eC\16BWòñ\1dàß®\138{\1d\MA\rÅl´«Ä\1am+\11R7\17ϧ\95\15-"Ö\16\ 6²V«CõÕ*\89Q~A¼iN^\8a\8527Ó:#'ßV\91]ÌM]Y>3I¹]\90 Ü'\8cË:&\8aͺ(\92fÝÃ^ãzL\18\9b\ 5\14/ñ.<Às¸\96ý?¶ë=\1eÊ|\8f\ 3ø÷¹\fƸ\8eËLÌ\8cË3bf0F\91\15Q\9cPI\85\92.\8a\93­\1c])\92\88)¤èB[(%]ä²Û\95êìn\89v·­Dm¯¶v\1d\8eT[ÑUJ\97ßù:ûê¼´¯óÇû5ó×|\9eßç÷{\9e\0ÿLÅ\ e\83,\9c9Ðîl#(ÒJ¡@«¢r³=Ùì,\7f½u\99!\ 6©\19SM\92Ó£ÌW¬\8d\11/I[`\9d°æ\1f²\85©Iö\v\1dbWç8Î[µ]9'y¯ó¬äj×è¤sê\99É­ê\99IO\g&\r¸D'\11\1aêþ|\80ÖÁ³\88\1d\9c\ e²±\ 3\9cÿÊPQ®\ 1\14ä\r\83¼<'*;o$³.g\8cnêÆ AÒ\860ãeÚéf\89YsD\8bÖÇYÅg.\96Æe¬°\9d·n\r7'];<zm¡"*­L5=­Ê9"í\8cKxÚ5\97\885\8fÐ[ç\88\8aL%Ê¡:\17à3a9\9eE<\ 3'qíÕ9ØÁ&\9c»ð5xË\16\14XBV¡\9cJ/ÔÐ)\ 5£y+·\ 4ò\97n\9ed\98°)Âô˼h\8b¿çÎ\17ÏÏYh=wã2Ù¬\r)vQÚ,y¤vËðiÙ%\8a)Y\87\95aYõªÉYWÐCÕäõo\94a\99d\90b¨»\83Ï\84d\80³¸\aß`þ¡ÍØ\ 1Π\85Û\06îàAf\91\10Ò\8aí`u±\vµ¢Ø\8bM,\1a§»hÇ\ 4Á\82íS\8db·E çn\8d±\98U\18/\8e*H´\8e,X%\9b¶%Ó.ls>\17\9a¿ËabþAÇ\90üSNÁù\97\9d\827=p\fÉëw
+É%\8e!9\9fkųx\ 1Ïá)-v\80ùû¶b\aE8{â\1cº®\ 4`u©\11¬,\93ÀÒ=
+*¡Ì\83\8e/óãÅ\96\ 6éÅ\94\84        f\97L7\8eÚ=[\18¹+Î"|W\82hÊW+­Bw¦K'\14çÙ\ 4\15\17Ûý­¸\92\v,:Á\ 5\14ý\88º¹\80í}ò\80mD\1e°õs\97±\83së±\ 3ì¾\12×^R\8c\1dà(\92\8dshR\ 5À\92\ 3\ 2X\)\82ø\83\ e\10wPCÅT\8effU\ 6ò¢*'êE\1e\b\17L;\10m\18V1ß$´b¡Ù\84ýË-\82ö¥\89\ 3÷m´\1aW¾Câ_^!\1dS~\æ[~        uI}÷¼\92ù\96\11\e\9fÒÿ²ý¤q-v\90\vP\85ëß»\13`G)@N9@\1aΡK\8f\0ÄÕ°\10Sk
+³km ºN\ 53ê<©\88:\7ffjm0orm\98îÄÚ\19ü\90Ú¹\82ñ5ñ\86\815K\8cÇÖ¤\98úUkÍ|ª·YxWï³ü¢ú\e\91WõE\91×ÑNѨª\97âQ\87?\ eó<D¬\86:\8b{P\87û_\81ù_a~þ~\80\8cC8\7fâ\1cúå×8ÿá,\18\0¦Ö\8b ¬^\ e¡\rn0¡Á\9b
+n\b Ç7Ld\ 2\e¦±c\e¢uü\1abu}\e\12øÞ\rÉ\ 2¯úõ\ 6\9eõ\ 5F#ë÷\18\8f¨¯5v¯¿`¬©o7Ö\9c~aâvò½©Û  "Df\9f\1c/\08\88ý\97`~\ 1v\9f\85kO®\ 5Xt\ 2`n=æ\9f\ 3\b\83\80F\13\18×h\rþ\17\1dÁï¢;\8c\ 1\9f¦@Ê»)\94òj\8a¤=\9bæ0\1eMñì\88æe¬¦y­\8eºy\93\8eKs\89®ªù¨\9e²ù;tGOÙôLOÑø\8eït\81è#Á'G0\7f\ fæoÃ|m\15@
+®=á\14@\ffG|\ f\10r\11ÀïG\16<¯òaÄ5Spo\91\80¦Å\11Ü®k@}Ý\e\[\ 3À¥u\12¨Ú"AÙ\16C9ÝXD9ÞXE9ÜÐÒò\9bE´ýÍC´Ý/gP\em{ã1mÛö\9a±i%ìPå\98_\84ù9\98\9fz\f ±\ 1`Þw\98\8fÙ!?\0\8cù\19Àã:\ 5.¿è\80Ã]\ 1ÈÛ\85ÀµKÀþ_\ e`×á
\1d£À¦Ó\1fd\9d\13@úïp\90\ 5ë®Å`u/\ 5Ä÷r)Qw        ey¿\86²¸\7f\9e2\7fð;eÖý\94\1aøÌNÌÏÃü4Ì_r\ 6`þyÌ¿\ 4\10|\19À·\ 5\r\0å¯\0öí4È\1eë\83ä\89     X÷\88`X\8f\r\88z\87\83\v\98\0³g¾`úl<\98<\9f\ 2ÆøBbôb\11\18¾L\ 1\83W\9b@ÐW\ 6ú}uÀ\7fÝ\88~\ 5½¾\9eÏäc~úq¼\aÎ\ 2Ä6\ 2\84û\7f\r`t\e\80æ6\80ãï\80ë\ 4\18ö\10Àò\8d\ e\98\ f\18\82ð\9d\10\8bÀè½\14\f?p`ðA\ 1ú\1fÝ@\8fx\81\ e\19\v\f\99\ 4\ f\99à\9f!Y\8dò\10\16Nð \13Üd\82\ 1¤å\7f20\7f9æÇa÷Ó±÷àV\0ï[\0jÌvÀlI7\80ù\1f\0¦ý\0Æ\84\ 2\a\ 11Ä<\13Ì3Ç<1þ\8e\fqH\89Ü\91\ f
+B\11\b_\f\b¾\14\90\r\b\1f|\ 4ozrü3Ä^A\11Î\11á¬k«¢\88DC\11+_\8a\88C(b9\9d&æ±41[B\13a
+ÊBùh;Ú\8dö¢JT\85¾F§Ñ·è\at\93þ ì¦\a\84Ïé~á\0ÝgFèWf\84ù\7f\88\1có\87Ëÿ4øÝ^\8d×âM\11Ùx¼\9ep\9aXÅÐD¼\98&¢d\94\81rQ!Ú\89ÊÐ~t\18Õ¢\13ÌGÑ9æ\83¨\99\19\10µ2ý¢{ô+ÑSú¹x\80~*&L¯\98°\83\847\14qä(¢À9w\90\13\87\9f.\14q\1cE\11\87\0ì&\8c&v³hb\13O\13ér\94Æ\10©\16mf>Jw0ï%»\99w\92rf@Rɼ\95\1ceú%Ç\98×\923L\9f´\91y)½Æ<\93v2O¤½Ì\1f²·ìC\19áÝ\97\11\9dî?é\ eET6@\$È\1a\88+^\87Z\81FRÄÙ\8f\894q\9aA\93á±ô\a\87Df@¾\9ayÃe2¯¹\¦\8f+d^rÅì\v®\94}Îíg\9frGØ^®\8eíáN³\8f¹ïÙGÜ\15ö\ 1×ÁvÉ{Ø\ eù[\9dv9ÑýMNôîÊ   ÿÎ_\10WÌÖ\88ð(Y\ 2ñÀkñt@¸\1f#q?4ã©wêit¿Ë\1cú¥óBæ\99j\ 5Ó«Lc\9f(µì#e>ûP¹\9d÷@±\8bw_±\97wOq\90×¥¨áu*Nò:\94ßòÚ\95\97yw\95í¼[Ê\1eÝ6å\e~\8b\8aè_U\12Á\15%1øù/\88;æ{\b\81x¡Ñb ¾Ø\85\8f\12>\8eö ú¿\18K=÷\f¥\9f\8c\8c¢\1f\8e\88cºÝ\13Ù.÷Ul\87&\83×®ÉáýæV sÇ­Xç¶[©î-u\85îMu\95^\9bú\98ÞuõY~\8bÛ%þU·Ûü\9f4\8fôÿÃu\9d\a¥yæq\0ÿ\81x"\88\8a\17*Ê¡\99ív²\93lC\ e5Þ¨x\0\1e \80\80\88\b\82\8a\ax\12Å\83\18¼\88J\12s`Vm\Í\1dcl®ÑT\93ÉÕf3iw\9aN»Ùl¦×¶\99Ý´M»\9bnûîc·\99µùã3ïûßwæ÷<Ïû>ß\e\9b¾÷]Ù\84\91¯mÂü\96\91¥ÿ¡¼\84q\ 2\ 1Ûî\aØN
+`ÉTÀRi\80¥°àyòFxºs\aî³\ 4.îq|\ 1þã\1d\87Ûµ\84÷¶ÕyÜßÖêyo«Õë\9d­}Þw8Ã>·9û|nr\8e\10ol\99ö½¾å\84ïÊ\96\ 5Òµ-ˤeÎ=òUΧä\8b\9co)\8b\1cÌ\7f\81\83\ 5\9cç`\81ó¯À¶£ì\ 4"Ê&¡#\8dÞ3©ð<#\ 2¾äÆÂ\93´ÍðQZ2î½Ô\ü½äbÂ\9d$\95ÇÍD½×õ\9d\8dÞ+   mÄk     Ý¾KñvÒÕx\aùrü~¿Kq\13\94·âf(\17âÎø/Ä]\ e\98\8f»\15p6î¯\81§â\9fQ\8fÇÿ\184\e\8f\ 5ÿñ\173ë`       (;Å\v\0\96í\v/rüà«\1c*<æEÂ\9fy¯Ã»Ùq¸[¼Lüjf\ 1a9£Ôó
+Wã})­\86¸\98j&-¤ZÈó)=\94³Éýþg\92G\ 2N%\1d\f<\914I\9dK:\1e4\9bt!x&i5äXÒÃ\90©ä§¡G\93\7f\b\9dHÆÂ\È\915)XèKX\927`\wÀrÜá\19ß\13>\15\13>     Þç\aÁ]á\ 6¸.äà\96\ 4©øKü<÷\v¹Å^ó9e>gx:ÒÉ,£ßñÌfÿÙ\8c\8e\80\99\f\eõMî`Ð\14×\19ü\87tWèDúL\98\1cípú\12í`úýð\ 3é_\84ïãþ+ÂÉÅÂÇ\90Ñ5\19ÿ\87¥ |\1e\ e¾\16 ¾U\88\83\87"wxPä\rw\8b\ 2`EÄ\84+â͸EQ"þ\!ÏýdA¡×\9c°\948#P\93§ó\f\94ÉÜ\86\80\89\9c\91\1ckð¡ì=!ã¼½aûyã4gÖTøhÖ©È\91¬ËtGÖ]ú\10ï\13ú ï;z\7f6¶&Òþ
+,\1d}²sQçD\9fö\87%¨óIÝà¶Ô\ 3V%~pYJ\87\ 5ÙFÜii\1c~NÂu?V,ð\9a\14\95\10'\8a\94äÃ\ 5ZÿñüÚÀýBs\90S`       \19\15ô\84\83´¡¼}\11\ 3y\13t{Þ\T_Þbôî¼\9b\8cÞ¼¿1zøßDwó±5Q]\82\9fÑ_Zûµ|#\ 4x\84~s÷K\ 1n)ñ°¢$ÀU9    \16\9448Uö\1aÌ*·â§å©\84\89Ò\¯CÒ"â\81\92R²³Xí?"Ö\a\ e\8bê\83\a\8bZBû\v­´¾\82=\11\82\11zOþᨮü\19FgþyfGþ*Ë\92ÿ\17V{Á3f{ÁO\8c¶BlMôz\18\ fà\v4\83\ fe¨ë Îµ¢F\9dO\8d\87\vå>pZ\1d\ 2³\15\e`Jý\ 6ÞU\9eD\18/ãy:\15ùĽr y¨´Ì¿_ª\rÜ#©\r\95\98C{\8a-4k±-¢C<L·\88Æ£ÛDÓÌ\16ÑYV\93è\1aÛ,ú\90m\12ÿ\ 3ù\91e*Æ\98\b\9f×A\fð@\ 1p\13å/U¢Þ«\ 58[é  ³Z*LéØàÒnÆ\8dW&\10Æ*2<\1dj¾Ï\80JLê+\93Sz\15\15\81ÝrCpgiC¨¥´\95Ö&ë\8el\91\ eD\99¥û\19\8d\92IV½ä4»N²\14c\94¼\1fS+}\8aü\87U+Å\98¿`¼ô\82\8fö¢\ 4í\ 3\15À*Ê¿¬G½×\0\8a\0Óú\0p\19\180nø\1dnL¿ÃmX\97æa×æzÛ4E¤î
+\19¥S­
+´¨tA­*chsY3ͤì\8clPØ£\8c\8a1F\8dü(Ë ?\19£\97_\89­\92ß\8fÕÉ¿\8a©RüÀ®R`,\84¹Þ?ó\ 1>Fûà\ eê\9dË(\7f±\ 6õ^Ô½fjpp´\96\ 2\a\8dQ0f|\1d7\»ÍÍ^\9dâa3d{wUåûîÒ\95øµi\95\ 1M\1a\rÕ¤©   ©¯0Ñ\8cê]\91Õå}Qúò\11¦NåbWª\8eÇT¨.ŪU÷\90¿ÇV¨^°+Ê1\16Â\ïË"\80\ f\94h\1dÐü¯ üù:Ôùеg\12=\ fÕ\93ÁÙ\10\ 1\8eÆ×pö\ 6\ e¾·>ÉÝjÌô²Ô
+\88-Õb²Ù ÷oЫ©Æ*CHµ®\81¦×µGhµ¶(M¥\83¡®<ÌRifc\94\9a\8b±
+Í;Èç±JÍ¿ÙJ\rÆZS¦Á\98/}\8eÎÃ\ 3tÝZE3¸\88rÏ î7\83®\80.ôÜg&\81£)\fú\9b7\80­é÷x«9\81Ðnâz67ä\11MõEäº:\99\7f\8d±\9cª¯­
+ÖÕÔ\85ijZ#Ê«»ée\86!\86B\7f\90\9f\89\91ê\17c%úÛÈgèý{¶´
+cɪ0æzO¤\0ç2\9aÁ\85\ fZ\0¦Ú\0\ e §£\95\bö¶`èmg\83µ}\13®½-\8eÐÔ\9aæÑÐ\92ãcl. \19\9a$\14\9d¹,°Ò¤\rV7Ö\86\9654\87Ëë­\91²º\81hIÝ\ 1f±ñ\18[d\\88)2ÞD>A¾c\8bj1\16Â\14¯ó\b\9d\87Û:´\ eõ\0ç\9aQï´\0Lt\0\8cì\ 2°wxBOg tZ\19ÐfÝ\88kêÜîVß\99â^ÓÁóÒï\12\12µ\96b²º]á¯jÓP\15­Õ!²\16SXIsG\84¸ÙN/lÚÇÈ7O3\85æy\96À|\83-0?a        LÏYB\13Æ\146b\8cõ>@ëp½\1aà-3ê\9d(ÿÍ.Ôûº\ 1\ 6\91\9e\1e7°ôR ÅF\aÓîßâêvsðÕ¶D\82®7ó¢\87ï£ê\16\91\14Ý2?YWy\80Ī\ f\12w6\84\16vXhÂ\8e¾\bþ®±¨Ü]\93ÑÙ\96³\f\9ee\95ɳ<fd·\7fËÈnâ_õ't\1e\97Ñ\fΣùÏ¡ü£6\0g\1fê]H»\1dÀ<@\86úA\1aÔ\fm\80ª¡Í8Í`¼[ù`\9a»r ÇKÖ_à#é\97\90Äö2Já\1em\80°¯.\88ß×\1a\92³»\97Ƴ\8dDdÚ\8eFrm§éé½o#\8fèé=_ÓÓ»\7f¢§wa¿r\eÍà\12Z\83ÓV4\83Ýh\ 6ý\0Ã\83\0Ö!\80ƽ¨{\8dú\80n,\b4N&\94;7â\94Îmx\993\99P2\96å!\1a\13x\15\8e\8a}\84£rß¼\11\8d_ÎH\8d\7fÖÞf*×Ñ\1d\9cæp\84¦\f»Â\92\86\12\87\97\91\8fh\89\83Ïh\89\ 3?\86'öc¿ò6:\87\vhíçPþÄ\0ê\9e\ e\80¾QÔý\9c\0\86q\80\8aC\ 4P\1e¦@é\91H\90º~\ 3Å®7pE®ÿr]çAQÞg\1cÀ¿¿w/v\97]\96]@VPX\10Y\10a\ 19\17\94[\14\11\8dÚ11\91\8c\9dj­Õh5\89ÑD«Q\e\94pX\10a=\90\ 4å*\89\16Q°^Ô[Q1\9c\91z\0âõëÓib¨\7f|fvç\9dy¿Ïïzß÷\89\16ÞÊM\14ÍÈM\95¤æÎ\96¥äÌ\93'ç|¨LÊY¢\8aÏ^i\17\9b½Á~bÖ6]TV¶CdÖaÇ\88¬ZrÕ1"³Ï)bÏ\v§ðÝ|DxƯª×Ð\1cP\v´\9fò3iÜÛ(û\93,`e.°(\ f\98GmÑo
+m1«h\ 4fZ<\91f     À4K8\9bj\89\96)B\92e\868Þ2W\12kI\97N*Zd\13]´\\11Y´N\19^´E\15\8dzBáA»àÂjrÉ.xÿ\ 3» }Ï5AùÜ~¸JÚ\ 3\a(?w\17\9d\ 5jÅ6å\0«ó\81¥\85À\aÔ\8bÎ)\ 6RJ%\98\¦Ab\99+\12ʽ\11W\1e\84\19\93¬ñ,Ú\9aÂÌÖYB\84u\9e(̺@\1cb]&        ¶®\96\ 6Z7Ë\ 2ÊwÛø[\8blÆ[«ä~Ös6~e½òq¥C\8aq%\é{äWGhýó(?#\13ø\92ƾ®\80úÏ\ 3À\82#ÀÛå@j%\10W\ 5\98\8f+\10^­CXÍh\84Ôø`Bm\10\82\bªM@`Ý4\ 4ÔÍaþuó\99_Ý"æ[÷\aÁ§îSÁ»~§hlý>Ñ\98úJ\91\19\91g]§È³fPìQÍ%Ãí§üLÊÿË^`\ 3\8d}Åa`a\19­ÁQ í\18\90P\ 3\1d0\9d\10÷Q       ã)\1d¼\9bFal\93\9aL\18s:\ 2\9e§ãàq&\ 5\863sàÞ\9c\ e·æ\8f0ªe\r\[¶À¥%\aú³%ÌùìI8·´Ã¹ù      s>ý\82\17Ù´ï¾ú\eði\11í\ 1\1aû¢
+à]Ê\9eQKù\r@Ä     Ê?\ 5\18\9b\19ÜÏI¡oUÂé²\ 6\8eWôp¼ê\ 1\87«ã »6\81DC{=\19ö7fÁþf:47\97BsëÏPßÞ    uÛ~¨Úª`Ûv\ 1ÊÛ?ÁöÖ lo>\7fm\17å\7fn\ 1V\95\0¿¥±¿Gã\9eAÙ '\81ð&À¿\ 5ð:\ f\8cn\ 5\9c®1Øß\92BÓ¡\82ºC\v\1e\9d\ 6(»| è\ e\84¼Û\fYO"$=3!î\99\ fQÏ2°\9e\r@÷×\84Bzèæ=\17H\17ÐÛ÷Úfº´º\14\1d0¿\ e\98IÙñ\94\1dFÙã)Ûó_\80Ëu@w\e\ 3l\1f\bP\f\ePC2 \85\19è\1f\88?       \ 3\ 6âÈtB\1f\ 5\ 3ô"\1a \87Ï\0\1d¸A
+\e¤ §\8däÜk\1fSþRÚsïÓ\9a¿Es\9e@Ùa\94=î2`¸\ 1\ 1öí\94Ý\ 1Ȩlñ3\80q\11}\bÛ\10\15ðJC\1cè÷Hb >$\98L$)\84^\8a\9c>\8a\a§ÍÇéÐqZt^ñ\1aw\1dKÆÐ-¨×uô\ 6·÷\a×D\82«'3®\9aŸ2\9d\12²\92¬'\9bÉv\92\19\97ç\91BpùaRNªH\ 3\9bñB~\v\1eôË\aðXÎñHÁñPÁÙCåÿãn\9eàn\ 6ðÑDOµ\8cð£ZÂÀu        TÏ\fÆ5ï2®^H\96\93\8fÉF²\95ì"\99$\97\14°Wê\ 3ì\85º\84=W\1fÅ3u\1d\9eª\9bЯ¾\8eGên<P÷£WÍY\8f\1dgÝÿ¥á¬k\18îá\ 6îáJÓHÜÜ\89\ fÍË\ 4\9a\97\18ªg\1aã\8es\19\90qÝ2²\8a½Òm`/t_°gÚílH\9bÁ\9ej³Ø\806\8fõk\8bØ\13m1{¬­`\ fµ5ìßÚFö\93ö
+ëÒu²\1fuý¬Ý\81³»\ e\¸ãø?mÃp/\17ð±#ÀÇ8\81{Q\1dciMÆ\98¨&3Õ\93\f>j6{é\92Î\86F.f\83#W°'úµì\91~#{¨ßÊúô;Ù\ 3ý\1eÖ«Ïe=ú\ 2Ö¥?Ä:õå¬C\7f\9cÝ×\9fd÷ô­ìöÈNvÃ¥_¸âÂ\85VW.ºD.ºrñ\85\ fåûêh+iÁý\9c       ­\89ß8ú\1f\86\97Þñ\18ôJc\8f=ßa}\1e\vX¯a\19ë2¬b\1d\86õì¾a\13k7lcwÝ¿fwܳØm÷<vËÝÂn\18JÙ5C\95pÅð\83Ðj¸(\9c÷è\10Z<\9e\88N{rñ)O.iôäÒ\7f¼\81ûQ¶¿\1d¸ICÛÙ\81м\ 4\99É\84GþQèõ\9b\82\ eß9ì\9eo:kóYÌnú,g×\8ckØeã§B«ñKá¢q\87pÞ¸[ôOc\8e謱@Ôl<,:m¬\105\19ëÄ\8dÆfñI\9f»â\ 6ß\87Ò:ßW²\1a_nsügÇ|¹ü\17ÜDùAJðP\15x8Õ\11á\88¡°Ñè\v1¢#8\ 4mAq¸\1e\94\86ÖÀwعÀ\ 5B\8bi©pÆ´RÔdZ+j\føL|2`\8bøDÀNÉ÷\ 1{$\r\ 1{¥õ\ 1EÒÚ\80RiMÀ1Ùñ\80FY\95é¦ì¨é\81Üjz®(3qeÉÏ\8e\fÃ\83m)_
+\1e%§#m\8b\97Ñ\1aôE9¢=Â\r×#ÆãBd\14Z"§°S\11³Ù\89\88ùBCøBQ}Øïĵa\7f\94T\87®\93\1e\vÝ(û.t«ìÛ\90]6\95!Yò\8a\90|yyÈ!EiH¥²$¤AY\1crIy0´Û¶(ô©ª0\94NP\18Wï{\ 3\ f\93\81\9b\ 5ð\18\11\1eÅIÐ\15'ÇýIj\\99è\84³1Þh\8c\rÅ÷±       ¬66M8\16ó¶èÛI\1f\88+'.\96\96Gÿ^V\1aý'\9b\92¨õòâ¨M\8aCæmÊ\83æ\f[\8b9WUh.R\15D\96©÷\99kìòÌ-v{Í?j²£úí³¢¸ý7$ó\r<\92Q>Ð\97H=_2p5Y\82\8bIr4'jqb²\aj\93\ 3Q\95<\89UL\9e*\94\16\17'¾'9\94°@f\89ÿȦ0n\85¢ n\8d2?ö\13Û¼Ø/T{cvØåÄdj²bòí3c\8aµ{bª´\191§t\7f\8d¹£Û\19ûØaG,wø\8al\8fãºáx\140\94\0´O¥~\8b\1eñgÓ\ 44¥JñC\8a\1dªSGáèôñ(\9d\1eÉ\ e§&        \96iiâý)s¥ùSß·Ù;e¡<'y\992kòJUfÒZõî¤ÏþCu\99\a5}¦qüûK¸o\ 2\84\¨µ\1eõ Z\16­\8a\8a\80\80Ü\10H\ 2!\84\10 @Â\91\84+\80\10îû\96Ã\ 3\81T]\15Ä«µ\9euÜ{»\9dÝÙît\ f§Û\1d§ÛîÑm×µûÛÇÙ±Ò?>3oòÏ7Ïó>Ïäýx\8eDöx\ fG\8eð\ 6#\8fûôG\9eóí\8d¼â×\13y\8fß\1dù1¿3êK~{Ô·\ 4Ëo\8b\96Ã\86Ò_\17Õÿ»$òÞTà\ 1¹ßíT.n¤¸á²T\88wR7à\êvæ¤4\9c3\95\12g7\91\9cæp$Iå4\96\98ë2\92 w\e\8a7y\fÄY<ûâ¬Þ=±\1d¼®ØAß\8e\98£~m1§ý[b~(h\8e¹-h\8aýHh\8dý\Ð\10÷\9c`ýëÿ\ fÿ%l\ 4ði<ð\11å?"ï»\9dAïìt\ 6Wäΰ)ø8\93¾\163éAÌqÅ^Îaù\ 1»QY\8aÃpZºÓ\804Û¥WªsëN)ñèL®ðjKªãµ$µú4%öùY\13Çýë\13g\ 4u      ç\85µ\89·D\96Ä\9f\8bª\13\9f\8aª\93\9e       «\92Ø\17\b\bÿ\97|\13\ 5ü1\19ø\99\82\9cS\ 5ÜP\93kÐ_îy¥\ 3Îdú`Zµ\1aÇT[0\9e\19Â\19VFr\a2\12\1czÒeN\9d
+\95K»<×­E¦÷hJ3y5¤Yx\aS\e}k¥]|\8btDP%\9d\12VHçEféu±Iúc\89\99Ø\98úo\911\95}\81\90\10¼ä\8b\18º\aêÁc%õ\80¼ïª\96ÞÙ9ôÎUs0\93í\85c\9a\15\18ÓlÆ\90f\aÓ§\ eçveÅÙ·©¤\8eÍ\99\19.\8dJ\8d[}F\81G]z©\97\92W¥¨÷­PtðÍò!A\99|BT*\9f\15\17Ë\97$\ 6ùã\0½üS\89^ñµX¯`E\84а\8c§t\ f¿\96\ 3\1fPý7)ÿr>0O\9c¤ó\84Ö\ 3\12\fåm@oî6¦S\eÊmÍ9`ߨIv¬ÏV8ת³\«³òÜ+U\ 6¯r\95\99g̬ó-Ílõ/V\ e\bôÊ£¢BåY\89\18\90¯ü\80xBüK\92¯dÅ\84\88\10¾ä3\9aÅ_Ò\fÜ£Ú¯é\80\8b\85ÀÙ"`\92~ǸÎ\1dC\ 5\16®GGA\10Ó¢ÛñæGÙÕå%8XrÓ\9c\99®æ\9c\1cwcN\91g\89ÆÈ3d×ø\16e7ó\vÔ}Â|õaQ®ú´$G}%@£~Hü\89øJ¢Q³bB\94³\8c'RÚ\a\9a\83ÛyÀ"eÛèÉs\928Bça½+zõ|t\18Ö Ù°\95iÐïâÔ\16EØU\15Æ9\94\17H\9d\8c\ 5\19.%:\8d»!_çY\98Wê­Ë«òÍËmäks{\ 4\1aí¸H­=%Qi/\ 5djï\13\7f þ)ÉÔ²b\95\96\15-ç÷´\8b\8fi\ en\15\0\97({ÖHÎWFÎGçÞ\12\97ú ¹ì5Ô\97\ 525e;8\95¥a\sI\8c}iq²£Á p)2¨Ýtú|\8f¼¢bï\9c¢
+\9fìÂ\ 6~VA\97 ³`T\94¡;!Vè.J亻\ 1rÝ'Ä?$
+\1dKß±¢åü\96îá!Ýýu=Í"å\9f!ÿ<J\fйÃd\8f&³7\ e\96¯\80¥|#*Ê·1ÆòPn\899Ú^oJt,0É\9có\8c*WmY®Gv\99Þ+«ÔÌS\96\1côK/i÷\97\17\1f\12¦\15O\8b¥\86\v\92\14ÃûÄÇÄßèó\7fER=û\ 2áK>¤{¸Ks°HÏ_[\ 5\1a\18«"çª$ï¬bP[í\89*\8b\18æ\9aõ(«     b\f\96Ý\9cBË~»üêx\amuªSv\95Ò%«2ÇMYYè\99^aô\96\95×ø¤\96·òSÌ\83\82$ó¤0Áô\8e(Þô\9e8Îô\eq¼éKQ¼ñ[Q\82\91\15&\94½â'\1aà]êÁ%3í£\85¼³\ e\18¬\ 5Z\89Z:W\1ctCY\83?\8a\e֠Ⱥ\85ÑYwr´ÖpnvC\8c}V}²£²^á¬8¨v\95\1dÌw\97Ö\95z&×Vó\12k\9b}ãjúù15\13þ\a\82(Ë-a\94åW¨ê/\ 4ÑUÏ        V\10]Éú¿ä\11ÍÿuºÿóTÿ©zò>+ÐC4\10å¤\ 5Å-Î(lõA~Û*hÛ7#»};£j\ fåd´Eq\15m\89öim2Gi«Ê9©%×5¡Åà\1e×\áy Ùê\1dÕÔ볿é¨_xã,?¬ñ:\7f_ã/øaÖÏùa\rÿá\87Õ³ßã\ eõ`\81ú>GùSÍ´\v-ä]­ä=mä]]@^7\17\9a^/dõ\89\91Ù¿\1eéýA\90õ\870©ý\11\9cäþXnb\9fÔ>¾/Ã!¦Wã\14Ý[è\12Ùcv\vï©÷Ø×Ýå¹·û°÷îî³¼\90î%Þ®î\9fòB:\9fòB:\9eù\84´³ßã¦\89f\91z~\9a²\8ftÐ.t\ 2VÊ.ï\ 5ò\aÉ=\ f\ 1\8aQ7¤\8dñ!\1d[\8däñ@$\8coGÜx(\133\1eÍ\89\1eOäF\8eÉì"ƲìÃÆò\1dö\8e\96\1e­uÞ5ÚáºctÔmûÈi÷m#\8b\1eÁ#?r\ f\17÷àáo<\82\aYÏå,Ð\fÌQý\93\94\ fhï§\1ePv     eç\8c\ 3²c@¤\ 3b¦¼\10=%FÔô:ì\9fÞ\8a\88\99]\b\9b   gBgb\98=3)\9c\90\99\fÎÎ\99\1cîÛÓ\ 6»mÓUö?\98nqxkzØqëô    §7§/\13\8f\9cÞ\9cú³Sàñ¯\9d\ 3'X\97Àc¯¸@
+v\92ê\1e§ì>ʵ\92\16\9a\ f\ 3º         s\1aH:\ 5D\92\9duÃî9_ì\9a[\89\9ds\e°c>\b\87`Û|\ 4\82mq\b²¥2oÙTÌ\16\9b\8e\13h3q6Ù¬Ü\8d¶~î\e¶I»õ¶\8bvël÷íÖÍ?á®\9dýÊní9Ö~íÙW\9c¥üc\ 3ÀÐ\bíÂ\11À2   \18N\0Ùg\80Ô9à\0©á\9e\8b@ðe.¶,x p\81\8fÍ\v«°iq\ 36.\ 6aÃÕ]xãj\ 4Ö_\8dǺ%\19Ö,eãõ%\ 3V/Y\98UK\9dÌÊ¥#LÀµyFrí6#Yú\84\91\9d\11/<ç\88¯°ß1Eù#T{'õ¼\8e\94²µó\80\9crcIIC\17\81\80Í7\815ï9`å\1dw\ 4Üñ\85äÎ
+\88ï®\83èî\16\bïí\80à^\18üïÅ\82\7f_\ 6¿û9ð}P\ 6\9f\a\1e\fÁûá)x=¼\ 6Ï\87\1fÂëÁ_áuï\19¼î²ß1>F»H}o ÚM³´\a\17\80ô+@Ü\12°ï\ 6å¿\vlz\1fxý> þ\1f×õ\ 1\14Õ¹Å\ 1ü\7fï\16¶°l\ 1\17\88e\11£\vD\ 1Ë\ 2\82((`\16¤W%ÑÄØ      1`A,H\90 @DÅ\86\8a(\8a< âàC\89-\8aO1\16D!â\8cODQDÄ\82\8a\9dÑï\9dg\eã0¿¹³;Ë=ç;{÷ûÎ9ÍÁ¢F\fÕ\ 59ÌêÔPÔY\93Þ0­s C ¯\1f\ e\11Ò¿#ÉDHþN\84øb:D\17ó ¼X
+AC\15¸\86Fr\9f<û(g3\90Jßù,Zû\94=ÀX\8a=æOZ\7f\15Õÿ8àð\17Ðû\f`]\v\ 1Å%\ eÒ+"\88\e\15\106ª!¸j\ 5\1a°\80&;àÚ@à:5¨Í£©1\8a\0nþ@hóm¡\a¾\85
+}k7¡\ 5Ýj æíöGK(þ\9c]À4ªû8Zw }Äë\ 4\14`W\ 3è.\0\96\17\ 1Õe@~\15\105\83îGn\99Ðÿ+\80Ûj M\vÜé       ´÷\ 5î:\ 2÷\87¾kÔ\1fRsô\88\ eäG´ù?Î\ 2:©à\9dô\80=¡@ON}\94DoÍØGû\0­=\98b{\9d¦øç\0}\1dÐó\12\b\98]\a$7\ 1®\95\93\aïu\b)\8e\8cb\98ѽ5t?+à\19Õä\85\ 3ðÊ\0¼¦fõ\r5\a\8cêÁ(\ fF?\0\91ÐCÇÊ?bÚ>`ÝhÎU\13Å\97`R\9awÅ®`\ 2\1f0\84\92oÉ4\92H\16\90%$\8b¬"ëH>)Äk\14£\v»ð\12\15x\8eCx\8ajt¢\ e\8f©h\8fè¯\ 3¯(möÖýÏ0k\e\9e\94\aQéÀÌìÁL\87\80ɼÁL\ 2ÁDcÁ\84\93ÈO\94W\12I%KÉr¼æW£\8bß\80\97|\ 1\9eóExÊÿ\8e\1c\8f¸ýèàþ\83ûÜyÜån¢\9dë@\eß\85ÛB\86V\11\11ÿ\13ëÑ\1d¬»5\98¥Õ»<ÌûRM\9c)\1fOÊÇHùD\82É¿#3ðZ>\v\85x)[\82ç²,<\95­Ä\13Ù:tÊ6á\91¬\10\1dÒ\7fá¾t7îJ+Ñ&­B«ô\1cZ¤7pCö\10×ä]h2ehT¼sEÁ¸\ f\98Î\12¬\979å¡¡|(\97î¶T\97þ\94\8f\eåã\837\9a\10¼TÇâ©j
+:U3ñP\95\84\aªÅ¸§Ê@»ê7ÜQå¢M\95\87Ve\ 1n)wà¦r\17\9a\95{q]y\ 4\1aüWÕ\8c\ 6õCÔkºp^øZsÆ\9d{¯æ=fK±m\95\89­\ 5é\ 1\aë9\b\ fÇcë\0\8aB»åw¸­\9d\81\16m"nhçãº6\rMÚehÔ®À\15íZ\ÖnÂ%í6\Ô\96 ^»\a\17,\ f¡Öò4j¬\9apÊú\ 1WýE\17\vÆ\1fëÎøªÏ°~f`}å`v¦`ö*ºjñ¦\9f\r\9e\15îõvC«\8d\ f\9au!¸ª\8bÅå^\93ÑÐ+\1eõº9¸ [\84\12Ô貸³º\95ÜiÝzî\94®\80;©ÛÁUÛ\94qÇmþà\8eÙ\9càªz_â\ eÛ¶ó\al_\b*m\99`_\1f&ØÛ\87 +>Áì)¾\83\bÌQ\ 2æDy\fP¡ó+K´ÙÙâz?'\îç\89z½?Îé#qÆn\ 2þ²\9bÆUÛÍä\8eë\93¸cú\14î¨>\9d;¢Ïæ\ fësùCú\rü\ 1ýVþ\ f}\89 Ò®B°×ÂܾUXfÿLXêÀD%\ eL¼ó3l\0Åw¦\9fé`\1eÏ\86\88Ñ1H\866G\15\1aû[¡ÎÑ\ eg\9d\qÒÙ\aÇ\9c\83qÄy,wÈy"·ßy\ 6\94Àïs\9aÇW8-\16ìqÊ\10\94;-\17ìv\#,sÌ\17\96:\16\89J\9cv\8bv:\1d\14\15;\9d\11\17\10\17:w\9alqf\92\82\81\99ä\7fâm|ÚN:Üh{u\a®\f\15â\92A\8aÚ!æ8éb\8b£n\ 3qÐm\ 4*Ýü¹
\b®Üõ[¾Ìu\12_êò£ Äe\96p§K²°Ø\90**2,\15m7¬\10\17\1aÖ\9bl1l5)0ü.É7TJ6\19ª¥\e\fW¥ë\:dk\^ËV»2YîgØ`ÚÚ(vË\b\9aùF\ 2µ#9\9c\1e.Æ    \ f%\ e\rï\89}#úcÏ\bw\94\8dðåJF\ 4sÅÃcøí\9e\13\ 4\85\9eS\85[\86Å\8b6\ f\9b-Î÷X Þè\91f\92ç\91%Yç±ZºÖ=_¶Ú½X¾Êýßò\95\1eU¦9\1e\r¦¿\r»§È\1aÖ¥È\1cÆþÏtÙ'\98+m¿\14¿\91¶÷Z#PM\8eúñ88Ê\14\15>Ö(óÕc§\9f\ 1E¾ÞÜVß\0~³O8¿qT¬ oÔDѺ\91ÓÅk¼\7f6Éõ\9e+Yé\95"ÍñÊ\90-÷Ê\91g{å\99fzmS,õÚmö«×aeº×ye\9a÷\1då/Þ/\95©ÞL\99:\92\99\95\a\1d?>4s\ 6Ь\13D}>Í\9fûÇP¯o\94¢ÔØ\r;\ 2ú`kÀ@ä\axryþ£ùµÆ`A®1Z¸òëñ¢\9cÑ\93ÅÙ£ãL2ý\12¥Ëü\92e\19¾iòtß,E\9aï\1a³T\9f\14\9fRÕBß\ 3ê\ 5¾gÕó}[ÕÉ~ÏÕóü\98ê=å\a\ f©\ 6×híç(ö1:æöÓ\91»\87\8e\99Ò \11\8a\82Ô(\b¶Á\86\90\ 1X\e2\94Ë\r\1eÅå\ 4\8d\11d\a\86\v3\ 3Ç\892Æ|/N\ f\98&I\vøI\9aê?W\9eâ\9fbºÐ¸Ôl¾q\95r\9e1_5׸S3ÛX©\99e<e\9eè\7fÓ<Áÿ©&Á\9f©\13\ 2ÞR}p\8f\8e¶Ë´îS\14ÿÏh`o\fÍ[tÝ\11Æ¡ \\89¼\88\1eX\1da\8f\15\11\ 6d\87{qË¿æ\7f\r\v\11¦\85F\8b\16\87\8c\17/
+\99$Y\10\1c'M\ eN\94'\ 5-PÌ        J7\9b\15\98£J\bÜ \9e\19¸Ã<>°ÂâÇÀj\8b¸ fòÄ<.\88iÞS\7fÐæGßC\bp"
+80\ e(§Ù¯\98®[èu^\94\ 2¹ÑÖÈ\89é\87Ì\98\88ñäÒ¢}ùÅQ\81\82\85\91\11¢ä\88XqRÄ÷\929áÓ¤³Â\7f\96'\84ÍSÌ\fûE\19\1f\96­\8a\v\99\1eºÝ|jè\1e\8b)¡Ç»M\ ek"\8f-&\871s¢ùT\8b?p\9ejPEq÷\8d§\1aÐì·\8d®\eÇÒ¼3N\8eå±Z,û¦\ fÒ¿qBj¬;·(v\14\9f<.@0wl\98pvL\8c8!f\82ÉÌè)Òøèxy\Ô\1cÅô¨\14åÔ¨Lõäȵ\9a\1f"\vÿÇuyGEu¦qøwg\ 6fd`\80\99Á\16Å.èª\88\ 5\e\1a\8a\ 5i*e\9060\83\fU\ 6\ 2\82RUZb\ 1ì2ÇX\90YK\88(n\8cQ@M\\e)GOÔ-\96h²®kÁ²n\8cQ¹û\93\1cã9ùã9÷Þ9s¿ç{ßû}÷¾¯Ö\18Ùìb\88<Õ31ò\9f=\13uO\\12u]ÚD\9d¨1èDõ[~\b\ 1:\18s[<ס\81='Ë\8d\8fyÜÄëµú\1e¨ÖkP\9e0\10e      £P\940I(ÐûHòô\ 1Ò\9cøy2s\9cÎ&3.N\9e\1e\9bÔ#56Ci\8aÉuX\14Sìh\8c©vN\8cÞ ÖGïÔÆG\1fp\89\8d>Ñ36úoä\11Ï_kã¢E\rQ¿å\1a\9fÃYÆ|\8cñ7³ìjdÿYÏc\1d¯?4Øb¥Ñ\19¥IýQ\984\12ùI\13\84\ãtÁl\9c-É4\84ÈÒ\r\116)\891òäD\83")!ÍÎ\90\90c\9f /TÅë+\9dbõëÔÑñÛµ\vã\9b\¢âÛzêâ/\93N\9e¿ÒFÅ\8b\1a¢~Ë\15>\87Ó\\ 3\9f3þ¦T`'Ù\94\ 2¬âuy²\ 4%&G,5õE^\8a\erRÆ!+e\9a\90\97¤\9a\82¤ÉÉa6IÉѶ\86
+ý¢\14»¸$³}LÒRÕ¤r'\9d±V\1daܦ        7îw     3\1ewY`¼ä²ÀðÐ%ÌðR\ef\10\ 6\96\8b|\ e'\13\80Ã&`_\ 6°\8dÔ¥³ïå<JÒ\80\82t\aäfô\829c(23=\90\969Y0eøJ\922æJ\r\19óeúô(Û¸ôxyLZr\8f\85i\8b\95\91©ù\ eá©+\1c\17¤¬u\9e\97bQ\87¦ìÓ\86¤|¡\rNùN\elº¯\r1½Ô\84\98Duhò;¾æZleÌ\aéµ\9a¹\17²Ø÷.f½\9fI?\8f9YJ,6k\91\96=\b¦\9cQX\94ã%\18rf\bú\9cÙ\92¸ì\10itv\84MTv¬m¤Ù¨\b7§ÛÍÏʵ\ fÍ*U\ 5/^å\14¸x«óÜÌ=ê\80Ì£\9a9\99ß\90{\9a\80\8c\ 1\19¢: ]t~ËYî\81£\8c¹\89î]\1f°ï%Õ9@!ÉáyF\9e\1c¦%ÎHÊï\8fÄ\ 2\vÆ#v©·\10]à/Ñ\15\ 4I#
+ÂdaùÑ6óó\13å¡KR\15AKrìææ\15ÛÏÉûP5+w³£\7f®ÕÉ/÷\88³on\87³ß\awÉ/Î~9¢\93\7fö;N1\a\87\19óÞ\ö\9d,¿k\96\0+x\BÒ\96\ 2I\85\12è\8bU\88\83èÒ¡\88*ó@dÙd!¼ÌG\98_\16      -\9d'\r.ÕÉ\ 2Kãm\ 2J\92mg\97d)ü\8b\97Ùù\16W)ß/Úè0£h·Ê»è09§ò.¼£ò^ö\å½TìfzÁo´r\r63ÞÆeÀæBî\ 5RL²\8bé/cß±\12\88ªP"¼R\8b\ 5U\ 31¯j$B«' ¸Ú[\b¬\9e)\ 4T\aIfW\87KfVÅHýª\8c2\9fªLÛ\19\95ùòi\95å\8a)\95ëì&WìTzU\1c"g\94^å?)½Vþ¬ôZ!Ú{-\7fÇ\11®\81ý\8cw\a}u¥Ü\v<\16,ç3 [_\rD²=
+]c\8bÀ\1a'\ 4ÔöÅ\9cÚa\98\81\99u\93áWç\ 3\9fº9Âûuó\84éu:É´º\ 4É\94ºTé¤Ú\ÙÄÚå6ãkkl=k·ËÇÖ4Ë=j¾"·ä\1ek\9e)<V\8b
+\8fUÝôxÃAæÜJïÖ
+îGRRÉ\1cÐ\9dLwL\r{¯õÀìM\80ïV{ÌتÅôú\ 1\98\8e©\16OL±LÅ$\8b\1f¼,\81\98h       \13Æ[b\ 4OË"ÁÃb\96\8c\14IFYVIGZ,Ò\11\96&\99»å¤Ì­þ\86ÔmËS\99Ûæ×6n\9bÄßÙÇØ·Ó»\9emX\ 5½ùkØûÕ2\a\e\80\88-À\¶ª>;\80I\r2\8cÛ­\82çî^\18Û8\bc\1aGbtã8\8c²NÅ\9f¬þ\18i\rÂ\bk\ 4Ü­z\f·¦a\985_\18\14\ 6[7\v\ 3ÿ¼W\18`=.¸Z¯
\8d\8f\ 4×\86\97\12×]âï4T\ 1[è]MoÉ:À¼\91ë`+×ÀÇ@È.Àß
+LÞ\v\8cý\ 4p? ÇÐf'\f\85\830ðà\b\f8è    ×\83SÑÿ\90\1fú\1d
+Æ{\87tè{È\80>-fôn)EÏ\96:¸´4@Ûr\ 4\9a\96o¡9t\1f\9aæ\17Ð\1c\10\85·XÖr\1d\15\8cy      ÛÑTÆ\1c»\e\98Oï¬&`\1aÛRÏ\16Àí3`àQ ÷19´­*hZ] nu\85sÛp2\ 6Nm\93àÔî\vU{0\89\82C{2ìOäAy¢
+víõP´7AÞþ%¹ÉóÇP´ýJ^u³\81qW×ó}@w&cNÜ\ f\847\ 3s\ e\ 3ÞGè§×í80 \1dèu
+p>-Àþ\9c\ 2\8aó*ÈÏka{¾\1f\ f\85ìÂ(H/xArÁ\87\1fA\16$\1dü\bupÓupÃ}ÍDwPÐÁA;Îñú6yD\9e\8a±\173çæ=\80ñSî\ 3þ-\80Þiô\8e¥w8½ýO\ 3.¼Õ±\ 3°û\16\90]\92°è°#\8eÀ÷Zàr_àÊ`àêH\16D\13\80\7f¼)PY\1c^ãKø:_À×K\b\1fôõFà\ 6\ 3»ÁÁnÜ ·»)kàûp\1f°\889×}Î5ØÊøO\ 2\1eô\ e=\v¼G¯æ;Àá\12 ¿\ 2\16ÿ\84·ã¦\14ø¡\apKŦ@\rüØ\8b\85©+pÇ\r¸ëÉBy:ð\80óxÀy<äK°\93\e¾\93Iïd²;ÿB¾$gºÉcîM|Þ\v¿\0\82è\9eþWúÏÓÿ\rÐç"sO¯\92\eï-ò/r\97ü\87Ü#÷méP²AaN\1ek\80§Ìɳ!Àó1À\v\16Ì/Y$½\8a\ 5^óãó\9aóèâ\86ëbà]LzWs7¢Ó\0\88ªþ\10í\880\10"ÜÉDâKBI\fI&Y¤\80\94¡\vUx\855x\89õx\81\ 5Ûð\1c\rø\19{ð?|\8aÿâ3<E\e\9eà<\1eá\1a:q\1f\ fù\8f\a¼û>¹÷\aDM?\88Î} :\10[\9eK\87ñWO2\83\ 4\12\1d1\90\f¼F.~E\11G+§ë#<C-]\eéªÇcì «\91®OèjáØÇ\98®3ø7®0uwñ\13ïø\91³¿Í\91\ 1Ñ¥7ç¡\85è¨ým\1eÊÁ\10\15£!ʦ0/³ù\8f\ 5¼3\8en\13ã4ÓYÀØJéªdL«éZGÃfº¶á\ evѵ\97®f\8e}\14\15®ã"\97Ð\1dü\9dÙ¹Ê(.KD|ÿ\ 6é;ÄÞ\1aÎà       ¢úÿL\97yTSg\1aÆ\9f{\93Ü$$7n #V\11«\86j\ 5«FzX\8el\81°$&\84\0 \84@\12v\91\88¢\88\8a¢(n\80 R÷\ 5\8a¨(.¸Ôµxlq­ÛèL;Õ\19õT§ÎÑötZ»÷Üy\9d\13Oýãwî{î?Ïû=ß÷½ßûö#üÈ\13Ú\13\15í\87r
+íO4~\91¥à%\97\81ï¸<¼àJðLR\81§\92j|%©ÅcI=\1er\rø\17×\82\aÜ&|ÉíÀ\17\\aþÎ\1dÄ]î8îp½¸%½\89\e²'¸.ÿ\ 1W\15\ 2.+\ 5\òÒçE\18¦\820TI¹ðÄ\0\b\17ßQøm@0¾ï\1f\86\17ªx|ͧâ \9f\8dG|>þÉ\97áK¾\12\9fó\vq\8f_\8a¿ò«p\9boÂ-~#nðÛð\99ª\1d×T]¸¢:\86˪^ô©nâbÿ§è\1dð\12ç\ 6
+8K\9c!N\ f\14\98×\b\ 1>\10Þ\12C\b\90\11\94Çð\81øÙ\7f\18¾\19<\16O}'ãá iøÇ dÜ\1d\94\8e[\83\1c¸á[\84k¾å¸â;\ f\97ü\16¡Ï¯\ e\9fø­ÆE¿f\\18¼  ½\83wâüàN\9c\1dr\18g\86\9cÅ©!×pò/\8fÑ3ô¿Ì\11\7f\8194L`º½\1cô"\8c"}*/Â\18\16¿\8f\96â§@%\9eS\1e\8füßÂçþãpkØû¸6\\8b\8d¸8Â\86Þ\11N\9c\1fQ\82³\ 1³p: 
\ 2jp2`9N\ 4¬Å±\80õè        ØÂ\1c\19ÙÎ\1c\1ey\80é\1ey\929\10ØÇt\ 5>`:G}Ëv\8cú\83m\7f\9bÞ(/»½\bcH?\88®5\95¸'ã©ô\ 4Ip?P\81;\81¾¸2z4.\8e\99\84óc§á´:      'Õi8¦¶ã¨Ú\8dÃê\19èVW0\aÕó\99.õbf¿z\ 5³WÝÈtª[Ù\ eõ\ e¶=h/Û\16ÔÃî
+ºÀî\fºÇn{ç¹h˸_E\9bÆ      â\ f¼´zy¥ÿ\92ÊÉ\93ÉTb5À­É\f®OàÐ7®?ÎO\18\81\8f\82ßEOH\18\ e\85hq`âtì\vÉDg\88\83é\b)`ÚCÊ\98Ý!³Ù]ÁÕì\8eàZv{ð*vkp³hsð\16Ѧà\ fÅ­!\87Ä\e\89×\87Ü\147OüZÒ4ñgIÃ{ÂÿYû\ 6Â\ 4*w¤}?\f¸Aåµ/\82zýP\16g&óè\992\14ÝSÕØ\17:\ 5\1d¡Qh\vMÂÎP3³}ª\8dÙ:5\8fÙ<µ\88ý@SÎnÔT\8a6h\16\8aZ4uâu\9a\ 6q\93¦UÒ Ù%Y£éâVkNq+5W¥õS\9fH\97OýQZ\17*H\97yYêå\87ITꩤÞ\89&ý8\9aùbiÞ¡'çH¸\1cûÃ}Ñ\111
+»"'b{d86GjÑ\1ai`6D¤3-\11vv]\84\8bm\f/\11­\r\9f%^\1d^%^\19¶DR\1f\92[\1eÖÂ-\vÛ&­\rÛ+[\12v\^\13Þ'_\14þH¾ â{B\90WG\b²7ù&\94\9e3Ò¿\16\ f|\9c\b\9c º)Þ\17-F{ô\0l\8f\19\81M±ã±16\14ͱÑh\8cIbÖƤ2«¢­l}´C´<º@´,ªL\\e5G²$j\ 1W3­NºpZ£¬zÚfyÕ´\ e\9fyQG}*£.*æD=PÌ\8eþNQ\11-øx\91¿æ\19y\7fO\v|JOÜi\ 3Í:D'Åm\94ÇÖx\15Z\13üѬS£Q7\19«u\91¨O\88\12\fÌÒx\v»$>[T£u\8a\17j\8bÅÕZ\8f¤*®\8a\9b\eW+\9b\13·F^\11×êã\89kS\94Ç\1d\8cëU\96i¿àgh¿U\96jÿP\94Æ\v¯ðyÍ\13j9nÒÚ/L\a\8e§\ 2]Än\8a·Òs·!I\89¦ä!X\932\1aõ)!¨K   CmJ,S\93\9cÌ,HNeç'e\8aæ%9Ä\95\89\ 5\92Ù\89eܬÄJiyb\8d¬L·R^ª[¯(ÑíT\16é\ eò\85\89çø\82Ä»ªüÄ\17|~ÒïÊü$Añ&\ fé\f\ÓÓ9 í£4{î±ÐÌIñFò£Ñ Çªé¾Xn\1c\89Z㻨1\86b\811\8a©2ê\98ÊéÓÙÙ\ 6\8bh\96![\npIÊô%\©¾BZ¬_ +Ô/÷É×7+Ü)Û\95N}\17\9f§?£ÊÕß&\9e\13¿ñ¹zAI(^s?\ 1¸d\ 4N\91~7µ_m\99ÔçS¼Î\ 4¬Jå°Ì<\0\8bÍñ í\1dT¥MAeZ$SaÖ2\1es
+[\96jfKS­¢âÔ\q¡©\90Ë7\95K]¦*\99Ó´Ì'×Ô¤È1nåíÆ}ª,Ó)âF?\9bé?ôý\95Ï2   J/\8a\8d<¿h¦³Hú]ÙÔçSÛ³\9eâ5iÔç¦\8bP\93Þ\1fÕ\19þ\98\9b1\16³3ß\83'#\fe\191LIF"[\94nd\vÒ3Dîô\1c±Ó\92/ɵ\94Is,sevK­O\96¥AaMÛÂg¦uªÒ-\1fõK·\'\9e\v\9fn\11ø\8c4Aù\9aÛ´\ f½´î\1eÒïÌ\ 1¶Ø\81&\8aW\90\1f\8b)\97ù6\1e\86`VÖÛ\98\99\15\8cÒ¬P\14eE1ùY   \8cËf`ól\16\91Ã\96-¶Û\\92l[)g³Î\91eZ\17û¤[×(Ò¬\9bxsæ\1eUªõ\84Êd½ÚÏdý·Ê\94ù3\9f\9a)¼Bù\9aÏÈó³¤uØ\ 1´çÑÌ\99K\1eP\Kí×|Êgv\8e\12å9~(u\8cD\91c<
+r5påF2y\ e-ãp¤°v\87Y\94å°\89­9y\92\8c\9c\92S!3ç,\92\9bì«\14F{«Ò`ÿ\90×Û\8f©Rì\97\89§*½ý'^\9f-(_aðr\85<?Eë>è¢\99\93h!ê\9dÔkS.s(§\99N9\8a]\ 3\1a\ e\97;\byîIÈq\87\1dËØÜIl¦ÛĦ»3Ein\878ÕU(1º<R\83«Z\96â\á\93ìÜ Ht¶)uΣ|\82ó\12ñ\15¯ËûQ©Ë\13\94º\A\91èå\13òü8éí/ ûH4\10Kóiæs\93>}\8b
+$p\15öGn\91?ìÅc\90U\12\ 2kÉûÈ(\89b,%       \8c¹ÄÀ\9aJ,¢éÅv±¾Ø-I..ã\12\8bª¤ Euòø¢\16\9f¸ÂÝ\8aØÂ#Ê\98ÂO\89ÇÊ\98\82\97ÊØ\ 2A\11\9bÿ'\1f\93\aGHo\ f\8d\ 1­Åt\17\88EÄ,¢\90þ9g0°\97ñ°Î\1c\8c\8cò@X<ãaöh`òDÂèÑ2\ 6O
+\93â1³I\1e\9bHçq\8aãËK%qå\95\LùRiÔÿÈ.ó°(¯+\ eÿ¾Ù\84afØ\a\ 4\ 5\ 6Ô\ 1ÔaQA\10¢â\1e׺<ØT\eµ5Ú¨\18\ 5\ 1E\ 1\8d\ 2£A¶     ¢À\8cEE\86qA\ 5&.TD0j]S4\89Vm\9aX×Zc4DMòõ'á±>é\1fï3ÌÂ}ï9÷ÞóÝ\93Tà84ɬ\8cOÚOZ\94qIÿPÆ/yª\8c_,*ã\17\89Ê·º8Â\1cì¥o{\12PÄë÷z\92N\16óýÜ\ fØ÷-gß\91¢ÄÔ\15n\98\92Ú\13\93Òô\98\90\16\81ñé1\18\97>\1ccÓÇ     £Ó§\b\12%        iïJ\87¥-\94¾\95\96,\8bKÍRĦæw\8bI­p\88\974;D­¸é\10\9dòÄ!:ùg\87èåâk\1a\98{ëR\9e\87\8b$\93$Ó»0\19\98\95
+Lg«6)C\8e·×8cl¦7Fg\ 5aTV?\8cÈ\1e\84\84ìx\fÏ\1e\85¡Ù\13\84øìéB\ö,IlÖ|ÉଥҨ¬Õ²\81Y\ee\91YÛä\11\99µ\8aðÌ&rM\11¾æ±"<ã'"*ÂWýB\1d\9d+X\97I\ eYIoR\1að\aº\13Ù¢M^ËÞs=\90\90£ÂÐ\wÄçõD\\9e\1eC\8cá\885\ eÆ`ã0D\eÇ"Ê8\19\ 3\8d3\85\ 1ƹB\84\10fL\97ô7æJú\19·HCóvKCò\8e\90viHÎ#iÈ\86\1fe!ëÅ×Ô¦°.e°.¯\ 2²I
+ÿ^\98    Ì¦{ê\ 6ö~F`8[Ö\98B9\ 6\159c@±\17"\8bu\88(\ eAxI$\f%±è_2\1cýJÞF_ÓT\84\9af!Ø´\0zS²ÐÛ´Nèe*\11\ 2Kv
\12»\10PrQÐ\15?\14\ 2
+_H\ 2
+Ä×ì\\rla\v\96\9b\ 5dð5i\1d÷!Ý\89tOÜÌø\8b\81ØR r+\10\88àJWô©ì\8eÞ\95\81èe\ eE\909\12\81æXèÌ     \b0\8f\87¿e\ 6ü,sÐò\ 4¾\96Õð±äÃÛb\81\97å ´\96\9aïB[Ñ\ 1m¹(xuQù!ëb\ eÏ#IÉåYØÄ}X\0La[8º\f\88«\0\ 6l\aúî\0\82ª\81\1e5Nð±ºÂÛê\r\ eÚÚ\10xÖFÀ£6\ 6îµ#àn\9b\b7ÛL¸ÚæÃÅ\96\ 2\8d-\87l\85Ú¶\a*Û ¨joAe}\ 2\8fDì¤t#Ï#s½*\9f\b\98ó1÷á6®\81\ 5\18Jï Ýô×Ò¿\ fð­\ 3<\ e        pnPBÝè\ 2\16N\8dþP6êáØ\18\ 6\87Æ\18\8f\80Â>\192ûï µ¿\ f\89\9d\8bkgBí\7fæC©\9eü\95ÜfQú\96ttR@ïZ\13°|\v0\9f1ÏäO'0Þá6 z?Ðï ý\r\80Ï'\80ûQ@Ó\ 486Ë!=¡æ¥Ã\95x\ 1-~¤\ f  ã\ 30\ 6\85 \95\ fãV>\80ÚxèÚ¸¹Ú\18\[\r9ÆÏ/\93\7f\91G\9dä0ß+ÍÀ"Æ<ÛÊ5`¼#\ fÑßHÿa \90ÿÒý8àÚ\ 2¨Ú\0ÅiðÂAÎu#\9cÇyÎã¼\96\17â\9e¼\fõâÅ\9c\97äÏ\ 6\ 3í\9cG;/"WXð¯ð _åB_-'{\81Ï9à\17\17È\8dN2¸ÖI\8c{\ e¿\9aF÷(Æ;\98Þ¾ü\99\8e^¯S\80Ë\19@y\ e\90\¢»\9d|N¾ ×äÀu'^Ê5ÀMw6'Ý\81¯t¼$¿jV¢\80;¼ ßáÅà.\vñ=\1eø{\ôû\äû\fôþ\11\93\ f\98\9eyÌù\fÆ=\86î\98fÆß
+\ 40^-½\1az»½ò~I8m|E¾&ß\10¦\13w\ 4\8eÍ\9c<P\ 1\ f]\80G\9eÀcæä;=ð=\9b\96\ eÎã\a>\18\9f³\18>çá\7fÁ½ñ\82\89\7fɤ¿¬ëDtò\85Ø­;D¼¢\aéM"ÉP2\9e$\92yd\11IÆOÈÀK¬Ã\väá\aä£\ 3Åø\1eex\86J<E\15¾\83\15ߢ\ eÿÁ'x\84\93x\88ËxÀÉÞã7wñ3\11ÿ\ f\rQé  Qðà;þ\8d@b CÈ\182\8dÞßÓ¹\80¾¥t¥q´L<Áz<\86\91®\ 2ºLtm£ËB×.\8e»\87Öz¦ê8Sv\8e©û'nñ×79û\9b\1cñF\17\7fïBtq\87¨v\85¨p\81(á\àGBH\14I {\12ãû-c\9bG×"º\96ã>VÒ\93\85\80ÛØDW!-¥tUÐUÅñ­¸\86\ 3Ü2Gq\ 5§ñ\19\8c\7fã\12\9eã"G½@ο\81èêÌ\¨!ª\88\93Û/ë"éÅoÂ\99ã8Æ9\8eÎiôͦë=z\96Ð\93ÂQ3p\1dk¹Mrp\15\1f\16ÓUF\8f\99\8ejF¿\ f\1e§Ñ\8aSÜÄm\1cå$3ÙÂ\91O\b"\9a%ÿCôpb.\14Ä\91h8\1f®\89Ò\ fÏ\14!x \8bÂ×Ò\ 4Ü\92NÂuY"®Êæào²\85¸$[\8a\vòT\9c\93¯ÆYù:\9c\91çáSùf\9c\92\9bÐ*/G\8b|\a\9a\156üEÑ\80&E\v\8e:´ã\88ã=Ø\9d~@\83JDý¯\10½d\9c\a j¥|å<\5x¢ñÄ]\95\ e7\95\ 6\u\1a\82Kª18§ú\rΨÞÁ)õ<´ªßG\8bz\19\9aÕi8®^\83\878¦Ù\88#\9a"\1cÖ\94Á®Ù\8eF\8d\15õÎõ8è|\ 2\a\Ú±Ïõ\ 1ln/`u\13Qã.b÷\e\88>ôûòØ\90\a<Þ·=\14¸Í||©ñÂE×>8í6\10­îÃpÜc<\8eyLÇaÏÙ°{þ\11\r\9e\8bPï¹\f\a=Óq@\9b\89ýÚ\rاý\b{´&ؼ*`õªÆnï:T{7a§÷ETùÜ\81ŧ\ 3\95¾¢PÑEy\17"\8fr\aËÊ]\96¸\e½Y\82t\ 2.ú:à¬\97+Z|\ 2p¬G\7fØ{Æâ\90ß(ÔùMÆ^¿DØüÞ\85Õÿ=Ôø/Fµ\7f2vù¯Ä\ eÿlTùçb{@\ 1,\ 1\f¨ByÀ\1ea\9bî°P¦;+\94\ 6~#\98\82\9e     ÅA¢PD
+ß@\fdü!ô\eXjYî?e©=¡\97¢)P\8dÆ \1fÔõ\ eÆ\9e>\ 3QÓg\18véÇ¡J?\15ÛõïÀ¬\9f\8b
\ 2\94ë\97`«>\ 5\f¡T¿NøX¿I(Ñ\9b\84¢`³P\18l\156\a7HòCNI6\85Ü\92\18C\9fHrCEIίx\1a̲\17\ 1\fimc\99?Æ×Æpö\9e}\1daëç\81êþ\81¨2\84Ál\88E¹a$ÊÂ&¢4l\ 6L\86Y(6ÌC¡áOB\81\90oø/Óå\1a\14Õ}\86ñç\öì\12)A\1a5\185\8aJ\14\v²Â\ 2.à®{\81]8À\ 1\ eËîÂ.Ë.·]n\vr[\91Û\8a(\97­\1aÂ%\8c¦*X\93èèÔ±\19mSÓ¦i3¶Î´\9dvò!m¦Ó´\93t2M3M\9a¶il¶/2füð\9bÿ9çËó¼ïùß\9e>f&m\98\99J\9b`O¥\9dfO¦-±'ö_æ\8eï¿É\85÷¿É\8d¥¿Ë\8d¤\7fÂ\r©¿"¢Ü±Çø\98jÿ}6p/\1f¸{\88òV\1ep\8d¼\ÉàqéÀz\9cÏÜ\8a\175)\98Óhð¼F\8fÓ\1a+"\1a   Ó\9ajLjÜÌIM\ 3s"³\95\19ÏìfÃ\99!v43Ì\ egNsC\99óÜ æ"\1fÒ\ç\a4w\15ýY¿Sôe}¬èÉ~@DùÇùPCÇ\1céÿÔ\0ܦ£î\1a\8d+äå;t\ 4/åÄá\ 5m"Îh\93\11ÉUc*7\17'sM\18Ï\15\11έdFµNfXëa\86´Íì ¶\83\ri{Ù~í0ק=Å÷hgùníK\8a.íUEgî\ f\85\8eÜ_ í¹\1f     íyÿ\15Úò¢\8aÇy\9f´î\93îÝBÊ\19\16àr\ 1p\9e\8e\99\ 5\1de®Cë\10ÑmÀ¤n\aNèS\11ÖgcD¯Ç\90Þ\82A}\19\13ÒÛ\98~\9d\8béÕùØ#º\0Û¥ëæ\82º£\\87n\9c\9dQ´êΠ       ~Ý+B\8bY\7f_Ù¤ÿ+ñ\85Ш\8f>B±Ê\1f¨æ·I÷N1õ@¤\9cQDúäç,ù\986ª0aL@Ø´\ræ½\184g"dÎG\9fÙ\8c\1e\93Èt\9b*\99 ÉÁt\98<l\9b±\99m5vr~c?ßl\1cS4\19#B\83ñEÁk¼¢¬7½¦ò\98~A| ª3ÿGYg\8e*=æ¨à1­ñÎaú\ fV\9a\87¥4\aÊ(ï\95Pýäg\86|\9c(ä1Z\18\8fc\96Í\18°$£×\9a\8e#V-\82V\ 3:¬V¦Í"1\ 1\8b\8di±¸Ø&K\ 3Ûhiã|\96^¾¾pDá)\9c\12Ü\96\ 5¥ËrYUc¹E¼\1dã´üEå´þ\8b\88*\9d\96¨ð\88ß\98\817¨þ\9btåY.§\1eÐ\15,B~&¨\1f£E\f\8e\16Ç¡OÜ\84nq':ÅT´\97d! êÐ"\16 I,a\1aÄJÆ+:Ùz±\9e­\13ý\9c[ìækÅc
+§xJp\88sÊjqYe\13oªªÄ\9fÇT\89ï\13\9fÓsT¹\8aM\8c
+«Ü§9ð:éÞ¨¢ÿ@W\8dYºöL\92\971êÇQòÒ[\16\8b\ 6´KÛ\11\90RÐ,e QÊ\83O2¢^*bê¤rÆ%ÙÙZ©\8euJÍ\9cC
+òÕÒQE\954!ÈÒ¬²Bº¨*\97¾\17#Io\11\7f"þIïQeyÙC\84UîQßï\90îÕjà\9c\8dîùäå\ 4y9F¾zÉK°"\ 6­\95        h\91·¢Q~\ e^Y\r\8f|\10nù0je\vã\94Ë\18\87lcªe\17k\93\e9Yîà+ä\ 1E¹<.\94Ég\95¥ò\ 5\95(ß Þ\8c)\96ÿ\18\9f©Äʨr\95\92ʨ°ÊϨÖ×Hû\8a\13XtÐ<´S\ fÈO?ù\b\92\9f\80M@Su<¼Õ\9bá±ï\82Ë\9e\86\1aG6\1c\ e\1dª\1d\ 5°9J\18Ù!3\95\8e\1a¶ÜácËìm\©½\8f\17íaE\91ý´`µ¿¤´Ø¯«
+í?&Þ#>U\15VG\95\965\84U~BµÞ$íåZÊ\9c5\94·\88!òÓM^Zé{£\93\83§&\ e®ÚMpÖî\80ݵ\ f6W&dw\1e*Ý&\94»\8b\19É]Á\94º\1d¬è®g\8b]\ 1Îêêá\v
+³+"\98\94F×5¥ÁuWep½«2ÔþCi¨ýJi¬\89
+\8fø\11ÕzÃE{R\1dp\86âÀqb\80ÞÛÉS#\8duôÝé\89EuýS¨ònC\85w\ fÊ}j\94ù\ e¢Ôw\18¢Ï\82b_\19cõÙ\98B\9f\9b\9aY\93¯\8b\86x½wZ¡ó.        \87¼¯
+ùÞ×\95yÞw\94ùõ\9f\bùõÿ\13\ ey¢_s\87j½J\11`\89\98&F\88\1eÂOÔy\ 1\a]Ëå¦\18\947¯Gióf\88-»PìO\85Õ\9f\ 5\8bÿ\10
+\ 2f\98\ 3"\8c\ 1\991\ 4j\19½¿\91=äïdóü\83\7f\92?è_Tä´¼¬Ènù\81"Ûÿ[\1aÿ®Èn~ Èi\8a~Í-ªûJ#0GL\90ÞQ\1a;\89\ 6º\8a;Z\80\8a\0PÒÆÃÚ\11\87Â\8e\8d0wn\87\17\86à\ 1\1c\ ej¡ï2@×eE~W9òº\1c\8c¶ËËätµ±YÁ\ 1V\13\9cà2\82\81àwyuð6\9f\1eü5¯îü\e¯îø\92W·GyuÛ\1a7H÷¢\9fÖ\ 3é\8d\11½ôÜJxZ)st\90~\17P@1Éл\ eº¾\ 4ä÷oA^ÿnh\aRqp@\83\9cP>²Cfd\85J   U!#ä\86:Ô¤\87z\98´Ðq65ô<»o`\99M\19ø>q\9fMéÿ\88Méû\82\8dr)=k¼Ju.µÓ\9eÐFë\91Æ ÑDÚ5¤-õ\ 2\96\ 1Ê\9e\14[µÃ
+d\8dÄ!st#2ƶãÀØ\1e¤\8f¥c\7f8\aia=RÃ\16|+,a_Ø\89\94p\ 3ö\84\83H\ e\8f0»Ã§\99\vÌÎðM&)|\8fI\1aû\90I\1aù7\934\1ce\93\86Ö¸LZ³Äq¢\8fhë¦\1e\90\8d´Åc\80q\14È=\ edL\0©\93O ej=öN'â¹é$$O§`÷\8c\1a»f\ e\8c\ 1I\91\88ÈØ\1eqãÙH+¶FBØ\12\99Â3\91sH\8c\ÇÓ3o\11\7fFâÔçH\9c\8c2\89§Ö8O1p¦\8fÖ#ÑMÏ\8d!Z\a¤-\91vÁ8\907    dRLL=\ 3ì\9eeñì\,¶Î'`Ëüf<³\90\84Í\v)H\8\80§\17µØ´hÄÆÅ\12lX´ã©Å\ 6|sñ\bÖ/\8e#~q\9ex\ 5q\8bo ná=<9ÿ)âç\1e þ\85èCæ\86h_$Í\ 1¢u\98ÖÂ\18­\ 3ª¹h
\9f\ 6²fI\7f\ 1H^\ 2\9d\a6]à\90p)\16ñË        D"\9e\81¸\95½\84\1aßXÑ"vÅ\8cu+\12\9eX©EÌJ\0Ê\95A\bËß\ 6¿|\11ìò-p\97~I|\0îâgÄ\97\ f\89P\9fGÂ@\17ÕÜp\12°SÍ%gi\ eÎ\ 39¤»\9fâiò%Ò¿Lú/\ 3ë¯\ 2±×\95\9fë²\ 1«1Mãøÿ}ßSÑÇQQB_C\8aRJ\85SNéÛé\1a\93\8fhª©¤¦¢\94HER\r!\84|ÖdB¾2Ñ9>\1a¢¢eȲZfÇ\9a±\835\9a5Ë0\8cÏżó¯mwí\]¿ÎÛõ\9e\9eÿÿ¾\9fç¹\9fûÑ\9a\9a\ e\80 eS¬eSª\e\88éxèêx\0è¸Áu\9c`\1d\fDû99\ 54|Cî\93§Ý¬`®ó\19óìµ@\1cc\9e\    \840^_êºï\ 5\9cøo¶\r\80å!Àô(`ô\ 5 ×$\ 1'\f\89\92ô\ 5NòRp\92>\9aÙ\9c6³9m¡\8fV\1e\86­<\ 4Z¹Ñ[9É­\f®u;ß\1dáçyr\93Ï÷»)ÚÀ½°\19\98É\98§ñ+\1aÆ«f¬£´À0jÚRÓ¢    P6\ 3½\19\82ø\a\80×76À
\1c}\9c£\8fóæ@»\15\9bR;à\8fNlÌØ\14\8fËlL:X\ 4;¸ù:8Ñ\1d\f²\83\81u\1c'íäF7yÛ\80´\9dÜ\8bû\80\ f\18o\0\8eQÿ\ 4\ 2ô=\r\98PS\9fÖy\81ä¸äÏä
+¹*\ 2\ 2¾6\ 6®\99\ 2ßX°A¶æE\81\97\95Ûl\96ïÐÇ÷<\98ï²ðßÍâ\ 5\8asÒÉDwî'\f®óL7\19\8c\0çà0\10Ìx½\19ï0êZS×\9cV\8d/\ 2R\aõ¾"×ÉßÈ­\1eþN¾'w97?ÐË=\13àG3à\ 1\90\17\97Ǽ´üB\1f\8c<ãÁó\9cÅî\ 5\17Ý\8b*à%\85_êº\91¥þ\90\83\15\19BF\92qd\ 2\89$ñ$\15o\91\85×ÈÅ+\14â%\96â9Vâ\19Öâ)6â       *ñ\18\19»ñ\10õø     Gp\1f-ø'.â\1eÍþ\83o\7fà\b\9d\1céîï\90\rúò·Y\ f]>ì\88\v\19C\82ñ+"ð/Äà\ 5\92¨\95N­yÔY\88G(¢Î2ꬢÎ:êl¢Î§ÔØÁq÷á\ e´¸\8d&ÜÄ9¦î[þ<`\1a\1aGíâ¯äz\ f²¡)s¡ä\93      1'\ 3\89#Þ`\14uý©\eÎ\b¦Q/\9eZ)ÔʤN\ e§`\11u\8a©SJ\9dÕÔY\8f\eØÂ1·ákìâÔÕsÉ4rù´á\12\9f.Òá\ 5\9d£ÿ\1eÙØ\18²~/È¢!ÿêÓ\9d\8b7°§î\b:WáG\84P3\82Ù\8c¦V"uÒ\18C\16þ\82\ 5¸\8a\ 2.Ïbê,§Î\1aêl N%Î3\17\ egp\88\ e\9aq\8aoZèº\99Y<Éù8I\95\13ï +õ ÷\ 6᧾\11\94¹\1eÀ¹\eJÝQ\8cÏ\9f¹Ó0\92©Ô\8aåhIô>\9b\19\9eK\9d\14\ 4§±\ 2­\\eÍ\9c\93\93ÌE\13×Å140\13M\\19íts\v\11´Âk4\882\ eJÿCæ\96\92¹Åe.éçF\12\9e\18\18â\8e`\86\e¢\r®J.¸$\8dA»"\bg\15\13Ѧ\98\8eV½84ë%ã\84^:\8eëeã\98^.\1aõ\16ã\88þR\1cÖ/\83N¿\ 2Z\83*\1c\89z\83zìïu\fu½Ïa¯áwØcô3v\19¿E­\89\8c\9d=ì 2·Ò\e\96\98\a,wwÈ\8d>\12®õ6Âå^ýX\82\ 6ã´±;\9aMÆá¸I(\1aM"pX\19\ 5\9d2\ 1\rÊ\8fqP\99\8eze6>Wæ£N¹\ 4ûú\94bO\9frìî³\ 5µ¦Û±Ãt?¶\9b6â3³/Qmv\13\8f±µ¯\8c-ýxNõ°\89È,+?\rbIa\89»J.ðùl?=´\99*qÂ|\10\8eö\1d\ e]?o\1c°\18\8fý\16\1aìµ\98\82Ý\96Ѩµ\9c\81\9d\96)Øn\99\81\1aËyØf¹\10Õý\8b\7f%*ûW`\8bU56YíÅÆ\ 1\87Q1 \rë\a^Gù \87Xmý\16«¬ånÊzxjÃ\123\94%\88GÎyg\96{GöúöÀÑ\ 1Fh\18h\81:ë!Øm3\12;m}Pc\e\8cjÛ÷Qe\e\89­v±Øl\97\88Mv©Ø`7\a\15v9Xg¿\18\97a\8d}9VÙoEÙ{µXñ^\ 3\96\ fnAéà+Â'Cî\v%\ e¯\85b\aY(z\87\aÔ¿áÊø=þ}Ü\1cbi«§\9f}\ ezØ5Ä\f5\ e6øt¨3¶8zc££?*\1cðÎ1\ 2å\8eÓ±Úé#\949ÍÄJ§YXî\94\85R§<,u*B\89S\99P<l£°dX\8dP8¼^(\18Þ$,\1aþ'!ßù\9e\90çòJÈu\91»YÐ\85³,t\8e`ù÷\ 2ÚÆ\ 2GH\9d7PK/\9fÑW\95³\12\9b\¬°~\84\ 3Ê]ݱÊÕ\a+\\83\1a\8e¥®\93Qâö!\8aÝâ±Ä-\19\85né(p\9b/,t+\10òÝJ\85\·uBÎÈjaþÈ:1{ä\17â\÷\vb\96\98éñB\9cã!ÿ\1f·xä_Pñèõ\ 3\ e¨Ùßú°¿\1cÃ>Û\93÷\r\ fC¬ñè\87\15£ì±ÌÓ\ 5%\9eÞ(òôC¡g(
+<'b¡g$ò<c\90ë\99\88\1cÏTa\9eW\96\90í\95'dy\95\b\99^kÄ\f¯Jq¶÷\1eq\96÷\11)Íû\9c\94\8e\94\19\91Åw¹N½³Ôo\f\ 4ö\ 6\0Õþì/yÌ\943'+G\e\183\14\8f±Æâ±NX4Ö\ 3y*\1f,P\ 5b¾J\83lÕ$ÌUE!S\15\87\f\90®J\17f©r\84\121EU&&«6KI>µÒL\9fCR¢Ï\19i\86ïmE\82ï/R\82¯ü\1fÄ.®ø\ 2§©¯\va\ e\82\19\7f\10õÇóÎÇ\9c|â+¢ÐW\89\85㬰@=\ 4óÕ®\98«\1e\8dLµ?2Ô¡HWOÄ,õT¤ªc\90¢N\14\92ÕiB\92:[Hô+\10\13ü\96\8bñ~\e¥\8füvH±þZE\8c\7f\eùN\11íÿ\84ÈÒ»\bÜÍ¡\\87l{¶±\ 5«àóJza»\8eÅ|\97\18óÇ[ +À\1e\19\ 1Î\98\1dà\89´\0\ 4\ 6!90\1cI\ 1\93\90\18\10\85\19\81ñB|àÇB\`¦\18\e\98\ 4.\93>\f\/E\ 5Ö(¦\a\1dTL\v\88\fú\96<&¿J\91\7fig\ e\8e³ÝÙÇV£2\9c9àóRz)d>rIv°!æ\ 4\9bcv\88\rRC\9c\90\1câ\8e\99!c1#Ä\1f  !a\88\v\99\88Ø\90\84Æ
+Ñ¡IBTh\860=4W\8c\f-\91¦\86®\95¦\84mSL
+«'-\8a\88°kz\11a\8føù\96ÈR\17\93ÈYÎA#[\8c]dóû¼ëÐK\11½ä3\1fÙô\92\11f\80´  ¦H\9e0\10\89\1a\a$h\\11§ñF¬F\8dhM0¢4á\98®\99\8ciáÑBdx¢0%|\9609<G\8c\b/\92>\b_#Mü\8dë2\8f\8bºÌãøç73\8a¢(à\91Bj\82+\8a7&\82\82\8a
+"Ç\0\830#2\1eL*\8c\a\89£­\18°©yð2×T¼2E¬Ìõ$³\³CtÝ2_Û®í¦f©­«\99\95m³o^R¯Ýýã=\aÌïù|¯çy¾ß\94-\96´Ô}\96ÔÔ\13\96\94Ô\8bÍRR¿âó¿-©)>óÏ\9c"\a\a\1d\19ä\ 1\92\17{\9e$\1e³±efªE\ 5im4%í\11å§wW^z¤\1céQÊM\1f¦       é       Ê¶&ËfÍP¦ÕndX§\18VëL#Íê1¥Z\97\9aÆ[W\99\93­\9b,ã2öZ\922\8eÃ\ 5¸cI²þ\b>ó¸&ÞÄ÷ý6j!\8b<@\19<\85MsùûLì)À.gf\80ò2ÛË\9eÕU9Y\11ÊÎ\1a¨,[\8c2m#eµ%)Ý\96®´ì\1c¥d;\8dñÙÓ\8däìbSR¶×\94\98½Â<&{£ytv\8d%!»\ e>\80Û\96\ 4Û\ 3óh\9bï!Y>óq4öM \16`\ 5,e,x\12\8a°¥\0Ûòùì\98௠      9Á²å\84*#·\87¬¹ý\94f\1f¢T{\9cRìc\95lOÕ8\87MI\8e<c¬Ãe\8cqÌ1\12\1c¥¦Q\8e\bÇ\ 6s¼c·9ÎqÌ\12ç8o\89³ß2ÇÙ\7f0Ççú~á(\1a»íÒóPÁ8P
+Å0=\a}Þí\ eÉ6ÑOÖ¼@¥åuRʤîJÎ\8fÔ¸ü(%æ\ fÓXg\82Æ8\93\99©QN\87F:§\19ñÎYF\9cs¡i\98³Ü\14ë\o\8aqî2\ fu\1e1G;Ï\99£ó¿4\ fÍÿÞ<t\92Ï\1cÓH\9eÏ|\10í\1dyÒZÆ\802X\0³`*\7fË\9dD¿í\94Ò&\9b\94<5@\89SÛkì´®\1a]ÐS£
+úkdA´F¸F(Þ\95¨8Wº\86»r\14ë\9a¬\18\11í\9ao\fq\95\19\83]U¦(×NÓ ×!8c\1aTpÓ4hÚwà3EM}È~Zÿ-è¬\84%P\ 2\7f2þOE¿\80¹\8bQ)a\86¿FÌ\fR\a\88\86\17\86)¶¨\8fb\8a¢4Ô=LÑî\ 4\rq\8f×ãn\9b\ 6»'i\90\ 6ºK\8cþî§\8d~î5F_÷v£\8fû\80\11é~Ï\88,ºnD\16þÓÔg¦ï\17j\19     7 U\ eOÁl¾\17\80ÃÅÌ3C\1aW(\8d\9a%\r\9bÛLÑÅmôxI\a\r.骨y=5p^\7f\r\987Dý=ñêçIT_Oºúxì\8aôLSoÏ\1cEx¼êéY¥\1e\9ej#ܳ\1fN\eáó®\19á%\rFx±Ï\b\9fû\90\9dø¸æ  Î\ 4ð@!ß'£=¡\88¹o¶4\9añh¸\87Ùk\81Ô\7f\91¿ú\94\ 6)²´\93z/î®\88ŽÔsñ@ýÊ\e£\1eÞQ
+÷&+ÌkSwo¾\1eó\16ªÛ\92\85겤R\8fz_P¨w\9fB¼'á²BJï+tÑO
+}Êg4²  ­g¡\14æ\80\8bÑp"Ú\19h'2\16Å3®\ eY\8cþR)¢Ì¬°g\ 2ôXy°º\95\87¨Ky\98\1e­\88ThÅ \85TĪsÅhuªLÓ#\95¹êXéR\87Êyj_Y¦àÊõ
+ªÜ£ \8a7\14Xñ±\82\9e¹« å\ f\14¼\9ci¢Ì§ª¹Ôâ\1ci>ïEà,\91²Ñ\1e\8fö¨%ÒÐeÒ\0ÆÄ\bF´î+¥\90ÕÍÕam\80Ú­k§àu!\10¦ u\91
\8a\82áj[5Vm8ì\ 2ªòպʭVU\8bå_µZ-Öm\97ߺCò[[\ f7ä·¦A-Vÿ\bôsèy¡\18\ÄÛ¾HJÇç1eRl¥4\10Ý^kЯB\7f\83Ôn£Ôfs\vµªn£\96ÕíÔ¢:D~Õaj^\1d)Kõ`\99«ãeÚÊá»\95Ãf+\ 5]M"«Ë\81\a·ì\83\934(\7f\85Ûð-\8dÒwZ^ÊÝ\ 4\85Ä;ÿiöâr) \9fã\9e\93¢Ðí\8dnwFÔÎ[¥à\1dèï\92Zîi&sMk.:\ 6\83\1a\9aâ½\8fB8ô\91jiÊj¹pk¹xjÙäµ\14u-\8b×âHíN~s\ 4ÎñÜ\17p\17¾ÑRb]\8cÏÓ05g\ 59à§#\9e§\ 6Ñ\8dÜ\86þ\8bèïA¿V
+xEò{M\0pÈ\ f°ã\10v\1cÆ\8eÃ4äGÂh\88±ã\18\rá1.ÿ:\ eû:6z\1dI®Ã¹:bQG,\8e½\ 5\1fÁ\r¸¥\85Ïr/¬\92òÖ±\17\7fË>¨¦\ 6Ðí[#\85½\8c>\9aA\87¤VG%Ëëh\9f\80·\9a\9c\ 6¨\15Íh[ém\86\93Ó\9diÊhÊßmlÒ\89GccPÏ¡_ONêIt=\89­ß.\9dý\1d\9câó\ 5¸¤¹ë9\13\ eñ9é%Î\ 1t\a\1c\90z\10²ÎuR \9aþ¤Ðà\11½\ 3gàl\13\7f\80óf1\10Ñ\183¨] &\17;J\1fw\95>é%}\8a\1d\97iB®P\eWf2ÄPäWIðU\84®\12Ì«8rõ´f`ÖDb\9döª4ò05\80n\ ft;¡\exZjñ~\93ÞyÀlý   þ\ 2\97\80ÒÒ§p\ 5>³H\9fûK×\19\1co\12\93[ÔÈ\9d\békòr\8ffä>\17Ï7\1c\90ü\ 6\92Ý@a5ì\87\83L½í ¨\89\ eÐ\rúB,$B&äé'fÝ\a\9a¥ïåÑ¿´Hßêi5¨\÷µB÷\98u¿Öz}¥Mº£íº­=ºÅ¼û¥êtCïê:Æ~Î\7f®±Â5Vûìÿð)\10Ú@\0\ 4C(ô\82ÇÑMà©44sÑ\9b\82Ö\fÝÕ\1c4棱X\7fׯuS\15è¬Dg-:\eXs\8b®êE]Ö>\94\ f\13®ßëc}¨\8b\11+]`åF>ü/\1e\ 4\7fh\v\1dÑ\rã×\ 3Ð\1d\8e\7fãð \v½<t
+ð£\b\8db4\16èoØñ\89\96\91\9a
+R´
+\9d*Öߨ\ f´\8dÔíÑ9½¦z\1d×û¼¾Ë\93ï\10µÓxö6*§àí&|ææ¼\1aÐøÞ\9aX\aáo\17ýC½ñ1\1aß\12Hw*>M@'\1f_\h¸Ñ(Ac\ 1«{)ÓezO\95è<\87ÆzÖ߬\93ÄâM½¬7tT¯£~\fk\8fâÍaý\0¾ÿÁG)ùô3Í\89s\0þvÄÏ0ý\99X\ \16ç©\8b³²¢cgµÉh<\81\86\e\8d\12¶ê\ 2<õ¢S\86Îot\84Ú8DN\ e\12\8b\ 3ª¡*\ eê\15\8f\95ö\92\8f½D¸\ 6¥Fö4ác\8bû\9aQºl±/\eË[~ø\e\88n(1\8cÀ¯Á¬0\ 2­dt²ðÅ\81íSXy:\1an¢]¢Wµ\10\9d%è,W-5ZCNv\13\8b]zI;±b\aÑØf\9c×VÓ\rU[\1a´ÅâÓæf\ fÙ\ 4>¶Ó=¶Ó\17líK\1c5\7fäÈ9cnE\9eÚé\84©\9b\8eý\87éz\8fjò>ã\0þý¥^¨\16\ 4TPn\ 1\ 3\ 1B\84\ 4\85\ 4\12\92@B.\90@\ 2!\ 1BÂ-     \17!\b"\8aBAQDT\14ëýR\9du¶ÎºÖÖεgë\99Ýéz¶³Óý³ûé\99Ývvº\9dn«Ý¥]ö\88\9e\9dýñ9oòþó|óæ=Ïïy\9e\13âîª2|kµ\16¯®1áæ\1a;n¬mÆõµm¸¶¶\13\86p%f\a\8câbÌ^\9c\8f\99ÁÙç\17pæùe\9c^w\19§ÖÝÂÉõ÷qbý\8f\85GX\8c}\8c£qQ,<s\84<N\0>M¦¶B­ö!µ¹ïRÛ}\9bòÜ[\17\8b\93q+6\e7âD¸\16§Ä\958\1d.n0ãü\ 6\aÎnpãÌ\86v\9c\8eïÂr|\18\87p"~\17\8eÇïÇbü!\1cMXÂ\91\84\8b8\9cp\13\87\12ßÂÁÄ\ f1»ñSÌlú\12Ó\9b£+¦\9eù,\ 5øe\16µ¡\1cà\1dj÷w¸´÷ѽW6­ÁµÄ\ 4\94\81s\9b\ 5xi³\ 4§\92ÔXJªÆñ$+\16\93\1a±\90Ü\82ùd\1f\ e'wc.¹\ f\a\93#\98Ý2\81\99\98Þº\88ý[Ïb_Ê7°7å\rìI}\88\89´O0\9eþ\ 5v¥G1ö\7f\1e\9fP{\7fWH{¯\80\8e1jm\97è\b<OYΤÄádÚ\16\1cKÏÆBF\11æ3ä\98ËÐà\0×\88\19n\1d¦¹NLq=ØÇíÀ$·\17{2\a1\919\86ñÌýØ\955\8fѬe\8cl{\19\91m¯c\98÷}\fñ~\83Áì¿a ;º¢ÿ\99_Qý\ fDôì\8béH¥ë\85B`\99²\9c ,\8b¼u\98çmÄÁl.^Ì\11`*§\14ûø*ìáë0Á¯Å8ß\8e1~\13Fù­\18áw"\92\eÆPn\ 4;r÷` ï úó\96\10λ\8cPþm\16Ì\7f\8fõ
+~Áº\ 5\9f³î\82(ëzBðÔÇEtäI\81Ûä2µöStÌ,R\96\81\ 3\825\98Î\8fǤ \ 5\13\ 59ØUP\84\f#ÂJ\f\v«±ChÁ °\ 1ýB7ú\84>\84¶÷ ¸}\10=ÛÇÑ]8\83ÎÂc,Px\81u\14Ýb¾¢\aÌ'ú\19k\17ý\85µ\89¾&Ñÿù\88j~GIÿ¿\82F\1c²(£}\8b²LÓs\99\141ì.\8aè(       \11Q\16v\88\v0 .E\9f¸\1c!q\15\82b\13z\8aëÐ]ìBg±\17\81âNt\14÷ÁW2\8a\92)ÖZ²À¼¥çXKéMæ\96¼C~Ê\9a%\9f\91¯X\93$º¢\99|@5ï©\81\97É)\15\9cêS\96=eÀ\18å\8b\94®Ç d#ú$é\bJrÑ#\15¡K*C@Z\ 1¿Ô\0\9fÔ\82\ 3­enxË:à)\vÂ-\8b°fÙ$sÉæ\99\12k\94ßà4Èßæ8\14?&\7f"ÿf\ eE\949äO½O5_×Ð{HcÏq2KcØ^Ê2F9\86)_¿<\ 6Ay\ 2ºå)\b(²Ñ¡\10¢]Q\8aVE9¼Ê*´(Mp+ëФtÁ¥l\83³¼\e\rå;\98£|\82ÙUs¬^µÌlªë\1c«ú\1eù\88ü\91cQÿ\8b®QfU=õ\1eÕ|\8dÆ\8csd\81LÑè3NY\86)G\1fåëQ­F@\15\a\9f:\19­ê,xÔùp«ÅhRËáRW¢±Â\80\86
+\v\1c\15\8d°WzPWÙ     [å\0³jÆ\99Es\80ÕjN1\93æ\1aǨ}\83|Hþ@þÉ1j¢O°'\1e\9bzà49D&ÉNº7@9z\88_ÃЦ\89\85G³     ÍÚt¸´|4j\váÐJQ¯UÁ¦­\82­ª\16Ö*;,:7Ì:?Lº>fÔ\8f±\1aý\f«Ö/1½þ*Goø6Ggø!ù=G§ÿ\a\89rôO±û4â\§Q|\89Ì\92ÝÕ´oѽ =\ f?eiÕѬ©_\ f§>\11\r\86\e\19
+`5\94À\­@mµ\ 6¦j#\8c5u¨©iBu\8d\ f\ 6c\b:ãNVe\9cfZãq¦1^áT\1aïr*L\ fÉ#N\85ñKú\1eåTÖ¬`o\1a\81+&à\18\99&£¤\9fîuÒóh¥<Í\94«Ñ\18\83zS<l¦-0\9b²`ªÍ\87±V\8cêZ\19\fæ
+èÍ\ 6èÌVTY\9cÐZÚ ±ô Ò\12ajË~¦²,²rË%¦´Þá(¬? ¿ã(-\8fI\94)ÍQVNîZ¨/\99\81#d\92DH\90´S\96fZ\11\1aès\9de5ÌÖ8\18m\9bQmË\80ÞÆ\87®®\10Ú:    4u*TÖëPQ_\v\ 3\aåö.(ìC\90Û'\99̾ÀÊì\17\98Ô~\9bIìï\93Oèó\17LZ\1feÒº(+#¯ÙhÕ!sd7\19$]ÄC«A\ 3]m4\9a\9bì\f\ 6Ç\v¨jH\84¦!\15\95\8d\e\v r\16£Ü©\80Ò©\81Âi\84ÜU\ f\99Ë\r©Ë\ f\89k\0¥® Vâ\9agb×9&r½J¾G~ËDο3±3ÊÄ\8dOÝ°\ 3\8bd\94\84I\airP}\1aÉ\8dN@ç¢Ý³9\ 6*w<\94îdÈ[2!kÉE\99§\bR\8f\14\12\8f\1a¥\1e\ 3J¼V\88½.\88¼>\14yÃ(ô\8e\9dC\81÷\f\13x¿IÞeùÞ_3\81ç¯LÐò\1f\12e\ 5î(»Ú\b\1c%\93d\88tSÍVÒ@uÍ´ªé[hæ§UIѶ
+ÒöX\94ú6¢¸#\râ\ e\1eD\1d\ 5\17£Ð¯Àv¿\16B¿   \82\80\ 3ù\ 1\ 2½È\rì\ 4?0\8b\9cÀ2²\ 3¯\80\17x\80m\81\9f\83çÿ\1c¼\8e¯Y¶/ºâ\1c\8dýsd\9cêõ\13?q»é\1dð\0\80¦\9dêûi÷ë¢Ý§g\1d\84½ñ\10ô&#?ÈE^\90\8fÜ`!ø!      rB*d\87\fà\85\16nFf¸\13Üð\102ÂSH\ f/!-|\1d©¡ûH       }\8cÔà\9f\91Öû\15Òz¢+NR­i2Bzé÷¶\11'Õ6û\80ª\0@m\ f\92 Õï\ 3ò\ 6W\817\14\8b¬¡Dd\ e§\80;\9c\85\8cá<¤GDH\8bÈ\90\1a©DJÄ\84­\91\ 6$\8f´#i¤\1f\9bGöbÓÈ"6F®à¿\\97yT\15d\1a\87\7f¢"\¶\v\\ 4\ 5\ 4Ù\12T\10.j:Z\99S:*æ\8a\b\ 6¢¢\82\v²ª \8b+\Ü\10\ 4\97Ä\ 5\R\12EG'·r­IsLçè\98:\8e§ÒFs\e§±´qî<\16z:ýñ\0çpï÷{·ïýÞ×-{¿\³ÏÉ-ë®Ü2\9fÊ=Ãú3Ëð³\0ÒÑL\81\ 4Váh÷Gû5֢]2¤PÖÅ\80Y\92O~+y\168«u\81»<
+¼e*\f\90{a\98Ü
+#åZØ\13~/cÑ`¹\14Å˹h²\9c\8afɱ¨L\ e\8552\14î\96}Á'2\14|#Ã\9cïå\90ÿL\ eyV-J¡\16!\r\92\89wìdb\80ö\9béR\8f,)r¦\14\96'\ 5\16¢?WòXÀ\ eXb''\8b³\1c-&ð\96\83%P\ 6KGÙ[̲³ô\96­¥¿ZZF¨\85%Y6\96\f5³Ì'áÕRév\ 6\ 2\92+4Ä»ð\1fxªBâ\9c\ 1\93ÐM\98J\1dÌ\90ÞÎ&\aøl.@\1fÝÀ\85è\97¢¿\ 4ýå\92c\85­l+\1deSÉ0º\92\1dw¥/\ 4\18ƪxø«hòU4\96j\8a«:\95¿q¢j\19\9fÙ\ 4û\18\90\81¼\ 5\8f\80Í\11Íi06\93»@¼ÿ0\9b{\80Ï]1½\13º\81K%ï\15\92\895Õe\95dX+µ¨a\11Xo/m` ßàÆ£ËP¼\11;61\94Ö2üÔòð×Ñèë\86@\12\90Ì:\ 2\ 6vò¹ãp\r¾ã{\8f\94\95KO"Þ£ó¥\98br\80ϯ.\96ÂË¥ *ôÑ4­\97\9cqÁ~³d³\8d%d\aÔ³\1cÕ³\18|à$í$\1e;\89G\83\ f\ 3\19ñØ\8d\1d\8d=\80\87g\ f\17~\ f\83s{\88Ec\1d¿ÿÄïÓp\ 3nk*>'Í\93\86\95\90\ 3|þ]%5\88¹!èúðqw4\9dê¥V\rèî\ 1BÉB%}\b\alÀN:èÈPÎBpØ$\1daIø\98¡ø\18v\1cg\b9Îãs\82Ë~\82D\9fDè$Á<É\81'\ fÃ\19¸¢\14\v=\11ó\ 6âóëïQ\ 3µÜÁ÷%_BfjD\7f¿d{\0=¾ÂÂÅYp\12NÁ'ð)|FLN\93\9b3Ää,19ç%]`a¸\88\1d\97\18B.ó(}IN®PäWʤ«8x\15§®\1ed±8¡DÊuè:ú1>¿J\8c;¡ë\8f\9f\1e\87Ч\84[\1coÒû\fÎÂ\17\89\8bp        ¾\84«p\9d¥ñ\ 6ùù\8a\85í&¹ù§¿t\17;î1(Þãá¹Ïå{@}> °\1fn\0âñp/\e§\11\9c\9bp\ 3_\b\85®Ð\abô?Åê'vÌ\1f5Q\8f5Mß+[\8f4[ÿR\91\1ej\81î³cÞÓr}Ç®{Gï±·Öê\16EsS{õµ\8e²Ã^Ð\rþó\ f=Ñß9ñ\ 5×\9b°Ê    \f`\ f\ 5AèF¢Û\eÝþh\ eC+\1e\9dqè¤ê¶Òõ­rÐÈC£H_i!\1ae\9cW®kªÖ\15Õè2[ïEíBý ¡;­¿ðɳ\9ct\86Ó\7f\8bUvÐ\1cZ\82£þ+\93~\90\1f~vÔ\ 3uGóMô\ 6é\e\8dDç]ì\9f\80F\1a\1a3ÐÈA#\ f\8db\9dÃ\8e³ZÌ\99\15¤m\r\89\14î |öé\18??æ[\1f\11±#(\1cFé×XIã\v\9e¨\15ñ5\12µ¶h\ 6\13»HÒÜK\7fS?´\86àË(4\12ÑH¡\1cÓÐ\98Áé9hä\11ñb4\16qæR<_©\ 3ZÇõÙ\82\ 5»ÉÈ\115bå.²Ô@d\ePÛù+^è?\83ûjFÄ\1c±Ø¤óÄâsbñguCë\r\1d×\0|\19\86Æh4\92¸\9a\8f\1d\7f$/{±£\11;vk.ç\97rîrÕkµ¶\13\8bmüµ\85O×qR-YÛ¤\7fk#\99Þ\88ê\v\9eë?\86;@ÇÐ_e\8b\9f.hza}\10þD Õ\13­¾è\fBc¸>À\8e\1dر\9d¼lÃ\8e­Ø±\19\94\8fÆ<Î-ÓzU\12\89\1a­å\13«ùv5\11«¢ZV\92áJ*­\12åçTÀ\13®Ó\1d\a®)Wû\f×êxËç­À\80®+\9a>hv@ÏÌI½Ñy\v_bÐ\18\8eÆh4\92¸\ 5\13ÐICg\86V)\17\9dBÎ^¤\8afËUÞl\8d\96ÙlÖ\12\9bF-n~T\96\96\97Tj{O¥­\9eªÄ\8e÷²\89\a\åë´·Ó\1ehÓú÷Òî\1ah{õ¶NÚÖÜCµ-ýµ¡U'­³ë¦5v¯k\95}?UÙ\ fV¥ý\b­0Ä«Ü\90¤e\86\14-5LÑbC¦Ê\1cf«Ôa\9eJ\1c\96h¡ã*Íw¬Õ\§Ý*v:ª"§Ë*p~ 9.Ï\94ïbU¾ñ\17nñÜ\9coG\8båÉÙE»ßÚ\86§\ 4\e[¨ÆÉE«\9dÛh¥s°V¸Dh¹±\87\96\18û¨ÌØ_¥ÆwTb\1c©\85Æ\ 4-pMÖ<×I*v\9d®"×\1c\15¸\16j\8e[©òÜVj\96ÛFÍtoP\8eûGÊ6]T\96Ç}e´~\ 6Ö\9f\99\ 1×üh¹<w{a\vm~\1d\1a\9b*°e\85ÉAKM&Y<ü´¨u¨æ·6k®g/\15{öU¡ç\0Íñ\1c¢<ÏXÍö\1a£\99\94ë\95ªl¯\feµÉSF\9b\ 5Jo[®émk4Õ»^S|\ e)Íç\v¥úÞÕäv?\81U\93\9a8\1fB\fÂ\88=Ô@e\av\rì)\r`¼ðµÕ|o£\8a|Új\8eo\90ò|Ã5³]7å¶{MÙíÞR¦ß@eø\rUº_\9c¦û%jª_\8a¦øOSª\7f®&·\9f«\89í\97*%`­Æ\a¼¯q\81\1f*9ð¬Æ\ 6Ý\86§J
+²¾ä4cÇþ\bi3TÃ\12ÚûBl)Æ\96\ 2\9eá¼\0\ 6z(+Ð_\19A¡J\ f\8aÒ´ \9e\9a\12ÜGiÁý498F\13\83G(%8^\13B\925.$UÉ!\99Jz¥@\89¯\94éÝ\ e«\94\10ºEñ¡û\14\1fvZ£Ã¾U\Ø\8f`}É©HêÀLþ¡\1c\16E1çcËllÉÁ\96Ì\ e\ 6¥wpÓ\94Po¥\86\ 6kRXg¥\84uÕø°Þ\1a\17ÖWcÃ\ 6(©ã\10%v\1c¥1\1d\13\95Ði¢FwJW\ç<\8dê\¢Øð*\8d\b¯Óð\88½ð©\86\84\1fÀú\92\18I`\r,\86¹\8cb³±%\vÛÒ±eJ¸­&w6jB¸\97Æ\85·×Ø\880%FDjLD\ f%D¼¡Ñ\11o+."F£º\fWl\97\ 4\8d\88\1c¯á\91S5,j¦\86F-Ð;æ
+\r6oR\8c¹Q1ѧ\9a\r\8aþ\1a\1ekP´õ\17ÌV\1dbÜÙ
+UP\ 2\9bQlz4³>¶¤DÙ(9ÊI\89Q&\8d1·S¼9DqæpÅ\9a»jdt/\r\8fî«aÑ\ 344z\88\86t\8dÓà®c\15Ó-M\83ºåh`÷y\1aн\ÿgºÌ£¢:Ï0þ\8c+*"à\8e\12EP\14\94E\14\ 6\86a\19\ 6\86eX\ 6\ 5T\167Æ(
+.\15Ç\9a\1c\15\14¥\9a&Z\81\9a¤q_\12c\8dÆ\18\8c5Ö¥\8d1Ñx¬ñXÍÒ¨ÑZ\8dMÒäD§? æøÇï\\86{ï÷¼ßû¾÷Þ÷É0¾¬tã^\83Íø>|\ 6ß\82û\17\ e\9a\18ñ\183ÖÁs°\18æ1þT\10G9y\99\ 2%ÑÝ41ÆW\851~\1a\1f\13¨ü\98PåÅ\8cV®1VÙÆ$Ù\8d6e\19s\94\19\8cØ2¥ÇÍ\94-îWJ3-Wª©AÖøMJ\89\7fÝ`\89?f°\98¯r¼\ fî\9f\r\7f\v\8c\18k`\19\1cþ7\83\90\93b\8eEq\1e\1a\96ÃÔO9¦Á²\9b\86\14®\8cøhÙâÍ`U\9a9K©æq²&\94(%a\86,\89ó\95Ìp\9c\94¸F\89IÍJHÚc0'\1d\85\r¸\r      \89?ó:cx#Ô%S\a\98\ f3ù=\95|\14\13K!1å'tTN¢\97ì\89½\95\91è/[ÒP¥%\8d\945)J)Iq²$[\94\9c\9c¡¤d\87\12-\93\94`\99.sÊ\ŧ<+SJ½â¬M\8aµî2ÄZ\8f\18\8cÖË\1cï\19bS\1e\82»\95\9d\16\9eIÆð\95°\18ªÀ ¥ÄQ\b\ eÎg[Ú)#ÅSi)¾²Zýd±\ eQ²5D\89©\91JH5Ê\9c\9a¨ø4\9bLi¹\8aK+R¬mª\8c¶9\8a±-Qtz\9dƦoÔ\98ô\9dТ¨ôK\1cïj\8cí\ 10­¥¹µÕÊ;1Uªe\f¯\86
+\98Êï\89üß\ 1v~§Û\987m]\95\9cî­Ä\8c~2g\fV|F°â2Ã\14\9b\19-c¦Y1YVEgÙ56«@cì\93\15e¯Ðh»K\91ö\95\8a°oPxöv\85e\1f\86\v
+³ÿGáö\a
+Ïr+\ 2^eý\86ti)Ì\87\19\8câ¥\1c\vÀÎ߶L<G\163·½\93LÙ^\8aÍé­\98\1c\7f\ 6iln¨¢r£4:/N\91y\16Eäe*Ü\91¯0G\89F9\9eÖHGµB\1d+\14\92ÿ\92Fäo\85C\1a\9e\7fN#\1cw4"ï'\85ä¹\15\92ëV3\1a\ 4\9dJ\98\8eE\9b\ 4\ eHg$OÉ\95ÌØ¥Øüv\1a;ÎSQã}\159¾¿"
+\ 2\14V0\£
+Â5²0F¡4NHa\9aF\14æjxÑD\ 5\17\95kXÑ\ 2\r-ªQPÑ\v
+,Ú¬!E\aá,ÜV`á\8f
+,`r\85õè¬È¡\ e0\v&£É2ÊF75\9fý\8fC¿\10ß1A
+\9fä¡Ðâ\1e
+)î­á%þ
+.      Ò°\92P\r-\89RPi\9c\ 2KS4¤Ô®\80ÒB\r.\9bªAeUzªl©üË~§\81e¯j@Ù~ù\95\ 1¥75 ä\a\r,v·²\96±\7f\83r4\8b!\1fÝÌñRr\11¾\vÛ:¶\18ïW\86÷\99Ò^AÓ<5dº\8f\ 2¦÷Ó òÁzª<Xþåa\1aÈËd\803A~N\9bú;\1dêç,U_g\85ú8\97¨·³^½\9c\9bÔÓù¦|\9d§ä[~]=§\7f¯^ÓÜ­Ô¡µ\18K8\e¦°ß"ÈE;\rms\89\14\8d=\8a\98&\8d(\97\ 2\9fÆ\7fUtVÿ9^ê7§§úTú©we\80zU\8e\80\bõ¬\8c\95o\95E>UvyWMP\8f*§¼ªªÕ½j\154ʳr\8fºU\1eS·9×ä9û¾ºÏ~ î\15nÕ¢µ\0f@       ¶p<d¢\9d\8cvìt)\12»\1a2K
+Â.úÏ\95ú.\90|«»¨\87«\87¼\½`\80º»\ 2åé
+Q7W\94ººâÕÅe\93\87+_\9d]\93ÕÑ5W\1d\ËÕÞõ¢\f\8b\8b\ eËP}A\86\85·Ônáwð\93\9e\17a\1a¹\9e\b9Sè\ 3´ãÙsÔl)´
+}t\9fªFÿ×è?\8b\a\ÖI]j<Õ±ÆGíkú¨]\8d¿\f5|èkøØÖòr¯åÅRKS?Ú`íLàÆÚ5\9c\7f\85¡`?àu\97]§       ¾\81\1f´\90\842\18G¾3ÐND;z\9e4j¡4t1úèö].ù<\87þJÉ£®\83ÚÕ3\0×{AO\86\ e<îj\ 6²5\fDkøØ6ð\92oàåÒ@\935°©\86ùð<läü\1e®}\1f®rï\1døNU\84Y\8eî\ 4ò\9dM¾-\n\Ä3ð\8c4l\19ú+¤>¿\91¼WK\9eXÕN/`\0^\82õ\9d¥\r\f¿\e\18\8aÿ@\1c\e\89£\918\9a\88£)\82¡\90\8fa3/\99f\9a«\19\91f\16l^˹-ð\ e×~\ 4ä¢ñ\9e**É\ 1uv\90ï4\17Ï\ 1{\8e¬\95\82\8fn\9fuè£Ù\95-thF\9bt2àK¯\19 \13\ 3\18Æ`\vùØÊP¾\8d\ 1y;ÃèNâØÅ\0²\8b\8fÍn\1eþÝ\14{7\89ÝM.v7ñÿ7\80\ìºÄµ7TN\9d\8b(WÖRjÀ\9eÇü\96g\80p\a­G\9f˽_\96º¼&\19h'\8c\ 6\83?ìmãMØ×^Úï!½\85A9\8018ÈP~\88!ý0q¼Ë\0ÒÂG°\85\a¾\85B\1f\b\8b·l\86\83p\ 2\84\11\9eµ\9e\1a\90ç\91ì7\0ݾ\æ½\ 3ýG\9aûà\0\1c\82\16\8d£ð\17`K:\8e9:A\8f\9c$'§©Íß1
+\1f\12ÇG\ff\1fó\ 1:GMÎÑhçIòù\rÀâçÞ\86ã* ß\19¿ç]ÐÈ{\80\1c\ fÝ.ù¡ëCûvy¬ùHç8\9c\ 2ZZgÚ8\v\94Uçà\13ø\a|J}®Ð'×|¤/ü¤¯\82¥ëFé\ 6\1f\84\9bÔäk\8a~\8b\ 6»E\92o#v{\1fn¯;tkÃ\eü`\18\8c\ 63¤ã\ eóõ?MÂ\97NñÎÒ=üå]üå\1d|îm-Ó-­ÐM<æ\r­ÕW8Ë/ñ\99\9fãt?Ó\eºªÃºBà\979sIß\13¦»\95\8bm|Òêy= C\e\8fâé­\87
\8f\1aÉ\1d\17¯{\17\8fùo\15èk\95ê:þòKüåçøËkÄñOâ¸B\1c\97õ<\1aõº u:¯\8dú\98æ=K\ 3\9dÑ[Dp\§¹ê\14Ñ\9fDáÄ\13\9cl\8dAOÐ\95ýúpå@ö\17ÌÞF\13½\19=\e+ä¡1\ 1\8dɤÞI  *ô!q|@\1c\7f#\8eÓÄq\928þªÕ´Ç\8b\94¯\99\96ÙB)÷\92\89\16½Ã\1do\93±\83\0JOòXÿ\ 1ÜWGt½Èa\1fö\15\80Þ(ö\13\83V2:\99hä³£\89:F\1cG\89ã\bq¼K]\ ek!íº\84õ\97³æ*íW\ 3\ 1õWx\8cvj\ fgv\91\85\1dúBÛõ­¶¡ø\98­m1<\84{ð/¸H.Î\90\8b\93äâ\18\9e"Ñ1±\ f++ÙY\7f\1cëOä±\9cLµËY\7f\96v\13ÇNâØA\1cÛTúuÚLMþ¤&¢Ø¢MÜñG2Ó¤OÕø\7f\9eË<¦íó\8cã\9f\10\12J\82\89\81pßW0`\ 36Ø`À`\ 36`\83ÁÜ\10À\ 4
+$¡\81&!Is±\1cMÒ4I\9b&kÔf]zd=Uu«¢®«¶µÓ\8evÕ6µÕ¤ýQ©ÒºNÝ:mk·Uí\8evÞ·d­¬\8fÞ÷÷Úz¿ß÷ðó{\1e>ÔI}Î\ 3\92/Öÿ\91xW¼%^Õ½ø¡îÅ\8bº\177ÈÓZÊ¥c×:\9a´\ 6\9fæïÖü\ 3\\97\8fGåã\11ù¸&\1fßdQ\1aû¤qXó\9eÔÍ<¯pz\85ËúÕ}\9aá^íÖ\ 5Ý\90óÚés:ñóÒþ\92\7fDÁï\14v\7f)^\89V\88Y\r=·HÓ¨5¥K¯H:\15Ò©Õ    »¥Ñ.\8d f\1f\90ƨ4&¹$\1f\17åã^íÇ\ 5öKcEÿ\92»ô¹Äi¹;¥\1d:©Ûp\'zL»}Lçñ5i\7fÉ\1f\15ÞÞTx{Y<¯ðò\94\9e¯+ì=\12\15'Í$éeK«D³Y¥ãä\9e5\1eίéàg£\ 68\135Êé¨0w®½\95\93k\178¾v\ fÇ¢\ f±\12}'G×ÝÃáuW9¸þIîXÿ\ 2ûc~ξ[Þc_ìÇ,o\88°÷ÿ¼£ÐúS\85ùçÅã)z­(Ä]Qxùº!\9aË·\18¸'&\99s±yÜ\15[Æ©\rÕ\9cÜØÀñ\8d-\1cÛØÉÊÆ\1e\8eÆ\rp8n\8cCqSÜ\11\81¸Eö\19ö³l8Æ\1eÃyn7<ÈRü\13ì\8a\7f\81Ûâ_gaÓûì4~Ê\ ecä+ÞTh\7f)çæ«æ\eê_ÊÔë4\1dî\92·3   1\9c\8a7r|S\ 6+Æ"\ e\e-\1c4:8\90àb\7fB\eË       ~ö&ô²;a\88Û\13ÆYL\9cfWâN\16\12÷²#é(Û\93Î2\97t\85ÙÍ×\99I¾Átò«L§¼Ç¶\94O\98J\8d|Åk\ 5\14ÂÃJA.©=«ç\13yJ-äç\88¼\1cJ6p 9\99å\94\v§\98XJ­b1µ\8eÛR\9bYHõ²#-Àö´\10si#̦M2\93>Çtú\12\a   g\9cb"ó\12ã\99\8f²5ë;\8c\84Ñìß2\92ó±\88|Å+
+çO\9bôú\17çÄ       =\1f.VÊ%?{åewV,\8bY ,de°#»\90ùl3³ÙÕÌäÔ3\9dãa*§\9dpN7\939\ 3\8cçnekî4£y\v\8cäíg(ÿ\ 4\83ù\17\19(¸F\7fÁsô\15þ\88Pá;\84\8aþ."7)\8cðR¹î \19.\8bÓJÅ\8e¨].\83%ùY\90\97\1d\ 5ë\98Ë\8fg¦ \85m\ 5¹\84\vK\98(¬d¼ÐÁX¡\8bÑ¢V\86\8bü\f\15õ2X4L\7fq\98¾âí\84¶ì¥GIP°ä\ 2ݦ\87è2=K ôeñ6þÒ¿\89\88ú7¹Q\ 1×¾H¿\94ú\1c\17\aÔ_ÒØNy\9b\95\97\99\925\84\18/Ib¬$\93\11S\11C¦r\ 6M6úMNúJÝô\96úè)í&X:@wÙ8]e³øËo§³ü\b\1dæs´[®â³<\83·â\aâ7âCñ_\11Ák\89ð\9cÒ\9d«6Ý\ 3¥\e\1e± ±Yy\99Ò¾Lh_Fͱ\f\99\8d\f\98Óè3çÑk6\11´TÒmqÐeiÄoi¥Ó⧣"D{Å(¾Ê\19¼U»h­:D\8bõ,\1eë\ 3xlOá¶}\9ffÛ¯Å_Õÿ\DVyF\9aW\94f\9c\16\a\95\12\9d\13Ûäk\û2,\ 6ªÖ\13ª\8a'X\95L\975\e¿µ\98\ e«\99\r\9fÕI\9bÕM«­\9d\16[\ f\9eêaÜÕS4×,Ðd¿\ 3\97ý\f\8d\8e+48\9e\14/QïxKüEýÏDd\95'¤{©VwQiÆ>± fô<¡ñaùë¯QÍS³\96@M\1c\9d5\89øì\19\ 5´ÚKñØ+qÛ\1d4;\49ÚpÕvÑX;HCÝ$õu;p:÷Sç<Emýýâq\1cõßÃ^ÿ\86Ú?\8bÿàpF¨\15\8fÕÝLÅWêu\ eJ\85·\8b°ú£\1aë\97\8f üøõ\e\ 6Ú\9cF<ÎT\9a\9d¹49·Ðè´ÐP_C}}\ 3Î\86\16ê\1aüÔ6ôãh\1cÇ®\ 2¥ÆµLµë$ÕM\97±5}\vkÓwůÄ\9fÄ¿±¹"«\\93æ¹Fý\1fÅ¢Ky¾\18\17\83z\ eÊK§¾÷ªïqÅÐä\8a§Ñ\95L}S\16ΦBj\9bÊp4[±7×QÓì¦ÚÝ\81ÍÝ\8bÕ=F\95g\96\1e*Z\8eci¹O<\86¹å\ 5Ê[~¡ö\ 3ñ/,\9eÈ*\ f\8c\ 3Í:\a±M%Ò¨Ú>Ñ©ñ6µn\8d5z¢q¶\18¨mIÄÞ\9aNuk>¶V\13Ö¶JªÚ\1cT¶¹¨ðz±x\83\98½#\94ûf(ó-Qê[Áä»\97\92öGÙÒ~C¼Î\16ß\1f(ñý\13\937²Êý_\94eJ¿÷¶À¼\98\14\83"(¼¢YåR\83ÒâZ\9fòþö\rX;\8cTv¤PÑ\99\83¹³\98òN3e\9dÕ\94úë1ù[(ñ\aØ\12\18¤80EQ`\17\85\81#\14\ 4.\90ßõ°x\9e¼®×È\v¼O~àS
\91U.¶ê.HgIÜ*­1Ñ'üÒô´ký*\95j;Á\16\80\8aî\18Ê\83ñ\94\ 6\93(éÉ`KO>Å=&\8azª(ì­¥ ·\99üÞ\ eòzûÈ\rM\90\13ÚIvè Y¡»É\f=DFèÛ¤\87~&~OFï'döDÈ\12wKë ´\16Ä\94ô\86DP´K·IºN\95®ÕAé÷\82©?\8a¢\81\8d\14\f\1aÉ\eL!w(\87\9c¡"²\87Ìd\rU\939Ü@Æp\eéÃAÒ\86GI\1d\99#yd\1f\9b\88«$\r?Kâð\8fÅ»$\r}ÌæÁÈ*wJkY©ÿ\9côÆE¿\bH·M%Zc\ fØU¶V\ e¨ö\1a\82¢QÕ\7f[cÈ\980\906\91HêD:)\93y$O\96°y²\82¤ÉZ\12'Ý$\84ýb\10cx\9aMáÝÄ\87Ob\b_\11O\137ù²x\eÃÄG\18Æ?#~<Â\8a´\16µÎi1"Í\1eÑ¡5»U\9eÕI»JåQÙ\98ôU\9eä\86!}z\rI³±$ÌmÂ8·\99Ms\99ÄÏ\17`\98/\156âæ\eØ8ïeÃ|/±ó\13ÄÌßÆúù£¬\9b¿HôÜu¢æ^díì\eDÏ~@ô­ÿcºL ¢<¯0ü"\8b"\ 3\b
+*\83\f²\88\1c\b"(Ȧ\b((\88²     (8*
+\8e\8eË©â\82©\1e1n\90&ÑD\8cQc\93Ô%§i\8c[5±Ç¦­MjÔ¨IÛ4©Ñ4\9d>\9099=\9eÇ\99ÿgþûÞïÞû}ÿ½ßÁ\7fTÇ:+Ñ+\84\1c\96\12s©Ã<r0K\8a\9cÍì5\17}ÆÅ\80y\92o\95Ô£ÚM\1e\16\83ºY\8cêjñ\93«%H.\96\81r¶D©\8b\85CÖÂf²\10\\v\v°\94Á2`\90]x\0\18\1ck\18ت頫¿\81\10ã\12È\87,\1eIF;\ eí\11¬9ºX2\97£\8fn@5ú\16Ék\89ä±ÌE®õ\1erªïA1Ñx-§ÑXÞ\9ff\83ùÒÊ\8bÆÊ\ 1g¥È­\ 4Ô\8a!+\ fZ\eá\97p\8cß^\94êïÂß9\14\9eª
+½"\98\ eé\ 5Ò\849Ôa    9¨ \ 6\17H\ 3x< \16ý:ôW0\83®\96\\1ah\84×Ñt6Ò|6Ò\88®ï)mÀ\8f\8d4\1c\eyéÛxéÙ8Øl\14\9b\8d\85Ù0fãa[\13\7foå·çà\16Ï=\82oU\86f\ 1d\11ïIÄ;¶\92\9aÃ\19M\83Ñ\ràQ\9fµ\92'Ëèf\93º\10R\9ag\ ex\9aðmîÒvühÂ\8f\1dø±\13?váÇîp©\99\97MÇá³\87BÛC,\9a1Ø̬ÛÜÂßÉÇnò±ësøZsI×tâ\9dJ¼ãkØ\a¬9r9úkÐ_/\197K\ 64Ýv »\e\b'\r>Í'ì'\1e-\f\ 5\a<h\ 6\ fùH\87ýi\8að£\15?:^\88mä¤\8d\ 2k#\16\0#­¯HGß\ 5&\9a£÷4\8bxO!Þ\89\a¬yp\83\14Âz\ 3Ð5î$÷/\12ûýè\1d\84\ 6¿\ 2Ì0\\89!K:NL^'&'\88I;Mù\9b4éoáÇi\1a¡3¼tΰáÏ\92è³\8b\80X\9c%\16gÛ¹O]\9c¹¡\1cJ6e%9X'ÑnÈLÊú¢ëÃÏ\f\87\97Ñx\r^\aBÈ@Éó\ eH+ã\93\18Ì\18P༫t\81\98\"7¿ePø\10?.Ó\94\8bç
+õy\85d_µ\ 2A½z\14NÁye\90ç\ 4\ 2·Ã÷r\ 6±^_Öj`}Îí\ eÍs\ e\8d\8b\9dà\18_\7fâ2|\ 4\1aÜ\80\9bNÒ'Ôë\1drÓ1¼|\16Ì G\8dÞã¥ð\ 5\9bïþ|`Á\ fö\0õyÿ\ 4\93\96\82\ex\81\1f\ 4Ã`\18Å<\9a¨gÌ\98ß)Wߨ\90Ù´D_3×=a®{Ä\9cû%sî\ 3&¶ûLt÷\98òþÆtù\19Sí]æÌ?\91¬?²\88?àø'ܽ¥ou\13«¿wp\1d.\83]N Ç§\ 1\9cùîß\1a¤\7fi\18\9aqè¥è¡¦2)æésæË»Ì\97\7fV\95\8f;øq\e?>Æ\8f\9bøq\83\1a\15\ fÕª\ ft\ 2\ fÞÓûüâ"Þ_Ð\7fu\1e\95\ e~\ 3ïuú \9fy®®ú§zè±üYW\bzÑú+±øT\13XG\1a¾OÃ~>á/Â~\19ö«°¿\10ûµØ·b\7f-v7R\1eÛ(\93=z\9bB>C,Nóÿ)V|\12«íú^\1dÑ\7fÃÁ\89ÿóá)<R\17"f v¾¬'\88µ\fBk(:±hLÄ~\86ÞQ6å\91OI\16a¹To\91\97SªÁ~-ö­Ø]«ãÚÄvÙ\81ú>¶P+[©]Gñð\bÙ9DF\ f¡xÐÁ!\87\ f\1dú\ fáNg\89uÓ%y³\16\7fÖab\rQh\8c@#\1eûÉØÎ`\9bä°5óõ2yi£>ZU\81ý\1a\1dÆ\8f\83øq@ëÈÄV\8e\90f*ã%\8e\94cDå\1cÇËu²ôX;õ\ 3Ø;Ù\ 1\1dú\ fà\96£ä\7fM,Þ$\16Ç©\8bW\15\88\8e\995Ä 1
+ûã±\9f\8cýLV\98\8dý<½H\9dîÁ\8ffüØ\85\1f;ñ£I+µ\9dÚø\ 5ÿoå\97[°²\89\88m${\1d\95»\9e
+_\8f\83'\ eý\vl©S\8e\8dº8È\1eia\8fìÓ\0tÂÑ\18\8aÆ\18üNÀr
+ö3¨¾l4ò´\19?6á\87\8d¼l >\1aUG$Öòo\8bVãá*V°\82Ì[Éèrª¹\9eª«cÇÕ£ßÁ_ºKïs¬\9c4 Íg\v[{/Ç^³º£g¤º\ 2Р    A'
+\8dáh\8cEc\ 2\1a)hd²\e²ÑÈcå³Ñ)E£
\8bµ\8c«ZV¾\84È,"\1f\16"[Ã.¨vº­ê._i\81ós°wr\8d\fÇk\eGý>>wp½\95ãe³\87³l®\ 6­wòU\83S Vw       ÕJçhY\9dG¨Þ%Vu.\89\9a¢Z×L-qÍÑ"×|YÜ\8aTãV®j·\1aÍïZ¯ª®\8dªèÖ¤yî-*s?¦R÷wTÒýc\95x<Q±á9Ø;¹Ä\91z\9cã½\85WM\13ظnà\15¸
+\7fVz¹iew/Õw÷ÓR\8fþZì1H\16C\8c\16\1aFªÚ\10§\ 5\86$Í÷LU¥ç\14Uxæj\9eg\81Ê<KTâ5_Å^K5Ç«AE^ÛTØc¿
+¼_Ó,ïw5Óû¶ò\8dÿ\80\1fÁÞÉÛ}y\8d\ 5ñJì'm\82Õ|¯ç^-þ,â¨]dt×Bo£\16x\a¨ÒÛ¤yÆ\b\95\e\87ªÔ8Z%Æx\15\e'j\8eO\9a\8a|²Tè\93§\ 2\9f"Íô­P¾ïbÍè¹JÓ{nUN¯½Êîõ\8a¦ù\9dS\96ßMeõþ
+~\ 4{''y­\1c
+@C\bm\r\9f\16\8eø\ 5øS\89/óü]TÞËK%~½4ׯ\9f\8aüÌ*ô\e¬\82ÞÃ5³÷Xå÷NP\9e\7f²¦ûg(×?GÙþ\ 5\9a\16Pª¬\80\1aMécUfßMÊà%\98\16ئÔÀ³J\rº®ÉA\8fá\a°sm×±\81´\ 4¡Ä\806lE\18ëæ³\8aërü)Æ\979ø2;ÐC³úú(?°\8ff\ 4\9a\94\e\18®\9cÀ\18e\a\8dTVÐ8M\r\94 TeôËRz¿<¥õ\9f«Éýç+e@\9d\92\alФàÝJ2\1d\85ÓJ4]QbÈ\97ð\1cì\ÛÕ\86î.Ú\8dÆ\bi\19TC\19×s¸_\80/ùø2#¸«r\83{hZ°\9f¦\ 6÷Sfp¨2LQJ7\rSªi´&\9bÆ+Å4IÉ!\19\9a\18\92«¤\81³\958°R\13B\97j¼¹Qñæ\9d\8a\v;\ 2§4.ì²Æ\rz\bÏønç\9e]\87ÑÜF«±f°´\18*`n\14úÜË£5Ì!.Yf\17e\86z*=ÔW©æ>J1\9b\94l\ e×Dó\10%\99G(1,V    a\89\1a\1f\96¦øAÙ\8a\v/иðrÅF,ÖØ\88\ 6\8d\89lÒèÈC\1a\15uR#£~\a÷ùþ=Ø;iAo\v
+Úá\85\0
\9eǽlü\98\8a\8fé09ÂC\93"\8cJ\8aè­  \11ý\95\10\11ªø\88(ÅE\ eÓ¸ÈÑ\8a\8d\1c¯±Q)\1a\135U£\açkTt©FF[4bÈ\1a½0d»\86Ǽ¤a1í\1a\1aó\ 1|Á÷§`×ð!ví\1dòS\e\7\94y\ f\8aa&äpo
+\7fK#.Éø\93\14ÝM     Ñÿ£ºÌ£¢>¯0ü\1adQv\19\95MvD\90}\ 6\18\1c\86}G\90EepcÄ `Ô\88\10\e\\0\93Ƹ ¨\895q\89¦i\8fFk¢¤U\93ظ/MjzbNs\9aÖ\1a5MÚSÓÖTk7ãô\ 1IOûÇsf`fî{¿{ï÷ý¾×K9\89\ 6Y\13\83eI\8cPfR¬ÌIIÊHJWzr¶Ò\92\8b\95\96R%SJ½\8c©MJM]¢\14ãj%\e7)Éô\8a\12MG\94\0\9fóþ¾\92\8c\8eA¶£õ,Wà\ e\13\9eÌ\81zÞ×@\ 5¹\14óy>¯9©ÎÊJõT¦q\94ÌÆ\0¥\eÃd2\8e\97Ñ\98 T\93I)&\8b\92Ó
+`²\92Ò§)1Ý®\84\8cE\8aÏX©\89\19\e\15gÞ­Xó\e\9a`>\a·xÿ7Åe8\ 6Ù\86V7ºm\\81\9b\990\15*ù»\ 4òùÌÊë¤ôÇ\94\91á.S\86\8fR3Æ(Å<NIæ(%\9a'*!3Uñ\99\99\9a\98\99§¸IeP§XË\1cM°,T\8c¥Sã³Ö+:k\97¢²\ e+2ë,Üàý=E[\1c\83l"þ*3û\ 1\ 46®Á5¼\96C!X!\93ÿ¥Yð\1d\167%ey)ÁjP¼5PqÖpÅZ'hBv\92b²Ó5>;[Ñ9%\8aÊ©VdîLEä¶(<w¹Âr\9fWhÞËpH!y§áºBsïÂC\85å8´\1e\8d§ÑhEc\ eÖh\1aTB       ä\82Ù*\99¸\16'cW\12ò\9c\15\97ï¡\98|_\8d/ðWTA\88"\v¢\15Q\10¯ðB£Â
+-
+-,THQ\95Æ\155(¸¨YAE\1d
+,zN\ 1Å;àuù\17¿§±E×ä_ôµ\ 2
+¿Q`¡CßE§\1d\9dùèÌĪÖB9\14\82\15Ýô<îü\\89ã±*1ÅÃ\14U2Rá¥Þ
++3(¤,HãÊ"\14\\16« òd\ 5\96\9b\15P\9e'ÿò
+\8d­\98¦1\15M\1a]Ñ&CÅ3ò«xQ£*öÃIùV|ªQåwäWþ@\862\87ºÑz\12­¹hÕçKUP\ 2y0   íÔ"Ö_\82÷Ä:FbUB*]\144ÅSþÕ¾\1a[=VcªC4º:Z\86êxù1È£j¬ò­)\81ZùÔ4Ê»v±¼j»äY³\15\8f\9a\13ð\91<«¿\82\7fÉk\8aC\9dè,d\8d³¡\ e½
+(\84ìbjP*%\95ã;&KQS¤Ð\1a)°N2L\1f!ßz/ùØü @Þ¶0yq yÚ\92!S\1e\ 2¹Ûª4Ò6Cn¶\16¹Ú:åbë\95³m¯\86ÛÞÒðú÷å\ÿ%Ü\95Ëô\ajGëqÖÙ\80^5\94B\1ek\9e\84vj%Þ\13{\14]+\85a\19\ 3mÒè\19\92Ïl\17yØ=4Òî£\11öÑr³\aËÕ\1e)gûD\r·\9bäd·j\98\9d v~d\9f\aí°VjĨ6bØ\1aÏ3|øÝ9wà\1fZ\84V#5\9e\ 6\93Yo\11X«Ø\ah'²æ\18¬QX\ 3úØÅÑ\8dè7I\9eÍÃå¶À]N\v¸ì´ø\ 1\ fú\96P\ 6\9b\83½\95\ 3­\95\8dÖJ\81[)^ëlX\f=\80ßmÁ¨¶\9câ\81|\8d!ü3ü]óùÚ\f¨\81rÈ£Þæ©ì\83zf`¦\14>\a}t\rÍè·à\ 1±j®K\9c4l)\1ew)\1e·\8d\8bW\e\97\9ee\81\f7\ fÚv\1e\1c\f{\aEmg\11íó¡\136Ãk|÷m~s\15n\13ã\9eæ²Öé0\ 5\8a(\9d\85z§²æ8»\14\81E\rB×°Hò~Rr_&¹,çÒK8­p\ 1.£+©Å*.]«¹ðtqáèæ\ 2ÒÃ\ 3¦\87í\87Aïaa=\14°§\rèGÏ\1e¾ÓÏw1«]_ð»¯5\vÍ©PF\9fs([Ú\ö!k\8e\\88\ 6Zéõ\1diÄJÉ©\emì*\17si-\17ñµä±\8e<ÖS\8f\r\ 3\17Qòè\rzt!êãaØGOú\18¸>jÑÇbúº`;\9f\1f\926\9d\ 1úÑ{[\rèV\91f\ 1õ6S²DÖ\1cEÊÁè\1aV¡¿Fr{\ eÍõ°     ¶À6x\ 1h¯¾ç$íà2þ\12\17ó\9dÞÒ.æc\ f}ÙËÅc\1f³±\8f\9eìcÈöÑÔ}\1dü¿\17¾\ fǹÀ}\07TG½KH1\8b±IaÍ1Ôy\1cë5 ë¹\91Úo\19Òz vÃ^x\15\b\83ùá2
+ûá\0\86à 3ò#jr\98\91\0\f\ 3yô3\eý\1c\fY\7f+0\9bý\ 4;\8a\93ég6\8f~¨ÉK8\93ÑN[Á\f°æÐuÌ?£ãEÉ\v\ ei\ eh\1d\182@oÂÑ!Þ\82\9fÀ18\ 1ïÀIúó\1e59Í\8c\9c#\8f\vì\95\v<\ 4/²W/RôK\fÕ¥\rÒe\ 2_&Øå\93*F;\13íDj\1dÁ\9aÇ\92¢7\1f»\ e¬ïà\90æ\80Öñ\81øpjÀ\94ÁY`\9bë\ 2\\82\9f\r\9a
\82þ\eN>aF®Ñ\97ß2£×éÉglø\e\fÛM\86ëæVé\16żu\18§õØ ïuÈ     <À\ fÆÁ\ 4=\94\11w\9a\8d'-Õ]Uë\8eêõ'üÔmüÔ\1fðu¿Ç×}\81\9bú\9c\8dr\vÇu\ 3\17v\1d\ax\8d\94Æ}\82\98\82}¤Ó¸Ý_ëC<ÞÏ\89üÁ\10\17á\f<Òÿ\1674}t\1f\7f÷WEé/JD3\13½|t*ШÅ-6\10¿\91ø\8f\13¿\95øK\88ßAüNâwë}üÝe\1câE|æy\ëY\1d"\83·qyW(ã\1fõ®\1eÐ2Ç\7f9ö?9<\84{\1aÎ\1a=õ;\19ô\99\e¼î¯¨ÅDz¢QDüJÊ^Gù\et\8e\90Ç)òø)y¼\8b³|\87<NàB\8fi\9d\ 6ê×NªðCÚÙ\8fÛ<Ï8Ý$£û´Øñ\7f\fè\7f\ 3\9c\9aÔSú%^÷
+^÷\12µ8\8f×=£\ 4t2ÐÈa$J\18Á*"Öé\by¼I_\ ek\1e±[\88½X¯\93Ç\ 1­ \ 3k\18ã\rz\8d\rõ*C½\97o¼B\84ݺª](íDu\80\97\87x8¤\7f}h¤ÎÈ\99Êy²\ e\ 3k\bÑ\e\8a!~2ùf²\ 5ó\88]ʶ¬$v\1d±mÄ\9e­=j"ö\ 2â.f\v·k\87Vj;\aÙ\8bôd\e*[Èj3\117Ñ¥^}©\8dú'\19:\ 6Ù\b<¹¨ù£Ñ\1eØZG\ 6·áH´|è¦?ñÃ\89\1fG|#ñ-t9\8fإĮÔVæ£\8f9ݬYÄ\9e\ 5Ä]B'\9eÒóêbB×éY¾ý\f\91z¨Z7\93ÑÅD­fÚV£ý-7м8´Í\ f\ e\1d=»¨Åvj±\8d=²EÁä\1f\ 4â\9b\88jaêò\89_BüJâ×RùzâÏ"~\131[¨ÂR:Ò©§ùÆr²|\8a.t\10}\19«lc\8a\97ê+ø78\ 6¹Âñv\9cce¿+Ú¼¾Àß\1cQ蹡åMEÇ \11\82F\fñ\13µJéÄÏB!_¸I4&£QK\aêÑ\98\8dÆ<vì\13T£C\8bÈê  "µRÁ\16ú±\80i\9d\9bÙÕÍìøfô\a\91v\88ãu\17\8f¿>XËû5î<Ò\\87iÕ0w´|ÑòG'\1c\9dX4\92ÑHG#\v\8d|4Jô\1f\92Ë=¶Í«\fãOÓÜ\13»¶[;iì$Nb'\8e\13'±sqb×±sq\93ØiRçÒÄM\9a\8bÓ6½¥Zï\17:íÒum·U¥\1d]K+T(L\¤Mh\13       \10B\806þá&\90\10B\fÄ\86\10\fm0Ú\89\ 13?Ú?~:ßwü}~Î{ÎùÎû¼\a\98\8fý\8cc\1fûc/ßË\1eÔV\880³î¬\96Ö]ÔbÎ\r-ä|Qóë_\8775\97û\8eæòþ©¹üO «op\94}\81ãý\1a©æ\ 2\9cãú$Çì1Æs´4WG
+\f:\9ckÑ¡\»öçÕi5Ï«½ù~íÎ\ fj%?¢LÁ\80\96\vF´X0¦\85Âií*\9c×\Ñ\8av\16­i¶ø´f\8a/hGÉ\8b\9a*¹§É\92×5Qú&¼£\94á>d\1fò
+éö³e¤E¬Ðã\1cïÇi׸?\80-Ye,«Æ\ 2í-5j¥ÔªåÒJ-\96ºµËЬyC»æ\f=Úi\88\10×\8c\1dÆ\94¦\8diM\1a\975a<¨í\eNjÌÄ®1]רé\9e\92¦×\940¿¥\11ó»ð\91F,YÚ¬^F÷º\83\92ø«Ð§ÝË}\86c~\91±,lZ§\ 5s±æLf¥Íå\9a1;5mnÐ\94¹E\93æ\ e¥Ìam·ôiÜ2¤1Ë\98F-ÓJn\ÐÈÆU\rc>¶nzRqëU\rZïjÀöuõÛ~¤þ²?Â\ 3È>ä.\9a/8\99\ 3\11¬Ç>Xæz\1e{\98f,3\8c\96¯)«Q)ë&\8dÛ\1c\1a³ÕiÔæUÒÖ¦\84\91²\88\86Ê\ 6´µ,¡xù\84\ 6Êwª\7fónõm~LÑ\8aÇÕk¿¢\88ýsÚâxUaÇ\ fà\ f
+WÞ§ÍÒÇy\85ÞEÒüi\97tÈ-­À<×3ôM2¶\14s3îÈÑ6{©\92\15f\rÛË5dw*n¯× Ý§\ 1G»ú\1d=\8a9b\8aV\ e©·r\\91ªYm©Ê(T½¦\9eêO©Ûù¼\825wÔUó\8a:k¾\ f\87Üg\1fò\12ZçIñÇ\e\98\ 3ìè"Ìr=Iß8c\19e^F\18Ë\90³H\83Õ\eÔ_mUÌéPÔY§^g£¶8[\15®éR¨&¢\9e\9aAu×\8e*X;­®ºEuÔ\1dT»ë\8c\ 2îËò»o«ÍÍ\89[ÿ=µÖÿ\96ö\1f\90¥?«kh=\81î\11\1e\98\87i\18o¤Þ¡\7f\98y\19d,}®<E]\ 6E\\16\85]\9bÕãªVÐU¯.W³:Ýíêp\87Ô^ߧ@}Bþ\86Iµ5ìR«g¿Z\1aOÉ×xQÍ\8d·Ôäý\9a¼ÞïÂo¸þ;|B\7fVWÐ9\87æ\1a\164ãc\ f@
+F¹\1fjÂgò{\14¶xrÔã)QÐcR§Ç¦v\8fC\ 1O\9dÚ<\8djmlS«7¨\16oT¾¦!57¥ÔÔ<'oóª\1a}'äñ]P\83ï¦ê[¾"wËwà×\\7f\0ÿ¥\9f¼\81Îi4\ f`?\17[ñù0\ 6ÃÜ\ fÐ\1fe,a\bBGs\91\ 2ÍFµù6ªÅW!\9fÏ©&_\83¼->èTckD\9eÖ¸\1aÚÆTß\96\96Û¿G.Lj\9dÿ¼j\ 37T\13ø2|[ÎÀ/ißW­ÿ?\90Õ³è\9c@sµ\8duÀ~NB\12â\10£/\f\ emþ|ùü\ 65ùÍj\f\94É\13¨RCÀ%w{\13\ 4äj\ f©®c@µ\1d£ªé\9c\91³sEÕ\9dGTÕõ\94*»^\94£ëeÙ»Þ\80_pý7úþ­Êά\9eæ¿\8f\ 4ø\1eÚY\87\ ejN\18\81~î#\10\ 4\84©¦Î\1cyºJä\ e\9aä
+ZU\e´«¦»VÎn\8fª»ÛTÕ\1dTeOL\8e\9e\11ÙCSª\b-isè°ÊCO¨,|\r¾$[ø[²\86\7f&[è=\95\85>Vy\ f¹\13ý54\96Ð\98î\92¶ÁV\88A\b\85RÅÛ#Õ\87¨}Â\85rn1ª*bQe¤\\8eHµì½nUôú´¹·Ce½\11Ù¢C²FSÚ\14]\80\18;'KìªÌ±{ðM\99b?\919úWY¢ÿ\92¥7«3hïÇzÏ£3\81N\ 2\ 6 \ 2Að£Û\84%n\88໣RU_®*úKT>`RÙ\80UÖA»6\rÖjã`#øe\19\fÉ\1c\1f\90)>\ 6s2Æ÷Ã\19\19â/À]\95Æ_SIüÇ´ïÊ0ø\0²:\8eÎ\1etfÃ|\8f0\84^\f\ 1\92'Fü\94\83R\ 5¥\9bu¸P\96\84\84E¦D¹6$«dLºeHú K¥É\98J\92 \15'w¨(¹[\85Éã*H^T^ò¶r\93¯*7ñCå%~\ f\1f(\7fäc\1dFg\89\18§ÐJ D HÌ~´½h»âè\ f¡O\99b¥l3\8fåÉ\98*QIʤâÔ&\15¥ì*LÕª Õ¨¼T@¹\13\9fتu\13\13L.\85ä\ 4\85ë\ 4ELê%ø*P¤l§ÖÜ\8e\8bÜþ\91ö¡3×Ç%\fC\1f\84Ñe{Ë\87vý°äLJöm\92\8d\12Å<I\r6\9d«âÙbåÏ\1a\953K²O\93ÜÒ$\9e´ûÑ\ 1\93f\13¥ù£4/íÜ       Ôxi\8a×4ET\9aâi\16×8û+\12Â{ð@+Ìï\ e´¶A\1c¢\10$æVbö\10sí8ú\84c\9bF\7f\96\1a\94¿,Úµ^¹\8bÔ\96K\18\9e%\fÈ2\89~\99ä\96áPÏpÐgø°3,l\86?Êðâ
+Emæ$PÀf>ϳ\14\87Ë?åÝ¿À}í"Πô\12´\ 3\10JH\ 1\86ï%æ:bvÌ \8f®\99RÑ°$\15®Hë÷®ã@ÁøíÃpíÇì\1cÀh\1cÄ\88\1c²ó\91\91`Ö¼\8f>¶5&ym\fxy\8dõX{\86g(b\ fá\9c\ f¾\ 5\7fâÝ\ f5\8bÞ\18\f\13s/\8fw¦¤æ)ö\01WΣ\8f®\890JW©A\ f\ ec6\1f\83£Ô\94G1¡Ç\18Ç ã#óuÊÆ¡KÂ?C"<Ë\9a\9c\9fe.Îî o\1f-ëqæ3<\83{>MÑzêmx_Sh\8eB?óÝÍ´µ¦Ù\ 3\v|\83\19ôÑ5¡[B\byÇÐ=\ 5g\81¿Â®\92ìr¤'\99\8f§¨oϳ.Ï0\8eg\99\8fK\8cã2{ã9\ eÀçØà\97    ò2{ó2\7fr\89õ¸\84{¿ø\ 6ü\9cçÿ¬    \868Ä|oa¾\ 3<æ!æj¶\90\r]Óq©ø\8c\94ó8zlk\f=ï?4Ý\18\1f¸\ 2WáÓ\98ñë\85\98r\fò\röÇÍÿ\eDöè\1döÆ\1dÖä\ e\9bî6B·\ fÐÿ4-ëq\8bõ¸EUsówJ2ß1æ»s\ fg\11\8fÔ\1c\91ÊþÇt¹@5y\9eqü_\11\11!1\ 1\ 2&@\80\ 4\b\90\0\81p\v7\ 5ä"   \16\15¼Vê}Z«V[;«S×nÖUë¥u®¶^ê\94Z§­½¸YÙº^Ö9»ºº¶®gëtk×é¶sºZ§5ûa³\1d\ fçwø¾/Éóÿ¿Ïû¼ï÷>\8c×\84nøZr¿1¨÷\ 3x\1c\13·\9a\10Ñ\0\89fK´0ß4&{C¥ýääYææÇÔi\1f>ú¨\8d>æ¤\8fÅÕÇ û\b~\98õqè\0°>\ eýJµ³%?ùÎAÛ¹B²>\88þzô\aƸ%¨9 µ\aöÝjÂø]\90çà\b\1c\85cÁFé\ 4õú2ur\92¹9ÅA½\9fCa?/á~ê³\9fB;\8dØi\ 6÷\1a\83\a'U¹\849@ÛõmÖ\0c\8eÂâ°íAÝg\82\9a|\95FW´(Ä\87Wá$ü\f^\83~øE°a{3ظ\9e!'ïâã}òq\9e\1aý=/\85\ fX\80\1fRl\1fÝ\v\ 2I¼p\88.G·\11\ e&°ê&ýÝ\råÒ\9dúõ\85jèK\9bt\99>æoê¢K\9aª\8b\9a¥OèlþH·ó1ÝÏ\ 5º¡\ féÆÎÓ\9d\9d£S{\97Îô7$ï\1d\1dÖÛ\98~S¿Åâ\15\bèõ §à\15¸ÝÃMúÌ«2Ò\91Zøv\92>§×ý\8c\1eóϪ@§V\1fÐO\9dS;ñ»tF=Ä\9fIü»õ\96\16è\r\8e\8f\9fÓÝ\9e¦pOÑ©þ\94¢y\95\1eïe\1d×     \¼¨¿0]×¹\vÜâ\18<w\9b\87¯à2\R\84þ@\7fw^6\9c§2\96\1cR[\8cÆ(â×\93ú\16¦ \9d©èb\f=z    \1f/âã\ 5|\1cÃÇQ|\1ca\11õ±x\ e\ eR°Ïr·\9f_íÓGÚKV÷¢øL\90§\83\1e¾\ 4v,t\a¦r\bSkä\17\16Æ\90Ä\182\18C\1e¾Kõ¼ª\88Ö@ì\16b·ë\0ýå~M!ætâõ\92ùù(Þ£Ýl"?ÔZ²°I;ùÛη¶áôq2·\95ìnÑ×\10ø?Wѽ\bgáô@Yk\10ã\88\8c\86\15ï\ eâ»ñëc\19\96i\17\93øØɼl§>¶i"±'\13\1e£ãÝL>\1eÕR¶\8e\a\eÈÆ\16fæ)®\8e°½ôÃ'Z\87ê:´ÿÇ%t\7f\1d\81\1fv+\8c-ÀHü\18|'\12;\8dí!\9bø\85Ä.'v5±ë\89ÝLìqTa'±&3òiÌB/\15±\90mt9.Öh\15¿XI´\15dn9³·LïÁ?à¦îE\7f\80³Á¥v(¸Ý\f,ËÍäâ\11\915²^qÄOÖCr\111\97Ê/$v9Ûu\15ñë\98ý&â·\11\7f\ 2q'\93\81éÌÆ\1c-æï[|c!.\17\90©yds.3:\97
+\9e£Oá\1a\ 4n1°¼\ fÃ.¶þÍ\83¾Ù\8a×\ e¼
\8bU2 \11E|\eñ\1dÄÏ$¾\97èEÄ/×"|,ÀÇ||ÌÃÇ\òq7õÑ˺½\8b§³øÕLÜOgTÓ\18áT2ÝCe÷èOð\85ºÑ\1fà8[ÚS\1c\ 56óú[\a÷³Õ.çÙR^\ 1\8bÙ/\16i8:\164\12ðìD#\v\8d<4\8aÐ(G£J3ð1\8dy\99J}ôP§Ý\Mæ\9b\93´\84»ÕTÌ÷p÷$\99\ eª½\83\9d¤\9dùè`\9dvàá [Ù6¶÷\r¼jVÂ\12\98Ïý\1c^?½á!\9a=8\ 2-\13:qèØÑHCÃÍhóÐ(f\85\96£S­\89wÔ«ó\8e\16M\18Ô¡öAS4>ä.\8d\vY¤ÖÁ«Ô2øa\8d\rÝ©æÐ\83j
+=©Æ!çÔ\18v\19®A@{ÐÜÄql5[ê=0\17f±ÍOã5Ü3\ê6\84ª;Ü IC¢tg\98U\9d\9a\10æR{X¶Æ\ fõiÜÐ\12µ\r­Tkøhµ\847ª9|\9c\9a\86u©qØ\f5D,P}ÄJÕEnÔèÈ\1dª\89<¨jÃIø\1d\\81ë\10Ð\13hn\188z\8c\1cÇfB7×]<ëÄK\a^:\8cCÕn0j\9c!F­\86x\8d58ÔlÈP\93!G\8d\86\ 2\8d1\94ªÞX¥:c½j\8d­\1am\9c¨êáÓUe\9a¯\91¦ûTiÚ¨
\ e\95\99\ fÂI\95\9aß\87\7fª4êkîÙ#Ð[c#\a\1c;zyÕöÀ\9d\·s,kã³\16¼4G\87¨Ù\1c¡F\93I\ræ8Õ\99íª5§j´9KÕf¯ªÌÅ\1a\15\91Q£U\11Õ¬òè\ e\95E÷È\1f3G%1ËTlù\8e\8a,ÛT\10{\0^\91/ö=¸Âõ\r\bh\13Z÷£»\90WìL\8e¤\93 \1d\9c1yÞ\80¿:¼ÔÆ\86©ÆbT\95%Z#-6UZ\92Uaq©Ì\92­ÒX\9fü±¥*\89­RqÜ\18\15Æ\8d\88ÉòYg+ßÊJ²­U®m«râ÷);þ%8\v\7fçþ:\ 4ô0Z+Ð\9cËQt*¯ØNhåº1\ 5m\9e×ðy\15>GÚBTa\8bT\99Õ,¿5VŶD\15Ù\9c*´eªÀæ\95/¾Hyñ\95ò&Ô)7¡U9\89]ÊN\9c%\8f}±ÜIk\94\95ô\982\93ö*#ù\84\Égàs®ÿó\80Ö£³\14ÝÞTú=\8e\80íÐ\fõÜWó|$^h)U\8a\97b{¸
+íFùìÑʳÛäµ'+×\9e®\9c¤le'ùäI.\93;¹FY)ÍÊLéT\86c\86Ò\1d\8b\94æ|P©ÎÍr:\9f\96\ 5x\a>\93\1aÏ\ 3z\b\9dÅhÎL§\ e9þµeHcø_\ 3#yV\86\97\12òR\bù\8e!ò:\fÊq\98åqÄ)Ë\91¨L\87S\19Î,¹\9cyJO-QZZ\95\1aåLï\90#}\9aR\\v\94ìz@I®GeÏØ\ 3Ç\95\98ñ6|ÊõW<\ fh5ú\vÑ\9b\96É<ÀX\8e\7fuPÅu9~\8aù¬\0/^ÈN\ f\91Û\15¡\f\97I.W\8cÒ\6¥ºRäÌpÉ\91\91£\94Ì"%gV*)«Aö¬ñJt÷(Á=OñîU²y¾/«çG\1aáù     ¼\ 5\7f\95Õ}U6w@+Ñ\98\8b\9byðP\aP\ 3\95Üû¡\80ϼà\86LîÓÝCåô\18åðD)Ù3BI\1e»ìÙiJÌö(!Û§ø\9crÙrjeÍmÓ\88Ü)\8aË\9d£Xï}²x\1fQ\8cw7\1cU´÷\r¸Äõ\97²ä\ 6´\8cؽhN¢%iãèÙ\0UP\ 6E<Ë\ 3\ f¸ré{ Å\eª¤¼H%ä\99\14\9fo\91-?AÖ|\87Fäg*Î\97§X\9f_\16_\8db
+Æ*º KQ\ 5½2\17.\87ïÊT¸\v\9e\97±ð\97\1a^pQ¦\82\7fC@KÐ\9f\89ÞDÚ\91±P\v\95P\ 2\85LÚÇÔ|ô}ô^\85\83d+
+W\±Q\96âhÅ\94X\15]\92¤¨\92\91Ù_$\93\7f\144Éè\9f(cé,\19J\97*²t=ìT\84ÿ°\86ùOÃÇ\ÿK\91%7´\90±ME£\1d\8dF4ª¡\f\8a \8fg\9eÿR]æAQßg\18\7f¸\17Ø]w\91EЪ(*\ 2
+È-,»¸\87«»\v\88 
+B\ 4Á\10\8c\ 2\1em\13ªÄ\83ÄD\133iÔF\83¹¦Ui;1&ͤ\9aÄN\1dk\92\1eNÇc\9aÌ´éL56iµÓÖ£­c³ý,îdÒ?\9eY\96ýýÞç½¾ï÷}øÌF¦L+\83¿\82Ý\1f©`«\8aWJµQ\16\87\ 5Ødv|\ 3dÉäÈ\95ÑQ\fìJvú\94ä\*\83³C Î~Å;·+ιO±Îc\8aq¼§XÇï\14ç¸\ eþ¥^8V±\84ÕÛ\a\9c`>(\ 1ù §\1cÝ\ 1÷\94*i¢\1dýådÿ_\10+³;IF\8fYI\9eñJôdÈàÉT\82'[ñ\9e\ 2Åy*\14ãu)Ú\8b\80õ®\ 4\88'/\ 2Ñ\8bpð|\1f \10<è<Ï_h¾Ûê&¾åð\ 4áq\ 3;(\aó@\1e\84\1a~$J\9a\v~d\9bÙ\17«äÅ\89\9b\14\e°**À@\ f\ 3\1cô\0\8d\e ¨\0:3\88\9e\b"$\83\b© ú*\80¦\b \96\ 2\88!ÿyð\ 5¸­U\95ÒRx\16\81\1aP  J\0í­lÌL_\80öqÿ\10~L\9a\91lÉu1JXbPt\ 3\17|\ 3\17ïR.·F\ 6z#ì\91CÜH\81\e         Ñ\v\96\82N\80\98jÜų#\0aÖðKðgpK-ðÔ\ 1/p\80
+PHÌ9Ä\9c\93}èO?üµð/\81¿Q\8a_Ƶ\9cEg\ 5KO\vËF+\97k+:w%\97K\e\83µ\8dÃÖF.Ú(\\e/¶Q\8f¶u`;Ï°-®D¸µþ\ 2°M·ÜT\13\~à\ 2vPBÌs\88y&1O   Â_\ f?¼æf4`\8b\14\879\16\19\86\1a\8bV§AZM.ºð£\e?ÖP\93\aÃ\17pxøs {ÈE\ fÆz\96\ 1êÑ3ÈïÏñ\1c\ 2r\r[d÷§àïªç\11\1f¨!måÄ\@̳p}j\83\94Ϋ)ð\9aÚ$C\87\14Ý\ 57¦XÓ\18làaüX\87\1fëñ£\1f?\ 6X\866N`\11àÂÝLM6s°6\93\8bÍôæ¦U|R\8fM»y\86\9eØðSp\89w®+\b§\17TQç"\1eÍ¡|\99ÄÌÕ«\14^3uK    aÎ\87A?À\f\v¹XWY<Á£Ôe0þþ":\84\1fÛÈÇ\ eò1Ì%7ÌÀ\1f¦é\87 p\18£;q|'õØq\90¥\85\9eØö\11øL~x\9dÔ¹\94|çÑÂÓ\899c5ü=\92\91\12Æm\88p>
\82í\91Åûqð\84î/âO\81=ää\19rò,\vêwéÓ}øq\80\0\0M~\80Âî'\99ûq~\1fgôù£<÷>¸,\ fù\9e\vÚ\99\85äzb/üÄk\84\97u\14?#|a\9eg\0åD:a\a\1c\0/\80Caq0&\8eXÒÉÉkôê\ fðã\18u\19¥7F\19\82£4Ú(¹8¶\1e!Åù8ÊÃGÞâ¹\ fä ¿\8aàÎ&M\93\a¤ñ\8fÀÿ\98\14\13æÝ\13á\f\18\11\ 1Æ\f"\10;`4"\90hu\ 4©ô&x\9bú¼\83`x\17?NsfOÓ\e§\198§)øû\9cÓ÷èÍw       â\14/\9f:©r¸óàÎ\84;\8d\98Mä6îÙ\bïH\84óhD\b\859p\1dù\1a\16¦ÒÉ\88H#¥ú\198\ 38rú\10püu\9eÚ\À\8fË,b\97©É%\ eý%
+~±\8fO
+y\89À.þ\b\85¡¯!\ e\98\81M÷ÐwÿAÏÜQ\89þ¡jÝ@Ç|\81ν\86\8aª\b+¥OQ8¿ç\90|\82¢»\8c\ 2»HÓü\96â\9d§I~E\ 2?"\88s\ 4p\16\87Ïè×hºë¸\1a\84p;Ä\7fC¤-ô\7f>ÜU\94n¢3o ï>×$}\86\9e¹ª|ýQ\15úX5º\80Î=¯:ì7\11j\vö\1fÀ~\17ö{°¿\1eû\9b°=Hj¶\93¢=¤k?
+óUx\8e\93Â3z]WÀ]R\1a¢tè+päk>ü\13\\ 3\7fP\ 2\fýFi¤3\13®\1cÒ[\ 4G¥P'Ø^\84ÿuz\9b\85Â:\81êz\ 3\15ö:~ü\18\8dùCü\18\1eÕ0-³\17¥{\b/\8eÑJ'iÙ\v:\fÓ\b\8c\87Aøó ¸\aïßƸE¶¤\9f+Z§d$\86\14ü\9f\88ý,¢\98\83ß%ضã·\8b\96\D\9bÔê\15ôåK¨ÉèË\11\94à!\ 6ØAüø\9e6\93\81­\1c\9f]Täy\14ï«xs\82cu\ eåù9\19ú/\9f¡¯p\ 3Þ\8f#­ôN¤õ\8eÈÀ[f|·a\7f
+Gb\16öó±]\8am;V]Øöa;\88í\ 6l/Ãn«vãÇSø±\8bº<Î\10\e¦7vÀ²\8d·\1f#\82­dr\v\1d´E·Aè+|2\16»ðòþ\91\e\19;ú1Ø7bÛ\8aítìf\82ÙØ.Àv\19\8eí\ 5Ø^\88í\0¶ë±ÕD\ 5ZéÊ\ e=B]¾¥\ 1FÛ \95yB\eðz\80ÌõÓ\1d}d»\8fÈûô%\b\8dá,\9cÇã%2v\9e\8e\8c¿íäb\88\lQ*¶'a{:¶s\18Ï\85Ø.#ÛU\8cí\1aì{±ïÇ~=Ñ7Q\89\95\8cõÕêåBy\88§\1eÄÓ5d«\8b\8c®¦¢\9dôf'\9dÞ©\7f\83Ð\18~\12á\7f.Â=\14\19Ëß$\17\e8#ý²`;\rÛ\93±=\ 3äb¿\10ûeدÂ~\8dºñ£\v?:ñ£CÍZE\9f¶óK\e\92\8b\16Îê
+\ 6êrz³\99SÓLõ\9b9ñÍð\87q,\8aøã\18Ǭ\ 3\83`#£v\1d£¿\97ÿ÷pFØH±oÅ~:ö§b\7f&'2\ f\8eB".\83£
+\8e\1a8¼p\ 4°Ù@w¬àÔtÒ±kµ\84ªÔÓ\19uÔ£\96j\aéö §.¨¿\82»\803ÂHÝÃxßÂU3\0\1e2Ý_ Vq\r¶ÇG©-*\11\1e3VÇÃ\91\ 1G&\1c³àÈ\83c\1e\8ceðTÁ³\0\1e\1f<µx²\8c¬´k1Qøè\88\85ÔÃK\87yèt7§ÍÍ\89w3 Üô¦\e\1föùs\1cW;#µ\97k·#¼\12ñw3×p\13¿5&Ū1>Y\r1\16ÕGÙT\175IÁ¨i
+DeË\1f=G\8b£\8b´(º\¾\98jycÜòÄøå\8em\90+¶U5qÝrÆ\rÈ\11?¤êø½²'¼¬ª\84\13ªL8\a®\80\9bª4ÜÓ^ø¶°zô¥\12¿íþJÖÄßKX\11kñ'\80/\ 1S¼üIF-6Xå3¤Ék\98,\8f!K.Ãl-HÌWMb±\9c\89óåHªQu\92Oö¤zU&¯Ðüä.U\18ûUf\1cR©q¯JL/«ØtBE¦\ fÀ\15p\v|©'áú6¼½\³\ fpÅ-\ 3õÀÏõïãÿ^~w[¢å6\eä2\99UcJ\91Ó\94®jÓTÙM3TeÊÕ|S¡*Ìå*7W«ÌìU©¹VÅã\96«hÜjͳô©À²Uù\96½\9ak}Es¬o*Ïú!¸\ 6îð=¤\9dpmÌ`­c\1dmázk\0\ 1°\90ï.|qâ\9b\83¼ØSbUeMR¥Å¢
+\8b\96I*µNS\895[ÅÖ¹*²\16«ÐZ©\82\14\97òS\ 2\9a;¾IyãW)7u\9drR¿£Ù©O+Ûö\92fÙÞÐLÛ9p\15Üá{HCð÷ÁÙÁ
+ØÌúU\v|ÀÅwä\93*ñ¥\ 2_ÊñµÔ\96 \92T\93\8aRST\98:A\ 5©\93575Ksl¹Ê³\15*×V®\1cDÐì´EÊ\9e°T³ÒÛ5#}­²2\98.\19»5-cD\99\19Ç55ã,ø\13\7fß\ 2!\r¿\16Îö°4`õò\ 3$\93\1c|ÿ\1fÓe\ 3Ôä}Çño\85Jx\v\10 \ 4b\ 2  I\80ð\12ä5AI*\ 6\14\91\88\88à;\96ùÂ\9c¢ÎVÛYKífµn¾\94Vúb»\9bUQ«óÚy­UÛÎÎÛº\9buÕ¶»]ﶹ\97\9e\9b×énÝÖ9ö d½\1d÷½'yÂóûþ^ÿÏïÛÀýz|©Á\97*|­Ì\8dW\85%Ye\96ty-Y*±ä©ÈR O®GîÜr¹òjU\98×(§µE\ ek\87
+&-V¾­_vÛ\16Ùl»4É~PVû÷\95g¿\ 4~«<ÛmYm£Ú\ 2Çj8\17!\v:\9ch\1d0\rL\ 1õÜ«æ·Jü)çÿJA±Í \8fÍ(·Í¤B[\8e\1c6\ep©ÀîU¾½Jöü\ 6Ùò§kRA»¬\8e\85Ês¬R®ã~Y\9c;\95ã|Vfç)e;ß\ 6×\95í¸%³ã?Ú\ 4Ç
+øzXûÚ]ô \9b\1cp\r\80\1aîUò[\19\1f\ fp9&ÊéHQ\81#]vG¶lN«¬N\a(V^¡O¹\88S\8bk\9ar\m2»{\94í^¡,Ï&ezvÈäyF\19\9e\93à¢Ò=¿V\86û¯2¹ïh\ 3öï\85¯\8b\95o\16h*¢ÿ¸Ö\81ÉøS\ eJøÝ\ 3\9c|ÎwÇÉæI\92ÕcTn\91I\96"\8br\8aòe.r+»¸\YŵÊ,     ÊTÒª\8c\92ùÊðö)Ý»QiÞoÊè\1d\ 6'\94ê}\13ü\12Ü\94±ä\v­ÅöRøæ\16S\ap\ f\92 Àµ\ 6ø@)>\15\ 1Â\94\9d߬È8Ki\82Ì¥©Ê*ËPf\99Y¦²IÊ(/Tz¹\17T)\r±j¬hQjE'èU\8ao@ɾA%ù\86\94è;ªÄ\8as2T\åú©\92*>W?ö\17a;\82íæR©\11Ô\83É|ǤJ\80\v\14\8a|³THÙ¾x\99&')½Ê¨´ªL\19iØÔª\ 2\94*\9f\92«ýJªnRbuD\86êÅ\9aX³Fw×lU|õ^ÅU¿¨    Õ¯\81+|þDñU·µ\ 2ûݬ¼mØo\ 2\r \ 6ø¸W
+<ÀÉw\9b\ fí\83LÈF¾\99\94V\97¨\14\7fª\92ü\19\9beðÛ\94àwi¢¿Lñþ\1aÅù\83\9a\10\ 5Ø£\ 3+\ 1¢,\80Xð#\10ü,ç~\16o?Ûcý-õb¿\93ØfÂ\11ªä6WBQ9(\ 1.îåÃ\9dW\r\7f-üõRZ N)S\f24¦êî`ºâ¢\87X\90\83$HÓ\ 6)Z\90\aBh«\10B6\84\80\v¡)B\9b\0Ú&È\96\14D$4¾\ 3>\ 6·´\b\8e\b±\85ÁTP\v*1Q
+<|.¨¡\ 6HF3\12Å\84Ù´F4P(N\86i\ 6ÅOç\ 5;\9d\17J\98\17N3\87X3ÃÛ\1c\1d.\ 2ká¡\96&\80\98lAĵ )\9a\1f\ 5\b³0\82(Ìö4ý\ fà\96æÃ1\8bø¦\81\0¨æ{\ 5 ½å$f[\83\943\15þ\10üÓà\ fK\86\96»\147\93\95\17ü,^®m¼øf\93\8bv\ e²\bÃ\1e)\1e\ f¬\1d\87#Ô#²\80Ï\88Èv\ 4ël¶µÙ/ñ\f\edÛïxþ\96:\88¯\ 54\82z0\19^o\80\1a\10³\1d\13\16¤Q&R1\8d´&·J      Èµ      \84¦\ e\16\9d¹è¨N\96\8f\17=/Ùù¼äº­ã\87M\ f\8dÔ\83Á\1e\9cîéä>\82²\9b\9eèÞËÿ!\14»\10góØæç}¦6bl\ 2Sà¬\ 5å|ö\10s>iÌm\86\7f¦d\847y\ e\1ap.Ü]\80\ 2\16­E,`\8bñc       5Y\8a\1f½Ñ\ 5\84\9aôQ\93>\ 6¾\8f\82ö\ 59\80f\ 3êq/¢r9br9Ûc/[ü²\ fyî¦f\10g\bÎ\ 60\99Ï%Äì æ<R\98I¼Fx\93æKñ¤\93å\8dç\0\82Ç\ 1\8b\1f+ÉÇjüè'\1fkðcmt\19áe»\9e\9a¬gèÖÓ\17\ 3\ 43\80\91\81~iÝ  'ÖÒ\97_c6ÖüQaR\15\84·\96\f©\90\98­ÄÌ«WFx\rKÈýò(\9f¢\v\81u`= ,\96k\96°  ,ÁôÇ\16úãAãøRô0/ÛA\ eáA\86n\90¢>Ü.mÃùmÔã¡ýÒÖã,°\17ùÿë\9a\ eo\80:ûH\97»C\9a\84»YÄk\847\81±f-Åÿ\18×æØÒýPl\ 1\1f\1c\13\ 1,\83`\aØ\19'í&'ß¡O÷Q\97!zt\88\ 3~\88Á\1e"È'(â~\ 2ØÇ\ 6¿\97sbÏ«üï\155\92ï*ò]ÜM\ f\12sv\1fü¤,!Ê{_\8c3Ê÷hlù\7f<&Bh-ÖTlÇ\84É0 Å\882é»ää\10=r\ 4?FèÑ\11\ eâ\11\ 6ì(¹8
\91­Òa\1e:t\12üPu¸V\ 6·\83\9fr\18\9f\9b°%Æû-°\eì\8bñ|É\ 1\b\ 3é4.ÎF\0©\15&\911B¤Jgè\93³øq\81º\àå\7f\81\83è\ 2E?O\81ÏAr\963óì!pF\95p»áÎãvú\ 3Râ#<¿+Æ;\1cã<\14ãa¬u:Æ\11\15\87Q\81ô\1ax\1d\\0\8c\9b(±.\ 1\8eA]¦6ïáÇ\aÌìûÔä}fõ\1a\89¿J\91ß#È+\10¼{\82í^ÿ\878\90¬\7f£iþ\89¾û\1c=s\e\8dyS~}\8a\8e¹¡\99ú=*â:\ 3ú+\94ÍG\fÉ/\18\90\ fP]WiÔ\9f£%.£«~Já~BÁ.éi\:¬·Ð\14op÷¼þ¤s0¼\ e^\ 1/\81\7fü_\80¿\83¿ ­>Q\1a\f¸
\e4æGªÖ5tÌ»jÂÒLý\18?~\84ʹ\88òy\v\ 6Jò<Cs\ e?ÎÒD¯¢P\7f@\93¾LÃ\9cÖó:\ 5Û \92t\fk#Dw\14ÆÃQ}\ 5\ e\82;1î?\83ëà\1a¹ø\99Rà1\11\87\15\1e\17<eد%íSu\ 6eô2~\9cÆ\8fS(­\93\1cX'P\96Ç84Fðã\b\88\1fßÓ6Úf\17\1e\1cÐs0>Cá\86Ñx\aÐ\99OEµ\15Ø\ fö\82ÛðÞ\18ã\16±\8d\97ö\15\19h­4¼7ÓjvP\84}\1f¶ëhÅ©øß\84ÿ3ô,jñiÔÞ0Úî)\14á\93(Ò'´
\ 3ØÞL5¶ÓÒ{ðä #u\8a̼M\9bß`\94ïpEW\80íàãhë\80óàT¬Õ\9fW<~§`;\ 3Û¹Øv0\82Å´i%\16ëômüx\1c\v\18êrÇ\98ªí¢\v\16as9ÇÆjÆj=ÇÈ7ø{L\ f`e\v\19º\7f¬R\1fÒ5\7fã:ú%.ÇZ;ÚöÏÅÆ}÷ØQ`ÀO#6³\80\15ÕZ\88m/\19®¤ÚuØ\9e\82í{°Ý\8cíVlE°Ý¥\8dø±\81º\fè«Te\13Çê \9föе/àÙi²ô\8e\9b«à\8ebõX\8f\8e\8fø\81\18÷öØ1¸\99\ÜG.¾®tì\9a±k\ 3.l{±]\89íZ\8eÐ\ 6ì\87°\1fÆV+¶#\1cé]LÊb¼ø
+\19YÇä<H×îäÎ0Þ\1dg\9aÞ\ 4×Á?ø>:\86ã1~6\1câ\13\9e\8f\1fÍkt\17v\rØ5b×\84E\vÈg\ 2ÜØ÷ª\17?\96áÇRüX¢ \1caì¶2)sèÒnþ\96áM?Ó³\89\8eÙ®\ e:e\ e\95\8e05\11&9¢ÏÀ(÷F©ýøñ»\95ãd\ 3è\a\ e{¹·\94\,æ¼XH\7f. &=ôF\ fóÚ\8d\1fóñc\1e~tª\ 6\8e\0\1c\85±Û¦vî¶\11á,¼n¥/f\90Ù\16\99z43Uaê\11\16ïKý\8bï£\1aâH}$AÚÈ+o\15X\ 6\16&²fp¯\8bß:9/:¨É\1cj\12Q6ö­LC\ 1\1c\1e8Já¨dRÿËr¹À¶u\96\8d\9dÄ\89c;Ç\97ÄNì8NìÄvlDZs¿:MÛ$m×´  ½ÐKÖ­ô¶¶bíºBJ©\90ÖA·Vë\ 4S·¡©\1dÝVº1D\19¥ëm0ÆØ\80\8dA       h*h\9a6&.ZQÉÐPG\a\82'\8de=:Ççüç\7f¿ÿþ½íèô 3H\9dìÞ1VÎ*fí\ 6\9eì \97¦ÔÏ\fîc%õ±\9aûX\1f½z\ f>\86ÿéA4§lsGÿ\ 6X\rã°\94gKH  \16\97\98´¨°\14\1d;µ;Ѩ$þ\0:uè4¢\93 \a2èt ÓÇo>õ.&¢    zg=;ì6Þì%ʯÒc\8f³ìx/ÁUø\a|ªû8fw\97\93\1e\18´\9fcn\1c\96À\bÿ\17\10Ë\10ïç\95\15i\9e¥L¹"\87\ 6Ì.õ\99|ê5Õ¨Ç\¯nsL]æ\94:ÍYu\14v«½0§¶¢\11µ\16-W¦x­Z\8a·(mÙ£fËA¥,Ç\94´\9cVÂr     ¦á\1aÜÐ\ 1´v¢¹ÁMß{æRÓa\18âÿ\0G^\1fï{\1c\ 5ê±\17«ÇjSW©¡\8e\12\8fÚKªÔVZ«liD\99Ò¸ZJÓJ[;ÔlíWʺPɲ1%ÊÖ(nÛ¬\98m\8f¢¶\83\1fS\83ý´"öË
+Û§á\1aÜÐ\14:ÛÐ\G\1a8N
+6
+CÜ÷C7Ç]'±´\13c«aV«£DY»]-v§ÒöJ¥ì~%íuJØ£j²§\14w´)æèUÔ±@\r\8e1EÊ×(llV\9d±G!ã~Õ\1a\8f*h<§\1aãG
+\18W¹^\87\7fk\ fú\9bÐ[í\9b\17B\ ezøßN<YÞµ\10K3±¤\9c\85J\1aV%\f\87â\86K1çF#¨\ 6\88Ѥ°3£zg·ê\9cC
\96(èZ¥\1a÷ç\14pïVµû>Uy\8eÉç9-¯ç²¼îßÃuùÜ7µ\v\8d;Ð\\81MZLÊ3\14 ÿ¹v@\96giÞ%\89§\89r1O\81\1aÝ\165¸m
\rÕ»+\14rW«Ö]§ 'ª\1a\ 2\15\1dòWäT]¹HU\95+äóÞ©Jï.UøØq}\8fÈíû¶\¾Kry§áïr{oj'\1a\93è\8d\93\8e\8f@.È\18pm\834ñ$x\17#\96FÊE\88¥Þ[¨\90ת ×¡\80×¥j¯WU¾ Dä«JÊ[Õ¦Êê~UT\8fÈã\9f\90Û¿A®Àçå\f|EFà\epJå\81\8br\ 4®ÈáÿPåþOt\17\1a\e#ÝZ\bý!ú\80k\ 6\13ç]\ 3\84\89'DÙ\1a\7f\81ü~\8bª\ 2vy\ 3\86*\ 3\15ª\bøå©©\97»&.W0#g°GÎÚ\852j\97«<4)Gh§ì¡/Ãò\85\9eRYè\1c¼\ 1\7f\96­öcm¦þÕèÝ\86]\1d\82\1eh\8344\11O#ïÂ\10"\9e\1a¨âYe¨P\9eP\99\u\ e9ëÜrÖWɨ¯Uy}£\1cá4tÊ\1e\9e'[d©Ê"kd\8dlUidJ%\91#²DNÀ\v*\8eü\Åá\ fd        \7f¤\8dÔ¿\ 2½EسAè\82,$!\86=\88ð®\ e\82P\r\95<wGÌr6\94¨¼Ñ.GÔ){´R¶h\8dÊ¢aY£     \95ÆÚT\12\e\90%¶Hű\95*\8aoRaü^\99ã\87d\8a\82Ø\19*\7f\8dëû*\88ÎèvtÆ#ì    ¤\9cýÐ\ eihâY#Ô£Y\v~î}<÷`á\9c1³Êã%²%m²&\r\95$=²$«U\9c¬SQ2&sªE¦T\8f
+Rø«\14\19³Ò¼\9b{\12õÔ7\81ä;IÆ\94|\ f\96º\97Rïü(ã\0­\90\82\18Ï"P\a5Pų
+l\823Aþ\9f4ËÞlQi\8b\19\87Ì\19\97
+²³\v\99ÁÊ\12h6\ 5x¼VLk+yt+^³\15oÓJf\90%\97Îb\ 2\0ÙcfF«¨{1uç°\86\9dÐ\ 2     þGcÌ\ 3\br_ͳʤä¶\95c\13ì\19\93¬m\16\15µ\97ÉÔÁ\86ÞÉfÚÅFÓÅ\ 2ê¢c»ø \e\8dßíƸv¯\ 1\f\ 1Þ=\ 2d\f\9d/û,\80\19\8dÓ®aêï\836h\86&\9e5@\88{?Mò¦\99\ 3\19ü\aÕÚÛñ \9d&\15õ\14« \97\ 3¯\8f\ 3¥¿|ncÏÑ\17\83ôÅ }1ÈG\83x«ÁaÀ¼\ eâ)r\18\98\1cÆe\80¬m\03Òÿ\ eÌh)m\e¢x7d!Åÿ\18Ôs_C\9b}YôÑ5:%\eU\96öIE4Oó8Ø\87ð\96ó9\\17\10Ç0}1B_\8c²\91\8c2yGé\8bQ>\1c\9d\aË\8091B\864B¶6LÖºð"ü\81og4\8aÆ\0t@\vmM@\ 3÷µmÌ\ 1\86ÔÝ\8d>º¶\9cTÂð\9a±®\1câÔib\10\8b8d\89ã6â\18cL\96Í\1e¼lì\13l&\13ôÅ\ 4\8d\98àãqÆc|-0'\963/\97\1d§<~wé4\×|tz¡\8d\90ÓèF¹Öaɪ{Y\ 3´× \196t-#\92\89ªHb¨\ 3Æá3ı\828V\12ÇjâXC\1cë\88c\921\99dÑOÒ\17\93\9e
+Ö3\1eë¶\ 2\1eoíc\94e}~\96\8c\87ÊÑÎ.hE7Á5LØ\ 1Ú\\81=5Ð-C·h,¯I5$sÔ\ 1ëo%{sIß\1d\8cËF\12¯Mı\858¶17v0&;XÔÛ\19ØíTº\9dàï¢ð¶½ÒVæÄ\16æåfÖç¦\ fÔßÏô¤H3×\86\0!sÜÈà\13\85\9a³z\f))"ßö[\89/:@\17ënúdw±t/óô\vı\8f\83v?\9bû~\16Þ\97èÜ}ì\15\8f)
+\7fñk\94yRÚ{\9eòÓ꣯³\8cs\8c"!Úì¥Í\ 6íµRÜt{^sk^ën¸\ah
\82zóÉ8K\ e\e!L\8et?Iñ!\12ÒÃÄq\948\1ef\9d\1ce\91\1dep\1f¢ò#Tx\18÷p\98\ 1öªC¯©\83þN.a\1d0ÆU´ÙX\87þ\9dRÁÖ|ûîÉëíÏë\1c¼e\80ø>oH\1e\ 2º\96Ô]Ø)aþ0K$æÇ\19\9b\93¬\97\95gX'Ï0Ù\9f¦\93\9f¢qßÚ%=y\84\8fãçÕ²\9c1@Û\8f¶k#ãÏVR°+¯{ ¯ù@^ëëy3òxÞ\94Í\1a\ 3ºT'áé¼Y{.o\1a¿\ f?$\8e\vôÇ%\ eýK\8cÉE&Ü\ 5úâ<{Å\8bÌÍsì\99g\9fW\1cí Ú\1e´mlé¦}y³õ`¾}\14ò\12\90Í\9a¢çó:Lmý`VKs\86\91%OÊ,ý\ 4~\ 6¿\80·\88c\9a½c\9a\ 3ú·l:Wè\8bß ú\16\9b\8d\93d÷ºÅ§p\13þ\83·ú\ 4Oó/yÉþCú\b/s\8d\fü/dì\7f"o\7f\17GñG\16çÛ,\92ßá~®à§~ͤy\93IúK\1cÚëL\96WéÀW\18°\1fã^/ë\ 4¡}\8f\10_%Ô¿é,jgà\14\9c\80'à¿èÞ\80\7fÂ\füUf½\8f§y\a\7fw\15?ó6\1esZ)ý
+\97ð:\ eâ§Äñ2q¼\84\8f¹\84Óº\80\ 3{\91Es\ e\17x\96Éû\ 2q\9cÁ­~\97Éó\1d&̳ÿg¹ÌcÛ¼Ë8þõmÇ~í×v|Åñ\11;\8e\1d×\89\9d8i\12§¹ê´M\9a£é\91¶ëµµ¬´)ëF\87\ 6=¦±C¨¨Ý Ó$@ \95c\1a\93\10Ç\ 6\12L\f     \86´ILHC\ 2\89\8f©\88CêÚÁ\84Ð$PøäPõéë÷}ó~\9fç÷{\9eßï÷<$ÈË\ 4é%<ù¦þÈt~´nû+ký\15|\11>Äî\1d¸\r¿Ý\9c¾7å¡3\r0\86(_fô\13\15ѯ¢=\84ö\18ÚM´gP^ <ûÐ?\88þQRã$úgH\93GH\97\8bX\7f\86ô¹¡\17xú< r\ 3õ/0Òç°{\r>\aOÃß°y\vÞ\86×áûë!·ã»\ fÝ\10$ð=\87~7óVÃÿ!Rd\fÝí\8cc\17ºs\8ce  Ýe:Ê#h\9f$\85Ïêª>\89\8d+xñyÒëKÌÊ+Dègt\9e·á\7f°\8a\97«ÌØ*s½\91B?ØLm*\fô×ÒÑ\83®_×éu¯ÑÛ]S\1eµ2º5t·âÿ¨\9e¤\9bü,Ýß\13ôv\8f\93#WÈ\91Ëøq\11?>­\152ãSü{R\17\18ý#\8câa\12ø¼ÞÕCdÚCØþ\ 4¬À/6Óük\9bËà*<        \8f3\17\97\99\8b\8bô\98\17ÉÏ\8bJ³\;Ñ-£[Cw\90\91\9d@w\1aÍY4\17Ù:\ f0\vG\89ÈÇt\9a7\ fòå)T\1f 2÷\13Å\13dÔ   ý\ 3V×9\ eßÝ\1cûµÍ-hm[¸°¹=\9dc\8d¬0\17g\89É\19Å!\ 3\ 5´ËX¨¢=À\88\1fG¿\89æ\f\9a\8bx°Ìl\1c'[Ïp¼<ÊÝSxö<\19ü\12Ùó:GÏ\9fá#~¯®Ã)Ê|¯\8d{Ã6Û\ 4¾o\1c\r'äàhò¢\19\80Vt\13\90aE\16Ð.\93\89\aÐ\1fF\7f\f½&\991KT\96ðä0\19{\8al9O¤.óô:\1e¾H\ 6½\ 6¿æøÿ\80ëê:7°Å\8e¥µ­ñãëv9Vá ì\97\ 5]7\8a\ 6º&DÐn\83\ 5ÍãÇnõ¢_G\7f\18½q´§É\909þß\8fGÇ5Å,N\12Á     2i\9cx\8c\11ù1ö\8a1v\9c1v¥q|X\8bÿc\1c3g9ò\8e³¥-s]\82y\8eãÝlû³äÅ.µ íG;\b\93ègY\19\ 5l\94±QÅÆ\0z\rt'ÉÖ]üÚC\94îó\aYI\17Èâ§È \17ø«oÃ\ep\vþͳU=\81½ó\1cs\ f\1fôQÞÀÌZyÖ²QªM:,\9a°¸Ð÷¢ï×6rc\94\1c\1de­4Ô\81\9d\ 26Êب¡7\88î6f¥©~f©\8f\88j\95xô²2{Èú\8a¾\ 5?\86ßÀ]ø¯>\83­3Ø=ÂѲ\ 4³Ð\84q\8e¼Q\9e\8fàϰǦ!\87[[­\86\ 6-&vÂØ\89c'\85\9d\1cv\8aØ©`§\1f;Ãü\9aÔ\16f°L$»\89G\89\15S´\V\97åY<þ:ü\10Þ\81¿Ã\7fô(¶Naó ÇÊ<eØ4\8cÃ\b÷[)\97ë¼ë3,ªy\1dª¹[Tu\1aêu\ 4U±·j\8b-¡²-­n[^%{·\8aöªº\1c\83*8ÆÔéØ©¼sI9ç1u¸V\94u]RÆu]i×\8bðªRηá¶R\8e\ fu\1e\e'°¹\8fòk\86\92c\12\1a0È}\1fÏ{ñ¥\82/e¿MeÃ¥n¯W%\8f_EOP\ 5wT\9dî¤ò\9e¬r\9e.ux*ʶÔ\95i\19UÚ;­\94w\8fÚ}G\95ô­¨ÍwIqßu¸©\98ïUE}oÁ{\8az?Ð
+6\8e`o\91Rc\a\18\fA\1f÷=øRæ]   _ºL\8b:M»ò~·ò\86O9_@Y_X\19_\i#¥\94\91W»QVÒèW\9b¿¡¸\7fZ1ÿ\92¢\81c\8a\ 4Î)l^QÈ|NAó\eð#\99\81_Á_\14\füK§±q\b{sQr\90\ 1\ 3På¾\8c/EÞuâK\ e²!\9bÒA§R¦Gí¦¡dÀTÂ\8c(n&\153;\145K\8a\ 4kj\r\8e(\1cl*\14ZT0tDfhEfø\92üágá¦\8cðk2BoÉ\17z\8fë?u
+\e\a°7K©3A)<\ 4}Pá¾\84/\9d¼ë\80\fþ´·ZÕ\16¶+\11r*\16ò*\12ò«5\14R8\1cW(\9cQ0Ü¥`k\8fÌÖ­
+D¦ä\8fÌË\1f=$#zZ¾ØcòÆ®ª%öUy¢ß\93;ú&Ü\92'rW÷£¿\17{;i\15Ç`\90R¸Êµ\f\ 5|Éñ.\ 3íø\93\88Z\14\8bÚ\14\89Ú\15\8ez\14\8c\1a2cA\ 5bQùcíòÇó2âeù\12uØ&o\e;KÛ~yÚNÊ\95¼ gò\199\92_\96½í;²µý\¶Ä\9fdOÜÑ1ô\17±×¤5j@\1d*P\84<þdy\97Â\976\88Å-\8aÄ­
+%ì2\93\93>\19í¦|íayÛ\13jiÏÈ\93\9dªÊ\95\1e\91\94=½$[æ\84¬\99\87eÉp\1af(HÓ\14\9diúÍÔ\1fà\8e\ ecc\ e{S\94àÃP\832\14(ÿ:x\9e\86$¾Ä!\9a´(\9c´*Øn\97\92/ãUKÖ/w6$gGL\8e\8e\94ì\1d\9d²æ*²äè)r\93\f\84F%O\83\92§9Ès*ä©\f\0\85gÇïá}-ck\86¶l<K\1c \17J\90çY\16_R¼o\83(\84¹\ ff¬ògí2r.µtzå,\18²\17LY»H¬.\ 6ÔE\1d\ 6\9aÖ"\8dS\91\86©DsV¢Y(Ò \14\8a/ówo\0ÕKá}íÅÞ\ e>\eÍÑë@%·!\93\83\92ø\12çÚ
+AÞ\ 5\8c\82M-]N9K-²u³Éma\ 3©°À*$M\ 5G+],ljè\1e\9e\9d@ÓÔÃiÜCeP¡\96®P où)àCù®\16Ð\9dê$\ eP\83nèÄN\aÏS\90\80\b÷!\9e\a\906Jô@e«\9c\15\87¬½\1c4U6ó\1a\e]?\eM\9dÅS'hu>ªÓ[Õéwë4qu\9a\98:Õ@\9d\9f\9f\86¤\8fʱ\86\ fµ{\9a-\10\a´\ahAz Äï<Ï2ØLr\8dr\1f®YÆ~\ 5û´°Î\9aEÖ~\ eÖ\ 1\ eÚA\ e\9c!\ e\96aüh\8466\98\ 6\93×@¬A<\1aã0\ fÇ\80fq\84&mø&Ð\90\fý\8e\ 3á\9e¦     ]\ 3ú`\vta/Çç)®qîÃ\fÇÄ®Q\93<Hr\1cÈ2Ä\81?B\8f\90¶q¸\8e3\17\13Äd\8a¹h\92\17Mæ¢Éä5ù°I<\9a4\94ÛÉ\89íçø\e\1a¨I\9a´      \9a£ñwá\9e&\18ÛV¨B\19{\ 5Æ\9bá\9aè!\a\b©\89]\ 3»îaÉÞÀö6\98\80)hâÇ\ eüØéÞ8ðwû7\ e¾\ 56\9d\ 5òb\81\81,\fð\8cxÌïe\ 1\92\13säån\1aÓYúÝ\99w¤]w4ÊøêÕ\8d\14*a7Ç5I{\1aáS\93ñ\1aØu\93ÞÖÉ5\9b@\8aQ4¡\ 3\16)tö\10\97½Äe?~,ãÇabr\1f\eÊaòâ0sq\bÇ\ fÍq8S¥\1d$'\96ÉË\ 3¬Ï}¿\84¿j¸N\1c\18k\ 5»\ 5®)Æ\1ceÌA>óa×E{HY´a\93¥Na·Vä¡\ 3\876\v¿ÿ3]®ÁQÕg\18\7f6{Ëî\9eÝì9»\9b½d7\9b\e\92\98\10\12²\84[\88\rPb\v\14F
+*\8d\ 5Ãe(P*\88S­S\a
+\ 3\ 2J\91Ò\ 6/PÊ¥j-2È Ê´:ÓÚ±j\ 1õ\v3öú¥H«m-Óéø¡ÛßÉ\9eét\98\87ä\9c;Ïû\7foÿ÷¡ýµ\92el\14?VáÇ\18~¬å\82YÇpYKb×r 5\18\1aã\v\89Õ»ø»c,N\bÔÑ\ fÕÏY{à\9dÄÏ&Î\9câÌ&¡38¯Ïæ]ìp~ÙᣴX¢±á,¿kÀ:g\19ÞHL6³\98}\ 3?¶Ñ¯\ fÒ'\ fÒÔÛ  ðv\f?\80±m÷I[ÉÇýÌË-¨\9a¯¿¥~x;g\92\ 3r\9c\16q68¯w©sÎ\95Î\92mó­\a\1c\ 3QQ]·Ú˨#\b\1er\96s[ ì 7»é\97Çðc?}²\8f&{\8c\80ï\9d\87\80¹\87Ïî\97v±ÍïdVí¸¬ÉÄ»H\98²\8c³Ø"òÏ8ñÜí\9cs­ÃIKi\eø&xÄ\11A;Á.G\14Ùâd¿#\92\ e\81#¶h¡^\9fe~\9c WN0?\7fH\93\1dç°ÇHæ3\ 4î(ýq\14e3~VípçáNÀ\1dÁEïj'®[\9cóÙ\9c;ÀnG\88Ø<¶\18$\94¬êØ\ 1¶H9®ªX<\r\9eWU¸Ò~ºH<^£W^ef\¢\ 1.\12\8b\v\ 4÷e\ euîqDæI\15àNÁ\1d\85Û¿Á\89ïÃ\ eï^pÐá³¹\8eý\1fÏ\8fU\15\896×Kà<`ì\88\11,®D$\9dô+ð\ e5ò>õñ\ 1µñ>\ 3ï\1aÉ¿J\9f¾Kbß&\16¿>Âf-ý\v|
\ 1þ\89¶º\85Îü\94Ýùïìï\1fOl¿Ýú\13ÛûïØð¯£.> I®Q¬¿Aa½M¡¾\852z\13õ÷\v\ 2ø\ 6\ 1ü\19\1aó2zâ\92\ eàÖQÜ{\ 1uõºÎ¢k~\8a\9e8\ 5\8e\82Ãà   p\vÞ¿\82\eàÏà÷àº\ 2z\ f]u\ 5\1dq\ 5\ eÛù\9blð¯£$.ãÇ%ü¸Èî~\ 1Åu\9e¦9Gñ\9ee\87\7f\11\ 2~<GÁ\9e¡HOQ0'HÜqþ\7f\ 6o\9eÂûqtæ\11x\ f\80=à;àÆÿxÅy¤\9f\83WÐV\17ÐwçÑ3çÐv/¡!^D-<\87\9a8\8d~8\89Ú9ÁÀ:ΰz\96Aõ4
+ö)\9aw\9c&ú>~|\ f?\9eDë~\97bz\82":À©÷é'¤ö\97ð~BiUh\9f
+^V\88Xe\82û]ð\9a\93ÚSNÚ\9f&\16ãhÝq4æ8Zæ\aj%v\9dØ\9d¢Ç\89Ç~\86ö>\ 6ö^\ 6ç\1eôån\86×.\ 6×NÝC)­¦u¾\86\8e}\80\ 1×!¸~D\89_Òvý\81·\15<¬Ðâ\15m\ 4vÙ\p¸Ç\9d²ß;Ñv\1eâd`Á\ 4\88Ý"v;±;\ 5»eZu&v\87°;\17»#\94óbl/£"VÒÎc(¼Íp<¤\r4ïz"µ\8e\8c­%³kÐ\99cp¯\ 2_\ 5/;muÐi÷G\9c\96Ü:Ñ\9eµØ\8a\0\v¤@\1e»ENØA´{°;\15»Ó±;\88Ýaªr\ 1\11X\84íe\8cÒQþ­Ã\9b­\13\91¹\8b쬠\93ËÉörÝ\ 4\15²W¡ª+b\9b ¶Õñf\8f¼\8dÎ8\1c\9b\18S\1eü\f\ eÄ@\1a䩾"¶;°=\19Û}Ø\1eÀæll\ eÃ>B\95~    ¥¹\82*YÅo\9bðêa®\9aýTÎ1²v\81®ú\10|\ 6*\13\8c=¦çÄØ·¯\ 2{LÚcz\99\ØócÏ\0Q\10\a\19\89z+¶Û±Ý\8dí>l\ f`o6\1e\f\13\8d\92¥\9a\87§s±:Ìé>GÅÜNU\rQuCtô\1cº\7f\b~\e»\9c1ló\7fEÕëо¦ìkÙ¾²\16\10\vT\ 2\b\ 4     \90Á~\1eû­ØoÇ~\17öû°;@V\ 6ñd\1e\15»\88jY®\19dg:Y\1cà¤ÓÈG\99®-Óåe:²¬ÿ\80ÊÄ5c_  £\8c÷;¹~\17\82Ï\83aWuM\99C,\ 6\89Ålr2\9bÚ\98\85\1f³T\ f2ØÏc¿\15ûíØïÆ^\9fúy;u£\11õ\12Å)TE\ f\f\93ÉG7Y»èþ.ý\16ü\9bw\15m\85k\8cUh9WÿÂÚêJ4\ 4fò<ÀûiøS&\16ýÔçTr2\95Ú\98J\8döáG¯\1aàh\82£\15\8evìMÆnY·ám'±è ¢ídv\12Qn£ÒKt\\89iUdò\14\99~E&q        \1f6qÝ\8fr½-e¤/`5\1d\ 23ø½\fz¹nzð§ÛW£n·\ fûAì\87A\14\8e\18\1cI8²p4ÁQÄ^'ÿ÷âÑtµ\90¡\ 2UR \1fÍTx\13ý\91'óy&@#5ÑÈThÔG<\7f¦õðß\ 5ïBVÒaÖ\9f\f¦ðÜ\ 5:øl\12þ´\ 5<*ùjUò\84TtGÔê\8a\82¸
\94\9a]9x
+ðLÂf·\1a]eå\s\94u\8d¨Áu§2®U`\8bÒ®\1d\11ð<x\ 3ü\11ÜÒ}Fu\ 5\1c\18âª\1f\88V¥B\17Ïí¼/\81\16|)\18n5\85|j
+\ 4\94÷\ejôEÔè5\95õ&ÔàÍ(ãÍ\83¢ÒÞN¥¼}Jú¨\1aß|°T    ÿ½\8aû7+æ\7fT\96ÿ°,ß\19YÞ˲<×e¹ÿ¦{áX\ 2ß|xgqÍ÷\83É \ 3\94xW\0M|\9e\8bÔ(\eö*\13ö+\13
+*\1d\f+\15\88*\19°T\1fH*\11È*\1e((\1elW,8EVp\86¬Ð<\99¡%\8a\1aL\18c³"Æ£à°Â¡3àU\85\83ï\81\9bZ\89ýEð\rÛò\84\17Ü\ 6Úxná}\1edñ#\13­QªÎ£ú\88_\89H@ñpH1#,Ë\88\82¸L##3ܤ(B¬\ e1\12\89ÌT82\1f,\91Q7ªPÝ&\ 5ë¾­@Ý\93à´j#\97ÀUù#7´\ 2\8e/À7\ 4ï4äI\ fh\aEÐÌ»\1c\9fe@Ò¬QÂô*\16õË\8a\ 6\ 5\15\8d\18pE\14©³\14\8e¦@£\8ch\11t)d\96\154oWÀ\¨Zënù­\ròYß\92×:(\8fuRnó\15pE5æ\r-Ãþ\b|\83¬9ýH\93\ 6
+<7ò¾\ 1¤ð%a¹\15³¼²L¿¢f@ufPa3$Ã\8a(d\99
+Z      \ 5b\r  ÚX\87üñ>yã\83ò$î\90;±B5\89ur%X|\13Ü\f \96±øE\80Î\8a}¤¥pÌ\87s&ëo/è\ 4EÐÌ»,HãK}Ü¥xÌ#+æ\93iÕª\ eDb\ 1\19ñ \82\89°jë£òÕÇä­OË\93ÌË\9dlSMªG®\14;l\1aq\92fú¦¹\81ÒÜ\86i\96ßÔ        \80\ fI|HÞÔbx\86SÈGdQ\ fh\a- Ï»\ 6|Iñy"Q£XÂ+3îS\14D\12~\19õµ
+&\83ò§\ry2\11Õ4Xr5ðÇ\r9\9cg\97Ï¢)²\88¥\1cK{\ e¡\90caÍq+æX³ÜÔY\96Ï\86«$ú/ú"\C¬Þedj\17(\81f\9e\91\ 6I>\8f'ݲê=\8a&=\8a\0#íU0ã\97?\e\90;ÇðÈÓ¼Mv\ 3Å«_nFã5#\\9b\11O\ 5&~\81\e¨ÀmXàflÞ\ 3Ø\92\9að!\7f\r\ 5|e6\92¬\ f÷;A+hâ9\8b/)>«O»\14\ 3&\88d\2²5
+æÜòç½r73D\v\fÓV£:HJ\14W    §ÛØãÛÐxm\88ǶA\80Ölc\9foC\1c\95¸%K\88\81"\9bK+>´|¢¹pNç+=`\12hi¤\16\80\1f\88óÓ\ 4\11Þ\85ÿË~\99F5}faü\8fX5        àZÜëZ«"\88
+nUƱ®3hÝ:£Õ\ 1\8a­Z+ne\9c¶J;\9a=\88²HYB6B\bIH\80@\80°\84\13 !\ 1\ 1Ѻ/ÓÅNíT;Õ¶ÏK2çÌx:ÛÉ\87ù0pÎ=!\90üïóüÞû¾ï½ø?}\1afÀé^\94÷LÌR³pÐÏ\86\8e¹`\11@\ eVr¸¡\80\ 2ñ\85@¬G\10æÝ ôòA\18Þ\ 2w"0<\ 4¢\9f\9f\87A!\0ÃÇ\¬Å\9c\aÔª©X\a<7\101\v1\rï'#×\ 4hñG\8cÂïÃñw_à¥ã±C0"\f\9a\8d\v5\0\17m tÌ\87\8e`\1cø\vÁ"\ 4,BÁ"\14,Bñ P¬Gèb\ 4\86ÈP\f­!\18ÜBpS/ ¶\10³æ\ 2t²Á\ f¨\15\16Ï\9e\8b\98\89ߧ"×$ä\1c\8b\18\8d÷Øî\94/°Ò0ªá\18¦¼`\r\17\84\bÁ¥»\18:\96BÇrèX\ 1\16a`\11F6;X\84ApØ\ 2\ 4\86Ù\95\18æVb\80\\81½ñr\12>\8f\ 1i\19:ù¥_PKðüù\88Ùøø\fä\9b\ 2-ãñ:\ 6ïGÀ¯/òÒ\90÷9\92\17c+.q|\ f\ 1Äh"ð|èX\85\v~5.û5¨\8duб\11\aßFlª\r0²a\1e\1a\12|x=\86Êu\18èÖ\1eÃç04¾\82.zõE4)÷¨\10à\9a\87x     ù¦CË$¼úãýHl-\1c¹\14\r\81\13×±;'åjn\80\17\r\15i´\\rW8tl\ 6\8f-б\1d\ 3\aÛ\ e°Ø\8e\87n\ f\vÛpNlEMla¢Y\13ã²6â{ר`ä
+\80ÔYð;\ 5¯ãày\148ûÂï0ä\1d´\12Ï_õw97º\e= Ec\89\e\80î\ 2\93\11  \1dÑб\17õ¹\17\ 5\15\8d\a¿\ 1\ 3QøR$Î\89\b\f´{P\13»1¨îj§æÃëÜù`\80×       ð<z     ö\0\8e·aXB¯5n\9fáî&s\9b;\1fJ\1cMµ«\ 1\8dBD»\eq\94\1c\9a~\8a\8aA\ 3v\14{%\16µ\11\8bú|\17\8b{\1c,\8e¯ÅßwQÔ\11¬G\fÖã\9d\\8a:h¦\82\90÷Ex\9e\8c5\1e\ 3©~à<t½;ïVwÎ]î|()\f\12®æ\9f4¡1\88#î¦<Ö=\98àJÀ DQgP«\1cè\10 6øX\13\1e@s\0\95\ 5#LtЧ±G?\12â³zj\ eÊe*þå¿\1a{\10\9e\87\11Æ;Ü\r~\94Û\1fñvØ\9dë\84;O\9c{(8C¹\86#\1c\7f\18þ\Ã
+\19\18\80\9a\12¢F¤Ø³Ù¨\r)êS\ 2Ã"\18Ì\8c ¨t\bNÃT\97ª¤f`\9dÇ#÷Hä¦\11Ï8Î00\81\11â\98;çIw>\ eBàÎ\83í\85\95\8b\f\89Y\94k`Ã\95\88ö\9d¢°õ(,7U
+\1eUØ+\15Ø'F\14|\19`\97\80\85\1e       
+ ^\9bEMBîÑðÍ@n/âù\90\9b+iúQ¾ýÃ'\19B/ p¼aT\82/D\8e;\97\1a¡C\14!ÈàX\8e¨BÔ"È0\8bc\88r¢>ºQ\e\9d\1c8/l0Ý\8aûÃ\ 2\83MÄÐ?þxy\ f~nÈ0\1a\9dáë7|ä¨ÑcüÇ\8e\9b0qÒä)S§M\9fùâ¬Ùsæ\ 6\ 4\ 6Í\ f^¸(dñ\92¥Ë^^±2lÕ/W¯Y»nýÆ_ýzÓæW·lÛ¾ãµßîܵ{Ïï"¢Þ\88ÞûÖ¾ýo\1f|çÐá#G\8f½\eûû?¼÷þ\a§â>üãé3L6\87Ë\13Ä\9f=w>1)åBêÇé\19\99Y"±D\96-ÏÉUæ©5ùÚ\82¢â\12Ci¹±¢²ÚTSûÉź\86Ʀf\8bµµÝfïpvv]êé½|åê§×nܼuçî½û\9f}þÅ\97_ýùëoþòí£ïþúý\93\1f~üO\7f\ 6üÿ\9fû÷\1aD\1c\ f%\96}ày\ 41ý<\\8f'¶_ ¾gÀøKÄù<b}\ 1¼\87\12óË\89û_Àþ+Äÿ\ 6\0\b'\ 4\12\ 4¿\ 1\83×   \84HBáM`8@8Ä\10\10ÇAâ\ 4Aq\12,>"0X\84\ 6\1f8\12\b\8fd\ 2$\rD\84\ 4\89\940Q\0\8a\8a\ 1\8b\9ep)#`ª@ÆLÐÔ\136-\80ÓFè8\b\9enðé#\80®\83Ðm\82èO\84Ñ\ 3@zH(=&\98\9eþðc̾Ø\ 5dݽ\aã¬ôz¶\18~æýßxý\f°\7f\7f\8bìß\13û\97À\9eáEyy\r\1aäí=\18\f\86\f%\14\80\81áãã\v\12ÃG\8c\18    \18£Ç\0\87ÿX\0é'\ 2$`\ 2\ 2,\84K?\18W-=C¦\1f\f¸\84o"[      ;éõ=\11QÑoî;p0æȱØ\13ï\9fúð4\93Ã\8f?\97\98\9c\9a\96!\14Idr\ 5\vÙ-úbXìwø\8cAWMô\17\ 5\97°      \9f0
+§°zû\ eÌÞ»\ f»\9f}\ eÃ_>xð\15\8aäë\87\ f¿\81ïo\1f=züø;xÿþÉ\93§O\7f\18ðßk¡M¼×ê·ü¾uDT_\93_²¥ba~CÙ\96\12\81ªJÝÉ:C\1eÏR¬àÚ\v³¹\9dZ      ¯G#â÷©³â¯æe&\Wf\9c¿©HK¾ãi\fh\18Ð0 a@Ã\80\86\ 1\r\ 3\1a\ 64ü·Ñ\ 3\rwÛ|\97Ýk\85\86fßdKe°¦¡üUhØ_ݯAųès¹ö\ 294H¡AÌïSe   ®*\85g¯) A\96\9exËÓ\80\86 · án\9b_To\8bO²¥*HSoÜTb.ÙW]¡û Þ âZ\8a A\a\rùР\86\ 6%4(\84ñײ3\13n\88¡ÃÓè\86\86ëí>Ën·ûEõ´ø$YLó !Ü`*Ù_mÔ\9d¬/Qs­\85Р\85\ 6\r\89y\97\15\15y\96àSIfüuaƹ\e\9e\ 6ÑÐgc,»ió\8dê¶0\92,5\ 1\9aº\8apCuñ~S9Ñ riÈ\87\ 6\95\94Û\9d+á]\96\8bxW¤Yü«"¡àZ:êÂÓ¸d¥Mèµ3\96^µûDv\11\ræ9ù\9f\187\95V\15\1f0\95éN6\14CC\ 14¨å\9c\8cÛ\9d#áöÊÄÜ>1tdBG*êÂÓè²ÒÆ÷@C¯Ã'Òie$5\9bçhÍÆÍ¥\15Åo×\18\1aôРÍåØUr\8eS!ã\Ê\96rz$\12\10:Ò #\ 5{ÄÓè\84\86î\ eÆ\92n\a#¢ÃÊHi¬     Ð\9aÊ·\94\19õ\akJ´§\1a
+¡A\93˱)sØNy6»K"cwgIÙ=éÐq\ 1:\12E\82+\9e\86³\95\v\1aº\9c\8c\b\9b\85\9eZg
+ÔU\95o-/Ó\1f4\17C\83\ e\1aTРÈa;¤rV§(\9bÕ\95\ 1\1d©Ð\91\84u9'æ_ö4\1c­ôq\9d\ eÆb§\93\11Ùf¡¥Õ\9a\82\v*ʶ\97\eô\87Ì\85Ú¸Æ|5Ç¢T²Û³\15,»8\87åÈ\84\8e\8f¡#Eƾt^Êé\8e\97ò{<\8d\8e6úX\87\93\11jwУ-VZ\86©zQQYÙkF}QL­V\e× \86\86\9c<V\9bDɲ      \15Ì\8e´\1c¦#EÎr&ÊÙ\9dg³9]|\19ï\92§ak§ûÛ\9d\8c%m\ eú[\r-\f\91±j©¾¤tg\85¶èp­Z\17× Ô°\9be*\965+\8fÙ\96¦d¶§ä2í\89
+VG\82\82í\10äp\1c\9Ïéi´ÙèÏ·9éË[\1cô\ 3æ¦á2CeX\89Ö°»RUt¤6· ®N®e5\8a\96t5Ó\92¢b¶&\82I\82\92Õ.Àúps¹6v.ÏîiXm´q-NzX½\83\1eS^ï¯Ð\19×\18\94\86\88J¹þ¨YV\18wQ¢cÕgh\99\8d\17òYÍ\89\1aVK\82\9am\11 x*\8e\95­â¶2óø\1eG\93\9d6±¾\93¾ºÆA?^T÷\82RaÜX*+\8dª\14\17\1f5\89\8aâj\85\85¬\8b©\ 5¬º$\1d«!AËn\14h9\8d¼|N\13'\9fÛÄÒð\9bÏh\ 4\1eG]Ç°©æ.Ú\86r'ý=UûØt±i½.³4ºâ'öë$¸­ú\80ãø\11l'Nb;ni\bPÚà\0\rq[è´\f\ 3\81RN\f\81¤\ 4RJK9\0IÓ¬¤\10"¼éíO»lËÚ÷õi{Ú%ËZ\9e6[\8b\92\17yKÒ\99Ðq¦L\12\928=¹\7f§\8F\Ú\19\1f¾\97wúÌÿÿ\7f\87ß\90ÿLTâeÅ$\1e(!¢a\86ë\86S\84\vIc.4\8d¸°\fäÄ3l'\91éu\92ß»xå\81=\91Ù\867\9cµ¦Ó\9a\85VTRú\8dL\94z×"\8c\9eð\b\83_\84E>ö\bÏ\8bÄI\ f\9aÀh4\81ÐX\12¢ñ$\9b&\92}4Éô¸9ß»µÄö\9dw\13í?ÿ÷Èc\87W\83{YEË«¶¬ñ}\1f£?\1d\89éºãQ\r\96
+˱lp\bËû\að\92WDLÒ|rÊÍáV\\84\89\89ç\1cÈм\1dVÖêmÓ°iØ4l\1a6\rÿ\ f\86m\e\86Î{\86\86\81ºg0|Ç\90ûÖ0þ­aÚÍåV]\ 4\7fÖ\81\89ç\81¡F!ʺ[KnÛ¹\96lï¼\e{\14\18\9e`\15¬¿¥²¦?\ 2Ã)`è\8a\ fo\18\94èh@\86\16½\12l\82îǧÜ"¢êäsf\1d\Þ¼\9d\10-R¸tÉ\8c)\16êíN²¹m-¹³ónü\91ëá=Àð
+\955¿çe\8c'#1=0h±tH\85\8eù\15hÉ#EËîA¬âìÇg\1d"²F    ¸\8bV®hÅÂ\95­èIÅb½m\18î0;;×6\f\91\9f\ 2ÃËö¬ù\ fÀð7`ø2>¬ÇÒA\r:æS¢ã´\1c\9dvI±\19\87\ 4¯Q\ 3Ä¢UÌ]1\8b\84W\fBé%\rO±Xo·\99æ¶ÛL[ç\9dÄn`ø    «`\ 3\ 6ËQ/c\ 2\ 6Ã\97ñ\88\ 1Í\ 4µhÞ«F'ÜJ´â\94cs\94\14\ e\91+æ!Þ\15£DtU3(½¤\10Ë\97êí\16³µívjÃððáÕáÇYyÛ\ 1`x\17\18N\0\ 3+\1e\99\80\1e-xµè¤[\8dV\1dJ¬f\ 3ûÌ\f¶ªAÆ»¢\1eâÿC)\eº,\95È\97êífjkÛ­Tkçíä®Ã«Ñ\1f³òÔK\8e¬õ\1d/cþk$f¼\18\8f\98 LÀ\88\16<z´ìÒ¢3\94\1a«\99\95ø\92AA¬hää%¹\8c{E"\13_\96(äËõv}Ã\90\7f\9bùÑ¡Õ\91Ç\80áE{ÖvÄËX\80Á|!\1e±°3\ 13Zô\18Ѳ]\87ÎX4è¼A\85-j\95Ø\92B\81/K\80C,ç_\12)%Ëõö¯ô\96Öo2-ûo1\ f\ 1㬼ý\ 5{\96z\e\18\8e\87cÖÏâ\11[OÆ\ fv¯Ë\88\80Á\b6¦V\8dÔ\94*tAªD\97ú\95ø²@Á]æ)ÅKõ¶\9aÙÒz3³cÿ7©\1f\1eZ\8díf\15\1cÏÛ³öß{\19ë±pÌ~.\1eqte<À`7"e³\1e©êÀÖUià9\99\ 6®\rª\91\ 5!8\13®\8a\$Uüº»\9aij½\91ݱÿfú\a\87V\13»X\ 5ׯíYÇ!\ fC}\14\8e»OÅ\82\8e®¬\eì)\9b      )\e\fð´Z\ fUå:hF¢\85çÄ\1ax\9e\ fî\86T\135LÍ­»ËÙÆÖë¹íÏ\϶¿µ\9a|\88Up?Gå\\a=)÷\a¡¨çDÜãèÊ9À®3\83\ 5[Wa\80¦\87ôP¥\1fX\ 4:x\86«Efq-6\87jɺ[È5´|=¶í\99¯GÛÞº\96ng\15½\9dT\8e~\9dN\87\8e\ 4\ 3ôɤÓÑ\9d³Ú\90\82\1el]\95\99=!5±Ë\ 3\94\10Xx\ 6¸Bê\91
+¦Çª°\9e¨»ÚhC˵ÂÖ}×ò;Þ¼\96ka\15\ 3OÙF\83¯º#\81£\11\17}\9a±\ 1\83\89\82ó\1a\eT\94YØ¥A\v{\\ 4,|\134É1Áe\1c¼\13\14¼WØ\88×ÝÜXÃ\8e\95RÓϾ*m;øÏBóÅRôq\v\13}\81¦ý\7f\8aZé³\8cÉÙ\9dÑ9 \9c\82b\8fIlì¼Ø\ 6\15\ 4V¨ÈµB%Ò\ 2\970\v2\8e\98ÑqÈ\8cOÔ[u¬aûÜDãÓµé¦7æ&\9b¾(¥Ú-ÞÈk~«ïÃ\11\ 3ýiRëîN©\9cPF
+\1cývhT@Ac<
\93\80\83;BÁ?\ 3[±"Û\8a×ÝT¡a[¥ÜødµÚôúädcW(¾Çi \1d\fi}\1fEU\9eóq%Ý\9d\94»¡Ô p\b\9dP\96ç\80\1dÎávd\14µ£c\b\85\8eA\14>ÖG\11ùz\9b(6l\9d\9cjÜ;^i<\94)7²m©}\16\9d\90ÜÿÉ°Ìw>&õtÇ%4\94\14»a\86ï\82S\1c\17\9c&\9cH\ 6\19Ä\89e!\a\96e;\88\83ÌÕ[±Ô°¥0ݸ/Wi<ê\99kêQ\95\9e\96\r%ߤ\ 6C\1f\a\aüç£ý¾®X¿\17\8e\v<p\82C#I\82F\19Ì\8d2\88\ec`7\9e\89T\9f\8bLõº8u\97\9bxp{¦Òðlh¾ñ=ÝW-\7f\97Ôöà\82\89ß\rñrïë¹É\93\14\ 2Í\89ôúð\10;\88\ 4á0\14@"l?:ÜçÇ¢àëH\8f\8f\18éö\91±./§î\98ò\ 3í#3\ f>o¾Ñü¶üÆ®O\84W÷}\8e/\1d\80áê\11>{âcI_á\9c²kôsíÅ,Ëp!Ýmú,Õg9Ï@ÖO\19Øv.\89Rg\93\18u6AØÏ$Ⱥ[\ fµ5¯\87\1eéX÷=õÚ\9aëWÇ\96ͯðsò\ fé´ül\80\91w\87\13rl$&Å\13Ñ\ 1"\15\11\92Ù\10\97;\1a$øù\0&,úaqÉÇ\1e\9cðöJ'½=ʲ§[_vw\19î»MæaÓ°iøß7ìîX÷?ùÚ\9aû¹cË\96\97\ 59Å_è´â\f0t\85ãJddD\86'\87%x:,&rA>'ïçð\8a>\0îEE\93\1eh`\8aî\93NÓ½ª\8a³GW±÷è§î·õpkózøá\8eõÀ^`xöø\92å\80 §üà¿\ 6\ 5+\12WÁ±¨\ 2c"R,\13\1aÀÇ\ 2B¢èãq&<$¯LcÂi7Ò_uAÒ\19\17[=këÓVÍ}ºéûí;\ 6ú\97Ç\97¬/  ï\19\94§\ 3\8cêb$®fÇ¢*\8c Ë±\P\82åýýø¸W@\96i.wÚE\bf\9c\98\81Hçm°jÞ\b\ 6HW¹ßÖ#-Íë\91]\1dëÁ\ e\ 50¼(Ì©þ\f\f§\ 2\85HLÓ\17\1fÖ`©\90\ 2\1d\rH±¢w\10\9b¤EÄ´\8bÏ\99qrxsvB¼@áÒE\13ª¬é\10Í\8c\ 6Ñý\87ý:ynò¾ã8~\v\87¤\ 3I3\84\10¶¦mÂÒfÚ\81\846M\ 2\94\19\fI\19\fq°C\8cwIÖ£çy¤Gû¾ï»­åѾoÖbK¶lË\96%[^ \9dp(t\994u\86U}\Ú?àÉ©\a\ eïûk¾¿ßå3\8f·ÿ\1aöÕýû\8e¯»\ eµ¯X\8fb\86?<1¨{B1\r)\1eÖÀé\80\12\9aðÊ )\97\18\9eu
+¨e;\17©\8e²\185+\83»j¦K×´4Å\92\92ª^\90S5óx{\1cz¶µ\1e~q_=°a8\88\19ÞÂ\f\1f£ie\87/©é\ eÅ´\84xX\a§ýj(ïQ@Ó¨\14\9a³\8báʨ\80V³ò\18«f\ e÷\v=[rSÉPÔ¤tuE\82hÊx{\1c~¶õñ\7f\f{\8f¯»\ f¶/\8f¼ÉÍ©0\83êª/©½\1e\8aé\87â!=\94ñk¡¼[\ 5Í8åPÙ&\85\17­\12ÚªYÌü âÝV    $7¥\1cyMÄRU\84LM\19o\8fþg\bn\18\ e`\86#\98á#4­n÷%u\9f\85b\86\81DÈ@ÉøtPÁ­\81f\1d*haTI­\99åÈ\9a^ʸ¥\92°þ,\97\8ao\89\84òe>OUåqÕ\v\f-\8f"ßÝ÷8¸çøºgÿ\13\83\1a3h.ù\92\86ÎPÌÔ\97\b\99\80\8cÏ\bMºôЬ]\vU,*¸¦WPWÕ2ÚM©\94~K(ãÝ\12Èd+\\91²Ê\11¨+x{\18ÙòÄ\10Ú\8d\19^o_\1e=\8c\19N£iÝ\ 5oÒØ\11\8aYz\12!ËpÆg\86'\9dئ³b\ 6£
+ZÒ(¡e\99\ 2^\15Êik\1c\19{\8d£\90¬°dÊE\96DUÁÛ\86áaä\85}\8f\8e­{_k_¶ý\94\97Ó\9cB3\86\94åJ(6úy<d#dÜØ\9e²\19À\92I\v.h5`U¡\ 2\97ÄJ¨ÆUPW\98
+]É_f¨\95\8bt¥ª\82·\aÑ--\ f¢Ïï}\14Æ\f¾\1f¶×l?áå´mhÆtÆ\9b²]\bÆÑk1¿m(ë´@SV#8«×Sæ\95\82DC©òÕà"\v»      ¢Bj°\8a]\83Õâ*¬QTðv?ÚÚr?¶mïÃÈÎcëþ\1f´×\1coðÇõ¿G³#'=cî3þ°«#î²\råF-à¤ÑD\99Q\e\80\92L\ fÌ\vu@\99\83Y\18\1a°BÕP« \86Q\ 5
\15-àí^¬uó½øÖ½÷£/\1f[\ f|¯½æ<Ä\1f7ÿÆ\91s\9dp%\ 3'\ 3\1eôZÒf#ä,ØÆÕ\9a\81¢ÂD\9e\11\19ɳ\ÌÂÔSæ\10\1d8\ fëà2 CÊÃ:v\99¤ãáîëDËæo\12ßÙs/þÒ{롽íK®ý\82¼ãmÛxô¨Ãïû8dG»R\16\e!k\18¡L¨¬ä\82ÄB\9eâ\9bÉE¶      \98¦\e)3Tì}@ì¯\ 2\ 6Z\89d`\94\88\ 6\16îî&\9b7ÿ+õÜ\9eõä\8bï}\13}¥}Éó}áTäUK8ü®Ûî=\e\9f%\rvBFc\ 3r²Qò\84p\84\9cçX\81\ 2Ó\ 2L"\16Ê\14l\ 6\8b \19*\92ÍÔ"ÉD\9f&\9a\18¸[K76\7f\95Ù²û\9fémï~\9dÜ~y5µ\95\95\1eu\ 4\19=ç£Z×ç       µ\938¦°\ 3\19\91\rÈò0\vk\14\18§cw¡\8e\80y\b\8bb\85ód+µ@²"\ 5¢\95\8e»¥LCÓ\9d\89\96]\7f\e\7fî\9d¿g·^\9a)5Ahì\80Ý\10ø]@å½\14Q¸»ã2\94\90\948\81\14ß\ 1\8c±\1d\944ÃNÉÐì`\16\81\ 6e)68G¶Qs$\e\92#\8eâ¯\9cmh\\9clÚùåtËÛÕró\99èB3lH¿a\94ûO\ 5$Þ+a\91çFTè&Ä\ 4.J\82\83R\92L,Ä    ¦¨N(\ 5;¡1Р      \8fQ\1cÔ1²\83\96\1ev iÒ·¨4Þ°inºé¥ò|óÑÔbó¹\91Õ-dYñÇ\12~ú·FNì¢\83\1dºîaû\a\83\1c/\10aºÁ\18Ý\ 5Æi.(\ 1»à\ 4\88ÂI
+JM\ 2(-9\8c"I\12JO\11¿EÅ|Ã3ÅÙ¦íÙJÓ/\1c\7fi=«¸½½\87½ô#\18)}ȧ\16ÎÈál\87\ e\1eë1S\12\ 3#ä8ÁN\8c\92\9c\84\b\19\1d\8c\0®\810èî\ fC\9e¾\10ìé\rQ½=A\ 4\8bîÃÛD¡á\99ñRã.÷Zã;ê\87[Oñþñj;rûð\r`íýaRõ4B\9c»Ì\19\98é\14öNuK»\v}\8aëùAe×\ 4AÝ9NÒ\Ë\91µ\9fæ(º\8e,¨û$\vë¯fh\86«\19\ 4wéâ¦&ÿâ¦}º\a­G\85õ\1d'\18÷\ f\9c\ 6¿úùEâ\9d\13\9dý_\9eîí¾y\9eعr\15èXê\82¯,Þ@.Wú\18\17\17\86\98\17ÊDÖùùaö\9fæ\ 1ι9\90óÇ9*÷l  á\9d-ÑqWG_h¬£»wÔí\87\8eÔ-?kû«ö×½\8bÒ\8f\82.gF0è\1d\13Q\ 2I\11\12\8eóèÑ\18\8b\99\88ÐY©0\95\9b\ e\81üL\90\ 6I\92\\80(\e\ f\f)'ü\83Ú¼\7fÀ\94÷ô[põÔðÔðÔðÿjx¾±îÚ\85\19\ eb\86£mwu\1fôVe§Å9A\17\9a\11õ{ÇÄä@RB\vÇ\ 5H,Ê¡'ÃLæX\88ÆÎ\ 4!n.\0\b&üÃâ¼\8f(+ø\86\94\93ÞAݤ{À4å\180\17ðTwm\18^ÙQw\1c8R·¾ÕvWÿ~_UvJ\92\15vºÒâ\1eoJB
+&dp$&¢Å#|$\15b32A:3ç\879\13>
+¿à%\8b¦<$iÑCPM»\87ôÓöAcqdÐ<\89§ºk[cÝ\8d\19\9cû\8fÔGÞÄ\f¿ê«ÈÛ¤Yѧ®´¤Û\97\92\11\82      9\14\8d\89°\906\16ä"Y?\931ᣱ&=\10·è\ 6\843.\92tÖET\95ì\ 4]ÉJ0L\e      ¦)<ÕÝ\e\86\9d\98áuÌp¤í®á\97}\v\e\ 6ñ'®´ôº/%\1f\fÆ\15\94hT\ e'Ãbj&À§\8dûØHÁCg\16Ý0g\16¥\bæ\9cdé¼sX]¶\92´sF\92aFG2Má©îÞÚP÷`\ 6\143\8c\1en»c8Þ¿ ?)ËJ®¸Òò._JÑ\1f\8c«È±\88\12N\85¤pÖ/¤æ½\Ú\94\9bI\9fAi¬9\aÄ_°S¤Õ\11²ªb$kçµdý\8c\8al\9cÂSݳax\193¼öÄ`<Ö_V\9c\94å¤\97]iÅ5_JÕûovç+¸éÃ\80ãøµ\r5\1c\14R\b!¬äÚ\83BÒ¦n\12\ 2ñu\\18¹#ô.\90Ò@\103\10\133lp\8c1\96%Y²þKÛÖ´¬½÷´öÖ_Ë[\16¶lË6\98$\84Ù4é¥\v\8eö_1®}Eo}ÈÃ÷å÷ð»O(®ì\88E\14\b\1a\94"9_72èáÓò®NÆ\98\83É\9e°Ñx%+,\99ÑCò\92\1aT\15å ¶ \ 5õ#\95\84y\9e{hXûÈ`{ë\89a¿4'ùÄ\9d\967øPeK(®"ÇÂ*$\15\90Ã}Þ\1exØ-B
+N\1e½hã°J\16\8a\91.¹ªFä%9¢*J`mA\fëG*é\91ÁûâZÌýó\87\ 6Ü]ý\8eÇ\ 6i­;­8ëEUÍ¡\98\9a\14\ fkàt@       ÷{dð\88K\8c\8cÙ\85´)\v\8f9kìä~¦a÷ÌÉ\99òé\1e\86ª(¢k\vB\9a\92þgx¥lØ\82»kØN(Ê?\90åd'Üiåi/ªi
+Å´\84xX\v¦ýjx W\ 1\8f:epÑÚC\9b1u3¯éD¼\er~Ï\9c¸K6-ä('ø,Íe\1eS\97¯$̻챡·l°o~lPì\95åäÇÜ\19u\9d\17Õ\9d\ fÅôøxXOÍøuð`¯\1a.8\94ð¤YN\9bÕJ\18×dbö\17=\12ñ5\81P:Ãã)'»º4c\9d\1c\92\1e\19|kË\86\97\1f\e\8cÛ\bEåû²\9câ\88+£ýØ\8b\1aê\831SK<l¢¤}FdÐ¥\83\v\165<©S 3r\19rETvp%¼9®T:ËéVL²\ 5ê1\16O;ZIÿ5xÊ\ 6Ç\9b¸;Æ­\84¢ú=iN\85seôÇ<¨ùT0nk\8a\85íÄ´Ç\f\ fÚtPÁ \86\8aJ%4%V@3\\19í
+KƾÂ\94wÏ0å\8a)F\8fz\9c\16*    ó-\9d\8fù×\94\r\ek0ç&Ü\1dÓÛÄ¢ö]i\9fö\ 3gÖ|°7å8áOô\9e\8dúì\84\8cÓ\ 4\ f\99ôШF\v\8eKÕÀ\84@\ 5Nq\14ð4]Á\98\81\15ÜiD%\9dD\14ªqXª-TÒcÃêµ\98wCÙð\ 6î\8eùwÄ        ã\ eI¿q·#çÜëÎ\ 4\ ex\83½õq\97\8d\98µ\9a¡A\9d\ 1Ì+ô@¡[\v\8cq5@\91©\86&\11\15}\12T±'©já\ 4 U\8c\ 3jM¡\920ÿ\8f«°Àª5\98o}\ræz\rwÇò\eÒ¤õ×â\ 1Û\ e[\7fð\1d{4p àv\9fKXí¤¬Ñ\ 2\ e¨LÀ°Ä@Í\vôÔQ\8e\ e¸L×Bc\90\ 6\19§j\98ã\14M×8Y+\1e#ëU\85\ 2ÏVaÁ\95k0ÿº\1a¬·\1awÛVC*yª\85C\81×Mhômg¯ïpÈêjL\1aì¤\8cÖ
+öÉ,Ô\ 1\91\89:Ä5\ 2#,\ 3\90§\19 QP\8f\8c\19å?v\81¤ç\8f\12\r=ùJÂ\82Kª°Ð\8a5Xð§5\98÷UÜ\9fz\7f\85¿\92x©³?õ\13£7´Ócñ\1e\8fèÝM   \8d\83\94\81¬ØJíã[\80~\8e\19\18`\98ÁAÄ\ 4\r\81&d¸ÃH\1f&\eY#$c×0Á$¬¨\aáÅU\ f"ËWÿ;üÒ[\98ÿeÜ7Ñu\17æÆ\16CÁä+fsp·Oë­\8d\17ârW;*q\0\1dÈtÙ\80\ 6æèV¨\ f¶Âý \ 5éï°Ð\aÈ\16æ\0ÉÂ\19 X¸\15õ\97è¢\1fÞ\8b-]u?¶zË\83ÐzÜÍ\91eu}¥\854[êu\83*°/ óÖ\85%½Í1±»=Ñí\ 2\92<'\88r\1c`\8aé\80Ò4;\94\81ìp\ 6°#Yª\8d\9e¥Ø\18Ùv\e;G´uVÔ\bþ¼¿¡KVþ\1d}~ó\9fû\96ï\19\9e]tÒ;½\ 4Q÷oVöÄö9EþÓA\81÷b\84ï!Åø½@¼Ó\r&X.(I/\87¸`\14r"(डT'=Eq2Rd\a+Erp*ª\84VÍ»\9e[øÂ×}Ïn*L/|'t{q\9dþê\v\1dÝ\85-\82®¾½*\ eZkbÇ>µ³"mnf\88â¥\ 5:üp\0\b\80~0HõA¡\ e\1f\^\910ÙK\v\93¼ô\bÑÃ\8c\10<¬h%\8d§«\9e\99\18\°|l|á\86èç\8bÞ5ýõ¹Zñ\8dõ\97س5\102¾»\13Ê\1f\13\ 1CõRj\7f³²=wIM̶iñ\19¢¾5M6´¤(Æ\8b(ÕÔ\8c\ 2æ\vIÈÒ\94\84-\9f&hÖÆ8ÃVIùlÕ÷G\87\17,M\94\16üÂú\8f%;%÷_<Äùúµ3ÐÍm\17É\9fï!\91®\1c\ 5ÛJ§è-Å\ 6Î\85±&nc¡\85\7f~\14/lÈ\13Eõ#íâ³Ã\14ñ\99ajÏé!Prj\b\96Ö\rÒd\9f\f0+j oþ÷ÐËUËì7\16¼*Ã\96oíÂ6î\81ï×\1c¢|»ó$á«?6´Ü:ÒÜx½\16_ÿÙ\19Òé¹ó\94º«ÍÀÉÙK`íL\e|b\9a\84\1c\9f¦Ð>*QéÇJ ýØ\14Ì82Eg\1e\99`±*)=Põ\ 3×ô3Ë\15Ø\8f6r±µ[hØ/·w`¿}\8fð¯ßïoùç¾£ç¾=\[÷ÍñÓ\1f\7fuªá£»ç\1a\8fÞnj:|«¥ùÐͶ\8b\ao\90Zp7È\97\ e|ImýðK\10ÿáu\ 4¿ÿ:£mß\17lB%aæ5ó0ó\86\15\98as5¦Þ±ë¾ì\ fµwDGI³¼\ 6^\9e{I\97åvxÒ\\9a/ÕÅ\ e\9d¡\ 4\9d\e\89Ãüh\f\10Æc\1dâD\94,IFIòd\84¨B#mZ4\827¦"­¶T Õ\81>mß\19¾3üÿ\19V?1¼Y\8di\1e\1aÞ¯½-:B\9aá×óóÜ\16}\86Kñ¤y\88/Åe\ 5\92\1cN(Áè\8aÄ\11^,\ 6
+ãÑ\8eîd\84,A#$9Z6¤ÂmÚt\18oJ\87Zmio«=õ´a\96²Áò³\15\98qS5¦Ý¾ë\9e|OííîÃíÓ\82S\82\ 5c\86Oò¤\ 5\90\ f\150\83É.v8Îê\8cÆhÜx\14â'#TQ*LéI\87H²L\88¨Ê\86ÚtÙ Þ\9cõâ­Y\17Þ\96~Ú0˪²aý
+Ìôаm×=Åî\93·Ä\87ÈÓÂ\93Â!A£)# xÒBª\1f\151B       \1e3\12ã°ãQFg2\ 2óR!@\98        RÄÙ`»,\17 ªú\ 2\ 4}¿\17oîw¶YrÖ6[æiì+çaÖuÏc¦7ª1ÝÖ'\86\83\94R÷ á\90ð\9c9#lõ¤D\14\7f²\9b\16ú\ fãõ\1eÕä}Çq¼N¤Ýܱó\82­ëqZÛÓ\9dNÅU»z\9cuu«k«@ÕzW¼¡ÈEAAP ÷äI\9e\ 5Bx $\90\84ÜóäFî$@BÈ\85\84\84p\11AEV×\16Ôº9\8f;¢mý-ʶ¿óÇûÿ×ù\9cï?ß\1e\ 1««»\8eíõ°¹½\9dôú\80\8b*\b9ÉMý\ e\828bÇÉ¢v¬:jÂh"(V\eVãÐ@ªýß ÝøÂ\90õTòeÁ´ð\bi¢ù4\12EJt\ 1äªÕßLpø\84°»\aavwñk}n\ e§ÏÅä\85\9c4~¿\9dÜ\14µ\11Ä1+¾=nÆ*ã(N\1dUã´ý
+<\1a\97\ 6ý;s\ 6åö¬YINÁ´è\10iBx\ 2\896\15£\81æ
+«_\88søZ¨îîfF\8fGÀìíäÕ\ 6\9cµÜ°\1d®\8fZ)HÜB\14':\bò!\14¯\18TãU\ 3r\82¦_JD\83©\ 6ôoÎ\19t\1f$\r\9fÌ\19Ä\aH\13¢\$Ò\\88\ 6\84åV¿¨Æé\15QÜÝ"F\8f\eaø]|VÈÁaG­\f\ 3j\1c2\93Ä#(Q6¢"*\12r¢*&!i"­$]0Õæ\f\fª¤A\9a]0ݺ\8f4!>\82DZòÑ\80è¢Õ/®rz[I\9e®Vº×-¤÷9\ 5\8c~\e\8f\15ë`q\87L4Á5\ 3Ôz]E\96\8e\93åCmdULDÑD\84\14](Õ\80þ\8d\ 5ÀðÂðû¤áOICVátÛ^ÒDÛA$"ÊC\ 3â\vV\7f[¥Ó+Á{º$°¯SL\ f:\9aèQ\v\9f1hâ°Gõ\8c\86     5M|CF\95^k¥Ê\87Z¨Êx3U\13A¨ºPª\ 1Ã\ei/\rè\7f\r²¬Â\19énÒ\84d\1f\12i=\89\ 6Û\8a¬~i¹Ó+Ãzºd\90Ï%\81C6\11\1cë@èÃ\ 6>k\ËáOÉX¢["\86\99Þ>\8cÐ\95q\ 1]\13i ëB©6gx;iØ°\ 1¨·%\r»
+gd9Ä   Ù\1e$*ÉM\1eM¾Å//ux\15U\1e\8f\82Üë\94Ãa«\ 4\8e\9bÄôkºfæ¤\ 2á\7f×R×2ÙÈ\95\o`·\8fÔ×*\aëXê(\8f©\v§\1a0,O\ 3ƤAÿÂðqÖ\13ÙÎÂ\19ù.â\84<§1*;¬\vÊO[úTÅ\ e¯¦ÂãÑà{\9dj8lQÂ\83¨\f¾.\173&\85Bö×\ 2aËí:AÛ8\97/\eáð\14       \ eW=ÀæhûS\r\18ÿgÈÜ\04ICû΢\19å\17\84\eª/\ 4\ 3\8a\90:·£\ f=k÷\19JÝ]Æ*¯\1d\85ú\r*8¡l§]\13Kh\13ü¤\83-nHÖ6Îj\96\8e²\1aå   &_\15cÖiúS\r\18\80iõr`xaØ\9aõDþyÑ]õ\ eüMݧ\r1M¶&¬ßo
+Zr-½\8es.\87éj¯)ùkjT´A©\1c\1aAdÐ\18G\ 2OÐÛ¸7`©p\1c\96HGá\16ù\10ܤ\8cÃ\ 2M$Õ\80é¥!\ 3\18Öo\0Ú?fÍ*w\14ÞÓmÇÝ2~\?hü\8b2bÛ©\ fz¾2»l\ 5n\93©Ê¯Kî ×@1\91\92\92à'\1d¬ä\1eTYí\18YÖ0F\91\8bG)2ù\10¥U\19\87\84êhª\ 1Ó²4`^\95\ 1\8cë2\81nKÖ¬f{Á}ãVÌmû&îpç\87Ò\81Þ-Zwç\ 1\9bÉZÜ¥5UûUz(Ô¦\85¢MjJ\8c§\82\12\f\ 5m\18\923G\88\bA\81\f\13\94\92\ 4\8c\13%êhª\ 1óÒ4Ðñ\9b\f`Z\9b ÐÍÙÏЭù\ fl\1fVÝéy\9f1>°º©»g\9bÁä<âÔX.t+L5½2\ 3\14hA)á\ 6-\14áh \ 1º\9a\16§¨\18\83D\15{\10¯â\ fbÕÂ8V#\8baUêhª\81\8e%iÀ²2\ 3\98ßÏ\ 4ú\8f²\7f4ÿ!ï_]¿+ÿ.¶\8a\18\1ex»Åìùk\87ÚqÂÕn¹Ø-1c|­FÈ\8f\18 `\1d
+\85juÔ~X\vG(ZF\94¨­\1dÀix\ 3X­ Z£\15Eªuò\94\ 3\96ÅiÀúÖ2`y/\13\187eÿäZ{ü~dUÑðÔb\82kà·"UW¶YâÈs\89­e]-\1dØ\1e¡\19ò5\98 ?×H\r0\r´ M\ f\87((#DDYa<Ê        cÑú0\ 6EÂÕúÖPª\ 1Û¯æ\ 3û\8aeÀöîz`]·óQ`Õþ±É%y¾©¥$4\96)lóîÖ \9dù\ eÄVîn´b»\ 4\1d\94\9e:3ÕÇ6Óz\19&ØO3Òý\14\8fddõ\11\fì\0ÎÀ\v`\f\r\81\1acs_ª\ 1Ç¢ùÀ¹|)p¬^ÿ´gÕ\9foM,ÞÑw\7fÉ9óÔ\9b$Ib\93\0    îiç{ÏèëÜe\96:'Æɳ\93Ý\1c\8be¡õÐ;`/­\83á\85ÌL\1fÙÌò\11Íl\1fÞÌíÅ\9aë{1f\81\1ew.\9cÿ\93\92çî·Ö}\9bx}cøî뻬\8f2
+dwÖà\1aÇ6³¹ñÝMµáÓ\12f_©\92é«ÒÂ=8=ÔM4\91<d3Á\rYpnª\15Ó     Ûj\\f\8be¿êbÛ¯8¹\8e
+'?ånu§ÿlÖ»hñ?Â\8bÖDo.Ì´Ï.ÎVü{å\19df]%{j\e   \1eßâ\8c\9cª'\ f^@\b±Ë-ØèUqu\7f\8däj\18\f\11Ú/\aÉòò\0¤¸\14 ).öÑ\95¥}LU\89\9f­:ïç©Síº7}ÞÍàk\8b¢#¿ÈpÎür£\12dìjzö^.ûáæ"êÝÏ*\bßìÃ`§N\91ªn\15R+n\940.\8d\97±JÇ*Ù\17®Uq\8bG1¼¢\11|]Á\b±þÜ0\85\9f?Lm8;\ 47\9cI0\ 5y     Ncª\rõ¦Ï\8bE\7f¾ óÆ«+ÔÏ\17\fV~Ê\ 1\eöR\9f}\92\8b\7f\9cs¶úááâËß\9f¼XrïÌå¢é¢+\ 5ß\96\7fS\8e9ó÷+¸¼;ÕøS_c      'ÿ\86'\9e\98"\91\8eOQȹ·i\94c\93\fèè$\9b\9ajѾôWÜCé¯j¦Ó\7f-\ 4K×rÀ»[¨à£\1dx°#§\1aì=Pöácç\9f\1c?\95ÿ8ïlÞ£Â\82\93\ fK\8a\8fÿ³ì±\a\95%G\1fT]<ò=æÒáûø²C÷Hå\aïAå\aîÂ\97÷ßeVì\9báT¦\9a§\7fÁ+º\9bó^\13\82\85˹`Å;T°v=\1elÙ\\ 5>Û~  |ùy\11Ø\9f\93\a\8e~uâùé\83G\7f<wäð\ fç\8f\1dxzéøþÙ\8aÿ°SgÏMÜ\a\0Ç'ô9ÀtÚÒÉL&)A@
+mBS )`B\80à\ 2\ 1\8cmh!1·Á\84\16Rc£Ó\92eY\92uß·dIÖ¹Òz%!ë°v¥]iu \19\ 3Æöpd0!L\8f\98\96Ì\90Ä$Í̯Û\9a>ð¦? \ fß÷ÏÓ·mÿ\1cýHÓ\1cëè¾oz\8eíýº÷øÞ¯\ 5'ö|%:ùÁWÒS»\9f¨Úë\r8\7fþ#à^½\1887Ð\80í÷\e\81ñ`óSÍÉÓ\8f\18\ f\94]\ 3·\15\er\91{L&\87Ê\12u\94\14ë\12\85~C*ßgNç{­i\82ë\18%8®\fÁòdp¦?\83\14§\ f£ø¥x\ 6¥××\ f\86\1f\fÏ\19\\94ah\15\1deh¤\f\a\9a\9fjO\9cy¤é`~¦î\94ÜR²M×\15\ 2OU!\83KrU\9c\94h\93\ 5¡>\95\17\98ÒD¯u\94àÚ38Ç\89â,\ fJ\190\9c\11Æpz\ 4Ãè\97ÑT\9dÍ\e\18¸Þ¡\ 1{ã&`jm\99Ó\1dë\98Õµ³îkÎ˦Õt˸\8aï«(\a"¤R\99(HÕɼX\97&\ 4ÆQ\9coAq®\1dËq\9cÙ\1cË\93Í2\ 3¹,\1dÎaôh6E\8f\8cËX=\ 17eð¼N\19Þ¦\f;6\ 13e0´uÌêO°îëÎɧ4]¶«jn ¬\16ÅHµ"Q\90«RÄ\80v\14\17\1aÐ\1cß\8c帶l\96ãÌa,/\8e\1c£Gð\14#\82Ç\19Ñ\1cÂ\8c\ 4\86\9e\19Ü\94Áñ>ehi\9d3~Ø1k<Ê\9e1tȧ´\7f±\8fiØPQÓ\1f'5²D^©L\13RM\ 6\17é±l\9f)\87ñl8Æq\12\9bG\19¡|\9a\81äã\f\84\880#x\98\15ËÖ\13eX\0¼+)Ãz\1a\18¤\f\96æÖ9ó¡\8eYs\e{ÆxJ1©?o¯é\18¡¢\96\1f'u\92d^­Hã2\15\9a\13\98À\88£<k>Ãq\162,\1f\84\8bqæ0\890\91|\98\15Á\ 3ìh®\9e\80ç\99ah\1deØ>o°\1cì\98µ\1e\98\8f+&\8d\1f;júîpQÇ\8b\17ôâ$¡\95\8fâ
+%\96\1dÐàh¿>\9féµ\90i\8e³\94f\ 5Êqf¨\8c°àb\885\ð³\11ÂÃ\89æêé\7f\ 6ß\8ay\83sÛ&`Ý\7f`ÎÖÚ1kû\ 3{ÆÚ¦\984\9fvT\8d\9dá¢\81\1d/\18û\93\84A\9aÉ©åYLª"2B\1d\99î5\97\93=Î+     v°:Ì\82*\10;\òq`r¨\a!\9c=Ñ\=\ 1ï\7f\rË\17\ 1ÏÚy\83­éÀ\9c£¹cÖÑÊ\9aq\1c\92OZO:ªæóá¢\89\11/\98ù)Â,Édu²\1cªP\14ÒbM9É7ÕFz\W\11¶ÿj\90\13¬z{Be7\17&\a¹HÞÎ\8bæê        ø(\83ÿÿ\86­\rÀ¾¯un°é̬³\99ußyP>é8â¨Z?\ e\17­]ñ\82µ'\85[E(f\94à£jY1)QUã\ 2ãµ\18oh"Àõ^\eâ\ 5jN^¨lï\85\8bÖ^$oæGsõ4o -\ 2ÞßÒ\80\8b28ö´>uí9óȽ\8fy\7fh¿lÊuØ^s´\87KöOâ\ 5\a3\85;\ 4(j\15çÓzIyD.\1f\8f\b\r\93A¾sÚÅ÷\·ó\ 35K\1fT1÷ÁE£\0É\e\ 4\11¼\9e\9e7¼×\0\ 6w·>uï>ýÈû\ 1ã3ß\1eé\94ç\80mÌu\f*¹Î].¸»\93¸\9b\87¡NQ!i\11WcZÉDXª»ë\14\rÞ²\b=7\8cBÿ\98^\bUt¢pQ+\1a.hD\11¼\9e\80\9f2\ 4\96-\ 2¾·hÀM\19\9c;[¾õìlÿ§\7f'ýAp\97d:Ðd¹ê;\1c,{OÅHÿ\85\ 4îg¢¨¯¯\90p\8bj\88]<í5êÿjT:îhåC\13j©ÿªJ
+]QIÂ%¥d¸@­\95¨§ç\r[\1a\80»±å[ß\8eö\7fA;.}\ eï\10ß\86w\99®\85[|\95p\eRBÎ\ÎG;ÓÙ\18\a\8f\9a×-\9cÒÙ¤÷\94\16û\1d¹Þ}S¦ñ\8dKUÁªT\11*Kå0)\93!D=\81\0e\bR\ 6ÿoh`\882xÞoþ.¸íäcxk×Ãè{ýwãÛt\13#;]µds¨\9a=\ 2cÉ?§b\11v>\b       k6¯`Bî\14Ý\12:\8d·E\ e÷M\91É{M¤\ fÔDZ¨"VÃE±
+É×Ó¼áµg\86w\e\80oëþ\7f\87\9cø2º¹óoÉMü{Ù\rÊir³e¬¸Ó\87¢\1fÅ¢#ç3P\84S\18
+       ®\18ü}ã\12\8fðfï\90jª×;8Áwy¯ñm\81±>3tE`\b\97úuÃ\85z\ 2\0Q\86À\1a\1aðln\0\81w\9b¾G6\1e{\92xçÂ\17¹õ\9cÏ«kE\937Öë³ù]ÁHúèH ~\ 1\e\8aôäí° ¬\81\ 45±_8Îóɯsü¦ë\9c\80g¼Ç\13¨q\a¡+<k¨Ôk\82Éz\ 2Ð\12Ê°\942¼I\ 3Þ\86\ 6\10Ú°\17Ä×\7fô\röÖÙÙê\9a®Oï¼Î'Çß6Ç\88½!\7fêDÒ\15ïD\1dQ.aB\ 4¤2,¨\88 Q\95\17\94\8d±\83Ú1&d«1B¾*Ó\ fUØîP\99ã\80Éz\ 2ÐÏ\16\80Ð/\16\82à¯iÀ¿±\ 1DÖíþ~ôÍ?>®¬>~ïö\8a?Õ>].L\8c\ 6\88\96Ð`º=a\1d¹\88\9a\9c>"ÈË\91~R\b\8bJ½ai\85\13VUXaS\85\ 1\ f\96/Áþò%(\bxa²\9e@è§\v@øÕ\85 ô«e ´n\ 3H¼Ñø\84\Ùt\7f\81±\87K?ÉÜY)\86ƶX\a\v\a\83f´#fHv§uq\1e¦\8eõãÒ¨\90\10\85^DJö\f+\8b¬a]\91\89XH:â$»\10?y\11\1e\13\bÿd\ 1\80_Y\b«\96\81È\eë¿ËѶ<¼ñêöñ\87/\1fÆþ±ô"|gõÀàøv³±tÈ£ÅÏÂêL÷eU\8a\9b\94'\ 4\99\81¸\10ë\8f\89sü¨\94àF\15\ 4;ªÉ3£\ 6\82\11µ\12ô\98\v¿\18õ\13õ\ 4\86\7fü\ 2@^~\11\f¯\\ 6RËÖ|Q{iíõ\aK¶æ¾|¹\rù;­Ëyw\8dÈp£Q§ª~è\90\17Ïz¥D74\90å ý(/Æ\1fí\8b÷¤\85        vj ÉHÊR\97\92ÊtwB;Ú\950\8e^LØG;\93\9et=\81Èâ\17@ô¥\17A\94öÚ\13\8aÉ\99Å«\88ÇK\1aÿÃ~\9d\ 65\9d\9f\ 1\1cÇ\1d­\1dl;ëÎζëÐ\99\9d\8eíÎtwfeíìvu¦V@\ 5D@\ e\ 19\85°\"\ 4\ 2¹\bIH"$!    ¹þä"    I\b\84\10\12r\91\e\b\91\e\ 4TÄ£ Ò]Ô­.¨ã®\80þúÇ:}\e^öE_|ß\7f^<ó<ó\98~ú$¯ýñgÕÂåo\1aX7ãXMsÙÂËS¥Rê8JI\1aÁj\b\ 1\82\16ç'éÐC\94î\9aÁË=Õ\ 3\f\ 3r\80Õ[ák1^ò \8c\17}bc\99O¹£\80å7»\80õ£_my~{`aaßGÃOÞ?dÞú8Võê\8f\93Ã\97\9a¿;\8e£-%PÈ·r\18Ä\e¥\1cÜ|%¿öjMkõ\fV\8c\9c"H+&Imå\13TyÙx£¢d\9c¡,\1e\17\8dòT\85£\90
+1*Sï¤\17öÐ]ÀñÁ¾\eS¡û\ 2wB?6oí?¬\ 6¿\8f\86¶>Oo~~´\90ú¯\98\8aúÕÔZÜJ^]Ír\11\19ù\8frjù\9dªÆÒ[µôâE\1cóÛ\9b\ 4\16b\81Ì.¸Aå\¸ÞÔ\92w\8dÉͽÆáåÌ\vxYóbþNºëÞ\1d²8¼ww`î\97{-\ fCÃÔàÃp\b\1c\8cl\ 6\7fI¤nF\9c'¼LÈǬ\9f/F>Í-/û\ 1\81,zT\82B¬^ªÍÿ¾\1a\93÷\1d\1a\9bûO\1c>{¥¾.ë\ 1\99\90ù\80V\7fþ~\13\1e\93\94\85tnYHÞI×½{B\ 2c{C¬·ö\84ªßü:\f\ 2\a>g\82Ï\8e\91¨:\10\ 6$%_z\9d\96\91\9dUðS~nÞË¢üì\17e\88Ìç\15\85\19Ϫ\8bÒÖÑÅçÖq%©k\84Ò\94\1fIeÉ?RË\92\9e6^L|Ê,OxÒri'\8d\fî  ±ÎîÞ¥^y/\14\ 2ïÿ\8e   >9Ø\0\ e}\81\ 3Ǿ®\ 2Ñ\7f+\ 5ñ\91\b\90\12\9d\ 32â2AnB:@$¥\82\92\94dP\9e\9aô\ 6\99\96ø\1a\95\9e°\85É\88ßÄ\9f?³IÌ\8cÛ d\9d~u9;æ\153'úç\96Ü\9dd\e}/Ds;d\17\ 4\97\ 1>ÜO\ 6\a\ f`Áá?T\82£\7f.\ 6\11á\17@ìWYàìÑ4\90v,\19dG$\82ü¨xPt2\ e\\8c\8e\ 5\9511\0\15\e\rЧO\ 2|Ü  @<\13\ 5\91 1>\ 20\13\8e\ 3nâN\ 2\x?\b\a\84\0ÿô\17\80\93\11    \9a\11)\9bÍe\ 5Ï\18UÈÇMu\84\95ËÔÆ¥\ 6\ 6ç6\91\ 3-\10\ 4Òk8\91b\ e#SÍ¢\15\9a\99\1a\95v\1a¥í\9a®Òé¦\90\86î©J³~²Ò®\9f¬ðèÇ*\aõ\ 1ä`w°þoø\1f2ð`\ 3ôi(\80`\83àô!Ð\ 2\e8\ 5)\eì\12Ä:«²ê\11\13Wÿ\80Þ@¿K£ó\16\eØâëD¾|\8eЪº\8a\97j§±ò®)´ª{²¶£g\ 2¥3\8cW\ezÇ«ÌÆqd¿q\fé1ú«½½>\94×\18\87\r­°A\ 4\e\84°\81\9b\11\ 5¸y©\e-ß"Ö8åÕ\ fYhÒýf\12óNS£à\ 6\8d%\9boà¶_%BÚ)\82X7\89\19Ƕ÷\8e¡;L£µº¾\91\1a\83y\ 4\8cT;-þ\1a\97Å\ 3ç¨\r\1e\10ìß\ 5D°A\f\e ØÀ\83\r¼\9cÔ\r\1e¢p\8d[\8aZåT\93ï±       Í·\984èz\13S>KkÑL7\bt\13D\91a\8c 3\8dâ\95\84Y¯`ºl\81Ú^{ Æj\1fªí·{Ðýö~8\v&x@\b\eÄï\f­±\87\0?=
+\b²R7\ 4\17
+×øE¨UneÃ2\aÇ^dQDóL\86\91Ó9Iå÷\8c\91[M#D©%@PØ\86ñ\9a~?Vçô£\8dN\7f­ÍéÁØ\1d\ e8\vÆÞoÂö\a\r@°A\ 2\e$o\rá@\90\1a\ 5 \8cÔ\r(§pM\88@­ò/6,qkÙ\8b\1c¢x\8eÕ¤\9af°uã\8d¼Þ\11*d     \90%v\7f½ÂéÇk\CØn×\10ºÏåÅØ\ý\18\9bÓ\82µ9\8dX»£\a\ f\16h\85\rÒ?\85\ 2)l\10Å\84\ 3(9
+\88ÒR7D\99\85\17P«PqÃ\12¿\8a³ÀÅKf9Tõ$«Y?Êàö\ 5.\víÃ\14±c\88(w\rá5îA¬Þ3\80¶x\1c\18\8bÛ\8cµº{±6\97\1egsváí\8e`ý× ;ò\1f\83èl\14\90¤¤lHÓ\11k\92lÔª¨ a    *ç,ðÑ\92Y.I3Á¡÷\8c°8\96aº ßO\15¹\ 6\89\0¾Ã7\80íõ91f\9f\19\1ap\16\8f\ eouiñ6§¦Îî\b\16\10Á\ 6Ù¶á\9b\8e\ e\aâ\84( KJÙlK-Xo;_½*Í%/\89K8\vP\95ä*¿®c\82K3\iaY\87\99\10\rr\ f\90Ú|^|Ç\90\ek\1c2ãL\83=ø>_\17Þâí¨³ºU\ 4\9bSI°;\82\ 5Ä°¡\r6´m\eN\85\ 3é\99H OHÞT$\15¬+ÏU=Td\92\96Û\10ì\9b\92rÉl+Z3! \e®ð\186?»Å9Ð(ôzI²!7¾3`Á\19\ 2z¼Ñ¯­ë\eP\13Ì^e½Õ-'Ú\9c2¢Ý\11¬·\ 6ù¶á¯a@\ 2\ed§#\80òLÒ\96*1ÿ\99:\19ùH\9dF¼×\9eÓ¼(/\12ÍJ\91ê  \11ÞpEH³úy,\97\8fÁ\ep\91¥Wúëtãú:ý¨\86Ð;¬¬7\r\11Í^)Éâ\16\93m.\11Ùî\b\16\90¼3È·\r'¿\ 4ò\98\b \8a=ûZs&ï¹6±âqg
+á¾6\9dq[\93\ fÍ·\97µO¶ÕèG$$\8b_ÄpyØ\1c¿\9d"\9eì!hgTÄîñ6\92! !\9b\ 6E\rf_+Åâ\11Rl.\ 1Åî\bÖ[\83bÛðu\18\90Â\ 6Å©ã@\13\9dø¦36÷\85.®ü\a}"~¥'¥ñ®>\8b\7f]WØ6£­è\1cSãLÃ
+ªÃ\r1\ 3¦fñ\8c\92¢\99\13Su\13\10<*\ 2\9aq\88Oëóñh\16\ f\97fuqi6g°\80ô\9dA±m8ñ%h?ñw =\99\0ºOe¿4Ä\94=1Åa¾·$P\96­©ì[¶ÜÖk¶\12å\8c­¶sH_g7)h\81v!oFÀVÏ·0»&9\8c\9e\116ÃègÓû\ 6Øt³\97Ýdu³\9blÎ`½5(·\r_\85\ 1YT8PG\1e\ 3]\91ñÀ\10\95ùsß\89â5{4ê\91;®~eðlãòH&{a¬L0âEjm\16\8c­£\8b<,P°¦é2Õ|£ sª\89«\1f¥sz\87élÓ \9deö1\9a-\1e\ 6Óê
+\16\90Á?Nû¿Ù­ó·¤\13<\80ãø´ÛèöT3ÍîÎT¶ÏTNóÔÔØ\94\8ef\9aWZi[¢yå\99¡r\89\8a((\b¨x¡\90à\89\9a ¨¥!x$\9a\99æ\9def5­\955M§\9fýî>ósü\ 3ûÃû÷×\8foÄP\89\18Ê\9d~\ 6\99Ã\11¨w8     J\aÿ÷W\1d1¯4G£\97u'¨\8bC\9eôÙñ0Æà\10VЮ#ÕÔ«\13\9a%JFWV]Ö\0ãRÙ-fEí`º¸¾\8f%lèa\17*º2
+\94\1d\9c¼&\r7·Ym((C\fUÿ5X\9aB¥ý~¸dg\ar[7h±õ~¯±\v}Ñë\14ùhÄ\8d87w*A?åËÕ\ e\87\89ä:\92\9e¤\126³4\9c\ 6^or]ÑÍÄúÚþäªú¾ÔÒ\86\1e¦XÑ\9d&jìL/RiY\82¦vCAù\1f\ 6©\85)TÙþ\ 4u6\87Ae}ì£Ú
+½¢³ñ{4â\188=ç\84Ó?p¥kï¢ùòÁ\90\12éõ¨ÚbÄPÐÂVg(3»éò\ 2]¢¼BGi¸¬K\94É{h\95\8anzicgªX©e\88T\1aCýÏPý½     T!\ 6Ù¡} ·´\86Ö\83N¯¯\1ft[\1a¶>59wèìÀ#;\92\89)¿ã\91/\1d\b)+F\f\ 5\9a$ev+«\95ÕÌÓ¤(ó»\92\94\92.\8a\15«PtSj\15]ÔêÆΤ
+eGr©Jc(¨D\f5f&P}À\14j-~\84&s\8bw\1dûl\9fèÍ\1d&çÌÝn.Y\84h\9eÚÄ)æ\1cYÒQtÁ\85\81вü\1eÒE~\a­\81£Nkb´r[iWrÔÔ\16a;¥¥¢=¶¹VCjRic.«´ñ\97\84j\95ÆP E\f²\9d&Pó³)4üô\ 3´í6_¾±ëàÔÌ.«\9bK{OkV\ e\9cW<>D\91Î:±Ew¼òóôa\92¬>r\15ç:­\96ÙÁlHÖd(\13ÔÙÍqm\82\96\98\15r[uKT[ý\15|ks+Au¥\95tÙpP\8d\18.í0\ 1\99ùVhúaÇëîí»f'¶\99\r,í´Õ¬ìñR¼:\10!]:\9c \9cseå\8cûäp\871"ö@L)ãF¢\94¦K\95%t³þ\15Û\95Y\1fÝ\91×@ì\10É   Ú29¾ã¢\1cÛ!\97\87kZ\eÃÛÔ\ 6\ 3\19b¨ýÎ\18.ïúæ£zÛ\96\85\91¯7\ f.nÞ­YÙá¨ø´Ç[úÊ"BôÄ>\9e\7fß\9d\911íÏc\8eEäÑG¢\8b¨C     â¸\ 1z)¹?­"ê\ 6W\8aïãWc{\ 55\11\f£«Dª\95\9dïUÕ\84ö¨/\1a
+j¿DAÝ?\8c¡iÛWÏú7l\1cZØð7íÊ·û\14«;\9c¥°Ï[ôú\10\86ÿÌ%\9a½\88NJ\9d\ fd&ÍDrâ'IYäñø\âhR\ 1î6£0r\98-ÄÜʺ\106\94W\1cª\17\8aCô¥\92`}UI\90¾¾$Pß,1\14ÔoDAÃ\96/V:×\e\ f\8dþe­öÅ\86-\8aÕÍû¥`æ,\84\ 3\9eÙoí\83Y/ݱ)Ï|ÈÔÇ!      1\ fÃiÄûÄTܽش\88ÙDöù\99\14ιét^È\1473h\92\9f\1d0!àûß-Îñ\e/Ïñ\1d\97åú\8c]6\18(Ö£àê\865ú~c#í\84\89\89üÓ\97¦R05\17Ânûl°:\99¾êâC\7fç\11Lyí\8f\fÁa\971Q\98_ñäsOÉq!\8f)\94 %\1a\11\7f\91\9dä÷03Ùg!\97îý 0åÌ\83âTÏûå©èû2\86¡^6\e£\86:×¢4C_\18Éç¿XW \9bL\8bà»\1f³ÀÜ:\rì\9cipÂ=\ e<ÑÄU_ßð\ fA\ 1çÞ\9d\ f\ eþ\1d\e\1að[T\98ßëX\8cÏ+j\84÷Jr¤×K&\16ý\82\8dóx\91\89?ý<\97pj¹\90xrY\1cåþï
+\92¡FÚÖ Úu\7fF5\8c¯1ªx»n]!üýÛL03c\82\85y\128Z\91áø\11,\9cv\ e\ 3ïcApÖÝ\1fBÿé\ 3á\1e^\80\81äu\1a\9c\82\ 4ï\93«É>î\9f\18¾'>±ý\8e\7fäù\1fû\90sÖõCa\80Ëûâ@Ci4kP\rz#Tù=\94\91\0Ö\esaó¦Tؽ\95\ 2\96;\89\a\ 3ÎæÁàfá\a\1eVgÀÇ\ 6\r\ 1¶§ ô\88;`\1cÜ\0ëx\1c\88N®@vv\81ø£G!ÑÅ    R\\1d\98\ 3p\8eÛ\ 3ÿ\84\1d\14¸\19J®C¡Êï¢Py¿¡\8c8°ñOtغ.\ 6̾\8a\84½ß\84\80¥©?Øm?\ 3.»N\83ûî\93à¹÷8ø\9a»BÐþ£pî\80\13D\1ct\0¼¥=\90\838+[ Z\1f\ 6ú!\eH³±\ 6\8e\8d\15ð\ fÿ\ 2\ 2[C\ 1ëk#`ïX\v\19\96\7f\ 5\96«\190¼- -Ø     Ò"<\80A
+|G§F¼¢1£\97©<êSJ^ÊR¬0ý!Y\92±@*çÝ'VeÏ\13.åÜÃÕçÎa\15ù³\91Í\ 5³\11×
+f»\ 43áý\82éðaÁíÈÛ\ 5CØÏ÷\7fÃ\1f\ 66bÈ@\f\1cÄÀF\fLÄÀ\ er\86\8cp\ f`E\ 5½eR°+)©1Ïh\9c¤ÇÔ\1cÆ"¥0ãAlqæ<¹\8c\7f\8fT\95;K¼\98?C¨\17\14ESØ\16áT¤Z8\15q]4\151(\1aÅÞ\12\rân        oào\89>\17dl2\ 2.bà"\86\fÄÀ>c    ¼@gàaЫ\Bðï¬XÜK&=î×\94\8cä%\1a?}\81*àÎÇ_àÏÅ\96æÍ\90¥\82iÒÅ¢Ib\9dh\12ßX<\81»"¾\8bÕ õJF±\83\92Aü ¸\970(é&~>à \ 6ÞöµÀC\f\1c×ï\81ëe    Ù\ 1ÎÀ\ fC¯fá\83ßpcð/Ø´ø§LVÊbJ\16û\ 1-?k.A\947\13_"\98\8a©\14NDË\8aÇ£ê%c\84Æ\921üÕÒ;¸\8e²;¸þ²AÂͲ^b\7fYgT\7f\99\86ôù\80\8b\182\11C\16bà!\86,OKÈ=ë\fyçЫ¹Øà7ÙÑøçÜDÊ\13vZêC&\8f3OÏãÏ&\15\15L%H\84\13q\15â1²¬ä\ e©®|4JYq\9bÐZy\9bÐ-Õ\13û¤½¤>i'\92:ºOÚJþ|ÀCÞ>\v1d#\86\90\83\ 4\81\9f3\b\82Ñ«ùáÁor\89\84çÙ\94\84ÇÜTæ\ 2\9bÃ\9bcääM'\17\16M$\8aÅc\94òÒÑØ\9a\8a\11r]Õ0IU=\1cu­f\88Ø#ë\8dî©é ÷È®ÅôÈZ\90Tÿ!¼Î¢\9a<Ð0\8eã\8cZO\9d¶sj­Ó\9eq©kuÜQ\ fj-\8a\82¸\80"e\11\ 1A\82\82\80`\b      \ 4\81@XB\ 2$d%!@V\bI ûö%$lj@A¨\98A\ 6\8b\vVªÖ\1dGíè;ß\99éuzñ¿ÿݼç</¶Wæ-¨D\r4ÔPµå\v ¢\ 6Æ\91\8eÜ\vì\13a\1fX\89ñ¯kSÒ\9eÔdá§hù¤»\15äÊ[djíÍÂZÞ\r"Ox\9dР\1aÂɤ×Î+\9b\a3\r-\ 3ç:\14\97³º\15Îó]­VlW«1»«U\83ëV´áº[¼\ 5TÔP\85\1aªQ\ 3-h%°B·\07<\0xÑG?pãã_³1g\9f0Óñ\ fèøâ;U$êx\ 5\859ZBç_/à4\rå  ¥\83\96«X\95òJ\96QåÎr©]ÙNµ\ 5çlÓç8Õíx\97Z\89\14\84N¥·\80\86\1aª\97Ì\86\1aÔP\1d¸\12¸!¾À?º\a\ 4\11G@\10\13÷ïº\84Ô§\9c\94\9c)f\16é\ e=\9f:N+eyÊ«\ 4?\92XâÁ|AóU\82\8fSµ»±VM'Ρ±ä8´Z¼C«"84\8aÜ\ e\8d<ÏÙ&ý\83\80\86\1aÔ@G\rô}+ î /Ô\87ì\86\86°Ph\88:ñF\18\9bòL\90\84\9bâ\9d-ºËÊ¡\8eÓI,\ fµ²~¸\94!\1d(¬kíË\93´_ÎiÓõâ\10\83\ 5o3hrm\ 6e\1ebh&"zi¾]'Êwh\9b.t´{\vªP\ 3\1d50P\ 3
+\10\ 4o\86\86\83þÐ\14\1a\ 2¢ð\98·¢èÓÏ\9bNb\1f
+\93\vîÕeRÆYD¦\87^Z?D©\96^)æª.ç\8bu\17ñZ\13\985y\16³\82h5K/X\8d¢\v6Cc\ 1¢\17\16Úuõ\85\ e­· úwC-j`ï]\ eõA\9b@\14ü=H\ e\1d\ 2ÙÑèw²\bÌKYLÖ#IbþdSjÙO\82lÆ?9\85ü¡\1a\8a´¿\8c¥î-\10\19;rµ6M\9eÉÖ\9c\8a\v\86B«©¾Èfä\17!\86:\12¢ç\91ì:oýÏÀøÝÀ\vX\ e\r{7\82$p\17È\83\ f\80âpÄ\7f\12§\95QéOZã\b\ f\14IÅwd\194Oc\1e÷
+\87,é¤Õ´\99É\ 2s{¡Ò.»`p4\16\9a\10\ 1Éb©+¶\9a¸Å6#§\ 41°K\10=«Ä®ó\16Ô \86ZÔÀD\rü=Ë iÏ\ 6\90\ 5ì\ 4Eà~P\1f\bÿÐ\1e\1a\rOy¬\8fÁN\1a\12óÿ¥9Wzµ\19Ïî\14\16J\8cLJ{+\95m\11\95É:ø%:'\87l´³JÍVf©Õ\[j32Jm\ 6F)¢ÿ£\80þÙ\f\ 6\16j\10ø/\ 5±ÿzhÙ½\ 3Ô\ 1\81 \r:úÖp(æ\99åXÒ\94ýxÚD\a\ 6;lN/éUg³ÌR¢XÉ'·72\19\16vu\93³\86¦sUU\1a\1cU\95&[\15Åb®¢XMU\156cU\ 5b@Ó{ëÿ\86ų\81\8d\1a\84»¾\ 1éwë@¹Ë\ f\ 3À¸ïð4r â±+,vòRLâèÅS\99}\8eÔb»>\8bÙ¦$\88DbR\e«\9ef©äÖw\909\1aWi­ÁQ^c²UT\9b-\15U\163\85f5URmÆJ*¢÷\160P\ 3\v5p¶Ì\87Æ\9dK@¾ý\1f Þ±\15\f»ü\7fC\ 2ö?ï
+\ e\9dê\v;61|âøµþ\84\8c®î3$½-\83!Óá\9a\ 2\15UF1\15\89xöÜ&µó\82Àà(â\18\91b¦ÙJfX,¥t«©´Úf(«FôÞ\82ÚOg\0\e5p}ç\83Èo1(¶­\ 6­ßf°îØùºÓ\7fÏãþý\81÷<?\ 4znFE_\1e\8aO³º1\85Ê®´\1a!\82\15Ö\18Ñ¿·½L\8fW±­\99ªV\ 4+GO´Ád#òÍ\96\ 2®Å\Ȳ\19\8bj\11=\89a×y\v\98¨\81\83\1ax¨A²u\11¨|W\81\86·Îm[\7fíÛåw×\13ìwóvHàÀDd¤k46U;t*_Ü\97BcõdòË\9c\ 4Y.Bn;ge\19
+sªÞjÎl±\98³ÅV\13^h3æò\11\ 3\91k×ås\1cZo\ 1\v5p\17Ï\ 2¾ï\17 ßøwÐl\ö\1eÙ°úÙ¥Íëî\8dì\ë¹½{Ç\95ûÁ\87\84Æ\1anE¦ËGã\88u?&S¨\83\19ì\82>|Sv/¹%½³V}Æ)Ö$;Í\9aÓF».Me×\9d\93ÛuçE\ emvC\87\ 6'èh÷\16°QCÝ¢Yаésh]÷\15\18×,\9aî^½trxÝ77nû®í\9búÎß9µ7Lwÿ@¢ìî\91,ÞDd\ 1u,\81\9eÆÌ\1d \b²Ü%â³\17kä§{ê\15É=ê\96Äî\ ee\92Õ¥:­u©S\95.uºÜ¥Ê\90t*½\ 5\1côß\14 \ 6ÉÚ¿BÛ·ó\7f³/ûÛÔÀ\92\ 57&V,tOmÜäxº}\9föñî\béà\fo*ä<í^DAñxbyÞ\8dô\1aì0\81\93>P,8ÓOkĸ¹¢D·T\9cà6\88ã.÷HO:{å\89æ\1e9FÛ#OV{\ fx¨A\88\1a\9aW~\ 2Æ%\9f=½´à3Ï­/?uÿ²l©ýåúm\9a\82%/¾\8fæ=\ fJ¦=:\92U|?\9aH\9cÀ\94d\8feP2<øê\94ëELÌ\10\85\93p\8dY\17?ØÀ\8f\1dh\15\9c\18´ñ\8f\ f¸\ 51\17û\85±\1d}\rñÖ¾Fo\81à/>дp\16¨\17Ïyã\9c7gÔ3w¦{jþ<äÕÒUíïÖm\97¼Ûv\90ûÎ?\9a6\1d\9cTòäX\ 6q*6\a;\89Éϸ\9dAJ¹\95S\86\19+¤$\8c\96Óâ<ôê\98\euôè\11    #j¤½6rÄÁ\88\1c\19`D\ e\f3£ÜÃ,o\81\ fH\17Î\ 4Óç\7f\1eéûøOî±¹³m¯¾\ \86ekÄ°~'\aü\ eР ¢äÍá\93Ä\17\91\9fÄg¤=Ä`O?H'\9c\9aÄ\11OÞ½P\10{\87\\143A+\89ú\89E\8e¸%,ûa\^~l\\83f/\ f\e¿ZvllÌk úØ\aÚæÍ\18é\9cãsip\8e\8fíÞÜ9*XðU\13,_Ã\86\8dÛ©°#°\18\82\8e\10ß\87EcßDǧMÇ'%¿HNIx\9a\9e\16÷+ö\Ì£¼¬¨\87$lÄ/\15¸ptl\85ýÌ%\1cý¹17ô~K^È}\r1dÒN<<yÑk ûÈgÔ:Ó§·w¶\8fåúG3\94/?\99Û\b_\7fÍ\82UßV\82ïV\12øûçÁÁýY\10\16\9a
+Qá§ÞÇý\97ù:\8bjúÀâ8\1e\99Î\94\9e©ÕZt´V[p´\8a
+\8a
+J\8aÈ\1a\95\82\92\85,$\81@\16²\93\85\10L\ 2\ 1\ 2\84$\10 \80\8eÐQ¬£U\86"{A\94Ê(\82\88"¢ "Z¬\8aÞù\9fÎ3y\9e\87ïûçíþntÂ;bìñ7´\84è×i¸£ó\Bø+11ì¥\82txNEÁ¼Ð%\85Î\1a¨!³fZðs\e=èycràÌ\8fv\ei@¡Ú~Z\82jê^\82ª½»ÔÑ\b\7fý\8b\ eÖ¬Ì\86M\e$°k\v\17¾Û\95\ 2A>d8â\87\83È\80X\88\r\89\ 6<&\ 2(G¾\87\14dl±Â1À?\1a\ 2\92È \ fʨÀ÷¹1\a\17ò\8fù¿3\1c?ðÎ\1cë÷Ö\16÷ÝÛ3vë¼à\80jjqBÙn8 J¦\96:j`ÙG'`Ý21|»\9a\r;7Ð`ß&\ 2øo\8b\83PÏh\bß\1d\ 11ÞG a\1f\ 6\12}C     \1d\b\81e\1dð\a\9e¿\1fd\1cD#O«/¨\82ö\81\a\8a\83½Á\14â\rÖP{]¸ä\88ªéF¡\fÃ(\94\1aþä \80åKù°öc\ 6¸.#\81»K<x­\8d\ 6ßõá\10àz\b0\eC |s\0Älñ\87ø­~\80wG\ 3yû~ ïð\814\8f½\90î¹\a\84;½@¶k\17dyí\ 4õn\ fÐ#\19öØËÖ\8aB\15ÿ\8a\8c£P2ø³\ 3\v>q¤ÀgK±°æ£hpuþ\1eÜ?Å\80×\8a@Ø¿ò\0\1ctACèê}\10¶Æ\e"×î\81c_zAÂW;\81°Þ\13(\ev@ò×Û\81õ\8d;ð\·B\86Û\16PnÜ\f¹\7fß\f\ 1w\85#°×-\ 1Öö\8f\81\ 5\98\90\ 3Ò       ¾À¦\ 5C\1a'\ 2\18\92Ø\ 5z6þ\rUC\99§\14Ñ_\91\8c\8c¹Ä
\vB\rû9þtú\f®\91;\93ÐÄ{\96p\99?\1dß*\98\8eë\11NÅÞ\16NÄß\13\8e&\8c        nã\1e
+nÙéÿÇðå\12àlw\ 6\96\9f\vp\8e¸\ 1\ 3\ 48_àQC\80Í<
+LqÜ;FVâkú)ê+ª>e\8e\9c%Y8Ï\89ÕÜg\84zþ4¾Q0\85k\12Ma\7f\12?M¸\96ñ4¾7ãqü\9d\8c1ì½\8c!Ü}ñ\rÂXÆu;\ 1\ f1p\10C:b`û­\ 2Þ!7\10Ey\82\18\8b\ 6!%\14\91\1fØÂ\84·L\ 5i\9e¡¦¿¤\17¤ÍRKØ3\143o\9aT-\98\8b\9e\12\1a2\9eà\9b$\93¸+ÒIl\9bl2¡_þ\0;$»\8b¿'»I\18\95õ$\8eÊ»\89\8b\aüå\8e\90\8e\18¸\88\81\83\18\84\187\90Fz\82,\1e\r\12\12\ 6\84\8c¨\ f\\1eö\rGNþ-M\95ò"EÇ\9a¡\e¸ÓT\93`\8aR%~Bª\93L&6È\1e\13.dNà¯(&p\1dÊGØ\ 1å\b~H9\908¢ø\858¬l'\r+Ûì\ 4\82å\ eÀ]ë\ 4¼mÎÀE\f\92P7È\8cð\ 4E\1c\1a2\89\18\90&G½\17rp¿ó¤I/Ù9©³i\1aγ\94"ÁSz¹x2É*}L®Ë|DjP\8e'^81NhÎ~\88ïʾ\8f¿\95}\8b8\94ÝK\1aÊé ßÉi¡ÜÉi¶\13\b\11\ 3\1f1\b\10\ 3ÿ»U \ fv\83¬p\ fÈ9\8e\86l\ 2\ 6\14Ôè\ 5   \13ÿZ$¢ÎñN0gØy¼©4½x2¥L6A«T\8c'Õf=$7ä< þ¨\1aKlÉ\1d#ôåÞ&\ eæö\92\asÛ)\83ê\7f'\rª/S\aÕ\97ì\ 4¢Ï\1c@°Æ       \84\88Aì»
+N\ 4¹\82\ 3Ô1hÈÅb \87\12½ dàç¥|Ú\vQ&ë\19O%xÂÎ\97\96\93\1fÐjU÷)\rêQÒÅS÷\88×4w\8975}\94\ 1M{Ò\80\996 ½D\1fÐ6%\ fhÏ'\ fh\16\vÄ\88A\88\18D\88\7f\15\9c\fp\ 5Íá\1d \8bò\ 5m|(\9c"F-\9c¤ãç\95lú¬TÂ\9e\16e\v'¹Zù8«8k\8caV\8dÒm§F\92\1aµÃäËùwIÝ\ 5ýI7
+Úiýú«ô~ýÅä~ý¹\94~}\ 3ãFÁY;AÆ2\a\10ýÍ  ÄîΠðq\81¼\83ß@Á¡íP\18±\1fôÇB \1f\17ù^\93\84\9bW¥Ñf\95\ 2Î\94T!\9e\10ª\15\ fÒ\vsF\99¦¼\91\14\9bî.õ\aý\1dJsѯ\94¾â\ ez¯áJr¯á\ 2£×Ð\98Úk8\93ÖW\Çì+ªe^_4\90 \ 61b\90 \86,o\17Ð\1dø\1a\8a\81\a\f\91AP\14wô}A"öµ\86N\9dUqØSJ©xBrR9ÆÏÏ\1da\eµC\8c\9aÂÛ´s%\83Ime]ô\9e²+\8cnãùÔnãYf·±\9eÕSVÃî)µ²\7f)©äô\1a\16\v¤\88!cµ\13H\11Ãɽ_\80Þo\ 3\94\ 4ºC\19Æ\e\8cá\ 1P\16\13\ e%Øøß\vÉI/´\fÖ\94J z¤P*ï\8b5êaniÁíÔ\9a\92\9bô¦ò>Z§ù*£Ó|\8eÙa9Ãê°Ø8\9dfkz\97ÉÂí.7q{Êʹ=¥\8b\ 5²O\1d@\82\18d\88A½û\v(F¯\a£ÿ\160\aï\ 1Ëa\7f°D\1eY0Å\1eÿÍH Í\14ÓR'u\1cÁ\98Jª¸£P©¯\8b
+\v;Ó-ÆÖ´³\15WS\9b­çXmÖzN\9bµ\8aÛfµðÚ+Êù\1d\962~§©DÐ]n\10t\e\17ë\ f\83\14\11\83Æk%\94ú~\ 5f¿o¡2À\vª0~P\15\8ey]\15\13ýÜ\8aÅ?¶\90é÷K\99é·
+Äò\1eÕ\89¼ÖLMÑeQ©©\89k«jä\´Õr\7f¶Uð[kÊ\ 5תK\85mV\83¨½²HÔaÑ\8bºLzqWùb\81\1c\10CæÖO@·ës0ú¬\83
+ô&¨ö÷\84Ú\10ß·uaÁsõQáOëãã\1eÔ\91Éÿ©Leõ\94ðå-ZyÞÅ\1cUq\83¼ÐR+®¬±
+ÿYg\12¶Ô\95\88[j\8b2Zkô\92kUù\926«NÒQ¡\95t\9aµ\92.ÓbA&b\90#\ 6åVgÐïü\1cL{×BÕþ\8dPë·\ 3Î\ 4zÏ7\1cò\7föÃÑC\8fÎÅF\ e7\92ð}µÉÌV3Gv±H\9cwV\93e¨ÎÑU\94+ÊmŲ\7f\9c.\905\9fÖÉ[ê4ò\9fm§ä­Õyò6k\9e¼½R-ï4Ûë\7f\86UN\90µÅ\19\8a<W\80\1a¨ñq\85Óh÷w\8d\a\9d\ fõ}ò¯\88\80±+ÿå»Î\1f¡NÜ\0\8e\7fLR\8ab¥Ð¦\1c)\92skкÅ8rÍ\98a\183æ$gR"ÉÙ\fFB®Â0ÆM¤U\96DÎ)´ÑöM*ËW˦ҡ¶\ 3=ßÏ?0ß\1f^??ïß\9eç   8öè&\9d\1c\12ÕU}â|kY\1c¿º ¥èjNve~fI-\9f[ßÈãö4ñ¸½\r¼\v}u¼ôþ\1a^ú \88\976$ä¥\89+P\ 2I UA
+RÐ\ 6Þ\ 19(1Ù\ 6BìN¨7×\86\16Ký/ív¦o»\9cÍÿîó¶\9aêóu\eí¤Q{Ú8\917\1a#\12ëªNg\95\95&\16å\15eTdä\15Ö¦äT7&æt6%e÷6$gõÕ¥döפf\f\8aRyCÂ4®¸\ 2%\90\ 4ÒÐ\86T´!KO\ eJÑ¿·ú\175h:¬ñã\86Åþå.\9b\83¯úqƳ#^Ø\89a¢ë`o ¥£\83\15Ñt=ì\EÃÉÌË¢³\ 5\99\82\våIWóªã\8a\85\r1Å·\1ac\vîÖÇçöÕ&äôW\9fË\1e¬Jä\ fU\9eÏ\14\vþ\1fHG\eÒÐ\86\8bû7\83ÀX\11jMv@«é®o¿\1fÖ\ê³Ô\99\1fsÒyöÈíÐÈ(ÁùÎ`\80ÿõ;\8c0QÇñøâ¶\13\~S\~r]Ji¬(§*J(¨\r\13þV\17!è«\8d.é¯9U0 \8aÍ\e\12\9e¹4\\19\7fQ,\88¿x¯\\12¸\806¤«®\83\\9dMPi¸\15\1a\r\94¡ÝPõS\8fÉϯF,~þë©Ã®ñ)\17Ó\81     o§[#d¿ú¡ \90Ò^Î\99K\9d\11ii7Oçĵ%\15G¶d\v\82\9b˪\98Ím"Vàè¸p°*¼lH\18U2\\19](\16Ääß+;\95\7f_"àn\95\ 2.ÚP -\v¢\ 3òТ«ø½KWé\8dX_iz\12«ðhÖVýÞ_ÎF·§¼\1cZ\1eù\12+ǨìËbV\fo ,)¡7&óD÷ùü\90.~  ý÷Ò²ÀÎëå\94\8e{åôkb\ 1»F,\b©¼W\1eZv¿,âÊÈÕ\88\12É\80\876d \rW´6@ݾMЮ)÷a`\8fÜÌcmÙñY£mÃó\96ÚÝs\8e¿´Í¸;Ô<'z\97\ 4ñ'\18\91I\7f\84ÆÇ\8c\9eL\v½\9f\98E\17ós\ 3Ä¥\ 5~âë\85\83Bÿ®±âÀ¶Ñ\92 ÆÑ\12fÍX     G8VÌ©\18+\92\ 42·HA\96Ê:\10\87k{d¾v«ÈÌ\8d+I?\9cU\97\1d\4Pí|e¡Ûº`o.zé\82+þ¯'\91?C¢'½ \86\9d~\16|*l*ú\1cc215`\92Ï#M\96e\11\9e´f\13&Çø>#\8frH½\13¹ä\8eñü\80¶ñ|jÓx>­A2à£\r9Û1P\8dÞRíÊë¦îoÆ<\9cÝ\82\19x­.ßñN\7f\12Ö@øÆƲè5Î\85ÿÊ\83\98ü\ f\91vz!0$l\81\15Å\9c\8f\8a\r\9cKHð\9bÉH"N\17¥â_Ô¤y=ïH÷zñg\1aþá\14\9704\99Aìy\92éÛñ\9f,¿\9b\92ÁEy\ 4\8aÐÝÙ¬,õ´G\16\19\8bô¿Þ"}ó³ºbãg}\8dÊOX£Âe\e«¬e\9cKò²'!v\99D   _¦0YïÙÇ©o£"È\8bñÑÄ\85ôÓø¿sã¼^\96\9fõ\98kJ86×\8dz\9aà99\93àõ`æ¼÷Ðt2~@2È\93C B\1eyvK\ 6¹ß¿\ 1é\9d\90EÚ?)ÈÔ¯ìÞ&XÕ׺¼\8a5Î\µµL^sv:³æå\19±F"±¾\a\ 6Ðþe\aù\7f\8ad\11?\9c  Æ¿K     õ\â\87»¿)\8at{]uÂe±5Úyñn4nq2Úuîe´ûäüI÷Ç\v1\92@á&dº     \83\8ct®Gº\87e\90¶É\8dRµðÓÆRÐØ\9e\a\ 6Z\19`n\98\ 4væ±àb\17\ e\9eÎ, ºS!\10OþÁ"ú¬\86\93½¿\9f
+ðø\9aHuûÂ\r\9cKÇ}*e:.×°\8e~¼Ávøx\97cÿñOÎÑ¥\ 5\8eãë\7f$Z\12"ÈØo\18äö\1di¤eL\1a\11Mo\90º\ 2ʲ\97@[\99\vF{\12á\88^\fØ\99\84\ 2Î\9c\ 1îÖ\14ð±÷\ 5\8a\13\1e\98.\9e\10\18D{¸@\9c\97\13ú\10\1c\85,\82ý\8fËDÛµr\92ÍZ\9d¯õê\r?«Õ\1e²ÕÊ8Ùrå\99D\13Í\bÒÝ\81\rb\90ÊÇ\18¤ðËfL6¨lL\ 3\1dÅ\ 40V;\ 1f\9aÁ`¥K\83£\86dp3%\0\1eë   d\v7 ýê\fl+G\b·q@\9f#[8ko\r©G-\81ïx\ 4
+\9c\1c=\82j]Ìàº\v\16î¸b¡O¢\9e\e\b\ e\82T\8c!HÞ4\82d\80¼T2¨­\8f\ 5-¹pÐSb\82±j\0\98©û\80\8d¦'àtÜÀC\17\a>\a\1cÀÿ \1d\ 4\19Z\ 3ÇØ\12ÂM\8eÀISs\88?\84\85\94Ã\87 \vk
+\97ÍL ÔÜ\18D\16FÐrÄ\bÚ$jí@ç\ f#Hî$\82¤½C\90\ 4´!\12\14×±AU&\1046\11Aw«'\98\82ÅvG°Uµ\ 3ÜNkpßõ+àÕÍÁo\ f\16\ 25\ e\ 1\14\8c!JÛ\10\1e\84D\1d}àîÓ\83\9cýºP¤»\1f*ôöC\95D\95}èüq\ 4I\99E\903\80 a°Q\8a\ 6ò\18\12Úá\ 1*ëq°GÆ\1et7Z\83ñ¦#`&g\ 6V[\ e\81ÃV\13pV0\ 2wE\ 3Àÿ¤\ f¾Jz@Ù¦\v\få}\10²}/DîÐ\86Ø\1d\9a\90¨¢\81.£Ý\90£¶\er%\82`U\f0µ¤\81j(\ 3\816
+ÀpU\ 3\ ea/\ 4S\f\81Í1\af´-ÐÏá\80Æu\aÊ%oð/&\ 2¹Ü\ f|Eþ@j ü ¶R×|Úi«\84ÛA«\84\ 1ú
+~\8cñÍû9ã_ïyÆ\aü"ã\rá-c\9eø\8e>CzÏ\90\ 4BT0ÀB\eh\ 62@E\eØÎjp\1c¿\17B\ 3\8c \84e\ 1\9c(;`\9eu\ 6\aP/\12\80\vþeþ@®¢¬ùÖSWI-A+Ävúw\9fÛÌï>\ 3¬o\84\a¬/ø\17ìeü<{Ég\91½@|Ë\9aõ]b=ó{Ç\96\ 4\8e£\rlMi\b\04k\ 5\bÁí\84p/\1d\88ð7\82\ 5\84\ 3\15\98©^\10Ä'\ 2µ\80\f\94\9a¿\90¶B®§\7f÷ka~ómg}#Ýæ|%\ e\ 6\7fñù#ø3a&ä½Ïüÿè®Ï°&ï5\8eã\añ\88==-\9c:+ZÇQÔ£uTD+ÔÊ\85¨uáBf\b!\84ì\84\f²H\ 2\19\8c,\92'$!\bÈÒ ("e¨\ 5«(U\1c(\12\82L©x@e\88¢(λO}\9f\17ß÷\9f\17Ïsý\7f7ùiÈ ©/l\98Ô\15>B¶G<sÚg\ 3\115Ä \ 6üf\ f mó\ 4Ö>/`\87¡\9fX\8c/Ш[\81ÌÛ\r\ 1\88Õ\84\ 2.3ò#6'ú=¦0æ]Ä        ÂÛð3Ä\89°jÒ\9bÐ:òë\90k\94ñÃ÷¨cÁ\ fiÃ!\8fiÿ\ f{Jí\8e\18¢¶F\ eÓ\9a0#N\ 3ê¬I@Zè
+øïÝ\80èç\ 1ñ\81\9eÀÝë\ 5¼\90µÀ\8dö\85xr Ð9{\80"=\ 4qéá\9fðHÔ{\vÌ[l\ 1a\ 2SBz\1dYF\19\ f¯¢½
+»H\7f\15z\9d1\16ÒÊ|\16ÒÇ\1c\b\e`öD>eØ1\83̦¨¡øëXç\ 1\r5\90Q\ 3\ 15P7y\0\13\84»½@\14¼\16\84\18?H\88\v\84øø½@O<\f\94\94È\ fqzÜ»Ø,Â\e\>é5ÖF}\85)£¿\8c¬b\8e\85_d½\b»Á\1e\ríä<   \7fÄy\80\19`Û£\9epna\9fp¯E?áÖã\9c\atôݦ,p\858ÔÀÜè\ 1\ 2ÿ9 Ù¹\ 4\92\ e¬\ 5i\84\1f$â·\ 1\8f\16\ 4,~È'º<ê=E\8b\9f\883\93Æcóh/qÇ\98cØÓ¬ç\98*Îhä¥\84g\11·x\83\11=ü?1\8fxöè~þM\¿ !¦_ð;¾_ð[¬ó\80\81\1a¨¨\81´Ò\r8>\1e ùy\ eÈ·/\ 1å¾5 \fõ\ 5Yt \88ÉAÀc\87|bI°oéé\84×\14#åe\\ eó\ 5¾\98=\8a;\950\82­\16\f\85Ã\91Í¢G\98ÞÄV\_âÍ\98\95Ø\87\92:ÂCɹ¸>q%Ñy\10\ 5hó]\81\8c\1aøÞî óû\16Ò\ 2\17\83zÏjP\ 5o\824L È     A f\84~ä  ¢'ØJâ8=\83þ\82le\8fÆ\15ò\86ñ§\84CÑ5â§Q\rÒÇQíIí¸^éM|or=á\81ì\ 2ñ\81¬\8aô@v\96Ü\9b|\9aÜ\9bä,`¡\ 6:j ®p\83Ä\1fÜ!uÓlÐ\ 6,\ 2ý®ïA\7fp#èÂ\ 3@\15³\a\14ä\90\8fbvô\ 4/\89ø\8a¥f<§\99¹#¤|á`l©ä       î\ò\0¶QÞ\83ëRÜ\8eíV^\8eëN9OêJ© t¥\94\95'i=
+\e­Gî,`Ow\ 1&ºã\98ËÝ iÍ× Þ8\v\10ÿ\85`Ú¹\12Ìû} 3Ô\1f\fÑ»Þk\88ÁãJ&ö¹DD\1câ§0\1f³\r¼Gô\1cñ\ 3\92MÖI¨T:ð\r©wc;Óê\89\1déçÈíªrj»ª\94Þ\91nct¦\153:S\v\98])Îúl\88G\rìen GïÞ\f\9f\99`Þ2\1f²w,\87ì o°\ 6o~g\89üå\951öà\88\96\8aAg[ÜÃ$\19³K åÛÙ\16i\13½Py\83R¦ú\83T«©'5kk¨\ eÝ\19ºCWÂlÓ\16Ç·iòYíê<V\87*\87Ý\99æ,àüm\98ç
+       ^S uåW\80øÌ\80ì-ó wÛRÈÛ½öCÞ\ 1ßW¹a\81#ÙÑA\ 3&RXo\ 6\aïH\950\9a\92Ò\ 4×\ 4HòeNNZ-³D[C¯ÒWÒ\1a\91Ó\8c\16äx¼ÝPÀnÕçr\1cºln\9b6\8bÛ®¶$t¨\9c\ 5Üi.ÀB\r\82ÅS@\85Þ½æõÓ w³'\14\ 4,\86¢_V½)Þ·a´è°ÿãBÌÎÞ<â¡V33æ\96NÀ¸\9a"\17Ö&iåÕB\8bª<¡0£\94]n´±êM\85\9cfS.÷\9eÑÊkA,|»ÞÄwè\8cü6-"hW;\v\12P\ 3{®+$þw
+h\97\7f    Vïo \1fý7\8aý\17½·mûßØ\89\ 6O\1eòë;\19±õ~1þàí#´\98+\99  \8cß4Rá¯)i\8aÒ$D},1×pTPj:«µdñïZLÂf\13"ºgÔ\8bì\86\fQ«^'rè´¢û\1ag}6pP\83\ 4½q2\96ÿ\vr¼= èÇY`Û<ÿMéV¯ggv®ê¯8°¾»<Ìÿî    Ü\81?
+ȸZ+\9bQ\81\88\84'5
+Ea\8aNsDfELÒã\16\83¸Æª\934ei¥wÍjis¦ZÚ\82¨¤v½JâÐ¥KÚ4Î\ 2\1ez[pQCò\82\7f\ 2²ì\v8ºÎ\1d\8em\98ñ©Ô×óe¹ÿ¢Áª\1dËú.ì[ÕZuxË\8d2ìþß\8f\13£«\8e2é¥Y|A!\92,ÏÖª5H\9a\19Ñ(\8b\8a\15Ê[V¥â\8eE©h6)å-F¥ÌnPÊZ3\94ÉmZg\ 1ÿo\83§+È¿\9b\f¦¥S¡à\87¯ Ä{Ú»3\eg\8fVÿ4w nÛÂîK»WÞ¹pèç«\15\98}çJ    Ø²c4Zq\1e\97\9fm\15Ë\90ÌTµJoDäÚ|\8bD]n\15i®[Ū;\16Iz³I\9aÚbLJ±\e\92\94­\19É\8a6­³@\80\1a\12PCÊÜÉ\90åå\ 6Å«¿\84Sk<Æ+½§\ fÕn\9aÕ×°u¶£aÇ\8aÆ\8b\a\7fª«\89Ø[q\16\8f±\95R(¹ÇX<c¾(YuD¡\92Y2\fÂÌ\3×x:\8be¼jå w-¼\8cf\93\82\bÕv\83\91\91\98Ö¦uÖg\ 3\ f5¤£\1dY2\ 5l+¾øT¾òß/.¬þzàª\8f{O\93ßÌ;\8dÛ\97_¹²ß·¦.lwi\r."ÿ,\89d>Åäjl|©¬(9U\98¯Ñ±r³\8d´\9c\93frÎ%\v5»ÙÄ0Ý3²\90\16\84£oÕ'è\1c:\9e¦Mã,\10þÇ\ 5\ 4s&\81ö[W8\8anºR¯)\13UK¦\ e]^6õaÓ\1a·Ö\96\rÓ\e\9b\ 2\97Ö6\ 6ýX~%dgñEl¨õ|\1cAWIg)Ê\13\12E§¤
+Ö      \95\9ab³è   ÇK\8c\8bF|q\vB̳\e(ÖV=ÝìÐ1\8cmÚxC»ÚY\90\88\1aÄè\86\15¡;âÌ\82Écµó&÷ßüε³k±ëí\8eõß\¶\a,®º³ÇçÄ\8dàí¹\r\98`ärlLj\1d\95\9ex\9eÃcW\8b¥\94Ê´\14|\85Y\1duö¸6¢¢N\17QîÐaK\1c:|a\9b6.÷¾\86\94Ý®¦X:Ò\9d\ 5b\ f\17\90M\9f\ 4fôí*\997éCõÌIC×<\:»ÜÿÑôç\92ÉW{}ÜÏwù/<íص®àÞÁ\0SSø~Õ\8d\18\8cô\1a\99ø\17Ýu\1aÕä\95Çqü\ 6\ 4\83\14\ 1uDPÊQ\ 4T\8c\ 2\ 1¤\10böåI\9el$$,\ 6\ 2*0\8a\8cZ;NµZµ\8e:n\95±ÇµZP*®ã¸á2í)\b¸Ud\11\10K\88\8aüæ9}m^|^ßïý\9fûâþK.\17\17å7V¬Èú©z\95¡aëZúÂÁõª\86újêBK5}ª¹F_Û\c<Ô\\93¹¯¥ÚòmËzG°\8ai¨af±Ó\9bàØ\ 4ÒÜ0\86Ü»=\86Ü|îÅj|\1e4ú쳨ñÇ\9e$MýW\e?l{\8b\9c»ñ\17\8d ê¡I]voqfÁÝ"köíò¢\8c[Õ¥ô­m+\95·\ eUÈn\9f¯\94ÞzZ©h|¼\9a:Û^E\9fh[£­m[£?Ôî\10ª<YØ<\96\85ý\1e¤å\f\9bÜid\93kMn¤¡s\9cÓéΠ1G_Føì}Á\rúú7^øÆgâĪ'\14¿ì±AQÐ\96£Ën-ÌÌh-Ï¥\1fUç+\1em+\94\1e*\16µÕ/\13µ?)\16ßë(\91^{±\Þð|\85âÜó\95ÔÉgå\8e`\1dsþ×v\14¹}Î\95\ºâJê\1eº\91\13}\13\9c\ f÷\ 6yìé\8dðÛú*!dCOZDU·\98[ÖMñ\96téÄY]\16ÊÐU ¥»\96g(ºÖ\99Å][²\17uïËåõ\9c²¦½j²¦¿xi\15üÚ\9d'¼ÛS ¾Þ](¹ØUä\bþæN:÷²HÓ\89Q¤ñ¼\v9{Ã\95|ßìF\ e\fú¸ì\1a\fñúÇ`ä\94¿Ú¸!«m¼ð2\9b8n\89M¹0˦M7ØÌ"µ-_&·\95R¢¡*:Ýþ\856Õ¾K¿Ð^\9b\91<Ô`L\1aj7¥ôö\98xÏ^\eÓ[^gòï\ fX\1c\19ÙFÈÃï\b¹tÆ\99\9cit&Gïº\90½\1dî¬\1d\1fü\¿\1c\99éU\8d¨É«\90\14T\824N>\84Q\16È\17è¡ITÁ\94"Åb\9e\10Å\8b\10¦ F\9c\84­R.öÉ\13p\\19\87ËTÜÈ\13*þm?\95Ôÿ;\95Ò1¤t¤e\1f!W\8f\13r¦Î\89\1c¹îD¾ýy\14ùjx,k#ü]×!Ô³\1cQ>Å\88\ fX\8c\85Á&ðgk \99§\80*\8aY>cùÈ\8ec\96\8f\84d\94%rQ\95\1c\87\8d)ó±#5\16\aÒ¢q\92\17\85+éQhåG¢\9f\1f3bwèF-!?\9c&äH#!»î\12²¹\9dEjàÍZ\ 5ÿQ¥\bq_\82°qY\88\99¤\a×_\85ÔiR\b\82\ 4\90ÏH\ 3\1d\9a\f#\87\8bÜ°8\14Î\8bÅ\8a\88\8d\8cÀ\17ÑóðMÌ\\1c\8c\rÃÉ\ 5sp1n\ e\1eÄqÐ\1dïÈ9f\ 6\13²ó\ 6!\9b~%dÍ 3Y  /ÖRLtÎF\80k\ 6Ó¡Æ\O\19\vÀõICªo2\84\93\13 ÷\9f\ f\1aÆ©\91ÌÂ:\ f\87ay\10\aUÁ¡Ø4c&¶Ï\9c\81ý³Bp,4\18\ eÆ\r\8e#GÏ2ç_%dã\ 3Bþü\94\90\10+>a\19áí¤\86\8f³\14\ 1.|\ 4\8fþ\f\12\11í\1e\87\ 4\8f\18¤xF\80ï=\17\92qs@\8d\9f\rÝ\84Y0ÿ)\ 4Ö\89AXæ\13\88\8aISQí\e\80-~\9fb÷äOqp\8a?\8eû;²û"sÿ;\84\11R4HH6\bÑÂ\95%\83\a\8bÏt¤0\1d   \b\18\15\8b`\97Hp\ç"b4\aóGÏ\ 2\97\1d\82\14v\10øn\81\10»M\85Ò-\0Ú1þÈ\1c3\19Vw_,ûÄ\a\95\1e\13Qí1\ 1_\8e\9d\80\9d\9e\8e@?Å       ê`gÈÂ]!\8egC\9dê\ 5\9dØ\17zz\1at\96Ph
+á.\8f\85r=3þ¿'CúM*${y\10\1fæCô½\0ÂÓB\bêEXtY\fþm  ø­R¤w2\ 6¤ïù6©MðVÚ/z/é\92¼\97vH\86\8f\ 6\9ai\903\r²\ 5lhS¼`\14ù¨\ eDFf(ô\ 5\11Ь\\0õ_\12¡Ü\9c\ 2ùv\1e¤ÿäCrH\0ñ1\11D§%\10Ö3Oõ²\f\82;r,j\97\83ߥø°h@a\17Ø\14¯Evy·ä\9dü7é;ÅSÙÇÁ0Ù     \1a¦A1Ï\15Êùl\18\16zÁ,ð\83\99
+\84É8\eÆüHè\97ÇA³6  ªM©PnK\87|\8f\0²\83bHÿ-\81ä\94\fâz9DW\14\10ÞUBð\98\82 \9bz'\1c ~\17Ù¨\1e©]ùBf§ÚåoU\8f\14\1f\87\f¦A\eä\f%Ó@Ç°\91\99ä\8d\1fr\14\81È2p`^\1c\ 5cI<ô«\17\81\aÕW\ 2(w\8b¡8 \85¬V\ eé)%$u\14ÄWT\105©!zJ\ f\v_Ñ6ñ\0Ý+\1d¤_(lt»rHó\ve×<p\0Fæÿ¢c\1a¨¹®ÐG²\91\9dà\8d<\9e\1fòeÓaÕr\90\93\15\rKQ\ 2\8c\95)Ð×ð¡Ù"\82\14Ô~\ 5\14G)ÈOª!«Ó@zU\vÉ}Ý°ø¹Î.y¥ï\97\rè:\94¿ëÚ¨AýÿT6Ã\1dzÈpÓ\ 1\98\98\ 6ýtg¨Â\`
+g#/Î\v\85\9fù¡H\1c\88B5\aù\99ÑÈ]Â\85eE*Lë\ 4Ðo\96@»C\ 1õ^\15Tßi <¡\83¢N?"»\961,ýÙøVÚa\1c\90÷\1a;¨×ÆVõ\80é>ý&ó¦fÐ|U7h¾ì\02}\9d`\bt\86\96ã\82ì06
+c½P\92ì\8b2A J\95\1c\14\e¢±$7\11\8b?OCÖj!L\eä0lSA»G\ 3ú°~DuÜøAYg\1aV\7¿\95?²¼Q¼´tR½\966º?«Iû:û?ú\81\9cK\86\81\9c\v\19\ 3\ eÀÌ4d0\r\19³\`å°Q\12å\89rî$T¦OC\85l6Vh£ñ¹%\11\ 5\ 5<XËÅȪV´\85\86a·þ\83ö é=}ÜüNU\9fm§þ\9b3¨|\9cÛ£êÊm×¾ÊmÒ÷Y¯\19úò~2öåýhêË;\93Ù\97\ 1X&9Á4Í\19æ\10\17,\9d5\1a+ÃÇbu¼\ fÖ¦MÅZI(VÓQ¨0qQjå¡°Dü>o\reÏÙÄLp»ñ\8dq\9f¥__\9bÓ«ýÁÚ£¹\92×I7ç?Ñþ\9fíú\8ckòÚã\0~\ 2\82"Ô-­Ö\81Új¹W\8bu\94º\ 5\11D\ 4d\89 \ 4\b!\ 4\92\90\90I\9e\f2\b h\88ìÈ\b\e\ 4\ 3\82\b\95Q\17P\ 1­(Tëh\18\8a\fÇ­\ 3{{îóâ¾Ì\8bïçyy~ÏÿyÎùÿÏ$éAø\14¥'b*¡3ê\15µ\157Em\8a\9eJ¨ÇO%\ÂOSÌ\81x4C\14\9a\81ðí<Hß2\1f
\7f\ 1eûì¡âèz¨ðv\84©A;¡\ 4{à³\80àþ\9eMóyKç\aÍPäa\93Ä,Ü\ 4¾\88`\88ª\8e\1f\8d¸BÑ\85ß >\v\1f¢\rb'iÝ\91/éí¸\17\8c\vF}ÌKF-á%½:v2±2v\92f\ e\8cAçi\1c:OÇ¡s=\a½_H\9cì`ú\9e\150ãÈZ¨:±\19*\ 3\7fJ?³÷\9d,Úm:\99ìý\82Ë    20%áà  Êè§qùqC\84²\84\81hmâݨ6foT?«'j\9cÝ\86\9fà4\12Æ9uÄ     NUÜ\ 4»<ÞÄ*\89\7fÁÐ\90^\9a\ 5       _b`4\9a\81â0\ fò6YAù÷¶PõÓ2\98í²\1aæ\1eß4\97ã·í]f\88ó\942Òe\\1ew|DÌ\fx\8c\bÃ\a\98\8a\98~j&¹\87T\98x\8bXÍú\85p%©=æ6òs\8c\8e×@4ðjâ\r¼r\92\11Ñ\90Ç\93
+)ã\9c\v\14\13[\9d`b\99\ 3cí1\10ï`     ië,¡p£\15<»Õ\ 6f;/\81êÃ_ý·à\98Ã\7f
+|\1c§ÔA;ÇsÃ÷ëT\ 4\8f!\ 55à®\98\8bíáI       7Xç\12Ú\12ó\98-       eI\8d$-¿>¾CX\17?\98\I\1e\15j(c\82\ 2ª\9e\9fO3 ¹4#7\9b6ÎÉN\9c0\v\12ÿ\9f\81±Æ\12\8aÑZdü{\ 1Ìß½\b\16\1f\ù±ÄmÍl©×·¦\12ÿm#Å¡ÎC¹Ñîý\19ä\80.9\vÛ!\16ƶð\14ÔË\9cLV\1d£\b©¢]\14\96Q[Å\1aj¿¤\906,ÎK\1c\11eÓÇ\84\99\f=ÿ<Ã\80d0\8cÜ\fÆx\929hËÇ@\ 2Z\ 3öjK\98²Þ\12f¡{£p\97Ý?¥û\96½«pùj²ú\98\83¾ÆwË\93òS?Þ+\88\95\1dçß¡¤c\9bS\91X­8\85Z-P²K¹j~!»B\94Ïl\92æ0{R2Y:©\8a=,V²G\93ÏrÆ\ 4é\1c=/\8dmDP\s`\1cz¿\8a[k \93ÐsB\8efÉýÎ\1ajv,\9c«t^<{ñÀ\8a  ­Ûj]½×7\ fª\ 3wÿZ\82uë¼@ð¿\9aE\r×\9eãÄVÊET\8d$\9d£\16æ\b²x¥b%R\9f\92ν)S \7f¦È\11\9d$\15\19\11¥"£B\19¢ç˸\ 6DÆ5rÍ\81ñh\ 6\12Ú·xèþHGû¸z³\15,ß¾à¯\8b;í^5ìY¢ovYñ¸ÉcSÿ%ÿ]7+Ã\8e´jð~õjrXU\16\93\14\14©l\95,S\90.)\92ÈDu2qrgªHô\&\12餢äa±H8\9a,\12\8c    D\ 2\ 3OÄ7"æ@\12\9a\81\82Ö@¸Ò\ 2*Ñ,\85ßXþSµÕú\8dÖi\81©y\97­®}ï\92\a\ez.ûíh¯\rum¬ÀùÖ\14Ç\9fѨé1yÙH\82J%e+Îfð%\8a\vb~j\8d\8c\9bÚ\96Ê\91ÿ!K\92é¤\88tX\8cHF\93yâ1\ 1_dàñ\93\r\889\90´\ 2\ 3iè9%F\9fçWa`ÉF\8b¹ÚÍó¦\9b\1c­ôíNÖ\8foü¸¸¿ÝÍáÆUß\1f®6\9c>\w1Ò§¬"6T­¡âU\ 5\1c\8a"OÄ\12e\9då!ª<\113£2%QÙ*£f<\94%\9eÕI\19i#b\96|TÈ\96\8d    8)\ 6\1eGjDÌ\81dtm\86½\ 5\94-ÇÀ\1côÿ,_\87ù«ÞÁÂtm\83\85®k³Å\83®]_t_w]×ÖæíÔÐ|ê`e\ 3öDAmLpf\15\ 5\97VÆ"\89\8a\85tn\81\82KÏÏ\11RòÊ%q¹Í)±y¿Iã²\87%dÕ\88\88znLHK×óé
+\ 3B\97\e¹æ@
+º6\e¥X\86\81êå\0Ö¬ÂÌ6Ûcô7W\82Gýë0}wvØ]ï:¼¦ùº×Ö\8bí\81û5-a\9e9\8dÑAéZR\84¸\96NäVñ¨ô
+\19\9bT\9aÉ#\94\94$ãJ\9aÄ\91%ý"\ÑhrLþ\98\90\98­çÇ\9f7ðÈJ#\97rn<É\1c\98\80®Ï[\8a\81Ê%\0\16/\ 1sÚ¥àY\87-xÔg\v~»ÿ5æö=§\85\1dX¥íñt,»éÿS~g¨»òZ\94\9f´\85x\ 6¹BÃÓ/sI$­4\11\7f\8e¨Õ gj/óCêúø¡5z\1e¶ÔÀ\8b*4 ÑùF.!g\9c\9a0\vÒÐ÷\17-ÂÀ¬Eàm\85-xÚl\ 3\ 6®Û\80»÷l@÷Ð\97 }pëüÆ\81}öU÷Ü7\17ô\9eÜ­ê>í"»\15áÍ¿\1e{\8aÑIÅ\92Ú81øk\12\12¶5\83\16ÒRÌ\bji`\ 5¶ö²\ 2\9aMìàK\13ìÐÊ     vX©\89\15QdbF\16¼0\vÒÑ\f©và³Ú\ 6<­µ\ 6÷[æ\83_oÍ\a7\al@ûóå é\99£UÍ\13çeE¿»mÈzè½]~?h¿àn¸\a³/æ$ù\ e%8¦\87\8dÅv\8b£Cº2\88\81]Å$¿®\ 6²ow/Åçö4åäµWÔ\80ÆW´ K\93´ÓÕ¯h!\15æAÎbô;,\0Ã¥\16` Á
+t·Y\81\8e\1ekÐ2´\104\8cÙcªÇ\1c­\8bG\9d\97f\ f»®Mûó\84cò³Àݬ?Â\ eQ\1eá\8fÅ\f\91}#\ 6Ù\81!\83â\90À\87\19á'\1f\16Gz\ f6â¼\86úpÇ\a§q^½o        Þ7Þ\10}¯½\8eó»ò:Îÿò¬Y0y!\98Î\ 3\1a\ 3º¯X\82¶NKÐØg\rj\9f,\ 4e¦U\16\17Lÿ²9or^!\9fp]/\18?îÈ4úí$\19BöâõQ.X=Éã´\9eå\150&òõÕ+\ 3¼ô\85A\9e\ 6\87±;ØÝð2Ø]÷>ÄãÁ\870ÏÞ\ fØã·ÞGzýb\1eL\ 3à©\ 6\80;Z\fhkµ\0\r·,AÕ}kPd´\ 3¹³k-\95³[me³{Vòg]Ö1f=·ÄÏ\9ctÂÍ\ 4ï\ e\9b\89Ø{j\86\7f&ÑÕ{\96ïî9\9bæéþ:ÏëÈëjïÃoÚ|\ e½}î{ðõ\a\1f×\89ϾGt\9fýÜ~ÿ;àèÀß\81æ\8cå\ 2\1a\80\8eF\0\1a:0 ¼×\ 2¨\1fY\81ó\1f\17cÒ>:Ì\93|üÞ\96ûÉy9íÓ¡¯\89\9fÜ7FÎy\7f\17:\17¸-p.ì\aßÿÑ]gQM\9ey\18À?            q\ 5µ
+.,*  \8bl\ 1\ 2!!\e!{\ 2        I\b      \84\10\b\ 4\ 47\8ak\1d¬KG\19w©KUª\8c#-êX+:\96\ eu\8eíA\1c=zÎL[·ê8¸ \82\b
+B|æ½\9a«ô|çwñ]=Ïû\7f¿\93\93ÿhi²l´*5{¬.]0ÖÀáºwp3ÜG²Ø\1fN\vRqU\98\82ç"Ö\98[\94>\0aæs¢\abOn\1e¡¨ï¾"ùç)ªù\a\8aÚ{\83¢>»G£6bÚ¸Õ\b¢-GÔx\17\12}íH\9fY\bÁ\9c|HC4Ð\84ÊaX(AQ\94\10åÑ<ÔÆf`u|\1a¶$$c_R"\8e³âñmJ\1cn¦Æ¢/-\ 6H\8b'\12Ç<ë<IQ§Ï\92üï(jO\17Emþ\99¢Ö¾ñ¡V\92\ eU\98M+E(Ý\82\98     \ 6°|µàL\97C4S\ 2ù,\ 1rçpa
+Ê@qH*\9có\92±tA<Ö\86Åâ³ðEø<"\12\7f\8e\\88\8b\8bÂq+:\f}Ñ¡@Ìï9ÛFQ_^$ùW)jÓm\8aª\7fHQµ`Reð\1d\f¯|2\v\rÂé2Äú\88Á\9a\90\ 5Î$\ e\84SÒ ócA3-\ 1\86éq°Î\88&\7fÈ"Që\1f\8e5\ 1\v°uv\b\9aæ\ 4£en .\ 4ÎEWÐ\ô\ 4ÏA¿GÇÉ\1dì%w°\89ÜAÝ}\8aª\1c¤(\eh\94\11\13Çi0u\9c\14þ^B\ 4Ó¸\b÷f#\86ÎB\12#\ 1l\9f\98\8b fF@>>\fÚñóa\9c\10\ 2ÛÄ@TN\9a\8d\95\93ý±qÊ\fìòý\bGý¦ãë©Óq\89¸2Í\93ý\1d$¿\9bäß¡(ç\13\8a2»)*\ f\14%\ 3\9d\12`Ò8\ e¦z¥\90\1e d\1e±\b¥E!Ê;\fqÞó\91L\ f\ 6\9b\1e\b.}6D\8c\0È\183¡e|\ 4\93Ï4Ø|üàòñE\1ds262'a\aq\88\bê\10/È¢h\10²èÈf3 å2¡Ìñ\85\1fª¢ (\¡\90ÖGAòi,Ä;\12 <\90\ 4As
+ø§R\91u\96\rÞÅtð:3À½ÆAæÝLd>Í\ 4ç\r\ 5y\ 3\ f\99ï\ 5à\f
+\91ùJ\f®'ÿï J¦C\9aÊ\80\82Ã\84\v­Ö\1f\1aK\10T\15aPÔ-\82´!\ e\92ÆD\88\9bX\10\1eK\85à/lðÏd\80ßÎAV'ɺÆ\ 5ï.\ fÜgÄ Ivg\91|\9e\9b\ fÞ[\11xýbd=\93x\ 6\17ä\914d'Ñ¡`1 IgB'ö\83^\1d\0\9d9\18Úòp¨\97GCñI<¤Û\92\9f
+ñÑt\88Nf@x&\13\82v.\ 4\9dYàwg!ë>\1f\ 2ð\86\b·\0ä\19\16\83ß/\81ày\ e\84ÿ\91Bä ´¤\83\82t\90&xC\9dÈ\80.\8d  £À\ f&E\0\8c\86\10èí\v\91[\e\ 3õÚD(¶¦@¶\87\8d\9c/8ÈnáBÜ\96\ 5Ñ\ 5>\84\9dB\b»E\10<\10\81ÿ\92¤¾\13\16\8f\88!îÏ\81ø\99\fÙ\8fä\90ÜQx\86Ü /(#hPÆy#o1\ 3&\16\13\16\9e\1f\8a¤\ 1°èBPP\14\ 1CU\1còê\93 ù4\rÊ\9d\1cÈ\ fò =ÎGÎ×BH¾\15#»3\eâë\12\88\1e\92Óö\91\93\rKG³ÝÒ×Rä<U@ö@   ù¿U\90ßÐx\86¼@/¨\17Ò \8dö\861\86\ ek\ 2\13ö\f?8²\ 3\86 Ø\1c\81ÂòÅ0­`A¿!\1dÚí\¨\9a\ 4P4\8b o\95@z>\a9ßË é&'}HNõJ1&\19Q\ eÈÆ\14O\94nÕ=µ[}KûAÝ\9d\vÍÕ<Ï #\1d\83\e\96(:ìqLT°}á\12ùÃ¥
+A¹1\ 2ö\92Å(ªI\81y\r\a\86-|èv\8b\91{8\a\9a\16\19Tg\14P^R¹\15WÕï\15¿hÞÊ\9fk\ 6\14ï4OÔïµw´£yÿÌ\eÓý¨wë:ó?è.\e<C>Ù)´á4\98½a#*¢}P\9b2\ 5Ëø3±L\1e\8c\1a}\ 4*\8b\16ÃQ\99\8a\92ºÌ\ fÖ\ 6áhA£dÄÐ$\7f§?¦\1aÒµjÞä\9eÏ}­íÌëÓÜÔõj\9eèz´oõ¿æ\8d\18ºõï\8dW\f£¦Ë¦QÓ\85\82Qã9³g0\90\9d"7\8c\ 6Ë\ 2\1aÊ\16x£&\8a\81ºäÉXÅ\9b\81UÒ@|\9c\e\8ee渱jGÊ°s)w°t\9dèuñVé+Ëne¯ù°ö©±E×c8\93ÿ8ÿ²á\91¾Ûx_ÿØø³~° Ëð®ðï¦aK»yØr®pØÒf\19.lµ\8e\98=\81\91\93|\eÙ{]Ä\8a\b:Ö&NÄ'\9céØ\90=\aëÕ¡#«\8d1\83+m¬WµU\99Ï]õ¢\9eò\8d²GöFÍýâ&Ý\1dK³ñ_æ¯
+n\17´[n\9a®Z¯\9b\1e\14ýd\1a(î0\ fÙÎ[\ 6mmEC¶SÅCÅ-¶·Å_\96¼³z\ 2Ól/\18çyÁA¾\8b\1a²o®"÷ñ\87øñØ\94î\87-ÂY#\9b\14ó\ 6\1aô\8bz×Y\92þ[ïäü¶|¹è×%ëå·+¶æÞpì2\+9TøcqKÑ?¬gK:-ßÛ;,·J/Y_8þZ4àhµ\r8NØ\aJ\8f\95¾±\1f)\1d,9ä\18²y\82\ 2ÒÁL~#\9cd\1e+È·±.\94\86ͱLlK\9d2ÚÈ\9f9Ð(\rêý£váãÍ\ 5\8bïmp°o¯ª\11]_±JùSM\83î\8ak{A\87s_Ñ%ÇQû\ 5{kÙ7%í㶮\8a\92\9e\8a\93ö¾\8afG\9fópY\7fù\81ò×eMÎ\ 1Ç>ç\e»'( »¦\95d»È¾WOz4Ì£a[4\ 3;Y\13\87öp§½Ø\9b=ëñnÕü»\8d\86\98[\9bmì®\r\95Õ+\94\1d+×ëÛ\97n)ü¦z§ítåAG«³¥âdÙ9×\89²+ÕÍe¿U\7fá|YõyÅ+׾ʾ\8aÝ®~ç.×ë²\1d®\ 1\87'0\93\1dÓFfQCö½5¤Ï&2\93\1d\91Þï÷%\8eï?\901åÉAá\8c\a\ad\81·÷袻¶[Ó~Øì\14ýmC­êü\9aÕù§?Þh9µ|{É\89ÚýåǪ\9b]\87]mK\ e¸:j\9a\¿Ôî­ê]²³úEõ\9f\96¼tm_ÒW±í\7fl\97y8Õy\eÆ\9f³8\96\90¥\90H%C¥E¡S\89²f_Ë\96¥\1c\87ã88\8b­9v!\8c5d\17¡l!\15\91Ò´\10ÕôÖeFi\9a\9dìK4ÓLóÌï\9d÷ýóüñùû¾¯ûþ^ßë¹Ã\17XYá\8bA¢@\1fÂ\ 3\83Ðæ\11»3A\85\84\99êÄîü\82²Z¾\976]M\97ú©ÖDî»j+µ§¥.;\1f\14ø\1cìÍf\9a\879´&G»7Æ%úÖÆ\9egTF\15².ò«8\17¸MÜ<îm^\ e÷\ 5?\9b7ÅÍäO\87gðg9éü9v:\7f>$\8d·\10,
+ô%t\83\94I\18Il¾\14bóæ¨\92þ¾¨I^¬Ö¥NÔï\17\7f{å ô\8b:\8b\8d\8f+\9d\97xÑo\14\ 4\98·f\87:4¤\vÜkR\84¾e i\8c"anH^lYXVt\ 3/#ê¦à\Ô\88 5ú=/%z*"9z&,9j649j>$)j\81%\8a\7f=°Ö\930æ¿{\8bÈ"_\85ô©B\834{Y\9büS\93.u´E\7fÍp£\99ê@­Ãöî
+\ fÃk%§Í\1aóYö5_qO\96fÄú\16\9eKf|\95\94\1d\92\91P\12\9e\12w\99\97 ¼.\88\13\ eF
+ã&ùBá\14WøåLxÜÙYN\ì\1c;.v\81%
+ô#<°ÿ¿{Ï+\ 2\16­\87\95\1aUÒäÕͤ·íÛHß´ï\93zÔrL¥¯ÁNûú¥\93\ 6M\15~ÇjK\82ìÊ
+ÂO\14æDûdg%2Ò22YIç\8aÂ\84)\97xÑÉí\82Èä\87\91\82\94       ~dÒ\147*a:<:~\96\13\13\8e\11.°D\81þD\ faD\ 6ñr\80Ùò\80¥ò°xY\11~nS\82Ñ\9bj¤á®½\12\ 3í&Ê·\9amµZ\eÜö_¾äs´¢2ÐæÂÅP×ì"\81wZ~Ü\99\84\9côàØì\ 2\8e ³\8a\e\91Ñ*àd\f\b\7fá\87§Oq#RgÂy)³\1c\1c[\90¸À\12\ 5\9e&<påH\98,\v\98'\v+\952ðóUi\18»!\rÏ{Táa÷nñÞ®#ë;Ú­5\e\9b]ôª\1a½\8d\8bë\ 2\8eçT\87\95ó<\13.\9eõ\8f)Jeò
+sC9ù\15ᬼ&\1e\9f\1f\98ÿ#/8g:"$s&,4c6\94\93\ eK]`\89\ 2\ 3\88·\10)K¼\ 5\19øýÂ\1a\18¯\95\80\92ð¼[
+\86î(Ãݾ\9d´\e=\87\15\9boZm¹Ôá´çb«çáܦÓ\96é\rÁ\8e      u\11î151¾¼ª$\ 6»<\9bÅ,+å\9c\12îWÚ\17á[ú.Ü¿x&, \7f\96ÃÌ\99c\a\87°Î/\ 4\8b\ 2\83\88\1e\ 13¥à]\19\15^6\88ÃH\87\ 4\95\80\81û\8aÐ}_\87Úv\97.Wßg¾©¼ÛA7ÿ\86;=£Ã×4±\8di\eÓÌqå^\8dòb7&ø\aÖg2üëJ\82½ë\1aØ\9eu·C=êÆÙ\9e5sìSeó!~Å\v¬Ó\ 5\8bÁ\ 1¹\8bLQ \9bè!^\12\16ó¨0ZE\81\91&\1a<è¢A\7f¿\18t\ fÊAûà6Jã#\ 3\99ʯM7\16Þ³Óɼã¶?éö)ãØ[\f\r\ 3ûºÀ\8dÑ\11ïå×~ÞÏëZñ\99\93\81®m=L\97ko\ 2]\9a\97\98'./1=ª\97\98^åË\81§J\96\19¢À\b\19ÀT*¼-\ 6xVG\81\amTè½E\85®ûbÐöT\1a\1a\9fm&W=Õ\93*\1a6VÊ\1a´ÖL~ä²ûì×^tÞÀ\99£ì{!V\8c~¾½ï\1d¡«g_\86»[o\91·So½\8fCo\8f¯}ß\e\1fÛ\9e\8f~\ e\1d«þÎM«þ®õ«þ'.\89\86\98!0\9d\rð²\1càÑ\152ôv\90¡³\97\fM\8fiPûR
+*GUIE£º´ìW\87äSþc©~ö\eGmÞ3\ f½\90§þtÆp°\89ï\13\9e\85Ç\13¡µÛP\86½ãP\91³ÝP½«ÍP\8f\9bõ\93qW«Á\8f'\8eßûËæûOO»Î?½\1cZ?\89\ 4\13\0Æ\v\ 1\9eÔ\ 2ôµ\90 \83Ø~WîQ z\98\ 6Åck ÿ\87\8d¤Ìwº´äw\aec¿7Sæ¾µß\1c2~R'à\8dß\1e\9f×A\ 6\1ecÜC®c_\1a;\8ee\98Ú\8e\15[\1c\1fk°²|}û¸Å\9b7Væß}°6}\89öæCèhq\1f\9d¬zÑE\14¿e\ 2<'2¸Û\bÐÙ\ eÐØ\v\88\ 2\85/h\905%\vç&5Èñ\93»hQ\93tÙ°ÉcJÌ     \eu¿     \17MÏ     ïí'&\18»\9c&8zv\131\ 6Ö\13©tËÉüCf\935FGßw\1a\9bL\r\e\e\e\1fù\rM\8eü\80¦&ߢùÑgh)\8aQ"\83\au\0]-\84þM\80ò\ 1\80¼\11\8dÑ qI\ 1b\974ÈÜ¥\9d´\90%Cé\80e\13\ 5\9fe+\15÷eGu\97e÷-ö\1fü·Y\7f`éX~àï0]\89ße²\92µÇhµTïÐêÕýô\8fýú\86¿ÿh`¸ò\87\81Á2ê\1f\98\83¿"]\14\83U\0\12ùw\12úw\0r\a\ 1R^\ 1ÄN\8a\ 3ÿ/\ 5\12û³:\99ñY\9bêû·\9e\84Çß\87e\ÑL\9e\98\fë­ÑUÅ\82\8ea\80º1\86j\1cƨ-\a0YS\1fó´öaµö^l×Ù\8d\83ÛwáÔ\ e\7fÙó\87hz\1a\0\9aÚ\88ü{\0r\1e\ 2\0\88ü\1e\80óI\12\ 2Q\9eä\8bªdwÔ¤¸ ®\98\1dê\8b\1fG#)34\976A;Y#t\95££·\82\ 1\ 6¬Û\87¡J{0ZY\17S7lÇBUm¬UÓÂ.õm8²I\13g7mÅÏ\1a[\11EÒÒ\fPIt\90{\1f ñ\19\0\7f\1c è=\80\1fÒÀ\ 3\19×\93lQ\9dl\89_P\8eá.ª\11\1a\88ÑÑ\88¦\8f¦âzh-±\e\9d$w¢»\94\ eúIi!KZ\13\ 52\9b\89\8f_\1d\vÖnÄZ9Uì\94ß\80\83
+*ø«¢2~Z'\8aêëDÿw ý\11\0Þk\0Æ/\0\1e+@h\93À\ 6×\80\91\8cQ\99t\107\91õQ\8b¼\17u)º¸\8fª\83\16\1a\8bmEs1\r´\11SCg\9a*zÒ\941@|\1d\86\89+ PB\ e³%Öb\85\84,¶HÊb¯¤\f¾\14I~\1f\91ÿ\10¡ÿíÿôݦ\ 1l\11\bm\80#H\85\ 3(\rz\84\ f]T"é \1ai\en%oFm²\1aê\92\1eE        \r)\8ahD\91GSÊZ´¦Ê 3u\rzQ%\91I¥!_\8c\82IbÄq(FÂ\7fØ®³¨¦ï<
\81 ¢VÇ\ 5渶(.\80\10\96@\b\10 Á\ 4B\80\0       dO\b      \9bD\b\ 2\ 1\81\82\14A\ 5FT8\8a\15+xÐvpkÑ:îV;­­z´U{´J\1dF­`Y\83ÞùMû&<|\9eïÍïûÏÃÝGtN
+Üå¶\b£QÁbØ\81Í´\ 3\1e\1c\9e\ 38   3ÁVÏCXÖ|°\8a\16#Èâ\8c\80\1d.`ì]\ 1ÿOWÁï¨+üN¸\83~n5|¯\11w<àóÌ\13\84Õ\13Þø\v\9d`Àã\1d\13\9e£A \r\ 5O\ 4\9eË_\1dBý¨\b'=¸Áöà®q\0/n&¸Êyàd,@Ø\86%`mY\8a ºå`îY\85\80\83n`\1cu\a£Û\ 3þg=áw\8d\ 6¿»4Ð{½@\1fð\82ï¸7|I\ 3:¼H¾\17\ 2á5\1a\fï?BHÃI \82t`{RÁñ¥"\82n\a\1e\ 3¢bf\81/s\ 4/m!Âó?\ 2Ûì\82\90OV"x·\e\82\ e¬F`\87'\98ÿ¤!à,ɹê\rÆ\1d\1f0z}áßOX     Ò\82A\ 4Ág,\ 4ô7¡ð{É\86_\1fg"D.³\ 5Ç\83
+\9e\17\15QÞv\88ñ·Gl\88\ 3\84üY\88MtBtÊ"ðs\9dÁ+]\81ð*W\845¬Fh+\r!\87½À:æ\ 3Öi_\ 4_¤#è;?\ 4=öGÐ+b\84À\9f¬¡ð\1fà à¿á`>ã\82ù\987\11ø¤Ã\1aÒ\81O\b\90à3\ 5â@\a$ñfA\9cà\84\ 4õb\b³\96"ºh%ø[W\83WG\ 3·Ù\eámtp:ýÀéf\80}6\0\99\bû\99è\vDØ \81@+\eÌþ5\b\ 3ëq$X?ñ\11r'j"D\91­Éu§"Ö\95
\9b\1d¤\9eS g8@\15>\v\13dòÅHJ[\ 6Q¾+âÊ<\11³Í\e\82\ 6:ø­\fD¶3\11q,\10¼ÓÁà]b\81û\ 3k\9cû,d\84;\102È{Çêç!´\97\ fö\ 3\ 18?D\83s3\16\9cë\93\80ÀÙ\16üU¶HXA\85\8cP»ÛAK\9f
+}Ø,è\ 4NÐ&-\86\ 5òunH2Ñ ²Ð\11_Çx+l\ e´Æ´\ 5\8fEw\84\8c\bºÃ\86\ 5çØ\83Q7ÙýQ\8f9/\ 5¯9}\82ñð§\ 2pïÅ\80w3\ e\11\11q>\ 1\11ç&\81\18Ò!\86ü?\93È{¨ÉÖÔ¯²ÃZ\1f{d±>@V¤#Ö\8a\16A¯rAr\86»UUà=,7û\ f\ 5\ e$6°^\8bZÂ^%´s^Ä\1f\17÷%÷¹ð*·7î!ïqÜ+ÞC¡\95\7f;\ e\12 8/\86àËD\bN&AÐ-\99\b±d_Æ\93\87¶Ð\11\99ä-Ö\91\ 5Î@\1ew.\fÂ\85ÖlÙ²Át½[¿ÞàýR[Âø\8fª"¸WQ\17öT¶;ü±¤\8dûKRgÄ\ 3ñIþO¢\8b\82»¢{\82\17Ñ7Åc±\97\13\91 î\84\14qÇe\10\1e\95#¶C1\11\84$WLh\16Ùb-\91»\8c
+#¹G\91ÿ4\14³g\8f\16    æ\ f\18\13\9d_\184®¿egy?Y»\81ñH_κ\9f¼\8ds[½+â\96²%êßòö\98\e²ãÂkÒ\9eø+\92o\13.J{\13ÎI\87E§e\10\1fW@Ü©\82è°\1a¢\83j$´©\11ÿ>Ä\91|)ÉÖ\91\9d\91³À\16\ 5ä6¦UT\94ùN\1d-gÍì7G8õ\95Æ/yZ¤\ùÐ\98N»³n}À÷\99%¡7Ò,Ü«ºíQ\97´ÿ\88=¯Ù\1f\7fVÝ!þJy2é´ò²ä\84ò\17É\17ª7Ò£ê·ÒvÍ[É\ 1í»¤V-\12÷¥@¼g\12\88_Bî°À\ 6idg¬'=\8a\97ØÀ¼Üö­\856åM%sz_eø\9c_-Ñ\v~6K]n\99t^7
+r\98\97\r\85ìó9æ\88\9e\8cªèÓé;âOè÷\8a?O9$éÒ\1e\97w&\7f­8\92|[Ù®ý]Ù\962¦hÑ[åͩ㲦ԷÒÆ´wI\r\93ø³\83\9adg\92\9dQ@zlZh\ 3ËR\9bájwêËZ¿©OkCf>¨áÿýVE¢Ëu³\86v¡$\83Ù³!\8f}*¯$ò\8b\KlWv­¨#£Ir8}¿ü`Z§j\7fê\19Mkê·\9a½©}\9aÝé#ê\86µ£ª\9d\19VE}Ƹ|{Æ[)!y\1fD\8bm\90ìHî@6oñ<\el&}ª\96Ø\fÔ­°ým\97\97Ý£Fæ´\1fëyNßÔ$,»P¡¤}U\9eÆì.Íå\1c+*âw\14\98\85\87ÖW\89\ fäî\94¶dïS6g\1dÖ4e\9eÐ6d\KÙ\99Ù«­Ë\1aN®Í\1eQ×d\8fªªs¬\8aª\9cqYUöDH$¿[G²\r\94Î¥ Â\912V»\80òr×G6O\9a]mï5Ó\1dn6\86;^ª\17.í©\91{vWè\ 2º6g³?Ûhä·\996
+[
++\12\9b\8dÛe\8dy»U;\f\9fjks?×Õ¬»¨¯Î}¢ûØ0\94Ri\18N®0\8cª-\861åV\83U¾Õ0.{\1f$óm\90JÞ \9flÞ²Ù\14TÍ¡\fîp¤<ß½\80ò°ÕÙæV«ÏÔ«{ØóÎ5Æ8\9f¬\97xtÕh\ 3\ eWf°\ flYÏßWf\126\95nIÜY\#¯-lTW\17ìO©0vé·ä\7f\9dZn|\94Z^0¨3\17\fiÍÆ\11M\99qTU\96?¦(Ë·Êß\a\19yûµ³ÿ¿{)ØL|2\8bÒß8\9bòkË\1cÊÝ\83\8b(7\ exÙ_h\r\9d{¦Yðáñ\86ÄÕGêÕ\8c\9aô°½\1fçF6Z
+\85õåæÄ\9a²*yeéNõfSkʦâÎÔ\92â\9e4Sñý´bÓ\1f:Sñ\90ÖT4¢1\15\8eªL\eÆ\14¦\rÖ      ßa&É.&»×ò\ 1å÷ú\19\94\87{¦Sî·Í |ß>\9f\90Ç\94³m¬ÙÝ­ü%\9dÍ"·\83\8dJ¿};ô¡\8dµÙ\11uÕÆØêÊ\8db\8b¥BfÞ\¯.1ïM),û,Õ¸éLZ^Ù\8fÄ\80>\7fÓ\90ÖX:¬)(\19U\15\98Æ\94\eLVÅû &ßB\ eÙ\9c¥3(CUÓÈ沧Üi\99F¹uh:å\9b\ e'Ê¿\8e¸Û\9dj\ fú[W[Ä¢öÖx×Ö=rzSS
+«nW&·º./fk­I´iÛViqU­ÊXÙ¬5XÚõ9\96S©Y\96ï\88׺\9c-CÚuåÃ\1a\83yTeØ4¦\¿Ñªø\1fÛu\1aÕä\99Å\ 1üæMBX\ 4E\10A\b«\84\90\0aIX\12Ö\ 4E@0\80\10\ 4\ 4\ 5qW\1cëz\94\8e\15
+R\14\8aE\ 1APAܵEÜ\97#n=3Óv
+cÇNUÔ\9e\1e\8b\9fg¦g¾À|ø\9dó~zþ÷yî}?ÜÑ\90Ãf¡À\94Í\821=Ûŧo\ f\béA­\88î4\1aÓµV+ºØâÁok\ e2?Ö\10mW{$QRYkð+;\94£.þb\91î\93\8a\82¸Â}ëõë˶¤­ÞS\9c±¢´"{qIÝüü\92Óyy%÷\98×óówöç,Úñ>{IÑ@ÖÒm\83\19˶\ e\8d\81\6\87«Eô~\e\9f¾ÛÃÑ\83*!Ý®3¢®ãFt¹m\ 2u´Må\8e\9fT\99Õµh'\1fl\9aéöy}ªOqÝÜàOjó#\v«\97Ǭ;¸&aÕ\17\85)Ë*>K_X¾?+wÿá\9c\9c}móæî»Íôådï}\9f=\7f×@V^ñ`æ\82O\872òw\fÍ\19\r\vY\1fÖóéÙ§D\8f÷ñèN\8d\80®6\bèâ        \ 1u\9c1§Ö³.ÜÑ3þ&Õí\11\93ö\9f\8csÞÕ\92"/jÊT\16\85®;ºT·ªnuÜÒÃ\9bfå×î\98=¯¦,=³úËÌôê\93sÓªo2/³\fU\83\99\19å\83\19YeCs²w\ f§ç\94\ e\eFÃRÖ\87ÍDßï"º_IÔUǧ\vM\1cµ·óèø%Sª¿,æÕ\R\18U\\bµ,=\17ã°½CïQØ>ÇwÝ©yÁ\ 5'\16G,iY5-¯yc\vSѬ\8cc{\93S\ekR\93\eN\18\92\1ao\18ô\r/\fú£Ã\86\94/?\18R«>¤\19*FÒÒËGRGC\81\80\9eo#zTFt£\9aèb=\8fÚØî×t\96G_]\15Ò¡k¶TÞ%\13\94^\r1ßþM´má\95D\97µ\97Òd+/dû/>¿08÷ìÊð¹g6èÒ;¶ÅÌ>½'^\7fº:1¡½U\1f\7fúº>¾ý\85\14\92f6#9ñ(\92õ\87\91\9cT\83¤Ñ°\8eè\87\9dDw\ e\10\8a¨½\89è\18Û½j/qTyÃ\88ÊîM¤\92{î\Ñ]¥ÉæÛ\91\13×Þ\8a³_q3ÅmÑõ,Ùük\v|³ºV\ 4\1a®®S§\Ý\1a1«s·6¾³zÚ\8cÎÖé1\9d×\99\17Ó£¯ vÚyÄÅ´#>¶\ 5\9aÇúåÏD\ f÷\12]­!êh`÷?ÁòÏ\11Utr´ë®\88\8a\9e\9aÓ\96§\8e¼\8dO}\84«\9f\84\8e[þ8Æ:ÿ\91Þ>çá\1c\97\8c\87¹\1e©Ý˼\92º×ú&<ت\8c}°;hú\83ê\90èîV\8d¶û\86F×ýB\1dyÿCxø]DFvA\eu\19:íyD\8föÃgD7Ù\1c\9c«#jnfù§\89ʯ\10\95ÜâÓ\96\87"ÚÐkNkzż\95½rþâ\9e ãù=Z\8b¬\9e\ 4kCO\9a]JO\8exVÏ\12×ø\9e\8fÜcz>\96\94ȵ=UÞ\11½Í\8að\7ft2ÿT\84þ8è\17òw(Cþ\8a@u7\82\102ÚýÏ\89\12µ4\12\1d>Åò/\12í¼Nôñ\ 3\8eÖüÍ\88V¾´¤Å/\1dy¹/eü¹¯TF\86W\11fɯf\8cOx\95d\15×\97a3½/ÏN×·Â!²o\83cØëí.ê×ûÜ\82ßÔM\r|{F¢úõ\91Dùæ7\89ò\15$þ/!õÿ\19ò\80\9fà5Zç!¢\93õDul\ e+X\ fvv\11\15Þ'úÓ_\88\16=7¢Üß-)«_Ì3ô{pÉý~\82\84÷j£\19\ 3Z\93è\81x³¨ÁÙ\16á\83Y\134Cù\13\83\87
+¬UC\9b\87wÚú~¨´óùÐdï5òµ\83\1cÏIJáA±l\10bY?\1c\18ñhí¬\aGX\ f\ e\9c\9dD\9bî\12\15|K\94÷#Qæ;#JÅ\ 4ÒÃ\8e\17\ f7n:¼øZ(\ 5á\b\15ª¡3
+B¼H\89\14c?d\9aø`\81©\1c\ 5ã¤Øl.A\89ÅT\1c\9aà\8aVK\17\\9fè\8c\9c0lå\bü_õÇ\88\7fPü5Ë¿C´ò)Ñ<\96?ûg¢D\b(\16\16¤\835E@ÌSÃ\9d\v\84\17ç\8f\0¾\ 2\1cQ\ 2)f\bÜ1Kè
+\83Ð\19ó\8cÄX.\9a\82\8d"[\14\eÛà ñ$´\98X£ËÄ
\98÷\fLG«b3Pr\99hó-¢\15O\88rz\88\92\9e\13ż#\8a\ 2Q(L(\88½\85?&ñ|X\1d2¸ñ$ðä¹BÁ9AÅ9@ÃÙAË·A,ß
+I|KdðÇc¡À\1ck\ 4fØ.0E\85Ð\ 4\8dBc\9c\17\8aÐÍ<\e£ô\ 2ëÿM\96ÿø\8f|=»¿¶\8fHÍòU\8c\ 2\1cÉ`J\12\8c'Wö\1e\8e\98Â\9b\ 2'\9e\r«Å
+RÞ\ 4xó,\10À\e\87\10Î\14Q\9c\b±\1c[\1a9B6³\9cÙÌ'\942ÕÌq¦c\f\84°=/À\9f\83JÉGp £\11 P'D@¢\b~\99&P,6\87÷:KÈ\8b¬áYf\ 3Ï\83\90\1e±\83´e
\1döð¸â\0\8f\131<~bÞ8Âc\80Áÿ\88!eäìÛ\e\8a± f5(ý8\ 4ûñ¡auhB\ 4PG     \11\14/\82\14\ 1ù\16ðûh"\14['Á{÷dxWÚÁë°=¼\9a\1c ocg_t\84ü\9a\13äÝN\90õ:CÖÇô3pf¹ÿá\ 4/F\ 1\97a?¸ö\a\8c\ 5\8d\84½\81/\a\8d\82C8«#"P\80ð0!Bg\88 I5CHîx\ 4\15XAU8\19\ 1Åvð/·\87_\8d\18¾\r\8eð=á\ 4ß³ÎP|ã\ 2Å]6"ß3/Ü xÇ\8c0ì|ßÿr\e
+\80û;\15Üß\ 6A2\1aBY\r\1c"¼8è¼ù\88ö\17@\17"\84n\9a\bÚd3DæL@ø²IÐl°EÈv{\ 4íuDP\953\ 2ë\ jv\85ªÝ\rÊKS¡¼á\ eå\13æ¹\ 4Ê_\99!     Xæ\88
+\92Á@H\7f\v\86ç+5<\9f\87B6\1aÂÜ9\84ÉX¾\94C\8c'\1f±Þ\ 2Ä\ 5
+\11\17ÅÆ+a\1cb2,1m\91\r´k¦ r\8b\18á»\9c\11\8aÐ\9a©ÐÔK iõ\80ú¬\14êNæ¾'Ô½\9e#ê×\9e\ 1Ï~\r<\7fWCþV\ 3ï\7f\85Á§7\ 2>ßE\8d\85pVCÔ¿É.ó ¦Ï4\8e¿á\10Y¨EjE­Ö\ 3­( \ 2\8a\b"A\bäø%¿\9c\9c\ 1\ 3\ 4\12      \10®\84#@¸\12\90#rÈ\r\ 2\11A(Ð"H\15êM׫­X­³VG+VW\97ÑZë]Ýgß\9dý/ûÇgæýïûÌó|gÞùà]Ð×\9a\ 1\81ß$\9e\83ïi  ¼\9dVÀcØ\ 2\19j\ fD\9c\ 30\95Ë!D³
+hzG\b¬[\a»ÚÖC\80q\ 3\ 4\fnü@=âü\9eú­Ë_þ\17\ßøßr}A\9ds}F}íú\84
+nsþàþ[\0
+\ 4Ï«Aày9øÿ\ 1*Φ9â|ìºüÕf\10ú\859D¸Y@\84\8f\15D\ 4ÛB(Ï\1e\84ÑK\80\97´âß\1cÕê÷Dñº·Ì*§×\8c\97!\9d.\7f\86ômz\1e<âö\8cvlóï´i÷'´kî\8f\82\1f¹?\b~å1K\83­w\83ÀëZ\bl»D\aïi&x\9fbÁ6S À\91\ 2\8c\95\14àaç\v[n\ 6b<\8fÄÅ\1c$^ó@\12`\ 3\85\1f¢Â\97¼      \97®x!JsüC\90¿þ)Wï<GÖnzÌnÝüO¢Çã\ 11èy\9f5¾e\96uz믬+[o±\1ezýÌ|á}\95   >?2aÇ4\ 1;N°aÇ1\12v\8c\93àk
+ìZC\ 1\ 2ç\8b°o\89\97\1eï#ÑÉ\1cä\1e\96 ÷³~\97H·{\11/px*Ù½â_Ñ
\87\91j§Ù°b×»¢ªÍ·\ 5û=oò:½~æöy_#¿ò\99!§|\7fä\Üq\99¼çw\9e|¾ó\1c        ÔÓ$\ 4\83\80Q>P\87\ 5@\1d\14\82¿)\10\8cwÀÅÙ\11Øuâ°sÉW`ßÀ÷Qn2\7f«ô¶ú#5hÁ\9c\82óé\ 3yÔò»R\99ã/\92ô\8d×£5n3Qº-ß\87\e¼/\86\9e\17uûM\v\aüÏ
\ 3N    Îî:!¸\11x\ð$hBð\816&\ 4ÚP(\ 4õ\87APo8\ 4ö\84Ã.S\80\8e3\ 5\8b)\10mO\81ÄE\14HÁód¬¦ü¥Ú`ö\íiùX½Óf6\93i\7fK\19¶ì'E\9cã\ f²dç\vRµût¬vÛé\98½¾'Äõ;'£Ú\ 2¾\89è\r:\1a>\12|$l*äë°\1fèÃá\8fè\83áï\18ý\11\89\ 4zg\14\84´\8b!¸U\f4S\80µ\f÷\0»V,ö\f\85=v\8dÅØû\96S^jÖRæ
+\Íg\v·[ÝÔ\ 4Ûͨ\ 5Ë.¦Ç¬=\97"w9\99\94î9)ÓxOHKý\8eÄU\a|%i¤\rÅt\85\fD\ f0ûÄ\13¬^ñyÂ(\9eewE¿&:b\80\rÌF      0\1a$@¯\93@\88)ÀÁ=\88Ä®%ÅΩÄs¨?Aï\v\1cÐïÅ\9fS~+[ov«l\8båLqàÇ\17òÉ¥gr"\1d§2¥.GÓR<G\93Õ>ÃIZÿ\ 1YEà¡\84º\10c|;³+î\10»#v\94l\95\9cá6Kns\ecÿ$\eâ\80S\e\ f\84A
+¬j)0«¤@7\ 5¸ø\ eb\9c-Ç®\93\81çȳC¯\8aíÑc½\ 3ºS¹\8aòSåf\8b\8b\823%ì¥\93\ 5a\8eã¹±.#ª¤-\ 3\19\19>½J\rµ;¹,¨3©\86Þ*o&\1ae=d}â0¯6á\ 4ß\90p]P\9dø\8cW%\ 3n\85\f8år ôr`édÀ0\ 5ø¸\ 3»q¶Â\ 6\81Ê\16½-ü\b=Ó-@÷«ìÐ\8d}ËÐ÷\86M\16çªü>\9a*g.\19/\15­\19.\8cqî×È<\8dÙJ\9fά\1cjkF\11­Q¹\97Q\97ÒÀ®I>À­L\1a\14\94'\1d\17ê\92®\bË\14O\ 5¥ÉÀ+I\ 6²X\ 1ì"\ 5\10\18¦) Ä]\8cµE\90ú7ô!Ç\1a=*\99\8fnïµFÿØg\83f\1a\1cÐß\e\9cÍOÖúÚNTÓ\1dF*ø«ûËÄÎ=ERÏ\8eü\14\9fæ\\15µ>»\80fPé\99\95\19µ\1c}z;¯DÙ/Ô*'D\ 5ÊË¡ùÊ9a~\1að5iÀÕ(\81\83akR\81e
+\84-D\10\8f}/Í
+=Ë·D·u\96èzõ|\9co\8d.5-Bg\9a7\98\1fß¿Ýf´6xñ@\rw\95qoäÆ\ e]\9cGSIÒö:m\86\7fu~\1e­<¯\94Y\9aSÃѪ[x\1aU¯0'k,T\9du!T\95õH¤R}\10¨²\80§Ê\ 4R\9d\ 1lu:\10¦@\ 4îB¢\15\82L\vtOKA7*,Ð\95Úy8\7f>\9an³G߶\7fa6Þ²Íz¨1hQo\1dge§!Ì©©Râ^[.÷®*Kó×\97ä\ 4\15k\8b\19\ 5\ 5\1cM\13/+Ï(LÏ\1d\rUæ~\17\9a\9a÷P\94\9a÷^ Ì\ 5^Z6\90éj`§«\800\ 5¢p\17öX WÙØù°wÎT\99£\8b\r\96hºu\1e:yÀ\ eMt­5\eéÜ2¿¯-à\93®&bEK\83h}]m\8c[UMÂ6]e\8a_Q\85*P£+¤«K+\88\8c\92\ 6njQ·@¡\1d\11ɵgCeÚû"yÑ;Á\9eBüÛä\ 3©Ð\0;9\17\b\ 6w!\99\82\1eæ!tC\8fÐå}fhºÙ\ 2\9dì´@Ç\8c\vÐèÁÕ\94\ 1£\87UO\97ÿÂÖ\ eægõ­\82uUMbW]CüVm\9dÂ7Ï\90\19 ªÎ\ fN«Ô±\14\15u¤¬¼\93\ f  ãô§D±ú{ÂXý[~|\19p\13\8a\81\ 2[V\b\84)\10\8b» Dè×B¼\83½\bw\90\82\9b£c=fh´Ï\ 6\r\1eþ\9cr°ßͲý\90ßÇû\8dô¥Õ]¼5º\8e\bgm[¬GnË\9eíY\8déþÊ\86Ü ¤úRzB­\81\88Ý×NÆ\18\ 6ùQ\86\13üHÃ\1d~TÍ\e®¸
+àHt@Ä\96\ 2Ë\14\90\97Y\bý\82ïpÙ\80p\a±{\1e  ÑC\b\r|i\85\ e\ e/C\1dC.\16\8d_úØÖ\1c¦-Ö÷\91+µ½aN¹ÆÝn\99Ý\89[S\ e¤úÊ;²©ñmÅ´Ý­Õ\8c¨\96V"¬ù0GÔ<E
+\9bos\84M¯8¢ýÀ\ e¯\ 5\ 6XQ\95À4\ 5ä\b=ÈEèj9Bßa÷\9cÂî7jÄù\ 3ÿõO3Ô>ö)j\1cs23\1cñ²Ö\7f½Ë^;B|\963$tÌ\18\14oL>,u\97õ'{Å\1dRùF÷j©\11\a+\ 3EÆæ\10^O?\83ì\99dr\8c7\19\9cî\97\fN\170¸­Àà7\ 1]X\ f!¦@*Bw´\b]ªAèd\vBcÝ\b\röãü\91ÿù_ݤ\1dª\9et¤è\8e{Ì+<¶sAö\ 4Ã!ý(ÿsÅXäº\84#qÎ\92ѤÍQÿa»N£\9a:Ó8\80?÷&l
+\91°C \81\ 4\b\ 4³\90\90\16\ 2aI\90°)Te´Z=z¬Smµ:í±g\jí\1cÇj­=\1d\8e¶.Å\ e¶ÐZ7\16w\8b\82ÖÁ:V2Ö±. \94©VD¨\vú\9f×±ý Î\87ß¹÷Óý?ïó>÷ÃóÕkÆÊ/\97¦\96\9báªÿÐZT_ksÔ7å\146¸m\ 5\9f\ fæäïDna-r\9d[\90;~Óóú\16\11\9dc³x|\ 3ÑþÍD_|J´íó§ûßÚ\16\8eÞ>êKË\8e\9bÇÔ\82EG->¯\1c±\8bç\1cv\85Í8T)ýÃÁ©\8a\17\ eÌN\98в@]Úò¦n|ó;)\8eæ\8dæüæÚT{s£%·¹35§q0Ͷ\ f\19¶ÝÈÌm@¦½îyW\96\12µ³\1e´Ô\105°;ØþdÿdûßÚ&¢\95GyúS»\17-<\1dDó¿\8dçæ\9e6zÌ<m\1d\94Ó\7fò©\8a\90Êöê\88²ö\99²â¶W\14ζ7âóÛV%æ¶}0ÖÖö©ÆÚÖ¨ÍjïÔf\9d\1cÔe|\ 3CÚq\18Ó\ fÁ\94Ñ\bóHß±\1e\1cÙHôõ'Dµì\ ej¾dùû\89V\1c&ZrR@\7fìð¢\99\9d~4Ã\1dEÓÜj~²Û"¬tçù\94»Kü\î\17ÄÎÎéÁù\9d/\87åv.\96dw®\94fº7D§»·Ç¤ýk¿Ürñ{¹åÂ\1d\85ù<\94¦sHLù\ eI¦SP\8fÔº\8eh\1f»\83¿³ÿ`S=Ñ{l\ 6V\1c"ZÌvÐ\97;x\9a\8b&u\89¨ª+\92\12¹\92.£ ¨;Ë£ »ÐËÞ]>Êvc\8a\8dYcÒo,\b°ô¼\15dîY\13bìÙ\14jèm\b×ÿt"\ßÛ\17\9eÜý8\Û\85HM\17¤êk\88\1e©\99ÝÁÎíD\9bÙ\f¬ÛÃò\ f²ü\13Ds;\88¦^ ª¸,¤ÒÛþ4þ¶\84\1c·ã¹¼~\1do»c\11dÞÉ\11¦\r8=Æ\rTx\99îV{\eîÎöÑ\r.\1c­\19\æ;vh½H5´mL¯ûý\95÷.\88\95CwÅñ\ 3\10Ç÷C\1c×\8fÀ\91ê·\12ma3ð>\9bÁ\95\a\88^gùsX~µ\9b¨ôG¢Â[BÊ\e\16\91íQ(e>\8e¡´Ç*Î\f\ 3\9f\ 2\v¯\83\86C\90\84ra\ 2¦xÄa\96\87\1c¯yFc\85\97\f\1fxGa\87w$\ exKpÍ'\ 2÷\19ø\84ÿ\1fÛØ\fl`3øvËoùg\89&_$*¾B\94ÓM\94ù\90#\v\84@ÒCBZ(( *.\ 1É\,Ì\\f²x\19òøH\14óá¨\12\84`\86 \10ó\ 5\ 1X&\14c\83Ð\1f\9f    Çà \87\bW\98!\ 6ÏÙÈfpU3ë\7f+Ñl\96\a¢¢«DÖ\1e\0±\"\r¼H\ 5\11ų:\14\88 \19¢I\82x
+C\12\17\f=\17\80q\9c\9c\b\ 5\9c/Ê8\1f\9e\98Ë\v±\94ç±\8eç°\9d'ìcÎ\b\b??g5û\a\97|óÛùÿMä¼ÎÎþ\13˾Eì¼Är\89b\98(xS\ 4ü(\ 4b
+D\bù³ZD\90ÑhÄ\92\ fTä \1dñ¬/Äj!8\98\89ÌKÌ"f5SÃìdZ\9e\ 3m\12\87$=\ fm2\ f]
+{¦
+\90\94-\80²H\bE\95\abfy"z¡\17¤Ë} ];\1aÒ\8f|!Ýê\ai\9d\bүƠª\91\8f¨ÓÌ\ fbDõ2w\98a1¤xÂÿ\7fdì]\86\0Ä \10ò\11\9eÔ ÑñÐky\18X\1dz\93\0ÚLVG¡\a\12'zB9Ã\vq\v¼\11ûÖh(þâ\vÅF\11ä\1f\8f\81|\87?äõbÈ÷2\a\ 3 ?É\9cgßìfn3\ f\9e~_Ár\9f
+B,\82\1fÇ#dXù,èT\1c\92Õ<\8c\95ìiÒ\v\90b\11@o÷\80¶Ì\13êi^\18;o\14Toø"q\95\b       ëý\91P#F¶\0(w\ 6B¹+\bÊ&æx0\94\1dÌUæ&s/\18  ø]\b\94\b\1dNDØP\12Âï\8e}\16\92\139¤0©  <ÒT<Ò5<,¬\17©6\ f\98]\9e0Nñ\86aÎh$¿.\82n¹?´\7f\r\80æàh>\ e\86zG\bÔõÌÞP¨\ f\85A}\8a¹Äô1\83a\8f4\b{ÀÜW#\82\89\1cÐ"òf2¢úôÏ\82\81å\8f\8bç\90\11ËÁ\1aÇ#;\91\87Í @v¦\a²\1c\9eȨôAÚK¾H\9d?\ 6æ¥\ 1\ e\82q}\b\8c5¡HÙ\16\8e\94ºp\18vEÀÐ,\81¡UòÈðOÉ\ 3Ã\rɯ)\ 3\92\ 1ãcI\7f
+¢n\e »e@t\8f      1WÍ\88¹<îY0*Y¾\9c\83-\9aC\1eSÀêph\ 5\b\91\9fç  {\99\ fr¦ú!{®\18Y\8b\83\90±<ôqú\9aðáô\8d\11\ fÓ6GÞO«\8dºg©\97\ eYöI\a-Gd\ 3\96\7fÈn[®Ëþ\93Ö/ëµ<\8a¹a\81¢Ë\82¸«\8c;\1dñg3\10\7f&óYHeçÏ\96\97pp2.VO)\9b\8dR\93\10®lO\14\8d÷\81s\92h¸pVÀ½üWC\ 6íKÃ\a\91ôÛÖGýbû\9bìföÖè\9f³ëbú¬_Ë{­\aä=ÖS\8a®ì\1f\15\7f\89½d\1dVº­H<\9f\ 5U\87\15ª\93\8eå@ud\ 4¤³³ÛÙÞë\feÙÌD\19\87*%\8fªd\ 1*Ó=\86'\14ø\f\95U\88î\94¼\18x«x^h_Ñ\12I\8fc¹´»pMôµ\82\8dò+ù\9bc/ç×Æ]Êk\88¿hoRºí'\12ÎÛ/%väÝR\9d¶?T·Ù¡iµC{$\ fÚæ\ 2\16B³g\ 4X£8\14²\9d³$\90å\a\11¦°^LUp\986\96\7f0Õ,\1c¨¶yß\9cäòë©\9a\12xmâì°Ëå¯F^,]\1a}Áµ*ö\ñ{ʳã?J<S´%é´³NÝîØ­9é8¬mu\9cÕ\1dsöê\ e:ïé\9b\1d04:aØ]\ 4CÃx\18v\16C_7\ 2rX\ f\8a\ 2        \15\99\12@x1\940SÊ=\9c¥äîÌJ\16ôÍÌð¼>Ã1úÒ´Ê\80﫧\87\9f\9d4OömåbEÛ\84?+[+ÞM:Vö¾æHi\8dîPÉv}\8b«>¥ÉÕdÜïj3íq]3írÝ57\94\17Ìg¥0o/\83iK9\8c\9f\8c\80<Öÿ\92ÿr]\9eQMgy\18þ%D\8a
+*2\ 3¢\8e2XP\ 4¤H\80\84T\ 2A\11\11¤\e\ 2D\12 \89@(¡\84\12\ 2¡\86Þ\94\0¢ A\ 1ÇB\19Ç6\12\9d\99=»ã\8aíìì\ e\96³sfçìκ»Þ½\1c¿\80\1f\9eÏïÿÜ÷½÷ü\1fì{\11¦\80b\97\9d\v\7f\16øMbCx-µ'¾\94\90I?&sÖ>\12\ 5\9bß\17ÄXß\8eMÜ9\e#ÛsãdÞþkQ¥\8e\93\11\13áÍn\97B»ÝÇN\fy\8¡ó\1a \99£\f\85\9c\vµ?\14QûB\11¥+\f\87#ÏÖpä\81\ 4ùãó\ fÁ®u\12»N\ 2þ\ eñ\ 6x\9f²\19ÞʶÀ«\f\9fÒ]\f\16ÒX&w¤ÇÌg\93£¬¿\12\9d²\99<%Ý«\8bÏ:0Æ/<8\1aSî6|²\9e¬\8dnó:\e9@í\8b¼Hë\89¸Aï\8axÌh\8f|K×D~ ·F!ZS4¢ª£\11¥.\1ay}
+
+Àç\1f¶|\ 6&\80\12×âüõð\8ft3øI¾   \9eäl\ 5}\8e\8e\9cfr+ãȦéÔ0k\9d4Öf,9ÉnD$sÐ&äº\f\bJÜ{ãj<»b\9b©í1=ôVÞ\b³\997Åjä=`×ó~f×Åü\97YËG\8cj>¢Uñ\91w\ 5\1fQ1\94\95 Àå\1e°k   \8cà½Ä\10þ\96n\b\8bÙÆð$o\1d<.°\84»\ 5öÄ\19\ 5Åx:\87»érVÈ\96Q\19ÏF\9b\e\90\9evìI\96»v$\16\92
+Js\82\9a¦\16t0kãµì\9a¸ NeÜ\1dNEüO\1cUü{¶J\80\ 2Ä(\11 Z±\0¿0\ 2D]  
\0\bïÀ\0Þ¦\10ái\96\ 1ü 0\82ÇE&p¿Ø\ 2æJì\88×\94\9e\ 2ß\8d£yÇ·\fÊ£lú2\ 4v\9d2±£&%ݵIª «Å¥\943ɵôªD\rK%\1að)\15^òU
+çý
+\85
+E¿s
+\12\11\eÃÌ\17!ºB\84h\18ï\95 `¼\ 5\9e\ 1ü/ à¥\f{o.\11\16
+×Àý\12c¸­2\87ëå{\bWTî\86\17\e´E\81V}\8a\88\9d\1d9±{[äI\ e\r\19©®µ²\1crUª\92ª:]M/\91\v%}\1c\85ø¢_®ø\167[¼ÈÍ\96üÓ7[\82\12Ä\92\8b\11C\9e\8c_ÛdD[  :\81·È\aøU\ 2°\98\85½7\9f\b÷JHðu¹!ܪÚ\b\93\84ñ*·5Ã\15L³þ²\0ËNeè\8e\96Â\98=j\85С&ç´K\85<\8b\\9aYH)ʨ +d\rìì´nßÌÔQnzÊ\rÿ´Ô\1f1¿ù¥¥!\1fY*bÉR\10Sv\1aÑ1´\95 0¼\85x\80¿¦\0ü\11{ç·J\ 2Ü.7\80[Õ$\98®5\83Ëõ;      çë\9c×\9c­¡\9bvU\1dþ¼¥<ä\vuéÉÝÕÊS\aT\85bçâüt÷\82<\ 5%7GEÏ\92׳dY\9d\9c\94Ìa®$ó\9a¿8ó\a̯~âLÄ\91d"¶4\1d1¥2Dÿ\14\14\89·\90\0ð
+÷ðX\ 1\14;O\15\11¦ë\88 kX\ f£MÛa°Ñ\89Ô­¦®ÓÔq-Ô5Ç·UWFíR\95ÇïW\96%\1dT\14§\1dÊVæze\14\96ÐRókY\12E;')Oë'Ì\9dâ\9eÊ{\84ùÅ/!\ fù\bs\11[\94\8d\98\89Y\88þ)(\9a\ 4ÿJúØÃÃ"ì\9d\15Øûj\ 1&\1a  p¡Õ\ 4´\1akèÕ\1c0hkñZÛÐÄ1¯i8f­ª\vÿ²è\fß.¯Zä\98U\99â*+\97{HË\94Ô¤Òj\86°¸\95\1d¯<ç\e«¼ê\17£|\88ù»/_\89|b\v\11+.\1f1ãó\10]\90»\1a\14\ 3°$Å[Ä=ÜÅgp³\ 6{W#vÏV\80Á\ e\12ôvYB{×>bc'Ù¸¦\9d½Q¥9jUÔ\12º#·\89·'³!á@j½ÄYR\9bé.:Sà%¨®¤ñ«\9a\99'+\a|¢*'8\11\95\ f8\11\15ï|"*\10;R\85\98Ñ%\88ÁS"\1a¯h5Ë[øK\1a\80¾àã\19\ 1Æq¾¶\ 3 \eû\8ff`34\ eì&\9céw3Tõ1L\8bz\ e\7f\96Ó\15²-£#Ê6¥-Þ.Y\93ì(l\91¹Ä5+ȼ&\95WdC#-¬¡\8f\11¢¾Ì\fn¸Ç
+V¿a\ 6×#Fp\1d¢\87V#ZX\ 5þ+*_Í¿E\1f{¸W\ 2\f\80®\19`\18ç÷ö\ 2´`ÿ©\eÞ\0Õ#6\84²á\83¤Â!êÚl­\9fyú¹ +é@Ä\17\89ý±»Nõ\89öñ{S\1d£»s\»JÝC:Õ\9eA\9d=\94À\8e\80Î;Þ\ 1\1d¯©\ 1m\88\1a AÔ£Í\88zL\8d(Au«y\83\1eoq¾\12`\12w0\8aý³¿\a í\1c@-vвñu ¼´\15\14\97ì\89òq\ f£´1¶©øâQ\vá\85Ð-q£¼/xç\13l#GNï\r\1d\96Û\1f\1f*v:ª­s9¬í>ÄÕ\8e¹ûi¿q÷\1d\rç\9cý@æ\f ²o/"s;\11Ù¿}5¯2\0¿G\0×ëp\a\1a\80\0\1dg\ 1ê\97ó±\ 3æN\91 kÚ\ 2dÓ»        ÒiWRâ\14ÝX0åo\163\19¼9êj\94UØÕømÁWÄ;\ 3'2w\1d\99(ÚËÕÕîçèº\ e°t\17\1d\98ºÛ\8e\92\ 3\83\13}\f9Ó. \17Æ\10ra\ e®æ\ fø\fæª\0®´\0\fu\ 1t\r\04\8c\0\94ã|Å$@êM\ 3H\9c3\ 3áüv\10Ì;\10bæ=IQó>Æas\81ë\83çÂ7\1e\9bå[\1c\99M²äΦ[sf
+¶³fjvÒg:¾ô\9e¹`K\9dýÚ\96:³dëuóÃ\1e\8fëÈ\8eü\15Úç1\85ö{\Eö+¹W\86w¸ÜA'Þ@?@\13ίXÎ\9f\ 2H»         ¼m\0Ñ\ f\8c!üáf\b\85\90\ 5\17\ 2Íà¨\9e»Æ_\1flì«\8f^ÇÖ'\981ô)\eiú¼Í\14}åg\9eú6K²þ¼\95û£y+wýÏVn\ fÿ³Õå\ 1Úî|\1fí8x\ fÙ8Ý]ÍMÜÁØò\ 6ð\1dh\19\ 6¨\1a\aÈ_ο\85ó¿Á\ eú-\11\82¾3\ 2¿'ëÁ÷©\15p\9eî\ 5\9fÅC\ 4æ"\83H\7fvÄÀûY(Éë9ßÐãy\92Ñ¡çY&®/J×9¿hZïôrÐÔñåu3\87W/Ì\1c\9eý¾Á~\11\99ï\7f\8a,ö=A\9fÛ}\82ny\ 3ø\ e´á;P\8dó\v\96óg\0\12î\ 2D.\0\ 4~\ fàóg\12Ð\97LÁ{É\12(¯mÁóµ#¸¿ñ ¸½a\11\9cß\1e!:½\v5pxÇ7ø?Ùõ\19\15Õ\99Æ\ 1ü¹Sa\8620À\0Â\f\fÌÐf\18`Fª\1a°P¤\88\ 5"JQ,X"q%±\9eUc       jtí\1eE±¬=¢Á.Y{ÔuíÆ\12\8fƵG\17"\18%(
+þ÷!çä\1cØýð;ï\9dOÿç}î}ï\9d'´~¬$¸~²ÔØ0Ofh¨\90\a¼Ú#×ÿv^®\7fõRîÿ+äþu°ó«\83BW\ve{;ø\f¬ÝF´è;¢\19mù§\88\86\1ax\8d(ã6QÒ}¢Ø§D\9d\9b\1cÈúÖ\8d"Þj)ü]\10\855GPps¬`|\9f(\ 4|H\13ü?ô\13´-\ 5"\9fÖÑ"ïÖ)bÏ\8fß\885X/vÇ~\89\enHÜ>6JÔ-\10«ß³æ\8e\f.ÞC4\93ó'\9cæü\8bD¹¼÷´»DÝ\1e\10Ù8?¼\91(\f
+
+\86\8a\fÐ\90\1e:ÒÁH>0\13\ fZ¤A\17rCOÁ\15Y\82
+y\82\13J\ 4\aL\12\94X R`\83È\1e\aEv¸%\92£\91áÿ,ÝM4\8bóËÚò/qþ-¢TÞ{Âc¢\88çDAõD\ 1 ò\83\843\1d\85<àAjt"\17ø\93\13\82È\11á¤@4ÉÑ\8d$H%þ\93Î\8a\ 5B\19+g\95l\1f»ÀjÙ\9b\ eæðùû\82û?¢-ÿ\ eQ
+ï=î\19\91¹\96³9ߧ\95È\93kpg.\\873\94\9céDö\\8b\fî$\867çù1#\vg1,\89e²|Æ/AÌb|ø±\83}Ï~è\0\81\16\ 1\ 6\16Ì\82"\ 5\ 4F\8bà×M\ 4ï414¹b¸\ f\17C=A\ 2×\19l\ 1[Á*¥pݪdpÝϾg?È ¾"\87ú\ 1«cM\fmd\7fpãk7Øñµ\1dÜaß\81!\@\88Y@\98\89µ][E\bL\10A\97,\86o\7f1:\r\95À«T\ 2Í4V.\85f)«\90\89í\94CSÍ\ eÛAsÒ\ e\9e\17Ø=ö\825²V;xáOöL\ 1O(áý?\8c\9co
+\11\10\1e\12*Àl\11!$F\84 \1eb\ 4f\8b¡/\90Ào\8c\14ÚIl¶\fÚErhW±õvÐnµ\87\8aígG\15Ð\9ec7Ø3ö\9b\ 2º\16ÅG\1d\14­:([tphÑÂ\91W§·þ\1d!\94s-F\ 1Q\81\ 2¬\ 6^ùw¤M\ 4Ë'b\98\bÍ\93 x¤\14Æ        2\18¦Ëa\98o\aÃ2î_\85\ 2\86MJ\18v(\11\80À#\ e0\9cbW\1caxäØbhpl6¾wh2Âñw#\9c\e\rP1\97×F¸¾\fê\bá\9c\v\88ñ\13\10ç/ \96ë\88ã^Äòýè\9c"\86u\80\14\91Ce°\8c\93#|\8a=Ìs\140/r\80i\95#L\95l«S«©Ê¹ÅtÀù\83é\98s³é_ª&Ó}Õ\eó¯Î\ræwÎ/Íp­3Á­Ö\ 4÷ÿ\98àñÌ\f\8f\87á\1d!*\80s}\ 5té$ \eKäz\92Âxåg³[w1\7fñ¥\88Ë\97!v\94]kt\99òCçé\ eï:Ïszk[êü»m\8dê\8dm£Ëkë\ e×WÖj×\ 6k\8dºÞzV]gûIýÜVëúÄöÖí\91\r\9a\7f[áõ³\15Þ÷ØM\e¼¯tî\bÑ:Î÷â\\ fBO\96¢\15\90\16$ 5J\84ä®bôL\93¾ï\9e+oJ,¶\7fýI©CC×)Î/»ÌVÕvYèú"a\85úyÂ:·g [Ü\9fÄïv\7f\1c\7fÈãaÂi\8f\a        ?zÜMx¡¹\19ßä}-\1e>\97㡽È.ÄCw&\ 1º\93] m\ fqm{w'ôâ\99¯·\9a\90åEÈæ^d\9b\84Ö¬\18QSz\ fÉ«´ly]j\81âyòhÇ'½¾P=ì9]}¿G¹û½îK4w\92V{ÞJÜèu#qg§ë\89û|®&\1eó½\9cxÉ÷BÒSí¹ÄF¿Ó\89Ð\9fHDÀ1ö\ fv(  \ 1û»Cß\1eºjxÿmù<oe«ø\15ÇõäúRk®Qx\93\13)Ôõï*~Ö/]ö { ânÖ0§\9b\19¥êk½'{\NûÊëbê\82NçS\96ù\9eK©Ð\9dIÞì\7f:¹J\7f²×á\80ã½Î\ 6\1eíõsà\91äW\86\83É\bÚǪÙ\1eöm
+\8cÛS;B¢\e!\95ó³\94\84\1c^ó¸\9e|\ fj,ÐQm~¨ðxp\8cèî dé\8f\9föW^Ê)T\9dï?ÊýLß    ^§²§ù\1cï3Gw4s¡¾&seàá\8cJãÁôíAûÓ÷\86ìí}"ô»Þ×C«ÒëÂv¦·\98¶¥ó\93\9b\81°Í\19\bÝ\90\89ÐÊL\84´\87\1e\9c\99Îó^\7f; ®£Ð\91\9a\87¨¨n¨\a=*ö§ÛÅ\91Â\95¡IÒ\7f\16e)Oçç¹\1c\e4\S3p\§C¹\13uûs¦ë«û\97\eöô[\1c¼«ïêÐ\9dÙ\7f7mÏ®2oíScÙÜç¢ecö/\96õÙÍ\11ë²a©è\8bðÕ}a^Õ\ f¦\15ý\10Ö\1e\92¹ÿYöÜ\7f)},\94QC±\9c\9e\8fPÐÓ\91Nt»Ä\8b.\8f2\vgKºJO\8cè­¬\19\96ãz`H\91¦ºp´OUþ_üw\ e\9a\1a¸-oVð\96\81ß\84mÊ]aÞ\90SiY\97³#²bÀ\ 1ëê\ 1g­«\ 6<²-Ïi².ËAÔÒ\D.ÎEÄ¢\\84\14æö\90Æýï+å\1e\bTϳÆ\83\12\19#£[c\15ty\9c;\9d-\r\11\8e\8f\8b\93\1c\1e\9b¢Ü;ª\9fKÕÈ|Ï\1dÃGøn)\1e§ß4äKãúÂé!k\v¾6¯Î_lY9hMÔò¼-¶%yÕÑ\7fË;\19½0ï^Ì\82¼7Ñó\aÁ6o0¬å\83\11ùõ`DÌ\1d\fK{\7fÜ\aþÔ~àyë1Ï\9d
+tµTJ\97ÆÛѹ      ®t¼Ì(\1c.\8b\96ì\1dßS±«´\8f˶±y\9e\9bF\ fõ­,\19£_3bBЪaSC\97\17Ï\ e_2da䢢\95\ 5\85\e£Ë\vwÇÎ-8\1a7»àfܬÂW±_\15!zf\11lÌ:£\b\91Ó\8b\10Ñ\1e2Ûî\ 3QýP\9euxî¼þ9ÿ×/\13ÓÙ/etr¢\8a\8eL\ e ½\93­â]\13\93ì·\96e¨6\8cÏÕ¬--ò]õY\89\98Ï\83\16\8f\9a\14¶°d\86\88yQs\87/ë<kXeÌÌâoãþZ\\13?­øjÂÔâú¸©Ã\10Ë¢§\f\83\8dEM)Fd{è#ç³@ôËp¢\9f>#ºTFtf\92\88NL\91\7fÉ®ó¨¨î+\ eà÷ÍÀ( \ 3\ 4\10\86\86}f\18ö\10\91Ê\12\17DTD\14DY\87a\1f\ 4\ 6\18Ve\13P\16Y\94M\81* X´\ 2&F«\8c¶±M0.5\8d9îÑ´1iÐh\92\93ÛKsÚ\ 3í\1f\9fóæ\1føÎïÞûÞ¼[Ä\853r\v\18\95\8f\17\ 5ªõî\r×îÊ\8f2hËÝnÚ\92½Ûª1Sb_\9b\91ǯ\96ÈÝ*Òª=ËR\9b\94nïÂäa_YÒ9¿¼¤\8fýs\93¿öËMFïÜ\14ô""ú,ÈMBÏÅ0Rå߯\1a\ f\9bË\ 2PÒÞ÷Q\11Àt   \v&ËVÀX¹)\f\97»²úÊü\97w\95¬Ñj+\8a\Ù¼w\9bI½l\97å¾¼T»Ê\9cl~Yv\91\9b<³Òs¯´Q\94\9fqØ;GrÜ/+}Ò_\9a~Ý?#ý¹_\86ä\17\9f\f  \8a¥\12\14IÓQ(MCÏÅ0
+`~'Àý4\80\eT\83?PþL)í<å\0ã\95j0Rm\ 4\ 3Õ|Vw\95ﲶ\8a\10nsÙzýº\92­Æ5Å;-Ê\v\93mK
+2\9d\8ad\ 5®²<\85gnn½(3§Ý[\92\9b\9auÆ?%kÖ?9ë\99_röÏ>)Ù(NÉBQj&
+S¥(Xla\16¾¦ûá®\94ö^ªÁÅ\12Ú;éÕë4í>#û80Pk\0=u\8eL{­\98Ó¼/xE}õZÝê\8ah\9eB\11g./Ûc³·$Ã1¯8ß%«¨Ô#£p¿0µ U\9c$ë÷M\94\9döK\90]ñO\90=¡ëO>»d(NÌGQb.
+wç `1ÜJ³\90D}È\ 6¸ºP\ 3:ÿ\99}\0'iÿ\eh`AÏ\ 1=èh²cZ\ e\b\e\824ªëÂu\14û£\f\8bkbMeÕ\89V9\95iöÒ\8a\1c~\9a¢Ø-¹¬F\90XÚâ\15_rÔ'N>î\e+¿ä\17+\7f\1f½·\17£8®\18E;
+Q¸³\0\ 5\8býB³ð`¡\ fù4\aÔ\83s5Ô\83zÚ{\ eÐÞÑ\ 2ÐvH\a\9a\98úC\1eìê\83\ 1je-¡ZEM\91\ec\8c³\eâ-$u)¶)µY\8e»÷\15º$ÔTzÄU7      ·Uõxm©\1cõ\8e®¼è\13]ùÀ;ºâ­xs\ 5\8a6\97£pk\19
+bJÐs±\97ñ\0\9fS\1f\94\v5¨¤\1aPþH3@/í ­ô*ÜØÉ\85Ú.3¨êre\95vú.+ì\bÑÌk_§\9bÙ¶Ù0íÐ\ eÓ¤\83{,wµdØíh\92\1e(wÙÒØ辩¡K\10ÙpB´¾á\ 3r_´¾þ\aáú:\14l¨EÏÈ\1aôØXµÔ\vz.ÍÑ,^.£\1aì\a\18¥ü\81V\80ô\ 3\0Tõª\83¢\8f\aò~G¦ ÏK5§÷=õ\8c£\11Z)G¢ôv÷Äòâ»\13M·w¥[ní̳\8d>\ê\18ÙQç¼®ý°kDû\88{xû\ 5\8f°ö¿¹\87µ¾v\ f;\84îa\aÑ=¼\19Ý"\1a\97z\98NϤB\80\v4\83\13M\0C\94ßÝ       Ðr\ 4 f\0 h\88\r²a]È\1d±\ 1é\88';m$\80³gx\8dFÂÐ\ 6­¸ã[õb\8eÅ\eF\ f¦\98l\1cÌ6_7 ·\8eèßo\17Úßî\10Ò7ä´º\7f\9a\1fÜ\7fÏ)¸÷\15\7fÕ\11ä¯êAçUÝ輺\ 3ù\8bÝÉ¡ûQA5h\08Aù½\94ßz\14 v\10 \94V\92\ 3ÓNs!eÂ\14öL83     \13Þì¸ÓÁ\9c\98Óï«G\9fÚÄÝx*NgÝø\1eý\88ñLÃбBã\90±\1a³U£m\16ï\8e\1e·
+\1c\9b²\ e\18»k\15\95µÿoÑÖo\18íü\86ȱ¥>^\98\ 3êÁøAê\ 1åwP~Ã1Ú?O\0ä\9f\ 2H\9d\ 4Ø1Å\81Øi=\88\99±\81Í3\1eLÔL\0{ÃÌ\1aÕµ3\e\96\85OǨ¯\99Þ¥¹zZ¢ýÞt\81nàT\95¾ÿÔ!\ 3\9f©ACï©ßóÄÓ·yâóóF¢sh"\9cD3ÁïÐ\p\ 6-\16»Ds8Ió?Dýï¦ü¦ã´\7f\9e\ 4\90M\0¤\9f\ 3Øy\ 1`Ó%6¼\7fU\13"®ò lÖ\ 1BgE\10¢\fb\82\95áì e\94J 2\8eã§L^î£ÌU\17+\15+\84ÊfMOe?×ãÚY-÷k7µÜgçµ]¯ ®ËeÔw¾\84\1f¡Ábç\e©\a\1d\0G)¿\85ò«F\ 1ö\9e¡ü)\80ø\8b\94O+aø5\16\ 4ÝX\ 6¾s\ð\993\ 6ï\9b\ e ¾)\ 2¯Ï\82@x+\82\11Ü\8af<ndzÜnKØ.w\8aTøwëU\9dî\1eQuøë\ 4ÇþÞ\r\8eý\9d\97\1c»ÏPÍv\ e5l>Å\15Ö\9f æbãtÿõÑüµRýk(¿\90j/\99¡üË\94?\v\10ú'\80ÀO\0D·TÀå\vup~ \vü\87æàøÈ     \1c\1e\8bÀþñ»`÷$\1cl\9eF\83õÓ\ 4Æò\99\94±xVÊ2ûª\99eúü\18Ëøù\ 5\96Ñ\8b\87,£§?³xO\90Í{\8c*\86\8fPu±AÊo§üý\94_t\96ò? ú_\ 1\88ú#À\9a?\ 3øß\ 4ð¼\aàô%\80í7j`ý­\ eX~Ç\ 3óï¬Àô\9f|0þ^\b¼ù@0\98\ f\ 5ýW\eA÷õNxçµ\94ÑùAÁh¿ie´Þ\9e`¸ogÉ?\18Í×ÈhÎ\93ï\97ê¤ù¯§|9åg|Hùtö\8d7\0\0\ 2¸Ý\a°{\b\ 2Àä'\ eð\90\v\ 6¨\vzh\ 4ï %h£\ 3\1d\a40\18Ôp\1d\87X\ 5%ÀB\ 50H\85Æ1B\87Âo þ\9fF\9a¿\12Ê\97Rïã¯Q>Õ=ø\ e\80ø\v \9a\ 3X=\ 5àQ¾þ[ L Ìå\94É\85\15¨Cy+)Ï\ 4ØhEÿË\89\bH\0       #[\b½\14\0`\e¡\83¢\92|E~\BAùY\94\9fp\9dò©îÁ\9f\1f\08R¶ÙBö7\94û\ 6(\17è\9c\0Ë\89
+rèoÕ   \97è\10}bL¬ \9fx\91`B/\ 6H\ f\a\0ÒÍ\87Cä<ùË\12hâÆ \853\83\96ÄÌ\95A#\ 1\83\f\86AÍM,ÔH`¡Z&)&5¤\99t\92>2LÆÈ$¹À ÚUò)}~D^\92·\fªã\7f°þK\ 3ÙK\98»0híÈ \r±¢]×Ì\9dACoú\1eÁ\fêl`¡ö\ e\16rÓI\ 1©$\8d¤\8d\1c!ÇÈ      2A¦È%r\83|IþNÞ\10ü\95\16eýJ\ 5µÿ\87µ\13\83vv\f:Ø2hO»®õÂ÷ Z\18\a1È[ËÂ\95ÛX¨\97ÌBÝ\RJjÙ¨ÛB:       ÕBw\98®ãä,ù\90\'÷þÅu}GEugq\0¿S\1dF\10\85A\10\86"3À\0\8f\ 1u\f
+DÊ\ 6PA\ 5d¨2\94¡30\80\f ½\8a\80"\8a\ 6\ 4ÅB\14\ 45êZ\12Wc\8bî\9a\11=\96hbY\8d-ñæb\ e'\9cýãsÞûýuß»÷÷Îû}9(zÀy'ú\8dóV\84\9c×&ïq_\99 \8fðÿßûúN\94q\19\e\1a%]e´v ^Hi\1e¶óØh­d£e\12\e-r8hQÂAó:²\8a¬'\9b¹hÞÃE\8bÝä\0\19"§¹¿[|Ë}mq\8fûBü\9cûL\8c¼§bä?\11ã¸Ç\96( z\8fŨ÷ë\18ïëË-\ 1Ý,\88\98Ø\12Ú\erw\16ýÕØ(\ve£}\1c\a¥\19\1c\94è¨o\95Üw\92\15Ü?$kxo%\1d¼7\92­¼W\92\1dü\97\92½ü\17\92Cüç\92\13ügÒ\8bü_¥wø?Û=ãß·{'¸+Eá\1d;\1c\7fÛ\ eõoKQ\7f\98Ü\92¢Á(\94[Ñ'e\ 68s21\ 1\9cEÏ3\8bfâNóPx³pz\10\e]£8oåÉÜW.Zî\v¦\84÷?¦\96ÿ\94\7f̬\e÷\v³Yð\88é\11üÌô \1e0\a\ 5÷\98/õî2çõ\86]\86\ 57\\9e
+¿gÞéÿÛ\ 5'\eÐð
+\83\13/\93\8bä\82Ëßpú\14@w\11 Ç$@/#@oZûP/æÐ^õ\9aÍzãáÏ~>+\8cóÄ]Å}ôA&ïÁÌ\ 2þÝ\99\15\82;\8a\ 6Á°¢Uï'E\87ð\86b\8bð\87\19;ÆÿwÆ>ýë3\ eë_\9bqÖà\8aâ¦Á\ 5Å\13Ã\7f)þ0úJ\81Ƨ\15(:©@\93\933Ðä8]\8fÑz\14~@ïîI¹w\8e\ 1\86\80\ 1ô<\ 14\93\0{øí£é¬Ç~Þ¬\a\9c;ÞÑÜ\9bs\92ùß\7f¨\15\÷Z&¼êU£\7fÙ³Ùà¢g\9bá7\1e\e'\9eóødÒY\8f>£¯=\ 6\8cÏxüÓø\94Ç5ÑqÏ\87&G<Þ\9a\81f\87<pÊ \19 û\ 3\9e\7f\f\9c=òî#õ)óÍ¥ì\19\13l\ 2/\82­áá|'¸3Ï\9dõã¼\0öµÀÅÜK\ 1ñ\82óþ\19ãÏ~´ÔàÌ?Ê&\9eô«3:á·Òø\98ïz\93£¾\9d\93\ fûô\9a\ eùì3ûÜçÈ\94A\9fóæ\a\9a÷û¾\14ïñEË>²Ë\17Å#z}Ñbû\18ø!Õô\e©Ï\ 3\0\f\19\ f¯C\ráa\88   ÜZd\ 3×C¦ÁÅ\10_öÙE\v\16Æè\1d\ fN68\1a\94=qh~¡ñ¡y\15&\ 3s\eL\ f\ 6®\9e²?°Ý¢?`«xOÀn«>ÿAë]þg¬w\ 4üd³-à¹Mw\0\12\886]\7f±Þ\14\88V\eÇ@\1fêA\0å½`\80Wal¸¯äÂ-¥\0\86\95\ 6pM9\ 5ÎG2p:Ò\8b},b>\7f\14\ e.\8e\9fp ,ݨ?$ÏäÓEËÌv/¬6ß¹ Ér{ðZë\9eàÍ6ÝA½¶[\82öK:\83\8eK7\ 5]·Û\10ôÄîã`\94®'ë\82\16\8c¶k\16àÔ±ÐOø×/&\94²\ eýf~\8ceÁµ%<¸\12«\aç\96\88à¤J\ 6GT³Ø\83q\ 1üý±¡Â=ѱ\86»¢\92\8d{#4¦=Ê\ 2ó­áå\96]\8bë­7\85µØn\bm\97\87tÛ¯\ fÙã°6ä\88lMÈ%YKÈ#ÙªÐw\ eÍ¡hOì\9aÂPÚ\18\86\92\15c ÿ8Ú\ 3\0O\94\07c\ 1¾¥¼q>\91\ 3_'òádâ$8\9c,\85\81d\ 5»_íÇÛ\9d¸P¸=>Ò°;.AÔµ$ÝlSl®EGt±Õú¨ê©m\91MÒÖ\88\16e\97¬Y¹Ë©1ü\90sCø9çzå\ 3ç:åïNµ\11(#\ e5\11hW\1d\81Ò±0\90\ 3¸\bà\1ee¾ï¨þ7É\0gRYp"\95\v\87S'Àg\196°7c\1a{gº7¯'u¾pKJ¸áFu\9c¨=1Ŭ-![ܪÒY·Ä\95Û6/Yn·"¶UV\1f³Ñ©6º\97©\8aþÌ¥2ú+yyô]\97²\987Li\f:\95Æ¢\8c8н}I\fÚ\8d\1a\99ÃÛ0\80Û\94ù®¨)o¥Sæ£Ì1\94Å\86\81,\ 3Ø\9bm        ;sä¬\9el/^gÖ\á\86ÌPÃué1¢ÖÔ$³U)\99â&u¾MCR\89¤.±Ö¾:a¥cE|»s©ªÇe\99j¿kQÜ)W\9dj\98¼vÑÅ£3q$2\9d
+íÇ\1a\9dÃ\8dxêA\1ae\r\r\9dõµ\0\ 3¹\0ýZ!ìÌ3\87\9e|gVgþlnG®¿^[΢     «³£DÍY  f\r\19iâºt­MuZ\91¤<µÊ¾$¹É±H½\8eÑ©»åùIý®¹I'Ü´I7ÝrÔ/åZ52Ä\89È´Iè0\16.\0x82\aêÁÙL\80cTû\10e¿}\ 5\0»
+ÆAO¡)t\15ÉX\1d\85îÜ6\9d\9f eið\84Æ<¥q}n\9cYuN\8a¸"[c]ª)\90\14g\96Û\17d48楯erÒºä\9a´OÝ2Ó¾\9c\96\91ö\83[FÚ\vyF\1a2Ä)3\r\1d3SQF\1cFa\bí\85\91½\98
+p:\87z@õ\ f\16\ 1ôQþÛVÌ\81Î\12\11t\94Ú±ÚJ\15\9c\96\12\9fq\8dÅó\rê
+\17\eUébMË\96&Y\14çgZëòòmóµ¥öÚ\9czGMv+\93¡Ù,OÕìvKÖ\1c\99¦Ö|ç¦Ö<wUkÐ%Y\83ÎÉYè\98\92\89²±þ ãÖm\9aÃ\ 5\9dÈ£\1ePýþR\80\1då\949HGÅ$h«²\85\96ªiìÆÊ9üºò¹ú\95\93JK¢'\17-K0_Z\94n¥-Ì\9dªÑ\15Ûe\14ÔÈR\97¶8«ó7Ê\13òvºªò\86Üâò®\92grU\1e2ª\t\8eÏEÇ\ 4\12rþötd/$QîÍ\ 68ª£\1ePý>Ê\9f\9fÔPýjÊ=µ\86°ªÞ\1aVÔËÙµu\9e¼\8aZ\7faIõBC]U\84(¯Re\96S\9e*Î,˶I+-\94¨Kª\1c\12\965;Å\15w01E½ò¨¢Ï]#\8b.\93§ò¨Bd\88\ e\1dc
+PF\1c\12\rð\9f\919P\ f¾ £g?Õï­\ 3è\Nõ\e\0\9a\1aõay\93\ 5Ô4;³Ê\9bfq\8b\eý\ 4\ 5+\82\r´\ráF\9aúØÉéujóäÚ,«Ä\9a\82©qÕåÒ\98ªFYdåÇNÊ\8amLXÅ KhÅ\ 5\97ÐòÇLX9:\87\95¡ãâR\94\85\97 ÃX÷U\0\97è[<^H¹\93\8eá}õ\0Ý\8d\0íÍ\0\8d\94\ 3kW\v ¢Õ\14J×8°
+×(8ù­ÞüìÕóÆg´\84\1a¦¬\8a6NZ\99`ªjN·\88\93ðz\81\8a²NÃ\0þü?f`\98\81af\0\1dn\ 2ÃM\18P\11\b¹ÄEES\93²¼\94¬k¹ÙºÖÉn\96]6\8fe\94¦y¿¡\89Z(¸*ÈX®
+\81Æ\1a)J¶«Y\86\8a\12\18\9aµÒØ»\ fµÛ\81Î\9e³\87ó;0\1c\ eÏÿ}ßï\9bùÞ'úMZðBäø×\8b£Ç½¶2î®â-ñc\8b÷$\8c)nJ\18ójGü\9dó%þÎW¤?Å\8d\9d\85=´vß\ f¼\17\ ep\ 6\7fëB`ý\9bì\ 1\1fÅç¯àîµJÃì56<¹Ö\81Yk\ai3×dé\1e^S`\98¶ºÐgêª\89~E+§øß·bzß      +\1e\v\1e·|NXá²ù\11c\96.\8b\1aµtsôÈ¥Õ±\ 5K\8fÄ\16,i\8f)X,1\ 5\8b$fÄ\e\12=bao§y-~À\1e¼ËÙÿ\85ù¥K\80UÌ^Èõè¥\12î\1eÜ\ 5\1f)5cFi(\1eÞ\94 ¦mJצ\96æë\8bJG\eîÛx\8fiüÆÉæqoM³\15nx$pÌ\86Ùö;ÖÏ\v.X¿$lhIix^IUDnIcDðܵ\12\91³Z"sVIdîÊÞ\8e±\a5¼þ«^ç½Èüu+\817×r\ 6Ì~v\13ð'î¢\ fl3`Jy\0\8a*¢q\7f\9aX\91­Ý[Q »»¼Ðslù$ïÑåS}Fn\9ba\1e¾í)kþÖ¹\ 19[\17÷ÉÞúVßÌ­\95ö\8c­\1fÚ3Ê®Ø\87¼-Áé\9b%$}\93\84¦\97öÖ0\87=à5PÁü·¸\92-gíÅ¥\9c\ 1÷ÐÇÊ\81i\Ñ&T\ 1wW\9bQX\1d\82±®þ\18ãJÃ(W®\1aá\1a¥\rwÝ£Ëw\15yæº\1e2d»f\193]/ø¤»\16\9aÓªKüR\;-\83]\7f³\f®¾lI®úÉ6h\97\ 4\fÜ)\81\ 3wH\9f\9e\ ep\ 6»8ÿÍÌ_Íü\ 5¬ýÏ\É\9eà\1e\12¸\7f\ f\97;`\8d\1eyµVäÖöCÎûNd¿\7f\e²êò\91Q7F¥×\8d×Òê§j)õ3uÉõÏê\aÖ\17{&Õ¯ñrÖo7$\1c<dH¨¿ä\15_{ËØ¿F|âö\8boÜ>1÷T½\b(cÿ×1\7fñf`î6àÉ\9dÀÃ.`2Wû\ e\0ù\8ff6h\18ô\91\ 1\ 3\8eX\91t$\f\89Gãá<\9a\ 6gS\1e\12\8e\8dFÿc\13\11wüAÄ\1e\9f¥¢\8fÏUQÍË´Èæ2-âãZ-¢ù¢\16~¬Ë£ßQÑõ;"ú°\8fij§ræo`þRæ¿ÌÞ?ÍÚÿø\1ePTÃúëYÿ\a\87ÀÀ& îc\1dÂO\19\11ò¹\ 5!g\82\11|&\16Á_$#¨%\eö\96;`?;\ 1}ÏMC\9fóO"ðü«\bh-\81ÿ\85Ý°}Ù\fÛùï`;+ÊÚBgDëi#ó\973\7f~\ 5ðÌn`\ 6k/bÝ\85\rÀÐF \9dÙI\1f\ 3Ñ'\81Ð3@à9=\ 2.\9b\12\0k[\18,m±0\7f3\bæöLøv\8c\80©ã^\18¯N\83÷·OÃй\0^×6A\7fm?t\9d\17¡uÞ\82vUàÑÞÛ*æ\173\7fN5ï\81ýÌ?\ 4\8cev\1e³SO\0        §\80Hf\a\9d\al\17\ 1¿o\15|o\1aaêò\83÷\8f\81ðú1\14:w4\94;\11p§ÓPâ\a¡ûAà\16ßüÝ\1c\9b7\97û µ\91ð÷½-`þsÌ\9fɹÿ\8eµ\172;\97Ù\83?eï[\80°VÖþ\15`þ'`ì\ 4\f·\0½x@\897\1fBÍd£¾\14Nq\94L9Ä\87\ 2á\87¡ð\1cÂ7\á\85.,P.\91\9bäW/òÚ{\94³\9fr\98ùÍÌgÝÉÌ\8e¹\0\ 4\7f\r\0>\1d̽\ 6þýoéÉØã,v\8a$'eÐh\9aB| \10öCØ\ fÙGÿ ³¿\12{"$(\9eúC\ 2\9d\10Ë \88i\88\12\8fáJ0\8e~O\8fÒ\1cz\99\16ÑJÚÀcl¡rª¤÷è}j¤Oé\12]§[ô\7f¾B\98\1f\16\v    \8dá9â þ<\939\95çÈSb(T¢/âyf(Ñ\9e¦¹ô:-£µTªD\95\ eª¦ýÔ@'ø\9f/R'¹áæ\89Ý\1ay\90N\94\9b\843?\92;nD$¤_\14ûÒ}\ eöÂ\9a­Ä<Z\89ï$%¦?(1΢çi>-&ö¸\9e¶P9UÒ^ªçx\9aè<~4^Å\ fÆ.Ü0\89ºá#ê;ß\9fi¿%\ eæG\87\11÷\\a¿÷ãëÐîù\f\81ô)Pâ\7f\8f\12\eça\99\89½°°\17\96¥´\866R\99ºeÙ¡Ü\16\97ê²Ôª\9bÖ\8fÔ\rk\8bê´¶«\ eëMõ\8dM´6\7fÑ®ø\8bÇåÿAb\99ÛßN} ±Ýø:\96×F\14ç\11\91Ç9\8dU\12r¿\92 éꧠÇ\95Ûþ¼ºi\7fEý`_¤¾·¯PßÙKÔuûfÕ\19T®¾\rªÒ:\82ökíA\87µ+Á\9fi_\a·©\v!7µó!âq6Tt-¡¢ÿâ?Îô      A\90$\7f²þb@÷kö"q\0$>\93ç\19©º¢Ç«ï£\1e\1c\8f¨«\8eÙZ»ã%­Íñ\9avÙ±D»äX­}åب]t\94i\17\1c;µÖ¨½Ú¹¨\ f´\96¨SÚéè+\1e\9fDßÔ7Ç\88ç±\18ñ:\1a#\86#Ý¢{\93\ 1\ 1¼¥-\90Á¾\90T3$\8d¯Ó8\97\948t%§âúÀ|t$\15ªË\89\93ÕW\89Óµ\v\89\8f\9cÏi-Î\97=>w¾áqÚ¹\wÒY¢û»s\8bî\84s»¾ÙéÒ\1fsÖy6%6{6&]òjHúÁû`\92\18ë\92ÄT\9b$>5Ý\12Åç@\ f\92ÌÚÓ| ·qïÌ4A²y\9e¬@ü+#\1c\9d¸t[\ 6ZÓFâ\8b´ñêdÚ\ 3Ú\89´\99\1eÇS\9fÒ5¥¾¨?\92úªgcêb¯Ã)+\r\r)\e¼\ f¥\94y\1fLÙe¬KÙgªMi4\1dHm5íM½î»'UüvSUªX*i\17\7fîIÒXû\10ægk\90<OH¾ ]ù~hÏí\83\1døüöd|\92\93\8f¦\9c»´Æ\9cÉ\1e\r·?¤?xûc^uÙÏ\18j²_2îÏzÍô׬%>{³Öø¾\9bYjveVøíÎÜc©Ì<dÝ\95ù\99u{ÖUÛ¶,ñ/Ë\92\80wøýmÚò\vÛ\7fÉ\10#óùv\95\ fÜ(\0¾\1e¡¡µÀ\v_\ eõÅÉaAh*HÄá\91ÙêàÈQZÍ\88        º}\ 5S=ß\1d>ÃÛ5ì    SÕ°ç|w\r\9dç·cè\ 2Ëöüe¶òü\12ÿmyï\ 4\94åU\ 6¾\9dWóoªË5¨é+\rão\12\ e\ 2       äJ\12b­Zµ\8aµÅE\8c\12 \98\84K\80\10\ 2!@¸\84\13\90\0\82á¢@\0E\82\10µÞ¸ÔjëÝuÛnk·n»³\8e³Û±Ýévv»\9dîtÝíöì;Óad?üæü¿=s\9e÷9ÿs\1eæô¾\8f\99§¤ß°NJ\7fbMH        kì\17\98\ e)  ^\vÙ\83{\8f\ 6x\1e\vð\f»ç\1f\93±s%¹Á'  \1eð0!\bn%½\ 4ï&ï¦,%\1f¤^JRÐ/È5\8c\85Ä|Ϲ\84R\9fÙø\1a¿3ñÍ\ 1Óq\9d\81S²£Á\93²\11Ö\89Ø©\90ñØùPGì2{4ö!çxìW\9c!ÙsÎ\80\8c°ûe$\14    ±ÿ\ 2k\15²\17g\10\83\9d\13õ\9f¤\ 2|¢Â¾£¢À½Ct¸\99\1a\0+J\11\Vï¤\9cWI©ó*9}V\99Æ8\9d\9aë=¥0úM¦T\ 4L$[\82Æ\92Û\98£I=!ÇåC¡Cò\13\9c\81ÄY\9e=ñ2¿/ñ.ÿHâ\9fùÝò\1fù]r³ɠ      ×\96Dظ\86®\85ìÃëT\86\1eàuûY\1aêcç¹¥ÁÎ\95A\83åt_¸\98É\a\97f\eåMM\14õtf<ýT\86ÒãDz\96·#­À\7fDmZ\7fLU\1d< lbÙ\ fu²ûRíÜ\9eT\a¿K1#èT¼\1dÖ¡¸)´*\9e\b[S\7f\bkI%\ 2\84\87p\11\ eÂ^\85àuÿ\1d^oOqÿ\1f¡ö\1dì<ïâ\95»\88ëÅl/Xвá¬n38u\91Ô\93¹\aé\ e­Âc8;Ã{0Kço×\14\ 5öe\9a\99=\19\96\10\95s8í\bÏ\9a6,hUO  \9bÔçD\rªëâzõïÅ\16õ÷¢º4\12\86\b\10\1eÂE8«\10Ìá·\98\81?d`×AÝ÷°{.\15 >v\9f\85<\ 6\9cÉgÁTÁF\980ì¦\8e\16ÄÐ\87ò\93\18ýyjï^]\8e\7fw®!°S[ÊlÏ©        mÍná6guñ\e4Ca\16ͤ¨&s>¼*ó\1dIeæ#\89\9d¸BCDH\98YCø\b\ fá®Bâ\0¾>\849ÌÂÎ\89ú×°{^.\ 2p!g\vé0e\f\82\89b       \8c\14GP\a\8bö¹\1d5&0z
+\95Þ\9d\86,ÿö\ 2}`k~   ³I_\15Z\9f×È­Óuò«sû\85\84¸\;')ÍY\96\94h?ÚP¬ý[x±\96\88J´$\f\11 |\84·Ês\9cÃ\97j\80ߢÿ7\rèA  öÞR\807\91©\12
+\8c\9b\ 2`¸L\ 4\83å¯RúʢܺKeî\87M
+¯¶\92\f¿æ"]`½ÑȬ3V\84V\17ÖsÍ\86v~YÁQaIþ\98¸H?+)Ô/n(Ð\7f\80|+)Ð\131"4è\89\0á#¼U¾\97c\16p\ e\ fÑ\83ëØû.\97ã\f°{\9dFÆñû¸Ù\1f\ 6ª\ 4Ð[µ\95ÒUµ\87ÖQyнÅ\9cìÕX\9eæ[W¦]_]j\b6\9bÊBÊJj9%Åm|cq¯ÐP4*Ö\eÏHtÆ+\er\8d¿Þ 5~#Ñ\1a\7f\16ç\1a\89\90\bt\85\84¿\96¿§`\16²\ 1î¡\aï\94aç«B\ fð        8Y\ 30\8cO0{\8d\ f\1c©ã\82Ͳ\99Òny\9dÖ\\17³®¾VîQS£ò©¬Î
+(¯Ê\ f2U\9aXEæj¶¡¢\99§/ï\ eË-\e\16å\94\9e\ e×\94^\92d\96Þ\97d\94þ\ 5×ÿ\8a3MD¨1\11A\96\89ð³J^ðW%fA\87ç\11=X¬Ä\1cÔ\ 1Ì4 \a\88Ý\ 2ÐÝà\ 5\87\9bB ­y#45ï¢Z\9aöÑ«\eã\19\15\r©Þ¥õ\99~E\96¼@C]\11S_k\ eÍ­iäf×Ø\ 4\9aê!az\95S¬®z;\Yu\17ù:\Yù\93HUIÂTf"P\9b  _]Ax«<K\aø\10ÏÁ\rôà\12î\7f®     sÐ\8a3hA}ÄÚæ\ eÍÖ`¨o\ f\87Ú\8e\1d\94Êö(·2k¬{±5ų°-Í'¿U\e k)\fÊi.gi\9a,ìôÆ\ e\9eªq@\90Ú0)Li8/Jn¸-Jª\7f&J²üG\98l!\82ä:ÂO©%¼µ<Å9<À3°\8238ß\88
+0Ñ\ 1Ð\8fX\ fã»ßF\85\9a®\0¨ì      \83ò\9e­\94\92\9e7¨Æî\18z~·\9c¡ëRzåز|5\9dù\ 1é\9d¦ ÕáZVj\87\95\9dÜnç&¶\9fàÇ·»\ 4\9ba2ë\97\ 2YÛ¿ùq­\84\1f×BxñÍ\84»\96ÇXEnaö®Ô\ 3Ì£þ\94\r\rÐ\834\1d\ 1\93ÜÔï\ 3E\ 3l(\1cx\19ô\83»(¹\ 3Ñ´ì\818zf¿\82\91Ö\9fᥴë|\15G\8bü\93\8eV\ 5&ôµ0ãz{C\ eö\8e³czç9û{ßãH{ÿÄ\91ö<çH»\bGj#\9cý6ÂÞßù\82\ f\8dø_Äü]@ÿÏv¡\a½è\ 1êv`-©\1dÄî\89}4o\84\ 1ZG\10d;Ä \19Û\ 6éc\91\14ÕØ\ 1Ú!\87\9c\9eâP¹Ë\1dÙ\1eñ£\ 6oÙh\85ï\81\91Æ\0éHO`ô°#8jx\8e¹gø:ò\94\19yì_¬ÈAÂ\8a\1c@úÿ\9f»èÁ"f`\1e÷\7fª\ f=\18@\ f\8e¡\a¨]î\0Ð\9f\0H?\ 5pÈé\v©N\ e¤Lo\84¤é\bH\9cÞK\89\9f\96QeÓ
\81é\fúþé<÷h§É#Êiñ\8atÚ|^w\ eû¾æ\9cõÛå¼æ\1fá|â\171ù£ÿÎ\93dýΠd\9c\ 4®å:fÿ\ 2Î}\ 6õÇ\86ð,\8c\0´\8f\ 3T\9fD\ f¦°\7f\9e\ 6\9a&{\8b\ 1\aæ×C̼\0¤\v\9baßÂn\88vI!Ê\95@ÙãRRßpeÓv»\8cn»\Õô\1d®öuÛ]Cî[]3\8cW\Ë\1e[\_0¶ÌÿÓsó\1cñÚ4K¼7\9d%>k¹\8a\19\98\93¨?4
+`Cíz'fà,@î\1c\80Ò\ 5\10w\ 1 
+;ékW½ âj0ì\\14Â\8eÅ-ðêÒnؾ$\85\89°uY\r[\96u\94MËe\94\97W\9a¨/­Ø©\92\95)ZøÊ\15\9a\11M¼ô\83\9bè*¡\v¯\90uÂËÄ]xé\ 5çpþNÔ\1fAß{&q\ 638\ 3ÔÎ;\a ¾\b\90p\ 5\12@Ä5\80Í7h\10\e\82@t[\0ÂÛ\9b ìN\ 4\bîD\ 3ÿn\ 2ðî¥\ 1÷^>pîW\ 3û¾\r\8f\83óÀzð\e`Ýû\a\85u\87P\98·   \95y\93ÐÖ2\83úcc\0}8ó\16Ü»y\ 13\80Úi\8b¨\8fõtïuÔ\7f\1f\1d\0Ñ\ 3\80Ð\ fÜ ðcO\bx\14\0þ\8fØàÿ©\ 4ü>Ý\ e¾¿û\15\12\a\bñùÌ\0Þ\8fë\11;x}~\ 6<?¿\ 1\1e_|\ 5\9e\8f\7f\ 6¯ÿ\11^\1fPQ]i\1cÀÿo\98\19\a\ 6\1e\f0ÌP,\80\145\ e1qÀ\15T\b\82
+"* \88\ 5D\88\ 6\eÁ\12ì¢Á (\16Ä®\vöŵ×`Y#Q×\12ã        QcCì\1d\rÖ\9b¿"9ÄÝsöp~çÍ;̼ï~ß½ï\96³\ 2Ú3ïHu\161~\1eû}\ 2û|8s\1fȼ{í\ 6¾gý\ f\ 2\9f\1c\ 1\9a\95\ 3\8dO\0\86Ó\80î\1c`}^\ 5ÍoZ¨/é ºä\ 2åå¦P\ñ\83tµ-\17@n\88\19ªä\vw\9d\83½\8a\ 3¼j\1d\17g&pã!pSü\97\9fT\ 2\8cd\9f'³æ½ö3þ! à\a å1Àë$àv\16\0ä\8b\80å\15@q\1dÀ-5Ù\90\ e¸mäfÐ\1d¸ç\r\1e\b\80\94<f;\9epò{Â\97¾\9a\1dý´\14xv
+øý     \89¿\98Êø\99üwÊN ÷\ 1Ö\9fÍ5\1f\aü\98³'sv¾ÀÜ/3÷k\80ò\ 6cߦ§Týöª"-\9fmK\8e@MCàÅÇÜ\1c\9aðn\93*¸)\10\\88ÄDZD\1cØ\82I\89{ôüOY\8c\9fÊÚÇ2÷pæmflß_\0wæìt\95¹W\ 1\9a·qù3°\94¨!ñ!ÖDX\93\1d±&Â\83Z\127«"º^;øÒ\v\16\0\98øùOÂ\81ç[\a/\b\1dÙ|ÌÇùò±þ\14Dݨ\ f\r¦\91\94MÓi6- %´\9aÖQ)í 2:N\97è.ÕÐÿùsbl'\9eq\1dÝ\99\86'\84\15Û\84\96\14HáÔ\9b\ 6R\ 6\8d¡)4\93æÒ"ZNÅ´\91¶Ò^¼ÁQ¼F\ 5\16\19\9e¿oI}Ïë\11.\8cïÒ\88%lÈzð*óÞÊ\a¢Áç\10\16!üF4%Q:eÒø÷µ\98Eóß×b\15ã®Å+Öâ\ 5váw\1cæ\909\83'¨Âc\ e\9cGüÆCzPÏÃzD#Ænä\fáf\800\18kÛ¡c-d\13»\98ýaÕ\15B\13Ï6¥°\9f\86\11\9e\8c7ê\¼RÏÁ\vu!jÔËðL]\8cjõF<VoÃCU\19î©þ\83;ªJ¾>l\89Fàº\95@¥ö\1déCÂ\9d\1d \9aè \íÙ\16\17Ö¥)û§\ 5Û\13Àö\84±\8fbðJî\87çr:\9eÉ£P-gã±<\r\ få<Ü\97çá\9e\\84;òJÜ\96×ᦼ\ 5U¶ûpÝö8®Ø^ÃE»'¨Ð  é\9c½\90Î:\bé'\a¡8ó\ 1áÅø^v\10Mm <erä°f-\1a7g{üñܹ\ 3ª\8dÝðÀ\10\8f»\86\14Ü2d Ê0\1a\95\86\89¸j\98\81Ë\86|\2,ÄEÃ2\9c7\94 Â¸\19ç\8c{pÖùG\9cr¹"\1dw}"\95»       Å\11:ì&,\ eý\ f¢\19ã7×B4SCxóêýöÞ\80×\1fy ÚÓ\ fwÝͨj\12\86«Mbð[\93$üê\9e\86sî#ñ\93û8é\94û\14é¤ÇLé\84Ç\é\98G\91Tî±J:ê¹AqÄs»â°çaÅÁ¦ç\15û½î[ìñz£Üé%TÛi\9b\97P¿§ª#|\98¿¯
+ÂO\82hÅk+-^·°Ã#o#n4÷Â¥f­ñK³`\9cþ[7\9cð\8eC¹w²ô\83÷Pé°O¦â O¶¢Ìg\9aÅ~\9f<\8b}>ó-öø,Uîò)QîôÙ¬Úîó½j\9bïiÕfßÛêM~/\e¬÷\13\9aµ´æ-ß¿\12-4\8cË©Â\9fS\1d§ÙÛ\9f*p£µ\ 6\95-lQáç\8a\93­|PÞ:\0\87Ma(ó\8f\91öú÷UìöOUìðÏ°ØfÊRn1MPm6MW\97\9af«7\99
+\el0­Ô¬7m°\kÚeYbúÑê\1fþ×­Vø×h\97ù\vë%µ´\8b? Z+jãs¹¹Þ\ e¸À©íl \12gÚXâØgz\1c\11ö\ 5~\8a\9dí:J[ÛEJ\9b\ 3ã,6\ 5\ ePn\bLW­\r\18¡.   \18«)\ e\98l¹Ú\9ckµÒ\ ]n^b½Ô¼Æf\89y«\dþ·\h¾,Ï7WÛ\16\ 4\bÛ9µäü\0aSßÛøâsæ\1f\ 4\\f\ 1NqÙ+çõH\90
+eíuØ\15ì\8e-\1d?Á?;µ\97Öw
+W\94t\8a±XÝ1Qµ¢cJ\83e\1d\86j\96tÈ´*
+ÎÖ\16\ 6O³Y\104K\9e\17Th;7hµ.?¨Ô~vP\99}^P\85}nÐ#û\19ÁÂ~z°Ð\91]N-Û:â3.m\81µKî\19\9eû\8ev\ 5ʺ\0{:+°=TFiXC¬\ f÷Eq\84YZ\19\11ªX\1a\1e¥,
+\8fS\17vî¯\99\1f\96fU\106ÌzÎ\17£åY_L²ý.4W\97\e:Ï~FÈrÇ\9c\90\rú©!{\9c¦\84\9cv\9a\14zßiB¨Ð\8f\ f\15\8edOºú\84\19¸Ï%î\ 2ã\1f\8fâ¹·\aÏ\1a´\95\9f7uÑbM7g¬\8aj\8e¥ÝÛH\8bºwP,\88êª,\88ê©Î\8fL´Ìë\96¢\9dÙu\88Í\8c®£lsºdë¦vÉq\98\14\91¯\9f\10±Ø);|­a\øNãØð\13ÆÑ\11w\8cY\11o\f_G\b=9\92\ 3Ù×\11\1c\ 37Y\83\9f#Y\7f.ù{{3~,°\91\9f\e`E\ f=\16÷ôÂÂ^&© W{Åì^\9d\95ßõ\8cV\7f\e\13o\99Óc\80vJ\8f4yRôp»  ÝÇØ\7fÓ}²ãب<§¬ÈBcfd±óÈÈm.#"Ë]\86EÞtÉ\88zeÌ\88\12\ 6Ò\93ã°HáPç)Ç`e8p\92¹\1f\88\ 3v$p\9f\9dÈøñÀ\8aÞ\16(\8aµÇüx\ fÌéÓJÊë\13¨ø¶O¨2'>R=9®·åÄØ$ëìØAòØÞ_Ù\8dîõµCfÏ  ú\91=s\rÃcæ;\7f\15³ÊeH\8f\7f¹~Ùã\88kZL\15½tN\8b\11\ 6r"}z\8cp¬ó\98ýp©\ep\8cùïcü-<w­ï\ f¬L\ 2\8ax\ e\9c\97h\87ÙI\8d\9f\1f¦÷k«\98\92ÔI91©«:»oO˱\89   Ú¬\84d9³Ï\97v#ú\8c\88ÿF?4nº!=®Àypì
+×A±¥nɱ\87Ü\ 6Æ^£\17.\ 3c\85\91\fɱBO\8eu\1eð\1døµ;û\81yïfüÒd 8\ 5X2\80ñy?«¿\8cÜ\81nÈIöÆää6Òøä`\8bq\ 3ÃÕY\ 3¢5£\ 6ÄkGôï/gôK³\e\924Ü!=i¬>µï4CJb¾ó\80Äe®ý\126¹%%\1c\9bp\85j\ú&\b#\19\92\12\84\13éëÜéÌù\80}\7f\88õßÎø\e¸åYI\v¹%\9dÅû\19\98\9aê\8c\89\83\9b!;Í_\1a3øï\16\99\83ÃT#R£4\19\83\86\fJ²IO\19d\97ú\aÝe\1eÕô\95\86á7        1P\92°\84,,.¸\8fV°:,õ\88U\ 1\15±\82\b\ 5A@Ù\17Ù*\9b\82`-\8bk1X«\ 5b]Q´êQD\98Îè´\b#UëѱêèØrÔ\8aÖÝ:õÎk+Ú\99süãá\97@¸Ïw¿ïÞÜûŤÚÆ,ÈÕF/(ÖGFWÙÏ\8dÚä8;j\97SxT\8bÓ\aQWÈc\87ð(a\1f>_è#æ\v\1dÑöÐÅ}x\8a\85ùßÏ+èö$ö|dm\ 2ý\8c¥8Á\ 2\85IZä%\ fBNò(If²\974-y\92YrR\80"!1Ôbaâ\eLB\8cUt|\92Mä¢,»9\8b\96ê"\16V\18Ââ6:\84Æíp\f\89kv
+\8eû\9e<r\b\8e\15\86\90\ f\89\11ºÐ\18¡íá\1a÷`\e×A\13ó¿'\91uH\ 3\8c©¼ï§ÐÏ^4?U\8e\9ct[df8#=ÃU\92\921F\9a\98ác¶(}Z¯Øô`óè´\bËÈÔhÕ\9cÔ\ 4ë\88\94Å\9a°äBmHòÇú\99IFû\19\1c\ 2\92\9a\1c§']p\98\9eøÀ> A\18\88>0^è\88\87K¼ú\1e\ fų\ eô×f²ï]Ì\1c\90¼\fÞ¹ù>-Û\1a)9½\91\98;\1c\8br=$±¹ãeѹ~òÈ\9c\19\8a9Ùa\16\11Ù\91Ê°¬\85ê\90Ì4\9b Ì<Màâ\15º÷\17Wëý3¶\1aü2\ eÛOÉøÎÞ/ý¾Á/M触        ÝÔT¡õO\15v=\9cå~le\ eösÞÛ²¸\16\ er\80\12\92Í×)y@|¾
+q\ 5öXP8\18QE£$ó\8a¼¤³\8b&ÉÂ\v§Ëg\15\86(\82\væX\ 4åÇ(\ 3òSÔÓòrm¦æ\95j&/Y§õ]R¯óYrHç½ä´ÎûÃ{:ï\¡õÎ\11v>Ù$Khzè\98Ç:°ö\r\9cw=}ÕlIVæ\ 3\85\17²ï(fïYb\8e¹¥\1aÌ.sFx\99\vÂÊ<%!e\13¥3˦Ê\ 2Ë\82äÓKÃ\15þ¥Q\16\13-'-ÏVy\97\14[M(Ycó^I­­WÉ\ 1ÍØ\92S\9a±ËîÚ\8e]*l½\8aH!)\106=\1cg\ e\ e°\ 6\96m^\ 6¬!ËI.ÝI¥À¼\95ì}*$\b®´BP\95#\ 2«\86 `Õh¼¿ÊKâ¿ÊWê·jºlÒªP3\9fªyò\89U\v\15ïUeXxU\16Y\8e©¬RzVnQyTîW»W¶«Ý+î¨Ý>\16\8f\84\95Û
+aå^ö\9a\ 3{\99s\13½Æ2 |\ 5s@Òé\8e­\0ÂW\ 3\81ëÙÿU[`ò\ 6\r|7ô\83\8fq8¼\8dî\98P3\1eãk¦HÆÕÌ\90\8e­ \97\8e©Y ó¨I\91»\19ó{\8d6\96+Þ1n2w5î5w1¶\99»l¸mîò\89xkÄ:²VX\8e\9a\83\s;Ø\ 2}FïZ:K+\81\9c\81­ê<º\83Ù\1aùm\ 2Æo\ 1ÆÔªàY§\87G]\7f¸×\8f\80\aþ\?\ 1£MþxÇ\14,\19i\9a+q1ÅKÞ6åH\87\99\86\9ajdCL»Í\ 6\9b\ 6×ß2\eT+ä\83\88^\ 37\93Ï\84¢\87=¬{\1dýÕtW¬\ 5
+èMÝ\0Do\ 4fm\ 6¦Õ\ 2\13·\ 2\9eÛ\ 1×]2\fkPãO\r\ 6\fÝ3\0\8cÀà½\1e\18´w\ 2\ 6îõÇ\80ÆPôo\8c\86sc\1aú6.C\9f}ë$Nû¶K\1c÷ýEâØØ%qÜó\ê°[H\1dv       \99ÃÎ×l£\7f#ç½z\1d÷\ 2ÛÒ,z\17Ò\ea\ 2\ 2èõÙ\r¼Ë\9eÔu?0ø Ðç°\1c\86&5ôM:è\8fö\83îè0h\9bÝ`×<\1e\9acþ°=\16Fâ`Ó\92\ 3ë\96rX·ÖBÝz\84\\85Uó3X\1d\15°>"$\7fd3ýë8÷2Î;÷sÖà\v`î. ¨\11ðý\92ù§×õ00è(л\ 5в]µ:!\87e\9b
+\16mv0oë\r\102
+½N\8e\83ü¤?ÌÚÃ!k\8f\87´½\0\92vN®}'Ðñ5\9f·\89à\ 1) i{Mõ'Ü\8b\9fòû¨\ e\ 1DrÎAôúÒû.½.ô\ e ×ñ\ 4 i\ 3T\1d\80ù·\80ä¬\ 5\ f\1a5/\1eZà\\1fàü\10à\ 2\17_\Jy\19¸ÄCð2¿h/\97ð`æ\ 4¯pB\97/ðù\98\88ÿ¡\82ë­\90yOåÜç3ß3\8fÐO¯çWÀÛô:\7f\ 3\18赦×ò;Àì\9fàXä_\12à*ã¸Æ8®kx!v\ 4º\ 6\ 27\\81[c\81Û\8c£\9b\87@77þ\9d\8f\80»,ð]Nêî¿ùþ)\9fâ\15KéOgÍ£\ fp\ f4\ 3\93þ\ 6x0mÃÚ\81¾\9dÌ=½jz\15/¼×È\8fä\ 6¹I~"Ýr\8e©\ 4~¶æÅT\ f\a<\19\ e<ãEùW\1eÊÏy \v~\ 1
+n:ÁÅ-ZÉUòð\15\8b\e\80\98C@(ÿ4\99nOÎyØiÖþ<s\7f       PÒ+ëñ¾pÞ%÷É\ 3ò\88<!¿\90_\15\1cOEl        s"\86\126,\82q\88\17qð \10U/ã`²Å·¯\10VìoÕý!,\9d!d|\rö\99\18\91\ 3\12CRÉ\87¤\84\94\935ÄH6\13\13ÙIö\91#ä89CºÈ\ 3"ðü·\9f¿?ÿ\1faC·5{\Uo\bE_þf\0\19\90)$\84Ì'\89$\8b\14\922RIÖ\93\8däsò\ 5ÇkÀ¯8\88ÿ \15ÏÐ\81§,Þ\13&î1\7fó\88\9f\ 6\84\96n\8d\ 3ã°g.\bz¿Ì\85;ñ&\81d6\89#i¿åâ9\8a9êJ\96`5=Õôl¢§\8eãíà¬÷á\1e\9að3¾Æ\1d|\8fn\16ð6?y\8bÿyó\r\b\ 3½:-ãа&Ä\92ñ(X\13éÈ\97õð'³H\14½\89ôeÒU@ÏrzÊéYK\8f\91¦-ôlå²i`\ 5\ eqéþ\15×q\96\99¸\81«\8cð
+G¸ô\ 6\84\ eÖ\8cCÍåô\ 2ÆcÅ\9a(\87CXxBôòÅ3Ù\f<\96ÎÆ=i,º¥©¸)ÍA\97´\b?ÊÊp]V\89k²õ¸*û\14WÌêpÉl'.\9a}\89óòV\9c\93wâL¯.t\9a?Á?Þ\12\148©|\89åkD_úûX2\ e\ 5\84=\9f\ 6\eÆÃÜØ\ eÄ/Ö#q_=\ eݪ©¸¡\fÅ\ fÊù¸¦\8cÇeU\ 6\96à\82ª\18çT+qVµ\1a§UFtª·à\94z;:ÔûqRÝ\826«N\9c°¹\81¯l\9f¢E#Ь\11\92£\7f é%¢¿\12ÂÙ\f\82ÛZ8Ë\19\13ß;Ùà\91Á ?i\87â\a\8d;®Øzã\82&\0gìÂÑ©]\80\ e]\12Nê2ñ\8d>\1f\7f×/ÇqCù\7f¹.× (Ï+\8e\9f÷Ý+»ì»7&\89·F\ 5Á\b\8b¨,(,ȲÜ\96Ev\81\ 5v\81å²ìrY\96Ë\82+\v\ 2\v\88\b.\ 4\14!xC\83\11E\83\97h¢&Fmc\9bÆ6ÓIf:i:MS§M[\e§vÚ´}z\1câ\98é\87ß<ï¼_þç9çÌyÎ\1f>|e\f>X6\ 5·\97ÍÂÍe\17à½å7àÆò\apmÅï©Å\95O©K«\b½\80\@Îÿ\1f$\94\vd\1dê\87âXÁqû·u,x¼F\b\8fVÊà\8be«àÓ\15
+øÙ*\15üøU-Ü]\9d\ fï¯)\83[kkàݵMp=Ø\ 3ï\ 4{©«ÁýÔåàaj1d\82º\14r\8cº\18r\96¾\10r\85\9e_w\8f~kÝoè7C\9f°fC  ë$r"\94°\8fãùCÈkKãä©\ 2Gm\14\8eo\1cµ\9f\87³áWk\ 5ðqðKp/4\f\8f\81\e\eRàZ¸\1e.G\98áR\84\95Z\88pPç\15ÍÔ9E;}VÑCÏ)öÓg\14~Ö¬â(ë\94b\96}Bq\91}Lq\9b=£ø\8c=\15ùWÎ\91\9dØH¸ãÈë\91\84óCH\ 4Æ\10\89£W\89Ï\f\8e×\87ÈG1\0÷7rá}\85\14®G­\81ÅÍ\9b`!:\11Î)3aNi¤Î(-Ô)¥\9d>¡¬§\8f)w²f\94\1dìiå^öQå\10g2z\82{8ú8w<z\9e7¦¼Á\1fU~Â\1fQ~Ã?\18ó_þ\81\18Â\1f\\82·_ù\ 2\82÷þ6\1a\9f\ 2|f~¡Fídܳ\93\8d£àJ\f\ 3\vÛVÂÙø\b\8a\83\93  i0\93` ¦\13ÌôdB\ 5ëpB\r{\ÕÄ\19SµrýªnÞ!\95\8f7\1cïç\ fÅO\a\fÆÏ      \ 6â¯
+}ñ\1f    ûT\8f\84½ªï\84{TDгD\0Â\7f\ eÙ\82Ï@\1czN\rÞ?\1dý\96\16½\ 6\9e\171\96ùD\ 1\9cNz\19N$\87Á\e\1a%L¦$S\13)YÔXJ>}Hca\rkl\9c!M\1dw0¹\857\90¼\9bß\9f¼WЧ>(ìU\1f   ìQÏ\8a¼ê·\99.õ=¦Cý\15Ó\9eüOQ[2  ô$\13á÷\b<ê%\9ebÞ¿Æ{?Ì@Ï\89¾ï\9dlÔÇs\ ec9\95Ê\85\9949Lf\ 4øv3ø3\13©áÌ\fú@f\ ek¿ÖÌî×\96sú´5¼Þ\8cF~OF«À\9bÞ-ìLß/jO\7f\9dñ¤\9d\10ïJ[\90¸Ó>\90´¤})iNÿ\87Ø\95N\18D\84\ 4"BWÚ\12O°þ_¦àz\93\ 5p\13}ßb\1eè·0\96éL
+&tR\18ݱ\1a\86õ\91p@\1fGùô©t\9f>\9bÕ«/`wg[¸]Ù6^Ç\ eg@Û\8e\9dÂÖ¬Î@wV?Ó\92å\17»t3ÒFݼ¬^wKæÔýZV\97õw©#\8b\88\11Æ¡#"$ð9\8f\13põÁ\1cÜ7\0\Gß·`Â=¿\0`
+c\99Ðã\9ei`à@îJ\180\86C\9f1\16ö\18\93)¯QÇê0æ±Ûó\8a¸\9e<+ß\9d[\eÐ\92ë\12ºrÚE\r9{ÅNÃ\88Äa\98\92Õ\18Þ\92W\19Þ\95Û\r\9fÉm\86'2\9b\81H\101ÂØõD\84\ 4\eìÃO1\aw\8c\0WÌè9K\0\8e¡ÿ\9b(D}ü7\98\1f\bû
+\97A¯)\fºÍÑÐiÞNµ\9b3X­&\ 3{§ÉÄm.,ã5\16V\ 5Ô\174\bë
+ZE5ù=âªü!©Í8)³\1açäåÆëAeÆ_\ 6\95\1a¿\95\97\1a\89´ÌHÄ\bS\96GDÏù\ 3Öáç\98\83[xÿ·qõz\13½ß\14\9e~\\a\añ__\91\0z\8a_\82Î\92\10h·l\82V\8b\8aÚiI£]\96lvcI>ÇYbá9Jl\ 15ÅN¡½È-ª,ò\8a\83ÒRóaY\89éLP±éZ\90ÙüI\90ÙôXn6\11i\91\89H\10¦¨\90\88\9eó;¬Ã\ 3Ìû\rÔ\¨À>´b\ eð<\88±ôaN¼¥<Ø]&\a\1ap[#¡Ùº\8dj´jhg\85\8eå¨ÈãTW\14ñìåÖ\80Êr\87°¼¬ETZÚ)..\1d\90\9a-ã²Bˬ<ßr%Èhù\18ù\8bÜh!Òü\12"A\98übÂ\14\14\13Ñ3¾À:ÜÇú_CÍy\eÖÁ\8e~\vÏ\81JÔÇXÚ¬,pÛ¤Ðlÿ\114V\85\83³:\96rT'ÑÕUZ\96½*\87\9b¸åör¾ÅV-(¶5\ 5\9a+w3\ 5\95û$Fë\98,×zRn°.ÊõÖ\9f"\7f\96é+\88\14\91\18Ê    ó=¢g|\8e}w\aë¿\88\9asµèwj\0\86«Ñï m\18O\v\9e\8dµ\f8\1d+ ¶n=T;£ÁæL ¬Î4º¬.\9bm©+à\149,<\93Ã\1ePPÛ Ì«õ\88rjö\8a³kü\92¬êã2]õ%\99¶ú'È\9fdÚ*"ɬ"âL;atv"ÒÙ\96x\88}w\13\8b¨uº\1eëàD¿Q\879@Z\90züWÓ\10\bö¦\97Áê
+\81rW\14\94ºâ¨\12\97\866»t¬BW\1e;¿©\88\9bÛdå\19\9aê\ 2²\eÝB]ã\1e\91¶aX\9cÞ0#ImX\90¦4Ü\97jêÿ(Iq\12qJ\1daRë\88(Õñ\82\aØw×1\aó¨}\1c­\80¿   û \11 \1diÀo{\vú\1e7\ f,»dPÜú*\98=áPè\89\81|Ïv*Ï\93Açxô,}k!;«µ\8c\93ÙZÃËØÕ\12\90ºË+Ô¸\87\ 2Õîif»û<\93è¾Ë$¸\1f1\89-ÿ\11%6\13\8b\ 4n\7f\12w1\a\97±\ 6s¨?åFß\8b\eq#µ¸\8e\97\ 1\98:(0v2\90Ûµ\1cr¼¡ ÷n\82\1dÝñ\90Õ­¡2»ut\86×H§yKØ\1a¯\9d£ö6q·wuðU]û\ 3âº&\ 5ۺΠ c»î\bc;¿\16Æîþ·0¶\9d\b\88`«ç\ 57±ÿ\16ðγ\1e\80qÔëGv#Mí\0\ eÔï\ 6\ 2èú\ 4\90±/\bÒûWCª/\1cR|JÐø\12A=\90N%\rè©D\9f\89Vù*Xq>';Öçá(}ýÜ-¾Ã¼ÍýgyQ¾Û¼¨þ¯xQ}ßñ£z   ?j\ fÒó\82«Xó³xßc^\80\91.\80=È.üv v)jçõ\ 3d\ e\ 2¨\ fÒ\900Â@üÈ+\10w(\18\1dRÀV\7f,Äú\93 Æ¯\85èÑ\Ø2ZBm\1a­¦6\8eî¤\15þ^V¸\7f\8cµÁ\7f\86µÞÿ\1e{½ÿ·¬°\91\7f±Ã\ e\12\10\ 5\171糨{¤\ f{\11íi'Ò\88ß\95\ 1jï@k¤\19\ 5\88\9b\0Ø<É\83È£\12P\1c]\ e\11S!\10>\15    \e¦·ÂkÓjX?­\83°7þÇvy@E}eaüûO\1f\ 6pè}P\ 4,\ 4\88     \83\85±\80
+(¢q]×äèÑÕ Æ\82\ 6»¸\bADET,\18\8aNPXª\1d\18Ôh\ 4\1d{,G$1®qu]\13{ÖX\12ëÛ\8fâîêÙÃùñ¨ï{·¼ûî\1d\89@óx\ 4\98g £y±ägÎ\91Ú\9b\8b%_ó>É`þQ2lú]f(\102C¾\90\e¾ü/\95)\80\99\9aë©·4\8byÀõ³ÕÀèµ\8cA.çÏ| b3õ\8b8\ 3\16\ 3~¥Zø\969ÀPæ   \9fr\7fx\97\aë¼;<+"áQ1\ 4î\15\1fír\12\é\\97Ê\15p®4éª\ 6\8eU\8dp,\7f\ 2§2!9ýµ\8d\92V\8a3y\1f³\99\8bÔLYÇ»HÝ?ç\ 1\7fÜ\ 4ÄR·O   \10VFý* \ 3gS\8fÝ\80\1aíjõ°¯u#\1d`W\eDÂak\89\84Î2\146\961ÐZ¦CcI\85Ú²\ 1*K%\94\96£\ï@]+ ©!Õ\ 2Ú=­\14¬b\1eÐ×\19Ô\9d\89Ô\1dEݸr ß6À¸\8búÕÔ¯\ 5Ü÷\ 2\ e_\ 3¶ßÈ ª×AVï\0©Á\ 3\ 3\ e\a\116#GØü\1cá\ 3deáµò²Y\99PV:ÒÊ\r¬\97ÉSþ^¼Åú\r¼\v\ 5À\ 2jO-\ 5ÆPw\18m\8dä¿\18ë\80\ 1ß\83\80k= ?\ 2Ø\1c\ 3ä§À\86CIl\813\ eÀYwÒ\ 1\95Í\10\eÓF6e\17Ù\84\dáiâ\85kbR5Ñ\99ß\1d&·É+"þCV!ïâV`z\ 5ï\ 1mþÈ\ 2DQ7\8cº\9d\e\0\1f+à|\1c°;\r¨ÎRû\ 2ù\9eü@.ó\1cWtl\86õlÈ]\80ë>À\r\ e\b7Ù þL\7fÜb\11¾Å\ 2|\9bI\7f\9bI}g'á&w\7f\89h!\85y6\83±\1e·\a\18Ní(Ú\eF{;Q×\8bº\8eç\0]# »DÍ\1fÉuòOr\93üLh\16îª\81ûvÀ/ôÉCÆæ±?ð[7à\19\9b\93çl\8c\9eOåðÂ\v÷\821yI#_Ò\90W÷Éã\16\92èûñôû\1f\0Ú\1cv\12\b<\ 3xòÏôÔÕ¼ÑmÖ¼Eî\11\9aÁ\81\17xD\9e\90ßÈ3\89\1a\1aàµ=\87\ 5\97æ¡\8d°i\17<\87àÃ,øð\bæ\86\ 5Ï!\18Pq±\ 5¡k\ f¡6@À\87ðk\ 4\90\10\12A\ 6\91?\91        $\91Ì#©d\19YM6\90\ 2RDJÉvRK¾!§Éuò/¼Æ+~\88·xI\9eµ!쨭ó\84PpÎ\ 5\92®¤;\19H\86\93±ä32\8b$\93\82ä\90\8dd\13u¶rß
+¼À.î»\ f¿ã\18\9e2i\9eà.\1eó'\8føW¿\92Gÿ\a¡§¶½\v\84Æ\99ß5ãÑæ\8b\ fH?2\84|B>¥N"uæâ9R¸k\ 6\92:k©ñ%÷2S£\84VoÃ\ 3Ôà>ê©~\8eéò\13\84\9f\ 5ÓG´¬7ßA8RW¯\87°m\a
+\97\98¼Gz\91\18j\8e ÞXjMf\1a|ÎtX@\8dTjdâ\ e²©±\9eûçs¿"Ü@\19\v\7fÇ~¦ðIü\r×p\89\9e\164q7F\1f\8dï \¨ëhK_h\19\13®ZG\9e¥9&\81\8cÛ\87ÔíGÍxê}L­ñÔ\99\8a\7f0&×\18\93«HÃ\15æÆeæÆ%ärÿM¼ºÅ8O_\9c\85\ 5ßÂ\8aS\8cÇ \9eø8£t\94»Z%\81#Rëú\ 6á®ã9\94ô\ 5ST¯\82hgG\9f8ã¥Ú\17\ fåA´¯'5£qU\1a\8e˲Ñh\92\82|:ÎÉçà\8cb\11N+ÒqJ±\ 2'\9498¦Ì\83UY\84ê
+4¨jpHÕ\80\83\9a&|­½\87½ºW°Ø2cí\ 4jÞAxQ\9feN¸\11W^/'\15\9eëíñÀÖ\157´~¸¬}\1f\8d6}pV7\18§lGâ¸ÝX\1cµ\9b\8cÃö3Ñ`?\ f\87ì\17ã`»¥8Ðn\15öës±W¿\19uú2Ô:ìAµC=ö84a\87Ó\ 3T9¿F\85\8b@Y\e¥ÎBz\83ð¥¶7Ë\88\81¥\86Üðn.yJ\µ·C£½;N;tÆQ§î¨w\1e\80\ 3®Ã°Ïí\13Ô¹\8dG\8dû\14T{$a·Ç\ 2ìôLÃ\ eÏåØæ\95\83*¯|Tx\15£Ì{\a\ f Äç\1c\18îHfÃKi\93¯\90
+IA3\ 6!å·!üZËÉ=\96Øk,÷\17»ð  `\99;å­\81ÕÃ\11\a½ýPgè\86êö}°³Ã l÷\e\81Ê\8ecPî\9f\80Rÿé(ñ\9f\8dbÿdl   H\97\8a\ 2VJæ\80\rÒæ\0³T\18X)å\aÖIy\81'e¹\9d~\92­ëôL\96ÓYÈÖ\90Õ\9dÞF\ 4\ 2¿R÷\ 6\85\ 4©\7f\9f3O\17\19öv´Çî@olë\1c\84ò®=P\124\0\e\8a¯\82Gasð8\14\ 6O\96ò\83gHy!s¥\8d!)²\r!\99²õ!9²µ!\ 5ò5!¥òU!Õòì\90£ò¬Ðë\8ae¡O\15KC\85"#TÈ\9bYò?¼ þ]êÿÐ\ 38iâÌG,=Ùc~ÀÙ3X\87²P7lí\16\bó\87a(\bë\87<ã`ä\1aG`½q´´Ö8AZc\9c"[eL\92e\e\17ʳ\8céòåÆ\95\8aLãFE\86q«2ݸSù\85±^\95\1a~E\95\12þXµ(\(\9bI\ e\17\8a\16\8c­<       æ\13Ô\9dÏn_>ÿ|rë8\7f\a\94õ\ 2\8aÃUØÜÝ      ù=ý\90Û+\14ëL\11Xc\8aF¶i\98\94e\1a%-7\8d\95e\9a&Ê2L\89òtÓ\E\9a)E\91jZ¦L1­S-\8a\17FlSÏ\8f\99gjÒÌ1=ÔÌ6  õ,\93P\11e\v\11­<¤½W{Ó\aÔ>ÀÙs× Î:ÑÀW|j
+{KÈí­ÇÚ¾>X\15\19\84¬¨\1eXÖ?
+\19ýã¤ôþ#¤´þ£e\8b£&Èÿ\125E\91\1c\95¤\\10\95¬\9a\17\99¡\9e\13¹F3+²Póyd\85vfä>\9bÄÈó6Ó#\1fh§E    ÍÔ(¡\9e\1a)Tm(\9b¹O\1f|ǧÞJíºx \8a\14\r\ 6òbØcòç«ûÛaÅ@OdFwÆ\92\980¤ÅöÅâØXiQìG²\85±£dócÇÉçÆNRÌ\8e\99¡L\8a\99§\9a\19\93¦N\8cÎÖN\8bγ\99\12\9b\1cmÑM\8aþV71ú\9e.!Fh\13¢\85\86¨\89*a`+·"\18\aÚ}\88ÚÕÃÙc\93\82¡\9c·âØcò\1cËbuX2Ø\15©qþH\19Ò\rÉñ&Ì\8f\1f\8d\8f\97Í\8e\1f)K\8a\1f#\9f\19ÿ©"qÈ4å´!³ÕSâR4\93âVh\13âþÍu\99GEy\9daüùfav\r.D\8b&¢è\91¨(Ú((\8a"¢¬\ 3Ã0Ì\fÌ\8cÀ°\r(\8b\b\13\bÅq¡âh]\10\\12Q0.\11\1d\13c\12Mðh\9a\18\9b4rZ=&©Ic\km\8em\9a¸&úõAÆä\9cþñ;ßý8Ã}îû¾÷Þï}ÚÔyI¯ir\93\8ej\1dI\9fjíI·4ö¤Çj{\92¨²'\8aJ¢xÊUî\83?3\aÝÔ~\83íF\a[\9f6¶aëØ\12þ>\19ð¤(Ñ \1f\88º´\10Ô¦\87£Ú\10\85*C¬PnH\12\16\19\f\92Òt\8b´$=WV\94^\1cP\90V©ÈO«Wæ¦5©\1dú\16\8dMß¡ÍÖ\1fÑYôgÈM­YÿHcÖ\8b*\8b^TZREÅS.q\1f\9ea\ e\8eQû \ 5Ø\91\ 5läZVóÝÃuÔ\ed¨Í\bDµñ9Tf\8eC¹i*ÊL³\ 5\97i\81PlJ\93\14\9a²¤N\93]\96\97Y(_\98Y®°eº\95ÙÆ\95j\8bq£&˸K\9b\99ñ\86Î\98qZ\97\91qC\9b\91ñ³&#CT\19\r¢Ò\8f¢\97\8bñ}mðÛf`\7f\8e\959àx%×RÏuÔ\98\ 4TfõÇbK0ʬcQb\9d\82¢ì\99BAö<!?;E\92\94:¬92\9bÕ)϶\94\ 5\98-5J\93e¹Êh^¯1\98Ûµif\9fNoþP\97j¾¦M5ÿ¤Ñg\89*¢Ô\9bDe\9aITôr\9eûï\14µ\8eäð,Ú\81V\eÐÌq#×SüTpM¥9:\14Û\86 Ð\1e
+§c\12ò\1cÓ±Ð1W°;\92$9\ e\83Äê°JÍ\8e\y¦Ý\15\90a¯V¤Û\1aUzÛ:u\8aíUM\92í 6Ñö\816ÁvU\9b\90óP\9d\90\12³Ee¢õ  \8a^z¸ÿº\19·o!Ïc.ëÀç*Z\83zRÁõ¸ø,ÈU#/o\10\16æ\87Àî\9c\80\1cç4X\9d³\ 5³s\81`r¦I\8cÎ,©Áé\90¥9\8bä©ù\95\ 1Éù\rÊ\84<¯j~Þvu|Þ\ 1M\ÞIrY\13\97û@\1d·PT\11å<\87¨xÊ\9f¸ÿ\8e1î.'ï\ 3²\96\96`\19©!®<úNþÍQ\18\80ì¢@X\8a\87#«$\f\14\18]Ñ0¸æ   i®d!Õe\94$»r¤\89®\ 2Ù\82\92ry|I\9d"®dµ2¶x«jvñëê\98â\13êYÅߨf\15ÝSÍ*\14\951\ 5¢â Î>>dÝßbüûJx\1e\8ay\16h\aêI%)à{\ eÛrs\99\0ãâ~0\94\ fAZy(R+Â\91R\11\89¤Ê9H¬L\10\16\vñ\95\16I\E\9e4¶¢L6»Â-\9f\14\10]Þª\98^¾W\19Yþ>ùJ\11¹ø®"r\91¨\88,\13\ 3¢J\89«\8f\13ÌÁáB \93­÷Æ2`y)PKÊ8Î]LßWAß³\ 4H^ªFBÍ@̯}\1eñµa\98ç\9e\82¹îhĺã0Ç\9d"ĸ3\85\99n»d\86»X\12å®\96Ns/\97½èn\91O©}M>¹ö¸<Âý\85<¢æ\8e<¢Z\94G,!U¢|²\9fw\99ó\ 3Ô\7f\95ÖÐK½\ 6RE\8aø\9eCíôZ ±\8eÞ§A\8a\98ßõÃÌÆ!\88n\1c\85\19Ë&`ú²©\88òÄ Ò³\0Sy\90_ôX\85)\1e§\10á©\10&z\1a%\13<ë¥ã=\1dÒ\17<ïHÃ<ç¤a\8d?HÃ\1aDiØˤþWÞd®÷Tó<Ôp/.¥ï$\8bH.µ³¨\9dL\9b\ 3ÌXEÿ¹Z\85ÉÍ\81\88h\ eƤæÑ\98¸f"Â×Db\82w\ eÆ{\13ñ\82×\88\ 3c½¥\18ã­\13B½^a\94·]\18é}K\bYÛ#\84¬ù^\18±Z\94\8ch"«DI\88\9f®*Þ\8d/\ 3ëë¹\17©¹\84\14ò=»\915X\ eÄ7\ 1Ñkè¿Ö\ 1ã7Ò\83µh\11ºy Fm\1e\86\91­c\10Ò:\11#Z#ñ|[,\9ekKÆð63\86µ9ñ\9b\18º¥      C¶ló[|\18¼å\13\ 4µÞFP\8b(\ 4m"\eÉ\86>öP{Û
+Þ      \8cµ~\19÷\ 1u\1d´\86ÆÕ@\82\17\88ÙÀø7\ 3\13hYGo\a\86·\v\bڥŠ\8e\ 1$\18\ 3;Fc@G8\ 2;#É\<Ó©GÿÎ\1côÛ]
+Ýî\ 6²   ÚÝû î<\ 5\rhw=\86\b];ÙÑG;õ65\ 3+¨¹\84\14P×ü\aÖ`\130\87ºÓ^\ 1ÂÛ\81ÐN`Ø\1e`ð~ \7f\97\fj\9f\16\8aC\ 3\10p(\18òC¡\90ùÂ!ñEAðÍãeÃ\ 3ïãaóqCùè1}ôº¾£ä\ 2\9b\13úÜC"?\f¤«\8f6j®e¬õ¤\94º¶6Ö\80ñÆí\ 4¢v\ 3\13÷1þ.êû\80Ao\ 2ý8\95ê]@8¦âÅB\7f{|\10a#üÞhB\8fû>\9b\9fn~p»és»yÀ»\99èn\16±ûuò\11ù\17\7fó\98\88¿°\81º+¶2\a\8c7\9fº\99Ô\9dÏXg\1c\ 2&Qs45\83©9à=@{\ 2\90\9f\ 4?0ä#     pZM¸\8e\8f¹\8e3ÁlF{\9bápà3®ã,?ÆgyÙ\9få!ïa±{(pöm>/\92»\1c\8b¿Ð´\8d÷Á. d/`=È\1a\1c\ 1f½CýãÌ\7f70\94\9a\81\7f\ 4Ô§\ 1É'Ôþ\8cü\85ü\95\9c\13\80óJà\82\ eø"\10¸H£ò5\9bôKã\81Ë\Ç\15~\8c®ò¿Æ\8d\7f\8d        ¿Îb^?En\90ûD|B]\akÀ4å\1c\ 6\1dCÝIÔ\1dÅX\9f=ÃÚ\7f
+(zü\9a\9f\93¯É%ò-¹B®\91\eRà&kóOæä»ÁÀm\1a\95ïÇ\ 1?r\1d\18ÜåÞ¸÷\12p¿\85\ f>&üÇ\a?<aÑ\ 1ÀÎØõÌõì\ f\80\bÆ;\92ñ\ 6QWw\ e\90}I\8d¿\93Ë~½\9b\84\85\ 4\8d\b§\ 2Ó\8bû\ËC\rð\889\11Y\e\91M»ÈFMÔ\13^Æ"\ f¼ÈÄ\8b\fXd\90âçO\10eÃèD\87úé\1d\8f$ãH$\89'\19ÄNJH\15©#ËI3YOZÉ+¤\83ì'\87ÉqÒëpÿ\86Çø\ e\8fèw\7fâÛS\1e\92\1fÉ\7fü\88\8a!\10\85Á\1c\r"A$\98\8c!¿%±$\95X\89\93,"KI\ 3YIÖpþ\rø\19m\9cw\a\1e`7î£\v÷p\14wp\92:=LÑ\r¦êî\13­\7fû¹íç\96\1fQCí\80@\8e\9eñ\13äÏE8\89&       ÄÈx\1c\8c¡\98:\15ÔpS£\91ó¯Â\7fáåü\9b8÷V\96g'£ÞËy},Ùqü\ 3gp\1dßà*\7fq\853|Ë\99z¹ü\7f\88:êªtÌ\85\96\fð×d,ã\9bJ͹\8c"\95Z\16êäQ£\94\1aUÔx\89\11\16iâük9W\v·êvn\9d\ e|\85\ 3ø\92¹¸\80S8\87ó<F·\98\91\878ËYÿÇv\99\aEy\9fqüû^\v\9e] Á[£Q@PN\17A\96c9VØ\85\ 5v9v\85åZ\8ee9\17\90 \8a'\83x\13\95bÔzßV\19,ÆxÅhÓÄ\9aXÓ4\9d\9eSgÚ:\9d\98i\9bØ$\9df:}ûEm\9bdúÇgÞ}ß?öû<Ïïù=¿ïï?¼ÿ5T-u'ú@\95D¾ù\92ÉOkñ%kñ)"¨©ÇÇÈd>6ê\94\1aj4â\17hÇGì\8d\ f\19Ç\aØL\8d\9dü¿AÜã\9aÜÅI¼Ã¾x\e×q\aï1\92Gx\93\95»É\7f¾ñ\7f\14¨ÜR*Ç\8dê+°GÇsMµÔ\9dÎ\1a\86PSÇÎ20\9bl<@\11ÿ±\1c?F-5\9a©ÑA\8dÕ¸Í\1e½Å\1e½ÉÞ¸Á5¹ÆZ¼Á¾x\1dWX\8dwq\89+0"<Á°¨â¢¤â\82üMT\8e8UK¾\ 3<á¨yÌX>\96Ʊ¦þÌs\ eî\v\8bqW\\86·¥\f¼%åá¦ìÀu¥\12W\157®hZpYÓ\89Q\9f\1e\òéÅ\88ïv\fû\ eâ¸C8?î\fÎ\8d¿\8c3\1cn§&<Ä\89I\9fãØd\15GÈáo¡N¡~\0·:GÜ\1f§\ 1¿ äøÓ\8ax0n\ 2îú\ 6âöøù¸11\1aW&%atr\16F&Û0¬-Á\ 5­\vçµ\1e\9cõóâ\8c_\17Nù­ÇI¿~\1c÷\7f\15\ fàHÀ)\1c
\ 1\ e\ 6ü\10\a\1d\86\ 2?Ç` \8a½STì!»Ç\b|\86:\9dãl\16GæË\1c¹<vîqäßáû\9b\812®kµ\18\r\98\85á\17Ãp>0\ e§§¦áä´\1c\1c\9bV\84\9d84£\ 6ß\9bÑ\88\ 33Û±\7fæjì\9b¹ C³v`pÖ\10öÌ>\86ݳ\8710û\16vÍù%¶¿ô\99°å%Uè'\9b\9fÓ÷\9c¯8V?       â¨_LýHjóȹ\1cÂ{ß<\1eµ3&â̬)8>'\b\87çÆàà¼$¼ör&\86æçcp¾\ 3{\16T`÷\82:\f\ 45cgP'v\ 4­Ã¶ ~akð\1e¡?ø\90Ð\17|^è\r¾.l
+ù©°>ä/ÂÚ\85ªÐCÖ\84|\93/\98÷\1f¨û@\aÜ\8e\ 3Fcy¤GÑßñØ9\16¤Á¡ \0¼\162\17\83¡áØ\1d\16\8f]\8bÒ±cq6¶-.À\96ðRl\ ew¡/Ü#ô\86· \eû\85\r\11½Âº\88]bOÄ~quÄi±;â\8aØ\15ñ¾Ø\19ùX\\19ù/±=R}FÄÿø4\94Ç\10õßåX¿\96Lk¡§6c9\18\ 3ì£\1d\18\f×b r&¶G/Ä\96\18\1dú\96$£W\97\85\8dº|¬×Ù±VW.ôèj\85Õ±ÍÂ*]§Ø¥[/vê¶I\1dº!©-ö\84Ô\1a;*·ÄÞ\95\9bbÿ$7ÆþSj\88\10=cè\9eñ\98õÿ\19\8f·;\ 6Þ3Ò\98?\9f\a\92¨Ío\ 3¬ÉvÝ$ô/\9d\8aÞ¸\ 5Ø°,
\12ôX\93\90\81n}\ eºô\85Â+úRa¥Þ%´ë=¢Wß.¶ê×HÍ      \9b¥Æ\84½²'á¨ìN\18Qêô?Rjô\8f\94jýWrµ^\95\   ÿE\1cã\11kp\9fùß4rýi\7f\ eÓ\8a\r2\96\9d\98¬I¯~<Ö'¾\80\9e¤yèN\ eGWJ\1cV\1aRÑn0¡Í\90\1a\1cB³¡Bl4Ô\89\1eC«ä6¬\92ê\f½r\8dáUÅe8¬T\1a.j*\fw4e\86ß\93\7f(N\83*;STéë<\8c§ý¡æUÚ\8d³fÖ\80ög\80±ô§Ó_±&k\r\1at§ú¡3m6:2BáÍСÅ\98\8c&ãr4\18s\ 5\8f±Hp\e\9db­±F¬66IUÆN¹Â¸Q.3îTJ3\ ejJ2¾¯q\18oùØ\8d\ f5vãß\95â\fU~Jº*Ù\9fóëDÚ2j^¶\0'\bí9¶1\96M\8c¥\875é2\8aèX®Ekæ\f4g\ 5£Á\14\r\8fY\ f·9\1dµæl¡Úl\13ªÌ+Ä
+s\95XnöHNs\87\bZ§8LÛ\95bÓ~M¡é\9cO\81é¦\8fÍô[\1f«éK\8dÕ¤*Ö,U&\925S\95lä#æú\165/å\ 3Gòè±i763\96µ\8c¥+\93w.Ö§Ù< \r9Sá¶ÌG­%\ 2Õ¹ñ¨ÊMEe^\96P\9e\97/8óìbIn\85èÈuKŹmran\8fbËݪX-û4y\963>\16Ëu\9f\1c˯È\17\9a\1c\8bªää¨ò\18\96lU\1aã'¬ù\rj^,à^°±\ fhË71\9enÆÓF\eÖÈ\98Üy\13P\93ÿ"\Ö¹¨´-B¹-\16Î\82d\94\14\8a\ 2\8b`/(\12\8a
+\9cbAA­dµµHy¶Õ²ÅÖ¯dÛ\864fÛi\9f,Û5\9fLÛÏ}2­\7fÓdZU%3_\95³ÆÈS¥1î1׫Ô=W̽H;¾µ\10XÇx:\19O#c©ã³ªÀ\17åEþp\16ÏFIñB8ì1°Ûõ(r¤£Ð\91\1c6!ßQ"æÚ«Å\1c{\93d¶wÉYö>eyñ &£ø¤&½ø\rM\9aýCMZñ\13MZ\91ª¤\15ªrú\18\ 5ª4Æ;¬ùej\9f\\ 1ì¥\15ï³ó®A¼\8c©\96ß+ùÛé\90áX¡EqÉ\f\14\96\ 6Áæ\8c\84Õ\19\8fü2\ 3r˲\90S\96/d\97Ù\ 5SY¥\98él\90\8cÎN)ݹINuîVR\9cÇ5ÉÎ×5IÎ\ f4\89¥\9f)I%ª\9c´â)R\92C\95\92ÉmÖ|\84úGiÁ\aJ\81\8d\ 1i"\95¤\84ß\8bÊ\0kÅ$äUN\81¥j\1e\16!Û¥\83É\95\84,\97\11Ë]\16\18]EBº«LHu¹Å\14\94äÚ é]\ 3ò²ª£r|Õ¨\12纯ÄUýU\8e«Tå¸
+U\8a+W¥ø²gÜ`í/\94³\17\1føì!mÄM\9cüVXEÏ]\r\98kÇ#«Î\1fËݳ\90á\ eFz}\14Òêã\91êIE\8aÇ\84d\8f\15\89\9e\12Aï©\11\96yZÅ8ÏZ1¶~\87´¤þ°\14S\7fI\8aª\7fO\8arÿY\8aªS¥¨ZU\8a®!ÕϸÂ\ÏR㻤ÏŽ@\9aH5ß\1d5¼÷¹\81¬\ 6 ­IFJód$µLEbË<è[ð¬u       â½\89\88óf`©×\82X.à\12\10ím\12¢¼ÝB\84w«¸Ø{P\fó\ e\8b¡Þ»bhë'bh\8b*\866\91FU\f\b¯\1f'ê¹\ eÔZÏëa\a©'å|/¤¶¹\99ú^@ß\ 1\1c\8f%¯ø#¦k&¢»\16 jU8"W-EĪd\84¯ÊÄ¢n+ºKÿÍu\99G×|¦qüû»\89\b\96\95,\96$\96\9b&ni\87©\9eÃTUk_\8ap\92
+\13"\12\82\88$\12\12É\15\12Ô\92PJ\8b ÌÔ2\87\8c\19UcÌLU«ÆÑÚjj\89:Jû\9bÏ\95\98:óÇGr#y¾Ïò¾Ïû<ê\92\95¬È¬\f\85g\15\1a\9d³*\8d°¬]FhÖI#tÞM#4Ó4B3`\8ei  M7-a°\v­*t\8afp\16Y\rSa*\8cágCÑ~m\8eÔw®\14·@\8a^dQÔbOEäú*<7P\9ds#Ô)7Fayñ
+Íë¯\90¼Á
\1f¡ üÉ
\9f¥\ eù¹j\9f_®vù;\14\90\7f\\ 1yß)`ñÏj\9bc\1am\17Av\ 3Õ3y\1ffó.°\12\99\ 2\13øüN\ 65`={e!ñ/\96bò¥\88¥Rpq\13µ/ñR»\12?µ- T@i\84Ú\94ÆÊ¿4A~¥\ 3äk\7fS>ö±jm\9f¦Vöùò¶ÛÕÒ¾U^ö#ò´_\91WÉOjYÌ\16Q\ 4Ë\1ax?\8b¾\84Vv&g\11¦\10ó¨ùì\9eÙRÿ\)¡\0ý"ôKÑ/\93\ 2Ê¥Ök\9bÈËá%O\87¯<\1c\1dåî\b\87XµpØÔÜ1PÍ\1coËmÝ$5q¤ÉÕQ \8bc\9däøXFåç²TÞ\95e­)×
+SMÖ4PI\8c\85¬\81Yh¦Àx>\ f]B\r\96\12öÏ\95\1a)\8851 JjµIòØb\91Û¶\162¶1\foc\0­\ e\ 2\86¯ê\9eR\r\ fP\r\r¾\86ÆRC¡k(b\rÎWo\avÌm7á)\98\1cÄ\ 6Ê
+é      Ä\9a\ 6\89äzørjÀ\9fôE·§\ 3ý\rèo\96ÚTKÞ;$÷]\92++«>v\ 3\ f\1e\1aöÛ½\fÆûðc\1f~ìÇ\8fZ\86\81Z\1a}-Í¥\96b×b¼\96\0j\ fÀWüÎ#0ÿG±\9d\1c\90çiè\8e%Ïo ûêFɺUê\82ëÁhú\7f$µÜ/5?(\19\9f ÿGøÔ   ~\1cÅ\8fcäã¸\7fÃ0ü§\bé$~\9cb\09E³¯ã¢×Qà:\ 4ê\b¢®\ e¾\87_À|F^\ 5}\19ÝIÄ;l\v5à×âwKÝö¡\8f¦ÿaÉ\vM·ch\92JV\16±ä0\0Ã\19øÌE:Û\:Ç¢t\9e%áB{é\v\ 6ôKøñu\7fàñ¹Ìå¿L\91\97¾©\85\8bð\0Ìgd\12s2y\1eý¡4\b]Û!©û\11ò\7fTò=AíOI.§\eõÎÁ?\0\13ú\12H+\8b\98X£¤«MXPÜ¥ëää\16ËÊ\1d\86å»øq\8f\87ù>gãA*K\ 4\87»\9e\ 4×c¼þ\eÀ\8fúzM#ßc©ïï\88¹/ñv?\8e>º>Äé~\16Ûçá_\8dzN­oá:p´t\eîÀ\ fp\ f\1f\9bJ\8fÉÉSjc² \98\fÇ&C\92ÉÙ0¹ð&51I¶I1Í/à\12\egÀ³\1d×\94_ã÷\81\10\ 1q0\0Þ\8410\ 5\1cX\bùP\ 4+`\r¬\87\13öë\17\9fÙP\9fàðOl°\8fùés\1eÂ\7fà&\wî¼ò\85V\8d´\866\10\ 6\1f\f\82\110\11\92a&ÌÅ~¶\9ej  ö\8b±[\86ÊZ=Ò\ 6ìW«^»u_\9f\90\9a:Rt\ 5½ûú\9e¿zÎmø\16®Àe§\ f.Þüë\ 5\9e\8dø4æ¢+ÄÃkÄ4\94xÆ \93\88F
+)OÃþ<ì/Â~\ 1v\97ë\96V\12W%qmÒwÚ¡kÚ§\7fë\18:\7fGç6¥|"gÖ¿lä"\\80óN\1f\9a:u\9b\83[ã×\96ÏjòD\9dÑì\89æ+D1\88²¿\83Îx4¦b\7fº®j6ö³°\9f\83ý\ 2ì\96plVcw\1dv·R\85\ fõ\19¹ø+\97è4\7fñgý¨SX>       Î¯u/`¶@ÛàhÈ\89\93ËÖÄ\18\84f7r\16\8fÞ\0}­!ø>\12\8dwõ7%é,gã\8cÒ¹¢YØÏÁn!öK¹¾kt\9c\9a\1cÕvÚÈ>\1dÖ    <¹¤\83º«Z¬\1f\80ÚÿäÅ\98®\r>üâ<ÖrÑ\rjr\85sqQ\9dÐëA</£õ::o¡1\9a\fO¤E%é\ fú=\1aéhÌG#\17{ËP-Ó^9ô\11¹Ø­=Ú\85'\1fp©·S\8f\1a²[\8d\92\93m/`z¢Ïuª§ÍÜ\82«®Î«ß\94\¶"¾\ eD\11\85\9eUGô*:\838ño£1\16\8dÉh$£\91ÊM\98à    X\88N>öKP_Ã\rÙ¤÷ù\9f\8d4Ö*\973ZïzC\ e·Çªljjm3S\15/`ÒR\1eÁ\r_Z\80\1f-\8fö\7f
+¿N¸º\13§¯\ e\1a!Úë\12­ÝMúh§Ûoµ½Ù\eªn6\[\9b\8fÓæ\16\89ÚÔb\9a6ºÏR\95û\­wÏ\91Ãc\99*=V©Âc\83Ê=?ÐjÏCZéyF+¼n©Ôû©\96{ó>¼@\11<¡½ÞiGK\r¦\15\86Ðþiù\a\9dO\90ó)r÷ÔN϶ªñ
\96\96½´Ñ»\9fªZ½.G«¡ZÛz¤Ö´\9e r\9f©Zå3]+}fk\85ï\ 2Ù}\97¨ÄÏ®b?\87\8aüj´Ô¿V\ 5þ§\95ßæºr\ 3\9e(§­©EÏ hà!úפϣxzº \1dήA{ÛÖ\81gÕ¯\996ùúh\9d\7f\88*\ 2ºkuÛx\95µë/{ûÁ*é0LÅ\1dFkYÇ\89ZÚ1I\ 5\81©Z\12\98©¼ \1cå\ 6\15+'¨BÙÁ[´0x¯æ\a\9fÔ¼\90\f\8c\1c¤\87üÊ\ fÄ~©+OQ\ fé\0ì\88fçÃ\97uø²6ÄPy ·V\ 4·WIH¤\96\85õRa§¾ZÒi ò:\ fÑâðáZ\14>NÙá\89Z\10\91¢ù\11³5/b\81æF\16*#r\95Ò#7\19i\91{\8cYQÇ\8dÔ¨+Æ\8c¨GÆô(ÓHyNd\ 37xòÏñ´\1c\8bgß{\89\8a6\9fWvg¾"7Å\11\1e*\8cl£¼.aÊé\1a£ìn  ZЭ¿²º\ fÒÜè·\94\19=Js¢'jvL\92ÒbR53f\9e\91\1a\93\88Ya¤ÄT\19ïÅì2\92c?5\92b/\19Sc\1f\1aSbM#ÑI̯\%î¿ \7f\98ñgûË\8c\}¤2|)â©)\88\8cn®E1>\9a\1f\e¤¹=»*£\97Ué½ú)­÷@Íì=D©Öá\9aa\1d§éÖ)\9af\9dn$[ç\18\1ccªu¹\91huX&Åí°L\8c;by7î\9f\96ñq\ fÀ´\8c\8b3\8dqÖFz\9bÆWh\9dD{ÿo¤Í\8c\1dåý\88\9dÏù ì\9dqÌÚ½]\95iõVúK\1d4+>B©     =5#Á¦\94>\ 34­Ï`%Û\86)É6ZSm\93\8cDÛ{Æd[\9a1ѶÐ\98`+²\8c³UXÆÚj,£m\87\FÙλ\8c´Ý³\8c°\99\rô1\8dg$\98Æ\ 5b>\86þ\1e\9eùª\ 1ÿå¹ÌãªÎ0þÞ{\11    KH\10e\89\ 5\fKÃ"\98\b\ 4\ 2I&ËL2IfÂLB&Û$$C\b!\ 6² \12\93\b"IT¤BR,\14   ø@¥\14!µ(\15}¤Âc©ÐVª\16«V­Ëc]
+B­ûÒÛ_Hê\1f¿gî½3sÞïûÎ9÷|/>\83¶£\9dXî$\96æEø\rêÒ\90\10®ºÅcU\9b8E5IsT\9d¼@UÉ\ e-wdªÒ\91«
+G@å\8e2#èXa\94\18Å\8e;ÌBG§YàØnæ;ö[y\8ec\96ßqÎò9.YK\1c¶¹$¹\1f_\92môq\ e\9dg\9cì\ 5\8eø\9d.jÀõ]ÄÓL,k\89c\r­a­c¸ªS®UUê\r
+¥ÍTEÚ<\95§'©,Ý© Ó£\12\8a\9c¥F¡s¹Qà¬3ò\9dëL¿³Ýô¥w[¹éû,\8fóq+Çù'+ÛyÑÊN·Í+¤ÙfNj?gÑ8\9eIËK+¼ÝM\8fÍu\eñÜJ,«\89£\86ÚT¥\87©Òy\8dÊ]\13\14Ì\88Qif\9c\8a3\17©È\9d¦\80;K\ 5n¿òÝEF\9e»Âð¹k\8d\÷m¦Ç½ÑÌvo³²Ü\ f[\99î£V\86û¬år_°\\99¶ÙGF\ 6¸ú9\8dƱ\1cÖ\ 2l\83MÙÔ\80\89§\86º,'\9er÷`\95fE¨8;J\859SU\903GK=\v\94çqÈïÉ\94Ï\9b«\o@^o¹\91ã­1²¼Mf¦g\83éò<`9={¬4ÏcVªçy+Åó±\95\92c\9b}¤fCV?§Ð8\9a+õÀ\16/\9e\13n¥-¿\85xBÄRÆg±ÇT\817\ù¹cå_\12-\9fo\96r}óäõ'Êãw*ÇïQ\96?_n\7fÐÈð¯0\9cþ\ 6\7f§\99âßb&ûw[Iþ^+Ñ\7fÚZìÿÈ\ìû¯¹x\89m&æ\ eàµÍ\13ä}$\8f\97î¥\15o\85\86%ô¹PF<\85Üçó\9d/o¸¼ù£\95³t¢²\v¦Ë]\10§Ì\82\ 4e\ 4
+d)=àWZ X)\81å\86#°ÚH
\98\8b\ 3\9bÍ\84À.sAà°\19\1fx\ e>0ã\v¾7ã\97Úf|>äÙæ\ 2x\8aü\ f\16°\16\96²\1fhÃ×A\1d,\87Bðó\1deVVQ\982\8a#å*\8eRzÉT¥\95ÌVjé|¥\94&)¹Ô¥¤`®\12\83\ 1-
+V(!x\8b± ØlÌ\ fÞcÌ\rî4o\ e\1e2c\83§ÌØÒ÷ÍØ\92ïÌØbÛ\8c-²Í¸"Û\88\8dcèì/bOÒ~o\80&ôj`\19×ù<÷\96H\99´Äiå\83äX\16®¤\8a1J¬\98¤E\95Ó\95P\19§\85\95 Z\10JU|([óCù\9a\e
+êæÐJÅ\86n3æ\84Ú\8dÙ¡\a\8d\83ÆÌÐï\8c\19¡÷\8c\19\95ß\1a3\96ÙÆÌò\ 1Êlã1tzJÙ\93Ð\82Þ\1a¨\82Rî}eø¾eèWJ\8b«ð>ÕC5oå(Í]\19¥\9bk¦(®æFÅÖÌÓ\9cU\89\9a½Ê¥\eWåjÖª"ͬ­ÒôÚFÅÔnÔ´ÚnM©= ÉµÏ(zÕÛ\9a\óµ1¹Ú6&¯ègJ\95m<\8aÆ\ eh\87ÛÊñ|PÁu\0<Ø´ô\15ø\ e¬ëüZé¦Õ\834«>\3\1a®Õô\86 \8ai\98¦\1f7ÎÑ´ÆxMmthJc\96¢\eóuCÓ2MjªÓ\84¦6ý¨i«¢\9aöi|Óq\8dkzCã\e¾Ôøz[Qk`µmDÕÙÆ#hl#ÇõËY\8b°\ 2\82àçy&\16\16)\1e\8btS\934\1d\8b\12Ý<D\13["4¡e\8c®o\99¨¨\96\18\8do¹IãZ\17jlk\9aÆ´zu]k±®m­Öè¶u\1aÕ¶Y\91m{\14Ñö\84\9dWDËç\8alÆI¬ÃIÜÞO\ fùÝ·
\8b^\1dTB\80û\9c:æ ^Z¸V\8aŲNoA\7f½\14µ\11\ fØ\1e¦È\8e\b\18£\88Î\89\10£ðÎXX¤\11\9d.\rïÌÓ°Î
+\rílPXç&]ݹC\83;\8eèª\8e3\1aÜ~AWo²5änºø\8dýloàl$ϵ«Y\8bPÊõ\92FÉu+k Y\8ak\93f`W£ÛÑ¿\17ýû¥\91\ fX\1aÚ5L\83»"5¨k¬Ì®I2º8è»8\0»yÁw³á»YhÝ$ÔMð][\ 1\r\9f¹\r³¸õ\eé\ 1û\a¶Üλ\19½zò­äs)9»[\99\83\rÒÜMÒLt£·Hã±\89×üT
+ÿ\99\14¶K2v\ fá\90ÃWî¦\19ì¡\19ë¡ùÚC3´\87\ 6d//ù½¼`ö²¸ö\92äÞN\9eï\86'øÝëüç\v@ÿ¡~:Ès\1d\9a5PB­½wK)÷°\ 6Éw\16º\93\1fDÿçÒ¨\1eiÄÃÒàý\18\80\ 3\82¡\1cvÄq\888\1e\1d'\1d&\8e#ÄÑËaÜË\81ÓËÆïeaõR\8b#$pä\10\9c\81KüÖþ\81»Èµ\ 1*\b5o3s@Ù\16¢;\9b\'ïE\1fÍQ¿\94\86?*\rêEû7p\f\87)=I=\8eÓ\88?5Jzz,\870Íá\89\99ý\8dÙ³\1c\80Ï\16K'\99ä\93\1dÀ\80'\9f\82÷xþ5ØWh¦Î+Ñ-"ÌlòMäg±¿\90¦\12òx4#\8f\9e\94̧Ñ<\ 1'á9ø=\9c\86?ÀóWÑ\8c\r£1\1f\899À üe¢ô2q\9c§ù8Ï\81ó
+\eýU&ýÕ. \99רÅk\17à[îmÕïä\9dH\9d\9bö+iÞ¯¥\18ò¼\9ep#Ñ\f;9 ÷<ü\11ÎÁKð2¼\ 2¯ÂßáMø\afé]jò>só!&á\ 2ÍñE\9a²\8b\1c:\9fTK\97\97\1e\92.SÄË\fp\998.\7f¦j\96káaÖáãR\ 2º3нþ\94\14A\8eW\9f\17\ 64ûôÞ\80·\81Rbc¥\7fÂ\87ð/¸\bL³>e~>g\9d|\85\ e\83\ 2\9a\14\9b\ 3ÉfNìû\80\84mÄì\17á\1dÜÞh\185@ßõ8\98
+q\90\fÙP\0Ë`%ÔÃ:X\ fí°\19¶Á\ eèÁ³>¢ïq\81ßáB¿¡x_ë]}¥Ïô%ß~1À%ø\0Þ\85·úü&¾ÒVø\0#\aâ\98\ 47B\ 2¸À\a%\10\96ñ\9b\18¿\99ñ70v\aãÞ¯ÏÕ¥ÿh§>Åg^Æ}~¢£\94æ$%zE\1f\11ÿü`@û}x\13ÎÃ\8bWb\18\ 1Ca\b\84A\ 4DA\fÌ\ 3\azÙè,E£LÿÖ
+F¬Ó\ 5­eü;\18{\ 3ãv0-[\98\9enrÛÅtí#¿ÃLÝq½®³ú\eßþ\95j¼Ähÿç\ 58\ 3§¯ÄЧm\81\ 6>G\90çuä\17\8dælê\96\80\9e\93iÏE£Pï0'o©\9aeX§×\88ã<q¼L\1c\93åú\13ýYÛYº=\8c\7f\80-sô\7f\\97yLÛç\19Ç¿oÎ\86\ 6\ 2$@\80\84Ã\84\80!Ø\æ0`\83\rØØ\ 6c\83m\f6\18lÂaCH \84\9c%\a9H\9a\9cm\12%½Ò´9Ö4RÔ4G\e©\9bÖ©«¦iªVíȦ-\9a4¥­¶e\9b¶ì·/    Ò\9aýñ\91ì÷'½ßïû¼ïû¼ÏÃãü)îÓÍ't\7f\97³Ïpg\96ÛäÖS\ fx\8eÇôô\88ûó\90±x\80\fƬ\80Z\1aêÔQÃÎùÝÜåNúïá\15\1d Â0îÑÇ]ú¸\8dý\9cs\8a«?\89\9b¸\80\e\8cÅu\8eü\80«¾Æ\1d¹ÊÕ]¦Ê\f\87\99ö\93\99#={Ì\7f\8dÅÔ\8cÁO\90J½5Ô*á:tÔ0ã#4qþV¦©N|H\1f\1fÐÇ5Æã*}\Æ.¼\8fI\â\9e\19\9eÎ\8bx\93N.Ðñy^¦s\áÙ§'÷y¤\ 5\03\ 5\1e1Íün\1eSÊÓ4°\80ñ[BÍxê¥S+\8fk)£ç\1ajÔóÄ9\18é6¼\85.jôRc\90\1a\e©±\8dsNàuîÉiÆâ$¿\1e§Ãc\ÁQîÇ4W9s\83¦f92Ë\13^åo\99ò\1fð:\7f\11  |Ê\14skáL*\ e£n45\93¸\1a
+©¥¡\8e\81+´òä9qJxpBøq|N\1f^\9d3\84£sÇðÊÜqLÍ\9bÄáyÇphþyLο\82\ 3\vî`ß\v_aï¢o±'LÂî\17\9fç1uÿ\18Ç4Ätr\8fÏßõX>?Lý\17éåí\85á¸0?\16g\16Êpj\91\ 2ÇÃJðê\8bU\98^lÂÔb\e\ e\87·àPx;\ e\86wã@x\bû#F°7b;&"öawÄQì\r\ eã\91\97±#ò\ e¶G~\8d-Q\7fÅX´\84MÿÇ7Ôÿ\9aÏÌg«Ø÷¦Q;\85O-ý¼ÆñSQóp2"\12G#\13q$*\ 3\87¢óq`i9ö-­ÆÄ2\vv/kÂÎ\98V\8cÇø°#¶\17Ûc×akì\186ÇíÆXÜ\11\8c.\7f\1d#Ë/a8þ\166Äÿ\1cë\12¾Ã`¢\84\81\19\12þÇCj~Éòãc>1ï1½\9fÍ\ 4\8eÓÏ\14Ç_¦\97Cq\8b±\7fy,ö$È°31\a;V\14cÛÊJlYiÄæ$+6%90\9aìÁH²\1fÃÉA¬O\19ÁPÊK\18L=\88PêI\ 4SßA\9fì&ze?ÅZÙ#t§I\bÌ \9b%UÂoWó9R2\ 6\e¹ÔWP\9b~X\9ea\ f½ìJy\ 1;R¢±U\96\84±496®*Àpz9Ö§ë1´Ú\8cÁÕv\f\11Ìð¡?£\17}\99ëÑ\93¹\15Ý\99û\11\90\1fC\97üMøä7Ð!ÿ\1cíY\7f\86'K\82Gþ=2%|Å'å>K\9fËäL!×Ïrl/ý\8cç°ç¢\97Í\99s1\9a\11\89\rò\ 4\fe¥c [\89à\9a\12ô¯©Do\8e\ 1=9\rèV8\10PxáWt£S9\88\ eå\18Ú\95{àQN£Uy^¸\95\1f\88\96Ü\1f   gî\9f\84#÷?¡\94ð\14Å3¾¤Þm>ó\17K\81\13,;&Y\ 2\8d\17±ÆÍgßɸl`\\ 6\15á\b*cÑ\97\9b\8aµyÙ\bä\17Â\9f_\81Î\82
+Ìè(´Ã[Ø
+Oa\17Z\v\83p«6Â¥Ú\ 5\87jJ4«Î    »ê\9a°©>\13\8dª\87ªzB$a-\9c¥@\12\9fSïf\ 5÷\81Ïü4\99(c¯CO#ô²\8e±      1.½\85aèV-EWQ\12\99h/Î\83·D\8d\92\96\1aá.m\84«Ô\ 5§º\ 3Íê^4©\87aS¿$¬ê\97E\83ú\8c°¨¯\b³ú¾0©ÿ êÔÿ\16u¥Ò3J$a"?¤ÞõJ\9eE>ñ\87ÉN\96Å\9bèi\88\19\97µ¤«t!:ÔQð\94%¢µ,\1dîr\ 5\\15ÅpVhЬ©E\93¦\1ev\8d\ 36\8d\17VíZÔk\87`Ñn\17&íAaÔ¾&\fÚ÷E\8dö\13Q­ý½¨Öü\8bH¢ºâ\19\92¸OÍ«zà4KáI²½\8a='=\ 5é§\9b\11\8ff\1eÜ\9a%pi\97ÃQ)CSU6ìU\85\95êӣAgF½Þ\ e³¾\15&}\0Fý \fú­¢F\7f@èõ§\84Nÿ\9e¨Ôß\13\ 3òO¡ÕIB[%\89Ê\19*%q\97\9a\97X\ 2\1f'{Éæjî\ 1é¡\1f\1f}´ñ»\8b¿\9bõá°UÇÀZ\93\8c\86\9aLXjó`®-\85ÉP\85:\83\11FC#j\r-¨1tBo\fAg\1c\13\95Æ}Bc<!Ê\8dï\8a\1d¡6þF¨\rÿ\10êZI¨k$Q6Cµ$nQ÷m\96¿Ó\ 6ÞC2J\82Ä_K}ÆÇÉïvþo0\86ÁR\17\r
+\18Mé0\98\14¨5\17¡Æ¬\81Þ\\v\9d¥\1eU\16'*-\1dÐXúQn\19E\99eB\94Z\8e\89bË;¢Èò±PY~%Tæ¿\13I¨L\92(ª{ÆÍ:à\ 2Û¢Ã&`\a\8a^ÒÁq\a½5ò·\85ßë,\vQ[\1f\89ê\86xè¬2TY³QÙX\0mc\194\8dz\94ÛL(³5Amó ÄÖ\83bÛ0T¶](°\1d\15ù¶·D®í#¡´ýR(\e\1f\v¥U\12¹\r³ÔKâÃzæ\ 52I¶\90A\12 mÄFÌVö\1cl\99tö¹Ð6\85£¢9\ 6åÍIP;2PêP¢ÄQ\8c\16EN\ 3TÎF\148ÝÈw\ 5\90ëZ\ f¥k\1c9®W\90íz\ 3\9b\90»~\ 1¹óo\90;$d5K"«\89Ø%q\95e÷I2AF©ÕO|¤\85ÿ\eì\80¡\89}\17Kâ²\16 Ä\1d\ 6Uk\14
+[\13PÐ&C~[6òÚ
+ ô\94AáÑ#ÇcÁ\1a\8f\13Ù^\1fäÞ\ 1dz·aµ÷0VyÏ#Í{\ 32ïÏ óü\ 5²6     i­Ä-aU\8b\84\8b\9c\7f\9a-Ù8YOÖ\12\ fiæ¸ÉÉ\9e\83Úåmìý¼@®o>r:#\90Ý\19\83¬®\95\90w¥#³K\81\f\7f\11Vû5H÷\e\90æ·A\16ð 5Ð\87äÀf$\ 5&±"p\16\89\81ë\88\ f|\81\ 4ÿwHìdÅê\93°b\86\ e çÝ|\97¨³\95\f\90.â&\8d\1c7P[Ó\ e\14³MÊó³÷`븪o\11Rû#\91Ò\1f\87äþ\14$\ 53±2\98\8b\15ÁR$\ 6uH\bY\10\1fjA\¨\e±¡\11,\víÅÒÐiD\87®"*ôcD\ 5¿At\9f\84¥½³ôH8ÅõM\90\8d\1e\9eEÒN\1cÄLm]'{Ï\0\90Ï\16é¿L\97wXÕç\15Ç¿ *óÊ\10\ 1\15\10p\0Ê\90%D\8dq\ 4E\14\17¢\b\88×\81\10\14\11¸¨\f/B\1c\88«ÆE\1c\89\e\8dyj\1c\8d¢Ml\9cµÆ`Ö\93&­¶\89Ñ8ÒÖª16Mn?\17\8fÏÃ}~ü~ï÷\9có\9e÷=çô~\ 5ý¹\92\8d¼\8a\9däYâ¦\8e%Þò(    \90»)Dn¦(è/WS¢:\98ÆË`Ê\96\8b©@Φ%r2m\94£é ìKÎÊ¡ä¶\1c\8b\7f\96Ó|\8b\9c­\142\9dL\97Ìh\15ÂL\98\ 2cxöò,ö W\8a\9e\83þ<ô\8b$ßRÉk\113`\85\9d\ÌÎr2»ËÑì#\as ìÍ¡jg\8eQ[ó Ù\99\93ek\9e,\e\9bùÀ¼\ 6vsð\18Z+\19Ô*\9fP\10ébË[¨åµ\85\90O\9c\8d\90Êï¤<i\10>ÇÎ\97ú\98Ðg\19ß
+©S\153`\8dä¼ÌVíj\1deSË\8c\91\ 5h\80ê(Âu\14\9a:.\96:\12».\eX¤n\190g®<ÊûÌ\99+\1e\ 2úË[¨F«\18_sa
+¿SðyH1g`\81\14^.õ@×÷UÉs\ 5ú«$§µ\92Ýz\1aß\r\e\9d\81fp\93'E\97\86g\v\rÇ\16
+m=E¸\9e\8b­\9e¤®'\98õ\95°\81ÿ½Å{\97xÿ\1f\80þÆ\16ÊK¸\9bÑ4Â\ 4b\9dXÆ94s\ 6Ðí\89®ïj©#\9a\86M\92C½d\83;\8c\91ærÃ\8e]ر\a\12\8f½Ø±\1f;\1ah\8a\1a(|\aF\ 1\89u\80\8d\85]p\9aw¾år¦\9bß\87\r{é)ñ5\17Ò\17\93\87Õ\9c\83åä º½ÐõÝ\8c>\9a\ 64ÛïA³\ 1p\85&\9fB\a\87á\1d\ 6\82£4çÇhÎ\8f{H¿c_N`G#\8dI#ů\91\14Éu\8aX4²`ã;ð1°\1f'-ÍÌc\7f³Ù®quÜ\ 5ë¸\ax-t»ä\8fÉ\9eû%\97CR[«Ö1Y\e\82÷à}8\ 3\7f\80³6Ò9\ 6\82ó4ã\17\19\12.ûH\1fbÇU\9a\8f\8f(\80M\1cö¦\ 2é\1a\81\99&>ºv\v~\ 4\8bf³¿\93ت¤×Ù\ 3â\e\8enÀÛä\1féc8!µ;ݪu\16.4\ f\ fW¡     ®Á§ð9|ÉÐö\17\aé\ 6¹ú\r\8dù-ì¸M\93ô\1dÅç\ eùyw¡t\ f±{\ 4ñÞ\15é>SÝý\1f\94½\83û\bÓ\86\10ã\98#äÀIÉ\a?\r\1f\90{çY÷r«¦Uë\vø
+n\0GL_ÃMÀ%Ý\81\81\r\1e0´=&&O\19VþÛ\83A\92\1cý\85ÂcáÐYØp\v\81\1c\a\1c²ÜdÒr\83\ e­X\7fw\82@\88\80þ0\1cÆC\ 6Ì\849P\feP\ 5Ë`\95~a\9aûYõÌ\8d\1f¦Á\1fÙ¼'ú\80       óK=Ö\ 3=â­\87­Ü\81¿Á\17ð\89\94\ 1\9cÀ±õ¯Õ\ e_\b\858\18\f£ \r\9dl4rô\949÷   sîcìx\84\1dÿÆ\8e\7fiµþ©\rú\9e)ð>sæ]\12÷\8e\1au\9b ~˯\9b\r«|\r×á\1a\\81KÍ68\80\1dØ´þµÚä\rÝñ+\92/û£\97\88ýcÑHgýi¬?\9bµ\vØ\82\12Ö.cÝ*üZÎÚk\98l7âù\ eÒ£\8149\8aÖY}Äæ]ÅZ«æ\9fZ9\ fïÃéf\elAÿ\87\9b\1cM\ f¢ç\87O¡èÅ¢÷\12:#õWöäÏ\9a¢ÏdÔÇØÑD<®²/W°ã2v\Â\8e\vZ«sÚÂ.ì$\95ßæ\b\9d\89\88\93\ 4*VÞ\85£p¸Ù\86gúO\9bSª-±3à\93\15\84V8~$`ûP]dOÎ)\95ã\98\81\ f\9e\8dÂ\Ö.fÍ2\1d×\12² VG´\9eµ·r\85ì×!\9e¼\85e\a\88Ø~²d\1fJVö¶²ç9\e\1eÃ]¸Þ|ä\1cñÉ\1d_|ñ#\18\9dht\ 6¢\91Èú£Y\7f"\1ef°¾Q\a±£\ 1;öcÇ^ìØ£jí"GßÔ&½A,¶\93\17[Y¥\1e\8f6\13ÝM¨YÙü\1c¿ê߶i9æ\7f\ eì\88\97\81XuÂ\97\0üè\83N\1cö\ fÒnÎÉN\8d\89¬\9fÁúF½\8e\1d\8fÍ2\91\r\95dæ2"ñ\e­Ó62ä\0\16\9dP\1d¹YËá]Án¯@õy\9eråßáÊÿ\94«ö,\7fßå\8a9lk½\92\1dÐtŧÎdX\ f´"ÑIÀ\87Áh$¡1\16\8d4429\11ÓÑÈÓJ\15²æB²b\89\96¢ü*_T\13\9d*öc1\91­´¹­
+Û§*oC\9d²{Æ\ 3´¯SöÎÃ1ÊÎ\ 1®Ú\9d<ÛA     ØÚÆ\19ß<8ù~Zg\13¢Õ¶ÑZÙf\80\rÕ²¶ÉZÚn\9cjÚMRuû©ªj?Sfû9ª´/Q\85ýb\959Ôj¡Ã&-pÜ-\93ãQ\15;]T\91ó-\15ºü\ 4Ô\88çø\8e«¬É\8fÒá\8b>eo{gÊ)ÏÖQ~Ö\1aÚh\8d£AµN^Zæ\1c¤\1a\970U¹Äi±áEU\18\12Un\18­E\1d&h¡ë\14\95º\1aerÍU±ë|Íw+W¡Ûr\15¸mÐ\1c·]Êw?¢<÷\8bÊõ¸­\1c\8f\9f5«£¥\ 5\8f\16\7f\81ký0¼I\e²!\80\9f\99\8bòWÃ\95_ín/³\9b»*Ü}µ¨c°J;öU\89ç\v*ê4Xó;\8dÐ<¯1*ðJÓ\1c¯,å{ÏT\9e÷\åú,P\8eO\8dfú¬Ó\8cÎoÈØù·\9aÖù\9c¦v¹©¬®?)³«E\99]\9eñ\19×ùïC)Ë!´\18°*\18m\9eU\ 62÷aËÂ.mTêÓAE\9d½5¯k\90æú\86)ß7Vy~\ 3\95ë7L9þÉ\9aå?^3º¥kz7£\8cÝò\94\1dP¬¬\0³2\ 3VkJà6¥\a\1eÒ¤À3J\vú»&\ 6=Uj\90\81Ïø°7%\9fÖg\17¬\87¥a´z<+Å\96¢\9eô7Äfn\80³^       ôÔì \7fÍê\1e¢\19Ýûjz\8f\ 4Më9XÙ=G(«ç\18eöJSF¯,¥÷ÊÑäàB¥\ 5W(5x¥&\84Ôk\ÈA\8d\ryOcB®+%ä\89F\87XZ\b¶(\ 5.E²\ fQÒ6X\ 5\1e¥<+Ä\96|lÉ%69Á\ e\9a\11ì¦i!]55´\872{\87+£w\9cÒû\fÔä>Ã4)l\94&\86MPjX\86&\84Íиð\ 2\8d\r/SJø
+\8d\8aجä\88\ 6%E\9cÒ\88\88¯à\a\r\8f \12\86C\98E#à\\fç0\966\ f\96C9\14ñ,\1f{rhÉ\18a\94\1dÖV\99á®\9a\12á­É\91\81J\8bì­\89}£5¡ï\v\1a\1f5Dã¢\9246j¬R¢'kt´QÉÑù\1a\19½@#b\96jxÌF½\1c³OCcNjHÌçð\b,\1a\12\rQ-\9c\89§½\83× \ 6\16À\Zã\1cZ\ f#mP\16¶¤GÙjR´\8bRc<5>Ö_ãb\835&.R)qñ\1aÕo\90\92û%jd¿\14%ŧix|¶\12ãó4,Þ¤¡ñ5\1a\9cð\9a^JØ£\17\13Nh`Â'\1a\90ðP\ 3â-\1aø?ªË<*Êó\8aÃ?we1 $\80\92\0n "Ê"ë°\f\fÃ2\ 2£,\8a0Q\10\90\88NHAAÔ(\8a±Ö\15\8cMªq\8fµZ5qÁ4Õ¦\89M¢¡\896mz\9a¦õĸÖ&©\9eÆ\9a\98\ fÃüa\ fç9ó\ 1ßÜß}ï½ïûÞ\eï"ΡÓÉÔ\ 2l\82åÐ\bó\92X?m\87\r_fàK1\9fS\13ÜU\98è£üÄ@Y\92Æ(/i\82r\92'+;Ù ³Á¤,\83E&C\912\f\152¦ÌUZJ£RSÚdHéPRÊ>%¦\9cRBÊÇ\8aOù·â\r\ e%$»Hrè\14íïÎTö#,\85\96¿=\r3ð§\b\7f
\9cb\18¬Ü\14oe§\ 6È\9c6R¦´pe¦E+#=IÆt£ÒÓs\95j\9cª\14ãL\19\8cÕJ26(Á¸\ñÆM\9a\9c±G±\19'\15\9dqAÑÆ;\8aNw(¦\874\87bS\1d:Fë»\rÖ@\8bQ\9a\ fU<\97Cq\1aó\ 6äñl6\ e\90)c¨22\9fPzf\90ÒL¡J5M\94Á\14¯ä¬T%e\99\95\98\ 4ó\fÅ\99«4ÙlW\8cy©¢Ì\e4ɼK\91æ\13\9a\10nkB\96C\91&Èìå0#ÑOa\154A\1dÌ\82é`\85\1c0eIFs\1f¥f{È\90㣤\9c@%æ\8eVBn\84ârc59/Y±y\99\8aÉ\9b¢è¼\12M²ÌÒDK½&XZ\15aY§pË\ e\85Y\8e)ÔÒ\r_+4Ï¡°\Èqh\¶C\aÌR\a,\87\ 6¨\81r(\86)\8c\1cæ¾<zn\8b\14?e\88&ç{)¦À_Ñ\ 5Á\8a*\fÓ¤ÂI\9aX\98 ÈÂtEXs4Þ:MáÖ
+\85\14jmÖ\18ë\8f5Úº]#­ÜÀÖó
+¶~©\90B:Ö\ 2Èwh\14ì¡í^\ f­0\1f­J\98\ 1VÈE7\9dQ)¹\80Ù\93ñ1jZ\7fM(òTD±¯Â\8b\ 35®d´ÂJ"\14Z\12£±%\ 6\8d)ÍÒèÒ\ 2\8d,-SHi\8d\82J\9bôTéj\ 5\96¾¬\11¥\87\15\1eÜÒð\12\87F\14C\91C\81Ó\1cÚ\9eÏÝ\0\v¡\ elP\fùèfÑ\8e\e¦2÷\14¡_"\8dgT\19;s\88F\95{id¹\9fB*\82\14\\11ª \8aH=Y\11¯@[ºFØò4ÜV"\7f[¥ül\rzÜÖ&_ÛVùØ\ eÉÛv\16njXùCùÌt8ñ-sèE4V@\ 3TC\19L\85\F4#ÚlyE\97¡_.\8dat\fªì§ás<ä_í-¿ê\0=Q\1d¢Ç«ÇÉ·&J>5I\1aVc\92w\8dU^56=VS¯¡5ËäYÓ!\8f\9aýr«>\ 3\97å>ç¾<ª\1cò¬ìe\ 3ëk\85z\98\ 5¥P\0¦éÄ\0íØ
+)\82\11il\15ú\8c\8d\ 1u\92\0y-ðÔPû0yÚ\87ËÃ>\12ÆËÝ\1e+7{ª\ 6Ûó4È>]\ 3í5êo_¤¾ö\9fpðí\82S$\9c\81lþ7êSO7=Ï¡~°z&û\ 1\ 2Í"Èá9ÍF\ ef3ûÍA\9fñ(h\1eú\vÐ\7f\8e\19¬©\9fÜ\9aÝ4 ÙK}\9ai~\9ai<\9a¹ü[¸dZ8ÐZØL-\14P\v\81ky\16Úág¼Ãàº\88¡má\1d \8blêåyÖh\87*^/\83|\9e3Xs"k\9eÄ\9aCç£ß ù7IÃ\9a%Ï%\12m\92ú®\18,µ1ϵÑx­¤ÑXE#²\8a\8b\9d\v¯\9d\9d\rÕN0Û1Ò¾\14¶ðÿC¼Ë\0ÙÆPØö\90"p8iFë\99jòÀz§ñ\99Í\9a\rõÔ î\875JÁèúcÂ{¹ä±J\1a¸\86¦\97Ðj}? ùÜ@ã·\11?6áÇfüè\b¥  à\92éäp뤰;YT'\86:×ñ¿½p\86÷®óþ\ 3¾çpò\1czµÄy\ 6\9f\16b\9dF¬c\17Iá¬7x\85ä·ZòZ+¹o\90úw ½\15^\ 6B«mø±\9dx¼B<vâÇ.\9aÀÝø±\97æc/\17ð>\13P\û\9eáw\8cíÝF³z\82w>\85{¼ïpbGsÖ\8fØ\v\v©ÃÅ\9cCÄ9\82ô\85°V¿Mè¿(¹¡×g\a\9a»áU8\0¿\80\83@xu\98æü\88»ô\9a\17Í\bõq\1c?NÒx\9cäâ;ÉAÓEqu\11\8b®\8dÀ\17O¾/\9dø\9a÷\1cNj[9\97\97±\17W\92\ 3â<\91×F¡ë\8fË^\94ò\90W]ZG\80\92¢Mg\0\80\9bp\1a\b¯Þb x\9b\98\9c%7ïÒ \9fÃ\8fó\11\f,\~ÝÔgw-\90ÐîíÀ\97»/\ 1\93M·CO¿À½Hª\8cÄ9\86\18\87¢;b?ùÿ%ú=\9a].­ßÀ;À\12\18\15z\87¡ßÃ\87pÁ9\9c\89Á\90Ae\80ôW\ 6\95Kä/ðã
+MÐÕ\fé\1aõy\9d"»±\1e\88ÅujóúM\9eï©\945çàZ\12å\12Áz\83Ðõa\e»\9fqi¾çÒûÈ¥ÁöÖgð7×`x\19®Àµ\9ea\rn\ 1\1d\ 6\94»ÔÈw4Æ÷©ÑïÙ'?P\9f\ f\bü\7f_\82×à\1c\cÒ\1a
+\9eàázö\81§ \1câ \ 3òa:Ì\82¹`\87&h\856¦·5zÀ´õ=\13Ø}æ»o\99­þÃ\94x\97$}£\8bL\99\8e\1eê6o÷p\15þ\ 2\17 Û9oºÁ@è\ f\83Á\v\ 2`\fDA
+dcaª~P\19\1a\95º§:ìÛ±ß\84ýVì¶é_øñ\15\93ß?\99\ 6ÿÁ4z\83"ºJ"¯\90¼Ë<}®ït      K=|\ 2\1fÀYxËéC?çÜÛK\1fWL|Y[0ë\1aÏ\9aâÐ2¢cA£\18ûåدÂj\9d¾À\8fÏñãïøñ\19~|Ê´ù       Sè\1fÙ¼\17\99T?ÒQJæ\fz\7fÒ9"ñ>\96ßuq\1aNÁ    §\ fú?¾%\16w\88Å\97̺7\89Å5fÝ/\94\8cN\96þLN>V   1,Çv\15¶çb{\ 1%Ó¨ßáÇ;øñ[­¥|;Ñx\85R>À\16êâç<Z7t\9cH\1eCåu8
+\87àÀ#>pr\12WJU}ÑóÄs_Ö\11D¾ÂÑ\89Å÷T½MNΨ@¿Æ\8f7ð£\8b¼\9cÀ\8fãøñ:~\1cÅ\8fÃZ\89íu\1c\1f[±¿\9bÊ8¢}D|\ f\9b\fîBm'ô|î\80í.\1f85Égo\89ÿÁ¹\15\ 6ó-/Ö\11\80Î(t"Ñ\88ÇZ:ös°_\88í\12l\97\13ñÙØ®Åæ|l6bs\89¶©\9dll¤2¶9=Ù\82Ç\1dlâÍds\13\8a\e\1f¡ç÷\1eýÛ®­ö\81ë\18è"\16GÙ'\aÙ#ûõ$:¡èD¡\91\84Õ\fìçb¿\90]P\82ýrìÏÆþ\l.`w,$
\93\91µTÇV½À·W\93\81UD²\8dÌ® ª\97£»â\11îr¼]æê9Ç\11÷Æ \8e\80\9f;\8fåA¬é1ôü°\14B\86Ãñ9\ 6\r\ 3\1a\99(ä²\13¬h\94°êr4*ѨÃf\ 3\1e,ÖRþº\ 4Ï\16ãy\v\19ZDd\17²+\1aÉG#º\8fr\8bëæ"Çü\9bp\10vrÔ¾ÄÑ¿\85+`³Üµ^Þè\rGk4:\91èı\8eT-\93é\7fT\97iL\ç\19\85\1f\83\8d±YÌn\180Ë°/\ 3Ì\0Ã2,ÃÀ\03,3\18\98±1\8cÙ\a\f\18ãÝÁ$¶\13Çv°c¥\8dëxKÒÊ­k7é\92V\8dê´ª*«R¥¶R\7f¤U~µ\95ªV­¢.Q*µJ\97Ûc;RÛ\1f\8fîÌÝÎ{¿ûÝ÷;G:½\9a\ 1\83Ò  r\82qéÌè+YâȦc¬n:ÃJÄ\15\ eFÜd)ò\ 1\8b\91ï±°ù\17ÌG}ÄüVu\99ÿáWjí\8f´ì~U¼®eï³Zr6Ôf_T=/ÄFð|T\1cg"S8½%\9bS[K8\11]ͱè\ 6\8elsrx[\17\87¶÷±²}\88å\98½,ÅLr f\81\85ØÃ\84c\9fe.v\83\99¸\eLÅÝg2î=&â> \14ÿ1ãñÆÿñ¾,Ðwvi9Tk¿¦í%ý?k\825Õt2Y$Dq"n\aGâÓ9\14oæà\8er\96\12j8\90à`!ÁE8ÑÃ\¢\8f\99Ä\0ÓIãL&Í1\91´B(i\8d±ä\8bìK¾ÎÞä{\ 4S\1e\12Hù9#©\1f3\9c\97\14õJ³\96Cq'_vD\9cÕïSyÊ\9dªi%S\1eKµ,'Çr %\85pj6³iÅL§U1¹³\9e\89\9d­\84ÒÝ\8c§÷2\96±\9bÑ\8cQöfL\114-\110\9d`Øt\9eÝ\99¯2\98y\17_æ»\f\8cþ¬\8fèË2\9eÐÿ\98L\83G²_\ fd}>'.Èz¬i{Xû\96d\ fçUË\9cj\99É\8cf*3\91ýY&Æwå³/»\9cÑì\1aöä4\11Ìi'\90ÛÃp®\8f¡Ü \83yûñç-0\90w\94þ¼sô\9a_Ácþ\ 2=æoÑmþ)]ù\7fÆ\9doà6\et=&Ïà»ez\ få²Xâ\9c\96ûãÚ.kß\9c\94jÙ¯ZÆÍ\9bÙ\97\17Ï\1es\1a\81ü\1c\86\vJ\18*¨fwa=þÂV|En\ 6\8aúè+\1a¦·x\f\1c=Å«t\15?\87»ä*\1d%oÒ^ò\ eÎ\92\1fÓVòGa<ÁYü\94we\85ßÐ\12\7f¹
+ÖŪ\98×ÿIí\1fW=£\1a\9b Æf¸8\96Ý%ÉøK³\18(-¤¿¬\82Þ²Z¼å\ e<å.z*<tU\fâ®\18¥³b\ 6\97e\ 5§e\9d\15Z,¯Ólù:M\96\1f\89\ f\85ñ\94\8a§¼#\e
+\17µÄ\9f\12ËbF\8c\1eÕ£(Ç ðY¶ÑgIÄ[\99\81§ÊLwU\19]ÕVÜÕ\rtT·á²vÓnõá´\ 6iµNÒb[Æa[£Ñ¶A\83í6vÛר³©ëÛþ \fê¬\9fRmðv\8dæB­¾CYÐcbAL\88½Ú7¬c~Õاz<Ö(ºm;pפÑQ\93\83«¶\18gm%muvZëZh©ë¤ÙÞG\93}\84Fû~êí\8bØí'©­¿\84­þ&Öú·©ªÿ¡ø=Uö\7fS]g<¥Öà¾]¶[\9cQ49Ü y Æõ; üÚß«ZºUS§=\92öú8Ú\1aRhmÈ¢¹±\0Gc\ 5M\8d5465ÑÐäÂÞ䥮i\88ZÇ86Ç<Õ\8eãT9.`qÜ Âñ\16e\8eG\94:~GYÓ¿\84Ay£AE\83Á]i¾,û{ºIß¡\98\16£bHô\8b.\1dwiÛ¦ØÒÜ\1cCSs"\r-\19Ô·äao-¥¶µ\9a\9aÖzlmmXÛº©nóSÙ6\8aÅ9G¹ó(¥Î\17(q^§Èù\80\ f(pþ\96\82\7fRØjPÔò\947tï\97\9aÕ\8bd\7f\ f\88ý" |Â#\¢¹U¹K\91ÅÞ\1eMmû\ el®4¬®lª:
+©ì°`騥¢³\99òÎNÊ:û)éÜC±{\9aB÷*ùîs\98Ý×Èu\7f\99\1c÷÷Éîü\r9\9dÿ §Ã ×e\90×npS÷?¯û\1fuBX\8c\89!Ñ'ºDk;4(>Öº\95ýº"±tÇQÞ\93DY\8f\89Ò\1e3%\9eR\8a=V
+=\8d\14xÚÉ÷z1{GÈõN\92ã]a\97÷92½\9fÁäý\12éÞï±ÓûkÒ=\9f\90Ñc`ê~Ê5Ùî3â\90t¦Å\1eá\17\1eáRLrH»®[ú\1e\85¢þm\14\f$`\1eH#Ï·\8b\_!9¾
+²}uìÒàeù»1ù\aÉð\8f³Ó¿H\9aÿ4)þ«$ûï\92è\7f(~I¢ïï$\rÈ=÷Ë5\8a«ÒXë\82E±_Z#¢_t     ½^ê\15\93¬}ÒWt,RTÉ\1d\8a$k$\16\91\8c@:;\ 3¹¤\ 5\8aI\rT\93\12h$9è")ØObp/        Áyv\ 4O\11\1f¼L\ðMb\82ß&&ð¾ø+±#r®ÃròC\ 6\17õ|Ç¥\13\16ûÄ ÐpÒ!\1cÒ®\91¶Z\ fj\81ä\ 5\94\7föBêØV\12Cq$\84\92\85\89ø\90Y\94\11\17ª!6ÔBL¨\87í¡a¢CSl\r\1da\8b\82Tdè\16\11¡o\10\13ñ'"Çää÷\19l\11g¥qHL\89 \18\10Ý¢Õ§9(íJi\17+"å\8dJ_±1uB\19p:\92ع\18¢Ã     D\85\12Îbs¸\80\88°\85Ma}Ôa½Ü°n\12\1e\13ËBywî\9ax\vf\95kf?T#\94\83\9b\91\93\9cVJÙ­ïaH=AÛaÑ+\úß8¢9°\aJöI_ñÈ4\ 5)³Ò\9f\87ØÅMD\1d\94ùZ\91áY\91ÙXI×\83(O\1dRS_US[ÕǶª\µª\81[UÎ\=%®êø=\9d«ð¶¢@vP5,\eO8"\9dY=ç¨\18Ô%]Ú6ë\99mzæ²I0ÏH_º)K\10¯¸¸ý0l>.³wR¹ò¤\f×)Õñ\8c\8cÆZ\86\9a\16\1d-vëj°ëú¨Ö5\16ë!¡\8bÖ/êøçÅC\9d«pøÌ'ºV5\9c4X\96Ö\84\86,(zõÛ©g®\9bÖ\1c\fCþ¢ô¥\9b|Dú' z\r"\9e\95þ9ñü&5x\19¾óªãÅ\1dZpTÇ%Õñ\92\16ü\r-v\ez'\975Ñ7ô`\e\vBïcã\86\8e\7fSç} óÿ&TÃ\ 5\83yéiê0(:5Ö\r:½ò \14H×tRúë\10w\16¢ÎK÷\92¸Âc£©\ 6ÿ)¯j<®)ß^×x¼¦÷rSïå\96긭\85÷\8e\9aß\1dMìÛz°Û\1a¼[¯\88¯è\1c\9b\7f\81\eªá5\83Yi\ 6\85Gcݲª9 S\vOkþI7é\82Þýe\8d½.\95¹Ö5âÎ\13Ó\8dB\v²í2\1fâ\8b\1a\93{2å÷ce\88\12ù\ f×e\1e\14õyÆñ¯\a\1e(\14\94K\96kÁ]XX\17Xv\81]`\179\14\11\11DP\11EEE-â}Ö3±ÑªÕ68ƨÑ\1aÇ\9a\18\ 3&\135UcըʹM\9a\9aúG\1a϶&iL\9aLâ9\9al?\b\93qòÇg~¿eÙçû}\9f÷y\8fG¯ã£\8d\vY\eµÑÆ&×Fa·\91ÔV\ 6ÒÊ\ f[Oó?\9fr\89§&\ eû4\11Ý\91\v©CÊƹ\9a\1aäߢÑíÏ\18ûî\90º½Ô©Õ~á?\ 4­p\ 4Þ\0Òª·à\18¼\r'ºK§ÈÉi.Äg¹\ 4¾Ë\ 5è]\ e¼ól\0ç©\8b\v\85\16h\83¿óÝ·àS\rc\1eÊüº)\19\e·\9dúC7`?ú¯vj¾        Çá$ü\11Îur\ 1.Â{ðgx\1fþ\ 6\97hV.37\9f\90\8f«¬\95k\1cz×ÙànPÜ7ÖI7ÉÅMº©\9bÔæ\8d;*ßD\1d2f;y6ñUÄ+Ô\1f\8e\8f«Só|§Î\a\80\ 3.\ 3¥¥\7fÂU¸\ e\84¤\95\92XzºM\9d|\8d\8f;Ôé]jô\1esr\9f\80\90\82zH]< ð\83\9bt9} \17ô\86¾Ð\ f\fvð@      \8c\82Z\98\ 23a\ e\ ftS\8fé|\1eÑÙ=¤\13»¯\17t\97\82ù\8e\89û\96ä}M\aù\95>¥Ó|¤Ûü¢\9d«ð\ 1\\84sOzÞîOúÞ\ eü \0\b\86B}¯24F£QG·Ö@ü\99ú\ 6\1fÿÃÇ\97øø\82\ 5û9\vç3ºÏÿÐ\95þ\8bb½Aá\Õ\19Ru\85\94Ý!u>}\ 4\7f\81³p\12\8e?ñ \9fà\8f^0z\ 6Ý£×½C.¾¡ÇüRCÐ('~\8dnâã\1a>®Ð_~¬fb/Ô%||\88\8f÷µ\11\8d\16¦î%Æù
+Óx\1c½¿âä6\1d§Oïtò\16´Âk?ñÀÎÅøü\18S n)\8cq\18\19G\8a>¡ÇüH^òWBé\8dÔ\9fðq\1e\1fçèsϨ\91سu\8aîõ\ 4ÝçÛø8¦Mhl§\94÷\91\896´Îêu¢½F\16\ f¡ô*ü\1eöÁÞ§<°k1N161\1e\7f´\82){\ 3:&Ê2\15\8d\ fÖQ|¼\89\8f#ª&öx\1dÆÇ!MgÄM:\88\8f\ 3äc¿Ö\11\7f\vñw\92\8d\83ÚÅ/w\12õEªc\aj/ÀvØ\ 6Ïwz¸×YÎ\97:\97ÛIrq\94\\1c¡.\ e+\16\r\v\1avâ»Ù*
+¨¸aÚ\83\8fÝøØI\9dîÐ$bNg\ekb\16\16\12w%[éz\´h3n6\11i#\917P\9bë©ÍçP]ßIûû\ 34ou.íw:·\9dö­h?¹ØK.vi\0þ\13ðnEÃAü\â\17\12\7f\18ñG\12{4\95XK¼IÄ\9bN\ 6\9aõ¬\96°RÖj5\eû*"¬ â/Èärfu)«f)ºOóUû\92ïÊØáp\97\8e-q\17l'\17¿e\8düZ!\8c#\9a1\98Ñ°¡\91É\8cçi\r>Vác%>V\90\8fåÌË2æe   ëe\91æ\91\8d\15\9aϯæ\11i\ e\19l¦JfSQM¬¤\9f£û4×9öαͷÂ\1eháóf¶þ\rxú%{ÆZ\ 51\9ep"Æ¡\93\84ï4-¦6\16²o,P\11\1a¥\9a«
+4jÐ\98\80ÆTÍâm\ 6n\1aq<\8dÌMe>\1a¨¢Éì\15\93ô_x\f¾\1fù\90­ý\18ÇÌË\1cy-°\81÷5\1cÅ+\ 28Þ{wÑÒn}\18W0z\91h%¨¹K\8a\9aºdhVW\97fvËWc·!\9aÞ½LÓº\8fR\83ß8Mñ\9b¬I~³Tßc¡&ôX«º\9e[UÛs¯Æõ<¢1=/ª¦÷gªñ\7f¤j\7fß\13jàb(G\18ÇË\8b\ea5ï\8bøöp\1dhÆßì\0?Íî\1d Y½CÔè\1f­iþf5ô±iJ_§&õÍU}ß\ 2M\f(Q]ÀH\8d\ f¨Ñ¸\80\89\1a\e8C5\81\vT\1d¸FU\81[U\19¸W\15\81o¨<ð=\8d\bú\ 2¾\aß\8f\9c2pôFq\15\88æZ\12#-á9\87Ï3#¹þágj\b\ 4õÒ\94\9f\ 5©>(B\13\82\8c\1a\1flQmpºÆöËÖ\98~\1eÕô+Öè~eªê_¥ÊþãUÑ\7f\9aÊCæª,d¥\86\87lÖ°\90Ý\1a\1aÚª!¡\17T\1cú¹\8aÃ~\0\1fï\1d\1cå\1a¸§ýêÃq¿\ 2æÁ\f>Oáïõø©ÃËøð®ª\r\rÐ\98°\10U\87Ekt¸I£"\ 6©2¡\91\119*\1f\11\ 3J4<²B¥\91cUÂåshäl\15\e\96«Ðð+\15\18v*ßpX^Ã9y¢n)/ê1ON"C\am     \e8æ\9f3\91\ 3³Ô\ 4\r¼OàoãðS\83\97Ñx©\8aê£Ê¨~*\8f\8eÔ\88èx\r\8f±¨4&]Ãb³44Ö£!qÅ*\8e\e¡Â¸j\15ÄÕ+ß8K^ã\12å\19×+ǸC.ã!eÇ\9fQVü¿á\11p\12\19;8\84æ6\8eøµ\E\17@#ÔÃØ$´ù®\12\8f#ñR\16ßS¥ñA*\89\ f×Ð\84X\15\ f4«h M\ 5\ 3\1d\1alÊQ¾©P^S©òÌUÊ5×Émn\94˼HY\89ëäLÜ.G"»\âi¥'Þ\84\87²\9b}OÈ0ùt\0½­É\{­Ô\ 1\1a8\9eg5G~\ 5\7f/ÃK)^\86&vWQb\80
+\92B48)J^K\82<\96\14åYìÊMv)'9_®ä\12e§T(3¥VÎ\94iÊH\99¯ô\94g\94fÝ&\9bõ ¬ÖSJ±^ãù@Ö\14\9f\ 6%w°\ f½Mè.³Ñï¥rÇ\86±PÉç2(áûbü\f\ 6¯µ\8fò¬ÁÊ\194@n\9bQ.[\92²l©ÊLÍ\943Õ#Gj±2RË\95Nc\92\96Ö [Ú\YÓÖ(9íyYÒ\ e(1í\84ÌiWà¾\12S}JjÇæÓntÖsõ\\9cN-Ú©\ 3¨\86r>\97@\11ßåã)\97§;½·²Ò\83\94i\ f\93Ó\1e£\8c\f\93ì\19V¥gd(Í\91£TG¡\ 69ÊduÔ(Ù9Y\16\12\9d«drþF       Îý\8awþAFçÇ2:î)ÞáSB\ 6Ø}Ú\81γ´$ó\1dô:PË\15´\12\86ó^\fùàæû,\9e\ eg\ fÙ3\ 3\95\96Õ_©Y\ 6Ù²â5(Û¢\94ìt%ggËâÊW\92k\98Ì®*\99\õJp5Éèf\87uoQ\8cûeE¹\8fËຬ(×]Egû\9e\10\93åS\v±Wg²\1fÑ\92L\861P\ e%P\0¹àÌæ¾é\92RÝ]eÍé£äÜ`Yr#\94\94\17+s\9eY¦<\9b\ 6æ9\95àÉS¼g\88â<\15\8aõÔ)Ú;S\ 6ï2Ez7+Âû;\85y\8f*ÔsIa\9eï\14\9eçSDn\a[ÐX\8eÆ,4&rý­\82áP\f^p\81\9dVÅæ\91,´oæÁ½4° Pñ\ 5!2\16\18\14W\98 ØÂdÅ\14Ú\15\96¡¨P\91E#\14Q4NáE\8d
+-Z¢þEÿ'»Ì\83¢>Ï8þ\15\ 4dY\96]p9d¡j\fF\8d\17\16¼¸äÞEv\7f À\82Ç®" «\16!\88fRÏzD§1j5\8c6É$\1añHÓ\9a£\891\89Z\esØLµ5\87GÚ´\9d4u¬S\13\8fv\9c´Ù~\16·íLúÇ\87=øíó}\9eç}Þ÷}\9e­J,}Z¶Ò\97e-=/kÉMÙ\8aé\!iZP[\18O»ÑhÍg\1dÀ\80J(\86<ÈE{,Ú#\8bé»K¥!å\91ʨ4+ÝiS\9a3E©ÎL¥8³\94ì\1c#»+W\ 3]EJr¹dsÕËêZ \ 4W\97,®Í\8awýXf×Q\99\g\15ç¼.s%\9dkÅ=~\80FG!ç":õP\reP\b\93idzÑ\1eUFü\15è3ª8ª¤dw\8c\92\f\8b\12\8d\8c4Y\8d!J0FÈb\8cW¼1Uñ5å\8a«©\91©Æ§Ø\9a\18ë\14e<¡HãyE\18g\14é¹
+_+Ê\1dTtuP«ÐX\Â~ ÆZpA    \9fóxÍA{\fÚÃ]è36:<RJ\r3àÌHY\1aL\8aóZeòÚ5ÀëP\8cw\98¢½\ f\9b«Ho\91úyù\81·   \18\fR^\ 6Æ\86\83p\8a\9aêï²\ 1\83}t£Ñ
+\8d\95\9c\87¼V@\11Lâó8´GTKC\19\91\1c3\88¿N²1¦ÄÏ\8aPìÜXõ÷1Ãø¸ð}\¸~\ eu?\a®\9fMìg\81ý\18ñ3gú\9b\81!ÖÏ0å£Cò1¬ù\18\86æâÃ\9c`\1fíäv\1e.×ÁtÞ\97ÂTÞg»Y\ 3\ f3\8e\ 6ôg¡ÏÈ\18ï\97\ 6`6¢\95\8d¦§\8dfc!\17ý"æ©\0\97]\80\837Àf\v°\98\ 1\ 2\bÌ\81v`\90\r0D.b8]È`¶\90\r\1fZ\99\98Ð\99M\9cµà"×\85¼æ\10óèziX£\94\81\89dt­\v$s\9b\14\1d Ñû\1e´GJË\98+;hv:i4º¸ä\97Ó\btsÁ¬àp]Áfë.\a\fu3gv¯\86\1e\9ey\91g/p9Ý\ 1\fª\99G¼äØ ÞR^'\93ë±Ä\9cåC\9fxíèZ\97H¦eRÿ\87Ð&­4u\ô!ðc5~¬!\1fëðc=~lÀ\8f\8d¡\8b\98Ãu\13\ek\13¹Ø\88±\8dËáqþ\7f\98Cñ}\9eý\8aßàÃÚ |èÕS:N^óÉuö<j°UÊ\\8c\16~\1aû°Ô\8f0h.CM&\r\1fl\ 5\96X\8fÑ\bo\8b\96¶Ó\88î`]~\84\1f»ñ£\87\8b®\875顸{\bô \ 2Ù½     ¨\89]¿à¹k4NÁ>æ é\81br\9dK     \8f$ÏßéB\1f\1a)f\ 3:[`\eììk¸i8`o¸\ 1g\89\19\ 2¤gÉÉ~rr\80µ9H}\1c¦\19;Â¥{\84Ãï\bEv\ 4\91Ã$ðÐ\1eø9ÏP\13\a\99,zé)YªJ\\9cBÌcÈóÐUì?t-Ä\19³=¬¹7¬³\1f\ e\86\a\90çá\ 5ø\19¼\18\1eL0­cQÒqÖæ-öË)ü8Å¥|\8aú<ÉB\9f\13$ïÄ!`=Þº!½ù\8dÜÄ\DÌÙÄ|ÿf)\8dx­»Ñ\7f\86\8d\90æOàhXãux3<\10\9d\ 4Òª_Â;ð\1e\9c\r\rL\f\ 6çY\9b\8fðãcöÊ'¬ÉE\ e¸K\14÷e
+é2A]ÁØ\95KpSåë9\vÈõ(bΠÇ\89ÏP\7f\9fÂ+aÍ\13p:¬ñ+ø5\9c\v\ f\87\1fÂÇp\19H¯>\ 3¶?c\9dtÍ$Ý`]¾¤9¼ÉÅs\8bMx\9b\8dà\9d\ 3@\10w~Ç\84\11\r\91\10\ 5q`\85\14\18
+£a2\94B5ÔÁ\1cX\0\ 1\7f±Q¾f\93ÜeÂû\a\85z\87¢¹E¡|©^&ª\97õW½ÍTó¹þÂ\13\8b\ 5x\17\eá\99÷\7fD\84ýH\84\fx\0&@\ 1\93Q\ 5³©G·Õ ¯ðãoLN×\99ë®1É]e
\ 2?>Ç\8f?±Y>c2ý\94\ 2ºDÑ|\84ÊoIÖ9Ýd¦\rê\ 38\ 3Çá\15\7f>¨//w\95@<)Ä3\14½Ñ̤\13\89£\bûNì\e\rú\ 4?>Ä\8fß0Õ\9dãÐú\0?ÎâÇ{Ìwg\98RO³yNé9Êæ%¼x\87%½ªcdí5\14^\85\17à ìÿ\96\ f\9c\ä®\1fñ\98õ{%\11\87\83¼e¡3\ e\8d)Ø/&³.l\eØ®ÇöllÏÃn\eåº\94Ìw±E¾ÏVÙ\88Æv¶Ï\93:Äß^\9e<@ÁìG!¤¹\ f\9e\86½Ð\13öá\e¸\11.§óð®b(÷\ 4Ê?\ 5\8dÁh\8cDc\ 2y\9b\8aí\122ìĶ\aÛuDÚ\84]?Sm+Ù_ÊqÑ\85ò*ì?J&v±µ÷ñ÷%ªä}í Â\1d(n\ fóCØ
+ÿDó:\êÓfk÷m÷\btÌä*\11\8d\ fÓ3z\10ßs¨¶<l\97\89m\ f¶gb¯I\8fËÇ
+´R\rK9Òºñ`­6¡²\ 1\93\8bul®µú\ 3ÜÕ\1atÿÃjàÔÖÅðÖ\v\1d3\9c\1eèI{ÈÅnYа£\91É1\99\85Æ\18üÎÕfå\93í\12ì;±ïÆþLì5bÏÏJ´q\9d´ëaþ®À\8båxÚE¦:Éd'\95Ó\81â²¾\1du\8f\ eø#zo\87\8f Ð\91ÄÍF¾BWA\ 4\16â¨t\e\1a©h\f!Ã#Ð\18\87ý\89Z\89\1fÝøÑ\85\1f\ fáG'~,#\1fí\9aO&\ 2\7f\ 2\10ïÛX¡\16ª¤\85Ú\@m. 6\9bÑn\ eïòs\1c­¯ÆÜ;êwÁ\16Þ¯\ f]\87øñ\b{d\ 5¹XN}v²&\1dº\ f\8dQhdk\89&¡QÀî,EÃÉ*xШÇî\1c¼h!#í¬Î#|ÚBåîÑ,Ö£\91\13¡\91¨½ìr/Ú!\1aá4Gû\11®\99\1eZ¢-°
+ºùÜÁ\11×Îu¸T&b²¢\95\8cV&Ö³Ð\19Ín\98\80Îdt
+Ñ)C§
+\9dZ2Ñ\88íùìÞ%TìJÍ \9bµTO\rÕe°?<ý®È\1dq[îÈ Üý\83}¯Ç¸ö\9fåXßÆ\91º\ 6º`   \9fÛø¾\ 5\7f\9aã"Õ\1cmÖ¼þ6Í\8dLÓìþC4+ê\ 15F\8f\957:Gõ1SU\17\991\95\9a1À£\9a\ 1õ2b}rÇ.Rul·ªLT\8di\97*M½ª0\1dW¹é¢Êân©Ì\1cü/G¹î÷$3ïÑ\12®¤\1d[ÊkK
+-\1fßÍÆ\9f&\eX¢Õd\8eW\83y êÌ\ eÍ\88\1f¦ÚøQ2âÇËc\99$·¥@Õ\962UYªå²Ô©2a®*\12\16ª,a¹J¬\e4\8dK°ÈÚ«\ 2ë\eÊ·~ª|Ûß!È{N`8\8cîNZ\8eu\³\9d\19Ä\ f>Þ7ò]\1dÿ\9b\81/µøRk3É°Z嶥jºm°\\89ÃåL\1c£Ê¤ïª"iªÊ\92\8aU\9aäTÉÀZM\e8K\85\ 3[T`ïT\9e}\9d¦Øwj\92ý9M´¿®\1cûEå$ßQnr°\8f\89vÎJô\1eˤþ\ 6\93\ 3®ÙùÐ\ 43i\93\r¾¯Æ\97éøR\95\1c-g²E\15)v\95¥8T\9a:LÅ©#5-u¼\8aÒ&©0­PùiåÊ\eäÑ\94A^M\1eÔ¬\89éíÊI_­    éÛ\95\9d¾OãÒ_ÓØô\v\1aë¸Åk\90Ï÷x
+­G\87Ò\82Ò\8a\r\9c\võ`ð¹\8aï+ñ­\9cÜ\949"Tâ0k\9a#Q\85\19i*È\18¢¼Ìáú7Ûe\ 2\14õy\86ñG (\97\1c\82\ 1A\96uY`wÙ]`\81e\85]\95]\156\88¬xâM0\9exD£\86â \89\8dÆh´ä\18\9bhÔ¦:±­©M\93\9a\89=Ò$\1a\eÅΤÓvÚI\1c\9bÔÛ´¶\1d;³ý\ 1ÿ^3\1dæ7{ðß÷y¿÷{¿ã©Íwi¬©J>S\9d¼¦\90ªMMª,\98)OÁ"\95\17tÊ]Ð-§ù)\95\9a\ fËn~]6óÇp\a¢²\17\80o ³\9dã}=׿%Ø\83¹Ð
+M|\9eÌ÷!ò©§.ãÀoNP­9M¾1#U3&_Õ\16«ª,\ eU\16VÈSèSEá\ 4\95\15\86嶶Êi] \87u¥ìÖ.\95Xw«ÈzH\85Ö\1fÈb=\ f·x\1f\95µp\90gÐÙ\8aæ\1alA»\1d\e\ 4\91Ï!®\83ãù\9f\9f|Æò\9c·(^UEÃUY\9c©\8aâ\\95\97\8cQY\89\9229m^\95ÚÆÉa\9b,\9b\12û<\15Ù\97«Ð¾Y\16û.\99í\ae²¿ª|û9¸)\93\ 20\97pv Ó\8dæ*\a½\88-\98\ eM0    &ð]\1dÔðÿ*¨pĪÌ\91,Wiº\9c¥Ù*-5Éî,\92ÍéT\89³RÅ®:\15¹&ªÐ5U\16W\9bÌî¥2¹7j´{§òÜ/h\94û¤²Ý\1f*Ûu]9®¨r\9d\83ìFc3×Îe.æ\ 1K\10\81F\bB\80ï|P       eàä;GY¢låi*.ÏRQy\9e¬\15\16\15VØe©(\97ÙãS\81§^&O\93F{f)×Ó¡Q\95\e\94]ù¸FV>¯LÏ+\1aáy\1f®ñ>ª¬\8a¨F\96\83Ø\e\88½¤\1c¯\ 3Í\15Ô\0Æó¾\16ª¡\1c\1c\1e©\84«©µ*^\96ê\14\99«3TàÍ\91É[ |o±F׸\94[S­Q5ã\94SÓ¨û|3\94åkW¦o\9d2|Û\95îÛ¯4ß  \r¯ù\ 5\UZ\r·FoTéÕQ=Füµh.&þ\f¸\1f\87\1að\80³
+}/Þ\ f«P06F£k\93\94[\97¦\1c\7f\96²ýyºÏoÑH¿CY\ 1\8f2\ 3\bLRz`\9aÒ\ 2\v\95\1aX£á\81mJ\ e<«¤Àq%\ 6Î(Ñ\7fYIþ{J®\8b*¥6ª-h¬¬\96æ£\11\81\ 6\98\0µP\ 5e`GÛZ\8b>Ö-o\1cþcB¼2\83\bf(=\98\r\85\8a\95\1arkxȧ\94PPÉ¡f%\85æ*!´BCCÝ\8a\ fíS\ð¨b\82o+6ø\a¸«¸zn\8e\13¢Ú\8c5]\8aÆ\1c®ÞÍ0\11\ 2P\ 3\1ep¢]\8c\19\9b\92W\8f>ÖmĤX¥6&*%\9cªäp¦\92¹J\b[4,ìÐÐp¥¾\12\ e(.ܨ\980\1e\ 46\ 1Þ&|\84fÃ,4b\ 2\1a¹96D\a\8e5\89Æ\8c\0\8f@=ïë \1aÜ|¶¡mA{ôDô'£\1f\96R\9bb\9445AC[R\14\eá@\89pÀDØT#E\83M\1daP\11\92\9d\86\9f\98\86¯\89<\ 4\18¨\bÆ0\82·iáÖÔB\ e\ 3¬Bcþ\ 4þ\ 5\93a<\9f}PÁ{{\90\1e\98$å7 \8feÌhÆ\ 3\126©u\88âgrÑ\98ÅÁ?\9b\ 3v6\aÊ\9c\9cÁM¾\8d\8d¥\8d\ 6ncÒÚ\9a \r0\93mÛx\ 6¯9\ac8û\ 2ü\99ßG\aXÂøfÃ\14\98\ 1¨â½\931[\19\14\ 5ýVô)mâ\1c)n\1e\17\9c\ 5ql(       Ò".\e\8bÉ£=\8b\83\9eÃ¥\83\83ÅÞÁ$w\10¨c:<\b_åÿO\ 3&µý\1c¿¹\ 3ä°(ª\85è´\ 2Ó§ ãõñê&ýâ©\92i\1aúXÕ\ftSæKÃ(kÌ\ 3è\13\86pÀp     [Áeg%yt2'«9d×r¸¬cNÖõ/8&s-Å[»\10Ö³\19ï\ 1\8cäjÌi'7ùUÑ\ 1ÚÐjá±\ 6ÆëçÕC­m¤^0\e\9b\8enr\87\14¿\f]¬"W4\ e\0\ fÃ&ê±\99zt\91G7õØB\1e=ôÆV6à­,ê­Ô¢\87\ 2öðã\9eí\\12¹1oÁÀv\7fÁaM\ e]QÍD¯\99:×óêåÑR¦o\fig3Þtt\93:¥Ø~Í\8dÐ\ 5[`+<\ 6\84äªÆ\ 5(fð"ú$ý±\87\91G/\ar/\e~/\v«\97\ 1\1d\b°\97[óÞ׸¸q\9bÞ}\ fp±Ô¹\ 1ÝZjí^L\ f\1cZ(\1dÝD\96TL¿æ£\86\16Ë\8bkòàÅ\9b©åò?x\11§Õ0\1eÒAjr\88¹ùfªô-ò8F\8f\1ecN\8eÑÜGgñÝZ.Ï\ 4xé;\ qS\87Y\e\87¸S¢;\9eZ{\96Ó\ 3«¥\ê\9bÞÍøûÇù\84¡Ù¯·¿_\ 3\18\1fb\ 2S«ã@H\fØ Ax\15\82þ\ 6\97ÑÓäq\9a\ 3÷4\eÝ[4Ù\8f\10z\93õq
+\17qê]ø\13üC\93\98&\1fé9\18³©\87õÏx\93Ð\1dò¬1¶~Íc\86ÎIÃ\b\9d2è7e§á\1d8c\18\95~³ö!|D¿^ \8fK¬ÙK\1c\8c\97Xð}4Y\1f\8dÔ×+]$ØÅ>¸£À#\9cI̯e'{\05N¡®±\87\8d1¾bh¾\ 1o\efì=Cc@\a~    \17áW\86ad\v\1c\9fÁ\1fÉã*ór\8dÞ¸Î\9eq\83Mæ&µ¸ÉäÞ:$ÝfϼýÉ\80ç\1d$\ e\12`8dA>Ø \12ÆA\ 3´\18Îd\ 1,Á-­Ô=\9cÏßqB\7fÃ\15ÝÅ\ 1~\89#¼M\93ÜÀµ]Å[}®wu\ 5\9fù\19O|ʯ~\ 3\f¼  ¯Á\7f\17ýy¤A\ e\85\96\ f\9dzýEaÝÁ±Ü \8f«äñ\ 5
+në2.ïS\16ÎïY4¿£y\7f­½\94åy] \98çõC4Ïë\ 3Ýb\9a¢ú9¼eh\9f\80ãÿ'\87{øÌ»Ja,#t\9dZ\S     Z\15\8c£\96ø!}\82\9fêÃ5}L\1e\1fá°Îâº>ÀU¾ÇÆñ3òø        õxG;h\93^Úå\10ms\ 2·{\86V½¬ï3\9aï¡ò]8
+\87áÀ\7fåÀJe|âIé·\1a\86N\1aS\9d\8dÆ\184\1chT\12ÉO[\84\88}?±#Ä\9eIìy´êbZg)±Wã*7êeõÐÆ»ô\12\1eï\bj\87¨ÅAªr\80\99zÁÐ}\ e\9e\86}F\ ewûÛ\aú\8c\96ã\84§\rShÇ\11ä\9eGîV4\Ô­\9aØ~b\87\88\1d&öTbÏ n\e\95_Äò}\90Ø«õ\fýÑ«mÄ\7f\8a¿\ 3ÚM-vé§,õϵ\13Å'`\a|\r\1e\85/\8d\16>g,³\93Æ\928B-^T*ñG²\ 5\99\88_L|7¹{Ù¢üÄ\ e\12»\91\99\98Ó\899\87\98\8bØ:\97\12w\r[i\17³ò¸ºÉ¨\8b\rå\11\99\99ܤ¿ò\1a\1d`\13<\fWÐ;k,÷\97áEx\ eö²N\9eT2yg\10?\87øfâÛ\88_F¥½t\9f\9føAâ7\10\7f
+ñZ\99\859\1c#\8b9N\96³ZÖ\93I\8f:Y'«¨Ö
+ª¹\ïÓ9×y\8dþ\ f\17\8då\7fÔØv÷\18Û2»\19\1aÃ\88?\9cø\99ÄÏ#¾\85È\ eâ\97\13ßKÕýÄ\ f²B\eÐh&þtª0\97\0\7f\9djg´\8b\18ÁBF5\9f\11Î×\8fé\9eËp\ f¢ÿ¦\7fÛù6ÇðþX¶f¶û\1e\8e\9fÍƱ¸\96ZtR\8b\95ú'Óe\1eÛæ]Æñoâæ¶\1d;v.çpì8q\9cÄNlçp\9aØ9ì\1c\8e\9b&MÓôN¶v-m³vëJW\9arT+[§v\rêh5­´¬[\91@ÝQ\90ZXA\\9a¦1&
+\f\r     þà\12\13\90\82
+\12\b!:Ì'©\91øã£×ïë÷ý}\9fßù<_+ñ\96£QË\8c7 Ñ\8aF\b\8d\b\1aQ4âìÔ$íM\12Á,«c\8e]³O\9b\89x\13½\99aö¦YE\eVWòÏá\1f\90^e\1a¾Nº{\89Ô{®\88´JÚ;ÂõQÒÎ>\9eï!®ÝÊctMèØè\87\ 3\1d\17:^FÝ\8fN\18Å\1etúÑ\19f6R´;ÍI¶\8dh\1ea\86\1eÓ:fm\9cÑM²\82ÇØE£¬¼QÝÓ\bÚ£\19^C÷"Çú)RîQX\80Ý\1c¯s<ÛÎ\7fÛ
+²µuM!}*F«\14\9djTêÑò¡ÓÆ\ftj"«Wë²\ 65\9e=¦dö¤Æ²7kÄð°\86\r\a\157,jÈpV\ 3\86Ëê7ÜPÌð\ 3E×,+\9as_ÑÜ´bð%4\97J\98{JÂCvJ.ØÁïY\9em\)W\89\98£©\ 2£&ó¬\9aÈ+W*ß©d~\83Æ
+Z4Z\10ÔHAD\89Â\98â\85Ã\1a*\9cÐ@\11#S4¯hÑ\82ú\8a\8ek­ñ\8c"ÆËê6ÞP§ñ\1dø\93:M\1fAZ]Æ´® w\9aRðIJãý\15ô\1ffa\8aû        \9e\8fó\7f\92X\92æ<\8d\99Ì\1a\9409\147»4dnÒ\809 ~s§bÅ}\8a\16ÇÕkIi­eF\11Ë\9cº,\vê°\1cWÈrFAËeµY¾*¿å]ù­\7f\ 6²\0´YÒz\81\14ÿ\14éõðJ9ZMÙ\v\e`\1d÷£\ e<\17ñÄ\89\96­Á\92"\rX-\8a\95\94«¯¤V½¶\ 6­µµ(b\v©ÛÖ£.û\80:ìc
+Û7(hß¡öÒ}
+\94\1eSké³j.½¤¦Ò7ä-}G\8d¥Ë\ÓÜ\93\15á<:\9fBó %àC¤ØYX\ fcÜÇ)O\aø/Æ;Qbé-ÏSO\99Y\91r»ºÊ«ÔYáV¸¢I¡\8a6\ 5+»Ô^\19U rD~ǤZ\1c[ÕìØ«&ÇÇÕèxF\1eÇ\8br;^\97Ëñ¶ê\1c\7fäú\1fîÉ\8ap\ e\9dãhî§ìÚáÆ\92À8$¸ï\87¾:j\1câ\890.\9dÕkÔQmR¨ºDí5\15j«q*PÓ \7fm«ZjÃj®í\95Ï\19\97×9¡Fçfy\9c\8fÈí|BuÎÏÊé|A5ÎWUå|\vþ\0\1fqO\85PËÙ\8dÆQ4÷`\v¶z°=\94^£0Èï>\9e\93ÿü×^\97¥\80«P­.\8bZ\¥jvW«É]/¯Û§Æúv5ÔGT_?(·g\.Ï&9=\ f«Æó¸ª<O©ÒsQå\9eë*ó|_¥\9e\ f¹ÞWy=\15\ 2<Mû\87ÑÛ\85%\98õ²\ e\0ûª\18ôð¬\13\82Ä\14à\9d\16®¾\86<y\eÍjh´Éã­T½·Nn¯W®¦\80ê\9aºTÛ\14SMÓ\98ª|\e\9bW\85ï\90Ê|'e÷]P\89ï+²ú¾'kÓïáß²5¥e÷¦u\92v\ f¡7\8f\1dØ\88MK6³þ¸öB\17\84x\1e\80fhäÞÓ¼Fî\16£êZ¬r¶\96©¦µFÕ­\1eUù[äð\87UáïS¹\7fXe\81\ 3;U\12xTÖÀ§e </sàË2ù¿\r¿\86\7fÉÜJµ\ 4\9f¤í\ 3èn§ì\9cÂ\ e\8c@?ô@\aÏÚ \ 5\1a¹w\a¨{±´Õí\ 5r\ 4ͪ\fÚT\1et¨,äR)ÁÚCí²\85zT\12\8eË\1a^/Kx»Ì\14ì¦ð¢\8cá%\15\86_Q~è6ü\ 2þ®Â`ZEp\8cö÷b\ f·Ðþ\ 4íÇ¡\8fß]\10\ 4\80é\963DíOiZÞ\99#{\97Q%ÝVY»Ë F\96\88\91V\99#\9d2Eúe\8c\8c«(²Y\ 5\91\8b\9cÈ\19\19"/)«û\16üLÙÝ\7f\93¡+­\1c8Bû»h\7f\ 6+\92\84\81\ ehãy\v4 ]\87vU\17úXYÛÚlYú
+d\8a\9ae\8cÚT\14­TaÔ¥\82¨OùÑ rc½Ê\89\8dÈ\10\9bVV\f\ 3\13Ã0ÅÈÆÑË\80\ 1\89âoúþ
+éU\ eÒþNÚ\9fê`\1e \ 6Ý\10â\19Ó+/¿Ýh× ]±V²G%K\7f¶L\83ù*\88\9b\94\9b°Ê\90(Sv\82M\9e`á&\18Ô\ 4\1f$\ 6\ 1\ 3\9bÀ´&0\8c   ª\81\ 4F)~\ 30\ 5CÄ0\94^e\1f¯oÁ\ 6­C#\ e½üîäY;øø]ß#±íU\81\r\9bb\19Â\83\fg)\7f4O\86$I-Yüà@OqئØÀ)\16X\8a\8e¥ø`]\12ðx)\8ck
\98ºÀ»¯\ 1æ$y\ fÒ«ì¢o3h$a\0\ f£Ûʵ¡\8f\8fÿ¤K¶\ 4ú£\92\91fó±mÙ\93ø\97)\92ü\94\89Ã\9dÄ7Í\81>ÃA6Ã\81\ 2\9e¡\ 33|43\r»\ 1#7ó96\1fÕÚ4Uëô_ø.½Ê\ e4&a\18b1æ\81ðÛ¸zés\1dV\95£W6t\8bÑ-\9a\94ri\92bAÚL±³\85"c+\ 5Ƕ\95DObÛIò\99cNæ9TæYPs46Ç\87s;á0ÿc`w^ã@Æ\18n¿ËwéUf  5\85V\9c1!®¾aÉ5&9°f6¦Ô\8cná&<àV´·Ã\1c<\ 4»\88cw.\87,ã±\97\11Ç\ 1\12î\ 2\87ÿ\ 2\87É\ 2\13º@c\v³<?\0x¼ýWxï[ÒǨä÷\12Ã\1eê)´Æ`\90þv3Ö­ã¬\81        öÀ\ 6ôÑ5£\9bO7²XÞ\94F|\v4G!Éá¶ZðIO0/G(Æ\8e2/Ç\88c\91\ 4w\82ds\82M·ÈX,Ò\91ã»\0sû       *æc\98Ø£¿¡`¼Ïwi­Go\94áêåÚÎX7nä\fÚ\82>ËÙ\84nîÞ\8cæc+Zð$\1c_-xI¸ð\99L\ 1|\8a1y\86¹y\96uz\968\96\88c\89}²Äæ:Ç`?G£giäÌs\14®×yïǼÿOéé´&èï º\1dôÙ·\8d=0ÏþÛ\83>º9\8fg4Od´NÁi8\93\97à<|\1e.\ 2[O\97\18\93+Äq\95\91ô¯±O^a\81¿ÌX\¥á«\ 4üÅ«¼Ã\9aø\ 2ÎîRZ#\8cu\ f}öÓg\17ã\Æø\9a\8f¢\7f"Ó¿Ó\19½ç3Æã\12\94¨+FHØ\17\1e\98\93\rø\1aÅðMÖê\9bÄq\9bÄ\7f\9bÃ÷M\16Ý7èä-:u\13\17\16ïý\ eSu_ýÌqp?û\90aª`û\14ÓßÜÓ\99>^Èh^Í\18\90ëÿÓ\0\8e;\fç\ 3sôÍ\8cIû.¼\951\8cïÂ\1dÖêû\9c\1dï³_\7fÊ^ý     \93}\87\ 1þ\11\ 3ùC\ 2~\ fwõÞ=u³e|\18\8a\9a\93\92\95­\93\7f>£ûrÆô½\ e,!Ý\86ïÀ\8a!yûÿtVLâ\1dX1K\1fÀ/áWð[ø\10\96\19\8f»ì\95e\12Ó2c±Ì¦Z^äÙ\8b@'î~°êy\1f\90\ 5yð_¦Ë=¶Í«\fãOÒ8\17Çv?;N\1cDZãØñ%\89\9dÄn\12;7ç\9ezI\9b¤m\92vݺ6[E\8bÖª]ÛÑ\v½±B\a«ªÒ\81(° Ê À*\10\14\95kÇT.ÓØT`ã\ f@\e\1d\93Æ`\97¢m\8c\96\99\9f\12sQôS>\7fþü¼ïwÎ{Îy\1f+8À\ 3!h\85n\18\86     X\ 3ëõ\1e\8bó_8\9ewp@7)Ö\e8£¿ã2ßÂ}¾ÁÄ]cÂ^eàþÌ\0½¤?è\8føÌ«üò
+<\ eß\85oÃ7á\7f\87â|\1e\83Fb-C¡OoãcÞÀ¹\#\8fWp9/ã|^Âu½È¹\8a\ 3|\8e<~K\1e¿¡h\7fM\91^Ñ#8Ìï0lO1|\7fÕeÔ.åc\7f\1d¾\ 2_ú¿\1cÞ\83wà&¼©2âØ\89ãÖ_ð3/ã©^P'ú\19=\8bCú%îéi\9cÎ/pZOà¾~\86\e»\8c\e|\9cÍâ1òø!Åü}
+ù"\93zA\8fRB\8fé\eLÎy½»\10û,|\ e>\ 3\9fÎçðOø\e°séyx\16\9fù4cñ$cñsyy\870åÖÊ;¤ÐîG{\14í   ´W¡=\87öíhϳ<¶â*wònûY6\1fe6N\93ÅY\96ì\ 5â]adÞZ\88y\1aNÀÇá8°KðÎ\8beôT¾¼/·df©\19¼\85\v}?å\19edÛÐNëaÆãó\1aA{\1cí)tgÙ"Ö£=¯Säq\92y9Á¦ò   ¢Ü¯3ú\18
\18¥\8fèOÌTn\81\83ðaØ\ f¯\12ïwð\93ü\92ûj~ù\9f\91  m+ÕåÐ'ñº§\14`¹6¡\9d@;\8dv\ 6ía´³hO²\85Íè0y\1c$\8f\ 3ÌË>íf{;¢{ùÕn2¿\87ŵSÏ°ÝÞ\80Ü\ 2Ûa\e<\97\9cêúB~Ëc7E\1fÿE]\1cÁë\1eÆë\1eÂë\1eT\ 3úÍÚK\1e÷2/{¨Ó]\1aB?\8bæJ\8e\8f5h®g¥ÜI\16Û8Zö±r\8e\9cáÎy²û)«éuþçþË&x"¿\ 5<\94ß\ e\8få\8f\82½\vÇ\83\89Ü-hÛQt\81\ fý\10ú1ô\13è§Ðï£"\87\88\91Eo\92\952K\95n B>@6»X=Gµ\96\91\9c£Rf©Ö\19f}\86\956CìÙ<ßËo»'óG\ 2ÛôÂqÈÖ\89J\ 1úeäkC¿\ 2}7Ƕ\9f\ba\8eð\181\92¬\8c\14\881\8cÞ-\8cÄ4+f\1dÕ:O¥l#«\ 3¬¢\a¨à\87©\9e\v<ñ+x\er\v\8cÃù\ 2¶d\8e\99û8òö\94rD\96\ 4w\14
+·2\16k\19\8b9ês\869YÃÞµ\9aÚXE\8dN³f'Ù;VR\1f\8f       ÖË8WY\9e\N¦cÔç\bo5ÌÌ\ e\ 3\0#߯נÇõ"g\89ù\0Ûé~\8eþm0\ fëa\96{«i      ¦Égª°\94XVÔ\1dÄq\11ÇÇ;\ 4\89ÓH\9cV"·\13«\9b\19\19ä/\8bî4\19­gt6«\97ù覲º¨ð4«+ÅúèdgëdGè$~
+>K¼c´@»\fZ\1aûbK¶\86ëI\18ç~\96ï\97\9b\97hy\89Y£E6\8d\14Vh¨°F\83\85~\r,   )³¤Y}E  õ\16¥ÔS\94Q·iT]¦I¥LkÕiºSíÅ;\95,>ªDñ\83j+>§VÓ%µ\98®ª¥øºâ%9µÀib\1d"î6\8e·\8d\1f&!Ëç\11\a½\ 5ß\ f\90Ë\80µX\ 3f\8b2e\86z˪Ôc®U\979 ´9ªTy\8b:Ë;ÔQÞ£eåÃJZV¨Í2§V˼â\96\1d\1cQ\93åAE-ç\14±\RÈrU!ëu\85­9Eà\ 4\12s\víèm\1co«h\7fnáÿ0ôÓ*÷ò]7ÏtÙ\vÔµ´Ti\9bU)\9bC\1d¶jµÛê\94´\85\94X\1aSÛÒ¤Z\8dnÅiþcÆ\84\9a\8cYE\8dy\85\8d\1dj0\8e*h|JõÆ×TgüX>ãEùìÿà:'?\1c'ÆnâÝ\85=XKÛ³\92ö|\94ÿ\ 3Ðý49u\90_;Ï-s\14)é(WÂa¨ÕQ©¸£V±\8a\80\9a+\1aÕTѦhEJ\11g¿Âά\1a\9ck\14pn\94¿r»ê*\ fË[yZ\9eÊsrW^Ruå\vpSngN5p\1fñw\10oc-u@[>\ e\v)îµ\93\13¶V­äÓB.1W©\9a«ljtU(êr+RíW¨:¬\86ê¸\82Õí
+¸ûäÇ\10øÜ«äuo\90§æn¹k\ eÊUsJ\955_\96Óý#9ÜÏ«Â}\83ë\9c*«s:\84þÝÄ»\9dv|ÚOýA?tñ¹\1d\12´bq¾o&\9f\89xL
+y,j¨µ+P[¥úZ¯üÞ ê¼Mòy\93ªõuËã\e\91Û7)\97ï6Uù>(gÝ\ 19|'e÷="Ã÷\ 3Ù|¿×Rßu\19Þ\9cìp\0ý-ĺ\95V|e\80:\84\84$÷Z \89\9c"ÐÀs\ 1\7f¡ü~³|õKå­wª¶¾F\9e@½Ü\81\88ª\ 3­r\ 5Òª\f\ eÊ\19d%\a×É\1eÜ"#¸O¶à Y\83_\94%xQåÁgT\1exS\96\0\9dJ}N\1fBw3ñæhù&hÅ\a¡\eÚ¡\95\10\85\ 6ð\83\97û\9eP\89Üa«\a»ªÂ.UF|rFBª\88Ää\88\1eí\97\11\1d\97-:'kt³,Ñ=2GïWYô!\95D.È\14¹¢âÈ5\95\84ßWi8§{\88¿       Ý5سl\84y\80\14×      \88Cc\88~\17\ 2àå;7­zUS\91\9cÍårÄ\fÙcN\191\ f\ 4d\8b\16\1aïQy|Læøj\95Æ7©8¾SEñc*\8cÓüÇh\8act        ±×UÐü®
+\9b9?ÑÞ\80ö\14ڣس^è\80V>7C\84ï\82Pǵ§Irag+Z
+e´\95Ê\96°Ê\9a\92\9cÂ1\93xi²E%É\94L\98Æ%ÉI\15$1\ eILY\92Ó(\89      IpB'\9eÄP½\ 6ø¬¶\9c\12o\1dÚ+h{\aÑï\82$×qhä~\bü\×rß\85uc        ÊH\16ÊÖ^"sÊ¢\92\94!SÊ©%)\8f
+S\fj\8a\1f¤ñVé\f`\1cÓø«ôVà4NaRR\8fRl\9cÖ\9däÐI\aÙ\91Ó]hÏ \9dÅ\86\93ë6h\8e3\ 6\10\0/÷«\13ø/¤\8d\ e<Pª@æî\12\15÷\94«°\97\8fM,Ã"Ï°\882áE¡\fÞ*\83\89ÍÌ\0&&C7\909ų\18\86>LH/ÝS/9ôät\aï5\8dþH\92\8fÐÎu\v÷\1a\91ià¿\8f{îvâw\12¿\v\ fØ#\99±±¦\ 1\ eÛA<Ì\10\aÊ0\eú\88sqs\ec,Æ\18¸1\92\1d\e\ 4\18\ 6rl7ßãmF1f#\97ùÍ+ð>¿Ïi\1dú\13<>\b]\90äs\9c÷\róßÏç\9a4ñy%\83¸Ö\ 1©lH*\1aåP_\8e\9fËrà\8fsÀN0\16+8t&ÙܧØH¦(²)^bª\17\98\8f)<Þäv ;[\89i[A×:A\a=A\ eã8\16Þm9d E¼\ 4\96¬\11êùìA¢²\9føĵ\10·$+\15"ùo¦Ë<8Êú\8cãß\90;ÙݼÙl\92Ýdw³»Ùì\92\93\10\ 2¡!\ 1\ 2\ 4¹\12 \90SAn
+\8a G\ 4ñ@e"\ 1
+ÅJG\87CÀ)ãØ)\ 3R¨ÖZ§ÌСP\ 4flÇik©RA Te¬\ 5jÙ~ÞìÛNÿøξ×>ßç÷\1c¿ßóe`À.\98É\90Ñ\86\1f³ñ£\1d?:ñ£\9b\9cô\98\e\ e\85ÖMðº'\0òÑ\85\98í¢.;\11q\1d\bÄö+ü\8f\8e©\95õ\8d\a\rð\r\15ü\86)'/aÌåï\ 6¼\99S\89}«É  0ÇPc\ e7ñ!gΠ\ 6\1e\86\8cyø±\0?\16Q\eK9d\96\92\93%\14Ö\12\f.ÁéÅó\0\88\89u!Óóü\8fù\ f}ñ0ó\14kl\82¯\9eõV\13ë\b\92ÐO)å²^\ 3Þ\8c6)±\ 3®\1e\93\ f`\8a\ 1\ f{`©5ô=Â0¶\82úXI}¬Æ\8fuæaÌÆÞK}ö\92Ðu\18\\8bÓkWr@nã\ezcÕy¾GY<\16ÓD^\8f%ÎÃù-cÍ\81iô ë5àM\877áa\8bó»&\17X90ìÆ\aOsðÝ\06\82§Á&jä\ 5\ 6³>ê´\9f\ 1d+\aÁVê³\9fXl!y}K\18Ø\9f\936S\13Ï\9f\92\9eû\92!\16\1f\88s=¼U|R<\8b\1e¤\9d\8d¹ð/²Öhr®\ 5ë­\81\e\13H(!0°\vX\16\12B\8cÎqaðCð*5²\ f?\ eÒ+\a8p\ eÐlûIì>\92··\97÷|ôê    ¾ýLÚ}_c\88uM;9`Í\85Ä9\9bø¦¯°x7Z\9c}\16\97Éóò\80\0Â\ 6Øk\rå\a\ 1-Ǹ(dD\,\1c£FNàÇÛ\1cø?#'')ò\133\10qË¥·ú¥£|xä\ 2ßþCul¥åó©\ 1b\9d³\8aú3×»ÉZ§¹>¶W\84]\9cËäyÃ\12D&ÏQp\1c°$½\rÞU\0±\ 5!V¥sÔÈ%êã\12µq\91ú¼@ÒÏ\93ÜsÏ ,QTg~)\9d¾®!Ä»\18î<òjgÍ      Û¬\98\9a¢ç\90ÅÉ13 BM\9e÷\0[\f\92I\ 3\ 2é\8cÉ\ 5>\0\97ÀïÁ\1fÁeðWð9ñ¸IÏÞàнÁFs\9dƺFA}\ 6É\15\16påC&ký\1f\92@&0@>\b\82r0\1c\8c\ 6\ f\80Ö\ 1uô-\8dy\ f\1ds\a\rÊñkTåm\92÷\ 5År\8b\0Þ YWIÎ\15´Õeý\ e·þ\89{1Ü\8fé-S×\80\1f\81Cà¿üìXØ5\91ȵéG6(пÑ\98wU\ 5ÇH}\89\eúá:~\e£ø\94\86½\8cúú\13\8dú\11Mó!\rs\11?ΣiÎj\17éØOZ\8eÀ{\9aðÝ$U1Ò\17#¥1J ]\ 1v[>Ü\ 3_\83¯Àmp\ 3mu\r}÷)ºê\13ôÌ'hª\8fÐ\97\17Q*çðã\fñ8Ífy
+Õõ>ºî=\14à»è\99wðã$ñø)\rt\8c¦9\ 2Ã\8fa|\83$\1eÆÓ×Ñ\99¯Y¼;Á6Ð\ fîÂù\ 5¸f¥ð\82\95â_)\ 3ûÙú\85ÜØ\ fb¿\fÛ5خǶ©Ú&b{\1a¶gb»\83Öx\bû\vµOË)¥5dâ\19Út;m´G/QÀß'*;\88ä÷àì\ 3\9bÀÓà)p\v¾¿Xåô¾Uæf{\1d&\16\87Ðw\aѺ\aÐ\98¯¡íöP\e¯àÇnâñ\ 3\14ã.\14ÞN\94ß\ e\ e\8fíÔÈVjd\v\11\8fÍêEá=\ f×Kxó:\?×\93Dt\ 3\9cO\80Õ`\15X        >¶Êú¤ÕÞû¬-`\87\12\88U\ 6±2°\9bK«ú@        ¶+°\£g©\8f§Q\94\e\e¨\91õÔH/5²\ e?ÖàÇãz\fûOR­ýz\94æ^Nô\96é·l·ß°ÅǨ \18Ùc~\ 1g­¶;hµ$»\a\1cñíi=±è\95\r»ÙlYnl\17á\7f   þWÀP\83í:l7`{\1c¶'Ñ!­ØnÇî\1c-àn\1e_Ï%\12s\88Å\83tA\ f\9b\8aî\86×D\97\85w¬mÀÜ\ 2_P|û\7f\1c¬\18ت\13°\94\8e]\a>ç`Û\ 3\ 2td\ 4û\15Ø\1fJ\15Ôa¿\ 1ûã°7\89#u:ÕÑIDæQ±\8fR-\e4\83,M§GZYm\8bþ\0þ\ 5bÿÃ\9bVì͵\9bÇ\90y,\99G\ 5ÛöÀ1ÙC,º\88E'9é '\1dÔF;5:KQµáÇLü\98\8e\1f­ä¥\85¼L£>¦ðf2\9e\99\91\99\9aÉà\ 46øñl°ãô\eð\15\88q\1fÇ~+þë9ò\963\92Ì\a=\·s\1cs\94°\86AØOǾ\1dûÙ\9aÊÞ5E^8BpDéÒJ8jà\18\89½ÑØnV\13_\8fÁÛÑD¬\91¬\8d¢*ë©àïPé#©ü\91ú\1cĸ\8fc7|\9b8æV¦3\82püw1\8aÌäw\1aGðä\94øÈ6Q)pdÂ\91\ 5G\ e\1c\87§\18\9eRxªà©\85§\1e\9b\9fLdÚ4\82HÖR1èÍ\1a:g(UWÍ^1D\7f\ 6wA\8cû\98¶Ã½ÞÆxÀ\11÷\10ÇK\9b#>\1e6sßÄó1ø3:m\90\1a\93ÒÔ\90`\87Ë\80)\17®\ 2¸\ 2ð\94°\93\97ÃU\rW\1d\£á\9a\88ý\19xÖC\94\96òö        v\97~¼ÝÇnw\9cè]\ 2·Al\0}¶øè³Ð`Ìãhi\ 1Í`,÷\rY̹¼«Ã\9f\11\99I\1a\91\96¡á)\ eÕ&;U\93\94¯¡É^U'\874$y°ªRªT\99R«ò\94\ 6\95¥LPij«¢©Ý\8a¤.V8u\9d\8aS_T(u\8f\ 2)GÁ9\15%ßRQÊ}\15¥²_Á±\ 2ι\8c_m\8c>\93@\13\18\ 5êxVË»\1aü©ÎJPµ=EÕ\99\99\1a\92a¨2Ã¥\8aL\8fÊ2\8bT\9aY¢Á¶rEm5\8aØê\15\8dW±­EA{\97\ 2öÅòÛ×Ékߢ\ 2û^yìÇä¶\9dU¾í¦òíßr\1dÓF8\96Á×ÃXÞʸÑ\f\1aÁHî\87\81jF¡JÞ\97ãO\99\91¨²¬4\95\1aìÈVÄ\91§\92,\9fÂYÅ*Î*UÐ\18ª\0"ÄÏ î3¦©Ðè\92ÇX¢|£W¹F¿\Æ~9\8dãÊ6>\0\7fçú>`ßÄþb¸:\19ɧ2\ e\8fó0Û\81Z®«yV\ 1Jñ)Ê7\11W\82J\9cI*vf*äÌRÐéRÀY \7fN@¾\9c¨¼9U*È\19!\8fk¬ò]S\94çê\90˵HN×Ze»^\94áÚ+\87ë\98쮳à¦\1c9÷ALk°=\1f¾YH¤I\8c;c\0ÒQ5ÜW\82\89ð>\f\13ÈK\90?/M¾<»
\9d*ÈÏ\97'ß'·;¬<w¹rݵr¹\eåôLR¶g¶\fÏ\ 29<«e÷l\96Íó\8a2<?Qºû×à\1a¸§\8c\f\85k\ 6ò¨\99\ 1\f\aC@\19Ï"øS\f\82\a^PP\98,w¡My^C¹Þ\¹¼\85Êñ\86äô\95*Û7T\86o\94\1c¾fÙý3eóÏU\86\7f\85Òý\9b\94ê\7fYɾ7\95è;\ 5®*É{GÉÞ\98\1eÁæ\83ðµ WÇ!\8fêA\r¨\ 4\83y\16\ 6AÞû\81\17¸¹Ï-\1a¤\9c\9cA\87\8c \13¸å\b\16É\11\8aÈ\1eª\92-T§\8cP\93ÒC-J\r±Ó\86\96)1ô\94\12\b&Ãa\90a0ÈL\1d¸\ 3bZ\8aÝNø¦0\82\8f\ 5uÈ£j~Ë@$À_@\11ï½ÀÃu\1eÏ\9dÅ\83d\84\88Ød\8b\18Ê\8cä*#âUz$¤´H\99R¢Ã\94\14mTbt²\12¢\b\95(º"ÊI\14Ý\89ÑÃ\80\84\84é%ÌÙ\89ÝÙð>ÀÈÙ\18¦\16A\15×\83A\98çAà\87·à?L\97\vp\94å\15\86ßÍewÉ^òg³¹\92;¹ï\86ìn\12²   ¹,$\84$Ð\ TÄ \90\91\92
+\84\8b­ã\14\8d8Vª\ 2\ 2^\10¬µ\94Bq\1c\14\18Å2¥\85Z\86N¥ö6¥#\8c2ÚÒ¢\1d±í\fØÙ>\7fòÛq\98\97Í\7f;ïùÎ9ßùÎËo\16÷Òyn\94'È[é\90«Ú%gÀ+{ ]I\81l%\ 4
+e\vVPÈ!Àü\1ad\8e\ e"Z\82\88¤ º"ø8\e\8cá<À<]\8d\ fÕLpUq-Ãî@\99Ô\89\ 4h\ 6\11\10\0åÜ\9b\ 6_!\98
+²¸öc>\r\r$ÈUc\97£Ö¥¤\10\r\ 6\ fSÜa
+(\8cÁH\10 w#\bÉ\bâ)Â<\1fa\96\ es2\859¥C§\ 1>ÔÞ\ 6q-ÁîüJò\80íFP\vª¸.ã~1¾äñ\9b͵¿\1a~L{\91  ®\90M\8e\12ëiô\r\19©\93\r-J\81G   l\94\ f¢\11\9al+@È5¡¯¢c`\9c÷\10*\8d\r>40E70¥c»\eÛ­ \1eÔ \ f+¹W\8a/\ 5üæpí¯\81¿\16ý\81dK©\97\1c,1!Ê\ 1ÛÌa7\93\ 3¥\95fÞF3\8dÑÐbl¢\18\81\8bál\fm\15\9b\v¨\89\18B&\86xjG¸´\9dä\9b\ fØ\84øÐ\12×\0¶;@\13\88\80 |\15øRÄo.×\19ð¦ÕÁ\ fï\94¨\94<\93\ 3\9då)Æá>\v?:ðc\ e\87m\179é&'½4´^6O/±èÅá\1eòÑ3\b\98\99κ\11\8as\99ܺ\98bçàCg\½Øo\a3@\b¾jÊi\1a¿y\g6À\ f¯\a^g\9b\948\vî\ e\99\879¶@/\98\8f\1f}øÑo\1eúø1DN\16ÑØ\16QÄCÄb¨\ 5\90\8f\85w\ 3\ 2&¶A\84ÛÀ\1fù\86\8bkN#á\0\r¬³\16·Ëá-à:\8b²Nc½nx\1d\9d_âüÊÄ`\83\bÜ\ 1\16'Ðd\186\96âÇ2ü\18á\0\18!'#\14Ó\bFW°?\96óâr&ÄeÔåR¦çá\8b\1c\87\9a\85\9bͬ³\9eÔUÃ[Ìuv\f~Öë&\95v\96À°6ÉIZ\19\1e\8cI\1cú`%XEnîE㮥>Öã\87y\bl¤>7\92Ô\r,f=FÖñâ\18\96º\ý3\ eKTÕh\íð5\11çéíÔ!©Ë%Î>Öëæ\93¤!s\8dÖ`¹Ââ\1aµ\86Î1kø½Ï\1aD\1f°\86ñ-\f^[ñc\9c½²\9d\ 3æ\11ês\9cX|\aÃÛ0´\95>ñÐ\1eÞCMlFY}\v\1f\88s\1d¡ª$ÖùóéA\f\91\96¸ÔZã¨5d\9b||ÎXÆ÷`«5\88?b\r¤ß\9d\10%b\8c\97\9e&&Ï°o_`¯¼Àa°\9fMö<\ 1~\16ãûÖH{xy7ÓôÎß1ÐßR\94X\aûØ\aÄ:\838{\18¨\13WYëü\86ÅIø\18\8dÅ\88þ%\1e@\89#_&\85ÑAð\92%\94\8e\80WLá\82\1f§ðã$ûäu\8aý8±x\15\82WXÄQ>8B>\ e\7f¬0uUJ\vÉ&Ö^¶pò\ 6Kd\98ë|\14<a\rÿ&\17iDÂ
+¡É·à¨Åe
+Ä×\81)VÞ\92)V¥ó\9a\14p\97ÈË»ô\8dK4Úw(¼_\93à\v\90¼ÍBÎñáÏßSÕ\bû\10î4n;6YëÝa­s¿µ¶Ã_¬Ëâ¡Õ"\99¤³à\1cx\ePæz\a\10^d\8ct\ 5Ð
+u\1d|L/½ANþAùÞ#ý\95Âú\90$^{Yzÿ<S­þ\8fÏÑU\9fË)¦\e®ý \1f\94[\13x30\95I\ fÏ\aPJ_e:\1fF=\8eè3\8aæSÔå?)\98\e(Ñë\14ÈG,â\1a\v¸J\80.ãÜïyó\ 2_\9f\0?\ 2\aÀ³`\ f0¹é\14¼!Ý´ðo4Í-üø¯2yV¤ÿ0\99\7fÊä~\83Éþo4©\ fñã}6ì{4\88Ëè©? Ê~Ë\fÿ\e\8aè"~ü\8a\ 2:\8f\9e8\vË\19\94Ü\9b\14_\9aü\87\9d`\ax\fpz¢¼&Cö\91\85kÄã*\9aæ2ºêÏè\88Ëh\99Kèº\v¨\88óøq\96x\9c¡i\9dF\81½Aã8EÓ8AÃ8\8e¶{\15?\8e¡'\8e²i\ e£­~\88®y\89X\1cÔ\9fÐt·\89N\9c-\14×8x\18l\ 1\9fÀù\81\95Âw­R:3\91v»N\12\8b×ÈÉkää8Zæ\18\8aå\b~\1cÂ\8f\1f §^¤i\1f@\ 1îGu>GÃ|Fw³UVÂ3¦]\14ö\93ÚÎ6ÚKD\ e\93\9d_Pâ\9fLpo\ 6÷\83ûÀFpÕ*%\93û\84U~/N\94£\r\9b\87®ÚGNö¢ívS\eOáÇ\13øñ8õñ\18jïQôåv\9aø85òmjd+~<L<¶ÐP6ëA<ÙAT\ eÒÆNÀye\82s\f|\1d¬\ 2+ÁE«Ä\8fXÛ`\97Õ\ 68éµMÉØóPei \9b¿\8b°ZN˨Án\1dv£´\906ìvh=5²\8e\1aY\8b\1fkðã^êt\947V±ÑVRy÷À0B¥¬ Ú\96Ã;\fî\ 2KÀ[ÖÚ÷Zín\8bÕvÍ\16¼\8eX0\11cÓK{N\a9Ø.Âv9+\rb;B+mÄv\vvgS\11Ý´õ~ìß\81í\15TÉZþÚ\84Wߣz¿O弩\ 5Ôæ\ 2x\a@¿\85\9fÀµÏj¹\ fXíÑl\93f\9b¦£a3\19\9b.|6@\ 6\98\8aýb\8e\91rl\a5\84Â]¨\19Øm¡*fc³\87J\1däx½Kóð´\97\10Õn2;\97\8aí¢6»è\0sàþ\ 2\a¬õ\9bütrÖÄ1¬É#Ò<*\a\95\80]'ð`;\rdb?\8fJ,Æ~9ö\83Ø\ fc¿\11{­êä_\aOg³ò\18«hgUmD·\95ÝØBÄgê\97à&\88\ 5ì²âo®ß<\1a\17Oð2\9a\0:\1a\19w\88E'±è '\1dò\81,8òá(\81£\ 2\8e \1c\11lF©Ôv5ñU\94h7²\9a\ 62WÏ
+ë¨â\bù\b³£Ãt\80\11P\aÌ\18ÜÏqû5\8eþ;\19\87\ 6@\ fãH\a×1î·q\ 4¶(\11ûNì{\80\ 1\87\1fäÀQ@\16¦ÁS    ÏtìÕOx\12ÂËZV1\9dj¨¡\1a\83TW\80ÝS­çUE¯¨Ò_Àm\10ç^\[\19ÅÆ\9c\8c$\1c-\v\19\83zÁlÐÊu\13ÇÞ\f\9e5àO}\82\1d\8e\148¼¬!\r\95\vW!\¥ðTÃ\13âÿFl·ãU\ f\11\1a"[Ëyº\ e\11µ½dð\18¸\bn\828÷âÚ\ 4Ï(GÊ\12Fã>Æ\9f\15D¹®\ 3!\9eMǧ\9a)\89ª±;\15Lr+\90\90ªj\9bOU¶,UÚòà*\86«\82.V\ 3_½¦ÙZUbëR±mP\85¶¥*°­Q\9eí!ªy7^ÿ\18\9c\ 3\7f'\92q~ãú&\1c÷À¹\88±§\97£>\ 6\9a@\1d¨å^\90gU ÂcS\85;Y\15))*wzTæ0Tj÷«Ä\9e£b{¡\8a\1c¥*t\ 4\88(ßѬ<g§r\9dýÊq\ e+˹Z\99Î\a\95áxJ~Ç!¥ÛÏÈ\97|\rÜ\ 2qmÀþ2ø\ 6\19Ë»\18\89\f\10\ 2\ 1îU\822\9eO\ 3%Þ$\15{\1c*v»TäòªÐåS¾+Kyî<Mu\97(×]¥\1cwXÙî&ez:\94áéWºgX>Ïj\19\9e-Jõì\94×sH\1e÷OÁUð/\10×Zl\ fÃÓÇ(ÜÁ¨Ñ\f\ 6Tr¯\f\94àO\11ï\14¤%*ÏHV^ªSSSÝÊõ\1aÊIõ++5W\99©ÅÊ0*å7Bò\19MJ3:e\18\ 3ò\1aKå1VËml\96ËxRS\8c\97å4NËa\\ 1\9fÉ\91JßÆöbøæ1\ 6Ç\90'\8d \ 4ªA9÷J@!Ïóñ%7=A9¾$eùìÊô¥(Ãç\95ßç\93Ï\97­´ô\ 2P&#}º¼é\8dòøcrûçÉõ?¦Ë\ 68Ê«
+Ão6»Ù$\9b,\9bÍfw\93ýI6\9bl~vIHBHè&@\ 2\98J\ 2$\10
+\86$\95AkJJÁJ\b¥´RZ\95j\7f¬Å¢¢ÌXµÕ\ eZdZQ¨µ t:0Õ\ 2V\1d\1dªv¤Ú\96\ fV;èúÜìçè0/ûåÛ½ç=÷\9csÏ}\8fo\9d
+|\9f\90Ó·Cy¾\ad÷}K¹¥Çe+½ \1cï{²y¹3°½\ 6¾ë\91ÀÝ\8c\8bsÁlP\ f⼫\ 2\11¾¯À\97`\99Mþ2»|e\ eyýù*ñ\17Ë\13ðÈ\1d(\ 3!\15\aªU\14h\90+ت\82`\97\9cÁ>9\82ò\a\16\9cRN\10-\eàF\f Æ\ 2\17\18¢®\82\8c6`\7f\15|K\91ZiÐ
+\92 \16Ä\18\97¢|\17\ 2A|ñ\a\ 5\r:ä)wÊ\1dr©(4K®P©
+ùQ~¸RÎpB\8ep³ìáNÙÂ\88ö\b\1d/B×\8fÜ\86hD \86Ѳ!|\b½ÊÆPN\15\19\8dc\7f%|½aÎ#h\8ep\ eø\8c\83JF¥0ß\95ãK <G¾r\9b¼\15¹ò\84ìrG\9c*\8aºTPéV\1eÅâ¨ò+·*¬\9cX\1cç\93\80\81\b Úc\f
+±-\80[©ê ø1Æñ!Ê\9c\15åî\84§\1fÞ\85ÈïöJò\0êx®æ]\14\84ð%ÈoÊ\80\97gOÄ&w¥]E±<\15T\17Ê\11/\96­Æ\93-ÞZ\9cMT\ 1æÝD+`¾J00%F\0·Q\82\81¤öëà(b\1eÑ\eÿ'Èh\r|},ë\8a\91\a\90\ 4µü]\85/\11¾«À\ f?\9f\94\9c<¼wó}QܦüZ\87\1cu4¸z\1aX£;{\90S$6Å\82\14:>ż\9bbxLq㤸\ 1S\88÷Ôn~Ç\90ÐÈ Ð\80\ f\r(Ùú\8c\86ª¥%\84¯\93\91¬\19Ôó\1cç]%\a8\ 3 \94g\ fïÝ|ïJHùlÓÞH\93Oq¹4\15d\9bi\v\r­\8d\11\8b6\16´5\ 2òÑÆàÚÆ|Õ\86\9eoexhE©´0WÌ!\17ÍøÐ\94Ñ\0./Än{\1dyà³\8e¿«á\8aÂY\ e|<\97ðÞ\r¯\v³Î\14s\18c\82ZlØÅ\8fvüè0\97\v\8dý:r\92æ\0¥\89E\9a\16À0\9b¦&ÒÔåuÓü\8eÙ¦ó0kþ@3¼Æú\8cú\18\ 5ÓØn\ 5I\9ekñ%Æò\10\9f\96ðÞ\ro!¼y\98Ìa|å²Ä\ eHs©vãÇBüèÁ\8fÅæÂ!'KÍA#\16KY¸d>`\98]\82*YÌ ÕË\0Õ\83r\t\8eu¨ú\ 5L-³1Gê\9aùl \9c\8c\80\0ËKx_\fo\ 1¼ö\ e8I/\179kA\ fàè!\8ah.\òËðcÀ\95½ø\ 6ÉÉ \ 5<ÈFV²x%ùXÉP¹b\93´\9c³1ÀÀ¸ì4"\81sq}F\v(ßvx\9aØg\ 3\9c\9c¿½mì\1fÞ\ 2xm\947\82%ËÙg\89\e#rVZ\82Ç\b®5Äd\1dÂc\ 4?ÆÌ%DNÆ)¦q63\86ã£äc=
+q\ 4Å´\ eõ¼öyÖ¼#\r\11×6\\9d\8d/5ð\86ø»\94ð¹áÍï\99\11Qÿã\1c´ø\8cÐû\88%úÆ,áiD e§        ÄÆ$~l¡6¶\90\93[)°Í\10l&`\93,Ø4Åoö!\9a\98$>ö\ 6ë2ê\84¯\95ýÖó\19MS\ 3ÄÙÍ~\9d\86w9XeqrÄ\91ìÿÇ\ 5&Áf°Õ\12âÛÁíàNjänüø\fµq/õ¹\87Xì¦6ï\1a\ 6\83éaç\93Òôo¤©\7f©\93ý¦øº\9a=\apuV?ü&¾kÁ¨Åy\93ÅG«C&g\ 5ð\1d\96\10åÈ3Üd\85¹\19L(9\ 6!éQjä\0\eÔÆ\ 1êók\ 4y?\eÛ\87ÁG>-}\91\9eýà)éþwÕÂ\9ek)Û
+öì!Îù#\96¸\9d°\84î6ko,c\É\8aðÿò\18Aü(øª²\ 3\12f\19\ 2¥ï\82\b~\1cåÌ\1eå²y\86Cv\84Í\1e\87\bÚ\93äã{OKß¹¨Fê*J\88¼¤ªÐìy\93\15W³Ï=\16ç\83\80%¢ÅÍ\f\ 3\86çqe\87#3 pÜ\19\ 2Ç\ 1å\86\\93Î\80³äå\15jô<9y\99¢{\89@\9f&°/|N:\89\81\13gT\r·\1fî"b\9dcö|'àk\ 6ÖìðuÐâ4Ãà\ f\95\1dJ\8f\81g-®_\80\17-¾_\81_\83ß\83?\81×Á[àmÎË\15rr\99³z\89\82{\13Ò¿î\94þr\80ß\1dGQ
+\95-¦@¡t¥÷\98%þ®"}\80vĮ̂N£|S \1dtÏLF×8$\1fP¬ï3\8d\¥PßE¿¿M\0/3y^b\1a}\83¹ê"Éú3ɹ #LV¿Ô9¬\9e\98\99ë2l+C
+3l3ÃÔ\91Á\96Ä)e­X\9bÅ%üx\a?þÁ<ó>jø*\8aù
+
+þ-tûëL4¯áÇ\ 5&¹ßqXÏsh^¦x_¢xOãÇ\8bøqJ»tR{õ\1cLÇ(\8e£ú\99\9eÖßPõ\19Ê&˽\17Ü\ 3v\83+p^\ 4¯Z!¤\8b3\81\bûN\9de\96\1cq\8e\fÚý\14ÓÄóøñSâq\8c\86u\94Æñ\f\8dê\bsÝa\9aÅ\ f(æCº\99\94\9e \88¿Mñ~\93]\1fä\17\aô
+¥{mfß{ÌL\ 1\83mà5øÎ\ 3:'\93`6Í?\9a\1c=Å|w\88\9c|_APÅ\8eê±ÛL\84ç±\9f.ìöÎL²ûi$_¦y=Bãz\18?\1e"\1e÷k\8a£z\ fûÝDZ}\82§\93p_!B\19<DK\83M`\ 2\982:\ 1~b\95¸9^_±\8eÁÃÊ#nÅÀ\8bÝr\8eGL_À\8f½øñYêã^.\90=4ñÝäæ.r³\8b\1aÙ\89\1f;ÈËvÝÂ\1eo'3÷é\93\85llÖ\1fy\8b\86\ 5\1f\ 5ã`\14<g\95»áþ\92u\14Í\91Ü\ 5v\12\8b\1d*Ð49ÙÁ\8c9ÍT´\r?n#/[\99©neú»\85\vt\92\1a¹\99ÜLh\19íl\88
+\1dÑFþßÀ¯n$'ãDh\8c\f\8dR-ë©°µð\ e\83U`\b\1c\8eü\ 3V\eÚfµ&Ó&L{ü¸ìØs\ 1\ f(\ 3!lÇ°]\87Ý\14v[aì`÷ÝØ^L\85öS\1d«ù7
\ 4U;MÅܧ\15°,§\8a\ 6¨ú~x?\fú,<fñﲸÍU`®\ 5s%\99\86X\fS\9f«ÉÉjjcX~l\87ð?\86í\ 4\93ØmÁn\aQèÆö\12ì\ ep¥ßÀÓ\ 6¼ÚJÕÜÍU¿\9f¬=ŵÿ[À}m\9dtó¹ÏÚ¿¹
+6ZÜæº0×\15jT´qlÚA!vÝ \84g?\15\10\86#\86ý\ 4ö\93ØoÁ^\av\17P­}TÊ æ\13ùN²ÔAVçQQíÔf»^Ð\Nû\¸çZ]g¯\15\7f³ÿuÊJ\ 2Ã\8bê\98\91*F:tÉ\ 6\9cJÓ3Ò\9a\ 5¼p\ 4à\bc?\86ý\ 4¶RØl¥BæãM\8fæ\10\99fbÑÄÎfs\12R0¥¨º$Í<©7Af\ 6¦û\99\18 º5\86\ 4\19²e%Ñ"\90æÙH'#ݸñ°î\0\ 5 \18\ e\ f(\85'\bO\ 4\8ejlÕc³I\8d\80çõD¬\8e\88&Èl-Y®¡Òã\9cä8\17K5ÝÈtß8¨\ 1Ó&\ 6\+7ÐÒû\91c½ùH¶ü¬T\9dûÙH\92\14>%\95\8b}'ö]À\rJà)\83§\1c\9e(<5ükÄn\vöç\13\9dÅt\94\15ª¤b£ä#BÅ\859\1f!:N\88®\1a¢w\87à\ f\83­pÜ\bç\10\92ôCÈ\8e\ eæ\80$ïê\91îµ|_ã´)nÏSÜV ê\9c"xfÁã\85Ç\ fO\b\9e*x\12Ølâ¯y\9câ\85\8cH­%k7ñ«\1d\10x\9cSþsp\19dø;£Iì¯\87o9r£·8+Ñ[@
\818ïc Ò\95£h¡C\91ü|Eò\
+;\8a\15¶{\14²ûTn\ f\82¨\82ö¸\ 2ö¤üö6\95Ù»ä³÷©4wXÞÜ\8d\9d\92Çöyyr\1eÃûgÁEðo²\9aÑ\7fØ/óè(Ë3\8a?³döoæ\9b%3\93\99¬$$`BH@¢¤\88\ 1\f\8b\80U\16\81°\18d\93­ì(\15Q¡"\14\8b¨EED
+\18TP\91M(\88È\96º\80- âZµ"¢\82\b"K\ 5¦¿wæ;=§\9eþÑ\1eþ4\9cs\ f3_æýîsï»Ýg\ 4ü}àêÂ\15ß\96\15(\ 5M@\ 1ÏrA\16\88k&ÉЬ\12õØ%êvJÄé\ 1^        ;\ 3\92î\f\19\97 \13g\9cM@\99ø       Ãº³Z|Î\1eâu\ e\16Í9I<\8e9âv,\15\97}\93¸l\1f\89\8c¸¬       \19\ 2\7fO8:ê¬Câ_\v\7fªmkÌ÷<\90\ 5\13õ\99$ìµJº×.!Í)AÍ-A\8f&\ 1\8f.~OHtO\ 6È\11\9f§H¼ZsÑ´ÖâѪŭÝ$N­V\1cÚ\ 4±i³%M["VÏ\ 6±x\ e\88ÙsRÌî\84Ü¢Ú\ 1x:À{u\80>\ 34\ 1ù \9bgq\10\ 5éºYBz\9a\ 4t»ø}NÑ}.ѽ\1eñz½âõ\ 5DóEÄ£g\81\ 2qé%âÔ+Ä¡·\13\9b~\83¤é\ 3Å¢\8f\13\93N\18Ôéy}d8/aÇKbñrgÀß\1d¾*bNE\88}\0
+A\1eß3A\ 6\7f\v\83\90ß"\ 1¿Mü~\87èºK¼º[4¿[<~MÜ\ 1¿¸\ 2éâ\fÄÄ\11È\13[°©¤\ 5[\8a%ØVÌA²[\90\90\1aä\ 4\br\13\ 5ÈN\ 1\1f\ 2?\82\84ôåý]à¼\86\96¤e\98y\0\ 5\ 11\9eG@(h\92`À*þ\80\80S¼@\ 3î K\9c!Mìé>±\85\83b\r\12Î\11s\98Ì\16)\ 34\v\11\b§_\84\e(|\ f \0§SCú\a¼ø,u%¤7\1c\1dá­$ú\96Ñ\924\ 1\8dø\9cų\f\10¦\96`\b\ f\82\83\ 1-d\17wºC\9ca§Ø¢\1e±Ä¼b\8a1a1\ 6Äéñâ\ 5\80æ1NS\1a§aȤÏ\8b\8f\0\84Õ8!5F\0Π-EÏS\ew'Ã:À{U\ 6û!Æ<\80\>Çy\16¥\96ô0\1e¤§\89?Ý*> \85­â\8e¤\893Ã&¶\98\99\1c"Ù,ì\&57\98\1a\9cK?\91\9a×
\a4J¹C\ 196g! -dSC\16I23!Ý\19rm\9c3\99ò\8bA\ 1Èæ{\8cZ"Ô\11\8a\98%\0ô¨I´\f\93¸cfqdZ$-Ë*æ\1c\ eÒ<\ e\98|6xc\16w!^\14"ª0\9bÃ\85ù("Ë\17\14Òk\16Ö\ 2NåƤ\94\825\8c!96"Mç%¤3±¿\rCÊs\98\aþo\ 4²¨#\83:ÂÔÁ2\13\9dÏ\1aÏÜüÖÁï¬È4ås¡4æ\90\8e¦\1c¦%\9eÔÁR\1aL\19Z\9a\ fJ\ 1\94\e¸\19M[³\89ü\8e\98\ 6è
+öESjh\92\90ërÙ\93¼³\14\14\82\¾gRG\14¾\10Ðùì\85×Íßì¼ÖB\vË%ÁxPÂEWjI],-\99\93VÌI\ 5^T0\89\15\fªàG\15\15 \9a¿\91FZÑ\9c^IRkA#VN\8a,c.\9a'äZ\96Ï\95 \18\14À\91\ 3W\9c:ÂÀÏg/Ï\ðÚhÕÌL1\97\92\17iêRU\97kkuÑRG[ê¨bNÚ±ÙÚáE\15\ 3«ÊA\15\13Î\9ah˺¼\86ýÙ\86äTI\82n}\ e\ 3\12RÉ»Ë@S´å3$\aÎ(õ\ 4øìå¹\vÞ4Å[f\âÈ"\98À       h\1f      /\4 \9a¹éD\1d×SGwêèÎ\86ê\86\17Ý\8a¹\90+yÞ\8dC\80F¶3\89­\13gDõv6\ 3gTû\84T\94 \8d\9f\15a[>uÄá\rÁë\85×\ 5¯µ¥¡µÒ\b4UFÀéh\84\9d®Fèº\11ô4¥B@?Öh\7föI\7f\16|\rbúaX_\ 6ôá¬êMbêõ\88H\8f\8d\8cù\86Ð\94\90\96ð\94°t\8a¨%\eÞ0>ëøìB¯¥Ò\b\rÎ. \9b\11¶z$Ãf*|Õ¨\10\ 4j\8d@8\82:F³FÇ0'£YP£yùH\ 4\8c`ÐpΪ¡¬\89Á4°·ÐM\rLH9:K\98²Fðf°\9dý­áççæöÉ \99âT\1a{\19|´«\84\85H\ 5ÀÛÀh#\10O\0SÀ4p\17uÌd\8dÎd¯ÞÃäÎàåÓ\11q'óq\aém*i~R½Èø³R\8eÞBæ7\93ù\rà³\9b%lîj\ 4Û\9b\rÎZ\83o¤ÁÅ\16£\89Iq©@>CRMÉ}\92jPØ~D&\9a%êx\92µ±\98õù8\13þ(\ 4\ f\93\9a\1f\9aD\98ç¬\9aÇ|Ì9*Ŭ«Üv\9c\87\98Ws/\83w°¡QqN2ø\14×, \82ð\ 3àAI5F¼\8e¨(´SB\83)R\aV\89$\9b\97M\84ÂÍì×\8dl²ux±\ 6\92U\88y\96\97¬d\8f.ß/ù¬«(Ç\98\17n+Ç\bí\91Ð\94¥<\9dnpÎ5ø\14\17K:Ù\94­\0+Ás\92j\12\86¬dÓ¨\9a·Ý\92jb\ f\80\ fÙ+ï1'\aXøo#øM\88öðò\9d\14½c[ò:ñóÈ>ÌЬBîÝ\86Ö\ 5\92j>\97\1aÚ\14\17×\8dl\ 6[\f®\9d Þà{\e\1cT\9cà3ð\158\ eØ\82r\9a99Åú<Áä\1f\8fBv\18\82OUñÿùÏd±¦Ù\1cN\97[óúü\81`(\1c\89Æâ\99Y9¹y\8d
+\1a\176izEq³Òæe-Z^YqÕÕ­\7fÕæ\9a¶UíÚ_WݱS\97ë»v¿á×7öèÙ«w\9f¾ýú\ f\188¨vð­C\86\r\1f1rÔè1¿\197~¤ÉSn¿cÚo§ß5ã\9e{gκoöýs~?ï\81ù\ f.xè\91?.|ôñEO<¹ä©¥Ë\96¯xzå3Ï®Zýü\vk^Z»~ÃÆ\977ÿyËÖm¯nß±s×îú¿¼þÆ[{÷ýõoû\ f¼óî{\87>øð£Oþþégÿøâð\91¯\8e~ýí±ãß}\7fòÔé\1fÏ\9c=ÿÏ\9f.\Jü¯ÿ\1aôÿÂõ\9bÌJ±]Iö YW¢ÓQ\9d¡dg+Ýù\b/RÊK\94ôr´·Râ+\95úk\91ßAéï\8c\ 1Ý\94\ 37)\v\83\1aeÂ-Ê\85¡Øp\9bòa¬2b"NLUVÜ\89\17w+3~§Ü\98\8b\1d\7fP~<¬\fy\fG\16+Kþ¤<©Ã\94ç\94+/bË:åË&eÌ+8ó\9a²f\8fòæMÌy[¹sPÙó>þ|¬\fú\1c\87¾T\16}£<:\81I?(\97Î)\9b.^J\8c\1d>¹\Í»%\19À~¾\18þË÷_¸_b2\99Í\16\8b\15\ flv»ÃáÄ\a·Ç£a\85O×ý¸\11\fáG8\82#\191<Á\14\16\18åLÒ\9a\947?3'é\rÖt뮶\12;©fÀ Ú[\87\ e¿mÔØq\13&O\9d6}ƽ³fÏ\9d7\7fÁÃ\v\1f[´xÉÒe+êØ.j·¬[\8fȤÆ\9fILiL\8aT*\91\89N\84¢\14©hýò\bj\8f~\8dÞo\8f¡ø»\13'¾Gô©\1f~8\8dî3gÏ\9e;w\1eí?]¸pñâ¥\ 6ý\89ºÆ¶ÄÓeÞÄÊÊhbm\87üÄÖ®-\12;zW_Ú5¨æÔîaã\ fï\1c3ûÐ\96ñ\8bö®\9b¼j×ê©\9b¶­\9c¶sÓ²»ÞZ»dæÁÕOÌý¸î±\85G.\17\r54ÔÐPCC\r\r54ÔÐPCC\rÿw\r+\8d\1a\9e¡\86u\1d\1a%^¡\86]½ª/Ô\ f¬9ùúР    _Ô\8fºÿ½×Æ-~kóÄçw®\9d¼eë\v·ïÞðÜ\9dûV¯¸û\9dåOÝ÷Ñ¢'æ\7f~¹HÖPG\rÏVF\12ë©áÕ®å\89=½ªÏ¿1 ÿ\89}C&|±wä\9cwëÇ>ùÆöñ/n{yâ\96\r/MÙµzÕ\1do.¯\9b¾\7fѲ{ß_°dî'\97\8b\7f×°\8a\1a6RÃk]Ë/¾Þ³ú̾þý\8fïÿ\17{t\1a\96t\9e\0p|g¦\99v§zf¦\9afgÚi;f§ûiçéØîÌN\8fÔìд2/\14\11\11\ 4A\10ñ\0oF)\8fTLP.\15Á\ 3ð\0å\10\fEÅ["-¯µ´ÌÌ)'-\7fû߶gÞ/¼õÅ÷ýçy¾Þ\98á\8e\80¤N\ 3"_£
+)\93U£k\84\15aê"a¸>W\10Ñ~\9b\13Õ\93Ä¢\99¬\rð?\1aJ!\83ìÔ& vøeÞàzz¶ÓÃcòÁ-Ì£>ÿ$Ck\10S®F\96\8akCe\    ¦\81)Æj3Jñ-)|\92\91Ê\89鱶\ f\ 6\1ed(;¼\ eÔØnZÔÚÿs®ÝõôË>w\8f'C71}f¿Dm\e<WÒ\18,\10ÈQ\95÷d¡uY\95\18Õ¯¢ð¦ø\12b\v\85Oi·6 \80\f|È :´\ eÔÙn\h²ßó[÷ÅSÏ\ 6Ý<Fǯ£Û\1fú%Ô\eáwE:\ 4·°!D|·\16%K\97¢\15\89\15Xu\8c\88 #  ÉÍÖ\ 6\ 4?ý×°
+\94\1fú\16ÔÛþ}®Ù~Ï´ÉÅv|ôʵ\81§\9e¡M\83¾4Yg`&_\8f`3ÕÈ\92;
+TEr-ZF\95båäJ¼\12_\1e©±6PüÓç@\0\19ª\ e­]TÙn\98m³ß=1èl3<qéZ÷¤'JùØ7VÜ\1dÀ`\e\82ò³tH.]\85*\8d¯G\97Sê¤Äj|\rVJ\92[\e(\81\fÅ{V\ 1ÙÁ5oµ'\7f\9cê²Û92zÁæá´«{Ë\94\a²zØ\87\v ç\19\83²\19ÍÈ\82D\1d\8a\e«A\17\93\94زðz|9ZNª²6P
+\19J!CÝÁÕ³Í'×\8f\99í¶\99\9e:Ú´Ï^tSM_C\88Ƽ\89¬\81\80ø\8c\1eDz\8a1$\9bÚ\1aÊ$7\87±\bM¸¢0-\81\17¢\89,¶6P\ 6\19Ê÷¬XP\1düj²ãäwæ\91³ÛZ_8\9el|ërE:ë\ eãNxc³\87\ 3¢è\ f\11ñ´~T*¥\aàvâ2pFB6º\8d\94\eÜ\1aÅ´6 Þ²\fÈvÿeF\7f`åàÀ±5m\93gw¨ß8ØÈ\80óÅ\929÷[yÓÞ\88´§\81\18\92D\19BGG<ÂÆá\ 6\bñ\183))Ä\14\95\82è\8b¥[\e¨Ø²l^¹ë\8bÑ\9e=ËÛÇ\8f¬SÏ\9eÙ)\ 1\ 4ÀÉñÞ{7wÆ\eoïø\198\9c2\85
+\89\98ÄbpOñ8ô\13">äßä\bÄX4    >J\8d´6 ÝüÙ3ÃæO;F·.×Ì\1cþ^²h»\83\aÎ\1eÊ\ 3\17ÎÜ\ 6W\9dã\17}®FÍ\a]ÇÏ\85Þ
+{\8dóEÍ\12ü\91¯"\ 3\82f(\81\81/c\83`Ó4\84µ½Ñ¬ÿ¤çñ7\9f\7f^!}wø\a>8¾5\a\9cÞK\a\ eÇhàÊ\99Hàí\80\ 3AΡ Ô5\18à.\a-F\\r|\1fé\ 6{Gq÷{\17ëá»\10ïim=Æ/ÿ¤\9dZý©táçU\ 2pàû\1cpdK*8¹+\1aØï#\80K\87ÑÀëD0\80\9f
+\ 4¨3þ\0\17àÏû\0\92\9d7\88²÷\ 21ö7\ 1ÕÁÚ@ÁæÏAþî\95àÞÁo\81àä\ 6Pa·\13È.\1d\ 557\9c\17d0ß\17\12\14~D\88K2qH9íy\14\9eþ\ eµBCO¬mHLUÖÅ1tÕ\94l\83\84Ì2\8a"8\9d\96¶dX2,\19\96\fK\86%Ãÿe(\80\f%6\e@\15d¨u=
+ä×\9dçëüý¦j\90\84áò°\94^A\ 4³µ\80\¢Ë\8e\91*\19´\86ºÔ$\9d,!­µ2.«K\1cÃêãG\15v[Ú\aÃ=ÈÀú×ZP
+\19$\90A\ e\19ê=]æ\eüü\9e+\82#\86¤\18zw\19þ^\v\87X¦aFÕ*²b\e«Ó\13Z*SR»D  \99&^\¾\99\1dËîµ4Àúh`C\ 6¡Í\8f@v~'¨¿x\14¨<\æÕ¾þÏÕAÄGµ¡i]\158¶^@(W±I\8aÚ<Ê}I\16ÕX\9eAï-ed\9bYIÌ\81ÜDV¿¥ýa(\84\fe\90¡úü\ e \84\f\1a\ f\97·Z\1fÿg:8éQCHz§,¬¨I\14^ÕÀ\8f\14Q\9a%ìx£\90Iï-ÊÊ0ç2\98\ 3\99¿\16\98\83¡\02\14A\ 6\11\81\fj\97£\8bºk.sú[°g-\ 1\91\83\8dH\86Q\81æê$Xi}y\84J&¤èE|\9a\91ËNîe2\19æÌ\1cæ@ZF\81ÉÒ\0û£\81\ 3\19ÊOü\rÔA\86F\97#\vzw\97×\ 6\84\11\16\8c¸ÝÞ\88â©ë0RYe¸J($é9\ 2J;\93CëÉ`ÑMô\82\9c\87ÉÌ\ 2\93¥}0° \ 3ïÀ\1aP\ 1\19äç·/69\1fùÝàæòªã&ìI\8f\1fÙl\84ßÑë\90¼:y¨¤¬*LYT\16~?W@l»Í¥t%\17Æ÷SY\8c\aÔBf¿¥ýaàC\86*ÈP\7fnû;½Ó\91×íW\9d_ôÞ\80\8d\99}ÈÝ]\81·ÕMÁ\9c*\ 5ª\82'Å(\98b¬öN)¾%\85O2ÆqbzÈ\85)}¤¢Ì^K\ 3\85\9bþg\10\1cX\r$'Ö\ 3å¹mo\rN\87_u_q\9e\1cð\84\r\ry\93\ 3\18r=¢PØ\10"fU\87ÖdV\86©è¢p\1d­\84Ø\12\ 5=!ð\12:qÜ´.Kû``ïZ\ 1\83ìøú÷\9asÛ^·9\1dzñà²Óøè5\7fÓÈ-\92®\17\96&i  *àª\91¥9u(Iº\14#O¬À©bD\ 4\1dQHnÆ\96P\rèâ\94VK\ 3E\90¡\102\b÷\7f\ 3j\8fÿðVwnëËÎ\v\a'\86\\1dG&ÜüÚǼ\88õý°Ô²Ö ¼\ 2m0ÿN\ 3J\9c\\8b\96ÆÉ°u\91\86ð\8aH\rZ\1c«\r\11%4Y\1aà@\86"È Þÿ5P\1cÿëoÍgÿ1iºp`ä\89³ãÀô\15ߦq/\82Äì\9fÄí\80gÝÕ\a³é\8d(\ 1M\89\16Eɱ\95\84Z¼,¬\9aT\e"\8dV $´\ 6K\ 3ÜMË\0\a2TíÿjA}ü»)ãÙÍÃ\8f\1dö\99\9e9;\1ag/û(\9eÞÄ\96>ò£æ÷ÀÓ\19íÈ\9c\84f\14+Z\87á\125Øb¬\8a \f\89\11\8aèÊ@9µÊÒ\0\ f2\bv~      jö­\9a½\7f\98éÌ\86¾q»ý\86\19'GíÜ%¯\8aç7BÙ#~äÌ\87ð\84äÞ\90´Ø\ et&©\r\9b\enÀç£\9b#XÈûäB¸.\86\vÓÒx\96\ 6\ 4\e\97\ 1Ñ\8e?¿Sî]1a<úuÿ°í\86\96)»ýÊß/ØW/¸zòfnÀïNøcSG\82Èq\83(j¤9, ß\8fO\rë%¦¡ºÉ\8càÎè\8cÀ\ ej\96¿1!ÛÒ@ÉÆÏ\80\17/õ¿,7\ fî]iø\ fûu\16Õä\81\87a\Å\8eUÇq\¦3:Z§¶:.gÆ
+8gÜ\ 5\81:
+El\ 5A\10Â\16\96,DBHHB\b\81@¾\84-\10         \90@\ 2\84%1, {       \84\e¥\8a"
+Z\14DÐÖÿ|§íñ>^õÂ\8bçþwõ\9eó>±ýL³pæP\1d8:HÁå"ÿ\95\97Oêl@Hü4\86@\7fD E> E\85ߧÐñ÷h\fÌx\f3ø{\16\v=\96\10\1fp\97Ã~ß@¾ÃbI»ËbüÆÎ\15\86)Ëõ\9ay\9b\9dµ`o%\86³6\85àâ\94öÖË5~)ð
+}\1eçOz\11\1etõGr(î\19\r\8byÊÀ\87ÌÄ\86¡\9fÄ_\rx ÷{\9cL|ß@¹mÅTÿæåÆÉí+5s\a7*àÄN\11Ø\1eÈ\813GRà¼]\1cx\9e£\ 2Ú\85ø\16ç\8aÿ)Ü\1dó\86|9x\89æ\85^d\ \dyû¿bûø.pP¨\85dß÷m®ký²\81Ûk\97µÎm_¥\0ËÍ"8²\83\a'÷qÀÁ*\ 6\9c\8f\90áò)\ 2\ 4Úc\0{&\bÂÏ\ 6B¤£?P\9d|\81ñ5
+b\9d} þü\15à¸\\81¤÷ÎhX½L3ùÇå5ðéj1|¹\89\a\87¶%À±/h`·?\1c\9c\ ebàÒ!4ø\1dö\83У( \1c÷\86\88\13^@9é     ´S\97\81\ 1±6îÀ¶½\ 4\89ï\1däïø\brö¯\ 5\1e²Õ%'¶\82ä«ÝPíb\r5\97íA\1eà¶(Å\a=\15\91)\13|FÂ\9dÌøìëIÉ\ 2S|F¹!\86'ÓÑò\15Ý\14Ac\aI¤n#V¶´\12ê4j¼Bkn\1f\f\1f\f\1f\f\1f\f¿{C.bÈE\f¥\88¡Òa\17Ô\9e·\ 6\85\87=Ôú»½\92a\83g*"©÷\ 4tî­\1cVîP*GhHL­ÒÅf)º¢sUíQ\85Í\9aH¡¶%¢²£\91PÝY\7fµ¦ÝÜ~5ì[\ 3y\876\82èøV\90!\86zgkhpw\80\ 6¿K\v
+Lè\13y\ 4}\DM\19å3\vû3Ù\12]\12\11\9f¦ÖÆdk\9ai\ 5\9djJ©®\91$ÕË#d=U$y\97¹AÁ\8e\95\90\87\18
+¬7BÙñ-P\8d\18\1a¿¶\ 6Õ%\aP¡Ü_6\86`\1e×\853Æ$äô\91âè\12}N¬¬+5A¥ILÖ6±2ºU\8c<C\ 3­ÔTE.3\95Q*{Å\14Y\8f¹½3ð­7@9b¨±ß\ 5*ÄÐäæ\0Í>îóê`ì#%\81yWFÊ\1a\14SE½\ 5\fE[V\Ks2§[\95\98nh`ç\ fÔ±ÅCb\9a\98\vè\95½æ\ 6\90\8f\18
+\11Cű- °ÿ\ 2ÔNÖÐâæðVãí>ß\8aÆ=jÂÇÞV\10y&       ¥¼»\98Þ Ée¶©³¹=\8d\19\99\86\9a\94<S%·tX\10+\1aÉgJ\8cy±R½¹½3\14!\ 6鱿A\1dbhv²\ 2­«ÃÏíW<æÚ\ 3ñ\93Z,ë\962<·_\1e)é*£ª4¥¬6%\9fÓSÍK3J2x&aª`8?A8\92Í®èÏbK\fæöΠ°Ú\0\95\88¡\1e1´8ZAûE\877]^\1e\ 1ø\87\9d\98¸\9bÍ\84<c]DU§\9c¦T\971µµ\ 2v\8f$?ÙPÊË\1cägòG²S\85×Ó¸å\ 3i\\89ÁÜ~1\14 \86b«?C\15bh´û\1c4\8eVo;/Ú/é<=\9e÷ùã\1fö\86ÄßhÇ\17èÕÄJMm\94²^ÊÐV
+ãz\84E\\ 3¿ ÝÄËÍ\1f\16^ç¦\97\ fpÓ$Fs\83Âß\f%\88A\86\18\94\88AëhùSÏ·ö\vzO\8f\1fû}Ã\1eô\a±Gº±\ 5Ý-á\95ê\ 6rcµ\9c®)«\88í.\12&\1axÅ©¦´Â\9cá¤Bá\b\9bW>Àή0\9aÛ¯\86½k@\88\18äGÿ
+*ÄÐîh¹Ô÷\8dý\¿\87ÇÌ°OØ\ f\83\81ì\81^LA\9b\96 m¸\16Ù(UÐ4Å2fw®\84­O\17'\ fp\85¼¡xaé0³°|\80YPa47(üt%ð\11\83\b1Ô \ 6µÝÎ\9f\1d\0^°\9b\1dvw\9fºí\1dvgÔ\9fÝg\fÉoBþ®¼\99Ø l ´æÕÐ;Óe¬^\8e\94cdUd\98¢Ë\v\aéâò~\9aPb07(úÍPf¹\1e\14G?\81\16»Ï^÷\9c;87ärzú¶\9bûĸ\17\8e_|\87)8WÑ\85­\10·\84Õå5\12\9bS\15ä\ e\9cÞ\13S\15«\8f\92rûI\92ì\ 1\92Td\8c¬\92èÍí\17C!b¨@\fõ\88Asú\1f/õç\ e<»qÞvò\9e«ÛÝ\a\97q\86ïýXMCAÙR\1dFÄ×àªÓ¯\11\ 6bkt-¹#²\9aÖsUÆêÃV%ë±Uù}8Y±ÎÜ@\80\18\8aö®\ 6©å\9f@ydóë\8eÓ;f\aÎþûÑ\98ó©û\8f\rOy`Û\7fð\8dQ\Gg\94êC\ 5Ù\9d8   §\95P\e£&*)ÊÈ&b\ 3µ\15WÇl\v©Mì@×fv\ 6Öæ\98\1d\14#\ 6\ 1b\90\1f\\aMG6Íël·O\8d\9eÝ?þÀñäw3.®}ÏÜCU\13(\9aä&:©À\14\9a\9bÒ\87+au\11*¨mDYD+¹6¬\99Z\8fQÇ(\83®±¯ù«ÒÔ~Ê\8c&s\83\12ÄPºçcP|¹öMÛá\r3\ 3¶[ÆÇ¿Ú3òØñ\94þ¹ËEÍ\8bKAòIT¤`\f\1d\979\8aIK0ás¢\rá\85ä^RéÕ\1e\8a\18×E«\bî`J\ 3ÛØ2_m\8a\1c¥M«67\10\80ò\7f®\ 2Õ\81Õ/tÿ]wï¦ÍæáI\87}ºYÇS\9aÅóßÔ½tó\13N£Âx\13h*w\f\eǼIH\8aº\1e\91N\1c¦d\85\rÒr0\ 3\8cü #\8bïoH,BéS\8a}úÒÌ\ eÄ\88A¾û£7\9a\7fýarÐúã\91ûÇ>Ñ=sØß¼töDí[gçò×n\9eyÏQAÉÓA\ 4Ö$\8e\1fN\8f\18'3    cÔ8ì\1dFBÈm\16\a}\8bÍõÿ.)\19u#=Õg4Ãì b\9b\ 54~nñ¬o·ÅèøÞUº\99c[\9a\16íöËáÌQ\118ý¯\0ܾMYByÅÍ\87\ 4ÐfÃBHOI8Ât\14\ 1û8\9a\18:\15K
+\9a\8c\8f\f|\98Hñ{\90\1c\85\9aÈ ùLd\9a\1dTý}Å«¶íËoÝݸ\7½gMÓ«£[e`³·\ 4\1cþÃ\ 3G\9b\14p=Ç\ 2Ô\ 5êÏ¡nÄ×\ 4Oü"É\e³@E\ 5¿dø¡çYþ\ 1sì@¿\17\4êyj\90÷lf°÷lV\88¹\81ê/Ëo\98Ö.Ó=Ù´Býjï:\19\1cÞ*\80\13»ÿÏn½Æ%}¨\ 1\1c¯ã¶êl­ÎNmg[­µ\9d¶ÖÉS\9be\97é²ÖJKÉÊnÞ/T^ð\86\17\14¯ \82\88\17P@\ 1QQ\11Q@@\10\15PA\ 4\11/]ì,«Yiåén­\9bmúìÿéôÙûÿ»ó¢\17¿÷ßÏóây\9eRؽ\91
+û·e\83\8f[
+\84ìÁCä>\1cÄyE@²÷)H;\88\85¬Ãa\90ã\13\ 2\94#Ás´£\81sEÇ\ 2fK\8fûÏ\96¡î?æ\85ó,£\8bæµ?_öV3|ó~\15\a\ 3¶¯ÎEfA\ 4\8f\8dx8ä\8c\83Àíá\10î\8a\85\10\19\ 4©?\ 6BÆî\0ÈþÉ\1fr\7fò\ 3ê\1e_(Ø{\1cJ\90\18îh3[\17ÌÓ^^0_\ 2\1f¾S\rë\163`ãò\1cp^A\80\1f¾\88\81½kO\81÷ú\10ðÝ\10\0Øoý\0çt\ 2â7\1f\87$ç£\90\8a\94¾å\bdmñ\ 1òÖÃ\90·í\10Ð\90
+P\a¥+ß\ 2\ 6²£\8a6/\85
+äfÕì^\r\r\18G\10\9fp\ 1\11Ö\13\841~Ïù)\91\ fØ$ÂT1\8d|\9dRB¿\92Í.»\98Îç\8e¦ÔT\9dMª¯\1dI\90\88\86âå\8d\83±\9a¦\81è.Yo\84A\8e¦7\867\867\86ÿSCÙkCɦ¥ÀC\fµ»?\a\89\97#4\1dw\81ÆPO¨Çù?­NÆÝãf\11o0©\94qZ\11ãbNYÅùLnõ\19¢ ~(¹VbO\14Kmñ²\16k¬ZeÄu¨õ8\9d\12MÀB\f̵\8b\80\89üÕ\95Û?\84ú\1f?\a©§#È\8eº\82,ØkN\12\19øD\94\18s§:#ã:'\87>V\À9OeÔ\f\93Øâ\81t\9eÌ\9aR­2'\89ÚLøæ\8e\9e8µN\e£éh\8dm× é\95¡\141\94!?m\15b\10#\ 6ù~GP\1eq\ 5E\10fV\1e\1eô¸   \1f7UO$\8dó²K.\94R+\87é\85\r¶\f\8b9³\cL­Ôu%×uë\13\9bMêXy¯\1cߪoNhkG\13°WüÏÀF\f5\88A²k\15(ö9\82ÚÇ\15Ô\81\98ÙÖÓÁ\8fZâð·$)9\97«3ËÎ\95ç\bíÅ4©\99R¬éÉf\19ôi¼ÞNb]\9f6µÙ*M\90ZÄIÊn\11\89¦W\862ÄÀùv  \b·-\87&Ä Ú·\1eÚ\ e»\806\0ó[ÛÉ\90iuLâ\rY\12e¬>\8d3ÂÏ\16YKó\94Æ\ 2ºÎ@eõèò\ 4æ6r½U\91ÙÔ/"4õ\vS\15Æjb«\1eM\7f\1aÊ\11C\1db\90"\ 65bè@\f\9dþ\98\17\9dØÐ\87í¸¤IUBþEI*w¨:SÒW\91«î.+Ô·\17\95\19[iÜ>9EØß\94+±U§K\ 6ø\19r\137Se@\13p^\e*6¾\ fõ\88A¶ó3Ðx¬\aÝ!\97Y\83\1fæ\99!,ô\81!*y¢-\9evANàÛEéM&A\8eº\83CÓ«\98\f£´\90c\11Ó\ 4ýuÔ\86\ 1nv£\9dC\92\9bÙ$e\17\9a^\19X_/\ 2.b\10m[\ 6rÄ õø\17\18\ eºüÞí\8byb\f\r½g\8c \×ÅÑÏ)\13\ 5ÖÆ´&}\rI­æQõRV\91©\81Á²Ô\14ñm\95ôz;\9bÒhgæÉú\18yÊn4½6,\ 4\1ebhغ\f\14;WB;bè>èòÒt\ 2óØ\1c\12v»/\9cðKWtá\90:A`jNmÒÖgªå\82\}CE\81±\86Å´ð\98\156N\89ÐΠ7\ e\16Ò¤}\854E\ f\9a \1c\11\ 3\1f1\88\11\83\121t"\ 6\93÷÷/,Ç1ÓýAa·úO¥\4F\15Ù´ñ\ 2C\v\12§·J\84d\9d°2ßÈ«(±°8\1c\e\83Um§3\e\a©ÅR\vµHaD\13\94\7fêðÊ Ø°\18$[ÿ\ e­n+Aï¾î÷¾\ 3ß?³\1dÃÜ\1f
+\f\9b°cSÎ\99#\vͺØÊvU\92\9cÖZ×\90­ã\v)F\96 ¨¯\98Ïê/à
+\ 6(ÜF;¹Lj!\97\18Ñô§¡
+14!\ 6\8dÛ
+èrÿf¦\1f³ýס£^wÎû\87\8e\8f\84¦\fYÃéÝ]1|\956¡Q¬HUU5gv²Å¹=Åuts¾°Ô\9aSͳe×\88\a2xRKFE\8b\11MP\81\188\88¡\ 61H·|\0Z·Og\8dîk\9fÙ1Û\1e\9e÷ñ¼5æ\ezq4\84\9f.èèÅñdz¼XØFPV(3ÚKdä®ü&Z/¹\91\10\89b\91\8dP+íK©V\18ÑôÊPþÕB¨Ýð\1eÈ\11\8eOfÌ{¿~4ìµõÎåÃû¯]=\11|æRP²ñÌIZ«-\8aÛ`\8a\13ñ\rI-Ìö´¶|M¶\9e¤¢ô¤)\8az\93å\9c¾\ 4¹Ð\82\97ÉÌx\89¢\aMÀE\f\15\88¡þßï\82Òùos\86\1d\1f?éß»æî¨\97óÍIo\8f±ÉcA¶«\81\89\9d?c)Ò\91\b\8eÀ\1a]Çì\89\97RtI­\99Zb\aA\9deÀ«òº£\95EÆHE¹)B)2âÔ*\ 3\9a\80\87\18¸\88AìøWÐ8/\991îøèÁð\9e/o\ñüî\97©\ 3\1e#ÿ=\1aØs#\0¯\1aÇ\92ëF#\98l{t%­/N\94Õ\93 %è        Ê¸\8etM\94\96Ô~º\8dÚ\19¦aèB4|}\98¶¡\ 3MÀG\fü5\v Ùq\11tl^üØúÃò\9b\17ö¬º4éá4r\17ãa¹ï\13 ½ã\1fÓ8\11\96Á\e\8b((>\17ÍÊ\1d\8cç§õ'      \13Ì)\r1¦tID\ fIz²\8b*\ f5\14+\82\fåÊ@}\15ª ò\13\a¨ùç; X¿p¦gÓ»·G\\97^ººkåðm\ f'ó#\8c»îñ!_Ù´_DÕTXréµ\b\12õR,-s4\81A8K`Ç\ f§qq\83Y\95á\ 39UX[~M\88µ¸6Ю÷·ðQ\ 5U\88AôåÛ ]÷ötÿw\v®\ÞüÞðÔ®U¦Gî\9bÚg<÷´<?x¤ö©_(û>6º`**9{".#u<\89\9cp\99H\8d\19Ë,\88ú\99\xú\ 2¥\18;Jg\84\9cg\94\ 6\9eå°üÏòÙh\ 2áÇ\7f\ 1Ùj\87\17Ý_9L\8c®q\18¾é´Ä4½kuÛ˽NÍsûwÕÎy\1f(ÿÍÏ\97þôd\18y\1a\17\87\8f\9d\92\18;\95NÀÝ$\11Ã'sÓOMäg\84]/Ì
+¾Æ$\ 5\90ýÇy9h\82:ÄжrþíÁ\8fæ\8fL~æ`\9avú@óÒí\v   ìÞ(\0\ fW6x»ÓÁÏ\9b<{ò\18q&: ñYBHì\93TlÔãÌÓá\8fÈ\11§¦)\91Ø\87\ 5¸Ð\aÅÑÁ÷Kc\ 2î\95ÇùßåÇ£  ¤ËçÿÚ»tÞÙK\7f°_gaMßY\18Ç\99ñq­ZGÛ\19u\9c©ÖºUjQ°µâV n \88¬²\b\82,\ 1Â\1a!\84\1d\ 2\ 4²B\bd!\vK\12 \84,då\1f\12\12D\14\ 5©ÛPZ´\96qð©:ZÛZ¥´g~Õyæ:ÞÍE/¾÷\9f»ó\9e7\ì\8fß\99§ûÙ}E;ìY+\0/W\16\1cþ¨
+ü÷\17CøA"Äûf\ 2Þ?\15²Oâ /8áעг¿\94\85ÅÎV\9e:ósMxô\f#âôL]dä\8bƨ\88ç\82Ó¯Ó\8cy©ËÈå\85.ýÿZò\aíìÚ\ 5rp_Á\87OþF\87ý\eËàà6\12\1cß\99\ra»ñ\10·\1f\a©^ñ\90å\13\v¹\ac àP4\94\1e\8e\82\8a#\91@9\1a\ 14ßp`ù\85\ 1çX(ð^«\11û<\17ëØ|\17ͳ¥\7f\94º\85<ض\9c\ 6\1e«JÀsm\ exoÂ\83\9fk\ 2\ 4¹ÅB\8cûiÀí\8c\84ô\8fÃ\81°ë\14ä}\12\ 6\85»C¡Ä3\ 4È\9eÁPµ'\b¨{\ 3\81µ÷$°÷½N}\83s]Ôÿ\98ëÒ
+ËæðàÝ\85TØòf\11¸½\9d\r»VãàÀ;±pd}\ 4\ 4l\f\85ðÍÁ\10ûþIÀm\r\80\13\90ý\81?än;\ e$Tá\87Ç äC? »ù\ 2\ 5E}­\80\8aö\ 3\ 2 {,\ 5æî· Ñk\r\88|7\81\ 3\84±^ÀÃû\ 3\9b\18ù\9c^\96ø\94BÍ|XÆλ_À+ù'QTy\97ÐZs'³\9d1\99Þ]û%¾§~"ÕÜ0\9eâàÞÄ]á_\89¿,p¶ß\r¿\eþ/\rÕÈPá¾\14Xè¿àþ× \ eñ\0Ñ\19/àãO\0'7ê'fiÒwÕÔ¬\aåuùÓ\85ܲ)¢\90ò5¡\956\99ÕÎú2]É\9eHëi\18OíåÞJq\b\r7\r'8\1fÐÖÌ\81j´');\96\ 2\em{Á§k åè&h\vò\80\96ho\10'\aüÂ'DÿX_\94ú\88A!NW1K¿)áÔLæóY\13¹\92\86[\ 4\19ÿFf\97èZº¶y\fon½\9a\eL\1c\90õã\86\9a\9d\rèÈP\83\f\97@ÃÇ+@t௠=²   ä\81\1e \8fò\86¶¤ÀYIVìS~AÆ·õ\15\85ST*e\92\W;^Äå^'\89ÄcçÚÚF²:Û/§«\15\97ð¦n\a΢¶¤ôw\1añç¥Î\ 6t´£¨È@s[\ 2\d\90 \83üðFP\9cô\0\ ft$\ 4ÍH3Î>\11çeOsËJï0)ô/(ÌÆk¥\1cÉh¾@>\9cÓ¬\1cÊn×\ff¨ôv¼ÑhN1é{ÒúºÕ\19övg\ 3Æo\ 6´'\19ÈÀÿh9´ì_\r\1dÈÐ\1dà\ 1Ý\11>Ðu6øEgZücinÎ=aqÅWõ\15u7h4á(¹N~       =\aç\89"½ã\9cÜl'h0SF\ f¦I7\98º21MG¶Mál/\r4d`¡ÿB\80\fmÈ 8´\114'<@sÊgV\1d\17ü¬;5ñQç9âTs\ 1å\vnyÃç¬êÖá*¦r°¬Qç(\96\98¬\ 5í\18FR÷i\bÚ¾\8e,\1d&#\98{Zs¬Jg\ 3æKÃ|¨Ý¶\18\84È Û·\1a\94\876@\8f¿\aèÂ|ftgB¾×&'=Te\93îÊHÔ[Â\12þH}¥ü\ 2\9d®²UÕë{Ë\9aÌúâ6\8b¶°ËªÈÓØZs´}\12¢I/ÊëS9ÛK\ 3\1d\19ØÈ Úù'hß·
+T\a7\80á¸û¯ÆP\9f\9f\8c1!O\fI¸û=\19ù·;sécâ\ 2áPc¹ÜƪQ\99¨µ\ 6m%·WY.éë(í°I\8bÔýMÈÁÏ7\1a¹\85\98ÚÙ\80µú\95¡þ\83Å A\86\ e\1c|\ fLÇÜg±\10\9f\1f±è\90GX"nJ\9fVx«+\9b9ÜJ\12Ú\ 5%rS}\95ZÃd\18\145\1cLV%´¶THûÅd\95½¡Hm¯/6\98Ø%\98ÖÙ^\1a\18ÈÀA\86fdPì]      =ÈÐ{Ì}Æ\1aìó½-*ä[[|ò\1dSJÑ\98*\939(#6aâ"¹\96[¡R°©\ 6)\83\8d\89©|« ºÅÎ¥t9Xe*\a³\of\92{{\9cí\95\ 1ý8\r®o@ËÎeÐ\85\fúÏÖ\83ÅoÇs{\90÷\93\81È\90é\81¸ä    \fWtE\9bÁìïÌi2´\14È\95Me*icµAÄfa<&×ZO\97Øki\1d\ e*¥ÛQCÑõÖPÌ:g\83Zd`"\ 3\17\19Ú<\96A72\18\91Áæ·ãÙ` ÷¿/F\84L]8\93\96T4dHc`JB\93FF\92É%%*± RÏmd`l\ eÇʨ\13Úkêä\8eJF·\83L×a\154³ÎÙþgà!\83ÌãMPïù\v\98\9dµûnÿáÒI¯\a\82ï\\8aI¾êH(t\98\ 6M\96@¡ ÊZ¤EÝ<   Y_'¤öÒølk\15WÐOn\94:J\1aT\8eâº\1eKI­IïlP\87\f,d\10¸.\ 292h÷ü\190\9fu/\ 6}ݾ\e\røtúZXÐÄèiÜð\85ø\82¾¾\14\9aÚ\90Á\97ªs¤M\9d\ 5J¶¬LGk­6WJX}¥"\9e­PÔbÏ\17©ìy¼\1e\v©Ñ¤w6¨[õʠܺ\b:ÑíÔïy{Öæ³ö\87\8bG·=º~bÿÔxHàõkQI\83ÃqùF\a\8eÚ\89¥sÅ\ 6B+GCê¢+K´\15\9dUÆb9\ 3\1a­¹2\89\8d SÚ²\9bu\18AdÒ;\e°\91¡ö½ù Þº\10ºÜ\97\80Éó­ç\ 3Þ\7f\7f<rÔuzÂ\7fïäíà\80\91ñ\88DëÕX\92úbbu\9b\ 3ßȳd53MÄ\8eJ}\91ºX[¡ÏSÓL\ 4\15\aËP\89-iª.\v^¡7§ÉÍ:g\83zd¨C\86\96÷\17\80zÇâ_-»\97?\1dòZsÿú\91-wïúyÞ\98
+\f¸0\19\1e\19Cì¸\9aP%¼\94R_;\98!ª²çÈ\8a­\ 5]D\vY\93ÕKÕáÍlC²©É\94h\94£\8c\86$-¦q6à¬\9c\ 3\9cõó@ºe>è¶/znß½ìÁ¨×ʯ'\ fm¸yÏ×óòtÀ\89¾©SqªÛÑ\84\96ñøò\86ëÉÌ\9aÑt^ñÅìæsç\89ò4{¡\ 2g%wÇ÷Q5g,lm´E\88êÒÄÚ¬Jg\83\ 6dà­\9b\v\9d\9bç\81ÙmÁ\93\8b»\96Ü\1d?°âÆÔg\e\87\1føzÚ\1fúû÷Ü\ f\8d\91Ý\8b\7f\93PÀø*µ\92|3\93I\1a;ÇÉ\1e!  R\87\8bÅ\89\96¸\v5mÑçke\91çyòð\81ÿ°_goM\9ei\1cÇ#\ eÖ\8aNǺ_¶ÖÑ\8a bÝZ\85Ô\8a"\15\88(²        \b\ 4\b   KØ!\vÙ\80\98\0!!Á@BB\ 2\81\0       \10\ 2\8a\80\82"ua¨Â(nXQ\14\95\96¢HU¼û^½æòh\ eÞ? \aßóÏÑóܿʪ\80\1e\ 3ê@ºÂ\ 2Ê×þ\ 3\1a¬-gº¶Î{ò\9f\9dó\a\1f~¿´oÜÙ¦ów7¬iòÈaݯ¾'Ê^â       EãQ\89ÜG¤Ììû      ÌäáT\1eå¿Yü\98\9bÌ\82È\9f¹Ea\ 3|1¾¿H\12x]&õ¿®\92ù]«-E\e\94"\ 6Í\9a¹`^?÷e\9fõÜ¡û¶óú\9eaWtL\1d´m\9aqu¨~ãî¢\98öñ)~\8d?\99;I Ð_\90)©O©Ô\84Çéi¤_hYÄ\11\16=âA.3ô\9e\80\85¿+â\ 4Ý\91q\ 3\86+rýnW£\ eäË- nµÅôù/çÜ\19^2§ï©í§ç¦°«\1ag\9d\1f\ e}'\9f=ì$\9aõqÏ\9bÅû2þ \ 6¥½¦\84\9e\1c\15÷[ftô\ 4\83\14õ\82C\ e\7f\9e\1f\1f2.LÀ?+N
+z*£\ 6\8c)Sü\9ehSÑ\ 6ªesÀ¼\fs«ß
+óÓØ\12\8bö)[+ã,vU%8ZËÀy\87\10pßsÁû \rð¸T zÄ\ 3Å;v6Ù\8fø.3 ò-#0l\86\13\1cò&\1f\8f\9f.\b   \9e\16\87\ 6¾.\r\v\f÷\9bÒD \rêþ\85\19ê\9e\8f¹|c\ 1æì«es\e`Ó"5ì^Y\ 2{×å\83Ó\16\ 6¸íJ\aO\87D\bÞ\17\a\ 4'"\90\ fE\ 2Õ5\f2p!À8\8c\aö\91 È;\1a\bB\8f\0\10\1dó\a©çq(÷ò\ 5µ7Ún\9f±Ä\ìý\ 4Óv{>F\ f+,U°y\91\18v.Ï\ 5û5Ùà¸\81
+.\9bIà±-
+\ 2v\85AÄî\93\ f\86Dl ¤î\r\80¬\1fü\80¹ï8p\1c}!ßÑ\a\84û½¡ø\80\17\94:\1d\ 3\ 5ê.uXbÌ×,15£óç(`Õ¼b°YÈ\85­K2àÛUñ°w\r\11\9c×\87\82»õ    ðµõ\ 3ü\16_ ØyCÜ7^\90¸Í\13\1f\83Ìí\1e@ßq\14X;\8f\0o§;ðw\1d\86¢]8\90|\8b6sÏ\\8cî¦\ 5\87\95\85\bV[²aý\824°ý,\ e¶/\8d\0û\95\7fõqp[ã\ 5\9ek=À\7f\9d;\9c\\8f\83ȯݠf\83+\907¸@¢õ!H±þ\1126:C6\12Óæ pm\9c ß\16m\90\83l\1cúÆO \ 3ù+8{\16\83Àq\15\88\81ØÇ\ eD!öP@r\86üÔ£Àaù¿g
+BÞdI\b¯RËâ&\93Ô\89\13ñº\94\17qõéã±MYÏ¢Ûhc\84\93¨Þ\9cG\11ýì{a·87N\ esÑô·áoÃÿ5díX\b¼Ý\8b¡`ßJ\10#\86\12o;\90àíA\14ã\f\82\94cÀc\9exËâ\87¿¦\15ÇL¦\9fN\98HV¥<O¨ÊxF®£\8dÅ62\1fG·²F\89\9dÜ_\b½¹#\91ýyCaCüþÐ[yh\ 2\16²³\18\88\81¾}!ä\7f·\18D?¬\ 4Ù¡u ÷´\83Ò \a\90\12\ f\81(Éë\83 \eÿ\86\97K\9cd\16&¼Ì\92¦=KUÐ\1e'U²\1eQjx#$\ 3ÿ~\8cYx/º³ð\ eñ²h0²_|%|@t)â¦\0MÀF\fLdã0·-\ 4\ 1²/$Èm/ÿñß ô°\ 3Å       ,È#]@\1aïûN\94\19úê\14\87\15¤<¥\8bé£érî\bUÅ¿\97P]8Ln\10ß"\99e\831]ò\9f\89}å}\11\17¢®I;\88\ 3"4\ 1\a1ä \ 6ö7VP\80ì\vÙÞ\15 @\fê£v \ eÀ\82\15ÊÈ~o¥i\11\93E9ñãùüÌÑ\9c\83,\99`8U)\1eJª*½A©W\f\90ZÔý1]\9aÞÈ\vU]\84Kª³ÑWN\9bc¯KÐôÑÀÝj\ 5"Äp\1aÙ\17\15Îk¡ÊÝ\ e´~X¨\fu{_\11ëÿF\9eLøUB§\8e   s\19\ 2þ0]"\1eL//\e jÔ×(úê+$\93¾7¦£î\1c¡Sß\1aÓ­m"]V\18ÈWeh\ 2.²/XÈm\9fkg\ 5â\9d\9fA\19²/*\ f®\85\9aÃvPs\1cû¡ú$nF\13\1d0U\91\14ýR\9e\9d6*âpîæ\9f*\1aÌ)\96÷g\9eÖ\IQ×ô&ÕÖõ$\9a\1a:)í\ 6SL»Á\10w^§§\Ré\12~\92£é£!\1fÙ8%\88A\81]\ eÚ\83_\81\1e·\ 5ê}°ïôxÜë\1a\846>vL\99\9eù \84\997(àI¯±\85\15½ô\92ª\v\19åús©U\rg\92\rF3õLc\1dåL£.¾S¯Iê©TSûÊÑ\ 4<ÄÀF\f|dãHwü\13*°Ë@çô\15\ 6£7vÆ\18\84\9bl\88\f\1c¯%Ç=T'Ó\ 6eY«\85,ÙÅ<¾ª\83%ªn£\95Ö5gª\r\86ôÚ¦º´\96fmR[³\8az®A\91Ò­-KëU¢é£A°i\ 1\94"\ 6µÃ2¨=°\ 6\8cn\9bgM^ØiS n¢)<èq},ù\8e&\91q½,]xQÌ\90u\bx*3¯@gd\95Ôëé
+cuvu³&«Ñ¤Hom9\9dvÖ(Ë8_-ͼ¤B\13ä"\ 6Î\86yP\80\18äÛ\17\81Æa)Ô!\86f·ÍïZ=\1d¦Ú\ 2pã­¡Á\ f\8dÑ\94\e:
+ã²2EØ)Ë\96\99\8bØ*\ 3\9f¯«á\15×kXòF%³ÒTƨo\91ÑÌæâ¬3M"ZWM\11í¢\1aM\90\8bì,Î×ó ÐöS(C\fUöK¡áÀ\97Ðâºi¦ÝÃá·sþ¸±ö\90໦¨øëz2£»\92*h\93\8c\12¦ª¦0O§æ\17Ö\97çÊ\1ae\9c
+\93\84]k\16±[Ì\ 2F[³ §³öTN\8f\ 6M\7f\19¸\88A\84\18\14\88Ag¿\ 4\8cû¿\806WÛ鮣ö//\1cw\eíÄ\a\rµERú\f$zGu¢ Y\99.«-¥«*Å\]Y¡ ¾D i,ÊW\98\84y:3?¯¹\95Çi5ñ¸\1dz\1e·[\8b&Èû\9f¡\181T oe­ýçмÿ\8b÷g]l^u\1fÙó¼××m¤;8h =\82ÜÓ\14Co«\8d?ÕP\99\96gW\94\97²ªK$üúBQq#¿Pnâ       µf¶ÐØÊä\9b[\98ü\8eº\1c\16M\7f\19x\88Ab3\1fÔ\88¡nÏçÐâ¸úm\87ËÆÉÞ#»Ç®ú¸Üí\r\f¼Ú\19Fî4\13\ 6
+_§£\96\19\82ù'ûu\16Õä\9dÆq<,2\88\ e´ZµVP\94\11\Q JUd\97}\91=\845@ !a       ;\81D\82\ 4H\b\16\82\81È\8e\12\16\8d¬¢ìÐ\ 2\82\vV\8aX\ 4\11«\88 EtÄ>ó\9e\9e¹'\97s1\17\9fûïÅ{Þçÿ«Î.b\8aX\85Ü\9b\8c|þmz^y3-¯¾9\81ÛÜDÍ^é®\92\ 4\r\81\874T ÿë\ 6ä~·\1aîþÔm®¾8d{êå\98³Ùø\90\87Ç@\8f_h[;\9eV'\ eÍ(«\8bÌç×PJ¸\15I\95¬kiµ)%\9cF\9a\80'¦\½Ö\14WTÛ\14Íon\8aåuÔÅåwWI\ 2ØÈæe©É\ 1\1f¹\9dU'\14à\96®Òz\87Á÷+ýfjoÆl´§Ç\1d/\8c\8eºcº\ 6}IâÎÀÄê6\12\8eÈËm\88+Ψ¥U\®f\§V²ëãÊónF\95\95\88Ée×o\87\95·\8aÃ\85wE\11\82î*IüÝÀ> \a\ 2¤áºæfh:­¸Ö¥¿óÝ°\99ê˧Ö\9a\13Ï.\9aþü\18\8dn\1fñ&Öõã(¥\9dÁé\ 5íáÜÌæè¢\94[\89¥ÔÆËÕ1õ¬Z²(§>D$h\f\16ÕÜ$\88\9a\e\83kîÕ\12+{*%\ 1\99ßK\ 3Gu\13\bÕå î¸ü×öS[\97\aÎo\9f{dª<5mq|ì\85½q÷¤««ø\91\17¾jÄ?\8e?\88gpzB9\8cÎ(\1eµ\83R\1cÓF/\ foeV\13[¸×\83\9a¯ÖâZªEþ-M¢\80Û]5¸\86¾rI@Ö.iÈÙ'\vå\a7Á­crk]:\9b_ß×SzöÜp÷Ø\9c\85æÀ\9c­që´\8bsí¤\a®d\1c\eÅ\1d\v¤§\8d\902h¿DäÄ\fÆ\17\86õÓ\8b\83û\98¥¸>n¹_¯ Ò§·ªÊ«W\åÝÓ[îÓ1(\94\ 4\A\1ax*²P£&\v­\87e\17\aµä¦~ûQaì¥Ñ\9eþ·æ\9awÞØ\185¼rr,\9bÅ`\v¦±¡ì)||òdh2e"\9a\191\9eÈ!>LÎÁ\8d¦\17ø\8e\9eÃ\ 5W1CB\ 1\86Àm¨Mà><\( àî\94\ 6\ 1ò¦¬W\95þØyPzæÑ¿dÆfµ·ö-\18ª´-\9b\9fhxomPñÎÁ\8eÿ\16\83á¼ñÃ1^\a\87Rç#¢£gã\12¦iI\84©\94\94\80IV\9aïD6Óë)/\ 3óD\98\89~R\9då:.Îr\1eï\92\bäî\90\86òÝÒЬ,õÇÐN©\a/T¤û\16´\14ÛV\r÷Ö­]Ð,[µÒãÿyÑâÊ
+Æ)uÅß\83ö\81ä\17»\1c\89'/RBHo\93Â\83þH\8dô\9fgÇø¾âÆy½äQ0³Å       èÙ
+ªëL=ÍùE\8bD\80·]
+DßI­ô(¡\1e\82ê]Ø+ÛòQë[ÑWý½¥_M\8e\16¬[èf­Û\e1ÖÝ-©ëþ\17c×C\ÿDa\88\9f)Þø5:6`5Í\1f»\92\89óù\90\13äµ\\88Ç,\15\13Ðï+\88®ïE$çEq\88$ ì\eÔrëVÔý\9f7£z\7fß\82jZÛ'W\vÚÛ\84pN%\17\8c4X`®E\a»3\14@\eD\82ß\85P Y\12 Ò&\10(öþ\90äà\v©NÞÀvö\ 4®\væ/\9e\9bûW\ 1Úm½ÜÝåË\r\8có\97F\ fI,ÕË£Fîý\ 3Õ9"\8f\12/*J×À~ù\12Ðú\96\vº?¤\81þ\ 1*\8\1c\r¶'CÁå\14\ 1|Ïà X\ f\vd}\1f\88\ 4\9a1\ 6RLÜ\81\ 6\9c\v®\90\ 2|s'\10Z8B\95¥\ 3\88¬$1Ú"\8bºÛ³   uó±\1cªò¯od®\82\9aü\15\94\ 2:;ãá\9cr8\98\1c \80\95\86\1f8\1eñ\ 2Ïã\18À\9dDC\88\96+Dê8Cü\8fN@;å\b)§/\ 2\1e²~²\83\9c\9fl¡ð\8c\r\bÏZC¥DîÝ\91A5ü"\83*{&#U\bÛd8p@>\19\ eý3\ 6Nl\v\ 1Ý]80Øã\ræ{Ñ`·ß\19ÜÔ\1cÀç \1dàÔm\81¤a\räCV\10\12\12\8eX@Ò\11s`\1c5\ 3æQd\98\1d3\85Üc&À?.\89Æn)TÙC\14*ï­\8c\14\e¶Ë$\81²\\14¨)\10à\88¢/ò]¸ÃÙ\1dN`¼Ë\ e,w[\83Ã\ f\16\80V6\ 3/\15SðW1\81 ½F@Úg\báû\f JU\1fâTÏC¢ª\1eÐ÷\9f\834\ 4û\80$\80¢"\ 31\87ä Bg\v$ê*A\8aÁ\ eH·P\81\f'\r`újAjÈ9H\8e7\ 5\r$d;A,\1f\rQ¥^ëäjì¿Cë\ 2>\11ÅAk\846Â*¾\8b¸\128\18òÞ\7f$l\ 1û(|Þg\8a<ã5\179åñjCÿoø_j@nE¬\86\1cDio\81\95 õü\ eÈ0W\81,\a\r`{k\ 1\93¨\a\8cX3 _¶\ 3\15ây\9eëÑBìç\88JÜZ\98\88°JºEZ  n\rû\80ï$/\ 5\ eF.\ 4\8cD¿Æ>\8e\99õy\1e;é5\e?î5\17³\11HøoCìI\ 5H>¥\b\1dÀ1S\ 1®½\ 6d{jC\16þ<°¢, 5É\11è\19\98uj\1eöS\9c h5ª<ä\ 3ù:y)´!j\91Ø\14»@¸Ky\134@\9dÇÝ¿4ã÷$iÂg\8a>æ3M\eö\9d\b$"\rqÈû\85\82¼ã\18:\8a\90yî;à\9a*C¾\9d\ 6äa´\81\8bÓ\87\15°¨.\7f1Ò½?'q\83þLà\87.Å\\8b|\17Q\15÷&¬\8eú\9a$NzE¸sùeP\7fê\vä\90OøýÊ\1aÅN¤\ fúM%÷úO_Ú\bP÷È@<Ò\90¨©\0éÈÖ»\82ì¬<\13eàÛh@!Z\aòý\r\80\ej\ 3Y\14·u&Ão5\85C\¢\15D.Ä\17S^GU$Í\85ß`Ì\90n1§\83ÛÙÏñý\9cß\ 2\1fpïû=à\ e\ 4\8c³»p\93©\1d\81\eù»\81\824\:¦\0\19ÈÆÉ9»\1dxÆÊ °V\a\81«\ e\14a\r¡\80\85\e\83Yˤ\a~Hg\87/$çÆÏ'\14Ñg£KÓ\7f'×d=\viäN\10Ûó\7f%\f\16\ e\a\f\15õáî\17t\ 6=ÌnÃ?e5\11&S7\ 24¤!\ 1\1fÝ\f\99HC\1e²³\8a\8c÷\80ÐJ\1d®9ë@\89\8fÑ\97«\ 4û\8f\ 5\91^Ë\Zð\ 2;=z\9e\91\9d4Cã1§â\84ÙO#ª
+\1e\86Ô\vFI­%ÃÄ>aOÐ\80ð\ e~¨¨9x,÷&i<³\9e4ÁÜ\bÐ\90Í\9b\80lÞËG6\ 3\aÙ8<dã\14\eí\812Kõÿ\10^\9fQMßk\0ÇC\ 4E±uÕ:N¯U¼b­{Óª\bnE\81D@.K¦\82\8c\0!l\12H0\11B\80L²É\9e\f\ 1\ 3A\11\89a\8f\12¹ÈÅV©×b9\95*xµZ¡õ¹ÿÓ{ßçÅçý÷üÆsÎ\ 3\1aìÞ?Ua^ïåWý^\8bS/OUæ&=/§ä\8cÓèÔ\87D\16s(KPÙ\97.\17\1aª¬¸F¹%ù\9eòvB§²1¡§ª.i\90\r3õ)£¥ö\0      iÈC\1a¨[\9c\81µs1\88\90\ 6¹çZÐ\9eÙ\ 4\ 6Ì\9e\ fú\10¯7\9a\18̯\8aäÈçÂ\8c\94ÇL"i¸\98Jï'3Ø\9dù\A{\96DÚJPË[𵪦´\16uC\8aUcÄu)t©ý"\15ÞÆV¤\8f\94Ù\ 3\ 5ÿo¸\81ìY\1c\92\1c\\ 6ª£kÀpúï\7fÖúîyWó\ f¯ic\14vR\93\105.MÃ\ fss
\18\95V¾[È\14\vª\1a³åʺL\83¦:ã\96Ö\90aÑ)ñVµ\8cÐ+\95f\ eñÄ\99ÃL{þjÈG\1aJ6;\ 3o\87\vT\1dX
+Ú£«¡æôƹ\ 6\9fÝo\1a.yMÕG`\9f\19âbF\15\ 3\82ÌB+\8bDo¥S9&j\99°®\90+3\10%*M®F«Ì¹©\97g·êE\99\16\9d »[ÆÏ\19äWæ>`Û\ 3\85H\ 3\11Ù7KÝ\16\0\1fù\9f
+¤Aï±\1aêNmüÝta×Ls ç¤)\1cû¤öJ\8cM\9d\8cï\92\10
+îòòè¦
+
+§¶\84.ÒQY2%Y¨®")u"b\8d\81\9fßbää¶\eØù]
+\16q@À$Ù8ö@á\9aÿ50\90\ 6áöE Ú¿\ 4ª\8f¬úØpÒõ\9dùü®\97­þ\9e\13æ0Ì¿\1ab¢ûõ\89øv9¾ Y\98C¯ã\14°uå7D\8a\92r\99\98V©®,\92é8d½\81I6\19\19\85÷\10\9dªRr¿¨\94<ĵ\aÈH\ 3 i(ß´\0ÄÛ\17\82\ 6\99×µG>ÿÃtrÃ\9b\1d/,Ø£O[C0\ fLÑÑ]5×Òî¨SI\rÒÌ\12=\9fÈV°¯\v\f\19¯\94«f\16Kt\f\9aÖXBk¨¦ÑîUS©\1dj\1aµOL£~WiÏ_\r\ 5\e\9d\80\89¼      é¶\85 Û÷  Ô\1f^9k>ñåÌ=ïí\93\9d\98#\8fÛ\83ý\ 6Í\91Q\96\9bq©Mz\1c±ZA(VIòXb>YÈå\94ÈÊ\99,uI\19r-\fµ\91Rz³º\90ÑV]@·j
+é½\92Bú ß\1e  \rdW'`#g!Ûæ\fƽ\9fÀ­Ã\9f½o=¾îUǹ­\13½\98C\ f;\82|{Z#"[o]M©¯IÊ×jñÅRE6\8b')\10\94\voT\15WV¨(\1c¾\8eÄV\18òX5Æ\1cÖ\9dê\1c¦U\93[Ñ+Í+\1fäÛ\ 3\94Õh(Úà\ 4\¤A±Õ\19jöº|l>´ümû±/^ô\9eýêé ï7¶îK>Ööð\88fs,ÎØ\90\90'¯N¥ñµY\15\15JdXÊ®KÉ\12\862_ÄÓf       dz\82ÀhÀ\vÌF<ߪ!ðz¥\19ÜA\81=P\844ÐÖ;A%r\1fê¯\17\9eEsw¾]úºÓkÍäÐ\99M?\f_pïï\ f8\7f·#,¼¾-:Ym¾\96+jÀQYµ\19åÅ\86<\1eYK\11çªèò\f\ 5G\9d*\97h\93ez}¢¼I\9f$·jp\92^i\8ax\90o\ f\G\1aJÖ9\82ÐÕ\11t[æ\83i\97ó»v÷O§ú=Wþ{ìÔú\7f\8ey\1fè´ù{7÷\86\84\1a­Q\89UmqY\9c\96d
\84/¥4ä°së
+\ 5\84\9ab)ÎÈR$\18Ī8\83V}ÅpKsÅØ©\8aÓô\89ãU\83\95ö\0u\15\1a\18_8\82t\83#TovúóöÎùÓÝ\a\16ý4â±tìÇã_ö\8f\9fÛ×6\8a=sÓ\16\1c¬ê\8b\88çw]É`X\12\v\8aÚÒ\8asïdU¤·\90¸ÉÍ4a|S\85$Ö$\92EÝÒÈ#L\8dòËM\9d²Èú\ 1aTí\10×\1e !\rLdN)ÖÏ\83\86Mó~kßêøóÐîùcãîK\ 6\9e\1f_o}vvoÓ8æ\94~,è\92x8<¶â»\984jÿµ¼¼\9e\94¢ô®Ì\92ä\ eby\9c\95Æ\89¾_QyÙ"\12\84Z4Â\90û\8d¢`k§0¤m\88\ez{\98i\ f\14\7f\8e\ 6Þ\1a4èþ\86þhÞ\80þµ×\15ýèÉ&Ç\81ç\a\97Ý\7fqܵyòÌÞê   ß\13²§\81\179OÂ"n|\1f\9d@\1c½F \8c¤ä'\ fgR®> Ý\88²Ñèá6fY°M\\11dÓ2\ 3m&VÀp73pp¤,°g\94n\ fÐW¢A²Ê\ 1êÖ8¼µ¬vx2¶\f5ðÜÍÉòêà\8a¦éc\e\8d/Oï\91O\9d÷äý\12p\81>\19\16Dþ962{"1>m"\1d\97øS^úÕgEYQÏ\18¹áϸÄ\90§Ò\82 \1fµä\80ñzÊÅñ6
+v|\98\82\98l\ f\94¯@\83j\85ÃGórÔè\80\vj`b\99Cû´Û\ 2Óoî+\ro=]«Þ\9cÚÅý\8f÷áÒ×þ§È3a¾93W\ 2Óg\92C\93§3"ã§\891±ÓÔ¸Èé²ká¯xI!/¥¸ )uJàTmªÿ\vs\1aöE7\1eóËC»\80¿Ô\ 1j?E\8dX\16¢z\87\16¢Úf\96£\e?l^¤\9fs_)\9dóØÀ\9e;±­xöÜþÂÙ\8b\1eÙ³a'Óf¯\9cK\9aÅùÄÍf`cf\89\ 1\91³ÔK\97çÊ\82Cgy!Á\1f$a\97~W\87\a¼¯\8e¸øÞ\14\89}g\89ô{×\17e\ f(]P£æù¨®\8e\ 5¨;#\vQ7ÿøl\9e\ 6¶¸\88aÿÊ
+8´\8e
+ÇÜòáì\ e\ 2`öá äÛx\88õ\88\85d¯( \9c¸\fy§B\81r&\18èg\83\80í\1d\b¢ó\ 1 ¸p\11ô>\18¨÷õ\83;~¾`ÅØó}\1d\1aÕÕê\84jéuBÕüà\8cRÂ*G!lu)\83ÝË)à¾6\e<קÀi·xðÝ\1a\rA;/CÔ\9ePHØ\17\fi\a\82 Ë=\10Hßø\ 3õ\10\16\18\871À=â\vb\ f\1fPz\\0ÃQohô<\a-^öô\98Ð(³Å\11e´ÍCUM-tàÁZ':¸-"Áö%\ 4ä,\12áÈÚX8±.\1cλ\ 6\81ÿ¦\0\bÛ\8c\85Ø-~\90øµ\ fà·^\80ìmç\81´ý\1c\ßq\16Jw\9e\ 1Ö®Ó Øu\12d»O\80~Ïq¨µË|\e\8d2ô P\92G(\14\v\16£\8ba­c>lpN\83¯\16Çý\97ýòêj2[\ 3°K\ 5\8e\ 5»8v\1cGE\ 1Å\82H\1d\1d\v"\1c\8a\84\1eBH\b)$$\81\10Ò{\ f$!\81H\91*(( \8cX°À\80¢.l\88"(Ê\b3öÁÃ{¾å¹9W\99?p.\9eëïY{ío¿ï\ 3\9bfF\81û\9c\9c\1f\ 4þ\v\ fÁ¡Å\a dI\0\1c\a±Ë}\0³Ü\eR\9c¼\80¼b/ÐWx"\ 3x\ fðWî\ 6éÊ] ^µ\13\f«<À²ú\9f¨¸\84|¿sÜ8ųqãø0}<\1dæNÀÃbû8øÁ!\ 2\9c§\1e\ 3\97\19\87ÀcV\0x}ï\v\ 1s¼àÐ<O86o7\84Íß    (G\ f\88\ e\89\vÜ\ 1·À\r\88\v]\81ºp\e0\17n\ 5ö"\17\10\ 2²\7f\ 4\bK'@22'0.\ e@t\9b\ 6é»gC\86ß\ 2È:â\ 4\99¨uÀÄm\81tÆvH\13z\ 2\ 3\ 4óÏ\80/9\bت#\80©;
+\89¿\1e\83\84Ë!\10Û\1a:\1aÝ\16þ        Õ\15ñ.òÉñ\91\88¾È7á\83¨\97¡ÃQý¡\7f¢lñ\7f\87ÿuXk\ fØÍ\ e@q\9d\ 6\8c\9d³\81å»\08\87\9d\80\1d¹\1e2±.À y\0\8dï\ 5\14µ?\10M¿\0¡è\bà*\83\0{&\ 40\ra\80¾\14ñ5¾5òsL\eêCTWôHä\93\98¡\88\17±¯Â\aã\9e\87\rÇõ\86\8dÄØ\ 2R\97L\0\1câ\80ßä\0´­S\81å1\e\v@pР       øáÎÀIÜ
+,Ê.`fû@ºü\0¤\19\ 2\81h\r\86\94²°1\MäפúèÑÄ\8b±_\12®Å¿\8fmC\8fDwaÞ z°\ 3Çû\93\aq\ f"Þ&Þ\8f\18\ 2\88\88\ 3\1eqHÝè\0\8c-S\81³c\16\bö9\82ø\80\13\88C\9dA\10¿\r8Ä=ÀÊô\a¦ä0¤ë\83\81\92\1fñobIÔßøª¸ÏÉu\89\1f1MØ÷諸\91¸6Â\9bè.b?ê)©'¢\9f|?âUjGä\1fÉí\91o±¶\0Òâ  \90²Æ\1eÈ?N\86ÌÍS\81¿}\16\1cA¾ß   äÁΠ\89u\ 5AÊ^à0ö\ 3Kpt\8c©\ eÿJË\8bþB.B\7f$T`ßáΤü\99ÔH\1a\9cö&¾\8d6\10s\8fÞ\83zÊì:ÞÇhG\r¤µF½&\\8b\1aÂÛ\ 2È\88\ 3\ 1qHCöY6Ò\9b\99 ÷t\ 4u\80\13h\826\80\r¤Éû@@ýe\94à       ùÌ\92G}¤ç ß¥\15àG\88¥¤?ðÕ´7ØóÌW\89\81\84öì§1ÝÜۨǼ\9bQ½¬«Ñ}ôæØWä\8b±\83D[ü×aµ=¤¯\9f\8c<·S@æ6\13Ô{æ\83Þ\7f\ 4n\0]¤û\98
+ãý·\94\83\80\15þW¶(þm\86\ 6ÿ\9aj¢¼$\162_à+ØÏ\92jù=è\vâ\87ñ7ewbîʯÇt\8b[b\1fs\9bâ{3ë\13úiç\12\ 6Òl\ 1\94E\13 \15q`®\9d\ 4B¤õ\94®3@¿{\1e\18ý\96CÞag0\86»\7fÉIðy¯&\ 4\ eK\19¨×<^R\7f¦\8cÜKÓe<"\9aywqE\92Τ*y{b½òVâeÕuômusü]E\ 3ú\81¨.ñIv\ræ9óTÒ\8bt[@\1aâ@\m\a¬5\93@¼á;Р­gØ5\ f,¾ËÀzÐy´ ÔýC^¬ïp..è\95\92\1aó\ÈJy\98%`Ü¡+8í\94\1cÑ\8dÔ|ÙU|©ª%ù´¦\19Û¤»\80½¥;\87éÔ\9eÆÞ\93U&?â\97âzY'qÏ\99¶øæ@Ze\al¤yeHëé·N\aóι`õ^:V|`ý§â\10÷\91\13Ñ~\83yIÁÏ´Äøn)\83ÔÁã0o°$ÜËt\8d¸9ͤh$\15jê     \95úº\94ú\9cÓ)Wr+qí¹e)]ÊbB·È\9aÚ\93]\90Ú˲\ 5P\11\a2âÀAzSéì\0\ 6¤õ
+<æ@ñ¾%£eû×½+\ fr\1f*\8dôë³¢C\1e\1a\1d*\1a©U\9c\95q\89+äýÊRHÎÒs\94§©ùÚ*riN9é\8cá$±ÙXD¼e´\92:5\16ò}©\89ò\98k¤ô°m\ 14d¯O[i\aü\1fìA\8dÜK\13òF\14îø\1e\16\7f®úyíHu ÛËÊ\b¿\9eâ¸\7fÝ6ã\12®ë(¤ßäÌ\8c\ 6\11\97\91J«X\1aU\19ä+N/2X©§L\96´Æ<3õf\9e\81Ú¡Ï¡Ý\95ëh\8føZÚ\13\8e-¾9Ð\90Î\13"\ eZÄÁ²y
+\94ì\98=VáµèCMÀ\9a¡³\87]ûjÂ|»ËbCÚ¬Ø\84\16#\91ب¡3kel^¥P$-á*UÖ¬\½9Ãj40Êóô\8csf-ã\9aEÍhÏU1»\94
\ 3¡\82ù\98g\vHG\1cè+ì@\8c _7    Y\7f¦@éöY£Õ{\17þUç¿z°áÐÖ§u¡>wª¢\83[\8b\17,\ 4b]\ e\95Y¥Êä\95HùÒ\ 2¡Leäéôúl\8bQ\9duÒ¬`ÕZdY-\16IV\9bQ¾£\16gu\8bDY\8fø¶@\1cÆ\ 3\ 3é<    â\90\8bü\9f\85\9b¾\83
\99_Îx:\ e\9f÷[9pá Ë£ó!Þí5QÁ-eè¸ó'ð©Õ&
+ã¤\9eÉ-Pq$F\99\15
+\81É(á\15\9b\85Ü\9a|\1e·9\9fÇ»eâñnkx¼n1\97ûP`\v #\8d\95±|"È\9cìÀ\84Ì\8dâ\9f\1cà\94Ûô\8fçöÌ\1fjò]Ñwéà¦{MÁû®×E\1e»P\99\10[[\92L(Ï'1¬F:רgK´j¡J®PêER\83\91+.4³Å§ò3ÅM\b7óXâN-Kt_Â\12>\10Úâ\9b\ 3kéDP"ga^c\a¥\e'\8f\9dq\9dö®q÷ÜÁK>Ë\9e^=ðSgs\90×\95úãGÏ×ÄÅ\9c*OJ)*J¥çåS9ZS¦X\9eËW
+tr]¶:Ç\90¡,È£+*,4EC>UuÓ\9c®ìÐ¥ËïKÓeÝ"[\0\ 3q`/\99\bjä,
+\90·ªâÇI£g·M\19¹¸kö@«÷â\877\ 26Þº|tïŦðÀÚ³1Ñ¥Õ\18|~y
+M_LaË­L\91ÀÂQ°M\12-àͥæXL$}\999U\7fÎBȹn&ê;t$í=)YÓ-²\ 50\1dÇ\ 3\17\99\19ºe\13 pÕD¨Þ`ÿ©ÑÅaè\8aÇ\8cç¿{9výî¿áZk gÃoaGª\1a£Q\85uèdC\r\8eª¬ g       Ké\ 2v1[F?!RS
+Ôz\82ÅdH¶\9c4%Yêò0ùÿa¾Nÿ©Îû8\8eÿ\8eý¢\98²u\89©)¦H  \91­dß9\84s\1cç8\e\1c\9c\1c[ölI\83JÅ´\u]Iã\9a\9a¢G£1\ f´h\99h\92êjs´P²\84+]\ eÕ¼¯ß\\7fÀ¹}ÝxÞþ¾nü~\8fÇçÝsDrü^½ôûG{¥\8d\8f«TA\ 1ÙPIþ\e\rä=uzµ:Ú¬5>tÛk¿½ã¢7øØͤ﾿Mw/ukÛ\rzDs7\9bu´#)yÿÏ)òª6YAÉO9e;Ï\16í\91·TÖ¦þP{@Üüý!AsS\ 3¿¹µ\91wæZCRsÿ\ 1Á?\1eU\vO>©R\ 5\85¦j¨&;\8e\9a«á\9fߨ}ºü­úäM[\8d¡\87öZ\ 3
+W£\e\8f}×^î\ fwÿ±76ôÄM\16ãàU¾°ºK,ÛÕ\91\96»³=«8ãRA\85ôbyµ¨­¦\96ßÚ°\9fsáÔ\81\84Ö\võÌÖ«õ        ­\ 3\1f\9fTqZ\9e\82"²¡ÎD\r'Í(¸`A\99í^IyÝ¿\9220d«uû\95»Qç\90¯Uë\93P\97¦\81è Æßãi5w¸ü²["I^OjfƵÌ<É\95ü\12awY9¯«¦*¡³¡\9aÑyê;zç\85\1aZ×Õïè]ÿª\8ek\7f^\1ewi°T\15\94\90ï\1f4¢ Ù\84ò¥Ý\94xwg    10dB¹õÖV»ó\8d»IÛ°¯Õ\99\97!NG\a£|÷=\89\8bªxÈaå\ f\b\ 4ò~iªäw¹\p7?\97ÛW^Àì­)\8eëm,\8dím*\8bîm+ßÞw\9d4XºýÆ\8bÂèk/\vTA¥!\ 5G\97Rpn   ñôª.qï¾.qst\19å×  [ÝÖq\ fÓ3c>VÇF\ 3\1d÷¿¡nÛ=\1c\17\8a\13\9dõRÄL{\91Æ\13\re\8bø\8a"I\82bw:C±/\83¦8\92\19­hÎ\8e\1aº\98C\1dº\9e\13ñB\91\13ñh$3bà­\\15Ô\1aPpJ\9fxÖ®Côõü\85èy¨Kü2c¦~þßë\17\9d\9eq_vdÚËrßT\80]åûp·Â÷t\9fìInpú¤\98\9a<!\8bI\9aÈ\8dãN\940Y\13\8c\89\ 3\Úä1~ÌdsRÔd\9b ò}·0bê\81(|ü\8d(ltT%4ê\11\83ç4\88Þ_µ\88+·µ\89ögºÄY¥¹Æ)¥ÝâF¥«i­Òó\9br¥¿M¾2Ì!s\8eæ\9a:Çñ\14Ï\89}\12\95²\0®27\98¥,  e(«"èÊý\91±óG¢¶Ï7EG.ü\14C]è\88\r\8d\16öé5-ôÓ;\95F\9a\bâîE\r¢«K\93¸xW\8bh\19_L9\81\15Z\87a·x/\9c\8dwa\8bE\ e|-Ó\11j\93\8ch»$$8r!ÜÌB\9a+\ 3Y\1et\14n\8dE\85çvÔxEâ°7\15'|Âñ\83_\18ÚüBÐé\1f\8c{\ 1Ax®Rÿ9\82躬N´ö¨\13Í\ f5\89£_\fÔê±J«
\16\15Âai&Ü\96Iàm\91\84 UlDZ1ÀXK\ e»uäÈZO\8e\1d;rpl\8c@±}\18v;\84 nS0\1a\9c\ 2qÒ)\0-ÎþhÛì\8b.\17_ô¨t¥\8d Z;Õ\88¦^
+Ñ8¨NÔa©Z\ 5Vhæa\8d®\f\eôEp6äb«)\ 3þf1\b³\88\8ap°V\86 qU\10RV\a@fé\8f\1c+_\14\83\8a5^¨Y»\r\87Özâ¸õ\164[{à¼\8d\a.ªÔÖN!\9an\10Äá\87\ 4Q=¥A)\83¡Z6Ì4¤X¥\9d\b\e=&\1côcàº\84
+/Ã\10\ 4\1a\a"ÂÔ\ f±Ë¼Áüë6pͶBhæ\ 1érwr,¹"×Ü\ 5Å\16ÎØmá\84Ú¯7áð×\ e8±Â\ 1§T:ÝM¾\7f\97 ª\14\ 4Q\ 4m\8a\1c\89a¬Î\86¹&\r\96:TØê\ 6Ãq\91\1fÜõ½àe°\ 5\ 1_¹!l\89\v¢\968\83¶t\13\98\86\ eà\1aÚC`d\87\14£\r\90\19¯G¶±-
+\8cmPjb\8djR\8dJ\10¬T\a×F\13\G\1d\88\9dõ\90ºÅ\02\7fcdD\9a##a5Ò¥ÖHÍß\88\94*'\88\ f¹Bxr\v\ 4\90Øê\rþe_p¯ú\83s+\0        }\81`>\bF¼"äSÜpè\1c},t\966\156\1dû!l"F©ÒÿM\ 3\8flàÛë ÅI\ fé\1e\ 6Èð3Ff\849²X«\91!±AúN{H+\9d\91\ eñß<!:ã\rÁy?$¶\a\80ß\1d\ 4îÍ`°{CÁ\1a\bûÌT\84Ï3\86#>Æ\8dQgèS\91\93´ÙÈw´yª*\10\92w\ 3\9flHÚ¨\83TG=ÈÝ\f\90íc\8cÜpsìdX"[´\ eò,GÈÊ\\91Zç  É\11\1f$7\ 5@t6\18ÂK¡Hê\f\a¿\87
\9d¨/ìûÑó¬Á\98ÙøáØiÆ\18m\9c>M\7fKÿH{\1d·\10­
+D\7f6XkB´A\e2\a]d»\18 ÏÛ\18\ 5¡æ(¤["O@~b\19N\90\17{@¶×\ei\87\ 3 9\19\82ä\96\b\88Z£ ì\88FÒõØ?x¿Ñç9ý\8c\8f   Ï\99ÓÌaÖ\18c<áMÜ\fû\15ãcüóøy\9a*\10\93·K"Ù\90²^\erò¦ÎÛ¬\8f"/c\94\ 4\9bcW\8c\15\8aø\e\90\97î\8c\9cü­È¬ò\83¬>\ 4iÇ©\90\9c\8eFò9ú\17ÑÏñ\9f\ 5ݬ\85ÄÛ\9c\8fÜ{¼é\84çü1æHÒHü\84\98æ?\8e\9fåô³\94ñªü¯!i­&R×i#g\83.\8a\9cõQêi\84ò@sTn·B\19Ç\ eÅ\12\17äçz!§<è\ fy\1dõ\93¬1v>õï\feJ\vû?¢VÞ¬ #éCb\8fh\9aw/e\8c=(}Íz\9bú,~L:À\9c\12õ%|H¼Å\9e\82d²A@6ÈÈ}\93GnÞR§Å¨Üj\84=\ 1˱\97j\85*\96\1dÊÅn_J2}\17ò\8bÃærªcf3\ e2gÒ\8eñ¦$MÂIñÙ\94qÁ¥´Q~÷\8e7ÜÞÌ×\9c¡ìGÌá\9c» ïvÜfOJ¯s¦E]¼Y¾*H±P\87\90¼éåk´P´N\a\95äæÝëa\88Z¿åØ\17n\85ZÆÆÏÕ\ 2we\85ÌÿCI~äT~%c"«\8e7*k\10\8fHN¤¿\14\9dÉT$\9eßù\8c÷KácîÍ¢\aܧEwØ/\v¯sG²»xïvtð'¥\97\12g\84ª@B6$\93\7fù®Ï°&Ï5\ eàoÂTÜÚ#¢G­¢\1eÛ:«â\0i)E¦\f\91e\ 4d\93Á\bY\84\84$oH\ 2         IØ\84\19Â\1e\ 1¡ld)C@+R\ f\ 1\11\15\11\10´­\ 5´§Ç>}/¿Ã\87ßçç\7f½Ï}¿×ó§\1eÖ\ 50Ò7\85\95\ 6\92\7f0\ 2iöÆ\9fRÝO~\90ù\99¾O$Ø,òi®³,\8eÏK\9a0ô)QN|BÈ¢\8d`\95\8c\aÁ\15¬Á zÎ@`\a·/àA\\97ÿ$·%à%£!è5åvð\9bÈê\90_±k\ 1\ 4ä]\8f\ 1t\ 4\ f¹\ f   Ò7S.l\ 5\19\16»\80ÂÖø£Âõäût\1f³\ 59ÖnF\18åñ\ff\ 4üÂà\85\88É÷\89©ôÞ°\9cØ\1e|\11Ü\81Uǵ\876ó[Bú\ 4\8d\82Ú\90g\9cªÐiz\19n\8eT\8c[$\14ãß®ês\86°\83Ú\80\89ôÍx¤oÊ\90ÝÈ8¿\ 5d\7fgøW\9eÍÁ¥\ 2\97\13os0f3iAö\93\92p¯Ç\ 2\10\87\13Ö\e\93@é¢ÊbÚ¢2ÙM\11\ 5q?\85\95\vn\13ê\13Ôø.a\15~DX\8a\7fÊ+"¼\88U\86ÍPóÂ\17\ 2Â\90\f\91\a´\ 1\vé\9b"d&R\90¾©0Ù\fòÍw~T]ùò·\12ÇãsJ/³)\85¿Ãh
+Þk0\91\1cx\97Ï\f¿ÃæQ\9a\18bF\1d-\95£&çð*\88E    ¥\91jQQDkbaÄ 8?R\13\9f\139ÅQ\10_Ñ3£æ\89k\ 1ỵ@\14Òó`\84\ 4\99\89ôãú ïܦOªË_,\95Zí_¬t86]âaªÉ¿e?\9c\81õ¼'#\ 6\8bèa\r<\98RÃN`V0epIt&¿\90ª\14æ\91+ÄÙ¤FI\16©7)\83üD\94F\99ä¦P^2\92)³$9enUH\ 64 ïÓ\ 6q\bé!\1d\90uL\1f(Ïnø_©Ù\8eß+\7fÜ;WcÿõT\85û¥\11\95\8f]\7fv\88gGjx@c\125¬FÈ¢\94óøL\15G\ 2çŦ     \141¹¢ôèRI
+­.INë\96Êè¿\88\93è\13< ýE¬\98þ\9a²\16\10\81d  ÿ\bþ^m\90\8cdÈùF\ f\14\9d1øPaºí]í\ f{fêí\8e\8e«¯_\1c.õ¶íÎ\ fòhÎ"\ 4Ô&\93ÃÊ%\f\90ËÌå\8bàL8Y\90ÂV\88¤±E\121³F*dÞ\91      Y\8f\93\12\ 5ñ±S,Aì\fu-\9f\90ý\8cGr¤\1ak\83ü¯uAééõKê\8b[\17~²0zÑd{d´îÚ\85þ
+\8cÍ\1dU\80{}.ο2\83HP%G\93s%\1cF\86(\1e\96\v¤\ 21/S\94ÀUJøpµ\8c\v·É`î\ 3\19\97«\89\87á)\ e\f¿\8aFÐV\ 3"\8dÐ\80\8eÌ¥\10É\91\8eì\87ò¨Îÿ+O­û½îÂæ¹\96ïvN¶Y\1fzØàr¾G}ú¹ÔÏM­Äú\95dGàóÒ©ä\8cäX\86\87\13Å\12\81@\98.âÆçKX\82
+\19CÐ,\8b\11\fÊ\18ñc    LÁ3\98É\7fEGD¯æs\ 6\86\91\16\10#9²\ eh\81¢ÿhÿ©>¡÷®Édë\ eó\1dc\9dVÆ÷[\9cL:ê<¯ÔWÞº^^\1cr«  \f\97\99M&É3\181\89©\\ e_.âs¤)"\86$WB\13\97I)\89\r2\92¸_F\91\8c     ©\89\930U8M_\v "\19X»Ð         ¹\93\1cä=SvXk¥î\98Î\9bö³ë\9e÷\9an\19¹kyð^»ãÙ\96F\ f+u­\8fkQE\90ov1\ 1\9b¢\8c\8aJÌ¥Óù
+\ e\9b\9d\91À£§É\13È)
+11¹8)<¹^JH¹'\8dH\1d\13FÈ'¹\91Òé\98µ\80(ä|x'\1aÈ\91,ùûРÊ\18ý¾é+í×=§t'\86În\1eê·ø²³ÛáL}\9b\9beY\83·K^m\80wZ%.DR\16\19É/¢ÑXJVlt¾\80KÊI\8a\ fÏÎ\14á\14*q\88â¶$XÑ-       Í\19\13b3'a\ÚtÌZ\0   ÉÀû\ 2\rÒ\f\91Þ¹\aõ×íý¨·\1d\87Ð/\86¾Ò\1a}tzcßÐ÷ûZúìOUw¹Z\14¶a\9c2\eý0ҺРAMx\18»\8aB\8e.gÆD\95Ʊ    Åb^HQz| ªP觪\11ùªºD~Å\9ax\7få3N`î4}-\80b\88\ 6     ÛQ ë_(Pf\88ZiÚ\8d\9aí3BMhö \86\9f\9c\1c1ÿwý°í\89Ò~\17ó\9c\1e/\ayÇ-\8f\84Ö`?v\13\ 1\17Ý@\8a$ÖÅPñµ\FpM"ÛO\9dÆõ®.àcªÕ\ 2/u\87àFÍxÜÍÊç,ï\92\19ÚZ\0\1dù\ 6\92m(\90·\1d\ 25Û¡_;·@\9aÑ\rÐ\83©=¨»\93'Ö5kÌ\8cª\1e[\7fSðÐéRê \87\8d¨ÏÇ\15¾\eè\1dÝ\8d\ f"v\12ñ¸;tbP;L¹Õ*¢cZS\99\9e-\ 5\165ûzk\aûz\9b\86åÖ4M÷¸=KF\90V\ 3ØÈù)[ P¼\19\9an2\80Fz×CCÿ5\80z¦÷¢\9b_\9eZ¯~nf¨\9a´:\92©¹j"\1eu³ä>ºéH\7f\18àA\1cÆúà\ 6\89\81\81÷£±¾\ 3\8d\ 1\11ѽ?\8dìÚ¯¤ºô«iÎ\ 3\9d4§û\13TçÞ¹(\97Î\85p\97\8eÅU\ 1Á&\14Pl\84¦ªõ \9fÛô¡¾\ 1}¨kÂ\0j\9cÛ¯U5{j£êµÙ®ÌW\96\87%/í¿\8d{îz9æ\19æJÔ¤¿#î)Ö-p\9c\88ñ\1d§ûÞÐp\ 3Ü5\89Á×4éX'M!þª¦\96à0ÞM°\9fx\8aw\18[Ä^}ø[ðZ@\92\ 14¯Ò\86\1eÕëB÷:t¡¶a}¨~~\13ªüÝ\ 1\1då»o7¥¿½´K¼haÌ]°9\1eóæÚ¹¨yÌeü|\80eð<ÞÆo\8eäà=Çpö\9a㹺ÍIÜ®Ígx:Ï\17z]\9d¯Á8¼¹\83±_\18¹i÷fþ¦íô\1f\98µü\99©\ 5\8dV¢¡{\8dÚPs\8f\ eT3¢\ f\95¬lEå.\eë¦.\9fÞ$\¾¸\93³üý~Ú²õ\91\88e§ãØ%¯3\81Kþç}\97p¦7\97\9eË\f\v÷å8K×e±\95óJºµãJ\81­ÃJ¥\9dÝ\87f{Û\ fý\ e6\1f\9f;X\7fø\ 3±´ªñB\bê«ECM­ZPÕ\806T¨Ñ\83²>í@Ë?\1dÑ\13ü}b#óo\93\1d$`¾\e\ f®ì\ f\ 2W\ fù\ 2÷£\18à{Ì\13\84\9etC
+É5@;ã\fØç\1cA\82\89\ 3\90\ 3Ù\17m@ñ%kPkj\ 5ÚÍ~\ 4Cf\96àõeK0»ªÁJ\bjn@A\95Ý((ÿg4\94\aI\80á?|\97kXÌy\eÇ\a\15I*§xè \87¢$%\9dÏçRt\9aæÔ\1c\9af\9a\99f¦fjj\9a¦3\15Q*jS$¬b\85°\8e­ÇéZ\«ua÷bí®­'¤\84q\98(Õ÷ùïîëñâóúþ\×}ÿîßý\9d\ 5Ë\rTp0ÊÄzS\ 1¼çs\10¼\88\8e(\v2â­ãA·Ù\fîòh¤¯\8cB\96m\ 4T«Â\89c4\14Ûí\83±Û!\10û×\ 4 ÝÑ\1f]\8e~è^ë\8b\1e§¯q¹\8bD:ÞM"µÞ!\91ê\7f#\91\8d\eM)\86ùÔ\1c\8bag\98
+'ãd¸\9b\7fn,Â\16D#fa$È\8bÂÀøO0¸K\ 2!´ðG¦¥\1f\94\96>(¶òB¥µ'j\97º£ÙÆ\r\87m6 s\99+.\10\ÔIç9¢þM\12©î\ 1\89´¥\8fD*\80ñ\149æN\15\1e\vË\f(°7\8c\85\8bÑFx\1a\87!À$\báfþ\88\99ã\83\84¹^ Íó\0k\9e\exó]\91¾À\ 5ò\ 5ë 2_K,\7fGT-t@ýB{´,Z\8dö¯Òö_¢þ]¢þ\1f$\92ò\13\89$ÅÌ)\\98N¥aþ´8XèE\11=       \85Ã\8c\0¸\18zÃs¦\aü\8d\\11\19\91ÆNØlì\88\84Ù\ e Î^\r¦\89\1dRMVBd²\ 22ÓeP\9aÚ ØÌ\1a\95fV¨ý*`\10ÿuÒ\1a}P\¦\83µÁ\10\\1fcðBç\80¿Ù\1c\12¤JmÀQÛ\82µÝ\1eÌ\ 6G0ÚÖ\81\ 5´Ó® ^Ú\0Ê\r7Pz<\90ôØ\ 3ä^O$¾ðB°7âßy\8fÇi}>Ç\8dúhc'|>ÄB'ÿ:8è\83æ<\1d\1cWCð¼\8d\91\162\a\82\100,À\97Ø\80\9bo\a\ 3X»×\82Ùê\8c䣮 w¹\81\1d´k\9e þä\ 5ʯÞHúË\aä\17¾H|å;\91 ñ\e\8d×ú\8dÄ\8dú\7f\88\9bð×ÄÁW\17H^:\r\14Â\81á4\1d©.\86\10x\1a#=h\ eÄ1æ\10Ó, \12-G\9ar\15R·:"¥Ö\19\9c\96\r`\1dq\aó\84'\92Ïy\83\17ôÛ~ =\b\0õÏ@$=\ f\9a \ f\ 5\8f&j\82µ      Ú\90w     c!o\12&\83\87\13\10¨\v0    \a*áÀr4\0ßÙ\10b÷YÈ\b0CÆFsÈ\92,!M[\81t\85=\ 4¥NàU»"µÉ\ 3)\87¼ÁþÎ\17¬3\ 1`^\ eDòÍ`0~\ e\ 5í\8f°Iê³ð±¤¡\b-Y\13©I\1c\89|\9d8\169H\9e\f\e #D\17ÿ:Øë#e\8d\ 1DN3\90±a\16äþfÈ\8e\\bE¢%ä©+\91!_\ 3q\91\v\84Uîà7x\83\1fÜ\8e pN\85\82}!\1cÌk\91Hþ)
+\8c'Ñc´þ\18-uh\93&éÝæWä\91Ø\81¤/1Ï(\88ê£"B\17`\11÷\e\8d\11÷´\84È7Y®³\90ëk\ 6e¸9òâ¬\90˶E¶Ô\11\99ù®\90TxAT\17\80´æ\10ð\ eGLr\8fo\9cà\9c\8dùÂî\8e\1d\18?\9aüK¢\96ÞO~K\e¢\fRÞS\9fS?\91{i_â\7f§cÓ#:¢u\ 1\90¼J\1f\82U\ 6\90ÙO\87ÒÅ\bjoS\14\84\9a£p³\15
+\92í\90'r\82\1d²R¿qÉÎ\901QcÔç´ÖM#¼öø\8f)'É\1fØ\17¨ïX×\18\9aä\1eækF/û%m\98ÓG{Ï~B\1f¡?d\8c%ÝK\9e\88¿ËD¬.À±\9a\ 6¶­\1e±võ¡X5\1dêu3Qâi\8a²`sl\89¶B\19Õ\ eE|çq\95Üë³¢0H+«\8cz/©\8b}+ÜK~Í?H\1fâ\1ec½d\9fæ¾`vó\9f1n\vûèOÒÿ¤\r¥?dhø=L-ç6k\94q\93=N¹Æ\99\ 5R\b\aî
+=d,×G\9e\9d\ 1J\9cfb«\87 *\ 3\17`[\94\91íƶ¦¸h\8b¥>\1aU^Ø°¢ló`æ\ eÊóô=Ì>þ¾Ô§ÜÃÂßÙ\9d\92G¬ó\19¿0odÞg>\90õ$\ fÈn±Þ¤_ç¼ç_I\19á\â\8e2ÎsÇ)º\0\97\13ÙFn£\87\ 2[\ 3lu4Äv·ÙØé?\1f5\11\96c5ñv\1fw°Ö¿)\17ù\r\16eGõ+\v\13\9fÊË\99\8f%5¼\87¢oD÷Ò\ eHîò:2ïp»²~Léξɹ£¸ÆéÍéæ\ eÉΧ¾\15\9då}à\9dâ\8f°O¤\8d2t\ 1.\91ñ\ 4Kõ °ÖC  \91\11\99·\86\98Ë:ßyã»Ã,´\r\9bìÞÔÒ×\ f\ 3z·dÄüV\90\9f[ʾ\9bµ=íVF½ø¦¸9óªðPÖ\ fiÇs.ñÏ)/ð®ç\9dãý\9aw\9aÿ"ç\84`8ã\98P#ì\10\1e\11}bé\ 2©\84C:1\97J"ón!ú±\93ȼõë\8dÐè=çsSÈbMs´íËFêú¾])\81\8f\89c~.SPn\17\14rn(Ë\ 5W²«%\173\eäç¤û\15§ÅíÊ\93¢®üNá\ fêcÂ\9e\82\ eQ¿ê[ñ ü øµø\80ä=\7f¿T\9b¢\vð,¦BBxä\13\82èÉ®Õ\ 6ht\9e9Ñâeú±5hÑp[Ô\8aþ\16²Ë\93\ 6vÀ½jaÌ­J9åj©\8as© Tð}Þvi\97¢.ë¸|oîÑÌCª#Òã\ 5\87$\17
+Û$·\8aZ¥½\85-\99\ 3\8a½\99¯2\9ad\1aA£ìCª.þqÈ ê\17þ\9d{\89\99¨'Þió:ÃÑ\ 3\1e&\9aC\ 1\v\a\8eD,{Ú\96°îÁ^¦ÿíú´è«;2(\17+r9gJ\8b\ 4'
+*¤GUÕY\87s\e\94\a²[ó÷eu\14î\95\9d-þFv½¤Aþ¸dOöse}ö\90¬Nñ6½Vñ\9e¯\vð      \aÙâi(&ØAìÌ\ 6;}ì_;cä°\9bñp\87ßüþï­\1f\1f\89sº»\9fá\7f£\91\17}¹V\92t¦*\9bÓY®\16´\97\96I\ f\16Veï˯W6嵨÷ä~[T\97sªd\97âJiuÎýÒje¿j§òeÖ\ eåkq\95ò\9d@\17H[2\15YDÖ,%¨!æ¢i¥ÞäAG\83\ f\1d®F\83\9d>sÿ:\19jùàhìÚ[\ai~W\9a¹\e¿ß#J:Q#g·Wå Ú*J¤-e\95Ù\8dÅ»\94u\ 5MêjõÁâ*Ugi¥êrY\85ª§¬Bý?u\85z@Q®\1e\96\96«5B]üã ø;s\12Ôý\9fîú\8ak:Ëâ\0~\93\10#-\82\80  £4)ÒA)¢Ô¡¦\10Z\88        ¡I      -\18¤\b\12\ 2\81¡
+\ 3\88 \b\ 2*H\17DP\8a¢\14\ 5]\1d@?\ e«®\8eÀ8*£ ~ÆYѳÿÝ}ÎÃ÷s\1fÏï\9es\1fîÁvÞ:\1dÂ×\v{\88\1f:,¥\97\14þÙç²ý~'ÍøöÅ \ 3×\1aB½zj£\ 3Z«øÜƲԨ3ÅY       Õ\ 5ù\82ò¼\13i%9Õ\99\ 5Ùç²ÅÂö\1c\91p0W(\9c\16\8bD/\8f\8bDË)¢ì·\89ÙÙïy\92@4\96!M\15\ f?a{g\156\97\ 6\97K\ 6Rï.\9b\91~\e°\91\7f4à¤q·\87j4Ú\16h\7f¥\99ëÙ^\1fåß\\93À­«:\1aY]\9e\19_^\9a+(.*NË/¨Ê\14å×g\1f\17·æd\88ûÅéâ)ñ±ü\17Â\8c¼åÔ\8c¼·ü\fñ\9f±\92@\8c:\1e\8emÁC\11\96ã\14\96§y\17þSçnÂë~câó\11+\99\87×\1dÔǯxï¹Þ\15`×Ý\1aìq±é°_ýÙ8ΩZAdùÉô¸¢
\91¼òÂTaiEfFñ\19ajÑÅ\9cä¾Ü#Eã¹É%/\84ÉÅKiG\vß$¥\14¬ÄI\ 2±Ø;8®\8c\87Ò-88½\r\a\17wà>\ÖÂ/\ eé\13~½e*=3rpëÍAO\83þ^?Û¶\ e¶[cK8£¶\99Çþ¹!)¢èLj¬¸F\98\94U\9d\9f\92^Y\96\91\Q\9bÅ/?/\8a/¿\9c\13[>\96\13_ñL\98ðóRZbÙ\9b\89\958I \ 1\9bÁ\7f÷Þr\15\1cԫ⾶oý\eØ\81{q{\17nvÒhãä\98½Úõa\ f½î\ 1\86õ\85^\96k]g¨Oå¥hVñ\85Ä0qÓÑ\98¬\86ÌÄ´³âdÁ\99Òô\84ÚêL^M\930êTWöá\9a\e¢ÃµO\84Ñ5Ki1Õo\92xU+q\92@\126\87\E\1cT)á I\19}îQFË£Êè×{*èÞ´!éæ¤Ý\96þ17ݶa\9f½\r\83Lçê¾\10jiO$3¯#>$«M\10\95Úr,îÈ\85\9c#qÍÅ)ÑMUé\11\8dç2CÎu\1eç6\8ed\ 5\1f\ fm\N    ;û\96\1f~æÏ8I \19«ý\93\ 2\ ej\14Ð÷\16\ 5ôû\80<z<!\8b\1e>TD\13\ fô\88×fl\94»¦\µ\9aoÓ,jo\ 4:\94\r\ 5\ fFøeõDzS{\93Â\93zÒbb»²ã#;\v\8f\84¶W\1eå´×§\1djëH\ fj\1fNgv̦³Ú_\vØ-ï\128çßó$\81\a%d\ 4õòèi×F4;$\8dîÝ\91FS\8fÉhä\91\8eTïì^Å\96\7f8í¬\9bö6©\98òÛ_p\9bí&\1c\v£§\8eÆ\ 4ò\87ùÁ¼¡ÔðÃ×\84Ñ!\83\ 5\81\8aDæÕú$ÿ«í\ 2ß\81!\ 1c`Và7ð61 ÷=/°{5J\12\10\92qP)\8b^^ ¢Ù>\12º;JB·f6¢ágdtå\99\16¡mÁB¾á±\83\9c§AÑCƾìû,Ç´\99POþÝh\1fÞ\9dÄÀ\88É\146wB\18Â\9a(\88\b\18¯\88ò\1d¯\8f¡\8fwðhãñÔ\899\1emb%\9a~óc\84ÏÈçPI _\ 6}8-\85æÛ¤Ð\9d«\eÐè\18\11\r<\90F=¯\14Që+\1d©\86߬äO¾8°µø¹»\8eè)Ý4m\81\7fÂu\8ay\1cå\11þ(\81\16<\9fâ\e4'\fô\9f+d1æ*9´¹s\Ê\g\88×üh\88ç£'ع\12ìýË_lï{\7f³$\812\ 2ZhBhº\9b\80F®I¡+\93DÔ>/\8dοQÆÕý¡·¡ò\ fKrák{5áï.\9a©ËT\83Äå@ó\98%®uøR\94=w1Ñ\89µ\98ê\1a°\98íá»XäE_¬¢R\16\eè^K\1d>\1eKC\f÷å\a\98×\f÷Å/>î/×i\92¼¬Eèþ%\84Fûð¨o\94\80Zg\88¨aA\1aÕ¬©áË×\fHùk\16äÌU»-É«ÎÛãV½´"WýôCW9F\9cÕH³ Õ\ 4«\80Õ\94}¾«B[úZÁ~ÊZÅ\ 1¯µ³\ e\1e\1f/9º}¼êôã§)g×OÿrvùôÁÙeíßN\92ü\82õàf\17\838Ô2\8eGu³R¨bE\ e\95|Õ ä|Õ#¥\7f5\93ã¯Ûl\8eYwT\r[÷Ð`¯Ów\ 6®\aiù}\vÓõùÆÓ£}\13\18x\7fÏØãù=×Øý{©É\8fPcæ\ 2MæÎÐeá\bC\96\ e0cy\10^aÞ[I2Þ\86P_\1fB-7\10:=\83\ 2\1eåÃ&\\16h\10\8e\82Î\8680\92\89\80½d\ e\1cØÌ\ 4W\15\ 6PÔhà¿Í\eØ\1a\1eØ'Ì\rb\7fp\ 1ÁN'ÈÔt\84\83P¦m\ f§uì༮-tëÚÀõÝÖ0\8dyª'I\7f7Vÿ:V\7f\12¡Òy\84DË8t\f\14p|PÃGÁ."\17ôIL0\93a\80\8d<\ 5\1c7y\80»¢+Ð\94\9cÀ_Ù\ 1Ø*ö\10¶Å\ ebTm\80¯¶\ fÒ·ZAÎV\v(Ùf\ e§ÔM¡QÝ\ 4Ú4L _Ã\18nHt©\1f«\7f\v¡\92\a\b \9f#\94\ 2D\14\ad\\18(ãY Nð\ 5m"\ 5\fIn`!í\f¶2\aÁQÖ\ eÜä¬\81"o\ 5¾d\v`n2\83àM&\10¡`\ 4±\8a\86 PÔ\87ÌÍ»!\7f³\ e\94+iC­\92\164+kB»Du£Øý±\19d- Ä_F(
+\10â\80\fÎ\ fë\ 5\ 5Tðn°\9dà\bÚRûÁ\90¸\ fÌ7X\82\14ì7\1a\81óF\ 3p\97Ö\ 3\8a´.0d´!PF\138²;!\v\aÄÊj\80@n\edÊ©\81XN\15NÈ«ÀI\89\80¡C\0\8a\89\14ø\98o\80@+\12°öËÀ!W2°hJ\10ÄQ\ 5f¼:\ 4\0þ\85\9aà{R\a\18çv\83O«>Ð/\e\0\10hc{\806m\ 4ÔÇÆ@]Ĭ\98\0õ£       P¾\98\ 2\14¼Át\1dó·7\98|\91\0|µÿ\9fÁÏ\94\bA\96$àØÊ\0×\99\fÁT%à°Ôà\10O\ 3Xé»\80\99¯\r\ 1\15»Áÿ¬>ø]4\ 4ß.#`\5\ 6ƨ       øL\99\82Ϭ\19Ð_\9a\ 3ý­9ÐÖ,\80ö\97\ 5P×-¿RÁò\v\ 5,?SÁü\93\ 4ÿË@5\96\82\0\13"°ÍI\10b-\ 3a\8ed\bóV\82\10¦\1ap£·\ 3'E\13\ eåêBP\99>0Oï\81ÿÐ]¦QM^[\18\ e\93\14§zYuQÐ\16\15ªâÀ  \8a ¢ Æ\909!            IÈ@\ 6¾\f\81\10æ\0\91\19A@\ 6\15\ 4£\82\ 3(rUZëP´º¬½º\9c
+*\14\ 3È°ïwû;ýñüÞï9û]ç¬\87ظ\ 6\bmÞ@èX\aø\v\e ªo#Dõû\0î\89/àÞúÁþa\14\8bÿ$vÒ\7fl\1fø\8fî\ 3¿a,ø|ÂÂFk\0\1d`WÛ\ 3\ 3\1d\81ã;\a\9c\80·{!p     .ÀáºB\f²\1c\18i+\81nü  h\15k\81rx\1d\90[6\ 2é¤\ f\10Ïû\ 1á²?\10nn\ 2üÃÍ\80\7f\13\0Q\9f\ 2'q\96-\96ý\93[FöÃ\96\8f8\b\18Ä\81ÿû\7f\0\bh\ 6\9c\97=н\1c\80³Æ\11ø\eç\800È    Dá\vA\18å\ 2q1ß\ 3Oö#pR=\81\95³\16\18%\e\80\17hÍþ@mß\fä3\81@ê        \ 2Òµ­@¼\17<Exµ}\82ð!ä3Þ\12ú)j*t\10\ fÁo    °õ5\ 1\ 2\a\b\10`\r .³\ 3Â*{`¢^Á÷\9a\ 5âõ³A\1a8\ fda\vA\86u\ 1\e\88D+ .i5p\rë\81\a¬ª\80\19Æá izKð$íTÈ\17\8e      ò\95\9dc¤þðÏÄg»\87\89\83\11\1f\b\96È·Ä©Ý\ 3$\b{A\86\90'\14Øö\98\ 2\ 1$4\ 3e\85=p<ìA´r\16Ƚ¿\ 2Ŧy \fY\bÊ=. ¤¸\83\9c¿
\15ÞÓÂ4ß/¼¼ÀqNé6KLMè(£)|\84Þ\161LëÜó\91Ò\83\1d"_ǽ'=\8czC|KxEú\8c\7fN\99Þ÷\88
+\11÷i\10~\87\ e¡·ÿ\ 1 £\19èh/y¨kJ=\1c@µæ+Hö\9b\v\9aà\ 5 \89p\ 1\rÁ}FÍñ\9c@¤ë-\12Íæ\11afðG^ÑÎANEä;V\1dö¿ÑGñ\ 343é%å<õ9éjôSÒ]ÆCâkÆ\1f\94¿¨wéS\84ß\18\80½Î\80È\9f\99°«\8f       áÖ\0\8a»-0Ñ\1cBw{Püà\0\9a\9f\1cAçó5¤\aÍ\a}¸Ë´\1eç>¦ez\8d$\89|\86\10eÐ[IZØ\80 wÏsî\ 1ü\93\98*ÊCf\ 3ý\8fèVæ=zGÌ\1dÚ%v?í\16ç&õ\ 5çWú0ë\17æ\17êeÖ\f¡'\ 6öw³aO\17\e"¬ñw\ 66êx\92ïí \11½\v\1dÚ     Ã\869\90\1dè<\93³cÉXÎ^÷O\ 6\9a×;-Ï÷U¢,øiBrÄ\7fâ3p÷\ 4Fòm^\19ýVì!æuv3û\17Ö\89Ø«Ìó¼Ë\8c>~/ãϸ\8bÌ÷¼nÎ\18ólì$¥\83;C8É\ 5¬\99\vû¬\ 1T7[àºÚ\81\1dúõÙ\81a\95\ 3ä®\9b\rÆÍN\13\85\ e\17Fº½Ë#{½4°ý\1eiÅ!÷\12U\91¿!º¨_¥Ù\94>\91\89ñoA%»\87WÏíæ\1e\8b;Ç9-<þ$ê`÷\8b\aDfÞhl\e\7f<º%n\8a|T\0QG\ 4\80³\ 6ÐÐ\fÿwN\ 5ê::ô>rÐ~\16®u\9c\9b;ZºmÑ`Ù.×W&\82ç£<¦ßï\ 6\8dÔ\84ȾD\r¾W\91\96ç3ÏJJb;DÕ|³ IØÎo\17·òÎK\8eñ®I\9byO¥ÍÂá¸\ 6\91%¦^<A«\15O\13kÅ3\ 4k\0\1dõ\!:_\8d:o\ 6º\ fã\8föP¼zÖD\85Ï×\1f«\82\16¼©\ e[ú¤\1c·ê®\89îw#\97·ýj\864ò¢V\8d?\97¤£\9dVf³N$\14q[e\15qGâëÄ\8dâ\16I½¨SV+¼"¯\11>\90×H>\88\ eJÿ\8a­\92\8e3*dSä
+Ù4É\1aÀpµ\ 51:?\19õ­,Ôy\8bÐ7«ÜËásõ\86Ùïë\ 2\9c_ÔïpyP\8d]y«\94êÛWÀÙ~1G\1cyF¯À\9fÔ¦Ð\8e'\eXGÔùÜ\ 6E\89 6¡&¾ZÖ,«\94\9eL(\93ô %Ò;HiÂ{I        2Â+F,,\13ò\85jB&)Ö\0&:W\82ún*J.º\93âe¶Ó\a\ f×{;¾iÚ4ïIsÈ\92ßëö®¸VIö¹T\1c\13|Ö(\880gËñ-ú$Z\93.\8dU\97\92íN2        +TUñ%Ê\ 6¹        iC
+\90nE>rSiT½\91\19Õ\9fâòÕ\9fÙyê   z\9eú\vÕ\1a\10ó\9díß¾§C\9d7\1fuÞ27Û\89Z\ f»¡¦5\ e/[|çüÙ²íÛ[\8d\91\1eWj\88\e»Ê\99ÛN\99ø»[ó¥QMÙ*jm\86\96U\95\96É-M-\10\9a\12cR\9d<7±U\91¥>«4¨¯©2\93_%di>
+35£±\99\9añèLÍ\ 4Ý\1aÀA»\80\81tÔy\v]l ÊÕÆrx¹í»\16Oûgæõ\8e\82\16_;\12ñCO=aCçAÆÖ¶2îîfS<®Ö¨ TæhX%\99\19ÜB}¾0/­D\92¥=$ק\1eUèR:U©)?«RµÏ\10\9dî\83H§û\8b«Ó\8e1tÚñhk\0\17í\81\12uN\ 3\9aãÀ\12\e¨ùÎf¤ÙÍæõ        \ fÛG\9dkfõ\9b·,ºÚºkyWSÔ:s-=èhUì®úRÑþ*S\ 2¥¤ \89Y\98\97\16\9b\9b\9d#0d\1e\90¤e\1c\94§è\9b\15Ié§Uêô+*\95þ±"É0$NÊ\18á%ëÇ\98Éúq\865\80\8fö@\8d:g6\9a£t1f¦î_\98\ f­Km^t¸ÛÜ?çép½#`á¥\13áË:\8fá¼\8f7R·4Ô²wVW      °¥e2ra±\9a\91\8dÍ(È\12\8bâ\93r+åªìF$!ˬ\94eõª¤Ù\ f\94HîP<\923ÂSd[X\8aì1¦5@\80î ÙÙ\ 6òæc b\ 1f¢q\11æÝ\89Å\98Ç]K0·»WÚ÷\9dÛ4¿ët\98\9b¹\r»öÈQrÀ¡FVXY\1d\7f_aµ\84\98\8cÖ\97¥pRK\fq\89\a\8cb¤¨\&-¬O\10\17´+\84\ 5=JAÁ]¥Ø4\14\1f_8Ì\97\18-,\89q\8ci\r\10£çOýÆ\ 6
+\9c1Pí\8c\19\rfàÌ<Ìý^gÌ\8dK\1e\17ü\9c\86º¶\9eÚ»úp;iSe\v#ÔÔÌÝ\93Û &èë\10ZJMr\8cú`:/¡2O\18_^*\11\94ÕÊy¥Ç\11Ni7Â.»\8dð*\ 6Åü²a^\\89\85\15W<Æ´\ 6HÑ=¤;aà\80\13f¤~.æaûl̽ós0ýW\9d0}W\96Ûuõú8\99/l_Út.Ò³º\83àWl¦\aÿ\8fî:\8djòÊÃ\0~IH\b  ²("\9bì\ 4\f;\b\ 5Ã\16BBB\12\92@\ 2aG(\8b¢âVÔ©#.­u¨Sw
+\15µ,\830Et\0«¢VE\ 5q=\9ec=\f¨£\95b\90ÁÊ\8eϼÇOý\90ùð;ç~¹çý\9fûÜó\9eû|}&G°³±P¶µn­jãéÍé¥'ÿ\92Stbo~~Í\81¢\9cêêÕ\19Õ\8d¥\9aêÎҴ껥\19?\f\17eU\8fåe\1f\1fÏÌ>6\91®\vÖS9ì\9a\ f\e\91g?2É\83V\16éù\99Env\e\93\ e´³7ü\8c\e®r­k.\vÜ\ e^H
+Ø÷/uÄÎsYq[[\v\127üs\8dbMóFuaÓ¶\8c¼ÆÝ9Y\rßækê«
+Uõ\rEÉõ\1dÅÊúÞâ\94\86¡\ 2\1f9©§&ÓÓNMitÁæù\ 4û\fÉÀ÷tò°\91In\9f3 ×.3ÉÅ^\169\7fw©^S\ fÇ°öV¸Õ\91\e|§ýפ\9c\8a®\94Э\173¢7\X%XÓQ"ù¼½L\91{~«:ãÜ®ôԶʬä¶ã¹ò³õy²³í«¤m½«dmC9ò³\13\19\8a\96éTeó\8cZ\17l7$c\ahäI-\8dÜif\90\fÒq\8dAÎÞ3$M\8f\17\91S\8fØÌc÷C\17VöÅÚïê\11{n»­\fØЭ      _}#/¦àzq|εõâô«åIª«\15\95J\95¬«*-±«A#êêHO¸r\97ò{\9a¸kJ\95xñ£BrA7ì¢\91þ£\84Ü­£\91«­tÒ~\81NZn2Iý##r¢ß\92\1cëw×ÿöY°Éî§QÖÛ\9e\b\9d7<\96{\97<L\vÌ\7f\90óYÖý¢È´{ëx)÷Êãå}\15"I_¥DÔW%\13ö5&Å÷uÊù÷îÉù}ÃÔzR"è\81Xp\a"]~«$äÁ\ f\84üÒ¤GÚÏÑHs\17\9d\9cêa\92ª§Fäà«%zû_±\99\15ÿ   \9c_þr¥Õú\17|»âç2×UÏÕ^\99\83Ù~©\83\85\83ëB\93\ 6ÊÃ%\ 3»¸¢\81ÊhÁ`U,\7f°\81Ç\eì\88\8b\e\17;ø&.v`\9c\17ûoÄü?O\8f\10Ò]GHÇO\84\9céÔ#'oÐÈÑ\aLR9<\9f|5bOûr\84Íܬ\r\98\r7/Ðò¬³µb;\8d6ÙI¥ÍtSh\v<eÚµÞ\89Ú-\9c\ 4íN?ÁÈþ\80¸\91£\81±#?\ 6G¿k\v\89\1a½\1e\129:°"òÝ»\10®v.\84û\16\9c äB\13!Íç\b©½BÈá^=²ï)\83TL\9aém\9d´§\95Mz0\8b\8cr'ÃLÓ§¢ÍS¦\84\8b\92¦\92\96H¦RmEÓ¹ö\82ébGþt\99\13oz»KÌÌ^×È\99ïܹ35\1e\11³M\9eá³\9dì°¹\1eÊ\vvèì\1f\94      \9d.5\10ÒB\9dAíEB\ eÝ"ä«Ç\84l\7fà\9b°Po\r\96ÒòáÊÈ\ 4\87¥B°±\1c+M\12\11g&\84Ø<\ e\18h¬¢\90»\98K=@±aI\18¶Û¬ \1e\0Á8h\e\84\13v\818cï\8fNÊ-{?¼pðÃo:ýÔLÈÉvêû×       Ùs\9f\90ò~BÖÍ\19\92B\98éeÁ\9a¦Æ2º\1c\9e\fª\9a\1aÄ#Ô0\16\91Æ\91àÏ\8b\80Ø$\f
\10¤.\bB¶Y\0>7óú\85\1c\94\9b{c·\ 5\e\7f·ôD\8d¥\a\1a­ÜÑfå\86k\94n\9dNS\19\1c¦2ØÓKÈ\17¿\12R2LH.\18$\r&zrXè\89¨³àÃY?
+^\8c\bø3C±Â \b\\96?bY>\10\1a.\87Ô\88\8dd#\ fh\8cÝ\90\8câyË°q¾\ 3¾\9co\87oLlqÄd)jMlpÆÔ\ 6-:\1d¡2Ø{\9b\90-O\b)zIHÆ8!J\10"\86\11\89Ã\ 2½HXÑ>\83--\18Ît?xÒ9ðÑg#\88á\860\86\v¸\8ce\88e:@À´\83\84i\ 3¥\81\f\16!\97e\89\12\9696±Ì°Ãp\ 1õ\13\\80C\86¦8ª\13âÝh\88ñÕ\87\90"     `B\16Ê\82\18R±)\12ÓÌ!*²BÂ\16k\b÷Ø þ;[ð«íÁ¯s@\\8b#âÎ/\ 3ï\92\13x7)÷\9dÁ\e¤üî\ 2Þ{Ê4\ 5\7fæ<Ç\83\93.\9ffàqè\10qô!ócB±\82\ 5E\941ä"SÈTæ\90\14,Bâ¦%\10WØ"á\80=\84U\8e\10\9c^\ 6Á\19jo\9b\7f\1a\9b+øw)ýnà¿¡ü×\1dü)
+>ùH\99áÃm\8a\ fW]  fà{Ó!ñÖ\87Â\87\89\94 \16T\c¤\bM¡P\9aC¾j1de6\90î°Câß\1c!>ê\ 4\vD\8d®Hhu\83°Ã\1d«\1e\10Þñ\84à)å5\e\82Qʤ\17\ 4ð\9a£L\vÀ\9e\10Àã\83\0îº@èJ\83\90M\87\8c­\8f\94å\f¤\ 6° \890\86\14\ 5\8b\91¼Ö\16\8aí\ eHúÚ     ²C®\90Ö¸CRç\89Ä\166Äç½ ¾ä\rQ÷r\88\1eq\90ðÒ\a  Z\9fÙ\84qßé\84\8f¾\13     ðý \ 2gL\ 4ïQ\11غ|\9aAìA\87ÒC\1fil\ 62}\r\90\1df\8cl\9e)2¥\16HÏ ®Y\89\1dÔ_8!e·+\94\a< 8î\85¤\93Ë!û\87\ f¤­¾\90vúCòKÀÇľÀ\99Ä\81 Iñpð\añ\87\901ñ\Èh"\ 2G$ð\1f\96ÂwH
+\8e.Hp¡AêF\87Ú\95\8eLw\ 6ò8\ 6(Xa\84\82hSä\8b-\91§^\82ì\ 2\adlt\81f\87'Ôß,ÿ\98rØw6¹&`FQ\174%o\ e\99L:\1f:!»\1cöAz;ü½ô×\88\9b\95o%ï¹CÒ¹\887I\b{-GÈK\ 5\ 2\9f+à¯\vDÎ4È\9déÐPý*\8fêy\85ÞL\94\ 4\19a5×\ 4%B\v\14)mP\90ëø1o­ûLö6ïÉ\8c=~ãi\a\82Þ«\8f\85\8e¥Ô\86\8f&7rG\14­Qoå\9d1ÃI×yC²\87üWÒWñ/dcü\ 1ùlL¿\12Üg)\b\7f¢BèC\15Bt\81\98\9a\91\8e,ªï\16:é£\94Êc}\80!Ê"LPÆ·À:\99ÍÌ\9a\f§ñ¢bϱüM¾ïrþ\1aü6s_ø\90æ`äkõ÷ÿc»N\83\9a¼Ö8\80\9f\84MEqk­K©ëX\17ܪ\16ê\8a {HÈ\1e\92\90\84ì\ 1\12 @ \ 1bØ \9b\ 1ÙB\90-@\10"D@ÙD\96
+\18A°^µ£VP¯ÖöÖ¶ö^µuãÜ×ïùð\9b\9e3çù¿ïÌßç)­1à        Å\8cyDêÆ>$\r\85< Ý\bù\91ø\ 4\7f\8bô\12{\93ú>p\9a\ e}n0¡\97\95     \8f\8d\11[ n3\1a2\90Þ+øÔù\90»$lw\80Ê}\v êðb¨:¹ò\9d\12»î\95\82±ù\8fX\91Û¯Qò\83ÏÄ)G\1eó²¼\1fr\8aüï\85U`î0kq·è&üL¨\85x\83ÖO\9a¤\8d\93­Ôû\94\vò÷\8c·¸Q\16\f\1cf#\7f\11\ eôêç@O[ a#\1a²\90ù\92O}k½\1dTmµ\87ê=\8e0ÍÃù}Ú\89\15ÿÓ\ 4­}\91BÝüs"o×£X©Ç}i¢ç¿$\1aß\19\816h\92W\8c»ÆÑ\13ÆØõäÑ°Vê0³+ô
+s\88~\991Íèe<cô°^\93\10w\91\a\ 3;ùÐ×Â\87Þ¶@2ò\ 6áÈ|)Ò·\12\91»¨\91ldº9Ìç\1c\ø:÷زßsüW?Ë m\9aU³wßN\92xLÇÅyZe)~W#31Ãâ\ 2ü  \94ÔÏ«¦öp\9bèÝ\9cvf'§\8feaO°Î³çØfî_¡fÁ<±U\ 4±-"\18Ø,\82¾¶@*2\97\8fÌ\8fAzoò\97h\98±  \rµ;ìß\16|ãôgÑá%Ï\8b\9aÍÃo¼\9dÉÜ5¥\16z\8c%E\9f\18\8e\1f\88Ñ\ 4÷Hs    ]\11:\8aE\\19j\16Ö1[\ 5çØ&~7§\897\1anäÝá6\b~\ fk\90¼§ÖG@|m$ÄÔDÂ\0[`(2W´
+\ 5ã\90¾¥^\8b\rhXøµÝ«\92=\8eÿ)õp~\êµòîiì\86)mè®±\f\9eû\95ÔHÏ^e¼\7fWB
+¶]\9eIl\8d\9a¤¥\fcd5«NÒÄ©\11[x\ 6Ñ _/\9aæWJ~      ¯\92¾¥ëe\90T!\83¸r\19\f²\ 52\90=H\90¾«@¤­F:\9f+êCñ\16ôË
+7ûgU\a\16üTu|ùL)fýx\11ÕíJ.ǽ']âyA\1dëoV)±¦D\rÑ\18\9f\8dÕ1\rÑ\95ìJi=·,ÊÌ?\13Õ',\8e´
+uÒ§üâXäK\96ÏStr\88G\ 4Û\ 2Ã\90¹\91HßS"2\91÷(Z\87ú§l#ê7Ã6»Çu{\1dïÔ\1c]v½2ð«\91\12Òξ\ 2Ö·\17r\84ÇÛÒe~Íj\ 5¶>9\95X\9d\94E«T\142KãËØÅò\1a^Qì9A~ÌE\916fL\94\eóH\98\17ÿ\8a\95¯ø@ËS@\82V\ 1±¶@ö\17((Cú^ò
+d\ f\9f!\9do5ê\95Þ\15õ¼n3úaÓNû\99úÃKǪý]/\97\13wtë\98\aÍùüãÍ9Q~u\19\ 6\8d\8aX\9e\9aN-Qå1\8b\92J8y\8aj^NB³03¾S\9c\1e?*ÖÄ?\10g$ý\97\93©z\1f\9a©\84$\ 4Î\16\18\8eä \ 6é{êå\0æ­\0°ôsðòì\1að羚P?¶l³\9blúÎe¤Öw]O\15~{G\19ý\80IÇ=V\9f\1fákÈ\89Å\94e&\11ti§¨\ 5§r\98¹©:Nf²\9e§Q\19\85©J\8b8Y9$Q)ïJRR^\86«ÕïèêÔy²:\15âm\81<$\aò¥H\16\96\ 1\1c|¨\\ 1^Ô¯\ 4s­«À\ fæ­v\13-îK.\eO®íªÁ}ݪ§í7\96r\8eVëÄ>å\ 5Ñ\18\9dVAÈÏN¥fgf1ÒÓ\8bØjM\ 5Ouª^\98¨>/NP\ fJâÔ·$\8a´?¸Iéï\18Iéó\14e\1aÄÛ\ 2\ 5H\ e\12\\0Ì@è\Àk\83\vø¥Ù\ 5ÜëX
+¦:¶ GÛ\ e.î5y¯ioÀnm>KÙW£g\1d®(\13\9eÔ\15K\83ò\8bâñÙ\ 5É\944m\ 6#%'\9f\9d\94\8dϬ\15Äf´\89e\19ý\12iÆ´$:û7\9e<ç-3.û#%.\v\12l\81b$\v\9fzoö\12ðæÌb0[·\10Ü=·\bÜê\\ 2&:7¡\a;ö/êj;ñE«     ³¥¾\81¼W_\13v¨¤\8aï\95_\11\19\90U*\ fÑ\94(ÉɧÓè\8aB-K^PÂ\95å\9d\15DjÏ\89ÄÚ^±H;)\96äÿÊ\8b*|Ë\94\16|¤Jó Á\16\18\89d!Ù\19ÉÂ"ð¤Ò\11Ü5.\0\vÁäEg0ri=ª·{ßÂvËñU\8dæÀMÕ-ÄÝ¥\8d\f\8f\82:®gv\8dÄ_c\88Áªô\89Ä\84r5-¦4\87\19uFÇ\11\97\18xüb\93\80«»$ä\14[\85Ü\92ç\Aé?LQÉGª¨\18\12l\812d\a§\16\82¿\8a\1cÀ=\83\ 3\98iv\ 2Ö\ e'pµo\ 1\18èÿ\12ÕٻǩåâÑ\95µ\17ü7\94·ãw\16µ\86\1eÌ6q\8ei\9aD>ª\ 6YP|]\ 2>º&\85\1cQ\9d\15*4\14\85q«ô\1c\96¾\99ËÔwóèú        \1e£ê\19\87\9bÁ©\9a§\84WB\82-P\8e¼A\86\ 3\98;\83\ 2?ÔÚ\ 3k«#\18ét\0\ 3\83ö {h5h»âæÐ0ph¹¾×ÇUw\11·-§\93ú\8d¦\83uHy^à\15×\16å/;\17\17,1©ðüæ\f
+»±0\94i¬dÒ\8c\8d,\8a±\8bM6\8e³É\8dOÃh\8doht#$1êa\88-0Ñ   ¼Ô\ 2\12\80ÉF;0rÞ\1eô]²\ 3\9dÃö mì3`\1cÛfo\18uw)\1eö^£\1dÄlÑô\93w+{\99ßÊ/ñ\8eJ»#¼E]±þÜ\vJ\fË\92\16BïÈ'Q:*(Äv#-¤½3\14×>\8exJ÷¿!\11Ûa\bÉ\f\83m\81©\0Ì\9d\ 6`ú,\0ß· A\9f\ 5\r,ýhÐrÕ\ 1ÔO-\ 5\86©Íè\92ëû\17\1dÿ<m<`½ò*a\9b|\94¾7r$Ü]8$>\12~%æ\ 4s0É\87v9-\80t9\1f\83\1f(Ça\a\8cxÌ@\17!p`\1cñ\149¿Á\ 6÷àl\1f\f°åÏ,\0n\97\ 10a\ 4 ß\8c\ 2\16¤û\99\86ì@\8dÕ\11\94Ýv\ 6º;®(ííÝ\8e\9a[G\96%Ýô]\13;\83Û\181MÛοÁÞÃ\9e\12\1d Oʾ£\O<J¸®ñÄYó½1Ö
+\9f\0\9f\9fµËß÷ú5ÄÏÈùo\1f¿kÐÛ\7f\ 2zÙ2[\88ì \1a\80A\13\0\17,\0\ 3P}Õ\ e\9c\99q\ 2y\ f\17\83¬9W\94zÎÍA1ëî\1c=ë½Rü0x-÷'ò\86°\aa[i\ f\ 4;H÷ÿÏv\9dE5}¦a\0ÿ²\ 1"e\11\10"\91}_"\82ì       Ù $!\e\90HØ$h\10\11\91\96bQ\8ftܦê±Z\1d\1d¬£\ 5[-¢8:\8a¸Wqj\15­­vìáTôTqÃ\80\8a­¬nÏ|3s3Çæâwr\93s\9e÷{ßÿÍSÍ×÷|\14§éY\9e êY\9f\94Õ³-%³gO\9aìÖQ\81ôv\97@zëa\9a´g(Uzómªì\17¤Ør½\91\90ót\aG\ eÐ÷wÐüNB6_a\915Ýöd¹Õ\8d,±ú3k­Ñ\9c*k¢£Å*r\99eUx\14Xs¸ÆÇ\85¼\1cël\7f­µ*(ÛZ\17¢°6\84É­k#eÖ-Q\92þ]1âþCüô\81N¾ðÉ-¾°\7f\90/|ü\9a/ìC\8c-ß5\13Ò±\8f\90ÖÃ4ÿ\f!\9b.\11²ú_\f²ô\8e\1d©\er'ÕCþ̹C\91ìÒ¡\19\ e\85ÃÂ\89\86áL\17Ý°z\92zØè¡\1c\92\8f\94{g\8c,\9c"\19©ç\89FWL\15\8enðK\eÝî\9f\12\90\11\98\15\988~?0qìE`âèk\9b\8e·\10²ï Í?Ió/\10²ê\1a!õ·\b©\19q$\15pg\981\95Y\880\96\ 1±\1c\1d\92\1dT\10;Ê¡p\92Aç,ÆL\17!f¹¦¡|R2\16º'¢Þc\ 6VzÆá³É±Øá5\rû¼ø8î\1d\83.ïhôR\836µµ\11ÒDo°é<!+¯\12²è&!\95\ f\b\ 4R\ 47b\0\97¡E S\89(v\ 6â8b¤Ú       ±OA\96C"´\13âap\9c\8e¢\89|Ìv\8aF\95S\ 4\16½\17\86åÎ!Øà\1c\8c¿¹\ 4¡Å5\10í®\ 18O]·©ù\b½ÿYúþ+4¿\9b\90\8a{\84\14ýFh¶\1dÑÂ\99(àÁ\90\82Ç\14"\98\99\82(V\ 2âØÓ\91Ìæ#\9d\13\ 5\19'\1c\10èì\820Ó>\0%ö¾(wà¡Æ\81\8b¥\13¼°fÂdl\9dà\89fG\ fì§ÚmÚr\9aÞ\9f~\ 3\8bnÐü^BL\8f      Ñ¾"4\9b\10  \1cI\1a\\19\89ðdL\a\8f\11\11\81pf\bb\98\81\88cù!\99Å\83\905\ 5R\96\17\14lOhÙî0²ÝP¡E\91ó\1ej9Nhà8b\9d\9d#¶ØMÀN\9b \8adB\14ËB\ 6¥\88gC\99b\a\85Ô\ 1rÍDd\169CVé\ 6I½;Ä\7fö\84hód¤ïðFú\1eo\bÛ¸\10¶O\81ð\14õí\14\b®ú@p\8bê£\9eSc>\10âÿÑÿ\81k\93\98Πá³\90E©¦³¡N²C¶Ø\ 1ªì\89P\14¸@^á\86\8cE\1e\90­\9c\fégÞ\90lçBòÕ\14\88÷ù@|Ø\a¢\13<\88:©ËS!ê¦\1eR\83Ô¨/Doé/þG\fÞ[1|lùï\f²h\16\94\94f\1a\eº\ 4;èÓ\1d U:A=Ó\ 5*Ë$(j=\91õ'oÈ×s\91Ùè\83\8cf\1e2öN\85ì /d\1d~\90~C]ô\87ô'ê^\0¤O©aêMÀ\e)\ 2^ÉàÿR\ 6¿q\19|m\81$\82       y$\vê\b\16r¢ÙÈ\8b³\83\0C\96\13rr] 3»CSã\ 5õ2.TkyPþÅ\17\8a\1d~ÈÚ\1d\80¬¶@È\8f\ 4A~\8aú6\98¶Û\10dþJõ\87¾Î\1c
+\1dÏ|\1d:\92\89Ða9\82\87ä\bz\91\85\0\rgB\19Æ\84>\94\ 5c8\e¦i\1c\14¦8 0à     ù:W\18\8b=\90\e9õ>Эò\83vc\0\82 n\ eAöÞP¨\ e\86Au,â­òlä\eååÈ\97\8a\9b\8a¾è!ÅïÑ¿)^E\ f*\11ùT\85ð'*\84\rd#d@ýG\90Ñ\194ÁL\18\82X(\faaV4\aæD{\98%\131Kí\8a¢|O\14Ìå"¿Ö\17Æ\8f\ 3ßæ­\vy\9d³%ü¥~Gä¸nwô¨v?\7fDsdÚ\90úTì\võ\85¸ß³\7f\8a\7f\96ý`F¿êù\8c¾ì\97ñ\ f5\88} EÌ=\1d¢zõ\88°\ 5ò\10º\83\0&L´ã\95\ 6°`\89dcn¼=æ
+'¢\á\8aÙy\9e0\97ù¼.©ö\1f+\\122lZ\1dñbæ\86\98ç\86ÆØg¹MñOs¾N\18Ðÿ=ɪíHéÓ\9eK{¤¹*¸¯¾+¼£y&¸­\e\99\83\84î\Äý\9c\87Ø\e\ 6ÄÜ0þ\11TAt\a¾L\14ÓÞiñ£½/\8c\8d\ 5±v¨NuÄ\82\f\977óu\9ec\15ż\17\ 5\ e\9aëÂ\aJ>æ?.\\eÿ0\7fsÒ}ãöÔ»y»Ò\7fÍm\15ßÎ9,¹©?-íÖwÉnèog\Ó?\91\1d\13}oDÚå|$u\990ãR\ 1â.\16`ú» ¡ïÏ÷aÂÌ¥ùS\99¨¡÷¨\8dá .ÉáÍ\87\12ç\91\ f²=\9e/4ñúç[\82\1f\96/\8cº[¶$þö¬\95É¿\14¯\17Ü(Ü*ºnÚ)ý1\7fwÆ÷Æ\ 3òËÆ\8e¬K\86Nåw\86ëÊ\7fæ=RvÎ\1cÎ<[\0ñ7E\10\9c)FÊé\12$\9c²\ 1\83".\ 3\16Ú5«é,u\81L,¦÷X\1ao?²Tè4¸8˽o\91Á§÷ýÒ\90\9eªù17*êfühiH½Rö\89èRéFé\85\92ÆÌóEM\8as\85-ª3\ 5\87Ô§L§4'L]Úc¦;Ú£\ 5ϳÛ\8bßd\1e)\85ø\88\19\82\7f\94!\85J~\17r}\18\98Eóçý§oÑY\96Ð{|\1cÆ\1a_\1eËy¾"űo¹Ìíî2ý\94îú¢àkµsù\97«k\12.Ì_\9cÖY±B|Ʋ.ãäìÍ\8acæíªöÒ/5\87Köë\ e\16\1fÍ9P|>w\7fñϹ­%\ 3úVóKeë\1cd´Z n)\87\80J{\17\8c\8cæ/ \9d÷#/\ 6\1ax\f¬
+b\ e}\12Íî_\9b`ß»FìܽRÍý¡Á\14|±~vLç\87U  §kê\ 4Ç\17,\93´W®\96\1fªøTy |«zß\9c\9dº\96Ù_çì);\94÷\95ù\8cq\97ù\ac\93ù\91¡É2ªi®@Vs%dM\95\10}Q   á»\90OsçÐü\1aÚ·\96ÐYVp\19¯Öø3\ 6?\rc>Ø\18ËéÙ tº¶Få}i¥1è\CiÌÉÅó\12ÚëÞ\17\1cú`±´márùÞ\ 5kU{*7iwÍû<ç\8b¹_æí(o3~n9\91ßhé2mµô\9aþ:oHßX\ 5Õ¶\ 5ÿf»>£\9aLÓ0\0?Iè\ 2\82\82\8e8X\80U\14\15\10A)Ò\93`B(\81@\ 2¡(\88 =\18j¨Á\10\10A\13\9a@\14\10\14\ 3((²2ë\88¸zÖQÇ  3{fË\b\8a{vV|÷ý\1dçÇõû>_îçûNnü\85MF\1e\98»*Ä1& 8¼µxxóæo\ 2t~\v|ªÚNøµÎ\8cð¦Ñ\8a´Xç´áQ\15uëTY\90Ù­\12î\81\91üÓö\ 39É.}|¾gWF>U\9eVJoO©ò\93&51\9b\12/\ 5×'ô\85Ö&ÜàÔÄßçTÅ¿
+«NZ\r\92¤ ßÚ4D\95¤#/ÌC\15
+ÇÏ\1e¿\11\10\1f+2\ 4\19Vk·Âró·ðRº\87¸ÐtLg¦\96¼åveàî뢰\ 3\ 3%1Gz\v\12\9d;ry\1e\17³r)R~1½)£Ü¿>½\8eY\93ÚƪLéa\8b\93¯\85\89\92&ÃK\93\97ÂE©¿±Ä¼u¿òsè\ 4æ->\87¼T¡\bÜC"Þ{Ù\98p#¬W\19À¿\1a7ÁÛ\vÆ°ØnA\9c\93:hO6z\19\8fIüw\rV°­zE'í:Jâ\9dÛ\vÓ<Z\ 4Y\94\86\9c\ 2º$Kä_É\97\19­!¥¼Nvqú`Xaú\1dn~ú\13naÆ?C\8a3ÿç/ÌF4\8c\\92\8d¼U¡(|\aɺ\80rõp\ fz°*Ñ\83_Zõào2}øNfF\98¹xDk¢ÕÓh¤\81±S! ÙßU\11u¸]\14çÔ"Lv¯/â\93«\v\ 4´rA©ßùÜ*fIvSHA\96\9c\93\97y%<\87?ÁÍÊ\àfgýÊÎËý=0_\80è\18\ 5#«B'ñ-¤âÍ\99¿\ 1ÖÄ:xwjÁ\8b6\1dXìÔ\85G];     \93òÃ\9acíî\9b\aZè;z\1a\82-/I"l[+c\1dëÅ\89nÕçyd±0\97VZTìWTXÁ\14ä7°²\ 5\17Ùü¼þp^îMnzî<\97'ø;\9b_ðßÀ¬"ä\8bQ1\8a*\14\8bï\80§\r¨P\v\96«ÔáE³&|\7fI\e¾ëÑ\81\99˦\84\89nk\8da¹«a_û   SykÐ^ic¸MCí©cÕÕ ®â\8a4o¡8ûD\81¨\90\91[*\ eÌ,©cñ\8aÛØ©E½aI\85£ÜÄ¢9nbñ2'Eø\1ffz)bðJñ?\91RDU\85âp\a|Mø$T\87W\12\12<mÕ\80Ç\1d\9a0ק\ 5\93ý&0ÚwPýj·\8b\9cº½ýbà\9f\1a¥\1cë\9aæh\a\99ã%µ)^ù5\99>9Uù¾ç*Î\a¤\89%ÁIeÒÐ\ 4Q\ f'Nt=ü´h\16û\89\13/þÄL¬@\8c¤
\93T\8e¨ªP\ 2î![\r\96Ë\0\9e×\93`¡]\1d\1etkÀô\15\r¸5°\15®]µRëíwÒ\97]&okîô7\97ÈB\ f\8aÛ£ìK¤qÎù-I\1eÙM\19\94\8c\86<zJ\9dÐÿ¬¤\9a\19WÓÂ\8a©îbGW\ fs¢ªï\87EV¿e\9f\92¬1ck\11\16ùÄI\10U\15\82/\ 2\80×\15\0O\9a\890'S\83©^5¸5H\82\91\11#P\f[\92:\86\8eêJ¯zm­ëcì.ïaí/éâ\1e\16Èc\1c³.\9du嵧{'_Èñ\89\97\16ûƶT\ 6D77\ 5E4w²Â\9a®\85r\9a¦CÙM¯CÂ\9b?\ 4D´ ß¨\16D\8dnF\14U(\8d\ 4ÿ(Æ¿\81\ 4\ 2\ 1oO\12ÜR\10ax\84\0\8aqCè\1a· ¶\8d\1eÑi\18q7ª\18¢í\10\ e\ 4í\15\     ;\94ÙwÒ>­7Þ9±'ÕýLW\96÷©ÎB\9fÈ\8erß0y£\7f¨L\1e\18,\e\f
+\92M\ 51e?0Y²\ f~¡rDãÈ\11\85#CdU\88\ fðV\ 4ð\97\ 6\80\19\19\ 1&z   0\8c·_ÿ\18@Ç]=h»»\8bÐxÇV³râ¸\81pÜÇD0\1a`Æ¿ÎÞ\9f:\12esöZ\9cÃé¡dçè\ 1¾\e÷j\81\17ûJ\19\95¥h \ 5*d¾þ\8aA\ 6C1\85½bø)VO\ 4(¾P\98ýÈ\vóTµ\8a{øk\15À\9c\14àn\17À\bÞ~ýx{Éo\13¡eF\eêg·CåÌ\ 15á='ݼioãs\93~¦)wC,âïDì\8f¹\1dk\135\91t$ìÖ9Ç\90\9b\ 2\97 ñ27ÿñzOß1\997ml\80â36Eñ\19ÿ\81|blÕ\8b6\8a<è£È\95~\ 3\1dWõN\b°P\ f0-\ 3¸Ñ\v \18Âù7\ 1\9a§HP5¯ ¢\ 5#(^ØCÌ}l¯\95ñg\8f\8dIó´­q\8f\82LOÎ\85\9bs\1f\9e²d?8{ ø\ 1Ï&`V`Ç\98\159Ðfê\1d©32gòÌ \8b÷ì´\8b×ì\e\17ï\99\ fÎÞ÷\91\1e:J\9eþÚR%Àì\ 5\80ñn\80+Wqþ\r\9c\8f÷gåC5(~¢\ 5Ù/õ\81ÿr\17\85µZÂ\v\17í\98ç\14\83Èç\ 1Æ\9c%¶ ëYôÎÀgñf~ÏÒ÷Ð\17óöù,\9e·"/Ö\1fò|&³öx6dã¶tÏÖméG\e·ÅU\e·§ëÖnߣCnO¾6ß\b\ 3\1f s\18çãýY9\ 3P´@\ 2þ\v-HU\1aÂYå.B¬ò )RyL\93£ôØÀRÒ7\ 6*\8371\94\11[hÊÓßP\95)ÛÉÊ,SOeÉNweÍn×å6s\97e\85\85óÏw,\9c~^´p\þ·\85ãO¿\9b;¾C\16\7f\12ÀÐe\80.|\87\83\8a{\0\ 5\8f\ 12\9e\13!aY\eb\7f3\82¨÷»\b\9c÷V¤à÷öêþï]5é+\14\1dê\8a\9f®÷J¨¾çJ\94\81Ûê\99MÇWÓ\8c\9c\8c\8f}(Ûâð¡ñ\eû\8f\9dÛì>\ eo;¼6kb»öÎÄöãÊ6Û\95/\18úÊ\bî \aßa+~\ f*§pþ<@ú\12Àé×\0\91k:Àù¼\19\82>ï ø}ÞK¤­Û\90Èë\8eê\1eëî\1a®_|4\9d¿øk\1fC¡:\ e(r\83\1d:£k\8bÒô\ e!\81þ\ 1T¾Ñ
+5\eìCÝ\ 6\96è\86á^ô\10ûÑp\ fZÅ>}¥\17w ½\8eóñ\r\14<\ 2H[\ 4\88Åùì_\0\98H\e\18È\10¨h\eÁ\v\99\11\Ñ~¢\13:L:\8a\1cIvÈMÍ\ 6\ f"\86º\15
+Ö°Dá\9a{P\8c¦9JÖÚ\8dr´w¢2í\1d¨IÇ\14ué|\8b\86u¶£©\r&è9öæ+mø\ 6ªïàü\878ÿ)@\fÎg)\ 1èk\0\14¤\ eîH\1f\9c\91\11\1cEÛ      vÈ\9c`\8dö\11­\90\rÑòÿd×YTÓg\1a\ 6ð\7fþ\81\88\8aì;Av\11\915&@ \81$$$\106\ 1!²)\186Ù7Ù, à\80\8a\b\88E*n8R\86A\1d[EQÇ}k=Å¥ã©Ó\8aÖ­®Uq\19\91Ê3_Û\99\9bxñ;¹ÈÅóæ}¿sr\1epig\ 40\1d b\92òÉ´A$Ó
+ñZ\16HÕ2E¶¶1Ê´\r±JÛ\0\eY\ 6èeéc\80¥\87\83ÄÈ'6\8cPTÝ9\92\7f\95¢ÒI~Ü\ 3\92ý\94¢\82¦(Ê\1f\14µ\80ìÂ\93ÌáFæp\81\15Ã\11ö\f[83Ø\98Ç°\84\f\vh\13ðiC\ 4Ó\ 6\90Ñz\88¤u±\88\9e\8e%ÌiÈcj¡\92ÉÄ\1a&\8dv&\ 3½ÄÎO\80çNÃß\83\86Ð\83\89`\1fÂO\vB\11\v\81J\1dð\17Ï\80_¶.x\15zà®ÖÇ\826\ 3\18\82³\93\180\82Ï~b\988A\4\86Ïuâ\1eñ\9cxg\ 4Î\14\81ÿ3ü\1f\83Oü>CÀ|\1aÁó\99\90x\12\-\88\85,\ 4\87é@\980\13\81êYà\97êïÞ\0¾ë\rá»Ù\b¼íÆàõ\13{MÀ;H\1c3\ 1÷\9c)¸W\88;¦à=%Þ\10\1fÉwøÃ\94/\8c§x0þÈ\83\91\92|á<\1a\12BæÎD¨\8f\16d\81,Hå:\90ÄÏ\84(}\16\82\8a\f Xi\88À\16c\ 4t\9a `«)ø»ÍÀ\1f$\ e\98\83\7fÄ\1cþ§\89ËÄ-\vø?&^[\80?iñ\e\1fæ\1f\88  >ÌÞÿÉT\13üÝh\88\H>\11æÊD¸§\16\94þ,\84Ku \8f\99  Yª\1e\f!®2\86¨É\14Ámæ\bî¶@Ð\ e¢ß\12½V\10\1e"þi\ráEk\bn°§\ 4\ fÙ\93ÂWì÷Â\ fì·B°_\va5\1e\ 4ËW\7f²Ð\ 4Á\\1aR'\92ïH#\92ôÝ\98ùZXÈc!F¤\83¨\b](\17ë#,Ë\bò2S\84Ö\9bC¶Î\12ÒMÖ\bÙÊ\86d·Í\94dpöGñ\ 1ÛßÄ#v\1fÄgí&ÄWìß\89îÚ\8f\8b\7fux!\9epx.\86ÝS    l\9fH`ó8\ 4ìG!°Ö\84`g\1ar{\1aQv4bÉg\ 2Ù\85\8a£\8d\ e\16)t±0Þ\01\19&\88*4\9f\8a¨±\9a\f_c3\11Öfû\1fE·ý;ùv\877¡{\9c^\87îu~%;4ç¥ì\84Ë\vé·s\9fIÇ\\1fI\9f¹>\90½\9f{7\14s~\96Ãé¶\ 2\ ec
+ØÝRÀV\13$\ e4\94³\19\88eÓPͦ\912\87\894/-¤ñ§!E:\13\8b£\r>&¦\9a¾\8fϵ|\e[a3\1eSoÿ"j­Óó\88Î9O\95\8fÃw¹ý\1260ÿ\81â\1f\1e÷åG=ïÊ/xß\91ßôþIþÄû\aÅ;\8fïÃávM        ×+\11\983\1a  çï"ᨠ  ¡¶\fD[1\90`Á@*é»\19ä&\99ä\1e\99ä\1eËD3>¤+õߤ©L_$«­\9fª\8aì~YTã|?®Ñõç\98V÷±è.¯\9f¢z}nFþ\95s#b\88{=b\98wUyÚwTyÕï²ò¡ß¥\88\vQð>\17\ 3\8f³\váv&\16®§cᢠ  a$7\8eôÞdÒ;3,\19È!7É#÷È÷Ñ\9eÈ\13L\1fÏ     Õ{\9a\19gú c        ûNÚr\87\1f\93ËçÞPÕ¹_Khö\1a\8dßȹ\1c×Íû&v\87ß\85\85ýüs1û\ 3ÎD\1f\r<\15}Ip"ú¶àXÌË\80\91Øß|\8fÄ\83s8\ 1\9eÃ\89p'Ü4!â÷\1d\90ι\84t¾l2K\81\r\ 3%Îôd©\as¼ÔoÚãbɬ»\ 5Ñ&?æ$³¯«3\9d¾K/\9aw)­Úó|ò*Î\99¤µ¼\93ª\ eÿã\89=\ 1G\17í\12\1e\8e\1f\f:\14\7fPôuÜiñ\81¸ïÅûã\9f\88ö&L\ 4îUÁw(  \9c¡dx\r¥ÀC\13¢Iîb\92¿Ì\80B¾     \85R2Ó
+{Æ\9b*WúI5GûneÐ\8c\9beJãÑ¢Dö¥åéNg³óÜN¨Ë½\8e¦¯ä\1e^Òäw0µ5ð@r\97p_R¯hhñ\1eÉ j_È\80ê\98´?ñ²lwâ\ 3Ùî¤wÁ}©\bèK\83\12\96Â[\13\rRH~6é[EF\14V\98Q\93µlƯuN\8cûõîÌ\7f×\ 5è\8cV+\8c.\94ÇY\9f*Ns:\9a\9fív(·Èû@V\15o\9fº\9e?\98Ñ,øréÆà=Kº%}©;¥;R\aC·¥\fË·¦\9cWô$ßVô¤\8d\87ô¤CØ\93\ 1ÿ/Ôà\11\1cM\887&wУ°\9c(#³Ô\18Qo\eÌ©G\8d³©±¿¸0®6úN»X'3<Y\13c}¤"Éñë\12µÛ¾Â|ï¿å\95óúskù}Ù\8dÂ\1d\99ëE½Ë6\85ôdô\86~\9eÞ¯èZz ¼sé)eûÒ\1f\94í\19/B;Ô\1fE\1dY\bìÌ\81_g.¸\9a\90`HÞ"é{\ 5ºd\ad\8e:}êe\93!u¯Å\8cº±Î\91ñm3\97uºQb0R\1feõU\8dÊqhEú¼/Ër½û\8a\8b\vª\ 2¶æ5\ 4uç6\8b»rÚ¥\1dY=ò¶Ì¾°Võ>åZõñ\88\16õÕÈ\96¬gaks&%ë\96C¸>\1füõ\ 5ä_G\ 3Tä·«Iß+&ªgR¯VéR\8fZfQ·6èQ£mv\8có­>¬ã-"ý\83\8d\11\96\179ôצÍÛU\99åÕ[^ÈÛRZÁï*^\19ÔQØ$Þ\90¿A¶.o³¢9wGxSîß#Vç\8cD5ä\\8ejÈ}¤\\9d?!m,DPS\11\ 2Ö\14ÃO\13\92È;ÈÒ!oQ\87z½R\87\1a[3\8dº¹~:õ¯ö\99Ô7\1d³©S\e½´\ f·\ 6éío\ e³\18h\8c³ßU\9fâÚ»RíÕ]\9dÇí\QÊo+¯\11®/]%n.Y'k*Ú¤XU¸MYW0\10Y\9b?\1cU\93\7f)ººàaDmñ{Ùg¥\10Õ\95AP_\ e¾&¤\90ýç²(T°¨ûõLêf\v\8bºÖ¦C\8dn\9aA\9dÛlM\1dÛä¡õU»`Ö`«Ü|wóB»mMIs»\e2<;?Ëån¨-ö_[])XSY/^]Ñ,­+oWÔ\96~¡¬*é\8f¬(9\18]Vr\9e¸\17UQþ.´r\ 5ÄÕ\95\10ÖT\81¯    iä\1däiQo«hjl5M]_§M:Ï4êÒç:ÔÉ-\96Ôp÷|æ¾®\0ÝþöP³í­Ñ¶[ZT.\9dk\96zlX\9d½ ¥¡Ð¿©®Bаò¿l×iT\93W\1a\aðç}\13"      a\89Q\8b(\16\94\9d\ 4\12\81\ 4B @Ø\91m( \15\11\91\82¢\80"\8a\ 2\82"PYd\15\17\16Y\ 4\8a¨\88(.P\ 4Åjg:\reÚñLm\v8§§ËÈ¢õTE\81g®Ç\993=a>üÎýð~øßsïÿ\9eó>9î\87²
\ ef\96ûí?pfÃÞ\8c¶ Ý\19=!)\19÷B\923&\82w\1füÝ7-\v\95éÙèºï\10:«Ã­\1cÀT\1a~!3ß·\85\14\8c\941áó\1a\16\fײ ¿~\ 5\­·bt\9eqÒj©ñZVW\19dx¢,Ò¬¬d\8b°èX\82]~a²ãáüt\97¬¼,÷\8cÃù^é¹Ç}w\1f:\15\90\9c}.()»;x{ö\9d\90Äì\1fB\92r\9eû%\1fFeÊ\11\1eA¹:\8c']H\ 3x\9c\vðu\11E:À\80áÓL\18\84ëM|èj2§Û\1a\86Z%ÿä©ÀÕåÕá&E\95\9b­óËâŹ¥;¥\99ÅiÎû\8f\1dtK+ÌóL)(ñI:Zã\9f\98×\1c\18\9f×\15\1c\977\18¼5ïQp|þo~  \ 5¨Ü^\88\8a¤B\94«ÃD&¼Ø\ fð}\1e\80ê8\99ûjh¸]Ï\80\eÍ4\nåAG« ÝÔb¯yºÑ\8dWYïoP|&lmþ©M\9695q¢\83U;\1cöUì\96í.ÏpÝu<×c{i\91÷GÅÕ~[\8b\1a\ 3b\8a.\ 6n.\1a\b\8a.z\18\18SüÔ7¶dA\19W\82\8am¥(W\87I\0?e\ 2ü½\10àÏ\95@:@ÁÍF
+ºÛ\0:Îë@Ëycª¶C̪nsÕ-9ç«\9fß\14j\94s6Êü@}¬pomâúÔÓ)Ò¤\93ûä        5\87\14q'>Vn©ªôÞTÕà\17UyÁ?²²? ¢òë\80Ȫ\19\9f\ f«æ=¢«Ñus5:«Ã\14\80\89\1cr\ 6%\0÷j\0ú\1a\0®\9c\ 38Of\9fæ.-¨»lH\9dè²a\96^tæ\16tz/Ïé\bZ} =b]Zëf«ä\96\1dÍ;íã\e÷:Æ\9eÍ\92G7\14(¢êË=Âëê½Âê:}Bëú|BêFÉ:í\19V7ç\16^\87ò\88:\94©{\96Nºx\14àó
+\80Ûµ\0W\9b\ 1:?y\9bOæÏ^\16T]×\87Ò^+FÁ5);§Ç\83\97ѽA\7f\aïﺴÉ4ñB\9cU\ç\ eÛ\98ó{ì>ìÈ\94F|rT\16Ö^æ\12Ò^ç\16ØvÞ= ­Ï# }Ô# mJ\11Ø6'\ fjE§àV\94ªû\91ÜÃH\11À]r\ 6×\e\ 1.\92;h¹HæO2ÿ\95õÓpl`)\1c\1d0¥²?µcíïWh§öù-Kº\19jðÑ\8d¨÷c¯Ç\9aD÷&Zn¼\96*øàê\ 1QèÕ<»À\9eã\12ÿ\9eZGß+\1d\9e[2¯\9eQ\99÷\95)'\9fî9\89O7Úû^F;uß\91.> gÐ_\ fÐEî µ\93Ì\9fdþ+¿\ 5\90\80¬ûÚpàþ\1aØ{ß\86\91ü\99L3ñ\9e\97NÜp\10\7fóp\84~ÔÝ\18Ãð;      Æ¡wRL\82\862,\ 2\86\8e\ e\96
\ 6km\95\83\1db÷Á>±ûÐßÄî·§Eî\ 3ó¶î\9f¢\r!T§*\ 6\18<M:Ð\ 4ÐÞ\ 1\rPq\13 `\10 ó\ 1\13RGØ°st9$\8e\9aQÛFí\991_¹iF}åÏ\r\1f       Ó\v\1dÙ´,hd\9b~\80jç*_Õ¾5^ª\#\ fUéZ7Õ\19\13WU\87\99\Õg&\1fùÆLþå\8c©ó_ß\98:\7f\81¦Î\7fYl¸\1a ÷,y\ 3í\0\r¤\ 3\95×ßå\1f|\0\90ªbBüC6Ä\8cñ`Ó\98\11D\8e   é°q\193dÜ\93µa<\88í7\1eÉõ\1eߢ«\1cßÎs\1fßÃw\1dÏ^.\1f/zO6qr¥ãD\9b\81\86\81äñ\97\ 6\92ñI\ 3\87±Y\ 3û\1fp\95ý÷\8bÝ"wÐÙ
+pö\ 2@U/É¿ý.?y\ 4 î!\ 36>Ö\84ð\7fñ!ô\89\11\ 4>±¦ü\9e8Ð^\93®L\8fI\1f\rÅdð\12\97©\8dlÙT,Çq*\89+\99N׶\9b>¬³~ºLW4Ó g3s\89'|:D\8cñ\ 4ÓÏx\82É\ 5\9eà ê©»Ô\ 2ÐDÞa5é`á\0É¿\ f°\8bäÇþ\ 3 |\f è9\aü_òÁû\95!(_\99S\8aW"ÚyÖ\91v\9cuc8¼öaÚ½\ eÖ\10½\89Ô°y³\85e=·c\89å\º¦ù\\1eÛt¾\82m2ßÄY·ÐÍY»pOË\18\8cç\7fã\18ÍÍ-ÒBÞa\réàÇýÿËßò-À\9fÆ\ 1|\7f\ 1P¢&(P\ f\9cq%HÑ\18ìÑ\92\12¡\88\12¢\94¶BWÚ\1c=iS\f`¬Å0\86\11F3\f1\81¹
\98+ñ°Æ{X®±\ 2\eYËñ2k\19\ e\11\ fY|üu\91S\97\ 1\8eõ\91þ}ö.?æ\11\ 4\80çO\0òß\81ä2Á\ eµÁ\16ù`\8d\ 6`Aöa\8aæ\941
+©5¸\9eZ\85\8eÔJTP+Ð\9b^\86\814\ f#h=\8c¥up\17ÍÅ,\86\16\9608XKt0ØØËÐÄ»\8b\14\937\905LòU$ÿ;\80à\7f\ 2\f \99\ 4\10#\80\800Ç%°\ e\b\97ÂjÔ\a}4\84åd/KÑ\fôP@é \98ÒF)ÅAWJ\13½)\r\f¦(\8c¢\0\13\88t"\8f\ 6¬ ê\89öEÐÆ\96F;\ 1\8dR!\8d\8e"²J\18h¯`¢8\80\85\e\97  A\13­ÒÙhy\84\83\16ǵÐâ\14ÑH´sÑü\12q\8dè'î\11*.Z\8c\91o¿\12Ï\897\ 4rÐò\ f\ f\11É\96XÑèD8ÛÐ(³g £\9c\89\12?\16ÚE,Añ66Úîá 0G\v\85Å\\14\9c êµQÐJ\ ®\10·´Ñú\ eY¿ \1e\11?\13Ï\88×\ 4r\17\84È\9dÿ/\ 1j©ÃõÖ\14:YÐèB(È>\E\ft\911QîÍB§0M\94ƲÑ!Y\ví2¹¸¾P\eÅ\15äèÏ\10ͺ(îÐEQ\17ÑK\fè¡è\ 1ñ\rñ£\1e\8a\16ijºoĨ;K¼\12£ÎËÿx¡\ 6\1d,(\94\9bRèfB£Ò\9c\100ÐSÊD\ f%\vÝ\825Ñ%\9a\83Î;¸è´_\e\1dótÉ߸\1eJkx(i Z\97¢ä\ 2ÑÃG\87>b\98\18áÏ9<æÏJ¦ø/$/ùÏ%È\7f&Á¥Oß\92"oæ\1d½?B§·ùÆ\14z\19Qèóo®Ë3ªÉ4\rÃoh""£\14\89 U\9at\12  %\84\84\10\10\10\10\90Þ\ 2\11\10\b5\81@\b\12B\v\11\91¦TY\ 1ëX8¸\ e\1d\e;zгë¨c\19ûX\8fÈè¨<ûÎ?\97\1f×ù~ÞÏyïûûqY«Aè:5\b\ 1¡tM\bÞ¨\r¬D\1d`f/\a\86ð\að¯^       4\85>ÐÚ\r\17üz\8d¾ù\r\19\8e­ú\8bzÈø3uÒø\13õ\8cñ<õ
+q\8ez\97ø\8eú\92ø\9a:O|I\ 5ãç~`üÌ\ fV=¥\81Ñ\13\1a\18.\ 6\ 4`\99\13 t\r\ 1"ð7ÊN\r¢q\1fQTM\88\fÖ\86\8d\9b\97AH\86\1e\ 4ç¯ü\12$2øĪ3\9a\ fl5\9ecî ~\bè[ý>`Äô-c\9fé\eÆÑ5¯éSf\7fÐÿeþ\82~Ëü     ý¹Å#Æ\9cù}Æ\82Ù½\00½Ã\ 4\93ÛL þ\97 Æ\8b\ 1\86\ 5\ 1B°çF\12     \10cJ\80øµj\90\88ûHÀ}Ä1\97@LIJÏQÉz\1f#rôß\87\17¯z\13VMü#¤ÁôÅ\ 6\95Ù³àn\8b'A\ 3\96¿³F­\1f²\ e­}\10xÜæ·ÀiÛ»\81×íþ\13øÄn\96õÁæzÐ\82õL0X^Û\0æW6À\9aË!`º\18`áÜðU8ß\90\0\89ø\8e4|\13\eï3\9d¤þ-\8d¦5\9f\1cªó.!î\87\97q\1c\83§1\ 5ÄGQ\15kîGÊ,î\867[ßÞ¸ÝæVØN»ÙÐa\87\e¡{×ý\12rÔq&ä¤ÓÕ\90ËÎ\97Bî;_\fyë4\1döÕáìF°=\13\ eÖ§#ÀòT\ 4X`Ì¿\a6àÜMØ{ãW"H7BÀÁ\9d\10\16²]Ôæ²¼5_g\ 6.}Ê\8eÖ{\90\9aføk"Ïäf|±ùõØ*ëk1õvW¢Z\1d~Þ´Ãñbä.çó\91#®ç"\ e¸\9d  \9ft?\15>í1\15>Kúgø\v\8fÉÈO.\13Qàx,\1aì\8fÅ\80ÍÑ\18°^\f\84\19\11`3ÎÿÛù8ú\bxÆØ»,\bó|\aÂ+>Iýq®ÿ\92»Üðå³\9c\19ö\16ÓK©\ 5\96\17\92ËmÎ%Ö8\9c\8eop\9a\8aks=±¹Ë}2f\804\113J>\1a}ØópôIÊ¡¨«^\a¢~÷Ú\173GÞ\e\v®ãñà4\9e\0\ e\18ÛÅ@\84\ 1\82xì{ìåØ;W`ç2@_\8aV£·BkÂc¡³Ú\9d"_Í\eù!º\97\86ç³Ù¦§9<«\9fØB»É4±ã±\14\99Ëáä&÷C\89íäý   ½\9e\87½Æâ÷{ï\89\9bô\1d\89»H\1d\8e»G\1d\8c\7fç5\98¸@\1aL\ 6×\81\14p\1aH\ 5\87Å@\14~\83$ì{[0||GÑ
+ô±Ô\0=/7A÷*l    7Ê)\1a\97\8aYºç\ 4Q\86\14ÓÉ\9c,«#Ù\ 5ö\a9eNû2$ncìzÒ?ÒZ×ïNÝá5\98ÒïÓ\9f<JÝ\99t\84Ö\93tÆ¿;iÖ¿3ù\15µ3í\8bgW:xt±Á¥+\ 3\1c\17\ 3\83Tì{Ü¥\b\ 4:h¾T\17½\15é¡\87Uúè¦Ä\12]©"k\9c«\bXöSi\84ÁDQ¢é¡üL«½y¹ö£9B§ÝÙ"·Á¬Zr\1f§\91Ò\9b¹Í»\8bÝKÝ\91¾\9bÖ\9e~\90®J\9bb(Óf\ 2\9fÓ\95\99\9f½\95\1c ·e\81;ƹ-ûÿ\81¸¿{ÐB\90«\85æ\8aµÐ#\91\16º#Y\8anKuÑ\8cÌ\f]\90º«OIè:\13¢\8dú\aËâLÆ\85éV#\ 2®Ý`¾ÀiW^\99[\ f¯\9aÜ\99SOÙ\9eÝê£ÊêôkÝ2èßÄÙÇPd\1egÊ3/3ë9\8f\ 3äY\7fR\e¸à©È\ 1\ f\ 5\ f\\15¹àò=\90\80;ÈÔ@\vùêèq\19\ 1Ý©ÒD³µÚèúV\1dô³Ü\ 4\9d®wQ\9f\94ù-ý±:D\7f\\1c³zwy\8ae\7fÉ\16»Þ"¾S§ Ø­½@LnãË(-¹M¾\8d¼í~ò\9c>z\1dw, \96;\11XýÈ\92p\1f\ 6Öð>úIóÀ«\96\ fdY>¸-\ 6\92\96á-\10Ð\!B÷E\bÝ\94\7foÕBW\14Úhº\91\88N(\9cÔ\8eÈ}µ÷É\82W\8eÔD\11û+\93,z*2m;Êx\8eª\92\16a\ 5¹±°\86"\174øÖå«hR~/C\92·\87)Î;ªÈ\9bf\95çÝc\89ò?ø\8b\ 5à]Y\bë«\8aÀ]²\bHÑÆ[@èY1B¿Vaß©SG\97\15\9aèB³\16:Ùj\84&Z\1cÔ\ e4y/Ù#g­\18¨\8b$öH\13Ì;$l\9b61×±¹¢Àµ¡¬\94TW*¡H\8bë}$B%M\ÔÍ(/ÜÍ,\11üÈ\12
\ 6\15    n\a\15\17½§\97\14\83OY     x\96\97\82Çb íï- ô\b;ßÍj\84®ÊÕp¾\ 6:£ÔDÇU\ 6è°Ê\8e0®ô\2ÔÌÔÛÙ\10¾ªck\9cY\9b,ͦ©&k\9d\Âw\91U\16\93ªEbÏÊ\8a:\9fòò\16¿\92²NFQé\10³ ä \8b_r*(¯äVP~é[\86 |Á·°\ 2(B\11\900\1eß\ 3l5ôg>B¿U t]\86\9d«\91\80Î*ÕÑ\89vut´c%Úß±\960ÒNÖêkc,ïl  3R5n^ÓÔ\90b]¿\95ãP+Ëu\91H\8b<D5\15\9e¥\92ZoaU\93\9f ²\83Î\17\ f0y¢ý,®h*(Kt#\88+~ÃàU}óÍ«\ 2
+_\ 2¤Å@&B/ñ\16ncï¼V\8fÐù\16ì}í\ 44ÑI@\aºõÐ\9en+Â@\97\87fw\87¿î¶m!\86ÍmѦõ-IVÒ¦\fû*E\8eS\85\à^R_¶¾°®Ú\8b/SPyµíþÙÒ¾\0NÍÞÀ\8c\9a\13,vÍ/¬\fé+\ 6§ö«oV-P²e@æÊ\80ô=\90\85Ð\13¼\85Ù\1aü\ 6
+\84\10\9aìÄîÙ\8bÝo\97.\1aê3G½»\5¶÷RuZº\82õå;6­\96¶'XTªÒmËÚ²\1d\85­ù®\ 5Í%¤Ü¦*
+·±Þ\87Ó ¢±å;é©òñ\80dùqf\92ü\1a3Yþ\92\9eÚðÅ7½\ 1(l\ 5\90\16ó\8d\87Ð\83r\84\10\9anEè\ 4v¿Ã8\7f¼\1f¡Á¡¥¨wØ\ 4u\f9©·\ ezkËû\ 3WHw\86\e\8b{bÍJ»S­\8b:·Øó;ò\9c\vݳÚÅä\fU\9dWj\9bÒ7IÙKKP\8eÒc\95\93\8cÍÊ«\8c\vZ¼ò/\9f\ 4%x&µ\ 1      ãñ=¯\vp\ fø\7f¸\84ßàÔ6\84&z°ûáüáa\84ºG5Pû\98\11j\1d³W\93ÿ\8fð:\ fjúL\ 38þür\93\0!\80\1c \87\9c\ 1!áH\0Ã\8d       \10nA\14\11¡x_­N=ê²»®Nm\15ÛÕÕÚÆ»\88 T\10<PT\8a ¶
+ÁêV­.`ÕjåÒâ-\18Ñ>ûd÷\1f¥³³\7f|&3ùeæûþÞ#3ï¾0ÞÊÊx«\92=©öKvçH\17\96å»ÏÛUì=kç\1c¿i;\16\ 5\16m_\1e<eë*Õ¤-\9f\87OزE\93\e\95e8\1a\9di0\92¾È,\83)<Û\80ª\1c\ 3\ 6\8fÔCëðãªÿÎÁ \ 3@-Ý?+¨¿m\1fÀ\86ZºÿÔI`u\9d'³¢6\84³ü@\8cpqu²Íûû³\1cæ|\93'\9bQUäþÞ¾YÞ\ 5\95\1fÈ'W.\vÈ­X©ÌÞ³.$³Ü N+¯\fO)?\1a®/o\8bÐïî\rKÙm
+M-Ãà´2T\12ÅÛn\96\0\18×\04}\ 1px;í\81Ý\0;©¿é\0Ý?\8f\0¬h°\82\92\ 6WXÖ\10ÈZtLÃ\9b\7fT+\9aU\9f.)>\92ë0õp\81tò¡\19n\13\ f.ðÈ>¸Ä'³n\85_Zmé\18}íW\8aÄÚ
+¥®¶>H[Û\164î@o\90¶Æ¤ÐÕ`\80®\1aýGºLspf=À1Z\83ýe\0\ 5ØLýRs\9fî`\1f6ó`aË(\98ßâËÌnQ±§5Çñ\v\9bõ¢üSÙâ\89§òí²\9b\8a\1d3\9bæJÓ¾ýÐUÿí_Ü\13\e×z\8eküÒ;¾q\8folc½oLc\eéó\8d9aò\899\8eÞ1\rè5Rk)íC:\a\aÌ{ \12ÀP\ 3ð\19õW\9e\ 4XÒÂÀÜó\(n·\86¢vW(h\ fdòÚDzsÛµÜñíé\82\fãDQª±Ð:Ù8[¢3.²O0\968ĵ}ê\14ݶY\1aÙ¶G¦1Ö»\8c5\1a]ƶõ¹D´\9a\"ΡKø÷\7fÔ¼\89ÎÁ\ e\80Ê
+\80­Õ\0\7f§þ*ê/=\r\15 ð"\17&\\15BÖ¿l!£Ã\13Ò:\82!¥#\9a\95Ô\91ÄÖufq\12:'óâ:§   ¢;\17\b#;?²\8cèüØ:¬k£XݵÛ&´ë°$äF«$¤«W\12Ü1h\e|\1dí\82~ú£zó\1e =¸}?ÀúÃÔo¤þ\19ê\e\ 1¦þ\13 ç\1a\eô?\v ±Û\16´Ýn\90Ð3\ 6b{Â\98¨ÞXFÓ\9bÌ\8aè\1dÏV÷åsBû¦s\83û>à)ûKø\81ýk\ 5\ 1÷\r\16þ÷«\84\e\85ò\a×\85òþÇByï\e\vß\1e\14\8eô\8dy\ fV\ 1üã\10ÀÇæ÷?Kýv\80\82Ë@ï\ e\90x\13 ö¡\ 5D?\95\80æ\99\fÂ\9fù\80ú¹\12B\9eG0Ê\17qLà\8b\7f0\8b%\1fÌcù\fMc{\r½Ïöxùg\8eûËu\1c7Óv®\8b©\86+{u\9a+}u\8b+5=åJ\87Þp\9d\añ\1d_\9bÏÀA\80ÕÔ_Fý9\17\0¦\\ 5Èè\ 2\18w\e`l7@Ø0\1fèÊ\bJt\80\0t\a\7fô\ 5\1fT\80\17ªa4F1n¨ed\98Æ8ã\ 4Æ\ 1\vYö8\9fe\8b\7fbI°\94e\83ÛI\rÛ\1a\9bÉ52@\1e¿cs\1dÀ'´ÿ?2÷\7f þ5\80ô\9f\ 1âîP»\a\1c`\f²À\17\94\11\15\9cÑ\v\1cÐ\1fì1\bl1\fl0\ 6¬1\91±ÄLF\88\93\19>Îb¸¸\94aã§\f\v\r\f\83û\18Àcä<i\7fÇ\9aã\0ËÍëoîÓܧݢ¹¿\a\10Ú\ f \1f\0ê\ 2¸\13\19\11-©i\ 3\12´\a1:\81\15\8dE\84\9e @?à¢\12X4\16 ±\0&\93\1cRDè\8f\18ÿF­\rd\aÙOjÞ\81c\14\f*\ 3\18\f6S²P\19ÆBÿ\186ú¤pÐ+\8f\83\1e3¹è¾\98\87®+ÉgäK²\93\8f.\15¤\9a\1c&'xèÒB\8cä:=ï&\8f\88\89\8b®øÿ\ 5\9aÛ~\fªÌ\ 2X\18\12ÂBE$\e\ 3\92\97ËEßi\ô^ÄCÏ¿òÑs-ÙÄG\8fm¤\\80\1e\8e\1c#Mä<}\7f\99Ü¥ß\r\90!\82¼7äõ[\86G@¥¹íÃ`8\89\903\18¦`¡z,\eCu\1c\fʦ1\16ñpÌ\ 2>ú/ç£ßj\ 1Ê×\13\83\ 5Êw\91JRC\8e\90\93ä,¹Hn\91\a\16¯å\83\ 2\93ßï\82!?\14\f\92\17ÿ\ 3\86\9aÛ\9e\fFz0\18åEüY\18¥f¡&\9e\83á\19\TOáaÈl>\ 6/\11 r¥\ 5*×      Qù\85\10\15ÛD¨('U¤\8e\1c³DE³åï
+£å°¢Óò¥¢Oô\ù\ôDù»è\91\12E\ fÉ\0ùM\89Â\910\8cúQn\fƹ2\18ïÎà8_Bë\11\1fÍÆX=\17£&òP3]\80\11\v\85\18^"°O,ߨ×[½V\7feõJ½ÓÚ¤ª°\1eRU\8b\aUGÄ/T\8dâgªs⧪+â\87ªnñ}õSq¯ú\8d¸[\8dâ{j´¾\eö\1fVwF@\8d¹/ePëÄ`\12}¦Ð\¤Ðzèi=\12u\Ô\8eçc|¡Åpì<ÑË\98¥VtS°~\16U*~\12µÑæQäVÉ@d\99ío\9a}v÷5uvý\9a\ 6û^Í\19û\1eÍ¥Qw5¿\8eº¥y2êFäkû\8eH´»\16\85¶WÉ\95(\94\10\9b·a\8c\8cú\ e\80z{ÀtG\ 6³h.ÆÓ\1eÉR±0#\8e3\9c\9aÊ{\91\9cgñ$i¦å\80n\91u¿¶DÒ;nµÝ½\84ÏíïÆovø%n\87ãí¸=N7c«\9doÄÖK;bOI¯Ç¶Ë®ÄÞ\96]\8a}$»\107,5Æ£Sk<:\9eOÀQç\12Ðþû\11\91\8e³-õmèHÓ8&É\0ó¼\19\9c¤d½ÌÕ°\9fd'ò\1edåXôd\14YÞI\9bgs3e©]§~\85õ¤5NW\127H\7fL4¸\ÒírýA·×­][ëÞ¦m\18}^û\9dÇ9íU\8f3Ú~\8f\90{S"º6&¡ìd2:\9fHF'âø6ÔQ7\8dúÙtïÌ\93\0\16Ð\9c\14º\81©Ð\8fyT bõæÇq~ÉË\10tåæ[]Í\99i{iüB\87öÌåέé«\Î¥\95º\9dMÝ8útê\16\8fæ\942¯&}\95w£þ\90Ï     }\93ïqý\ 5ùÑä_åGR\9eù\1cJEϺ4t¯KG×Út\94Õf ôm\98LÝ,+z\7fºwN¥q\14ÛÂ\9béNðx\86\aôL\ fdn\15\7f*Òó/\16äZµN~Ïî»Ió\1c[r\17ËþMu¹G5}\9eqüI\0\11\ 5\95K\15\15\14\84@H &á\1a8L¼ \16\ 1   \17Ã5!    !!!!\81\ 4B\ 2\ 1Â-\ 4D\ 2Èý~\13\10A\14\10§u\bØ\1e\ 1γ\9eÓMízº®ív<gGÛ­[÷îõ¿ô\8fÏßÏy¾ßçý%\9f\87ɺc÷ÙFï\95$³ÏÒe\véNb¯ÿí\841ò|ÂMÊ\ü
+u6~3p:þ\8bÀ©\847\94\89Ë?ûM$!\9fq6ò\1aOFÇÆ\92\91§5(n?î`\ f L\a<\1f»§h\1f¼\13;Ãß$îðg±/ìä\87\12\9få\9d³ßà'9}ÄÍr½\9f\9dç¾\9c)÷XL×xÍs*}æÒêH3©-ä\e)\9d\94ÉäÁÀñä© QöâÉaö#ú {\9bÞÏþîd_ÊO\94¾4ä×{\ 5ù`¼{9è¸5(\ 1g\90\86}/Ç\ eþ\93g\ fo
+\1cà[\99#|Yx\0\9eË\8fÁÓB\ 6q]\1acÿ@\1cï´\9cÇq½ÍÏ=<Ç+ð\9cÎQyOfk}Ç2«ýG2\1a)\83ém\81ý\9c\1e\951zWÚ\1c³3í~pGÚ³`KÚ×Á\16Î\8fA\96\f\14`ÉD$K\16òÁx[\83.ãÝ9D@|"|'!ÀK¹-|®Ü\r/\94{áÓ⣰®¢\11\7f]\14½k©ðC§ù\82\19qÎá\89<\91ç¨@î=ÈW\93úx\15ä\1en-õzNsP{V'½-k\88y5s:¤9c9Ô\9cñq\98)ãË0Sö[º)\aQ\9b¸\88ÜÄC$\8c\8f5\88\8d\ 4x\87}ë5öÎ?ªl`K½\v~«q\80ÍÒCð°\94BXRGÚÍ«Î;ÞP°]Æd\99îC\ 5\ 2Ï>q\81w\97HEêÈÓ\92Û\ 4ÕÔ«|\13­9×Â0ñú\82\e¸\93¡µÜ;áFîzx5÷O\11Õ¼\7f\ 6×ðQ\90Q\80\ 2\8cBägÌC$kPÊû\1e\0¾\11\ 3|\81½sKM\84gZ;ø¸Ü\1e\1eé>\80\15\1d\99° \r·\9b.=·w¬$Ñe@Éqï\91ó<;ebï6©\82tU¢!\9bÅ\95ÔFQ=­.¯\95Q#ì\ e©\12\8c\85U\b\16"t\82G¬rÁ\vV¹ðM\88Nô¿\93ú|D­\10#2ÆÏ\1a\94f\83o\11à+)À\vì;\9fi    ðDo\ 3k\95vpßà\ 2\8b\ 6\12a¶2Ôv\wzÏ`Y¼s·:íP{q\8eG«2Ïˬ\90ù6\16\16\93ëd:j\8dÔH3\1443ôâë!ZñHXiþ\\84:ÿ!«$\7f;²Dü\8f0uÁÏt\8d\14\ 5\96Êð¯\9f\fù[\838\0?\b\ 1^á¿\1aÛ\1aì|Øû\1eW\11áAµ\r\1c\80\ f\86i;d8åУ\8f;Ð^\9erðjiÖÑ&µÀ«¾¸À·F¥ô7\14\95\8a*\9aVnbh
+ÛCJdCáJé,K!½\1f)\97þ.R.û>¼Hþ_\86R\81\82T
+DQ\15!²5(\ 3à{\11îA\89½W\v°iÀÎe$ÀJ\1d\ 1æë÷Á\8d\ 6/\18©§Ûô\19£wwT_ÜßZÉþ I\9fq¤®<÷xu\99اB£ð/Wk(¥%\95´\92â\ 6\86\16"W\ e\84K\8b¦Y\92¢{\91â¢O#ÅÊoÃ\vT?1eÅ(¨°\ 4Q0dkP6¾\ 5        î¡\ 4;\1fÎ`Í\88½\13»ß"v\9f\99&'\183{Â@\13\8dx½1ÊþZ}ì¾&ãe·ºjÎá*\ 3÷\98¾BtB«/ôS\97\97PTZ}\90¢¬\8e.+m\r\96húÂDê©\b¡z\99ÅW?\8dä«¿\89\10\96þ\9b)*E´ü2D\15\97¡\0k\10\ fß\ 2~\ f\0Oªp\ 6õ\0Kfì]-\0ã­{`°õ\bt·R\89m-\11»Ìæ³\8eu\8dñ.UõilÏR£Ð»¤ZJ*ªR\ 5\14\1aÊ\ 3%\95Æ\93¢\8a\16¦@ß\13ÊÓM\84çèîFdë>aeë¾\ eçêÿÅäé\11\ 2\15\9aw\ 2\80\97ø=|¦Ã\19Ô\ 2Ük\ 2XhÅÞ\83ýk°}\17tw\1c\ 2K\a\99ÐÜ\1efWßvzoUk\9c³®%ù Æ\9cyTeâ\1f\977J|¤\rEþùueTam5-×hfäÔt\85\8c\87¥Wß    ¿Rý\ 4óUXzÍ\8f\8c\8c\1a\14\94eD\14L\805\7fÏ\aø\1c÷ðÉû;h\ 4¸\8bçÏ´\ 3\8c`\aíê!@[¯+\98{}    õ=LÛª®_9\94w^ܧîHr+²p\ eËÚ¸\9e\92V\91wÞU9)·ECÎi6P3Í&\1a§©\93\91Ú4\1a\9c\1dÂ6m\84&\99þ\12\92\81\9ebB\81©&\14\90fBdkþ*Ã=à[\\7f\9f\ 1Îÿ\16\9e\85Ý\ f;`ë\10@ãð\ 1¨\1dö\ 2ÃðI¢v0ʾd ÖQÑ\9fà\Ð\9bvPÔ\93}\84ß-<Æí\92zg]/&q:+È©\1d\rTv{;-±}\84\1eß¾À¸Ô¾Î\88³¼fÄ[Þ\ 5%X\10\r\911~Ö¼Äïái%Î\0wp\aÏ¿Ñ\8d\aè\18\ 6h\98\00L9\82nê(h¦(\ 4åT¸máäi\añx\9c\93p,Ù\857\9aq0k\94\7f8}Dâ\99:¬ôb\ fé|\12\aëü.\rZ\ 2.\ e\f\ fÌ\aÆ\ e<Ƽ¢Æö¿\r\87ü/ô!\12Æ×\9a?\94á\fê\0\ 1ÜÄû\8f\ eà\ e°\836O\ 2TÍbÿ\9c·\83¢\ 57(\ð\ 5É\ 2\93\987\1fmÇ»uÞ!kî²SúÜ\15çÔ\9b\7ölþ¡ÄYÅ\91K3ZÏ\8b3µ^±Ó×N\9c\9d\1eô==}\8b\143½F:5ý\8atjê­OÌ$:\81ñ\8e\99@^Ö<Ãwð \19ß!î\7f\ 2ïß;\8a\ ej\9cÃþµ\b ]\ 1\10®î\ 3þª'pW\ 3 \99«\11DÎê\19»\94ÕK»\93î¥ìM¸\97µ/nExàÂ\8aÌõܲæà\99å\1a÷SË­G¢\97\a\96ç<"\97×<Y˯<Xwßz°î \ fÖ":ʺýK\1eãoÁR\aî\0÷?\80÷·Ü\0¨¿\ 5P~\17@\8e=Tð\11\ 1®¬ÛCÊ\86\e$oø@Ò&\9d\90°\19E\8cÛ\8cµ¹°\99h\17»É±?³Ás\88Ù\90ì\8dÞ(v\8aÚ0ì\8fØhq\ eÛèw      Ý¸é\1a¼±\86\1aüø\9d+s\r¹1\7f\83Ü\18\8f~Éj\eî \17`\18ÏïÀó\eç\ 1ôK\0\8a\axÿ5\80ô'\ 4Hxf\aç~ï\b\ eÁ\99-\12Äl1áÔv4!zû\ 2!j;\89ÈÚÉ°   Û\11Ú\86ì(ì\98;:{ú\8ei7m§Ç!èù\8cCàóG{þÏw\9d\a5uoq\0?÷Þ$\ 4\b\98\10 \81\90\0!¬     j\ 38\ 1*\8b\80\80,\ 2²É¢\b¢Vi\v¯\8e¯\1dt¤¢ÏZ\147´¢¢ V\\8aÖ\8aZµ<\17lÝÑ":UëcQ¬\16Td\11+Ëy\87\99÷\a8\9d÷Çg&\93\99ä{îù\9d{\7f÷§»Ól¬ýµÇÄãÖ°©{\ 3\8aÜo¢ÙhG¶\ 1ì¡ùÛJý_CùK©÷\9fÖQ~=@Ê\15\80è\9b\0S\1a9ð½o\f>ÍbðnV\80¾Å\15>hÕÃÄÖÉ0¾-\1c<Ûâ\18m[\1aãñ8\97u{\Àº<YÎ9?YÏ9µWñÔíµ<Çö\9b<\87'\9d<\87\ 1\9e}+òí[ÆÚG÷ß6\9a¿\12Ê_Fùùÿ¦ü_\0\92¯\ 3\ 6\bº\v0éw\80     íFàùB\fÚ\97rp\7f©\ 6×WZp~å\rN]\1f\82cW\18Ø¿\8e\ 5ew*£è\9eËØô\14\9e/\19Yï&Öª÷[Ö²ï\f+í»ÇJ{_±\16Ý\83¬E\17\8e±\9dî¿u´þË)¿à\1cå_¦ü\ 6\80È;\0\93\1f\0x5\ 3x<\ 6péå\83\f\1c\a¥ \1aR\80Ý\90\1al\86ÝA6ü\ 1X¡/H1\18$8\rÄ\98\ 4æ8\aDø)#Â"Æ\ 473Ƹ\9f\11â\19Æ\b\9bH\a#À7c¬§ù/¢ü\7f\8cä_¥ü_\ 1"~\ 3ð\7f\ 4\8d²\9f\ 2Øw\ 1Ø!\80\r\1a\835\9a\83%J)Ï\ 6Æ¡
+ÌP\ 3¦¨\ 5\83\0ý\81ÃP \17uB\9b\ 3\10éá\834t¸\97Р!5\19ï\8d±â\ 4Àg\94?w$\9f®=ü!\80_\vÀøv\0§ç\0¶/\0¬\86\0\ 61²t\8dÆ\94i\ 6B\14\ 3\8fjaPNÿ£"\1a¢%^d2\89\846\ 3¤\a1ÒF\88tóã\ 1rl\ftÖ2èæΠ;qÓ1è¤gPåÏ¢m8\8b²$\ e­²9\94æsh±\94¬&\eI9©$Õ¤\86CI-9K.\91\ 6ÒL:X´xC\86  þ\7f#ùZ\17\ 6uD;RÇ\ 4\ 6Õ\ 6\16\1dBYT&p¨\98Í¡<\8f\17<\94­$¥d+\ f­+È>r\88\1c#?\92ó\1cZ_#\ fÉ3úM/\19â\ 6\ eÈ\90\eñîo \ae\8fwbp\82\9a8S-Ô\17\ f\1f\16]\83YÔÄr¨NçÐa\ 1\ fU\8by¨,"_\93M|Tn'U¤\9aÔ\90Zú¾\8e\&M¼aåSÞ\80²\9bׯ\1aàúTÈë%=ÿÓý\1e\1cOÙz{\ 6½U\fz9ÐgªIOë1!\80EÝ4ª1\85C×¹<tÉç£s!\1f5«H©\05[I\ 5ÙK\ e \86\ 4\83\9aÓ\82\ 1M½à/Í-Á\eÍcA·¦\8bÿÒù\1dÿ\853
+:È\9fäùß@=eOR\0\1al\88\82A?ê\89¯'\83\ 6?\16}¦r¨OàáÄÙTë">z.\11\fé\8a\8cÞéÖ\18ý¥ÝhÔ¯-\17öiw\v{µû\85\1aákí       a\97ö\9cð¥öº°CÛ,üC÷RøD÷NئCã\16ò\1f\1d
+G<z\ fúØ\ 2úYÓ([\ 2\ 6Ê\0\83í     ÍE\907\83\93i=üb¸AC\1aÿí¤\A¯O\81ÑkïBá+¯\95Æ/¼Ö\19wèËL\9eëw\98<Óï1}ª?dúDÿ\83è±þ¬¨U\7fEÔ¬ÿ]ô@ßiv×ë­Y£\17\9aÝöBQ\ 3¹é\8d¦7Þ\83¾\94\1f`A¹bÀ0)`\ 4õ$B\ 3\18>\81\19\ eõgû§\84\ 3\13ù\9d\ 1Y\82g\1f.\12¶û/1nó_nÚâ÷\95è\91ï\ 6³\87¾ß\98ß7ì\1awÏ°_Üd8"i4\9c\92Ü6Ô[4\18îX\3<³¸ìÛoqÉ\17%\17ýP|Á\ fÇ\9d÷CósïÁÉ\94;e\1càT3À(ª#\96j\9an\ fC±îLo´7Ó\19\11Ì>\r\8fåµ\84¥\v\1e\86Î3¾7%_Ô\18ü\85ù­ \15â\9bA_K®\ 5n\94^\r,·¼\1cPiõsÀ\ 1ëú\80\v\ 1?ÉÎ\a\\97×\ 5´ÉÏ\ 4tËN\ 5¢õ\89 ´¬\rBéñ`\94\10ñh\18D¹SE\94o\ 2\18OuÌ\90\0&Ê¡'Q\rÏ\13<\99Ö8\7fæÁôH®1&ÉèFT\96é\95È\85æ?G|&¹\18^(=7µØª.¬Dv6l³ütèv\9bS!{lO\84\1c\86\9c´û!ä\92òû\90ûª\9a\90\17ÊÃa\83\aÃP~`*Z\13«êp\94\8e\86¡æ\80Ó\84\80qtîL¢:RÍ \7f¦\ 4þL\95Cs\8a\ 6\9aR|\98\eI¡¼_\12ã\84\17\12ÒEuq¹âÓ±\1fKOÆ,±®\8d^&?\16µÊöè´u\8a\9aÈ-ÊÃ\91\15ª\83\11û\1dª#¾wü6¢N½/â\96º*â\99º2ò­jw\14*vE¡ME4Ê\88õh\18n
+\18ÃÒµ³Ð\9fÆ\83\8eL#ø#Ó\14Z3Äp'S\ 5×2'2õ\19\81¼º´há©Ô\14Ññä,ÉÑÄ\8f,¿\9bQ ;\18ÿ¹mu\\91ݾé«U{¦¯w¨\8cÝæ¸+¦ÊigÌaÍö\98\1f\9dË£¯¸l\8dnsÙ\12Û§.\9b\8eöeqhW\16\8f¶D>\1aF\8eô\0\15 }\16À£l\ eîå\18\1c\13¸\96m\ 3\17stÌÙl\7f®6+Bx4s\86èPz\86d\7fÚ\«½©yòÊ\94Å\8a\8a¤Bå\8eÄb\87òÄ\12õÖ\19\9b5e      \15Î\9bâ«]7Ä\1fw+\8d¯w_\17ÿÈcmB·KI"ªK\92PU\92\8cvÄv4\8cæÑ\f\0tÒ6×Lç\9d¦y\f4,àÃõùB¸8ß\1aÎ,pc\8eÏ7p5¹aF\arâD{çÌ\94ì\9e=ÇjGæ\ 2ù¶\8c\96´\7fª6Ï\î¸!uµSiÊzçµ)å®k\92÷º¯N>ê±*é\9cveò]]qÊ+÷âÔaMñLtX\99\86*b7\1aÆ2\80\ 3:óýF[\ÃB:ïäqP¿\88\ f?åY@íÇÎP\93çÃU/\9cbT5?F´37Y²-g\96UYv®|cV\9e¢töbÕÚY\85\8ek2\8b5ÿÊXë²2}\8bÛ\97i\95\1eËÓ¾Ó-K;ë¹4íÖøÂôNíÒ\8cA\97¥\99¨^6\ví\89\91\9b   Ð\9a\ 3ÐHùW?¡wý|\ 6êò98\99/\86#\ 5j8\90¯g«>   \14ìÌ\9bfúÍÂ\19âM\vÒ-KçeËKr?R|\95\93¯Z\95ý¹ã\8a9E\9a¢¬5.Ëfoú/Ûu\1aÕä\99Å\ 1üÿ\86\0²$\82FÙ!\10\ 2\82\bn\94ª \ 5u lJA@ö5@X\12ö­\ 1\ 1Y\14E#¨ ¢à.`Ç\95xZÇjUl«ÝFë2\9d©\8eZ\15;s¦nÔg.õ\9c\198g>ü>åäü\9fçÞû&ïu)\8fß1»$~¿»*þ¤\872~DV\14ÿÐ]\99ðÊY\95È$ÅILLl'báoûpk¼\ 69Àù\ 2@[D;W\11\87\81"!ö+í°»HÆÛ^à««Q\ 4\1a¶ç\86Mm\95G\8b\9a²\12Ìê3Ó­>Êȵ­NSÚW¦V:\96¥¬u.NÞà¢LÞæV\90Ôï¡H:.ËKº$ËMºï\91\97òr\96"\959æ§1{b7\11\8b\ 4\1eP\1f¾Ï\ 4.ÓÎõ\89\128E¯\1cCä`\89\0{JmÐ]âÎi\8a\17ênT\ 6\18\14\84\b\e\15«¦×åÅ\9bÕä¤XVʳmʲ\vÅÅYå\92¢LµSAF«K^z§\9b<m¯GVÚ1YfÚ\ 5Ï\8c´\9fdY\19Ï]²3\99T\9eÉ\1cäYL<Ñø,üD³x]\ e\(¤\1a\9fÊiï¬\0öV\18¢§Ò\12\9d\15®Ü¦òùüÖR\7f\83Æâ?
+ÕÊÈiÕ\85«g\96\17$Y\94(2m\94y
+qAn\89$/§ÖI.ovÉ\92kÜÒ³{=R³\87d)Ùç=\93²\7f\94¥È\7fuMËaND\92\9eËÄ\13ýJ³ð×TêC\1eÍ\81\8aj@Ù\83ÕÀþ\1a`g\8d>:kÍÐQ;\8bk«ñÖi¬Z2E]±\PU\16nZV\12=CU\9c`Q¨J·V\14åÚå\14ª$Y\ 5ÕNéùM.)ù\9bg')v¹'(\ 6\8as²8Å]Ù\9aü\7f»&ä3§Ä\ 2&I*`â\89FÇga¼\ f4\ag˨\ 6\94}\98öÏ=õ@W½\ e:êEh[+å\9aêæè¨ÕïéWÕ\ 6\19\95V\87\9a(«¢Dù\95ñæ¹å©VÙerÛ\8cÒ"\87Ô\92JiRqì5ªM®±ª\1e·\18å\11\8fhå'\1e\1f*o{D«þåºZÅ\9cb\8b\99\84\88'z\94\0|K}ø\8cjp\9avÏAÊß×H{W\13ÐA¯¡­ëLÑØl\ fõ:O^U\93\8fniC\80aÑÚ\10¡¢nå4¹:vfæGÉ\96iµY6I5\ 5â5Õå\92تz§èÊv\97¨\8aîÙ++\ e¹ET\9cu\ f¯¸é\1eQñO\97\95\15Lºª\829DU0ñD÷R\80/i\16\1a\1cWS\r(»·\ 5èl£üõÀÚ\rBÔ¶Û r\83\eW²~>¿°ÍoJnë
+ã¬\96\b\93ôu1¢ä¦D³\84Æ\f«¸\ 6\85mÌÚRûUõjÇÈúõNauÛg}PwÀ5¸n\98\1a¬þÅù\ 35s\fU3\ab7Ñ\1dêÃ%z\16\86©\aCtÿ}­À\8evÚ=7\ 1õ[\80*\8d\11J5\16Pjfqù\1ao\1dù\96Ez\19\9b\83\fS:B\ 5\89\9b¢Lã6ÆÏ\88iO3\8fÚ\90k\15¹¾Ø6¬­V\1cÒÖ*YÑÚ%]Öºß)¨õ\8cs`ë7Î\81\1c\83Z\98òf&^ÞÌl'ú\96~\93þLÏÁ  êÿ!Êß½\11ÐPvK'í^Û\ 1e·.\14\91Ó#Af\8f'\97ÚíÃOì\ eÐ\8fÛ\11l\18³=R\10µ-Ö4²+Y\14Ö\95m\16ÒYd±bkµuÐÖfÛ\0M§Ø_³ÏÞOsÚa\89æk\87%[FÅ~\9bßØúmf6þ\1dÌz¢\91ñ\1aÔÒ\1cPýû(\7f\9b\ 6h§U¤¾\a(¥Õ(«\1f\17"y\9f5\12öÍæâöÍåE÷/æ¯ê_¦\17Ñ\17f\10Ú\17m\1c¼7A¸|o¦ià\9e\ 2ÑÒ=\953ýz\9bÌ\17õj,}{û­Þí=eíÓ{ÝÊg÷¨\95ÏÎ7\96>=ÌâÝ\1ef>Ñyz\16\8fÓ\f\1c ü\1eÊßLwoÚ\ 5TöÑþy\80ö¯#@Ìà\14D\r\8a°rH\82\88!O.tÈ\87\17<´TgÅ`°nÐàJý\80Á8\ 3ÿÁT£Å\ 3y\82÷\ 6ʦú\f4\98.8ºeú¼£}¢¹GO\8a¼\a®\89¼\8f\8c\8a¼\ e¿\11y\1db"¯\83\93\9d¡\1e\1c¥u°\97ò·î \1eÐÝkh\1d+:\fd\f\ 1±´\8b\86\9eæ°lX\80 a\v¼¯uF\80v\ eüµ¾Ü\12m ·H\eÊóÕ~¨³P\9b¨;_\9b­7W[<ÅK[gð\aí&COí\1e#\99ö\84±ÇÙ¯\8c<\86\9f\1a»\9f~#p;Å\ 4n'\99p¢c4û}\94¿\8dò×S¾\9aî®\1a \1eÐ\1e\1a\7f\1a\b?K;è9\ e¾\17õ0ÿ\92     æ]²ÂÜËÎð¾<\a^W|1çJ Þ¹\12Æy^YÍy\8c¤òÜFòy®#Õ:.#\eøÎ#»øNW?æK¯~Á\97^yÊw¼4¦'ù\9céK.N¶\9fæ¯\9bò7R~ýA \84î\9e}\12XCÙáç(ÿ\ 2à{\19ðú\92\8fÙß\18ÀéÆTHoX@zS
\9b\9e\90üàC\ 2àp+\14ö·WC|;\ 3¶wT°¹ÓÀYßíä,ï\1eâ,î\9eçÌïü\833¿õ\823ÿ\81ñÌnN¶\93úßAù\r\94_z\f\90ÓÝ×|Jù\94ý>eû|\ 1¼ó5àr\ 3°¿£\vÛ\aBØ<\98\ 1«\87¶°xè\fóG\9e\98ùh\ 1füì\ fÑã\10L{\1c\ 3Ó'é0yZLÖA8Ú\rá³c\10
+ãÑÇ0~2\ 6ã\9fÙ$\1aÊo¢üò\8f\81\9caÊ?Où\94\1d\v([ö\17@z\e°ù\110\7fÌÃÌçF\10=7\85é\v3\98¼°\85ð¥\14\82\97î0zå\r\83×\8b ÿz9øcQÐù-\r¼7ÅÀoÍ\84\1e²1jîØ5ò\84\8c\91ßþ«\99ò+)?W\v$ÐÝï\ 2\ 3ó(Û\8d²\1d(Ûâ\1e\11
+\102=\b\981\f\99       ô\99\b|f   \8e\89\ 1æL<ÉB\12\80ß_\10\19ý!3zø\19ýè3:\a£B³\8bäÞ$Õ\94¯ üDú(â+Àÿ;`.e»þ\r°»\ fª3eÓÑ\8d\80\ 1z\84Çøô]\ 3" &DD,\89=q!^d1    !ô¢Ìè\ f\915\90.BCÏNMÂÄ´[:8¿eçÊ1\vO\8eM[À1\93\0\8e    "8f\9cÀ1Ã\1c\1e3(%u¤\8dc\ 6\ eÒKö\93\ 1\8eM9AÎ\92ÏÉwä>ù\85¼\ 6mµo\190îÿ\928qLJûå8 \9dÃÆ\8dcæÞ\1c\9báGg    ¥³Äñ\980\8b¨H\rYG6\92\93ôÑY\ f\93\fù\8c\#\7f'£Ü\eÁ+î\95\80q/\85ÿóâ?d×yTSW\1e\aðûÞK¾\84\0!/\81@\ 2Ô    Z\ 5ª\ 2* ,²Ê¾\85\18H\80\10HX\ 2\11Ô¸ \88\e¢\14\15êТHÝ\8a\8a8\14\1dµ\16m\1d\1dµÚ©£ãîà^ENµw~Ì\1c\8e\9eÎ\1f\9fóNþúÝ÷ýÝûr\7f\7f\80ÝÅ\bOqþ\1fw\11¢)Ð^/\ 2\v\ 2 \93(\ 2sÓHl\97Cb\8e\ eÔ\0\ 3h&±M+è\0_\80\1e°\1f\1c\ 1Ãà<ñÞæ\9fÄ8ç ñ\9aó\96xÅÁÄKð\82\83Éç¶ÿ\ fK\84\bO\15\0\1e\8eÐNÈcÊtÈf\ eô'\fú\93HbG\ 5\89ùÐ\ fZ\ f\1a\0dAC\16ô6ò=½\93|Gw\93¿Ñ½ä8}\98|K\9f ßÐß\91¯è\9fÉgôcr\94?F>âcò!\1fS\ f\ 4\98º\ fîMà\7f\80§Aí\19\\84=íài\ fOÈc\86\ 4áOg\11Ø#\88ÀSbH¸ý\90Ø5\97|'.¡ÆÅ5Ô\98h\ 5õZ´\8ez%ÚB½\14µSÏE]Ô3Q\ fõDt\80\1a\15\1d£\1e\8bNS\ fEW¨»âGÔ-ñ\eÆM1füì\8a\19×ÁOà\1a¸ú\11ì   u?³Ax\16\eáÙ\1c\84}aM>nðÛ\93ÀÞó\88÷\9e\11ÄÛO\93É_§)©çS\v¨'\1ezê±ÇRÆCÉ*Æ}I\vã\9ed+ã\8ed\aó¶äÏÌ[\92\9b\92~æ?$'\997$\97XW<\1e°.z¼6º0\15\e\8d\80sà;pv*f}\fÏ\84ú¾\96p¬-\10ö·\86#\ 5k
+\80,æIÐø\9cÙÄK\9f`btV\1cù`¦\8cºóY.uË»\84ñ\8bw5ó\86×2ÖU¯&Öß½6\19]òÜn|ѳÓø\aÏ\1e\93ó\9e\aMF<\aMÏy~ozÆë¶ÙI¯\17fCÞ¿\9b\9dðƦÇÁ\8076ù#ì\v\99Am\13\84\83a\1d¡\90G\b\ f\8d\ 5\8bÑÓùÓÑý\80¹Ä-ÿ\bâƼ\14òò\%ãÇ9ZÖy¿%FçüjMÎú®0=í»Öì\94Ïfóa\9fv\8bo}¾°ø\8bO¯å O¿Õ\80Ï)«c>׬¿ñ\19µ>èû\9bÕ~?lùµ\1f¶èóÃæûü°ÙÇð\¨\eÈ\82º\f\84Ãa\1d\91\16h<\82\8d\9e\84ÓèN¨;º\11:\vý-4\84\18   \89£Î\ 4Ë\98'\17¨\8c\87\16\14\99\ eÎ×\9b\r\ 4Ö[\1c\r0Xö\a4[\1fößÂ>èßa³ß¿\9bóµÿ~Û}þ'l÷ú_°ëñ¿o×\1d0ÆÙ\1d\b'(\10[w\ 5b+`Ù5ÿ\ 3\1c0ñþð¹\8a@hl\11\89FcYèq\8c\19º\13e\8d®F9¡\vÑ3Ð\99è\0âÛ¨(ÆñÈ\14Ö\91p\85Éá°<ó\ 3\vu\96\95Ö½¡KÙ{BVq¾
+n±í\ en³ß\1dÔÉí
+Úë°+è\bogÐY^GÐ-º=ø\15w[\b¶k\vÅ\1cÀ\ 6Ö[?\82\170\11^\bõc\10º\a\9fø_\92\bt-\89\85®Ä\9b¡\91\ 4\1e:\95è\81\ 6\13ç\10ýña\8c\ 3qñFûbe¦=\8b²-º£µV»£ÊØ\9d\91Õ\9c\9d\11\8dv\1d\11k¸íá\9b\1c\85\7fNo\rëæo    ;(Ø\1c6ì¸1ì'Ç\96ðgüõ\11¿;¬\8fÄöÍ\91ض9
+Û|ì¿\7f/\91\b=\82ú7S\11º\9c\8eÐ\85t\ 6ú>Õ\b\9dLµC\ 3ÒOÐ!él¢/5\98Ñ\93\12c´;)Õ´31ÓbG\82Úº=®\88Ó\16[n×\1a[ÇÝ\1ccàm\ÔL¯_Ô&X\17ÝåØ\14Ý'\\13=è¼*ú¢óÊè\7f\v\r1ïø\86\0ì\81­!î\83\89\fÞB\ 6waî¼²\18¡ó0ó\9cÎ$Ñ°\9c\89\ 6\16³Ñ¡\f1êÍð&ºå\81T§,Ò¨C\9ahº-MfÙ\9a\9aÍÞ\94¬á´$\95Ø7'V94%6Ò«\13Ö\bVÆovZ\11¿C¸,n\8fKCÜQQ}Ü\88¨.þ\81K]¸c]"¦ë\920\17Ø\ 3»I\13ûài<d\0ïÿ£\ 2æ^\98y\86\1cÈ"Ñ!¥\15êÍrFÝY3\88]ÊyT»"\8cÕ\9a\11gºQ\9ef±^¦`¯MWsVK\8bì\r\ eËSëèÆ\94\95\82ú\94\16amr»Kuò\97¢ÊäoÄúä³®åÉw]ËSÆ\84úTÌקa\1eà\ 2ûI8
\90\8cÐõ\f\84F ö°\1aêÃÜs\18\9eûr-P·Z\80v©§\11Ûsý¨-9!¬\96¬E¦k\95)\16«\15rkCF\ eg\99\k¿tq©C\9d¬\9a®\96-s¬L_',\97¶¹\94Iw\8b\a]uÒ¿º\15Io»\15§¿qÖÉ°@·\18ÓÀ\ 1p'½\9fØ\8b\ fàºq\16ê\9e\80Ù³¿\0îÚðüRc\86viy¨]+!¶hf\93-yAÌ&u\94ÉJU¢ù²\9ctë¥YJN­2Ï®JQìP¡¨ \97d68\96f4  \8bå­¢By\97«V¾ßM#\1f\93ßtÏÏøÕE\93\89\1d5
+Ì×*0\ f8Lz\1d\87пdÐ\aÈà\94\ 6¡cE0ïè`Þ\0]Eƨ½\88\8bZ\8b?A-E3ɦÂ@¦A\e\98\1fo^\97\97fU­Î´Ñ«T¶KT\85Ü\92\9crº8»Î± k\95P\93µI\94§ÜåªRö¹å(\87ܳ\957ܳ³^\8ar²±\93*\eós³1/7\a;Lz>q\1e\0\19\fAýþR\84úàúÕ\r:J\99¨µÔ\16m(sEM¥^¤¡Ä\9fÑP¼Ð¸¶(Ƭ² Å²\+g\97j²m\8bóµÜ\82üRZ\93W#P«\rBUî\ 6QVî\ eW\85ª×-SuÂ=#÷*x!ÊTc'\85\1a\v\94jL\ 3Þ¤Q8\ f×'ú\0\19\fÂ\95ë\10\C÷T"Ô  ¶ê      ÔRÁFM\15.ÈP1\9dhÐÏaÔ,       1ª(\8b6-+I²ÔédìÂâ,[MQ¾½ºPÇS\15V     ²
+\96;ej׻ȵ\9f\8be\9a=nRÍq÷4íew©ö\998]\8b\85²\ 2,X\\80\9bôP\8aÐ%\15ô\ 128Z\ eû \1a\83\fÀ\ 6\98\ 3×ÔX¡\15µN¨¡v\1aQSãKé«\82\95\91\15 æZ½Ô:¯\ÁQ-QÛg\95\159(J+øò\92F§ô\92uÎiºí¢\14ÝW®Iºcn\89º\8bà©(Y÷»S\8a\ e\v\0\9dªÃ¼IwàÊy\ 1ÎÁ\10ôàp\15B{ëa\1f4ÂÜ·\f¡¦\ 6\84\967X úF\1aU7þ\89(o\98E\964\ 42\vëÃ\8dóëbÍrkS,³kälEµÊV^UÀM¯*ç¥U.\15$W4      \13*Ú\âôÝ¢Xý\11q\8cþ\a\12«\7fÿ\1f¾ë4ª©k\r\ 3ð»3\0\81\80!\88\84A4¨(AD\13\ 4\19\9dq\9e\97óp\97U«Ö©½Z\87«\ 5­
+X+ 
+8"8Kl\9d\89Uk+\93âÕ.DéÕÚ:\e¬ÖZÀ«uÀ}_»Z¥þ¸?\9e\95äÏy÷÷í}rÎç?h\9eô\1d<Oz×w\8dûpf&p\9c\9fù»\96±\a|\ 5ΠeôI²\ 6óS\1aaNJ >L1+¦'Ǫ¦$Å;LZÞ_3~ùPí¸ec\1a\8c^:A?òÓi\9eÃ\96Ìñ\1a²8Ágàâ\15\13³üû&îhÚ;±ÀØ+ñ\9c±WÂ\83\13^úõI\90>äÝ7A\1aþR9\99ûÀ\1e\14°ï{\99¿u\ 5{À±dÕ*`\11}\9cªÂ¬4=f¤\e15½\8d\98\94\16©x/µ\8bj\j\1fÇÑ«\ 6;\8fø|¤vØÊñ\r\86¬\9c¢\1føÙG\rû­XèÕ{E²wÏ\94Lßø\94m\8d»¥\1cnÜ5ålã®É÷ýº%½ðé\96$\rÝ\93¤W÷åo\9dç\7fÁ×óy?²ÿ»8\8alJe\ fÒ\81¤5\9cý29ûe\ 3ïg»aÂ:_\8c_\17\84qëÚ\8bQÙqÊáÙ=ÔC³\ 68\ eÎ\1a¦\19\909NÛwíûn½×ÎÒõX³À£Û\9aå\9e]2ÖxuÊØj\88Ë8ä\1d\9b\1d»úgClús¯¸4Ù\88<ë+a\ f\83½¬?/\rÈböÊ, q=0\9b³èD\8eGcr5\18\99Û\10Ãó\ 204/\14\83ó"ÅÀ¼®\8a~¹}T½s\87¨{æ\8erì¾e\82¦ë\96é.\9dræºÅå,ÕEç¬v\8fÜ\9c«ï°ù GDÎ\19\8f\88Í÷ôá\e\9fëÃ7H}øzé\1eQÏIÞ\a\a¸ï;\98¿q-\90¾\8eç\80Ùór\81iÛ9\7fîâüÇѨ\9fÕ\r}¬>èmm\89\9eV\vâ­±¢\9b5^t±öWt²\ eSÆYÿ¡\8e¶Nq\88Ì\9fí\14\91¿X\13\96\9fæbÎߢm\97¿_Û6ÿ´¶í\9e*mè®ç®¡;¥kè\8e¿+à\19Ègÿs\98¿\96µ'ç\0\v·\ 1³v\ 3\13ö\ 2Ã÷\ 1}\ e\ 2\9d\8f8 ®À\1d±\ 5þ\88.\bB\94-\f\91¶8DØz Ü6P\84ÙF    ³m¢¢­m\96²\8dm\91ªµm¥ÚdÛ¤\ e²}éÐêh\89º\95Í®nyä\99cà!é\18xP:Õ·\8fçn+ó³9
+®dí    ;\81\8f¬À¤ýÀH΢ýl@\97ã@\87\93\ 2¡\85\1a\84\14éѺÈ\1fÁEA0\15[\10T\1c\8bV%=вd\10\ 2KÆ Eé\144+\9d+\ 2J\93DÓÒu¢I©Uø\9f>%üKï\88ÆÅ¿+ü
+¥ÒïÔ\1fT\7fÙÁü\rÌOÍ\ 3\96°ï³¿\ 4&3{\14ÇÑþ_3ÿ[æ\17\ 1¡§\81À\7f«à_î\fß\vîð©ð\81wE\v\18.\86R\14¼.uC£K\ 3áÉ\97\90\86\95Óàñý"èÿ\93\ 6÷ËÛ¡»r\9c®AWY\vÝE       ]\85\14º\vombþjæ/eï?fíSX÷hf÷?Åü\12 â\f\10r\ eh^\ eøU\ 2\9e?¨¡»å\ 2Ýmw¸Ýñ¡fp½\e\ 2íÝ\b¸Ø»ÀÙ>\0\9aª±pª\9a\ 1\aûb¨í\99PÙ­PØ\8b!ìv ê\19IÀþÖ\1aæ/ßÃ3x\0\98ÊÚG³îþ¥Üÿ³@ûï\0S\ 5\1eð¾
+è¯\ 3®·\ 1\97j'hjÝàXë\ 1U\8d\ f\145\ 1@\8d\89¨#ñ¥¤\86\ fã\1aÞø5¼ékxÐk¿ ^øñ]zB/ÞHfþ\ 2\9e¹\ f\8eñ\1e,d~\19Ð\89Ù\96\8b@«Ë\80ÿO¬ý&Ðà\ eà|\ f\ 2Ê:\ 1¼t\ 2\92;5âo\7f
+¤¶@]\fðª\17ñaô\8aë\90\\87ä:$\ f¹d\91\92\17\96wÞXÈüé<sc\8b\81\ 1ç\99ϺÍW¸÷×\0ß[¬\9díÓÞgöCpÍ$ëS\91\86ÜHO\ 62R0EP<ñEYò¡,\17\13ÿô$\ f½<DÇß\90¾\81\90~Í!}ȳ%¤.\ 4Ò9\1c\15R\f\14\12ãh\1aÍ¥%\8cþ\8c2h\ 3åÒNÚK\aé+*¤ót\9d~¡ßI¢îÿ\90M\9a\91\11Ò\9f¼ùÝ#\88e\99\9dXb?!\1dG    ©\9a,¤r6}BÉ\94\ 6©È¢M´\95vÓ>®¹\80NR\19]åÕïã%\9eü±\8a§
+RJ<QýIý\96\fhB~l!ùó»áu?BÙÚ\18ö¤\17×3LHí{BºÌ¤\ 5ô)­¤\f!\9d×Ó\16öm\aY\89½p>\8e:çR¼p¾\84§ÎU¨u~\8cß\9c%\1e¹Hüª\95\95â]²\85/d \ 1²\85\17×ÁϦ¯{\12̽\89\0\9fj\90\r\a ©ç~¸O¥9Ä^è\92D\9d.U¼Ôe\8açº\8dâ\99.O<Õí\16OtûÄc\9d\rµºBTëÊñPw\17÷Ük`w\7f%î襸M·þt³\1e\19Ô\bÒä\ 1\19¤\87lÉÏVìGK\9e\8bf\16®§#dã¾<3#ÄKï\89âwï\99â\89a¾¨5,\11Õ\86\15â\91!]üjÈ\16¿\18rÄ}Ãvñ³a¯¨2\1c\16vÃ7â\8eἸá}[üèS-.û¼R\ò\95\8a
+º@åï\90!ÌnÓ\80\!CuÄ~´a/Zól\ 6EâY`<\1e7\1f"\1e\ 5\8c\13\ f\ 2¦\8a{ÆÙÂn\$n\e\97\89\9bÆÏÅ\rã\1aq͸AühÌ\13?\18÷\88ËÆ\ 3\8aJã   ÅÅ\802EyÀuŹf¿)Ï4«S\966\97Êb*¢B:U\8flË|³\v¤Å     2\9cë\bç\9aÚû ÎÜ\ 2\8fÛ\9añ0¤#ªZ÷Å­à\11â§à   â\8ai\86¨4ÍUT\98\12\15å¦$Åw¦Tå9S¦ò¬i\93²Ì´MuÚ´WUb*P\15\99\8aÔ\85¦JõÉà\aêcÁÏ\1c\8e\96\ e\ 5­¥ú\b\1d~\87\fÓ2W\r\19©\84\8cá:b\Q\17í\81ê\ e\8dq¯}\10n\84\8a%\1e\17Â\ 6\8bó\96±¢Ì2YQjùPYl\9e¯:e^¬úÆ\9c¬>iNs8aÎr8Ö.Çñh»\9d\8e¶vû\9d\8e\98O8\1d2\9fÓ\1c0ßÕ|aù¯Æj\91\9a|\8btÚm\91\8e¯íªGF8BFñ¯"\ exÞY º³\ 3ª;ºÂ\1e£ÇÕ¨&(\8fn\87³1\9dP\1cÓO|\e3Bq"z¼ò«è\ fÔ\ 5Qÿt8\1cõ/Ç\83\91K\9cöG¦höE¦ÿ\8fé2\rjë¼Âð\91Ī}Eb±\13'\1e{¼Åc\j\19l!\83\10\ 2!\84$K\80@\ 2$6±Ib·Ø±@\ 6\8c\85\fÆ8Â\eÄX$vl'®\1d×Y&\89ÓvÆíL\93\8e=iÓ&\93I:MÓÔm\9aôö43\1aûÇ3÷þ{ïyÏ9÷û^ê+b?uU¼L»$¾L¿(¾Î8/~\9b\11\14?b.\1fü\86±\94JÐϤ\12´ÅT\82º\90JÄ>\v\91FþIÿ\89\f\8f\8fl\80Ç
+\12|,\8f\82ßKið #\1eÞ\96í\82_ÈÒà¦LAº\96YB    e\18"®dÔD­\1e±G_\92¶Å\9e\97vQ\83é\1eÚËéã\8c\fsI²ÀZ\94¬°OKB\9c\80ä\ eÇ/yÈ\9dKÿ\9a3\9bþ\ 3kFJ0§¥\ 4\bnö3\10\87Ñ\83L̽ø{\7fT\80¹\13óç\83\ 2
\9f\13\ 3÷røð\86r\e\Ëý9¬çf\92W\95\ 5\94\v9e\91AEEôr¶5ö\8c¼\89º ï \a²z\98þ¬!Ö\9cl\92=+;Å\9dÎ\æù2×øS\99·\ 4ÞÌ\a\82      Ù\17\82ñ¬ï¹cr\82\8d0Gå\ 4ãY\b)\1ekXÿ\9fPû!æ¾\ fJ\ 1î«\ 1î\16EÀÍB\ el\14½\0kªd¸ J'\9f+RRÎ\14\96D\9e.0ÄøóÍÔ\93yõô\99Ü\16Æ   ¥\8b5©ìç\1cÏ\19ã\8eçLóG\15\v\82aÅŸ!Å5¡Gñ®h@ñ\99h@ùDЯ$¸ý¹\ 4\ea!Ì0ÿ÷à«\Ì\9c¨ÿ\11\1e/÷ñ¨»\8dÜ(#AHÍ\84Ë\9aÍ°¢y \964i¤Ó¥rÊ)uQäL\896ÆWl¢zU\16úDQ\ 3s´°\8d=\ØÍ\1d,\18â\1d+\98\14ôçÏ\v\83¢îü\8dxwþ/\13\8f\13\9c\ 5ÿ\10:\v    >Âu\16\11l\84\15æG<Ú>G\ f~\87¹ó=<òï\98ð\9e\8d\84ðýr9\1d\82º\ 48£ß óz1iV\97\95çE\1e×\96Æ\8c\95\19¨Ã\1a3ÝSZÏ\1cP·°ûJ\Ü\9e\92\ 1¾»x"ÎY|RÔ¡Z\8eoS­'¶ªî&¶¨>Ij)þ{|K     !hQ\13<\87\9aà ì0ß*°\ fèÁ¯õèA\ 5À-3æ^d­\12 h\8c\85E\93\10ü¦í0cJ!M\1a¥\94ñ£ÊÈaCq´G_Ní×UÐ{Ê­Ì.m#Û©mçv\94õòÛ4£B\87fFÔ¤YJh,]K´\97ÞN²i~»É¦ù[\82­\8c\10Ú´\ 4ß®%¸\b'Ì7Ø\87Ç\1a\80\ f1wÞ­F\ f0w]©Å¼c\ 1\8a\ 2¿\99\ fÓÕ[ÁkN&\8dU\1d&\ fVfG\fT\14\984±nãQZçÑjF»ÁÆn5´r\9bõ]üFý\90ЮóÅ×ë\16\12kË/'Yt·6Õè~\83ü5±Fÿ_¡EO\b,\ 6\82g5\10Ü0_ã.|\\8e}ÀºßDýWë1÷Úñ®\8dÏy+\19¦­\1cðZ·À¨u/iÐ\92Fî«\91EtUçG9ÍêØö*=ÍQYÉh®¬c5T4sm&\17¿Îä\11Z\8c\93ñÕÆ@b\95ñbR¥ñÆ&\93ñ#ä«Ä
\8f¢J\13!@xU&\82\eæK\15î\ 3öþ>zp\13u¯6¢\aÍ\987ð9\8b×\1fo=\eFl\9bÁcÛ\r½61Ù]\9fAé¨SFµÖ\16Ç4[Ë©\r\96
+\86­Æʪ­näXª;ùÕæ\81¸Jóq\91©Ê\9fp´ê|\92¾êú&]Õ\87È\97Izó\ f"\83\99\88CøGÍ\ 4/Ì_p\17\7f\85\16ú\7f\1d\1c8\amxßÇ\f\84\99§\89\ 1Ç\9a\12¡§y\a¸\9aRHí\8dé\14G\83"²Ñ^\14\97QëlFº¥¾\86Y]gçTÖµóLµ}q\86Úq\91Î:\97 µ\ 6\934Ö×6\95ZßG¾HÔXÿ#*³\12qeµ\ 4_k%xa>Å}ü\0gð6Ö¼\81ú\97:\0Î:1wv\ 2\8câw\f´Ò »M\bζmÐÖ\96Ljn=Lnh\95GÔ;
+¢­-¥±ÕÍ\ 6Ze³\99ijªg\e\1a[¹ºÆnAYè°Ô>\e_b\7f9Qe\7f5©Èþ^R¡ýs|ÿ^¤²\13\82b;ÁGxaþ\80}x\17çà&Ö¼\8eú+\98?\17º1s Çð[Ü®hhwñÁá~\11\1aÝ{I6W*¹Ö\95I©væFVv\16Ç\98:Ë©\86\8e
+zy{-«¬­\99£nsó\8a[\87ã
+[gDù\8eåø<G(Aéx\aùsB®ãßÂ<\a!@xù\ e\82\eæ!îã=ôà\1aú¿\8aúçú0÷\r\0\1cGܽ\98»úÈÐØÇ\ 1[ÿf¨íß\r\aHUýR\8a©O\11aè-\8a*ï-\8b)ë1ÒÔÝ\16\86ª»\91UØåääuyøJ÷\898\85{I(w¯\8b²Ü÷E2÷g¢,׿âä.\82/w\12Ül'Á     ó \ 6û\803\18rá,âõ{a\10`z\18`\18éDl\88e\84\ 1æ\91\18Ý\ eÆÑý$ýè!²v$\8b¢\19É\8f(\19VG\15\rëc
+\86ÌÔÜA;=g°\83\fpd\9e)^\86g\91/=vE\90î¹'\90\1cû£ }à   /}\80àJû  \ eÂ\ eó\ ezð:ö`\rë?7\84\1e\8c¡\a\138\a^ô`\12 f
+³ÇT,è||Ðú¶\80æÄ\1e\89I*ß\11r\81/\87\92ç+\8aPNi#³§*¢³&ëb3&[iRo\1fCâõ²\ ey\17Ø©Þ5ÎAï[\1c±÷S¶xâ\9flñ8Á:8ö\13Ì0wp\ e7zÐ\ 3¬wa\1cç\0u\87O`\1ff\0\1a0\92\98N\ 1¨çIP8Ï\82\82@\ 2ä\ 5\832\90\f\8aÀ!\92< #É\ 2\8c\80\9a"\9d7DHæ-\91ióÍÑ\aýÝ1\aüãÔ\14\7f\80¶ß¿JKöß¡'û\1fÓöÍ}GÛw\92 í\9bEf\9e\8d\1e`ýËXû\9c\ f`b\16 \ fu\1d§±\a\8b\0º³\98ÿÎ\ 1d\ 5c!#È\ 3ið9H\ fî\ 4ÉÊÏàÐ\8a\ 4ÒV²I\aW
+I\aV´ä\94\95Jòþ\15;eß\8a+bop$rOðTÔî२]ÁÛQ;\83\8f¢v\9eû.zÇ2\11½ã,\11³cé)!\8c\82\1fÀÚ}s\0\9e\0\12æOÔ5b,+Æ<*_\ 58\84\915e\9d\ eû¯
+ ùê\16Øwu\17ì½\9a\ 2/\85$°'¤\80Ý!\15ì
+éaGÈJÚ\1ej#m\vyH[C³ä\17CçÉ/l¼AÞ²ñ   yËú·\94ç¯\10\94ç_!"\9e[{ÊeÔ_Dý\19¬}d\ 1{\80Ú\r\17\0*P·t\1d '\ 4 y\r`ÿë\0;oQ`ë\9b\8cÿ±]\1fPQ]y\18À¿7}\18f\18\ 6\ 6PPi\96\f(ë \1e\8a\82\88\ 5PPÀ\80%G]O,\eIÔEWE#Qlh\10,A\l(6tQC46\ 4\17K\94b\89\12Ä\12»\12Ö.êÝ\8f\83\18wO\ eçwÞÀpÞwïÿ¾w\v<\8bÍð(v'\vÜ\8býÑæH\ f´>Ò\ f­\8eÄÁ­d\ 4Z\96$¡EÉ,¸\94,\85si\1e\9cJ÷Á±ôg\98\8fÔÃ|XHæCBr<(dÍò\96s\fr\80Åë\80¯ó\81\89\ 5Àhf'07\8a¹!\a\99_ÌüRÀã\18Ðâ¤\12\ eå:ØW\98È\15Æ\8a¶°«ô\83¡2\88úB_\19\a}Õ(ØVM\82®*\r6U« ­Ú       MÕ      º\vMe\ 3´åâ\7fä0?\83ù©\9b\81É;\81Ï\8b\80Ä\ 3Ìgn\bs­e@\87\13@\9bÓ\80s%`\7f\ e°½¤\84æ²-T\97MP^q\85â\8a7äW;Aº\1a\bT÷á\86(\8e\eÃÑÄ\89¶f\11\17f>X×xãkU@íc^_\93ø \93c?\87ã\9e\È÷p/0\84ÙQÿ\ 6z\1c\a:\9f\ 2ÚU\0­Î\ 2\8e\17\0Ãe@û+ ¿\ en:Ô¤\an\99\80ßZpCìÉÍ\90\ f7¦Ý\80\a\8d\9b3¶ã!Ûñ\88/þão)\ f¨caëØ\89º\aÀïÏ?\98DZ\9fÊÚ\8fã×CK\80þìswöÙ\8fMö>\ f´ü\ 50U³ïµ\80ò&³ïÐ\83÷\1e)yo\1dïc\ 4êÍÀ\93ÖÀÓöܤû\ 3¯¸Q}ÍE¹\81\8bÑ\e.>o9á¼Ý\ 4¼ÛGì\9c¸öÁ´ÝÀxÖ~ØQ`\0³»\9f\ 1:±Ï\9eWXû\1aÀx\83}¿Í¼{ô\90~§çï½ \97ô\9a5i`MÞÚó\9e¬\89ð"¿¦C\8bàFQ°\1e\82í\10l\87\ 5\8b.\ e\9c¼ Ì<_\9aÈà\r¡²@\80ç]\84Q\f}Fãi
+ͦ\85\94IÙ´\866Ò6*¤½TL'é\12ÝÁ;<¡wxËßÞPÃ\9f\10-ÝÙôÖl\v\19ùÙ¦-\84â/ü¦\aõ§!ô9M¢\14J£%´\9crh\1dåS\ 1íaÖ\ 1Þ·\f¯q\96%ºÉRÕ³doð\94ß6zò'D+7\b·\16l\a9º²\16¬\87­/\846\10\17B\16Ïÿ\1aI\13hêûZ, ¥´\92=ÌeB\1e3·2³\10ÏX\8b'(ar9\87í\1a\1eóç!^ññ\11¸ßH\12¸÷\7f\84»3D\eG¶Ã\ 1ÂÙÌz´\82pèÀ\9at\81Ðs<l9\1eÚa\10\9a±4     ïÔ3ðF=\87\8f@:^ª³ð\\95\8d'ªµ¨WmB\9dª\0\8fTßã¾ê\10îª~ÂmU5n©\1eâ\86æ5jm\ 4jt\ 2¿6²\15¨þ\88ð2\91\11ÂÃ\0Ñ\9a×Ö.l\ f\9f\11\17?Ö%\98ÏI$Þ\18?ÅK»Qxj÷\ 5êí¦ Î0\v\8f\fóðÀ°\ 4÷\fËqÇ°\1a·\r\epË°\157\f»PkØ\8f\1aÃqT\e®à\92ñ!ÎÛ¿Æ\19\93@¥IH\15Tî ¤Ó\8dLMD{;\88ö¶\10\10íô¼²\1e^\1c\1f÷\ ehpë\8ag-{¡Îe î;\ fÃm§1¸éô\15j\9d¦¡Æ)\15ÕN\vqÙi).9}\87\vNkpÞy\13Î:ï@\95Ë^T¸\1cE¹Ëy\9clyW*s})\95º
\88\9b\90\8aÝ\84ìp#×?\b\1fæû(I\ eÑ\91íðe=>1ãE;w<öê\88;\1eA¸Þ&\ 2\fÆE÷\918ç>\1e\93Qá1\ 3§=æH?y,\92NxdJÇ<²¥2\8fuÒQÏ-R\89ç.©Øó\90ì°×iÙ\ 1¯\9b²½ÞOeEÞB¾\87v½Wø\11á§jz\95­ä/Ã+«\ 6\fxàã\84ëí=ñK{+Î~\12\86rK\fNX\86¢Ì2Z*µL\90\8a-ÉÒ!K\8aì\80e®l¿%]¶Ï\92%ûÁ\92#/²äÉ÷X
+ä»|ö*
+}\8e)vú\Uló­Slñ}§Ì÷\15\8aM\1d\85bc#ß?4esZ\và4Äéþ\ 6ÕtU£¦\93\1eçü\qª³/Êü\83\1f\81\ 3]â¥}þ\9fIEþcd»ý¿\94\15úO\91ï´Î\94ï°¦)¶[\17+¶ZW(7[sUùÖͪ\8dÖÝê\rÖ#êõÖsê5þ÷ÕÿôoPçt\11êU]\84\89²\99èÊ60ÿ>§´k½\80\8bt&T\8eÊ\0\r\8e\a\98Q\1cÔ\ e?\ 6wÃ÷ÝÃQØ=F*\bN\94m\r\1e\1c4N¾)h¢"/è\1fÊõ\81_«Ö\ 6ÎWç\ 6f¨W\adkr\ 26h³\ 3vج\fØo³"ð´nYàoºÌ \176\19ABûm°Ð\90úc\8dùõÌ¿ÉåîB$Ï\1aQÀñ~<ó\84)p0Ô\1eEa\1eøW¯ÎØ\16\1e\82üðHiC¯xÙÚ°áòÜ°Ñ\8a\9c\9e_(³{NV­\f\9d®^\1e\9aªÉ
+]d\93\19²L\97\11\92k»$d\8b>=¤H¿(ä\98aAh­a^èS}ZO¡#\9b¹=\85vn\98Ð4\13Ý\9b\96¹jfWpj/\eÄs'Ï ?FJØÓ×\80\82\b7äGúbCd\10r#ûH9\11\95ý\12åËû\8dPfö\1d£Êè\9b¤^Ò'Y\9bÞg¦ÍÂÞiºù½3lÓz¯2Ì   ßh\97\1a¾Ë8;¼Ô8«÷\15û\99½ëíRú\b}J_¡#\eÒ6{Æ\1aÜ\8e\0~fþÉÁÜçóì·\8f×ÝlËö\ 1:l\8cvÁÚ\98\ eÈ\89é\86\951aRVt\7fYFt¼bñ\80\85ýÿª\9aß\7f¼&-j¢ö\9b¨iºÙ\91©¶³"Ó\r)\11+ì¦G¬7N\8bØi\9a\1aqØ4%ò¼Cräcû¿G   ;Ò\93î=\9bFÿáø×\ e\0ªâY\7f\9eûö\ fcþPæ'p¯\1f§Fn\9c\19ÙñÞX\16oEF|\88\94\1e×O¶ v\90"-6QùÍ \11ªÙ\ 3Çhf\ eLÒÎ\88IÖM\8b\99©\9f\1a\90\1c\9de\9c\1c½Æ41z»ÃWÑ\a\1c\93¢«è\81CRÌ[cÒ@a [Ò5{Ìç \9a}>\95È\1aðÜ÷Ã\bî³)\7f8÷ú       
+|\97`BV¢\a\96\fñÃÂÄ`)-¡·,5!Z>ëÓÁÊ\94ÁÃUÓ\ 6\8fÖL\8d\1f¯M\8e\9f¤\9b\1c7]?1n®Ý\97±\19ö\13bW\9bþ\16»Åq\ì>óØØró\98¸{\8e\1aìÇÆ\v\93m³û|\ e\ 6ÇÙÿ\83#Y\ 3.õÛh=?góo\99Ã\8cX<¼5æ\ fÿ/Ûe\ 2Ôä\99Æñ\7f\12\12®\1c\10\b\87Ö\v©GAk\15µÐ¢\88Ê!¢\1c\86#@\ 2\89\10 \1c\ 6A\ eåðâÐz@TªBt]O »®\17°µÖZa»Ý]ÇÚ-3Ýum«µèn\ f­­\aÕ~û×\19êL§\93ùÍ\v_¾|ÿ÷ù?ïû~Ï\13\88µi¯\8aªÓæ\89«t\8b$å©ñ\ e¥))2k\8aÁ±89ǹ0¹ÐÕ\92´J\91\97T«2k7¹gk[=LÚ\83\9eYÚS\9a\a^\ 6í &3iH\9d\99$¨²\92\ 5%Q\10ùS\ 6\99\87\8fèû{\8cý\fK\9e·rè\ 1Ù»\9cµ>¯5é\95Ø`\18\89:Ãd¬1Ì\14U\18æ\8a\91\12kÆR\87âô$iAzºc~\9aÉ97Íâ\9a£[©X®«V\19u\8dî\86Ô\1d\1eúÔ\ 3\9eé©'4i©ý^ºÔ\9b\9a4Ý#u\9aNpK×     J¢\18æ\ 6×â?\98ÿsYÀIj\1fË\ 3öç³çËe¿C?Ö\eå¨1ù Ê4\ 1«LÓ±Òôº¨Ø¸P\\90µØ!?k\99Ô\9c©sÌÎÌr2\19ò\²\fV¹A¿Z\99¡¯w×émê\94\8cý\9eÉ\19Ç5Iú\8b^Zý\r\8e\ fÔIzÁ-Y/(\89b\98kÌÃ\a\19ÀÛ\8cû8µ\ f\17²ß(b¿Áq£\19¨1;£Â¬A©y<¬¹/£È\1c\98ÃŹ9\8b$Ù9        RSv\8a,3Ûà¤_nvI_^,×\99*\95\rnZc³:ѸÏ#Áø\aM¼ñ\82&Îø\ 5Çûêx£à\96`\14\94D1̧ÌÃÅL\9e\a\8c»\8bÚ¿·²çbI¾\8d\ 5¨°HQbQ£¨`\f,\ 5\81È-\98-Ê)\b\13\9b,Q\92LËR\a}~\92,=?Ã15/Û99¯ÐU\9bW®HÌ]§\8aËÝæ¾ÄÜî\11kîò\8cÉ=O®yÆ\98\7fT/6\v\8c5\v\8aa®pÝ\9d§\a'\v\98\87\12æ\81¥ø.\96\9f\9b8Vr\1eVb±ª\90k}\ 19%\93`*  BfI¨H_²P\9cf\8d\95¤Z\97I\93W¤É\96­09%\14[\â\8aKå±EuÊ\98¢-nÑE{Ý#\v\11Eç<\16\16]UG\14þà\1eQ(¨"\v\ 5ed\81 \18æï\ÿg¹\ 6\8e\10µÛV\ 3Ík\80z\8ee\15Ôçµìr9²*¼a¨ðGFå4è*CD)\95áâ¤\8aEâÄ\8ax\87øò\14éÒòLÇÅ«r\9d\16­*q\89\96/,Û¤\9c_¶[\15^vÌ-¬ì,ùÔ-¬ô\9e*¬TPÎ[É
+m¥ \1f¦\9f\1et3\a\9d\8cû\0µ[k\817Ö²ï!%uÔçÿ\19µNH­õ@rÝXhë\ 2\90¸v\16âëæ\88\96ÖE\88\96\88cjµ\92èÚ\fiDm\8elAÍ
+§ð\9aÕÎsk\1a]C«[å¯W\1fQ\84TÿY\19R3 \bYsW\11²Z\90\13×\90ªç\9c§\a'J\81#Ôo§nË\ 6 ¡\1e\0\14\91L¢m\10!®Q\89%\8d#\10Û4\ 11MÓ\10Ý\14\82¨¦pQDÓ"Ñ\82¦\ 4qx\93N\12Öhr\bm,\94¾ÖX!\vn¨w\9aÝ°ÓyfÃa\97 \86^\97\19\r\1f»Ì¨¿ã<c£à<c\ 3Yÿ\9cÞ\15<\13ªèÁ:z@½-\9bè\ 1[³²­ì}¶±÷Ù\ e,m\ 6"[\° Å\ 3ómc0Ïö\12ÂlA\98k\vE¨m!^³Å\8aBlI¢Wm\ 6ñ,[\9e$ÈV&\99Þ²ÞaZ\8bM:µå lJK·,°å#Y`ów²\80m\82,`+Ù"8\ es\929?Bý6¶¦ÍÔn f\95\r(Ü   dµÒ\83Ý@ô^`n\9b\bÁíJÌn÷Æ,»\1f\82ì\81\98a\9f\89éö9xÅ\1e\89iûâ0u\9f\ eSö-\17\ 5ì³\8a&ÛkÅ\13íÛÅ\13ì¿\13ûÛO\8bÇÛ/\89Ç·\7f+\19¿÷g\89ß\1eÁÁo÷sºèÿ~êïdÜ\9b\1fwq\1dìá:hgÿ¹\1f\161ü 0û0{À£RL>¦Â¤c>\98Øá\87  \1d\81x±c&ü;æb|G\14ü:\131®S\8f±\9dù\18ÝY\89Q\9d\9b1²³\1d#:ÿ\ 4ßÎ\ fáÛñµÈ÷è\13\91Ï\11Aìsø9\87\9a\80Ýô|Û\ e\9e\89\8c¹ÌÎ\1c\1c\0Ò©\19w\f\ 5\ 4³=|\99\84\93ÀèÓ2øv«àÓí\rïîqðê~    \9aî xöÌ\81GO4Ô=Ë î5½×
+·ÞõPõ¶BÙÛ\ 5EïE(z\ 6¡<ó\13\94§\ 5(O=§\8dÞ·Ð÷zú]ɸ-ÔÖw\ 2     \7f\ 4"N\0!§©ß\r¼ÈötÔ;\80æ<àö¾\f®ýJ¸ôiàÜ7\1aN}\93àØ7\1d²þPHû£I2$ý9\10÷\97CÔ¿\19èç\83ûÎp¼Âñ;ò\98\b¿°\93Þ7µq\1fÐóBÆ\9dIíÄSÔï¡þÛôÿ\1càÿ\1e0ò"àñ\17@ù!àtI\ 4Ñe\17à²\eñâKo4pe"\v¡WX\10²0û\84\ 1\16#\ 3Üt\ 3Üp\ 3LòÀ\11ò.ù\9cÜ#?\13á\19o0ï5Ìw1cÏbÜËz©Ïx\83©;\85º~Ôõý\eà~   \903\fé'\0þM®J\80ÿp\1e×T,\86=\81/^`Qî\ f|9\95\85Y\b0ÈyÜâËð\16\ füÛ\t·ß$o\91>r\9d|O~|FÝ!\9eÇüÊDϵg¹\a/P¿\1f\bd¼c©ëE]Õ\0c\7fªû\19¹An\92ArKÄ\82Ü\91\ 5©\ 2øÆ\1dlÈX \8f\ 3î\ 5\0÷Y,?`\91ø\90/\83G|\ 1\ eñà\19\87\10E\86þE>{F)×[6S\95DÏ£¨\1dÌ\98\ 3.\ 3cþ     xò6\ 5o\93>Õý\8aÜ&ß\10¦\14w       -\ 5CÁ}1µ\9cù<%ðÄ\83Í\ 2=\11&\91Y\84EºÀy\b<\8c\85\8d\84\9bN é\ 2\r\17Î>Cp\1f\vÁm4\ 49q\18\a\ 1\13É42\87,&©$\9b¬ Ud=ÙLZÈ\9bÄN\ e\92\ er\9cô\90\vä\12¹\8e\9fq\a\13?Â/\fý
\93ý­z\ 4\ 4%qâßx:\8f)$\84D\11-É"\ 5d\15©%\rd+ÙAöPg?u\ eã1º¨q
+\8fð\ e\1eâ¯x\80«´ékÚõ\90\bø\9eÜ%w~\85àí\ 3AãE?4ôÂ\e\82t\14¯N"³È|\12\89\99X\9f\18ë8ÿ&>y;uvQ§\r\0u\8eRã8\9fÛ\83oñ>Õ?Æ\7f¹pnó\8eAþò+ró7\10Fx@ðq§\1fn\10T\1c\15¾\10\ü9\17æCô4\1f1$\99±\1a©[À§\951\9ejêl Îfê4ã\7f\8e\9d:\a©Ó\85/éÅu¼\8bÏñ\7f®Ë<¨É;\8dãß÷HòæTê}P\ 5em\8d:\96X5 \ 4$\1c\81p\ 4\f1\a$\10\ 2\ 4\8c$"B<\8aâ\81x-ÞJ=pQ¼ê¹\9eÕjkkÕ¶êV«cÕÚÚuWÇíÚÑm;Ý\1dë»\8f«Î:ýã3¿¼ïÌ\9bçúý~Ïó½\80Û´\89\177(S×é\9f®\11W\99\17°Ï\11_'Û}Õ\94\ f%åCC¾P>"úQm\ 6CT\8eÆoB
+~\95\13ïÂC¾\f\ føjü\9d«Ã]¾\ 1ßóóñ\1d¿\18·ù\15øFÒ\8a\9b\926\\97lÇUÉ~\\96\1cÇ_¤çqQö\1d¾\10\1eá¼BÄY¥\88OU"Îü\ e1J\ 5±¿\94üà F* ö!\9fzR}º\ eÀ/\11Ãñ£&\ 1\ f4\19ø\9bº\0\1e|£öãku\bWÕa\QÏÆ\97ê\ 5¸¤þ#.hVãsÍ\ 6|¦Ù\8as\9a=ø´Ó1|Òù\1cNwþ\16'#\1eãøk"\8eu\11\8bÈ\1cþ\1db\fÙ\1f\80ç\f$?¢\14ø-2\ 2\8fz÷Áýî\83p§ëÛ¸Ñ%\19Wºæàb7;>ïæŹîU8Ó½\ 6\1f÷\98\8e\8fz4âÃ\9eÍ8Ù³\ 5'z®Åñ^m8Ök\a\8eô:\88C½Oã`ïkØ×ç\9fÌî¾O\98]\91"³ã\ 5Û_á\7fÇ\98®Ù§\83éØ\13÷\ 6\17-ÇÝÈÎøºO$.E\ eÅù×Çà\93þ&\9cê\9f\8f\13Q\858\16åÃ\91è\0\ eEOÁ\9f£g`\7fô\1cf_ôBfOôræ½\ 1ï2»\ 6lav\fØËl\ep\82é\18x\91i\1fx\9fm\8bù7»1Fd7\10ë\89w_A\1cB>\f¥«'\96®Ú\11À\r\1d]ûÃ8\\8eQà|L\ f|4h\10\8e¿9\12\87\a\806\e{µ6¼§õ`§¶\9cÙ®­f:´S\99\99L»v.»Y»\84ݤ]ÅnÔnb×kwr­ÚÃܺ!g¹5C¾çV\ eý\99_>Tä\96\11\88¡ÿG\1c\ e<&»wé\8a¿6\16ø\82ZÎY=ðñ[\12|0,\ 2\87\86Ga_ìpìÒ\8dÅ6\9d    [tyجs0\9bt%Ìz\9d\9f\ 5Ùuº:vMl\ 3·*¶\89[\11ÛÂ/\8fmå[b·J\96Æî\97\9d\96.ÒÝ\926\8fx,m\1a!Jæ?\87\9f÷
+OÈþ?Èþ­$Ò[F²M|@¿\8fÆ380J\83]£ûb«^\8bÍq£±!Þ\88Öø,fM\\ 1³2®\90]\1eWʶÄUqKõ\93¹ÅúiüB}£¤Y¿HÒ¤_%\9d§o\93ÍÑï\965êO\b³õW\84\86¸\87Â̸§²\19ñ¢\94\90¼ÊO£¨\ 5%Rë¥kýL\ 6Íù\99À!jy{\93Io$(ñ'C\ flHü\ 3Ö&\8dÀÊ$\ 3\96%\99\98¥I\16fQ¢\9dmNôpM\89åÜ<C\80\9f\95Ì6Ì\946$4Éf&,\13¦'¬\97OKØ!¯O8ª¨3\PÔ\1a\1e(¦$>\11¦$\8a2BZó
+\8fâ©\1d¦P\rÌÀ)Ò\9e\87s\81=´n#\7fÚ\8c2´¦tŪÔh´¤\ eÇâ´1hNMaæ§f3sR­ìì\14\17÷N\8a\97\9fa¬ä§\19C\92°1,­36
+µÉKä5Éë\14¡ä\ ee0ù\90j\92ñ¼*`¼§
+¤üG11E\14\bÙ«ü`\0®SÜgÉöññÀ~+ÅOëfz^\97Áb¹)\ 2K2ú¡9s\bæ\99G£1s\1cÓ\90\99ÁÌÈÈcÃ\19\13¸º\f7_k*\93Ô\98\ 2Ò\90iª¬:½A\b¤/\94OL_­¬LoWU¤\1fP\97§\9fQ\97\99î\12¿*ËL¢¼,C\14h\95½ä>åür\16p:\9f´\ e\8d>»iìØBëzòeE6é\9dl\r\9arú 1çM4ä¾\8dé¹\ 6¦>'\8d\99\9a\93ÃÖd[¹P¶\8b¯ÎòJ\ 2Y\95Òª¬É2\7fÖ\f¡Üܤð\99W(½æ6u\89y¯¦8ë´Æ\93u\87øEåÉ\16\15\84\9c\10^òWÚ\a\17\93\9cN`g!å\80XK-\7f     ù5?O\85Yù=1#?\ 6áño¡vü\18Ôä\e\99\99\räå³UyvÎ\9fçáË-\15R\9f%(óZÂB±e®Â\93»LU\94»QíÊÝ­qZ>Ô8,·;9,?«\1cy¢Â\99\9d\16QxÉ·T÷ódë8ÙÜGÚ³£\98ô\16±²\bX@~Í*P`\9a­\e¦Ú¢Q3a\18\826=\ 2¶$¦Òfb+
+rÙ²\ 2\eWZPÄ\97X}\12\8f5 +²Ö    .k£Âa]ª²[׫mÖ]\9a\ 2ëÉNVëMâ_j«UT\16XEù\v\84gܤ:\9c![GÉæî\12 Ý\a´\12-^\9aõ]4ë:¥¨u¾\86\90³\1f&¹´¨r\8dD\85ÓÀø\9ci\8c×\99Í\16\9cÛáâ\v\1d^\89ÓQ%µÛk\ 5\9b}\96Âj_¬\1cooUçÙwj,ö\13\9a\ûuâ±Úb\17\95\84\82\90\13Â3¾²Ð^ \1c\1c¤Øw\96ÑY¨ ÍGãðâr`¦\87ô\86\9bCµ»3ªÜ}Qáy\ 3e\1e\1d¼\9e1L±ÇȸÝfÖåÎç\9cn\aow\17KlE~©µ¨FÈ/zGn)\¨Ì)\§Ê*Ü®6\17½¯É,ú\8ax¤2\17\89Js¡¨ ä\84ð\8cKt\ 6NR\ eöSìÛ*©\ e4~®$\9a'\ 2õô®º\14ð\97jà+í\85\92Ò\18x|ÃQä\8b\83Ë7\8eqø2Ø    ¥\16¶ t\ 27¾ÔÍç\95\96Kr½!Y¶wºÜì] Èð®Q¦{;TiÞ£êTï\97Ä\8fªÔ\12Q\91V"Ê_ <ã3:\ 3ïS\röPìí4v¶\86¨\ e\93\81¹´N¡±ÜOï½~%ÜþnpUFÁQ9\14\13ªF¢ ÊÀX«Ò\98üÊlÖRiår*\vù¬J\9f$Ã?I\9aî\ fËRýóåFÿ*ErÅVe\92ÿ\88\7fI\95XñP\99T!*\92ÊE9!\8c\19:\ 3\87©\ 6;)ö¶\1a`õTÒ\9d\17i\r\92/>òÅ\15\94aB0\ 2\ 5ÁH\8c\ f½\81¼\90\ e¹¡1È\99ld²B\99Lf(\9f5\85\1c\Z¨\84O       N\94$\aë¤IÁ¹2Cp\850¶º]\1e\1f\88\ f^PÄUÿ \8f\9fôT\88\9f$
\ 1\92S\94\83ý\14o\aÙß\10&Ý7\1dh"i4\9d\bL#ÝUOs\7f\1d\83Ü:\r²ë{Â\?\10\99áa0\85G!=\9c\88Ôp:c\fç0ãÂ66)ìa\rõ~nLý\14>®¾ñ¿\\97yT\94×\19Æ\9fï\9b\8d°\8c3,²
+ʦ0\f\ 6\87\ 1'Æ-DkÕ$F\8f­5\1eO46\1a\8f\1a5"¸\ 2\13\15e\ 6\10E\18©\v8\80¸Â\ 4HÝpjÜ%\8a±©§\89&*.\8dÚTÓ¨(1Þ>
+&©\7füÎÇ÷\ 1÷y\97{ßû¾ª¾\99EêÔÌ
+\8d9³^\93\9cÙ¬Iθ­I\9eÿ³&9]hÌéBm\9e×Á^îÁ]ôu\võ\1dKY\13²\ 1+Ç¢ùVæ\81ÏwÈÛdX¶'\86äø!-'\1c¯Yã0ØÚ\a\83¬ý0À\9a\86þÖ\11èg\1d#Y¬\13¤Tëû²Ù:Ga²f)\92r
+\94/çlV&æ¸TÆ\9c\13ä¦Ò\98õXe\*TÆ%¿RÏ=PC_7f1\ 6\1f³&¬àyÈe\1eVr\1f¬âì\95\a\8c \83ódô³ia±\ 5¢¯=\12©ö\ 4¤ØÍH¶÷\87É>\14}òßBRþ8ôÎ\9f,\19í³$\83}\91\14o·É½ì\eäX{­\1cc?&Çؾ\93cò~RĬ\14\1däv°\8bywÒ÷R\8e@ùÔ´Ú\19\83\ 2Æ`5÷\ 1GÕQk\81×\8b\81\ 1I%\1e0\96ê\91P\1a\ 2Ci4âK\8d\88+MA/Ç@ôt\fC¬c4b\1c\13\10å\98\86HG\ 6º;r\11áX/usì\94Â\1c\87¥°ÒëRغv)´XH¡k\85ü\9c­ô\7f\ 3}/²q\1f\14\ 2\v©;\93z\93\8eåxøû\8d@ÿM\80i3\10_\ 1ôpz"©G¸3\ 4Ý*£\11ViDhe
+B*\a"¸r8\82*Ç¢kÕ$\ 4\86\7fU\ eüª\8aá[U\ 3}\95\eºÊVè·<\84¾B@_.¤ç\94S\7f\1d\17\ 1\9eÃqp
+5ÇQod%0¨\1a0o¥þ6 r'\10ÌùÔ·î%è\:\12\ 4­+\92\18àã2\93Aðv\8d\80\97k\1c<]SááÊ\84Æe\83ÊU\ ee]#9Kî@Uû\ 4êÝâ\17\1c\8c{!ãm¥ßéôyê\16`<5ßäX:x\17õk\ 1\83\8bþ7\0A\9f\ 2z\8eª>\a\14Ð\1cô\86¢É\17RS0\8b\$1\10θ\aÙ\84¹yáºYèÝ<ðn&ú \9d\9d|Æ&í\1ay@Ä/¬a®\97Ó÷Ìr`:}\9e@í·ê\80×ê©OÍø=@÷ý@àA@w\bð:\ 2(\8f\83\17\9d\86ø\10\14íh¦\1dÍ´ã´\198C;Îð2na±oa\91iá&o¡\83-\´å\f¹Íß?$O\9e±\929_HßgÔ\0\13éó¨FêÓWó\ 1 Î\r\84Óô\80c\80ö$àñ9µÏ\92¿\93\7f\90ój6@ÞÀWzàBW6¥\11À·\1c\16.³Ao¥\1d­¼\8c®òò»Ê¢w\8d\ 1¿Æä^ÛÇæñKr\8büø\8cÅN`\16Ãôî'¬\ 3ÔN£¿fêö¢n\18uýN\ 3Þ_Ð÷§\9a_\93\15ÒJ\18V\Wp(y      ¸©esÌ\98|\1fÂA%\9aÍz\12p\8fvÜccp\9f\85ø>\8bÞ\ 3\ 17V\e\1dlc<Ú.=c6÷Ù$æz\fã=ä0\90Â8÷¤¿¡ôWO]Ï\vÔ¹Ô©y\9dÜ$ÿ&ß\93»ä\aBwp_Éõ<\81v\1dð\981\11=H"aÃ,h\87`1\14Ü\e¢\84\82\89\16îg\b\9f0\bÏPð¤B \9cD\93Dò*\19Nþ@Þ#3I\ 6É"¹¤\80\14\932RNªÉNÒ@\9aÈI<Á7ø\99Æ>F;~â\97vò¨óù[\84.\98v\ 4B¨»ò-¨Ó\8ex\92J\86\90Ñd"ù\80Ì%\8b\88\95¬"«©SB\9d\rÔ© N\r5jñ\10\0\87q\ fç\18¢\7fá¿|»Ë¿¾C\9e?\9fò\9fN\84¯?D\17_\b/\82§\84\90\18b"\83È\eäOd
+µfRg>u\96 \rËp\1f\14\94)ÙÈõ\9d\s;SU\8f[\8cÅwh¦\ 5W\98Â\1fp\95ÿ}\95«´\92+\9d\îDøë ôZÆÂ\a\859      à×îÄH^!¿£æ\18êM¤?Ó¨3\9bÑÍÄmæä&\96\8e\eXC\1d\a56síjn\9fݸÈX|\8d£8\8f¯ð%­:ÇU¾àj-äÌ\v\88@oÚáÁX¨ ´^\10ÞzÚÂXH±\8co2ý\1cLÍ7¨7\8eZ\93©3\9d¶ÏåñX\80\vȦÂ
+êä󸮥F\195*p\9a±hf,NÂ\8dc<ÌGiéaæã\10õþ&\v¸\15ÿ\8f\b\ enO\7fâG;ô\8c\87Ö\1f\8f<#pW\9d\80\e
+\v.+\86â¢âm\9c\83sÊ)hQÍÀçª\8fpJµ\10'T98¦ÊÅQu\ 1\ e«KpH½\11nu5\9aÔuد9\80½\1e§±Çó:\1a½ÚPï#à"uOÑ
+Ôv"©\1dÚA;\8föý®*< \1d·µ\ 1\8aÄ?½\92pÖ{\0\9a}\86ã¸ÏX\1cÑNÄ!íûpkg¢I;\ fû»,ÂÞ.VüU\97\87OuEhÐ\95á\13\9d\13uú]¨ÕïÃ.ý)l÷½\8e­þm¨
+\10p\92-/ XbEw\1eõ(à\ 6KËe\1eë\8bÁ*\Ðyã¬>\18'üâðY@*\9aº¾\8e½\81o¢1ð\8f¨\ fz\17uAS±;h\16v\ 6§cGðbl\v^\86\9a\10;ªC\8aQ\19²        ÎÐ\1aT\846`sØQl
\84²n?J\8ep!\95\92\92\b!­û\r"\96¥¬'õ\8d,\83½YÊù<Å÷ã\11\1e8\14æ\87\91h\88HBm÷þØÑc\18j"G£:r<\9cQ\93Q\11õ\ 1Ê£>Ħ¨\fl\88Z\8a¿D­ÀúèB©4z½T\12í\94\8a£ë¤51n©(æ¼T\10{G²÷\14²\8dä\91U\1dHOi\8fcÙ{\19ø\86WÞé¾À\91T^o}Øk\ed4Æh±»g7ÔÄ\19P\19ß\17åñiØh\18\892ÃX8\f\13Pbx\ fÅ\86éÒ\1aÃ\1ciuB¦T\98\90#å'äI¶\84b9/a³¼2a\87¼"a\9f¼ÜxFñqâ-ENâcEv¢\90³:YÚÉ=\96ÓkÔ=×\9fóÖ@Î|¤áU \96×߶Þ^pö\ eĦ¤X¬ïcBI\9f\ 1Xc\1a\86Õ¦QÈ7\8d\83Í4QZeú³\94k\9a!­0}$-3-\96­¦år¶©P\91e*S,1mU,65*\17\9aN*\17$ßPf\98\1f\9b\85\ 5î\9a\18\ 3ê\9fJ£ÿC\80Æ¡ìqùs5¿\95§¨±>Å\ fÅ}{`µ%\11v\8b\ 5«,iȵ\8cÄ2Ë\18Éj\19/e[&IK-ÓäÅ\96\ få\85\96\fy\81%[\91a±)Ó-%Êy\16§j®Å¥ú\1fÑe\1e\15Õy\86ñçÞ\99{\aD\r\8aK]\13\r¢qÁ\15D\96\19pFf`\ 6¹â\ 5f\90\19\96\19\10\ 6Ù\ 6\95ÀD\8d
+\135.\8c\ 6q-\15\8d5z\8cX\9b\98TkÔÚÄ\9c4§mz\825m<96ij4IÛ\93\01ùãwî=\ 3÷<ßû¼ßýîûÔ/¸*×&~,×$~#Õ$\85´Õýhª\13û¹¿\80\9fá\85ì\81\ 5¸heý¤3\ 3xÙÄ9[/ \98\1c\89­)ã°I?\15-\868¬7\18°Ö`Ás\86l¡Ù\90'<kp
+«õ\1eq¥¾Jôé\e4uúç4µú\17´Õú]R\95þ\90ìÕ\9f\96+\r\96\ezÈWryjH"Ú>\fý|Âzßeí\97mìA6³\ eG\8f#¼îËä\8cÉulI\e\84\96\85£ð¼1\ 6kLsÐlJF£É\84U&\9bà3-\15ê\8c\ e¡ÖX,V\e\97\8bUÆZM¥±I[aÜ(\95\e\1ec»Îm<©+1¾\1eVlú\vy¨+6\85ä"SH"Úâ\1fø\e?ñ7©w\89Úgø\89íÌ\ 5:xÝÃu¼H?6\9a#°Æ<\1c\89Xm\89E\83%\ 1õ\964ÔX2\84\15\16EðZò\84
+\8bS,7{Ä2ó
+\8dÛ¼Z[b~^*6o\93]æýºBó\89°e\96Ka\ 5\96?\92\aº\82\8c\90\ 2K\1fÚ^þÊZ¯e\ 1ÝÔ}%\9f\83\99\93\19\ 2\ 1\8e\85k¬ah´\ eE\83íIÔÙ¦¡Ú\16\87*\9b\1e\15¶t\94Û²\ 4\8fm©Pj+\10Kl¥b\91Í«qÙ\1a´\85ÖµR\81u\8bl·îÕåÛ:Ãòl\17Ãsmï\85«¶/ÂÔ¬\90\9ckëCzÌ\aÜ\a¿åÈu\9eú]˸\ f9\8a¾D¶q-ë¹®Æl-ê³#Q£\8c\85W\99\82
+e\ eÊ\94\15#J\94L¡HY"8\15»X¨\14\89\ 5Êr\8d]©×æ+~)WÙ$/U~®ËQ\8e\87\85pEy'<[ù\9c÷!\1d\91\89ô\98ÛÜ\83\97YóÙ\ 2öÁżÅ1t7Ùì\ 4\9eãº|üÛ\8a¥\83\8eB\99\1a\8dRu&\8aÕ\ 4¸ÔT\14ª\16¡@Í\16\1cj\9e\90¯:Å\µL£ª5Ú\1cµIRÔ\80¼XÝ­ËR\8f\85YÕóäVx¦úO^¿×YÕ\90L¤ÇÜ¢ß\97¨u\9aúÇJÙ\a\ fû@\ 2¼o¤/ÕìK¹} Jí#Pd\9f\b§c:\969âápè\91ïHG\9e#KP\1dª\90ãX&.q¸5Ù\8e\15\9a,G£Öjo\912ì;u\16û\11\9dÙq.,Ýq3l\91ã>¯ßÉéöP/\92ù\aÞÎá^ ÖÉ\12à0GOÆ4l¯ä^\N\ fèG\ 5×Vâ\fG¡3
+\ 5ÎñÈw>\83<×\¨®$ä¸\8cXâÊ\14²]9Âb\97C´¹JÄL\97Wcq­Ò¦»6H&g\9blt\1dÒ¥¹^Õ¥º®\93Ou©Îoå4gH꣰\9f+y|'\8b\98{©ßáåûÀX²\85¬[\ 1Ôr\1d\1ez²¬TB^i$ÔÒ1ÈqO\82â\9e\89Å\9e\ 4dyRaõX\90éÉ\16,\9e|!ÝS$.òT\88FO\83&ͽNkpo\97\1dr²û\8c\9cä¹FîÉIîÿII¥¡>\92KBÚ^Þ \ag\18\ 1\8eSÿ@-ûÀH\12 þzî\ 3®¥¸\8a¹\93¾dW\fBVåHX+' Ã;\r\16ï<\98½)XTe\82©Ê\86\85\90VU(\18¼eb\8a·NLò®Ñ,ðnÕÎ÷\1eÔÆ{OKqÞ«ä\13)®ò¿Ú¸Ê\906®â'.ÒïSÔ8\Ç>¬âûÀ8²\814\92Ê\95Ì]\rÌ\1d\\8f¥n\0\16Õ\r\85±~\1c\16ÖOFªo\16\f¾\ 4è}©HñY\90äS\90ès\b  >·\10ï«\16çù\9aŹ¾Í\9aÙ¾ý\9a\99¾S\9aXß[äï\9aØúÿhbëB\9aØÚ\9f\1et²þöÕÀ®f`\13£ÈÚ5Ü\vÄÃû|?`ãï\v\9b4Hn\1a\8cÄæ\91XÐ<\ 1        ÍS1ß?\17ñþ$Ìó\9b0×oÃ\1c\7f.fù\8b0Óï\15\e\85\17\84©þ½â\14\7f\97\7fY\8cñß\15c\9a¿\11c\9e\rõ1¹±\9fÓìûQêï£Þöu@Ë\ 6\8dìC\vPD\96\103I&s[Â1«e\b\8cÆ\8c\96hLo\9d\81i­q\98ÚªÇ3­fL    (\98\1c(@L \1cÑ\81\ 6<\1dØ\88 \81=x*Ð)\8c\ fü\86ô`|ËWÂø\r¡~Ö÷óKúÝÁ\9awQ{s+=Ø\ 4Ôo\ 1Ê^\ 4ì[éÁ6 \95Q1\9e\ 1Lj\e\88§Û¢0±m,&´MÂSÁX<\19\8cÇø`*Æ\ 530\96\aìè`1F\ 5kð³àZ\8cØÙ\86á;\8faXð"¢\82\7f\8eG\18¶=\84aÛÈÖ\90ÐËQêïeÝÛ©ÝBÍFêT\ 6\ 1'£¡²\87ùï%`Á^ v\1fõ÷\ 3ã\ e\88\18Ñ>\10ÃÛ£0¬}\f¢Ú£1´}\ 6\86tÌ'i\88ì°á\89\ e;\ 6w,Ç \8eF\fìØ\82\88ö\ e\fh?\8bðö[\b\19\ 6\1cø\1e\11ûC\88Ø×ÏAz\1c\9b\7f'Ï$ÆÁbê©\a¹\ f_f\ f\ e\ 1³\ e\ 31G©\7f\1c\18Þ  D\9e\90\10qr\10º¢ ë\1a\ 3¹+\1aRW,´]  \10»L\10z?¾]<XºjÈzÂbNt\91·x\bü\83|ÍM\18ú\91=ô|k\eÏ\ 3þ[=ëtw\0yG\80Ì_\0)\8c¦³ùhÌIê¿\ 2\f;\ 3\f>\v\84\9f\17 ¾Æ|ûÚ\13d8pa\1c\99D8\90vs éæ0ÐÍC¾\9b\87K77[7E.°\98\v̹\17Þç3_\90oI¨\8f\1d¬}\ 3ý^ÙÎ3\99ÚvÖi=\ 5è\7fEýW©\7f\ e\18ËG£º\81A\97\0ù\r\80a\85\1f:-\89\0®Dr\0â:®\8eå0ÈÁü\1a\87Ãë\89À\r3áGà\ 6\e\8dÝü\9d\ 5]¿BèÅõGä»>Zé{#=¯`Ý\ 5¬7\8bº\86óÔ§æ¤_\ 3£_\a\86¼      DðQÍÛÔ¾Iþ@Þ!ïj\80ÛáÀ{\83\81÷\87\e\ 5ü\89aáC\ eç\1fÑ\8f\1e\ e =ü\18ÞaOîpÃßa\83ïÐÈ\9eß\93\7fÔG\13{]EÏ\vY÷bj§²ÖÙ¬5\9aµ\8eú\1d{\7f\9dÞßêÕ#´\91á\8e\ 1\84|Dî\90»äc\89\831=¹GO>\1d\ 1Üg`ù|\1aC\výxÀ\ fó\ 3î\8d/yØ=dO\1eÒì\874öá\r\8fjÚãbíÊE í20ç*õ©;\92º\83oÓû\ f¨ñ!ééÕ"\>Ã'uÈgä_äßäKòH\ 6¾\1e\bü\9fì2\ 1\8aêÊÂðÿÞkDT\90Å}\v**      ¨\91EZ \81nèÆnh\1aè\ 6\9a¥\e\10\ 1\11YDQ\81A@\90 ¸\12\14×B"2¸¡b¹M0\9a1\8eÆrRV&NÍRV¥\9c8ff\*5qÜ¢o~\90\99êúêÝ÷ªúþç\9e{î=缤O~âÞÈl\1cdÚ!³H\92\99\88åu\84Á'3Àen²üù\0²ãDö·ãÙ\8döÃ^\17Ó\89\ fYD¢\89\85d\92åd\15©"õd3ÙAv\93ý¤\83t\93Sä"ù\ 2oq\17?ÑØ×x\81Wüò\92¼\18ä?äßä\a"\8f\1c\vÙÁ\83£~Æ\fÚ1\87\ 4\10\r1\91t\92K\8aÉ\1a²\9el¤F3Þ`'5Ú¨q\90s\1fÆs\1cçügñ#>£Æmjü\rO9zÂ\7f<&\8fÈ¿\ 6\9f?\8feg7ÈN®\1c\8d&ýÏqd\ 6\99OTÄ@\92¨\95E\9d\ 2ꬤF\ 55j8s#5¶P£\85\1a{8g;çìâVõà!}ñ\0×iÁ_\182\8f\19:¯¹\9d2Ãèÿ\91G;C\1e5\12²äÄ·QÄ\9dL%ïó_AÔ\8cÂ3Äs»Ó¨\93C\9dBj¬¢F%5j©ÑH\8d-Ôø\98óíÅ_¹'\7fÆQîB/¾¦/îð\0}Å ºMËoqÖ~¾$7\87 »\r§/DÆ\ 5ÃÃ\81\føâ9}ñ\14\1fr]*|\ f=¾c\|\v\eur©QD\8dUÔ¨¤F-5>¢ÆVÎßÊ9÷ãwèd4\9cÄoé\8b«¸\81Ë´°\8f\1eû\94»wi0Z\86"\8f¡6¯;Ù\990¤eG'¼\10\©;\89kô¦æBü\89qñ5\8cÔJ¡N&gÍ£\97\8bp\r«y]Uâ
+ê¨ÓD\8díÔhÃ\ 5îÉ9ÆçYþÎÐ\92S\9c¡G|\8c\13Òk\1cw\90ql\98\8c£C\90y\9ce\1e¥çä\91\e\8f\1e¯\9b\aÃ\86ã\9eä\8eo$Oü^1\177\15Á¸æ Ã\15\87\r³âÒ°,\pÌÇ9Çb\9cu,Ç\99áU85|\ 3z\9c\84S\v\8e9íG÷\88\1aq\1aGF^ÁáQß Ãù1Ú]Þâ \vsÔh\9e¤!È\93¨Ïëí\9fÓxå\90»|¿ã!â+ÆÈ\8d\91ãpÕy\16~ãâ\87ó.áè\1d­Ç)×D\9cpMÃ1×lt»-C\97[   :ÝÖà\13·jt¸mD»û6\1ctoÃ\ 1÷O°Ïã$öxô¡mÌ\1d´\8e}\84\96qo°c<ó\ 3Ù6\84WL7OfRß\9bÚ\1f\07æ0\1dL\a.OtÀ%wWô\8e\9d\86\93ã|Ñ=^\89Π    \91è\98\18\8bö\89\16\1c\98\94\81}\93\96`ï¤\ 2´M.Å®ÉkÑ:¹\ 6-S\9a°cJ\v¶O9\88­S\8f¢yê\ 5l\9ev\vMï=D£ç+4xÊBý \e\ 6yÆ4óÀ\97×ð\ 2¦\e\7f \8fÏó¼îO3\r\9e\98:
+]Ó& Ãs6\ eL÷ÃÞ\19\9a\11\8d\8fg\9a°sf2¶Ï´a«×R4{\15b\93W\19\9a¼*ÑèU\8f\86Y[Q?k\8fP7«S¨\9dÝ+¬\9f}]¨\9es_¨\9aó\¨ð\96\85uÿÃS^ë÷¨}\8b)æ³\10Öù¼ZO.\ 4º\98\86\1d±\7f\8e\av{{bçûs±í\ 3%\9a}4hò1 Ñ'\11\r>VlðÍD­o\1ej|\8bPí[\8e*ßõB¥o\93°Î·UX3÷\90P>·G\=÷ªX6ï\9e¸rÞ\8fbé|Y,y\87P<È÷\÷\1f¨{-\9c©]Í~\8bt\85±¾S²ï\ `ç<Wl\99?\ 5M\1fz£a\81?êüT¨ñÓ¡ÚÏ\88*?\v*üÒ±Ö/\eå~\ 5Âj¿R¡Ì¯B(õo\10Jüw\88\aÅ\15þÇÅå\ 1}bAÀ]iYà\ fb~ <@ÞÏ\ 4Èâ}®ù6õ/G±çdÊï&\878ÞÃo;è\9b¦\0\a\8eGÍB/ü*h>*\82\16a­R\83ÕJ=Ê\94ñX©LA\89Ò\8e"e®°BY$,W\96\vË\94µb¾r\8b\98«Ü+-]Ô--YtIÊ\ e¾#e\ 5?!²\94\19,\8bC¹Gÿß\88\ 4.1Õ÷0ÍvƲ×1\0-ZÖ¸´£.Ø      UÁc°6Ä\13«C}P\16\1a\88\12U\18\8aT:\14ª\8c(P\99±L\95\86<U¶°TU ä¨Ê\84lUµ\98¥Ú$ÚU»%[Ø\11)=ì¼"-ì¶"-ü\91"5ü­\94\1a.÷#\ e\10&\8b\7f¤Î5®ý\1cµûËÀC¤ÍÄ\1a\97ö4Ð\8eÊ\88a(\ fwÃÊ\88)(\8aðF¡Ú\ f\ 5ê\10ä«5ÈUë\91£\8eG¶:\ 5Yj»`Wç    6M\89\98®©\14Ó4\8d\92UÓ*¥h\ e+\92"Ï*,\91_\92\7f\91o$s¤,YÞ!ösG\ 3\áº{©ýk3{\1d\96\81­|næ{\r¿\97kE\14Gº 0j"òµ^ÈÕÎÃ\12m\10²µáÈÔê`Ó\1a\91®µ M\97.¤êr\84\14Ý
+1Y·V´èê%³n§\94 ëPÄG\9fQ\98¢o(â¢\1f\92×D\96ú1\rr\9båç§qÀ)jw²üÛge\9dÍg#ß«ø½\94v\14,vFîâqX¢\9f\8e\ f\0¤ëC\91ª\8fD\8aÞ\80d}"\92\f©\82Å\90-$\1a\96\v    \86rÑd¨\93â\fÛ¥Ø\98vELÌi\85!æºB\1fówò\8aÈ\92a\b7\19\a\17\13x\17P·#\9d±\98Á} õ©À\1aú£\90v,5\8e@f¬\a2\8cÓ\90\86Õ¸\0ÉÆ`X\8cj\98ã\16#1Î\84ø¸\14Á\14\97)\18ã\96 ±q«D\83©FÔ\9b¶JѦ\83
+\9d©G¡5]SDÅ\7f§\882½äX\96\ 6\88\17\8c\83sI,ý©ßβoW\16ÐLj9.£]ù´Ã\9eà\88Ô\ 47¤$L\86%a\16\12\13ç#!1\b¦ÄpÄ%ê`4\e\11kN\82Ál\13ôæ<!Ú\*jÍÕb\94¹YÒ\98÷KjË  E\84åsE¸å>y!E\98å_H\94¥«Ü÷^ú¿\8b\9a\aXòµäò<\92j\8e\8bé\8f\1cú#5Y\82\ 5 É\13`J\9e\ 1c\8a/bS\ 2`H  \85Þ\1a\85ÅÖ\18D[ÍÐZÓ\85(ëRAc-\16"¬Ub¸u\93¨²î\95B­Ç¤\90Ô+Rpê·R°õ9\91¥\90\94_èã¾÷Pëp\ eûÞ|Þ        l\a6\92
+\8e\viG\16}\92dcÍ\9d>
+1éc Ïx\ fÑ\19ÞÐÙ\16@k[\84H\9b\1a\1aÛb¨íñ\88°[\11\16Bí+\84\10û:q\91ý#1ÈÞ&.´\1f\95\ 2í\97¥\80Ì{R\80ý\99\14h\93Å\ 12Þq\91ë<\96Í3IÍÝ+Øs±\15¨#kþËv\99Ç×x¦aø>Ç\ 4Y\9b=\96\85lvBP&-~\98¶ª´\18Ú,È"d\93\92å\88%\91Ä\9eåX\83ÄVjI ¥5bÔ´Æ\18c´1ÓZÚi«C\83ªvZ3ß\\91Ìoü1\7f\r\12ç{ïçyÞ÷{Þçæólb\99>Kz       »4&ÞVqñ.\1a\15ß]#\13\824"!RÃ\13\ 6hXâ0Å&>§¡\89\13\14\93ø\8a\ 6'ÎÔÀÄdÓ\80Ä\ 5¦~\89ËM}\92ªÌ½\93ö\98£\93Þ5G%]3G%>4G%\18æèVâÛhd\ fö ³e®T\91Á>`\ 3
+ 3\93³8\1fßE<\13\88gTJ\aÅ&;iH\8a§bRü48%L\ 3Sûh@j\8cú§\8eT¿´±ê\9b6Q}Ò¦+:m\96¢Ò²\14\91¶ÄÔ+­ÂÔ3m\97),í\84)tîUShê\ 3Sh\8añ\84°dÃÜÊAr¬Cc#º«±\86Ë°\0\v\17Jsùùz®ô2\7f\e\93\83÷ãÿûgÚ©O\96\8bzguStV ¢²Â\15\99Ý_\11Ù±
\8eSÏì  
\99¢Ð\9c\ 4\ 5çÌSP\8eE\ 19kå\9fS+¿\9ccò͹,ßìûòÍ2L¾\99\86É/£\8d·R¹\9fX¿\12ݲ|Þ\87B¼§\85}\80©0\81ß\7f       \83±\8cÑ\ 5f\85\158*¤À]A\ 5Þ
+,\fV@a¤ü\v\aÂ\bùZƨ\87e¢|,3ämIU7Ë"uµ¬\94\97e\9b<-\8dò°\\94Ga\8b\99XóÚð\82\9dÔ|Ó"i\r\97Ð\97\96Q\83bjP"M\821+¤Xè\vaà·ÂFÝJ\9dÔµÔC]J}äU\16"ϲ(y\94\r\92{ÙH¹\95\8d\97kù«r)O\92sy\8e\9e)/\91SÙf9\96\1d\92CÙy9\94~#Ç\92Çr*az.nc[\1e5(¢\ 6XÒÅhda    \93Vñ>®\91ÆcËF®g\ f \17øWàA+%×ê\8er²:ÉÑê!\a«\ f\84ÈÞ\1a-;k\8cl­qêl}Q\1d­3dcMW\87êÅ2UóP\15¦¶
+#[y\ 3ðº\15\86LëÛØ@î«Ñ^¾RÊE7\ 5­_Wá?7Hq\9bØ\83ÍRÄ\16)`+ú5èo\97\1ckÍêTg/S\1d\1e·Î\v|\81\8eadg,\8c\81É@£©ãPÕ\91X\1d\ fÖâuw\\ 6\fêö\9fÁxº2îèÕì\ 1Ús­ì\ 1\9a/£õü\ e)\ 6k\1a¹S
\8d>i¸ì\93\1cÞ\96l\ eâo\ faH\ ea\b\ e1\8c\1fî\ 2~R=Ci}_\9a\1eCP\ 3\r¸\81æÛÀ\81o Ðõ,^ÏÃ\87ÏÁ×<÷\ 3\18OXI½-ä\9dAΠÛèGh\8eFo\bz\91<\12\80^\97Ã\92s£dwT2\1fGÿÝvN\12ÇIâ8E\1cïa\12Þg0?Ý:\14\13Ç\99g\19
+\18\ 2\9ahrMÙ@-\9a\89\ 5Î|\f\13ßý·\8a\b/\8b:'\91ó\14´Ç\1e\90\86Ö£\8f¦?¥ó<!9¡×\89­ÄÐ\bsÃÐ\ 3çá÷ð¡\8dô\91½ô\a\8cÒE\fÓ%o\86Ã\10é*q|Â`ø \17N3\r¨\99\97®\99sѼ\1f\9aà&°'Í\ fµ\80ÜgSë×Èy\\ 3ïÀ1)ê\1dôOI\1e§Ùû³Ô¾UóC¸\bl'F\ f\rh\86¿Â§p\9d\9aÜĨ}Þj\940,·\19Øï\10Ç]\86´o9\e-4\81\16\16\ eW\vB-ìI\v\ f¶|¡\14r\9fv\88w\80\9c\87\9f¤\a ë\87®;y:\ ö\97XÿJ»Þgp\vþ\ e_\ 2ÛªÛp\a¾\85{fé\81­ô=5ù\91³ú\18ãb0´\e\f)ÆT \11\e¥@â\ 6Å6\103Îá8=À½\1d\810\18\ 4\12L\87Y0\ f\10\96C9¬\ 3+l\85\9d°\1f\8eànß׿(ÜÏ\ 4ûO=Ò\8füõ\87§¸\awàv«çÅW\1arnÇ¥=\8e è\v#`<L\81\ 52a!ë/Öc\15ë'­Dc=\1a\ePÚ¦ïµ[\ fuP\ ft\ 2\9ds\94ç3ÝåÓ?\88ê\9bvÍV¾\82ÏáFk\f\9d\9cø×\11ìÁ\ 1ÜÀ\17"`\b<ÏÓ\13Ég::Ih¤é;eë¾\16©EEh\94\90Ï*Ö¯`íM¬½\83ÌßbýFݤ\16×u\89ãr[×\88´\99Õ>\86¿<Å\95Ö\18líd\98løÔ\ 1lÛëÑ\15Í\10\9f\9c\9e%§ñhMFg&\1a³õ\85Ò9\16Ùä\90G\96\eq\#\8e«ªdÍÍú\93êôG\1dÐ\ 5\1dç(\7fÀ+t\83\8a|Ç+e¨éÿ`Ø\9bØ\ f\8e\86Ô\1e\87=ßvEÓ\17ÍHr\1a\82Þsh½@\1e¯¢ñ:\1asØét4²ÑÈC£\b\8d\12\9dÕj\9dQµN«Fïi\ f\81\1d9­c<u\94j5\92Y#
+\ríÔ·cÐb\8c\8ez\12\a\9d\8b¼;\90«#\91w!·`ý\99sqQÃÑ\1a\8bÎDâ\9eʪo 1G'\89ã\1dâ8N\1c¿!\8e#ZÁÚkuX\e9\11µz\9bZìã\e\11§äKíB¡õÔÖAíS\18´ü\9fy­[\9c\88ç:¯Ö5ud\17]hA>äÖ\8b]\1dDN£Èg\1c:\93Ð\99¦C\8aGa\ eoA:»\9f\83N\1e:KÑ(gÝJm§\165¦½Úb>ªÍ\1dÎi£Í-mèøPÕ\9d\r\1aª|\8aÇ´\94û\1e´\16ÚÊU¸Àç\ f\88ël';\9dêà®c¿ðWCÇ(\1dì<Dûlã´Çv\82vÚ½¢Z»éÚn\17¯\1aûdm±\9f§Íö\v´Ñ¡PV\87bU;¬U¥Ã&­wÜ­u\8e\8dZãø;­rº¥rçG*u6´ÂÅPÉS<B÷+®\9b«´µóÁ´ü\0¼'íö\88»Iõ\8eNÚçÔU»\9e   Õ\ eç~Úê2\\9b\Fk\83ë\vªr\9d¬
+×éZç\9a µnÉZí6_+ÝÞT¹[\91JÝËUâ^­b\8fZ-ó8¬¥\9e¿U\91ק²ty¨\82®\86òÛÉk§Å\9f\93V\1cɵ\13\8d×\88`ÎæÚÙë×z-wV\8d§\9b6zù«²k¤Öu\e¬ÕÝFª¼ûX\95v\7fQ%ݧh¹÷\f-óNÔ\12ïT-öÎ\92Å'_\ 5>ÅÊï±N\8bzÔèMßýÊõ=©\ 5~W\94í\7fO\99þ\862\ 2Àÿ\7f|Íu{¹7WØ\0éØ é\0?w1\ 6Ô\84ã¹\ 2ÍZßÃY«üº«Ô?TÅ\ 1}µ40VE\81q*\f\1c§ü \89Ê\vzM\v\83f*7h\96\16\ 4§+;8WYÁEÊ\bY¥y!\e\95\1e²GsC\8f+-ô¢)%ì®)¹§a\9aó_ÂÚ¸\19ŵ7\90+x(×û0flØ\16#Yiók¨Í\8aP\a-\rõ\94%,@ù=#µ°× åö\1a¡\9c\95\15þ+e\84OÒüðiJ\ f\8fWZx\8aR#2\95\1c\1f¢Ë>ªéë\8cãß\e\e
+h\15- ZåE%¼\ 5H\ 2y!\84@\ 2$\81\0   \92\10$\10µBТ\10\94´µõ\85 õ\95\ 2«N»!´ÎZµ­Ò­Ç͵\1e{\9c¶ÛéÖÍ3ÏÚnÖu;íÖ\9evN\7fûZØñ\8fÏ!ü~Éý>÷¹Ï½÷û`Í\8a\17àO= \9aS\8f\89\eÂ'¿,V¥Ý\12\riw\89ô\0¹$þ àuLës\8e×ì\b¯¸£ä0¯þ^5õù®K>\ 5[R£Ñ)\8fG{Z
+6¤g¡-=\ f­é\85X\97aÁÚ\8c
+¬ÎpÂ\9fQ\8f¦\f?|\99mX\95¹\19\r\99Ï
+oæ^áÉ:"ÜY§D\9dâ\92X©ø\Ôfß!\92¨U<àº\92\83\9a§\8bX\ 3´`\83d?¯¹\9d|ÖÍÜlÎ\9e\88ö¬H´)\16 E±\14k³Ó°:;\17Í9:ørLhÌ)GCN\15¼9uðäúàÎ]\87ºÜ\ eQ\9bÛ-\Ê°¨Q\ e\8ajåIY\95ê¢Ì¡úTæP\7f/\1c*IT\12Ç8\1f0\a\17\8c´TfÚ?Ú¯>²§\14ØÎ8\9eb\1cí\8c£E\19\815ªyhV-\86\1c\rj\ 5êÕùð¨\vQ§¶`e\9e\1d®<\17\9cy\r¨É[\83êüváÈß&*ów\v»¦_Ø4#2«ö]Y¹ö&ù\8e\a4c¼O\9d79÷\91rZM;ë \82\1e\97\16ì\19Ʊ\99¹        ð½_3\1d\8d\9a9ðjâáÖ&c¥6\ 3\12\1eÕ:\13ªtåpèªQ©÷À®÷æ_/¬ú'EYÁ\ eQZÐ'³\14\fËÌ\86wd%\86\eä["ÝG\94\14\8cñ+æà\fõ\86¨?XÅu ;i¿ºøÿ&\v}6ó±Ê0\ 5î\82\1a\1e\81Ó°\14Õ\ 69\1c\86lT\18\19
+a+,\85µ°\12åÆ\95(5ú`1\ 6\84¹h\8b(.z^\98\8a\ eÉ\8aLC2£iTVhú#ù\86\11\85Ec¼[LÛËy¿Bí~'°×ÅZ$[«ésùÜÏ8ܦIp\9af¡Ê\14\83
+ÓbØLËa5e¡¬X\8dÒâ\ 2X\8aÍ0\97ØQRâBqÉ*\14\99[`4\a\85Áü\9c(0\1f\10zËOd:Ëy\99¶ôc\99Öò/"É´fIèÆ\19¥ÆÉJ\9eGÔ=L+Þë\ 1\9esÓë×Òë3\1f\8d\8cÃY&Pa\89\80Õò0ÊJ\17ÂR\9a\fsi:\8aK\950\95éPTf\82±Ì\8aÂò\1a\18ʽÐ\97?\ 6]y\87ÐX\9f\11ùÖ}"Ïz\¨loÉT¶\8fÈ×Be\95Æ(\97\84\9a¼me-Ðr\1e¡þA/°{\15\10"Áz`-ãòò]\15c,³M\87Ù\16\8db{,\8aìKQhO\85Á\9e\8d\82\8a|è+\8cÐU\94A[Y\85üJ\ fò*WC]Ù\ e¥£[ä:ö\8alÇ1¡p\9c\13YU×D\96ã+~\96\84¢ò\ 1g9þ\10íæ Û\80}M¬\ 5Úð.¶G\e}\\aÆáfN*\18KqõC0TGB_\1d\ 3]Í"hj\96!¿&\13y5*¨\9d\ 5P9ÍP:+\90ëZ\89lW3\14®\rÈtu\89\fW¯H«=*äµgDjíUòO!wIBî\1c§F\12¯³\ 6\8esþ/QwÏZîÉÇ\80\865ìyøÌÕ\b0½(ôÈ\90_\17\ 1µ{\ e\94î8äº\13\91í\91CáÉA\96G\8bL\8f \19õV¤×;\91\88Ôú\0Vx\9fÂ2o\ fR¼/#Ù{Z$y¯ Éû¥Hª\97D\92G\12É÷qKâUÎó(ç\7f\88º=\ 1®C\e÷$   ðs\ 3[\82*Æe^\rè\18O¶o*2}QH÷ÍGZÓ"È\9bR\90Ú\94\81\15M*,o6`Y³\ 5ÉÍUHjö"Ñ¿\ eKü[ð¨\7f'\16û\a\90à?\85\85þ÷Ém$4ßCB\93\84\ 4\9f$\16\91!Îs\90úû×\ 3;Ú¹\ e\9b¸'ÉZ¶gîÇ\ 1\e[\ 2#cR3¦ôÖ    Hi\89@RË\1c$¶Äbië\12,i]\81G[\15XܪÁ¢\80             \ 1\ 3u\88\v¬Fl \ 3\v\ 2Û1¿­\ f1m¯anÛ%Ì\rܼÖÿ"¦EB̺1\8eq\9e}Ôéíà~ØÌux\82ë@\9a\88s\v`á3]\909 Ë;Ù\7fv<\84¸\8eY\88í\9c\8bG:ã± 3\11ó;å\88éÌż \1e\ f\a-\98\13¬Áì \ fÑÁÇ\11\15\f!2x\10³\82Ã\98\19¼\88\99\9d\9fcfÇ\7f0k\13Ýó}6Jø\11õ÷sü\9dl\a»·\ 1\9dOó\ê\ 6<ÄN\8cDIäd  \89%sº§"*\14\89ÈÐ\\12\8f\99¡$\92\8e\88\90\8a\181#dÇô\90\aSC-\98\12Ú\8aÉ¡=\98Ô}\1c\13ºÏcâÓ\9f\90¯1©KÂämcôq\9e½[\99\83\10ï\87g\81¶í<\13Ø\8eUï`\1dì\ 4\80\f\92Hâv³\aí\ 1f\85'`Zï\f\8dÂÄp\f&\84\13 Â4Baö\97½¼ü{yù\84¹©Ã,¢0\13\1cæ`=ìïzÞàæ¿
+ìbc¸ë\ e'.ýÀ¾.þ¡v7u7RÇ\1f\ 6j÷ð<x\11Ðï\a\14\a\80d\12\7f\90ú\87¨ß\aL{\89}h?Ío?\8dpÿl²\80Ð\ 4\ eÐø\fÐ\ 4\rð\92\19àÁ3À\82\1f`!õ3¹ý\1c \7f\84\e\90½n\1f\eÕÃß\13ÆpHBÏóÌ\ 1µ\83½\\83}¬C~ÕF\1dÃ\0\903\b¤0ü\85\7f\14\98y\f\98ò
+\e\80\9f\92¡\89d\1aa\1cC\8cã\ 4ã8Á8\86\19Ç\b\b\11\1e´#<hFXHÃLà0\a\18¾ÀïÝàoþMî\12   /ðÕ\13\9cs+µ½ý<\8f^f\rð«9ÔZF­ø!®ÿ0\10ñ\1a0ùgÔ~\9d\9cù?lJÎ2\1fç\18Ç\9bÑ\84\ 6ùm\1aÔó\8cã\ 2\8dÉ(/£Q\1ep£Üä£ÌÅèaÂAF¯ðý\17\84\1dÍù{ØÊ|¯gn\e©í8\ e\98\ 6_¥þIê\9f\ 2fs g\9c\ 3&¼EMN\81Í\ 6Íç8\17É/É%6I¿f\93ò\1e\9b\82ËsÙ Ð\10_e\1c¿¡\19»ÆKù\1a\ fÜëÜø×Y`×9Á\ fÏ\93\8fÉ\97ä[´3çM?\ 6j8ßbêªNSÿ,ë\8f\9aÑÔ\9cöóq-.#\9b\1eà\ 3²b\13ÄñÈGäwä÷2à\93\ræä&×æÓ8àoË\bMÒ-^|·x\10~ÁÍw\9b\93¾Íº¸ÍIüý·ä3ø\99s\17\1f\99©\9dGÝåÔ\8dû\ 5\10ÅùM}\8fc_\19×üð¾\ eù\13ù3¹IþB>#\7f%L-[Jà\1f¬\93¯¦\ 3ßpm¾c£r\87ù¸«\ 5î±6îñ0\94¸\ 1%&^ââJï\90Ëìö¢I$\89"³É|\92H\14ÿ£ºLÀ\9a¾Ï8þ\8dxË¥\b^È©\9cI       \90@\12\92\90\84\90@        \90\0\82\*""^ \ 5¦bÅ2T@©W=j­ó>gm©­t´³]í3ë6»v[\9féö´«N»ÖvݦsýïËñTûø|\9e?Dò~¿ïû;þïK\fÄN\8aH\15©#«H3i#Ï\91\97ì%\87È1|ÏIð1çÌG,ÜC\9aý\ f¾å¤Éy\8a|G\1e\90»ä3ò\97Áy\13~Äg\ 4_2\95\84\13\90,\92OÊÈ"ƯgüFü\97óåCldü\ eÆïbüçñOì£Úaj\9cÄW\9cL¿Ä\0îá#\96è>îð[_0Âçäoä6ù\ 3¹9äa\12\19\92   #5      &±$\85dP/\97:\1ejTà\eι_¡\81ñ\9b\18¹\95ñ72~\aãw1þN.Ï~æv\ 4·p\96Ëö:þ\88\98\19ߤËß0Ú\8d\11>$\1f\90÷\86<x\11\8c0z¨\1e\8f\10ÄoD2§D|ÍZ|  \vkç¤F   þÊ5¹\85ZÆo`ü&|B\1f7éã·ôq\ 3Ýܲ»\18û Wá8ã_ÄUÖâmþÕ/èü-V±\9f
+WÈ\9bO!\8cÂS\1eÀ\ÇQs2s\vfN±ÔKÆ\9f¸/~\8flæQ@\8dRfV\8d_ÑÇ»ôñ\ e×e\80ëò\16}ôÓÇ\9bèáNØ\83>®É%\9c¦\8b×q\81®Î±Rg¹r§©r\8a\9c\1eaðgaô°ö¿\ 6·ôÈ\16¿\ 5oj\ 6²^\11Ô\932\9f4j\99\98\8b\9d\1a\85\8cZ\8a×èã\12}\¤\8f\vôq\8e>ÎÐÇ)tâ\ 4vpgîÇÏp\14/ó/^â·_Ä\9fY\9dop\80jûGØ7\820\8eú¼êîò8ÝâÕû\11=]Ç\18æèOÍ\99x\ 3ÑÔ\933\92\16ç\91I\9d<î87+]J\85j®übfÜ@\9dFê´Rc\13ãnã)ÙÍ\7f\87¹CÎòÔ\Áv\1eî\1e\9b{³kð4\89\9eð\90WÊßy\94?\räõC~9\19èç\95wyÔDîì)\8c\10BÍ8ê%3¢\8e§/\v\aD\ eì\eåÆÞQ¥ØíU\8d\9d^µèõjÀöÑMè\19½\1e]c:°uÌ\ et\8e=\88\8e±'±yÜe´\8fÿ\10\9b&ÞÃÆI\8fÑæ-`ÃS< îm^i¿æõ:À«¾\8f?_\98Æ×\f¯Ýã\13|px\\10\ eL\88ÄÞ\89\9c¤B¯·\ 1=ÞVtù8°ÕÇ\83N\9f2tøTã9\9f%h÷]\81g}\9b±Ñw\136øvc\9dß>´ú\1dG\8b\7f\1f\9aý¯cíäûh\9a\91¬\ e\9d\10^\81\8ey­ö\91³1À±Hà\10¯¸}\ 1^Øåç\8f\1eÿYØ:9\1a?\9d"Çæ\056\ 5\18±qj66LubÝT\ fZ§ÎGKàB<\13¸\14k\ 2W£)h\1dV\aubå´]X1í\b\1a¦¿\82eÓßGý\8c\9bù\18Kf ?â6õ¯Iø:\92\ 1ç\15ÔçóE1g\r\13Ê\1es\9a7Ú§\a¡mF\ 4ÖÍ\14£eV
+\9e\99\95\8e5Áf4\ 6ç`Up>VÌ.ÆòÙ\15X6»\ 6õ!ËQ\17Ò\8c%!íX\1cº\ 3\87°0ì<\16\84_Euøg¨\8ax\84Ê\báG|L½w\92ø
+æ«öd*g\1d>÷°\réIàÌÇ\9al\b\1f\8f\96°)X\13>\e«#¢±"B\86\86ÈTÔG\1aP\17\99\85ÚÈ\,\9eS\88Esæaá\9cjTÏ­CÕÜFTÎmCyT\17æG\1d@Yô\19Ì\8b\19 ·Q\12ûo\14Ç
+O\88á}Åö«\9fÚ\17Ø\82\1dÕ±Õ!½|Õu²\riKd\9f\1fç\85\95Q~X\16=\ 3u1\91¨\8d\11cQl2\16ÆjP\1dkDe\9c\r\15qNÌ\8fó ,®\1c¥ñ\8bQ\12¿\12Åâ\9f H¼\ 5\v(\94\9cD\81ô
+ò¥\9fÂ\95ð\1d\11à\92\1aµ.SÿL\ 6ç\f¶>{H·\ 1\8f\16\92kS'öF\8d$\10\v$¡¨\94Æ \*C\994\15¥       z\94$d¢(Á\ eOB\ 1Ü\89¥(L\\80|Ù2¸dÍpÊ:à\90ïF®ü8ì\8a7`Oú\ 49Iß\12a\18Å0ï²Íx\95ú'29g°\15ÝI¶°ýiãgkè­\9e>\16È' B>\ 5eò`\94Èç¢H!\81[\91\8cB\85\ 6ùIF¸\92lp&9áH*F^r%ìÉK\91\93²\ 6Ù)í°)w"Ky\14\16U\9fÈ¢ú\9d(Sõ\80\b\83`\b¥\80\ 1¾Ú\7fnæ:ظ\ ev`\aé`ë³\8e>VÑG-}\94+Ç¢$Å\1f\1eåt\14(#àRÆÁ¡\94#O\95
+»J\8f\1c\95\ 5Ùª\ØRÝ°¦\96#+­\16\96´F\98ÕϤî\85QsD\94¡yUdÐÞ _\13AdÐü\0ú©s\8e¹¿Ì6x¯\83ëàä:ðÙ\92Ã>\9fµá\b\87\12í(\14¨}áT\a"O\1d
+»:\1aÙê\ 4X5)°h´Ä\84Lm6ÌÚ\ 2\98ÒKaL¯A\86n\15ôº6ètÛ\91®?\f­þ\92Hc¸NþA\ 4\91F?\8cV'\88\ 6§©÷\12µw\17°ý/äÌÉçZþ¾\94õ¨d=Üô\91§÷F\8e.\0V}0,ú9ÈÔ\8baÒ+`Ô§!Ã\90\ 1\83Á
+}\86\13º\8c\12¤\e\17Bk\\ 1µq=ÒLÝH5\1d\82Ê|Q¤4\7f\13A¤4    "Õ F\ 1¯±\ 6'\98÷Aj?Ï\16xK1Ï#\9fM\1cQ\16óó2úËÏâÌg\9e\80LÓd\98L3\90a\8a\80Á\1c\v\9dY\86
+Z³\ e\9aL\vÔ\99yH³\14!ÕR\ 5UÖ2¤dµ"9k\e\92¬\a¡°^\80Üú>dÖ{|~\ fy\960\84\82¼B\8dcÌ{?µwp$é(ã^ «J¸\ eô5ÏÅ\99\8fë\94i\e\ 3½Õ\17éÖ h­!PÛ¢\90f\93\96\f\16Êl\13R²íHÊqC\91S\ 1yÎRÈìÍH´o\81Ô¾\1f\92Üs\10ç¾GîBlÿ\1f$v\ 1\92\9caÎ3×#Ì{/u»+9ïTq/ð¹¼\9cýþ<ö»ü¿\z1:EPçyC\95\17\80\94¼YHÎ\8bD\92#\1e
+\87\1crG\1ad\8e\f$:m\90:ó!q\95AìªE¼k-b]\1d\88É\7f\ 1Ñùg\10\95\7f\95|A\1e#Ú% Ú9ÌiÆ?ÄüwQ{Û"î\85\1aî\ 5>ë9*VÐK!G\ 3\e½èè%Ù=\1e²B\7f$º§Aê\ e\85Ä\1d\r±;\ 1ñ\9e\14ÄyÒ\11ë± Æã@TQ       æ\16Õ`NQ#"\8b7#¼x\ fÂ\8aO!´ømò9B\8b\1e!¬H@\98\87\9d+9Î\9a\1f ~/µ;9\ e­_
+4\92ÿs]æQQXW\1cþ\11e\91u\0\91E\14ã\12=Ä-\1a\97º¢\88\ 6\17f\0Q¶(̸ â`T\f0q×8Q£U\vbÕ¦­AÁlVMM\93`L\9b6\1e{bÝCRc4ÖhÜ\12ú±äÄö\8foö¹¿wï»ï¾{\vxmÌcîb-£\18×\ 6fJ½M\1d\94`ôP¼ÑW±Æ`Å\98¢ÕÕ\94 hS\1fE\99\ 6(Ò4\\11\19ã\15\9e\91¦°\8cl\85dZ\14\9c¹R\81\99[\14\90¹_þ\99Çå\97yEþ\19\ f\14\83oÁج\1aloCk\ 3£i\85Y²Î§6B\8e\85}à3¶UÃXOÿ|)\91uFç¸(<ÇK¡9]\14\92\13ªà\9c\18\ 5å$*0·\9f\ 2r\87È?w´ürSÕ%/C¾y\85òÉ{IÞy\9bdÈ«\95WÞ{òÌ»$Cî\ f2ä0MÌic\17víEÒ\1a\95ÅìC û\0\99\8c©©¼\1fµ\90\18ð]oÖ\15ǺÂÀÏì*_³\ 1üåc\ e\97·%N\ 6ËÓ\90$OËó\90,\ fËL¹[òåf)\95«e­\,{äd©\97\93ù39\9boÉ¥\88.¾°\8d×Ñ߸Hª\Ây`\14\8c\18Àt\98\0CËÈ\ 3Hà»H\b\0okG¹[ÝåjõV'k \¬\91r¶v\93\93µ\8f:Z\a«\83\1c¬$\9a\95M´â\84µ\92\ 1\f°¥\8d\\84ßÀC \93-i\96\1d\7f×`·|9\1f1\86Í]%\99^&\ f\91üõYH\84h\b\ 2\1fð¨r\90\93ÍU\ e6/ÉÖ\99\ 3\1d\f4>6\1a\ 1\e\97 \8d¢V\95ÜvЫæÁ
+\9cdά<È\863D¾Ü$­º\ fÍ­lÀ×J´\97aÛb\93²WS\17×2\7f®\97\ 6m\94zAW\bÚ\84þfô_\95\9c0'»\13Ðxn¡é³Ó\10Úi\ 2í]¡'Ð\fØ)ôvba'©ílî\96uPC!d Ý|\11îR\90\9a[Y\8d¿å¯p\16ÐÍÝÀ\1e 1þ5Îâ6©Ïv)\96ñ4\980úì\94ÜwI\1dw£ÿ\e¨v\0\9aòjÖQÍ:jXG\r\ràÞ\18.@\1a Z.ÿZ\8a}-\a»\96äÞK\80÷b¬¦\8eßÿ\15naç14«\ 2í\12ü,À·tt\93Ñ\1a\86N_tb«ÑßËþï\93\÷K\ e\84\92æ\9eK\ eþø3\8e4@\f\ 6o²/uìËaöå\bñh \ 1j !j \b6pø\e\88E\ 3NÖc¨þ$\\ 3bqä'-%¾ó¶r?£=  Ýçk¥gøY,zAè\19Ðëô&Z\87¡\ 1Þ\ 6ÂÉÈ@\ 3ÖÎq\86µ\13.ÒI\ f\86\ 3\ 6\85\ f\ 2¥\8fXÇÇ4i\8dÃ\81=9]\0lúi\82Úx\84ç3ðo¸'3áÉÚ#MF{\ 4ºýñ-\ eÍ ~FK.çwÚuN\0éÄ\90\87\8dv>QË@$\ 6M1p2 u\90Î1(}ÁÞ\\b\90®°\8e«4§×¸ô¾¤\187qÈ\9b\b|\13ÁmÂ\91¦¿3Ø}¥lÒdê\ 1ê\0ÚIèÆ¿\85>_{\1d\97\1c[4ÿÒ®÷)ü\ 3ÎÁyøWëP(]\86«ð%|\r×á[òõ6ÃÓ]?é>ùñ\80\ 1ÍÑCÎê#\ eác6þ1¢\8fqðÇF¦./ðlÇ\0~\10\r½`0\8c\81)`\82\1c(\84b°ÂJ°ÁzØ¢\9f\98ò~dÂ|ÄÔù\90\ 1\ fú\82Yö;}Ï/îÀ\7fà\ 6\\81óp¶eÞd¾¥Z\81\v¸\82\ f\84AwH\82\110\11¦£\91Å´\98\8f}³îk1öË°_\8e}\e¶×ë¶ìºÅÄù-Óî\r\12÷:\89ó5\eÖÄã5þuµ]û\12|\ eg ±u\r\0\82\8eíñ\b\84\18\83OCÐ\1a\83\ f©x\93®\9b̹7T\80}\v\96\17c¿\fûåضa{\83.0é\9e×.ýSûññ0\93î\9fI\97\vèÝÑévÍ\8fáC8     ÇZ× ÿá\91ÜðÍ\17\9f"ð§\aZIúJÃña\ 2\1a/`ß\88ýÙøñ"ihÁ~1ö­Ø/Ƕ\rÛ\eõ\81¶¡\M\1a¿¡?é\1d\8eЧ<~£·\88b\ 3*-ÔÃa8ô\7f\a\88¦\17©\16ÈNÆ Õ\e­Aè\8cBc")\9a\86}\13ögc¿\0ûfì\17cߪ£¬£^¯¨N\9b±½\83ÝØÇ*êÈ\8eSDå2ïîª\16¥½Pó\ 4-ÚT+ünKëK­éï\86_¾è\85\13¯\ 4´ú±³Ï¡1\9aL\9b\84Õ4Ê\93I¿g\1d¿#?\ eª\b\8dEhX±¿\8a\b¬Ñ\1erc\17\8f;YÅvþ½\15O^ÃÃ\96Ì}µ5\83\7fá1%÷;JÝUÊîç<\9ff\r§È\8bcäÅQù£\17\8d?=ÑIBg\18~\8cE#\ 5ëih\18ÑÈæ4ä£S\84N1ÊehTh\13¹±\81oÖ±²5­ÑùHUD¸\92ÓR\89\13|O¹¿FIù\eåí\94\8fc]OÉ;Ä99(o4\83Ñ\8bÕ¯Ù\93í\1a\80ÎpÖ>\96h§°ói\9c\ 6#:Ùèä£cFg1v\97\13\8dÕ\9c\;¯ªµ\fkeìàÒ§.«´Ã]\95:6k \948µqÝW:\eDyåÚ{\9b\10\0\9fÕPvw9º\93]\9dÑ\f×Ƨºim\87¾ZÝq\90ª\1cG¨Âi\9cV9¥h¥s\9aV8\eõ\92s¶Ê\
+´Ôe¾J]¬*éT¡âN\9b´Ðu·\16¸þA\16·\132»_T\91Ç=\15z6kÞ\13\F·\91«ÿÝXôá·\94×Ýaôw\94ÚÍ\86§´ÎÍSUnþZå\1e¥\15\1e=´Ì£\9f¬\9e\83Uê9R%\9eã´Ø3E\8b¼¦i\81\97I\16Ã\1c\99\r\85*4,Ö\ÃJ½hX¯|ï\9dÊó~C9>Ç5Çç¢fûÞSvçæVfµs\16Í÷\13¸¾¸ö\ fpåîN\94¶ÆÓ_FÑ\8ap\ 5®ôuQ\99·\8f\96ø\84¨Ø7N\v\92¥s\92\8aº<§y]Fin\97ñ*ðKU\9eßtåúei\8e_¾fûÏ×,ÿeÊ
+X­\8c\80m2\ 5îWzà»J\ f\19Áw4#\84\8a÷\ 4\9f ÿ^o®c®\96\1aZ ×\9f¡­à½­»´\82R¿$´\83\16\ 4xª(0@s\83¢\94\1fÜ]¹Á}5'd f\87\fÓ¬ÐÑÊ\fMVFèT\19\95\1e6[3Ã
+5=|\89¦\85\85\b»¦FÔjJäQ¥F~¦ÉQ·59º¹\8d¨6>Ä÷£h\1f\1c@\fh;ì\ 3\993¸bʹvK\89É|ö§ Â]9\11¾Ê\8e\fUVd¬2¢\9e\961ª¿fF\rÖ\8cè\11\9a\16=ViÑ)\9a\1a=MSºf)µk\81Rb\8a5)¦\\13c7+9®Zãã\8eh|ü\19\8d\8b¿©qÝ\9a\85÷ñ»\ eÝ}´\e;\86\11\83¡Ä`\bs\ 6íØ¢¾ô\97¬#;ÎE¦Xo¥Ç\ 6jz\\94Òâºkj|\1fM\89\7fV\93ã\87*%~\94&u\9b änS5¡\9b\13r5.a\81Æt_®ÑÝ7èW=öhTb\9dF&6jdÏ\e\1aѳ¹\95\91\89m\1cû/×å\1e\15u\99Æñ¯\97T@\10T@S\ 1å¢Èý2à\f0\ 3\fÈ]`H\19°ä²¨1¨\v\16`yä ^ÖK$ëZf*h¹YÞ)=æZֶɶ\97vÝ:¶µk%\9dÖ´Ü\93\9b®\8a¥³\9f\80ÝãÙ?>ç÷\83\99y\9eç}\9eç}ßçË\9a\8fá\7f\1f£Æ\8e\1e¬ã}%q4\10Çbb\\109\ö0\ fÍ\ró\91-Ü_EáÓU\18\1e¥\82\88\ 4åG$+7ª\9c\88\eGÚ\94\15Y®ÙQ5Ê\8cª\975ºEéÑíJ\8béTjl·,±ïÉ\12÷5ÜãÝù?N\93ÿÃøÜ\9bE\1dr\98±a\r\8a\fæ+âø  q\94\13\87-z´
+£Ç)?z²r£\83\94\13\13¦¬\98\8e1*#&UÖØ,¥Ç\16*-ήԸjYâ\97Ê\1c¿R)\86ÍJNØ¥¤\84£2%öÈ\98x\19~àÝ)SÂ\0'Éý\ 1FàNÆÏm\8c\19\9b\18É[ó©\ 3q8\88­\92\11G\81ÁE9ñ^Ê2LT¦aª¬\86\19J3D)Õ\90 KB\8aÌ     \99JI,Prâ\%ͪ\94iV\9d\8cÆ'4˸Q\89¦\9d2\98\ eË\90ô®â\93.Á÷¼;ùß\0Çñ³?\97^À÷Öb¤\80\8d9\9f1ô1âA¶éaòa£VÙ¦\11Ê0\8eQ\9aÑG\16£\9fÌÆ\10%\e#\94d\8a\97É\94$cRºf%å*1¹D       É\8fÈ\90R«ø\94\99\7f¦\18ó\ eE[\ e*Êò\ e|        wø\9b)É<@75Ø\87¿\1døÞÂè¹~\1e²\88g\ 3\7f×\90\8f2jSH\8f\ e\93Åì®dó8\99Ì\93d4\a*Ñ<S   \96\18\19\14oIU\j¶bS\8b\15\936_Ñi\8b\15\99Þ¨\88ôu
+·nW\98õ\80fZßVhÆ\17\80))}\80#ä`/ëß\8eïö2z¡\9c3\ 1\96\95\12G)ù) NVb5Y]\95`õR¼u\82â¬\ 1\8aÍ\98®\98\8c(Eg$(*3E\11\99³\15\9eY¨°Ùe\9a9»F¡YË5#k\8d\9eQpöË
+Ê>£Àì\8b<o)8ËÙO\b\1c(ä^`ÝÛð»y\ 1çR\85Ô̳\8e1¸ÂμËgyÄ\98\f¹#\15\9dã¡È\1coEäLQxN\90ÂrÃ437N3r\934=Ϫ\90¼|\ 5çÍSP~µ\ 2óë55¿U\ 1\ 5¿\90\7fÁKò+8­)s>åyS~ùNùC@\9eSûKè\ 5üoÅ÷\ 6ÆÞ\96\1at/ÏÚ*z\81XlȤ,bI&\96XÛPÍ,\1a­é\85c\15R4QÁE\ 1
+*\9a¡À¢(M+NÔÔâT\ 5\14çÈÏV¢)¶
+M¶-Õ\83%«4±¤C\13Jöɧä\94¼K>áyC¾6§&\1435Â\8bäÿ¹Jz\ 1Y¸îQÎ\85Zz\ 1\16\17\88§\80\89o\16yaë+Ø>J\ 1¥\1eò+\1d¯)¥\93\1e¨Iö0=h\8fÓD{²&Ø3åSV$ï²ù\1a_V«qåOjly»¼Ê÷ʳü¤<ÊÏ˳ì:8åe\1f \vûÏ,â\¨ã~Zʹ\804\öS©\9a÷¹H£lâ2óy\1c1\86\92\9f\80ª!\9aPé&ïJO\8d¯ôÕ¸J?\8d­\f\81HyU%ʳ*UcªòäQe\97{Õ"\8d®n\92[õF¹Ví\96KÕ«\1a\aøF.\95wåZá\94\eìÄþVümh \ eÈ ÆFÎ\85Ç©\ 3ï\85ËéÅzr@L\11Ä\16´\ 4ýI¬ãê\86ËÃ1Zî\8e±\1aí\98(7ÇT¹:Båâ\88Õ(G²FÖeé\81º\12\r¯«ÒÐ:\f;л\ e\ 4¥\ 3ñXÛ\ 3_ÁméQg?Ûñß\8e¿µÍÔáI©~%g#Ìã=\aR\9e\90b\90«Óù|J\93ä\rc\9a\86Ê¥ÉUÃ\9bйMÞÀ\10ÒÄ\10Ð\18\ e\\80\8d\<\8dl¨F
+ØHà\8d-4\19Âöñ\979x\10p\8f\96ß\ 2bhpj+ëÞ\88¯V¾ÖÔJx«¥ùmÒ\1cH\ 3\ 325\94§?ÿ÷\ 1F\13¹ÂÐ5\f m\f[m\f\80m¾ÀàÓÆ%ÛÆEÜÆ%ØÆfn£\91WSÄÕ,b5:³õ\ 5.Ã_\ 1B±å\86´ÊÙO;òo-¶W\92®eë9\9b\176q&m\96\8cOIá0\15\133.Oã\7f\v\83o\aúv\8b\v0\80na\18í`ðêð\87\1f\a .þ\ e\ e×\ e6tÇ#|NA·¬\93\9eÞ\ 5¯\91øs4à5\ e\83{àÔ\ 6|·âw9>kð1¯\83>$mIÈÒÈg¥ià»\9düSÎQ;ð½\13vÿ\17âØM\1c»ÉG'ùè$\1f]ÄÑ\15Ê0ÂP´\87\8b`ÏC@ÓuQàN\fw\1eäûôÄî+\1c
+}àÔ\1a|7²¶Å[Ù\8bøËÃO
+áFwJ\81]øß#y\90Â\91ûðù\12PR\1d¸\8f\83\88\83\83Ôå\10\ 3úa\ 6ô#>\feÔ¥\9b\19\fº¹tºÙÔÝ4v7\8bíÆà1êq\94z\1cý\ eîjÅÏiW|?ü<g\ 1>-/Ò\83ø
\8fÿWðOØ\ f\1cÁ×1x\15NÀÉA^\87S\80I½ANÞ$'g¨ÍÛã\19R\89ã,\ 3áY\86\83\1eú³§\1a\9emÀþèy\8fÏþ\ 1×µ\84u/`Í\85¬3\8d\1eb\ f\1e¥ÿº%÷ãÒ°\93\83\ 4Z\1a\99Àï\aÁ\fÒ\85Á\\ 3âèOpn\84ô!µù\18\81p\818>c\10û\9c\ 1á"5éec÷Ò\17½,¶\17ý\7f\86KªÜK\ f²f+¡Å³Î`ÖéËÚÜß\90\86¼\85ÍßÀoá÷ÀOô!|\ 4\7f\85¿Á\ 5ø\1cz\81-§Kp\85ú\uCÀÑ«×é\8f\e\fÉ7\19Rn±Wosøܦ©ûHv\1f\89¼ý;\94\96\râ\ 1ãÀ\1fÂÁ\b\99P\ 4eP\r\ eh\80fh\81µ(ÈMº\8b²û\ 1Ey\a\87¾»\85¶º\89bü7:󺮢gïé\1aßþ\91Kp\ 1>\80÷û5ïH\18\ eCa\ 4xÂ$\98\ eq`\81\,<¤ïÑu}èÜ[ªÃörl¯ÐwÄq\8d8¾%\8e\7f¢þ®¢Ì¾F\1d^F)^Bg~I\12¿ A\17ùÕgXú\14>\81?ÂYøu\7f\fº\8f!\83yñaMÓð\17ÉZ\8cøÊÄÇ\1cì\97ê\8a\16`{!¶\97`{9¶\9b)E\v¶×êïhÌ\8fQ»çÙÀ\1fh\1f¥;Ê:ÏÐ.çi\9bo\89fÀï»p\ 6^\87\13ÿ\17\ 3'\ 6Ѻ\907/}£ÉúJ3ð\15G©ÍøÈÆ~1í`×9UÐ~\vYK\1dmÒ@k6Ó¢?ªÚµzGOѺÛðÑ©ÓläSäâ$ß8Aä¯Q©n<\1d\eä\10¼r_\fwà_pYÃX\9b;þ|ô\17rñ¾"ð\93\88\8f4ìçê-ÙØ"el\95
+Ö±\10û\ eì×c¿      û«Xù:\1dV;\95Ø\8eý½tÆ\11ý\92\88^Àâ\1e\85·ÎûØ5\18\ 3·\aë\1e\8fú·\9a\v9óÂß$Ö\12\82\9f\18\1d\97        \1fV,æaß\86};ö\17plÕ\90õZ|Ô㣠  »-Ø]¯çéÑç¨É³|k\e¹ø\ fÓÕ\1aÓæyF\ f\84;\18lÌÝ\98Ø\80\8d±\8d\ 1\e°¹Ù@°\81a\1cn_\80\ 4L áb \ 4\92\0\85\14Ê-÷¤\11M\9a&k\9a¶k«^¢5´SWU\95v\91¶6Ò¤j\9aTi\9aViÓ¤®Ý´n«¶UßNCÔíÇÑû}ï\a>ç}\9eç}.Wy\92Ëôä%zù"Y/\10ç\1f¯_\7f{\95Â\81O\99b>
+Û»þï3>wi\8b·\90J>\15\7fEO\1e\eOUE\ e79¼äð\93£\9b\1c\8e!\£\8e+Ôq\89\80\15FÆ6¶øe\83ÿõ\14­³Êè;K\v¯0\9a\97Éûÿø"\8eW\9c©í\17Ò½\14÷\80×úMêy\85÷å\ 5Þ\91ÛÈ`¤ç\91ËH\9eR\9eÅÅsxx\ 6/YÚ±É8]§\8e§¨c\95~9ËøXÆ\19ze\r\vTt\9a\8aç\99ÔOÒ¢³ø\84\17B|\84éÇø\8c¥æc\96\9a\ f29w\12¯²\1dx\81z\9e£¶\9d°8\9e-\99çRðL\1aò\98ÉSγ¸hq\ fy¼äi'O\17oi\1f=\11ÄlØ\18fÂf1\15¾\8cÉðs\18ß÷\fÆö½\84c\11ï`4ò!F¢?ÇÑ\98op4VÄðcü:\8böW\ 1»y,=Äó|¾¡`oÅ\94\7f>1\fëÑ\12¬D¤`1*\a§£u\98\8b±`6Æ\8e\99ØjLÅz\10\8aóa"Î\8fñ¸n\1c\8f\1fÀhü\bFâ§0\9cp\ 6C        \e\18\8eÃ\92{\18\90ì¢_ò\10\87\12ÿ\8cCI"\ 4éÿð±\9aå\86%ÿM\96\97{ÄM\96»«l\89\98b\9fdK° \8bÄII\12¦%é\98LTc,Q\8fcI%\18\91:0,­APÚ\80!i\v\8eH;0 ëE¿l\10\87dc\10dsèI^EwòUtÊïâ üm\ 4ä¿DGÊçð§\8að§\89{+ñ3òï\9aè\7f\1dw\88ëLíçYfV\v\803Ô7C;\8dÉã1"\97#\98\92\8d#)\1a\f¤\16¡/Õ\86\95\10ÒêÐ\93Ö\84î´6t¦wâ`z?:ÒGàÏ\98Á÷2\96Ñ\96y\11­YwàËz\v^ÅÏ\89?¡9û\e\ e\1f\92ï¾\r\9c6`¹¿Ìu\83ïKlÉfi\93qú'\98\1d\8dþL)\84¬\fô(ÔèR\14â Â\82@v9üÙN´g»Ñ¦ô¢UéG\8b²\17Þ\9c!4çLâÀþE4î?\87\ 6Õ-xÔoÀ­þ êsÿ@ü\87\10¿Ã\8fyö×Éý<Ëü\8e\8bm\96\936¨à¼Ç6(dá\9c¡gmÏ\ fG\97J\82\80*\ 5í*%ÚÔ\1a´ª\8dð©­ðæVà@n\r\9ar\eÑ\98Û\8a\86¼.¸ó\ e£>\7f\fuù§Q«ÙDµö\ 6\Ú×à,ø\90ø\fNÝ¿\b\91Ï{x\97mð«ä½Í\12ÿt\1d°M¬°\15\9cc[:Îo\83ÔÑC\1dí\9ax´hdðj2q@£F£V\a\8fÖ\f·¶\fõZ'ê
+ܨ-ð¢Z\17\80\agá1T\15ΡR¿\ e\87a\avÃ+(7~@ü\8eø\9a\10\1fÁN<à\99_&ÿ-7p\85%~\83Xâó        î\8d\0u\1cd\8cø\fÑh,L\82G\9f\86z}\ e\1a\8dp\19¬p\1a\1c¨2Ô¢ÒØ\84
+c;\1cE\ 2즣(3\9d@©y\156óuX-/£Äò>\8a\8b\7f\13%Å"ßY\99\89û´ÿ=rÞ`Ûw©\99ó\1e±p\80s\86\a\18¦\ e\81:üÔÑT\1c\81:\93\ 4Õ&9\9c&\ 5*M¹p\98\va7\9bQn.C\99Å\85RK\ 3lÅm°\16÷ ¤$\88â\92iX¬ga¶]\83Éö\12\8c¥ï\11\9f\12\7fGQ©\88"\9bÈ}\11op\1c¹Kþ\1d\1fc\81mß*q\9a-ù$µ\fRG7u´2V<\8cU§5\1e\ e«\fåÖ\f\94Y÷ÃfÕÂj-B\89Í\86b[\15,¥n\98K}0\95u¢¨l\10Æò\10\fåËÐÛ¯@g¿\87\ 2Ç\8f uü\86ëWÐ9Dî\89($^#Ï\1d/c¡\8d­¾\9f£H\a0Ïu\9cï\ 3´G'}ãc\8cÔ1fìö\18ØìI(±§¢Ø®\84Ù\9e\ f\93Ý\80"G    \8c\ e\a\f\15µÐW4£°2\0\0
+ª& ©ZB¾ó\12ò\9cw\91ë|\aj×'Äßø,r\8f¨\12ñ\ 3ò<G¾«äÞêä\bÔÅ^\9fëq¾÷q¿\83öi¦\9dj诲\9aH\98\9d\12\149å08³ w©QèÒAç2£ÀU\ emu5ò«\9b\90WãGnM\1fԵǡª=\83\9cÚ\vPÖ}\1fÙu\ f ¨û\15ñW>\8b\8aü&âEÚý&ù.w\ 3ë\ 2ã\91\f×\11¾\vl\85Ûi\93&úÇIßX9¾éëã¡­\97BS\9f\86üú\1cä¹5Èu\e¡vÛ òT!Çã\81ÒÓ\86ì\86^(\1aF\91Ùp
+\19\8dÛHo¼\8d´Æ\1f"¥é!R\e¿ä³\88ô\86=Ü%Ç\ eù.p$[;ÌÜx\84ñÈu¸\9fw\92£I\e¿¹©ÅÑ\ e\98©Eë\8d\82ª9\119Ír(\9b³\90ݬ\86«C\96×\82\1déÞ:¤ù|Hõu!Å7\fyËI$·lBÖr\vÒ\96ûHlý\bI-_ðY\84Ì·\87Û´ýÓä?7¸7\9eÎs,\9b \86\82\8c\ 5êi¦\96jÚ¥\94Z\fôQn \fYþ8¤ù¥Hõ§!ů\84Ü\9f\8fd¿\112¿\8dpAÚÑ\84¤\8e\0\12;\ 6!   Ì !°\86øÀ3\88\r¼\8e\98ÀO¹þ\11q\1dÿF¼_|\84\7f\85|\9b£À\13\1cAfÇY\1f\88\81ã¼\93\ füVA}\16ÚFK=Jþ}ª\10 io\ 2\12{eD\ 6$\82
+       B\ 1â\ 5\vâ\84
+\1eD\ví\88\12ú\11!L`\9f°\820\81ó\95À!Jà Ôû{â\1f\bëe7ß#b\87\1c\17ɽ6ɼ0ÅX\98a,LÓ\ f|öq¯\86zJù]\7f\fPSS\ 6m$;\1a\86\84á8D\ f'!b8\ 5û\82
+\84\a¿-,F\82I>È\v\1dd0\aéÌ ÿ1Èy7ȹf\88ÃÜÐ{¼ô\9c5\a¿"ØI\1e\11q\8d\1c[ä\9      \9c\9a§\1fN\ 1\87¹úç\80\ 6î98\16\99\88<jËâß%\13\12"j:\86\81Ã\99n\8a³Ô\14\9b \10\8b}H»WdBLl!\ 6p\88\81\14â!Cü¡Émþ8çÝ\89]^|v­c\9cwÇÄG¸x\82¹\91¼K\94zb\89±ø\ 4ó\12á%\D     ¡å~ö" '$D\14ß±\14   ,²ñ[L"8[.²      [d±_d±]dá] -\16\18Ä\vtàB\88Á¾FÜd\ 2ä {\8a\83éü\97,J\9c&æDl\9da,.sûIJZeNàHÚ¶Î\9c´A\1fl\ 2\85\\95D
+!á{Ô\16ù·\1fã¿\\97   TÔç\15Å/\8a\v²\b\ 2"\8b\f\fÃà\fû&\8a 
+
+\12\14A\ 1W\8c¸¤F\8d&Ö%I£Ab\8cq\ 3\1e\15\97¨±±ZkÔ\98ØU\93Ø$­K\9bxHj\ecb\94\9aX\9bN\7fÂÔ¦9\9c{þÃ,ïÞ·|ï{¯\81ý¶Á\ 3 £\ 1\1d\r\f\e+#\09YÉe¼² ³é4Pl\r\88\7f\91\9a\9f&p\1eÇ?\a\ f(\ 2\87^\80{1\9cO`\7fb#=i\15uHêh¯2\ 3ëð\ 3ϵ\92+&\18n9Ì ÉùÜH<6\12\8f&\ 6â&t4££\19\1d-\fF-4×f\1aP3±h&àM\104íäû¿Ä\ e\81­b½CËðëÉ\97:Kf\f<\85pd4Kñ\84Í° þÍ\92ÇV©ë6ø~
+0ÁÒòÿØÍr°\87úØC}ìeHn\rì\1cN÷sáîçB:@\13<@Aï_Æ \80á}GÁ{|\8f|´>Ð|¸§á_%~\r\87/\v\ e)\f._ì»ï\91\Zá!\84,8\f]àu'0ÅòÃB\0(5\1dw\95N\10\93\93\fæ§\18FO3\98\9eæ\9c\9c¡>ÏÐdÎPØg\bôÙÝ<ÏòY\e\vÅ]Õ\13Ïqp\8fÀÇ\1c8­ð\85Ãç{\10þÃN\9e\87\1cÇ\ 1!dùÂ\86\13çÔ¹\14\91^\16Z±Ø>\Ò¤\8bÄä}jäCtü\89Áôrºt\85\9c\8c\¥È¯\11èk\18¿Æ\ f®µ©\1a¿KàÎÝÇ\198D\1fÄ??8{=ä<éä<çäé°\ fÞwâ\ 3çrx\19\\ 5\7f\ 1\9f\80\rêõ&5ò\15y¹Í v\87áìîh©}\16 øÚqº\9dàµÿ\8a\rt\a=\80\að\ 1\b\92À P\fF\83j0\15ÌìØ\94þÍfó/¶\9d\aìTÿd»»ÏVù\r[Ù=¶Ïv\1dÐ]\9dÐ×\b¿­¿éK¾u\8b_}\ 1®\83Kà7àí\8e\9d×¥cïí\84\ 2\ 1 \12XA¦¾S\ 1\1c¥Ø\1f\8bíZÝQ\1dvgê+tÜBÇ\17èø\9c-ìïl\80\b?c¿kÓn¸\8eèc\92ögþ®òËËXû\b¼ëä>\ 5NthÐ\ fà\8eo¾ð\85ò+\13|Éø\90\8býáú+{n\9b*        ÷\ 4Â^§kè¸\82\8e?¢ã\ 3t\BÇ{l\86\17Ùu\7f¯mø¹\8f29®wt\81tÞÔ\19"w\1a\867Á1p\18\1cü\81\86ûà\ ey¹©Þð\ 5âG\14\VxÒõ\aå¡¿\18Û\8f
\13°]\87í\19x:\aÛ\vðk %´\1cß^ÖÏi op\90\8fÂtDoq¤>!;ßp¼\1c(cv\ 2;Áöïiø\a¸  ®w\94\99\a|¾ú-±8¯8,ØáÈÆ~>^\8dÀ\87rlWa»\16\86©Ø¯Çþ\8f°¿@­Zª=ZAÛX\ 3Çf8Zµ\95_m&:-D´\19\8d`\83\13kÁwp~\r>s\96÷\85\8eãÖ\1d\9fzãK?¸"à\89'f)XËÁ~\81v¡c\añØN^¶©F[4E\9bÐÑ\82\8e&tlÐ2­£\99¯!'«ùæ*,4\12±\ 62ù"Ñ^\ eï÷q\17Î6çQ{\a\9c\9bר\8b½ê\ 3_\b\1øa\85#\15\1f\ 6\80\13P\fG\19\1ccá¨\86c2¬õpÌÁîÓ\9c\94çõ\1c\9f.EÝ\12Ôÿ\98(>£\ f©\9c\81ÒÿáF\ fø¹vÎÑf\8fó|\8dö¤\81únüÚ\v\9füá3\90a#<\ 3àH\87#\17\8e\ 28\8añ¸\f\9e
+-FÇ"t<C},Ô\=Å;ó:\14­':»4\9b\86:\93ìÎà\ 4ÕSõõpÿ\17Wh«çýàïËÞéϾÃ8°\99Ö²\ 1m¯Ð;VÊ\9bjï§g\15\8e?&xlx\99\8eþ\ÍGÇ\t<©QðTÀS£YÔÇ\f^Mç\eÓ\88ÅT¢5\99\8cMÒ!ªøm*èSÕº|«\9a.\8eG¸H;=Õ_:\1cÆõÃ\18²)DZËHÒÈÕó\13â²ÄÕ\1dÎ>ð\ 5Ã\15\16Ír±k\86K\86¦wÉÕ´®\ 5ªëZ¬)®e\9aìZ©\89®\13TÛmºjºÍÕøîKUÕ}\95*{lVEÏ\83\1aÓó¬F»]W¹û=àx\84óð\1e\8bæú2²÷\82u¼nd\14y>\98Ñ\83øÌóêªÙn\9e\9aÞÓOuný5¥W´&õ²h\82{\92jÜ3Tí\9e«q\1eCUå1Bc=ÊUá9^£=§¨Üó     \95y.R©×J\95xµh¤×\ 1\15÷~KÅÞm*ò¾\ f\1c*òqt<O3~\1d6\93\ 3+W<XmaÄ`\14\957/\94±\8b\98Lõé¡Z/o\8dï\1d *o\83ÆzÇj\8cw\82ʽ\93õ\98w¦Ê|\ 6«Ô§P%>¥\1aéS¡â>\13TÔg\86\86õY¨Bß\15*ðݨ|¿V\rñ{Syþ\1f+¯ï·Àñ\b¿0w^óÛ\19¿ÖsÍ6ò|\96ÿ\17\9a;ÇÃ:rT\13è¢
+?O\95ûùj\94_°Jü#5Òߤbÿ\ 1\9bªa}sTØw\88\86\ 6\14+? \C\ 2ª\95×o\9a\ 6õ\9b§ÜÀç50h\9d²\83v++ø¤2\83¯*3ä\9e²B\1c\8fð\ 6#èÞ\14ê\90ëu\r£è\8a\fj\80ýv®\8d}\8f\98Läê­$7£\82ÝT\1cè­áA\ 1*\f2¨ (FùÁ\16å\ 5Û588C\83B\ 6)7¤P9!¥Êî_©¬Ð)Ê\f\9d£tÃ2¥1\8c¥\86íRJØq%\87\7f\ 4Ú\95\1cáàéP
+x\1d¿wÁÛ\9cC\1e¸^_\0\8b²\18\95\19\a§¡£\1a\1dåÔIqD7\15\18¼\94gðÓ C°\ 6\1a"\94\13\16§ì°De\86¥(#<[éáùJ\8b\18¡Ô\88
+¥DNRRälÙ£\96È\16µZ\ 3¢wÈ\1a}LÖ\98\ ep(Ñ\89Cpí\80\7fÃ`é¥<é9°\90ñk6£àd>«²\13\ 3FÃB£\8br£<\94\1dé£Ì¨~J\8f2(-*F)QñJ\8e¶+):Cö\98Á²Å\f×\80Ør%ÆÖÊj\9c©\ 4ã"ÅÇ­\92Ù´]&ÓÏ\14gzWqæÛ2\99\1düïà}\87\ eàó6ø×1\ 2¯däZ\ 6\9eʧ\16yo":*Ð1\12\1d\91\15ç¦T£·\92\8dþ²\eCd3F*Ñ\18'k\¢¬¦T%\98\ 6Êb.T¼¹Læøj\99âëe´<­XK£b\12¶*:ᨢ¬\17À\97\8a¶::\10\93àP+±ß\ 2ç«Ã\18½\8b¨\ 5Ö£yé\ 5´Ô £\1c\1dEÔÊ r\96fí.\9bÅS\89\16_%X\ 2\84Él\89\95)!Aq     É\8a³fËh-Plb\89¢\13Ç)jÀã\8a\1c°@\11\ 6\85Û¶È`?¢PûïÀ-^;\14\ 6Âm\ eí&ö-ð¿Â¸·¼\84õ¤\94zäù8ZÆ\13\9b2>\1f\86Î\81ÔkJJ\17%Ø<d¶ù(Î\16 £-T1¶(EÛÍ\8a²Û\14\99\94¡\88¤<\85'\8fPXòX\19R¦*4e¾BRW(8u\93\82R\ f)0í×à¦\82Ò\1c¼×\89\9døÛ\ 4ÿË£è\8b\8cà\8bXÏæð¬CK\15:JÑ7\948eS#vbbJwStª\97"Sý\14\91\16¬ð´\b\85¥\19ÿÃv\99\0EyÞaüáf\81\85]N\ 5Eë1j¼\8d'\8b\vKX\16uw=p\11D]P\94\80h@\ 5\8c\17\b¨ñª\ 4<¢Ö\1a\ f0±vb\ eM<ª\99´9¬\13ïtÒØÖ$m\9a8ñJÚ¤\99\1fʤ¶Óa\9eù>¾ý¾ÿó\7fÿïó¾ïÿQ·ÑC\94<f´º\8e±©KÊ\ 4%¦äª³e\8e:Y\16)Þ²Fq©;\15\9búkÅ\8c}\vÜäþ\a\9eùø\8d\1e\82úo\83\7f#íf}\1eV,\1f=r-Æ\1eåñÜMMì¼\93B®C¨I\9fô u·\1aÕÕjV\17k\82\92¬ÉJ´öVgë@uJ\e¡ø4«âÒ²\15\9b\9e£\98ôBEÛ*d¶ÕËdÛ¡(Û\11Efü\ e|Êý÷<óÉ\94îÓ\1eÆÛÒnǦ£Ç\99è\11KTÎu6v w\1ak\92Ülä2\12ë8\80\zfKIv\83\12\14\97\19«X{\92bì=\14mï'³}(°È\94eWTÖ$E:fÉèX \bG­Â\1d-28\ e)Ôq\ 6|Èý×
+Ë¢s\ 4»àh\82o]!ûól´0\a=r-,Â÷\91\8f\83ÜRÉe\18ïõ\9d\82÷"ç\ 4w ÌÎ\bE9Í\8at&\80d\19\15á\1a¤p×(\85¹2dp¹\14â\9e®`w©\ 2ÝËåïÞ"?÷A\8cÌIp]~®/\81OþNú)ø7ÃÙ8OZ\865­,E\8f`\ 6Öl"\96$\83\Fyñ^3¨\ 1ù$2OÑÓüdÌ5Èà\89T\88'FÁ\9eD\ 5zz(Àó\88ü=, \ f\e\8e\83BæÎå¾\ 6à5=Ï\ 2:¤©\18\93©to9tq9ôsðo\80»®\ªYÈ\19ñ\ 4{\13×\þ\1fW\86\16ùm\18ùõ!TWj\14Çû\91äe(\fU@!\8d\8f\97CÞËÁæå\80órÀx9ø¼l¼^\84ìEÜ^^\9e\85Ç\9bµ\8eM\17C7\13\135ã"Àk\16\90C\81OMð¬\85w%¯U-a\1eªx\8dëÄÅÔ\80g#+¤þüÞ\9d¼\12°H&r\v\ 3þóñQóñ\96exº2\ eù²DÀÁR\8a§*¥\16¥é\0\11\95RÀR>|¼\1e`jK0­ó~Ïa|\e|\8fø}ÚXÉz¨f\1e\9eä\8cX\8e\16\81\ad/\93,`0èÉo\9d\97JfJ\1a\ 6\ 2\80\ 1\8d_5µ¨¦\19«¦      «¦é¨î   ØT«¨E\15\8b©
+ÁWQÌ%+@3\82ÃT.¤VÞ\84ð;@_KüÚ\95|VK\9a«Ù\13H×     Ò\1a\98\83F©7×D`\ 6\1fÐLr¸µ_\ 3hvÈ£\81<\1aÈ£\81<\1a\1a\99\93F\ e¼F6·\ 6\16w\ 3\82¯§Àõ\9bh\fÐe\1d\9ds-\9dô*\1cÍ*\9fêë¨\ 11Ë×2eXÑI\e\98\ 3ä3b3\1a\0IÀüsø\ 1m2\a<h~\18~\80æ³\99Ư\99<ZÈ£\85æpk{SFS°\15]´ Í\96ù\80Á5£\89§ÑeÓûÄ£«ßâÓ*¤R\ 1o\11\9MìG-¬\83mR¿íR\97\1dð3\85\86\9d\ 6|\8ea¡áù\1fìkG \a°A:@C|\10\92G\eÚhcNÚØp[©E+\13ÚJâ\a\8f\80\8b«Úÿ­\163¾bÆ\96\v¯\ 3®1ð<\ 2OWb\9b\89\1dz\80ø­à\10x\1e\1c¹o>þ\83\17ÀQð"@òz\19­\1ecn^\8d\91N°VN \8d\93èó$\87À)\16ÀI&ñ\ 4\81O\9câþ/\¿T Üyp\8f\87ײ\9f½°\r~\f\86\19é\84\1céàh\8fÿ
+x\rð©Nwà\f8\v^\aoÜ7h\18\ 5ð\ e:9Ï\9a¹\88Q¸L3x\19m\á\0¼Ê\ 6|\8d\ 5p\8dZ¼÷+À\a×>VÁ\1e4\b÷XÆ9\18Înp\9aá\f\10ç\99\ e\8e·\ 1Ë
+ãû\0\17À%p\ 5¼\a\98b]\a7ÀÇàïäñ9õ¸E\83|\9b\ ekõ.\9bß=tq\8f\82ߣp_¼\89Ë       \0\10\18@\14è\ 4z\81\158Àd\90\ f
+ñ¨%8¥\ 5b&q\8f\e\9cÖ×,\94¯´   ï¸\157·G÷\98¼;¸Õ[\14çs}\84»úF7Û}\1dø#8\ fÞ\0¿\ 1>ÒýoD\80\1dô×\8fxÌo\95\ 1Ç\ 4\10»\80ØEÄ.!î\ 2}F\1e\9f\92Ç'äñW\àG¸Â\e8Ä?#Öë\88ç}
+y\r7{\95//\11ñ\ 2\83û8xéÿäð\83Bõ/üÝ?\94¨»xÝÛxÌÏd!¾]\1fÊ¥?ÉÃ8
\aò¸J\1e\97q\91\17q`ïâ2Ï\93Ç9­cÊ\9aô¦vé·\88ùuXÎðßi²<©ï\98^\9f^\ 5GÁó õ¡\1c~\ 4_\81[ÌÍ'22\968}@-®á1/i\ 4ñ­äï \9a\9b\1az\88]@ì"bÏ#v9±\171®¥:¦:fà)dÜ̲ù%\958\f×)=\87\18ÙAØ\ e\80}`7x¦#\avL*%¸\1fÈê\ 2ºx[f¸\12áéE\84Aä>\9a¥\91Nìlb»\89=\95èÓ\89ïeæç2\9eùįÔ~òxV«aßÈv²];aÜA-¶\13±\85\8a63Ú§am\ 2\9bÁFÀn\89fÄü±\94:\96Öiôy\8cZ\1c¥\16G\94Ì\18úÂ1\94øc´W6\14\97Í\18ÜÄÏ!~>ñg¡Äbâ\97\11»\12E,C\9d\rÚÀÆú\14\99¬%ÛF¢Ö3\93«QV\1d¼µ\1dX\ 5nÁù\ 18×±\ 4\8fwl=\87¨Å>tñ\vÖÈ3ê¡mÌI³\86Á\91Bþ6òwh=úX§)päÁ1\13\8eb8æ\13{±Vò·\9c\f\96òe5µ¨¢\8a\8b\95\ 2Þ\87q#\88%\1fÆØYÊ/²Õ>\17ø`ëÝ\8d.¶²F¶(\86ñ$ÁÕ\v\9e\ 1p<
+G
+\f68\1c¬\b§jÈ£ZÓ´\84<\16\91G\ 5ëå  \9e\94\93U\19\11J©\       #\9b\8bJ\8bõ7Ía¥Í\81{6h¿^b{?Ëvö\12[É!®{8v¶\91Ï\16¶ºõ
+!J$õ\8a£ºÉDí\rÏ@Æ2\1c\8e\14-D\1fåÊ\82Ç      Ï\14xòP¨\17\9e\12âW²\93¬`\96Ök\ 6\95,@9ùÌG\1eó\91§\7f\ 2\1fY?À[ñÔ\9föã0GÌ^\8eÝm\9déí8rÖÐ\9a¬¢.5~a\8cÍ\ 4_\ 2\Ýô¸ú0\9e\f\87Ç\ 2O:¬YTÀ W\ e*\9dNüÙÄ.gõÔðd\rÙmÕ$¿VMô{Mnÿ+r\ 5Þ\93+È÷\13ÎÂ}´\aGXo|/ØÂý\1a\9e­ìDëA]\16\1aýU\12\1c¡9\ 1fyý;kfÀÏT\10ØWù\81\835-h\84r\83,\9a\1alSN°C\93\83Ý\9a\14â\91;d\96\¡%\9a\10ºXã\f«\95mh\96\80ìaÇ\95\19~I\99\11\98Ñw\1f\99à\ 4[ùá~\1cÉ\ 38êÁ\ 6\8eÛ:Z\90\1aÚ²\85´Eó¨\897*HùáFyÂb\94\13\9e¤Éá=41¢\9f\\11\83å\8c\18©        ÆT\8d3f(Û8NYÆɲGNWfd±2"+\94\1eY«´¨&YMû\95j:.\8bé²,æ/\80ï>RÁ+ð·Ñ\86îâhk\ 2k\87â÷\ 6ÒnÑ\82\94Ò\96\15Q\93|æk²9TÎ(\93Æ\9bâ\95mêª,S/ÙMýõ\98y¨2Ì£d3[\95n¶Ë\1aíÒØè\¥F\17)%f\81ÆĬШØÍ\1a\19»W#â^Öð¸wõhü\1d\r\8f÷ý\84\178Þ÷Ó\82î\18%mâh«§õYÊÿ\vy>\97\9aÌ NSi\ 3\9c\9d\ 2\95\15kTFì¿Ù.\13¨¨Ï+\8a\82\8al#Û\f0\f\0ΰ\83l
+(\110.£D\ 44DÃ\12wq©;hc¬\e¨\189©&\bÙ¬i\92&VLlk\8d\9aXS£i\9b&=iÏñ´Zcܲµ\89UÓtú\e\9c\1cÛÓ\1eÎ=ÌÿÏðÞ}ï»ß÷½kPq\88QE!\16\8d\fµ«0Ô©\82Ð,å\85å+7l´F\84\8dSNx¥²Ãë\94\191W\19ÆUJ3nUª©K)¦\83rF\9e\ 1\8cr+%ò.^¦önrïÆÓn-d\1dÀò<Ffx<B\7fjàáB'e1R±i\88
+\8dAÊ7\86\18­\1c\93MÙ¦$e\99Ò\94i\1a¡\8cÈQJ\8f,Sj\94K)ÑÓå\8c~T\ eór%\9b7+)æ)%ÆüDvËi%X®ñû_J´¸ûð"uw\91w\17ãç&|m\v#Ï2,Ê\1c\8fEÈf¾JÃ\16\r\97JáQ`ñU\8e9@\99æaÊ0\e\95f¶(Õ\9c \94\18§\9c1YrX
+4ÜRªäØ\89J\8a­\96ÝÚ¨\ 4ë2ÅÛ6ÊfÛ#kÜ+\8a\8d;¥Øø+²Æ\7f˳[6à\19÷ö\92\7f\a~v#ãç\9aR´ÀçGy÷\10\7f«\84ã84R\82^s\13ú+Ý6T)Ö`9¬aJ¶F+ÉjS¢-Yv[º\12âò\14\1f_¢¸ø\adK¨\925¡^±ö%\8a±o\909ñIE'¾¤È¤·ÀeE%}£è$7ï¹Ã¨ù\87älÇ
+l¨`Æ\ 6Í|n\82K-<&³Fehe\14k\96\8dV\1d\89\83\95h\ f\94Ý\1e¢x»IqöXÙ\12í²&¦(6)G\96¤"Å$WÈ\9cü ¢\87ÏT$\ 6Éäø¾\8c\8eN\85;_T\98ó\ 4¸Äç;\8apºe\ 4ÏÐÿNrn{\0=N@\8f`!cp\ 3\ªá1\89µ\19;\92Y\ fÍd¢\91äT\1fÅ9ü\15ë0Èâ\88P\8cÓ,³3^ÑN\87¢R²\14\99R(SêXE¤NVxZ\9dÂÒ\16(4}\9d\86¥?!Cú\ 1\ 5g¼       .Ê\90q\9bwî>ìó\8cÿäß\82\15Y?\19=N\91\16¸Ð#£_\15<&0\8a\96Ò§\ 2z\92ÎÚØsú+&ÃOQ\19A\8aÌ\b\951#R\11\19V\85g&),3]¡Yù
+É*Õ°¬I2dÏPpö<\ 5å´(0§C\ 19ûå?â(8/ÿ\9c\9b<39\82§ÈÓAþMØÓÖª»ÖlîTi&ÏSy?\9e\9e\8cæ;¹pM¡gqô$*\7f\90Âr\ 3\14\9akPHn\84\86åÅÈ\90\97 à¼\14\ 5å\8dP`~\89\ 2òÇË¿ \ 6Ì\96\1f¦qHA»\ 6\17>+ßÂ#àC\r*üB\83\vܼg\8e¡Þí\8cþ\e«9\9b¦£G0»\16ÏÅs%\*èË(¾\93\92Y³XÖ'bt\7f\19\8aý\14T\14¤\80¢P\10%ÿb\9b\86\16\ f\97_q\96\86\14\8fÒà\92qò-©\92OI£\ 6\94,Wÿ\92­êWÒ\8d¸1   %¿åógà\9fº¯Ø­Nò·Õ Ç:i\15\194\81\87x\9e\f\9fû±iù|\87åU<}\89¢/!ã¤\80òAò+\vР2\83\8cò)³h`y¢ú\97§ë¾r\84\\ eár\9a\bX
+0\93å\98µr\8cC\19Æ ìSÀ\ 4WæÖ.jÞBÎõõÜ\11\8dè±\89ó\11Ô4°\ e¼/Æ\96dÃ%\19\9e\16ø\84Ó\9b BûMñÕÀÉþêç
\10ã0wEß=Ì\\1c°.\ 4ìBD.\84å¢\18×"°\ 1\81c\1c'1!Mdb\9aÈô6\ 1\ e\13ÜÚ1\8b;\82\9c-s8\9bæKó\17pG`O+y\1e\8b\1dÉ\87K*üâø\9eéaÉ@È¡3$\9f\19xºé\f\1aµ\òµ\f\1fµ\ú5\t5\@5\99\0\11×д\1a\8a¬!`u+Ø-MÃ_M;\85à¯"88Lu«m6{\92¼«\9bÑÂ\12Î&P»\98\1eð\´\90ýÈß\12 \11\8dU\fá»þðò\ 5jbÈibÀhÄ[6Ò\8b\86\0ÒÀ\ 5Ó@/\1aØDõ¬G=\8d«§ÈúÕl¶\9d\14\88¡\9by\82Cø2¸\83ðÜÚD\9bÖ-ã\XÁ:¬äÏ`
+\9fï\a¹XÃáÀÂßÃXÒ\0à\vG}\87Å\f\82\8b\19\ 4\173\8c5ã9\1cpÁ5Û\ 1½XÄá²\88õXÄ¢.$ÈÂml|\8cå|Ìê<ÌàÜ[\
+nm ×Ú5ÒÒ\16Ê¡]ÓÖ±\17@!H]/Yù\1dÎû@à\v\18&ïÁóÜ
+\8fVx´Ò\8fVx´Â£\15\9fÛÊ%ÓÂå×R\ e\10ÓZ\1aºöq.\ 3|æj&çULÒ+q4+ÜZO¬\15XÐ9HfúF$\82|\8b6K\19\0\88\0\81Àw+ù(\83¡\9d\83Ý\8b¶ïÀº´\râ\1d<ÚáÑ\ e\8fí\fdÛ¹x·£\8bvzÑ\8e°Ú(¶­\938èrë96ÃçÀ­5ä]@Î:r¸\88;z\agA\87\94°K2>Aÿ\91\91\ fÿ\86\89àb\ 1\86îÿ\ 5å©\8b\9et¡Ó}\fÆÝðèA\e=\1cð=\1c¶=ô¢\e\91u\93\và$ß½ÂÿÝV3uÌ"o%9KÉ\93³\87ó\98\98Fb\ 6vI\ 39Vú\86ýç\0ÿ\8aá\11#ò=ü\18 uÌ\90ô\8aÇ\9côc@E«?e¿\1cb(íE\e½¬Éa.¢^zÑË\ 2\1e¢\90C\9cU\87>\ 4\81Z§>ÉQAÞ\ò%!\19ÓóÔ¿_\1a\eß\13û5Ðë5AG¼ø\19øy\9f1\93~        Þ\ 4ÇÁ[à\94/Æ       \1eg\18Úßåâ?\8b>Ïq\11¼Ç&8Ç¢\9e%øYzqö¢ªÉ]ÑÃ9@\8d\ eê\8a"g Ë5à 7ç\eÞ<Ǽ±=fð\1d\80wÁ9¯Q|\1fP\9aþè5\8f\17X\9bËðø\84½r\85Ëÿ*ú¼Æ\1e¹\8e.®Sø\r\12Ý8ÙçyïÁ\aø\83P\10\v\1c \17\8c\ 1ãq«\ fê\eÜÊ\1düÃ-\9cÆM\Ç׸\9e¯p@\7fÃE~\89\eû\1c_õ).ô:\vx\95\ 6~B\83>ÖG¸«¿ë"QþâñUàmp\14¼\ eþ\9b\83\a\83A0\88Ò·ø\99Ûx̯5\92øc\89=\89ØUº\82\9b¹\f\8fKðø+<.à$ÿ\8cë;\ f\8f?á1?R\87>@¨ïk?íéÅeþ\9a\9f«´Î­Óà\ 4x\ 3¼
+^ú?\1cni 5\ 5è3|Õ5¼îezqA#\88_Lì
+ý^.ê¨Ò{ð8\v\8f3øºwð\97¿\82ÇÛð8\89#=\8eC=\86·:ªn$ó2µ\1e\83Éy\1dÒ?t\90\81\ 3àY°ï?8Ü\ 6ìVr\8a\9aüô\a\19È\15E\9e\ 4\11?\9fØ£éì8ý\ 2\1eGàñ:ërX³\88ÝDìùÄ^\82³]MÖÇØ2mú\11\9bù\ 5~\9e\83A\ fÂ馲.²=\rö\80Ý ÃËá&¸æ\95\91GZ§ÑÅq\ 5\92+\9c\9e\91LüLV·\80­8\86Ø\15D\9eDì©ÔRKü\87©§\91øóX\81%Ä_\83"6\92c§vñv'¬¶³iÚPÄ6Ô´\85¬\1eü\0l\0_\91ó\12øÀ+uÏö:¬~ÔãG-\ 6rE¢.\e9\1cÄÏ¢²B\8e«1į þDâW\12¿\86\8eø\rÄ\9e\872\97 \85ø\9bY\99N\8eõçy:\f³ß°Z_j%yWxñ=ð19\7fçÝv\9e-ÿª÷\18ê¡\17{ÑE'{¤Cfò$\90ÃIÔlø\17êqÖå1\95¡Â   ä\98B\8ejrÔ\91ãßd\97kLÛç\15Æ\1fî7ÛØÆ6Æ`\e0`n&&`CbH\0'@B(\ 4ÈH\13\8c\84[Fi.\90K\9b¤¹@\9a%Y\9ae       (m×fiÔ6AZ·N]5mÓº}\98¦m\9f6MÓ¦MÛª}ؤjÒÚ¥Õ4ïG.S¥      =zí?\7f¿ÏyÏ9ï9Ï\19\83ã\80\8eðw\10\vfùå\f¾8À©¦\89è$7e\82l\1f\87{\15\13àW\94ú\ f('ß¡Ü¿\8d$xýqéýêÃ\96\90\ e§\99ó8áÉ×       îÉ1Ua\7f\bû#ÜÊf<ߦg¸·3Øq\0\88Ë\ 4ù±\9f§cX5Ê\ e#Df\88\b\ e\12Ý=ú\1dÙü       \88\91M\8fðSÚÌw)ï÷h5¯±Þàû\15ì¡\85pÎ$v1ÂiåL.x
+8K)gYÃ\19BðDài\86§\15\9emðô`ÁÓð\f³÷$\9f\ e«\9f]vàÉ>N×K<¶\13\8fn²¿\eî'ø\81\8d2LYÿ\ 6%u    )t\ 5\80='±e\ e¿Ì*\95³\99à³\11í\v/ä<eð¬\81'\ 4O\84Ó7sKZáê\84§\ fK\ 6Ø{\8clYõÐsêÀ£[Ȩv2»\8d\8co¥V´RíZáß\fÞË¥íÐî_¡Õ^\ 3\17\98mOaÏ\1c²h\ 6¿\8cÓ\ 6\87\13Óá4Ãç\80Ë\r\8b\ f\9erx\82Ü\8e\10\\11¸\9aáj\87«Kmqýj\8d\eÖ¦øiEã\8fª9á\82\9a\12\96µ!ñ¾\1a\13\7f¬\86¤\ fÕ\90ò\0Ä\1eâ\1dxïÐÚ\96\90\81\97ÁY>\1f÷q~Jü\ 4þ\19¶¢í\8c êM5¨+É¢mIÙÚ\9aìQ{r\91Ú\92˵9%¨M)aES\eÕ\9c\1aUSj\876¤õª1m\8f"éãZ\9f~Dõ\19\vªËXR(ã\9ej\r?R\8dá/ª1~
+bª\ 5÷áü:mí:rã"8\85\14\9c+GS \91¿\88\7f\ 6ðI\1fñÚ\96\99¬V\83QQ\83\ 6§6\1a¼Ú`(V\83±B\11ãZ­7Ö«Þ¸Qu¦6\85Mݪ5íR\8di\9fª3\ f)\98yNUæ\9b
+\98ßV¥ù\ 3UX>T¥å3\10S\0¼\ 5ÿËÕÒKH\8d\85\10²\8bõ\10ß'\91bCØ·\13©ÜE¼ÚÈ\93&K\9a"æL­3ÛTgÎUØ\ Z³_5\96\80ÖZjUm\89(h\89ªÊÚ©\80µ_\95ÖQ\95gͪ,ë\ 5ùm×Ub{SÅö\1fªÈþg\15;>S\89\12{LoÀ·\1c&\17\91\19ç\90ÂÇYgù¾\9fç{\ 2ø \14\1f\10¯(ãC$;I!\9bQk³,ª¶ek\8dÍ­*[\91*m媰W«Ü^¯2G\93J\1d[åÏîSIö\90\8a\9c3ò9O©\0Q\96\9fsWÞ\9cïËãú£¼®\aÊwÅ\1eâ6ç¾   ÷%æÈ3\e\90\9a¬3\8cIcuèKZ~\ fvlÁ\ eF9Õ{â\14ÌIW¥3SåN\9bÊ\9c\9dù*Éñ«8' "WH>×\ 6\15涩 ·Gùy\83òº§åv?¯<÷U¹<w\94ãù\9e\9cÞß+Çû\89\98r=1½ÆHt\1dÞ\8b̳§[È\ 5p\0É3ÚÀh\82\1d]HôVr¤\91|\r!\ f\ 3ù)ò»\8d*v[åsg«Àí\ 6EÊ÷TÈëY+\8f7"·w³òò»ä*\18PNÁ¤\9c\85Çå(¼"{ámÙ|ï+Ë÷[Ö\8fe÷Åä\0¯Àu\rþ\v̲'\91\9e\87Á4\9fGxÖÏÿ:±q\13¾j\b\90#å%     ò\15f(¿À,O\81]y\85¹Ê-,\90«°T._P9¾z9\8bZä(î\94½øiÙJÆ\95UrTÖ\92K²ø_\97Ùÿ\9eLþ_Ë\úO¾Ç\1eâ\16g¾º\99|\\1d\ 3\98e\ f\81É-ä#¶ìÀ\8emÄ'J¬Ö\93#ÕĦ\94Øä\97¥)×oR\8eß*§ß)\87ß+{i±lü3«4,kY\13è\90¥¼_æò}2UÌ\81\8b2V¾*Cå»Ê¨ü%ëG|GµUÐÇ9ó\158Ï1\1a\9ex\8a\8bºÀ:Ø\81ÖfTÛÊÿ[°s\1dñZ\83O\8añ\89;\98$GÀ [¥YY\ 1»¬\81<Y\ 2>\99\ 3åʬª\91©ªQÆ5í`\87\fÁQ¥\a\ f)-¸¨Ôê[J®þ&ø\19ø\9bR\82ÿVj0¦\e\9cÿ\12²ûÌvÆ\9f^îD\1f\87;ÁXÒ\83][ðK\13>      \91'\15ø¤\10\9f¸êâd­MSf\8d\9a,\19kr@¾\fµ¥Ê¨­Vz(¢ÔP«RB=J
+\ f)1<«øðÙG\83C\98Î\1cF%\84\99\9f*.\84\96\81ÿE8O#»çwr'\18EÆXw3ªnçy\e~iÀ\96jlõã\13\ fñq0:\99\eR\94±Þ¨´õ\16¥F²\95\1cñ()R¢ÄH\95â#õ\8ak\88òÃÕ\1f\ f\82/\81Ó\0-ÝÀ \12ù     ø+`Þ\8c ¥àY\84óä\80td\ fw\82\9f\8c²îâûS<oÁ/uø(@||ÄÇEܬøŸ)Y)Q\83\12¢4\95(Í%J!\8br\81£$n\94b\17%\80Q\ e\18Ý\r¦\0³M\14EÐÂPÔ\82ZiF56£ \9b\fÏyx\9f\e&\17F¥)F¡\11Ö~¾oÁ\96Æ]Ì\9e¼ãÇ/\1ebeÇ\1e\13ÇKëLR|'\rm\9b      dI\1d4\97\ e\1a^\aŤ\83äí \81:0¸£\1fì'±\98)¶~\85\ 2\ 6¡vÔ[;~h\8béâ^r\ 1Þc¼6;A>N\92\8f¬Ýû0\9bçuØRÉ;\ 5ØãäHfb\95\8eM   ý\88\9f~fº/Ðäwà\8b\1dø¢\ f_ôá\8b¾Õ\ 2KÁíãÂõax\1f\eõÎ\ 1\ 6Ú\1e\86¸í\f\7f\ 2ØÐ\15Ó"Ü'qÕ\1c!\9ba$\1d\ 3ý|Þ:\8d\ fx\1eÄ\9eâqb\80M\16¶ÊÀG\89#\b\9c\11æÊa\ 4Æ\10¾\18Â\17{i°{\99s÷Òp\añÅ Åm\90x\fâ´A\ e±çY\802\1a`¨ÛÍ\90¸ë\ f\14Á\7fÑ\90b:\vß þ}ø0q8Âk¬]\87\bÙAî\ 2\7fnìÊbL4ðn"Ð\13\ 3\84à\14vLaÇ\14vL"\84&i0\93øb\92K4A<&\bè\ 4\87\1a?Ã¥C)î{\97Ãþ\86Æü1\88é\14\9cÇ\8e\10®\11Ðw\82Ú\fÖ\81Jàå\99í\189\b\12\81>\8f£«À\1fóøc\1e;æ±c\9eÜ\98§áÏÓüçÉ\8b9.Ò\1c\89?7FÒ³ááë\14BîçÁ_HÏþ\83\ 4\88éùçx|
+ó¸:;_ \ 6\98ÚÀU®:G\ e\0;0\82\ 4\80 ¦ ê\91Ø\|üù\7fH\ 4äÇ\ 2v,bÇb\1e É,RØ\16(2\v$Ôy\1c{\9e\9c8G^\9eå~\9eù;¢õ?\9a\87o\92½\aسóEiã\97©\ 5\97¹\87\ 3ÀH*Ç_\85ã%p\rp\f\ 6\8cÿÇ\8d' 67ÉÓ%ìXæ\9e,\13\93e
+Ê2¾X&±\968äÒ«¼ó>ï\92\97_{ \ 3ðîÅ´n¸\9aá¨a¿"örÜ\84\9f²\16·*ô_\ 6ü\8ca\añ\vî|n]Å\eàîãÁäMð\16>¹g\90V°c\ 5\11´B~®PøWðÅ
+I·\ 2ÑÊ\8atÿç¼÷\91\869c/gÛ\ 4\96T\ 2W6\ÆÛ\8f÷_Ý\9b²Â¸\86\0\aï\80o\83o=^I/\ 6ÂG\ 3\12éÎ\b!\86R\ 66òä¿\\97{tÓå\1dÆ\9fÒ6½%inmzK\9b¦÷¦4I¡IKK EZ.¥\16ÊE \87\ 2¥\\841AA\18\b\82È Û\0\15\87\1d\8c\ 3Ê\18 Ã¡s\88²)\ eÊ`âe2Ïq2&\87\81s\93É\18Ó\9déYöiOÎæöÇs~é/éû<ï÷ò¾ßç\17ÔÈYzö,µÑG¯\9e£GÎ\11\8b>\12Û\87\93é;\ 5®h
+{mf\9f5¼*c?\99ìÅô,kü\b\1c\8fòôs¼\1c5\82§Á\99¨1#¥ê\8b\9aÄ\vàbÔ°þ\1a¼\a>\0\1f\12\8f«\9c_×8?ÿ@}^§GnÐx7Øüu6výÌ\80çý/b@2°\ 1\17(\ 5CA\18w6\ 6·Ú¦Ïq-\7fgÒ¿\83³¹\8d£º\85óù\14Çu\137ôg¼ÝÇ8Î?R<7´\a\1f{\b\97{B¿GÜeýEï³R?.\80\9f\83\17Á\8fÁÿjè\87\ 1¤êKüÝ?ð\11wðv·TÃú\8d¬=\ e\7f:\91uïÑ\87è¸\82\8eË8®÷9,ÞCÇ%t¼\83¯z\vgz\91â½@\ 1ý\12\a{\96཮kz\r\1a«¿\12å>\ 4\ eü\9f\86/Àß\88ÅM\19á³ó_¹p\95ê·ªÒ»øÜ·t\97ÞÀÉ\9cGG\1fñ8\83\8e×qy§qa¯â6\7f\86\8eWÐqR\9bØý6ÒØKùü\10\15'HíÛz\96È\1d\81é0Ø\ fv\83]_Ñp\a\9f\eüÝ\9bøªóÄâ,Þî´¼:\85\9f:©áú)îì\ 5t\1cGÇs¸®c8¾£8À#øÜÃè8\88\8e\ 3Z\8b»Ü¬}äd/\rµ\87_õR@»ô\11m\1c!B\11¾\89à\0\ 1_Ây\v\\ 3\97¢åõªbá3Áe\87'\a\8e"Ö¯¤M\82z\86ÚØG<ö\92\97ïS\1f»q\99½\9aÁú\9d¬?_;µ\84õWh\87Ö\11\89\1e²²\8b
+9È1ö\92\1e%c\9bô\19Ù\8aP9\9c\8f`-¸   çïÀ\eÑ\92ïo±c\ 3-\99Ä^,p9õ=å±R ëûô\98BÚN<¾£Q¬?\96õ[92ÛÙõtÖïdýn=L<ÖéAÖßÈ\91¾]«Xe\ 5»¹\1f¿»\\9fh\19¼÷E±\14ôó\9f\a§¢­x8z\14õ\12\8b\8bmôH\8f2ÙG>\1ceè÷k=:\1e\1aêt5ý²J\13´R\93ÈÂ=pt±\80\8f\88¬Ñ½(\È\ eæS\81Ý°té*\15ôO²\17ù\ f.r\94\9c\8a\97\9e\ 3\1aä\98b¿Ì\98\ 3×C"\9cföã\80'\9b½\14ÀQÆê~ô\aÙm½\16«\81\ em\86§\ 5\9eI\9aG<º4\9bµ\17¡æ\ 1ªv\ 3\15³\83·û©â\9fPAo\93½Û ¢É ÿy\9a#äy®\99\83©Òn\9e\8fs´mE\ f×\17»\18\ 4o
+\9c\16ö\94\ e\8f\v\9e\ 28ÊáðÃ\14Ô,ÕÁÓ\0O\13UÑB$Úá\99ÉúóP´\94Ê]£»\89ä\ 4\85,\8f§£ÆéOdñ_ 2\80\93\ùGð³{\19?vòìá\88ßÀX´\1a\18\95\16s^tS\9fsd\85+\ 3\9e\x
+á)\87Ç\ fc\10\9e:ª³\81Êh\86«\15\9e©¬ÝÉ_\8b\92
+~\94êÙÅ/\ ek$\15?\82\13f\ 4§O\18þ\11àyF\8e\ 3\8c>OqÅm\ 3\9b¸r¿ÁѺ¼\7f\1c!.s\13¹Sc\12\89£\19>;\\99°ä±§"öã¥\1aüp\ 5áª\87«\11®±pMdí\19ptóv¹\86\91\8fZª«f ³^\ 6\1fÐéw@d\0GÝ\\89øÈ\9dÅä\0¬çó
+Þ-a4\9cÇuÓAL&\ecÔjHÖ¸A©ð9àÊ\82ÍÍ\9e\8aàò*\1c\13P}LHu\83ª\1d4Z5±\13\14\8c\9dªê¸9\1aÂà\15\88_'\7fü\ eùâ\9fÑ`ÃKª0\REÂ-U$F\ 6p\88+mw¹´£\82\1aäª_ÃÕ²¼\84±\8bq¬ÓÅlI\8eî&&cÌqjHNQ8Á¢:C\9aj\13²U\93\90¯`b±ª\13+4$±JUIµ
+$5È\974V\95ÉíªH\9e%oÊ\12\95¥¬U©q»\8a\8dO«ÈxB\85ÆwU`º¥BSDEà\0üOùè\ 3Æ®GÀê\0³m%ã\1e#P\a1iï\1f×É×(ê¤ÞbPµÉ¨!F«\ 2Ætù\8c9ª4y4ØT*¯©Rå¦j\95\99\86«Äܤbs\9b
\1d*H½W\9eÔ5r[¶)Ïò´\\96\13ʱ\\92Ëz\eD\94\vöÃÿ$#F\ f\9eöá\10#\1fϯñw\17泥¯\8d8\8d!7#\18\11\8dß\9a¨
+\8b\16\9bJ-\19*±äªÈR¨BK¹
+¬UòX\87)ß:Jn[«rm3ä²/T¶}\95²ìßR\86c\9f\9c\8e\17\95îxGéi\7f\953-»\88öÂ÷\ 4Ü[\18\81×Õ1n\82Å\8c\80sð¶ÓÐÑJnFS'Ã\19\87\86\83\9dñ*¶\eU`·ÈcO\93Û\9e¥<{¾r\1d%r9|ÊI\v);­AYéã\95\99>MNg·Ò\9d+åÈØ*{Æ^Ù2^\905óMð©l\99\11ÙÁ\1eöý\18¼\9bñ³k\19ûî\a\8b°H\9d\8c=S°l-~ò@­\f£Fª¨\91òÜ\18y2\93\94ë4+ÇiS\96Ó©Ì\8c\P¨\8cÌ
+93\87*=+¬4L¡={\8alÙ]²æ< KÎ7\95êÚ#³ë¸L®_\81OøÌ\94\0zÙÿvx75R\8fxÚeXÕ\85|\9e\85¦v¾\e\87Æ\ 6ê¤\96z\rP#¥äÆí6(Ëe\943Ç¢´\9c49\ÙÀ#»«L¶Ü*YóêeÉk\92ÅÝ.³{\8eLùËddHOñô*ÙsLI\9esà#>\7f¡\94|îo¸¾\rï#øØÕcð\19`\ 1\9f;Ð3       mc\89ÑHrSCn|Ĥ\84\98ä\96Ä*½ Y¶|³¬ùvY<\99À­TO\89Ì\ 5>\99
+ke,¼K)EmJ.\9a¥¤â¯+¡x£\fÅßU\ñQÅ\16\9fáy\1d|Î;îröÜÃÈ»\ 1\v°ª\85\9e\0Ýã±chiCG3#à\bt\86Ð2\98\98\14Ò7ÙÄÄ^\9e ÔR\93L%V\99JÓe,u)\85 %\97\rVRYH     å\8d2\94·*ÎÛ¡Xï\12Åx×K^n"/·¢\97\eÚË´àý\8cä2K°ç-p®gä]9\91\9e\0]mØÁ       \9c\vèjF_\18-CF2óÖ\93\abâ$&Ö@¼\8c\92*-J¨L\93Á\97­x_\81b}^\ròSH~\82ègC\81é\0Ó\1aÀc\ 5\98c\ 3\fê~\86cÿU\80×óE´\ 3þÍp>4\99óq*=\ 1æNÁsµÓ\13¼\1f\8d\96aXFßh©\88\98å\10\13\a11×Æ+)\94¢¸`ªb\82\1c\1eA\ e\91 M\1c¤h\82\14P\88Â\ eñ\8f¡i`\ 1À\18\860MA\fC\90á?ÈÄV\8d\86jæ)x6Á»\96\91{ùLz\ 2Ì\ 6Ó\90ßÂû\91Ø£êVB\86V7ùq\127\võ\93Ò\10§¸\91É$\8aK%l\ 5\xa\ eÖ0\8d\1c¦©Ã\14t\98\1f\87Ù\x\1eÀÛ\fÇÄ\rǸÔcBê¯Huh¨c\9eCæÆ\ eê±\93z\9cCO\80N0y\16y@Ë0¾÷\11\97"´d£×F\\8cè1\8cãR\1d\8b¿\1c\83¯kæRivHM\1cdM4p\13\85ÛÄ¡Ó\84Ø&\92Û4\9b\80â5GoÅLí\ 3Lk£.K\8dhh\8ch\vöký\éÁni)![\80\r\9a9\9f<tÑ\93h\19\8a\9624æý\9bí2\ 1\8aú<Ãøù°\17»ËÂ.Ç\ 2Ë\8d(\8a·\89\18Ï\90¨\b\88D\ e\rQA¼\15Ä`À\13   1ÊX\15<\88iÌ1QHÌ¡¦\1d3&\85ÚĤi\9afÒvjb\8cN\9b1IÛ4c:¶Iuºý-lgZ'ã<.»ûßïy¿÷}¾÷{\1fò\14C<Vrc`k*cø\99\1f.\95\97\92\8b\12rQL.\8a¹\84\8bi&ÅÔ£\18M\14\13ô<Hæ­\aø«"\fÕ\ÌÙ\9cK\1c|b\98íÓ£poA2MkÐã:´°\96\1c¬f[|v\171\8dàûTRé&N\eÛ\89$_\f.CXL.\16q¹W3\bU1\ 4\8bJtQI.*9<\95Ô£\92\ 2VT\0\16\13\1eÀ0\96\16\971ßÂýÈ\ 6ú#©Z\ 1ª\1a    ³\812óÙhBÏ ®x\9e±³Dä*xýX\19\09S=q,'\8eåı\9c8ê¨I\1d\8e\Ôr\80j©G-\ 2¯e3ËZÙ$çs     Fò!\8c\röâÓV¬_s3u@¶5 \14Ì\0ã7S\ 3\90ÈwvädÜ\ 4ß\7fñpàµ)\80\8d\f¢\e\r\808\1aÑF#\97[#g¤\11]4r\88\1a\r\81\877죠    aj×aT×0Õ¯ö©\95Ð\1a·\11&(§\8d\14î /\93²\\ 6Ê$^\1dÀ\bä\87\7fÈÜõ?h»\13þA\94³ÒF>Ú\18<ÚÒ\0ºh#\17;\11\92?é;:\10 \93û6ÎçÖë\bá¶\1eæ·+X¯\12¹Ìy\8c#\83tóöp\ e÷Ò\v\81\11¨30hs¼1\18\f¾\81×;áÿü 9éâ¼t\13G7Úè¦&Ý4¶nrÑ\85¨ºèU]Gyî,¿A\97ûÿ¡U»\91\15\9cEpܳ\9fÖÅ:^Jæ<\ 4ÿaÖ<2h6\18\0\92ƺ       £õÿð\e\92g\ 1G\1f£\87I\0'¨M/uéE\e½è³\8fFÛG.ú\10Y\1f\eë¥\1e'ßṿª\86½\95À;\r¾1p¥a0\9cp\19\8f\aÖö¯{\ 2ð\13\90 {%\80W\ 3\18Ca\1f\84!\15\16W\8c®Ò\9bÄÑO\1cý\fc\ 3\f*\ 3ôÍ\ 1r1@á\aØÔ\0\ fö_R\19û\9cÉÛqpfÂ\17Ë\1eL´tL¬ôR\80ãl`íóþuÁ\80ü¦tÈ\1c^\0o\ 1$6hVßÓ\90\rø-ø\848.sf¯pé\7f\86>¯rF®qØ®Rà+Ü_W.0Yë\ e\18\80\rÄ\81t0R·\99οgj¿\89sø;Îå\ 6®é\e\1aÄ×ø\98¿pH¿ÂÙ}ÁA¹\8e\1cGøGÄs\8d"^¡@\9fà \7f¯·õ\91¾Äaù\bÍGÈ>|­\8fTúp\1c¾\1f\88!X·ð4ÿT\f|Épåà\8aƲ~\ 1kÏÒg8\8bË8\8dK8\9dß\11ÇG¸®\ f\89ã\ 3<ÕûÄñ\1eNô]<ÍEüÝ\ 5D4\0ËÏ(Ìy}¬×YÕÏýZ\80ûYðã;bà6×ß\0\13\ eÎÔ®Oñ\11\7fÀÛ}¨<ý
+\9fû\ enâ-ÜÌÏqSýäãMâ8\8fûz\1d\17{\8e\86õSâx\8d8Nk\e{ÜM)»(é3Hé4\92z\17¹~=ÈëÇ1p\b\1c\bÄp;ÀÍTÁþ¤_+\8c}Xá\8a\81'  \8e\ 4?u\ 6§ô
+Îæ\14q¼@>zñS'ñuÏã/\9fÃ\r>£z\8eÍ:=E\13\1d\1c§N*Ò£n\9e<¨7ÈÌUí#Ëû`Ý\v:À.ð\1d\9c_\81O\ 3RòËìÜ Ô\8dpÙùµ\e\ e/±ç°öh=\89kë!\1fG¨Ë!Ü^7îï ÊY¿\8aöñ\10J¨gýõz\\9báhçß\ 1Ú×ÓDt\86\8fbn¨\15Þ\16Ð\f6\81ë\ 1ù^\fÈþ489x,ÃØ\8b\ 5®h2\9a\0G\1a»ÊÕ\1eâØM>:p\93í¸¾6üåN\1cèv4²\15­¶\12Ç#Ô¥Y\r¬¿E\e\89f\83\8e\12U\9fÖRÁÕ0®\82we\0õÀÏÿ\vÀmª\17\ 3íàX åu\92\8bÇ8#»\14\v\87\a\8etâÏe\87£ÉöD®\8a\ 2\1cítØî\83£\b\8e2­!\8eUÔe\ 5ÿ/ç\89Z"\B.jÈä\83(f\11§¤\1amVÃ]\15ÀÛþ£O{í\v\1ej\81þÖÈ­\ 2\9d\´ÈÌ~ìð¸©t\12ûÈ þ\âÏ\87c\ 2\1c\939\19Óà)\84§\b\9e2xªY»\16Å®C-­Z@öæ³³R\1a\  Ú,F}óàö£\b\9cç\8a9Å(ô48ĵ×É5¼\8bxèê\83Wã:EÀiU\1d5YJϨá¼.&\8ejâ¨$\8e
+\8d\87çn\141\röBxæÁSÎÿ\ f¢Ú\15(f\13Yjç\9bC(¨\97êõÓi>'{·\81o\10g\18\7f\9eçÊïáºÝG;kç}+ñl$\16n9¸Cà5Á\19¥\85r²§xx\92ÙK\ 6<¹ð\8c¢s\8dG\15\93á\9aÎ\89¹\ f®\12x*\89j\19ê]\8fr¶ñí~"}\8enw\ eU\7fL%o\ 2ß NqÅ\1eOà*c\1c}\9cëe;WÝ&âYC\9b¯%/\8b\19×\1eP8¼fòfc_1ì)\1e\9e\14ö\94      k.\ùp\8d\87«\0®\99\81g\ 1\95ªáÓÕt¸\16\14ÔÉSO\11ñY:ï\aà\eº\8eo\10'\19ÿ\9e`ôúQ:9\0-xÛ\ 6â©w3Ó\90\97\85þQ\91\1f\12\ 1¯\ 5>;\±p%°'/\\99p\r\87k4\\135\86\89r\14¹È#{#PN.
+\1eÆiÊædgq\ 1\97dñÏÊ\bº\ 5èY\8c\19\87³¥½Ã\181@3\7f¯åz©MaL$?óÉÉ\1cr2Ã\1c¬\ 2C¤&\85X5>È¡1A.å\a%jTPªF\ 6giDð\b\r\ f\19«a!w+'t\86²C\8b\94\19\8c°:¥\857)5¼C)áO(Ùð²\92\f\17å1|!OÄwòDút\1cÎ.®÷ÝX\82m )\8f\911\97\91\ f\9bPAN\8a©O!õºÇ\81ç´\86*ßdT^\84\ 6\87r\f.eGx\94\15\91¦\8c\88\1c¥G\8eRZä\ 4y\8dS\95b\9c­dS¹<¦¥J07*Þü¨Üæ\1e¹Ì/)Ö|Q1\96ëà{ÅZ|z\12þýxÈ\ eÆÏ- \91k~\ 5ïk\18\ 5Ë\19\81æ\92§\99Ôf2µ\19KmFØÂ\95i1)Ý\1c¥Ts´¼æ8%\9b\93\95\90Ç2\ \96±\8a·\16(ÎZ(\97µL±Ö%rF5(ÚÖ.\87í¨ì¶\97e³]\ 4_\82[¼÷©\a¾}ØÃvÆ­\96I\8c\9c¼Öãm\173\ 6\96\11ßlò4\1d\9dLb\fÉÇÂ\f\8b       R\9aÝ \8fÍ¢\84(\9bâ¢bä¶%Èeó*Ö\96£\18\9cö»\14m\9f%\87£TvG\8dl\8eõ²F·\81òD¿(Sô\ 5\99\9c\7f\92Ùù/Þût\ 4þN¸Ûð³\9b±\88ëA\1d¶ \1a\9b4\9f8î§6SÑÉ\ 442\92ÚdS\9b\14w\88â\9cFÅ8¬r:\1c\8a\8e\11\9d,»3\13äÉæ\9c¨¨\98é²Æ\16Ë\12»Hf×\1a\99\15éîR\84»Wáî~\19Ü×ÀM>ãþdß{àÝÁ¸×<\r=\82ZìQ\151\95ð]!µ\992\8aY\1f\8däQ\9b,j\93LN\ñ\11r¸,²¹ì\8arÅÊêN\ 4i²Ä\r\979~\9cLñSeL\98«È\84*\19\12W*,q\8bB=\a\14ì9¡ Ï\e
+N¼\ 2¾UH¢O]pí\86wûLúÂ,ú\ 2XÆß\95|VLl÷\92£)Ôf\1c9É#'\19äÄCN\9cÞPEyL²xl2{\9c2yâeLJUDÒ0\19\92Ç(<e\8aBSf+Ä»PA^\f\9b\17Óâå\16ð2ôz\19\97Á·$õßÚÏþ;àÝ\8a%k\9a\8då\0K\19=+îÅ\1eNǦ\92\93\ 2â\1cG,¹h6\95³\13GN\1cÙ¡²¤\e\15\99\ fÛu\ 2\9bu}Æ\ 1ü¡¥-ôâm\v\94r\96«\1c-h\v\14ÊQ`\1c­r\96û*\931n\99 \ 2­"Ê\98¢TT\88\8aW\01Ùâ²h\98\13\88Î\1dÆ\19¯ÍÛ¹Í-s\9bn1N·¹M\17»OÛ\97Ì\98¥ù¦íûþÿ¿ïó{\9eïsEúàüH\e\\14\9d\87\14\90áÑi(\91\rõÒP\87\96,\ 2;V\89e©Ä\fYb\0/9\v\9e\rC?\8f\16ü\ap6YMwÌ\95\97Ð8Gmª7ï;bºïkØRÎ'ÃØÑ\9f~zðI·Ñ©\91Y\96\19i¥¹Ñi¤\ 2?Ò¾;RÁ\e)©K\19ZÚf´\97ËÌ°efé2ݧÌ\12Qj\19(5O\97¾îY6\8cl\8d[ð_\8f\ 2õ±A^Â\1a¯-\9e//}>\8d-U3å¤Ui0\9fôv½|:É®L\8dô1v\99
+Í¥B\11+×tÊ\15µr\82)\97Ø\15D]á¥\8a\b\16Ù
+ݸü~0)\ü*°á¢Ö¸É½¯Ã»{\89\9cXfm\85Õ°Èÿ³Ù2É÷\15V¤á|ÒßµÈ=růËÄ\94èT£±MÐTÆÛ©ª\15±jE¤Z\81­\1e\ 1\ 2WíÁj\17©^\ 5v\9bq\96¹q\16\98*ËBÕË\84Î\86KZã[µo¹5Öc[­¥_\83U°`¥8,õ\8aïGñÑ ¶ôbK\82^2Ù\93\13±hhÓ5\93i|1\95/j\15öZ\ 5­V<ji¢V\0k½P\8b V\17\9ebi\9dl\91\9alZ\9bôsBcCMk\1cÀÕÌU;.\97\13¤³n½\9cX§G¬õØj>XA>üÒ×\9a\96Ï_Ùìé,N\9a7Ѧ\12\r_\Ê\17õ\9a[=_Ôi¼u\9a`\9dxÔÑD\9d@Öyyö\ 6°_Í2%Í´¤ÍxÁ\1d>r\87ÖØ\8f{\8fÔ¹r\93\9c`jãf>Øè+¶T±e$9\r`c\ föäðU:\9b\fI\f\ 5~\8a%\9d\89\87\1d\8bÙ±\88/\1aè¢\81/\1a\14\93\ 6ñh\10¼\85\f_è°\ 5òs\81)q¾©q\9e\85\87îÑ\1a×â¾Úêµý\e´\0K·3[èj¶\92\v\9b\ 6ù¾\90M¹ìL_ß>Ôü\ fì7\\ 1;Ö²c­\984²£Q\93kTT×((k\88x\8d¤[í\12«w
+ôá\88\95¦æ\15¦Èå\1f¸Kk4\91ëU»ø@ú®ò{.ÔJ£1Pâ\95¢\1d\99\föÅ\97qE\12ÛÚ`\0ÜÆ\8e­ü±U®nÕ\¶ÒÅ\16ɼE±ÙÌi\9b]lÓÁ\88\8d'$à\93\1aÓ{.þyìÙË\a\86ǵ°ð\1a1\80Ja\e\ e\9d\80\f\88\vð¹!»ã÷\85Ï\9a¿\b:mfG3m4\8bI3]4óE3\ 15q^\93\17÷\1e'\80Ç$ã;\82ðiì¸\8e[Éuñ\rär@
+1³T\1a÷\83<ȸѹm¸  \ eµ\ füa\91éÀ-ÿ\aíß\89MKvÇ\80\98´(j-|ÑBL\879÷ð\11Ï~×àô¢3ÿ\16\ep.ÇQ\7f3\rx\7fÔ­ê\80GònÃ߶dÜ\ 1ÇàN¸;¹|Ü\9bü}áï6Ü\a÷'Ѷ$\9c\903'ÙqRý<%&§4ãS|qJ~\9cDzRÍ>ù\94çÞ\8b\95x/Ã9\19×ÅÒf \9e|®Ê¸'y®Òj=    \vk\18Íâٱ\f]øý0¸\92Õ!,£\1d\8bÚ£p\ 6\86\9c¥Ó³´qÎ0rNÝ<Ç\17ç\88ïüQððÙ\97c\9e;ÖÞ¥\ e¸Ë`|\ 5øº<\98\ø¾\93äø^ò\e>´\9bö¥Pë³ÆF<\ 1?\ 4W\8a\1fÃO£cq|\16\94\80x\99\1d¯ª£¯iøoÐç\9bräM\89ö\ 6_¼a«{ý        \93u|     ©\90\ 3= Ø&R\1aÿ\8aKâïæå¿\9a\97Û6¤¿\98ÛßW$þdvÿ\83}ê÷öºßÙ*ß1?ÿ\9aX߶¥½i¿{\85#_â¬\17\18ú\ü\96Y\9fÅ3Nmc}\ 4¾\r§àË6ü\a>±Ó|d\86ÿÀüþ¾)ü]\93ú;¦ø_\9aì_³Ãü\82\1d/±ã\ 5\85ê9ûÔ³
+Å3¶±§%êOl»OI\9c' ø<!=\8eå1\819ãéGãc\93½\9d&É}/Üù\ 5\e>\ 5\953d,\8bÓmB¹ñ²=âE;ÕÏb\ 4\17W8{¼;Ô
+Ã,g_æì\85Î^êìUÎþ*Iltþ\15\9b\8f\87\ f\12î       ¾xÀÛ÷Å\1fý×\1aÇá(´À¡¤\r\9f\7f\ 5\87³\93\10gáÊÃÓ\eÇ ç\97:{¬³'Äiv\9c\12\97\13\al`÷ÛÄîµé\1egÇÝvÌ;Åå\98Ýêö8hûCº\9e\8c\9bãûÒû\15Qú§Oõ)Ø\aÍ s\89'éÀÓI©=Ò.ù\f\¹xºãèëü¡Î\1eÅþ±Î\1eïì)îñ\15ç×9\7f\9eó\17)#+\9c¿Öù\eyáJ\1c×ø¹9\9a¼½Û\89»xs'5íÀÛ\86í°\rTªx>)í3ÉtSI½\95\82/\vWBé)t~ÿø¦-í\ 6vì·Ñí£\8fkè´É~¹ÇÆ»\9bFvÑÈNZÝÁ\1fÛí\99ÛâªØâ\8dM¬ÞÀsëEp]ü\86z>óDk;\1aáùd\8aµ¥ßédI8\9a,y\aùb¿\1ci\8e|\1cEN\1càü\12­b\94¨WÄVûåf{î¦\98\8ac\96Ír\8e\80c\ 5\935Û(¥É\7f\87¨÷\9eX\82e1\15/âý\ 6Ü\17 sÐSG      j+\83G\92¥Yùv¿\14\9c\99øºáê\8e£7\8eb\1c%8ÊpTÈ\8a*J¨Á3\15ÏL<sð,röêXÀ²y<3\87/.¥\90:j\9aM\9b³¨o&î\v8c$|(KÙUV\8f\18\89\ e¦u´#í³½%n\884\9cÙø\12xzÈ\82Þ8\ 6â(\91\15e\14Y\8e§\12O\8dL\99\1aõ\18fûd\96'gðöt¾\98*jmê\99L\9b\13Åc¢*R£êÔàoÃà å]\8b;
+7i¹û\94´]ìÙÆ\96¶q¡Q\8e,\8b.n\96\83/\ fWO<}ð\fÄS\82§\942Ëc\1a;¦:q\8a¿&yb"\v'\88D5}V\89d%Õ\8e\95=c(¾BöU¨\ 4åøÛð\90\96rÜøÕ¢¤\1f\80½þßÎ\9e\rF³5ü²Të\99\1f\9dù2\13g®{åËÌ\9eîÔ\aÏ@¬%²¤\fW9®*\\93pÍÀ5×'Ëâ"Ñ\e-¢e\14]\1awÅHÍe\84ì\1f\1e\7f\86Ï¡5NØ\1f\8f\15k¡Zì>¸JYßÂ\96ËÙ²\9c_\16h9õ\19æ
+uk\8a<©¡\8dqì¨\94+cåì\18v\94Ç0\95´\f×\18j\1d\8fk*®zç/jWÎPY2\84Â\ 6ÑÄ@\15º8~\ 4ïRø¿¡5î3~Þ¦µ\1e\1cnÌ0\ 2^i\8fÛè³5Æ\8f%Fõ9F\80\19|2\99fÆ¥eàÍÆ\99ÀW\80µ\17®~î5\88\15Ãñ\8dÆU\19\83ùb\10µ\15\0Úì'\83úRYo9Z¤\19öRm\vU\85ÂNÿ\88Â\14u\13o\8bÝí\80Öº\a¶û{={V\r1\8eòI=\9fL3¦N \9b±9)1ªk×\18\91\96\13\89\18Ò© \ 6¥\14ÅÀ\94þQ\9c2$ú§²(µ"út\1e\1f½Ó¦GQÚÜ(L_\19=Ó7E÷\8cæ(È8\12ù\19§#/ã|$2Þ\8eD\97\8f#ÑUÏÀy\8bÕl¿uàjãÎ6¿×\19EWØmçóÉlq\9ab}\1a'6åt2"·s\fÎî\1a\ 3ºæD¿\8cDôÉè\11E]zG¯.ÅQØuXôì::zdVEAfmäg]\16yYË#\91µ1r³\9bàHäd\9f\8eì\9có\91\95ó\16|äïÖ8\86ÿÐ\18\94\ f\95\1d#èåþ_æóyì\9b)N\93è¤RlF\8bÍ0±)N¤EQnfôÈÎ\8dîÙyQ\90Ý3ò³ûF^ÎàHä\94\9c±\91\9b;9rrë"»ÛÒÈêöõÈLì\89.\89Ã\91\918\19é\89Ç#-ñ*|èïÖ¸\1dß\8dVÃk\8dZ;'\18}ý^k\9f\969\17[C\8c¤\13Åë\12kä(±)\11\9bþ=;EaAzä%²påFn·\82ÈI\14Aqü\97ý2\81®ñÚâø¹Id"\91¸\91AB\ 6\92(\89\ 47Q\³ \84\18\12!        b\8a ©)D\101\ 4\89éQ5\vmQã«\9aÕؾ\9a§\98ªUZ´EÍ\1eJ\11I\7f\ 6Ïûn¼÷Ö[Ëëzß^k¯{\93½ï9{ÿÏ\7f\9f³w)\87Ê¢¤c\raë¨\17ÖeZ\b«2ÑÂRÛ[Xh\87      sí\14¡q\92\8d\12ý¬ö$z\a}&f\90ûDö\1eU\9fY\8b\99\1f\9aÀ\88\16Ã\88Ô\1a[SÎFÏÙè8\9b\0\85¯\15*\bá\ÎL8\94µ\11¥´öÂV[FØ8¹\bk'OaUÖOX\96\r\12\16Îu\84¹s3¡qahua\b\97u¥1v¥Ùteæu9\812_¸<\13ÓÉ;\93}G2\ e\r¦ÝKB»ñ½#ÿ\8b ¶&`T\97q©&\98\ 4\80I%ÆYwøªõ4\13vî6ÂÆÍNXº9
+\v7gaæV^hÊa,\a¹Ý\ 1Ó½)C"\83¡G\ 2\8dú`C³îÁ\8bäÁÌëA\97àN\fîyb*ù\8fcß4Zï\81̲IhW¾GóóV\r\89\ 1\12gMb©\ 2g½XÞ\858\1c|ÍDI\1f\eQÂËNh<)\1aO\8aÇ\13òz\ 1\94\17\ 6DïF(½´73\96Ï@t\ 2ßi\96½iN½i6½\88Á3OLfÿ1ì;¼\15ïC\ 4uIËÙ\85ïQáÌ|ÄÒ\18{\1db      \ 2\13_âð\80?Zøj\17`&¬Þ±\16\1a\7f.v?.\10_\8aÆ\8f\v×\ f\ 2û\11¤\1f\8eþ\80éÏ\82þñ(3\96ÿ8\94\97Ñ\8f\97\17Û\17>Tz.²Ø?\83½\87µ¥.\81­7ãi<\9f\1d\b¿%ÿoD,!`R\95\19\97\89\ 3)ÚÖÐ\bó`.Р.¯jÄ\10È¥\1aH\ 1\aB\96@H\1c\b\91\ 2\ 11°%Ú\19í\8f\8eá@\19T\ 2è\14ª\1e\ 1Xb¨\92/&\10f:û\ e\8d¦.c¨K4®#1ðwsb©\8b=\988|ÁÄ\ 3L´¤fÇÒ\96\9c\ f\17§\10µxxC¹ÐCxìt\9c\87\8eóÐÁ       \9d$2Nºæ(\8bê\98mt\f\865\19&j0\90T?\8c\12Cp\81\18\ fmG2\8e\ eaôè×E\88\1eh\1c\1a\19Ë9\10K(ñU\ 1\13/0q&\16{\96´\ 6\17\9e\ 4@âAk\0\16õÁ¢\1e\ 3\v=\97\88\9eóÐà=\87§ÇYÏ&zfͺ\f·u\18ÞêЭÕ>H\ eð¡V\81\18Ë^iPfPwÞ\89\9eÄÐ\8bº¤\94Âù\9f\9e¸\82\88¯\12\98¸±\8c\ 3¸Ø\12\8f\ 6lxH9,4\9cÙ²\855 Á\8bf`Ñ\f,Âx\bÃ8\8f08\11Æ!\86qÐMÙ )]I\13\86ÉÆ\fl\8d\18\84\1aÞ"\87\ 21\1aÓ0B\1c\0TIýà##P$\8dCcbÑa«Ü\8d\92\ 2\972ÄS\92c5#&\9a\18\83F¡Ä&Ú\13G;Τ-gÒ\96\1a\89\ 4\8bHê#\92ó\88\84D\91\90¼\r\8b´¡>[3ØFÐ5¶b(\v¿Aü\ 5b${¦¼\a\1fi\9az¡Ñз9\7f×&\9e\0l^}\84p"F;b2\a\1f!µ{asÃE\82\82\17­
+D&\8e\88#\8e8j$\ e,byüb!p,dêLð\9d\13õ\19Ã]Ù\91!1\9a\89¢C¾H£l\87p\85õ\1dÊÏø\8c\18Âñ¢Á\84\q\10\1c .»÷\85°àçâU%N\9aLH\84ö-Rø\91dch\80\92Ê
\a^ô¡\90û@äD\88\95\bÀ½3Hv\ 1ägxíq\99|òDêp\96\84*Ýжhc´æHê\0uå»}\1aû§\15\ 6\1dñ\8a\ e7jê«Ê\8c\9b
+?R\89#\953Iõ3<\86àôP\80\e\8aSÊ,\12§>\a\9f\86\88\8fÅ \1aØ\9e\84\16\86q\85\84\8e\87\ 3\99\·¨=ß-ø\14R'\14\86¦;Ûø9IA³\8a\94\86\eÙ\9cI6\97|\16XdAî,@\9cÄ\ 2\13W°æ\ 1Ö¾+\12Y?\86µ[ð»Ú\93©C\ 6\v÷iB\94F-¦\e\9bý\99(¡Ó\8a        \86-A[(Ä\1cã÷¹¯üo\9eq@\0jÆ     \86\15âÈ¡^s8\93\1cj$\a,\16A¨E$½h\11ú\ 5~?\89XhÚ\8a½ôì\13È>\15ØÇ\81õ-æ\19×Â\95aÏ0|É!äStÅ+\9fR)5ÚDÁ@*\18z\ 5m«ah\92CãFø±\11nl¢V7q¹m\ 6\8bÍ\90p\13\9bnÂyÓQÑ\9a\ 1{\ 6±\9f\17O\9a#Ok   ¹ßRã>«\8cëÊ5yî\18]\85\80Nb\8bñs\9b0\f©;P¨^84~\85îE\81\9a±J\88\1dÇi<rág.\8fà   °8Áá\9f\13r\81\7f\14\8d¹E Kk\eÛ\92vö¥\1dËh\9d\9c]\˹{\94÷ôòö©äëWù\9d*U\ 3«\ 5\ 5ר©\v­õníºúzõ\e6jÜ4¬Yóð\96­Z·\89lÛ¾CTtL§Îqñ]º&tïѳwb\9f¾ýú¿÷þ\80\81\83\86¤\fM\1d\9e6bTúè1cÇ\8d\9f0qRÖä)S§ÿeÆÌY\1fÎ\9e3oþ\82E9\8b\97|üÉÒe\9f®X¹zÍÚ¿®û|ýÆM\9b·lûbû\8e]»÷|õ·¯÷î?pðÐ\91£ÇrO\9c<uæ\9b³ß\9eûþü\ f?^¼ôÓÏ¿\½öëõ\9b·nß¹÷÷û\ f\7f{ôøÉÓgyù\ 5ÿª¨ùÿ\9fç¯1\93\19\94K\91³\83Lº,Y»É´+ȼ+\92¸¿Ì<@¦^\9dÜCdòudö\rH¿\89Ì¿\ 5\0DH\ 4ÚI\b:\82\ 4¡\9b\170$I\1c\92%\10\83Ab\98\84b$XdH02%\1aÙÀ1Mâñ\81\ 4d.\88,\94\90|$1Y\ e(«$*\9f\ 1Ë\ 6\89ËV      ÌN\90ùRB³Obs\18p\8eKtNKx¾\ 3\9f\v\12 Ë tEBtCbt\17\90\1eH\94~\970=Ï/HNL©.ÏÝ\Ã}©y\9d\f
+\7f\17á¥\0\98)ÄÞ.doF¬XÀ^ÃKh4ffææ\16``i%Q\0\86\92¥JÙ\81Di\a\aGÀÐ:\ 1\87³\v\80\14"\ 2$`\ 2\ 2,\12\97B`\f\z\r\99B`À%¢µ,%*)6¾kB\8f^\89\92\a\fJ\19\966jôØñ\13³§L\9fñÁì¹ó\17æ,ùxérÊEVË\86\8d¤X\98ák       \1a8QH
+\99$Y\92&y\92(\99\92ê\95«$ûëuÒ½y\8b\84ïܽ{\ f\92Ü\7fðà!y?züø÷ß\9f\90û³¼¼çÏóÕüUQE\15UTQE\15UTQE\15UTQåÏ!\ fß`¿yò\r\ e\8f¯çÿ·bQE\15Uþ§äò±o\8bµÿ°nÎÖb¯\90}S\93V\+Îáè¢ìeÅ:<=¾cÿoÅ\ 6¡\8a*ª¼\15¹°oW±µ¹gÖ\88        û\8a±\9f\9f\11W¯÷ÊG&íù;\87êDÔÂ\9b&\1dN\7f8:< Í\82[¦ìß\9d9¼qtïäåO\8a   âá¾ÏÖ\1d*Æ®\8a*ªüGrïì~\93¥\89\Ý13¥ç\9aǦÌ\8fö.\18\12æ§K?jÊaó\98è`[á\96°Á\84=7%¤¤\10¶ý
+\13\ est¢P"M8<ê[^\b\9bR\966í×+;\1c©k¯\r\89\88k\1dÑõke\87U  ¡       \13\97lY»jÛ9e\87Ks§í¾b"<\83Ü.îòRE\95?­Ü<wxç\ 1ÓæÜ\ 5c\93c\9beÝ0eß;ª¾\9f\83\10Q\9f\9b°_\1a¯/¬îj\93n+;¬íàPèà\92|VÑþlLuÃý`Ó]ù\ e:\15kfp\10]\94\1dV\86\18í"þ´¢Cº]\91C\94b\fwÒÃ\8a\1c\9a\9eQrÈ[Ý+\88 ,|j\85w:®¸Åõeý\eUnÐ3cö\8aíß+:\14\14|³aí\86£¿<5aUE\95·"WvÌMíqФùüâ>¡¶Âlª)ûÁ\8c\ 6%dátÍU¶\9f\e[ÛPYúÕÊ\ e\8b#\8c¥Wq\86¢ýÂ\80rF\a\87tÅGz]\8b¢â\15\ 3î(9dj_8ôºª`¿Õî\85]Äü¨à°­ìK\87\16J7H\8aÓK\87wsÿÙþä\93Ø\971TT\1aÖ..\8c\ f(r°Û®\94ÅÝõéѵ}\1c­4f\8e>¦z±\8b{\96Ï\9f·à£µ»LÝAª¨òïÊÏ»sÆ\8czfÊz\7fkfL°½(¿Ö\84ýÔä\b\f~ h?\9b\11j¤}«CJö§3ë\17ÕEÐ\1a%\87/c_TV¹ÙJ\ eÓ*½p°ÎT°_ëú²xEê\1fì×y\Íù\1a\að_\92^HÙÚ¨;Wi\88\12ÙÉ\16Å\15\rY\a¡A\9b"ÝÒ­[ö\90\88l£!¤I²v\8då\96\8aRª9­$ÊV¦d2öåþnqÕy>ÏÏ=/÷\8f\99\97ë<\7föy÷;ßsÎóý\9eç+\ 1N\98È\ 1w     \10$\97\vÓ\9f°ümWy0¦\92\81\18ù\°*c »\86<0g×\9c\88uN\9dä@§Bö\84\87É!\93\1a\88É\r\89·ñ¯+\91\8b\1dG[Y\9a\9buï?Rê\1c|÷^î\97\14Èrr¯ÝýH®¬/¯\1eå\9d\91\9eíëªü\9f\eÝí,´\17~$¾\eåÒKý]×Kn\7f±`ÅÀÿôlëï¥ò\87Á=ê»Zò5ö[7ì\8bq|g\89Unr\e§¯Ä"~²\90\ 3F§8ð\97ß\9b-cYþ¸\17ÙÞ\11\fÄ\91\à³\96-\ 5K1¿EsÁ\aÁ÷\0Ø)\96\ 5`\ e[\83©\91\8a<pb !zÙ\94¾ºõÀ\95\81Úz\95{tëê@ßE^Þ~Ë·J\ 1e}yU\9c\18¹ÂÍ-÷#iÚ\96y\83ôkûÉp·ô?\87\8dù0Z/\90Ì\ 3ëçjÁ\86ÿ,\8abh\17¹Ý}\82ç\17FÈu½ªÄ\19\14DöÅR\96\97÷\91Ï%\ 6\88Hºõ¦2\0Û\7fä\vÈ\1fÀæíý\0Àv\0\0\92\0èe\ 1¨\ 4 u\ 1\17   Y\ 2\82N\0N"ð¢ \ 5{Bé®õ^\93¬{~ݾ­V\vÍÖí¾>Ë>©ºzy·H\96\95\99\91\99]PúF\12(볫Êܤ;\1fËdqÁóF\99µV    \96Lk\ e-²ÒzßPß\94JäùK{×wÜWÇy~Ç×P®'C8Ød,ß´.ü\ 5\86\93®\1eõ\fÁ:ÚöÝJ\10ô£@7\ròdØz\8dqFÙ\ 5@\88\ 1\90\88`\v\80\e\bVà"\11°\11¤\r\06\1fX\ 3\98\8d \0\80#\82\9f\ 1ð\19¥#\ 5Î\f¤\1f\8e\b   Z¼ÈÃÍÅÙe¾W\0\1fÅ\94õùÕíÔ\83áþN~ÒaÉ~¿qf\1auÝÐ#E".Ýlßй\ey.ó\92?\1f\8aÕ\vµä;®ïm\ 4Û\rHK¶=\87`(tu4äG!g\87Ôn\ 4Þ\0ð×_\98\ 5à:\82±\0^!\18\88ïB\13@\97\97\0z\ 2h\8fCÌL\0Z8Äl\ 4Ð$\a@\ e®ò
+®²+\0<jÅe\02\10<×QQSS}?\12ª4i¡Ç\80ø¦²¬(;ójv\8e,¯ðÆí_X®¬?¢j®_úXr)z\95ëXK=Aû\90T\9c\10h«÷¡\e\16ñ¸0ÐB~[°)æÖܦòý¤Á¦b\1fUÚq\e OÕ\86\96Ä\vF\ 4\1d\80S\bº¿\85÷\80@¿\9c\82g\bÔð6\87Û_8\ fÀ\ 2Á1\0\ e\bð>è\8f \f@\f\82e\0\8a\10°!¦\ f\0O\ 4\81\0Ü\10\14¶ \80\8dAx\râC\8c8ÎÊÖ~â·\8eNs]=¼\16/\91\98I\95õûÖ£ü3Ñ¡\7f\9d¶M*{q6lî°\ ejï¾K\a~!}\1e9Y¯áËÖÅm!ÞóÐ!í\80Û_\9c\ 3\1d7\13òHlêÞ°\88(\ 4­®Qp\ 5\81p\86\82j\ 6¢`\11\1a\bÖ\ 10G°\18ÀX\ 4s\ 1,Dà\0`+\82¡\0Ø\18Ô\1dÀ/x\8a\19\ 1\10G\0ÐF°\1c@ó§\0Ò\9aSШ
+\1f\81sÐ=\ 4ét¢\14®#\10#U\1aRuMÝT\ 6Äü\84¤ó\97³ò\8bËî?|ò\9aÇÊúôzq+[:¨º\14³ÖsâÀ\ eê\82åM\9e\16nþÖ´áÛÚËò\10ú\9bä\82¹3´\8bå3\9ao\83\P\85¡7\16\ 1.\82\8d\aB ¬\81\ 1<¤L\10\f\a0
+\81\19\0w\ 4z\0B\11¨ýFÁ1¶Ê2
\19È\86×è\88 \19ÀD\ 4G\15­r\ f\80\f<\836\ 3\10§\0X\8dà`3
\11\88\9e\1483ð|\12\ 16\fÔ~!Æ]{\ f\19=i¶»ï\925á»$\80²>¡*²OE®t³O\90\88ª\8e¯\9c1À°Ñûoâï,Nõ4\95ÿªðGO\Ù\9e~ÙêpcÝ\8c\1d)ì àG\ 6à\ 6RÂÀ0X\ 3»\1d\18\ 2èÏ\1eQAÁl\ 6²(\bfà4\ 5\a\18\88¦ \83\81M\14<ÒA\10\ 4oc0\ 2\ f\0n\b¦\ 1`\97¹¿\0\90á"ú\ 3\10§\ 20E°\ f\80>\82§\93)h\8c@<\ 3×¹\17L\1c"]ÉNÒÚJ\1fY\17¨·ùs·Á\ e®«\1er ,¨'ùé\92\7f\7f%\8bßìçhݹv
+\1fÍÓÔ \eÝ\86/¢U\11Ä)ã \1döÐ|\1f\9bíáJËæn¡\ f\ 5×\19P\87¡W\9b\89\14
+Øx ì£À\97\81\95\14°k\92àFÁE\ 6à\82\85`0|\94=\11t\ 5\80[\93\r1x}\10Ô\0\1c\ 4\bÁc\103\10Ü\ 2°\aA&\80\8aÑ\0à¨\15ŽpJñù  \11\ 1~\f\88\ 1ò7%µ1\1c\88û¦¸ú,Û°ëPRN¹Dª,^\ fïHýU\16\1d0u\80©±\81\8ef\13>\90\8a\87\1dèÏ7ì\9b»Ã±]zQàÏZV «¸ÊÁqú\886\f\ 4\r\ 3\8e\14¬d`\0\ 5Ç\190  X\15A#ø º°G¼V´Jè[\1f\ 6ò(ØÉÀ9
+RÔ\11\1c¡àWvHý\0\ 5\ 1^0¢\11x\ 3¸3\ 2À\f\0bx\13
+p`\14+gQ\80\ 3£(^±£\82\ 11£ö¦¤¡×±Ç\10ûÙ>¡±\979¨½Ú\96ã騬ÿ¡*ó®^¾\90\9cxú§ø#q\ab ,Y2aHwcýVMëOüb\92/f=-Ä\12\90È\81/}   Öô\82-\ 5ö\f´£`=\7f\8d·\ 4\9cç\80¾\8d\1a}\ 6\92ékà®\10\84\1f)\98ÏÀ\ 6
\19ð§à4\ 3Î\14Üì\80`\ 2\ 5"þ¶\vC\0ø!À)çp3\0:\0Êmð\11\0Äu\8a@ÁX\0oQÄv£ \1f\81¸£þÀn¢gn3»\94\ 1ñÀ\1c\9få\ew\1d:sõö+\1e*ë÷ªò\8cÓq\91ÛÂBV-\vü\9b\8f\97\87ë¼M$Nr\1fe®O{®\a}\0v\93 ¨R`ÍÅ\r\ 2Â8 3J\16\a°yM\19\98OÁ4\ 6ì)XÍ\0\8cZG\19ø\13\ 5\b\9aQðj\10{\ 4\ 5â<E\80\7fT\0\92ØIù\88\82\1av\ã¥5\14ÁY\0\998\95F\ 1\10Ãa\15\ 1\b\1eû\90\9ej5\v\81XáÓæ+³~6\13¾ó\ eÞyBö\94åµUXñDêÏÊúCêõóßjª«*+«jè߯\1d\8fXãï9×qòx;ÛaVý,Í;\e§\10`gÒ\\80ÚLÀZÖôðË[ÈÁ º\b6\98\vz\14xðGP\10©\b¤k0ð\8c\80\9aÞ\fÜ¢\8f\98Î@\ 6\ 5+\188MA\\13\ 4Ñ\14äZ \80\93T\9c\89À\ fÀ\16\9c\bg\ 2¸\8açÃP\0â\9a\96\14\18 (ÂU \10Ͼ?Ç4\rÌ\ 6;¸¯\8eIc@¼\10¸þ\87ØS©\ 5\15l|QÖgVÕe\85Ùé\17\93\13OýãH\ìþý±GI\9a¼Úsú\98¡}-:\e\19è´lÞ¸®-Ú\12P¨Æö\r4T/\ eèæ\95¸HÉ\b\88ç\80\ e1e\1d\19ØN\171\9e\81@
\19\80\eÈ^\ 6ÆSpÙ\18\81\15|Òv\b:Q ú h        Z\a\ 5\80¢1
+\80¸VK\ 1È\98 \0\881ý>DM\r{ÙÏ_Ï\80\18Ñ\7føøY\v\82Âö\9e̸ÇÓºª|)ýweý\9fUefÂá¨\88ðÐÕËë.Aó]\9d\9d\14ãdci¬§I~\w\13°\84í<Á\97\80\8b\1c8\10ðº/\ 3\96t\95î\fèP°\9d¿\ 6\ 5gÛ+\0÷ùe\r>*7E`S#\ 5 Á\f\ 1\8cñ\153\10\\83G\84ë\ 1H\ 2p\ 5Ï\87H\0â\8en\raKS[ç\14\ 4ÕK\r5Úuîk;Åmɶc\99Õ\18×VùÞ\83      iE\ fÞHDÊúòêíÓ_+ïß¾U\\94'û9GVXJ¬Ýë\ 2\17¹9M\9f<~̨á\83\aô±´èÖ\83\0\99I+Õÿ¾qøÖ\ 4\10¤\bij\8b\16L9%ý\19¸A\1fñ\1d\ 3©\14\840p\8c\82cF\b"((\18\85`\ 5\ 5¢7\ 27\0Q\9d\ 1Ø\ 3ÈÅ#¦'\0q»Üù h[:à-H,õn#\b*Z_YXOõ
+=\90V\85yí!´pÁ\92°Ýñ\17\8b\1eñLYÊú´zY*K;\97x2þð\81\98}{"wîü7ûe\1fÔr\1cÇñ\84"Iw\9e:\ e\17G\94S\1cy¼\\9aV[´<¬6'RÜÜÕ¹\1e\16n\18%Ü:溬'5Ém¥¤ÖDtbè¸Z·¦ò\18ºL\·&$
\96ܾ\9fï~vç\ f\8f¿×\9f{¿¶}\7fß»Ïç÷ù\9c<%E\85\84\b&Ýg\99§\87\9bËÔIN£\1d\86\e\16¡\ 6DHÁJÓê\1c"ÔNÆ\84dDè]\83    Qè!öc\ 2Ø@
\11d    *¨°>7\r\15º8P°\aW%\1c\ 3\r \ò² h¢`3\ 6\82^l:®9º3â Ð\1cc<\85ÍxWo67µü!ÌõúÊ\10ʺ\bî¡Ìó·[ñÐ\88ZÙÒI\10\91\90ü4\9fz{z?c\9fvTäg\8b\84\82C    |Þ®ø¸\98Xî.þqDh\ f\â1ÓyâXÇ\11\ 3C>¨M|;\0\85\93egA¸\8d\8f ¨ð:Ü\82 \178X\10Jæ[\10\1a7X\10ôI\13Ð|0|ÿ\97ú\9b¤N\8b7\1e\80¿ áõw[{çEkv\bËà\8acàJȬÅþìÈýi%J-\9eöQ\96#¿u¯Ý|FBòËéѵµ<~ÐÔ V©Tõw\1f<kïFóK\82};£#9\11\eX!ÁÁ¬Ð­Ñ¨P5wÊ8G»¡Ä¥§ebåÿ\125\12\86\16\15
+Ý¡P\86
+ê`(d¡B÷\1eG $\81\8b\10\89\87º¥\ 2¡&Ìú{j?\9b\11\9fS\ f\84®£\1eÆpä´¥Áñ\19W5z\8c\eáN®K\ 3\1d\95V·ái\1fù|Qþ\15\15Ah\ 4\7f\v\90\90üÁ4×ݪª¬(\97\97\95Êd\17*®Ýi\84³sZdD(k}P`\0Í\8fêëGg°¶å¢\82t\86\83­5R\9dLT¨cÀò\a+Ê»Ý#\80à\f\ e!\9e\a\ 4\a Ü\f1M\87Íe\1f\ 4Â+þ\94\81ÔÆ\85\1e\9d©x\ 5oBj\9c0¬Ç»Ó8\82âÆOøUÝåN\9e±\88\16Ê\15\16Öèð´\8fâ\98¤ô"Å£÷æÓ>\9e\12|\93\84ä_¥JvV\92\97{J,ÎÍ\93\14ɯ)\9bál/`¯\r¤ûùR|Vx¯ð¡®fmß\v\84\9c96 þ\81p\ 3L1c½\81ÐÆ3Y0\86Ïß\9c,\87§\14/ÿ\96\ e\99N\8bÎPà[@õ¶Q\86t´+eK¢TÙeæ9Û\8f-pó
\1cÈ®|Bp\13Wãù©\ 5×\1f\7f$\88\r¨ï¿%\ eIHþOÞ¿y­Óé:ß~0?_\7f(\11\89D¢ô,ñ\99¢rE}K\a\10¾\1ccШ+)\14ÊJ_*=\88ÍI,\80?!ñ\1e\1el=Ã\85\97[ P½Õ®¿=¸\ 4Ä\9e¼ [\98\ 1Í\11÷þö\90 ©}gö\98\85\fOZ\18O$oê!xLõá=é¥5ØdbBC\9dö\a)              ÉO¡Õ´¶>\7fñRÛIðrþ\\9a\9a\92r"#;¯@V©2[\83Ùk©þ«\82\98\9bc\ 5ç\9bÌl\ f\8ci5a\ 1#*¹XÝmþ?\94;¼6ñ2.Þ#\9c\ f\89\12\ 5Ö\99Li­Ã\a\17\92¿\ 6«ßÌ\1fðü_\ 5\18\0\818L+\r
+endstream\rendobj\r9 0 obj\r<</LastModified(D:20110801203456+02'00')/Private 18 0 R>>\rendobj\r18 0 obj\r<</AIMetaData 19 0 R/AIPrivateData1 20 0 R/AIPrivateData10 21 0 R/AIPrivateData11 22 0 R/AIPrivateData2 23 0 R/AIPrivateData3 24 0 R/AIPrivateData4 25 0 R/AIPrivateData5 26 0 R/AIPrivateData6 27 0 R/AIPrivateData7 28 0 R/AIPrivateData8 29 0 R/AIPrivateData9 30 0 R/ContainerVersion 11/CreatorVersion 15/NumBlock 11/RoundtripStreamType 1/RoundtripVersion 15>>\rendobj\r19 0 obj\r<</Length 1011>>stream\r
+%!PS-Adobe-3.0 \r
+%%Creator: Adobe Illustrator(R) 15.0\r
+%%AI8_CreatorVersion: 15.1.0\r
+%%For: (Ben) ()\r
+%%Title: (Untitled-1)\r
+%%CreationDate: 8/1/2011 8:34 PM\r
+%%Canvassize: 16383\r
+%%BoundingBox: 82 -553 493 -229\r
+%%HiResBoundingBox: 82.7622 -552.2969 492.2744 -229.4507\r
+%%DocumentProcessColors: Cyan Magenta Yellow Black\r
+%AI5_FileFormat 11.0\r
+%AI12_BuildNumber: 39\r
+%AI3_ColorUsage: Color\r
+%AI7_ImageSettings: 0\r
+%%CMYKProcessColor: 1 1 1 1 ([Registration])\r
+%AI3_Cropmarks: 0 -841.8896 595.2803 0\r
+%AI3_TemplateBox: 298.5 -421.5 298.5 -421.5\r
+%AI3_TileBox: 0.040039 -841.9355 595.0596 -0.075195\r
+%AI3_DocumentPreview: None\r
+%AI5_ArtSize: 14400 14400\r
+%AI5_RulerUnits: 1\r
+%AI9_ColorModel: 2\r
+%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r
+%AI5_TargetResolution: 800\r
+%AI5_NumLayers: 1\r
+%AI9_OpenToView: -687 184 0.5 1252 619 18 0 0 271 129 0 0 0 1 1 0 1 1 0 1\r
+%AI5_OpenViewLayers: 7\r
+%%PageOrigin:-8 -817\r
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9\r
+%AI9_Flatten: 1\r
+%AI12_CMSettings: 00.MS\r
+%%EndComments\r
+\r
+endstream\rendobj\r20 0 obj\r<</Length 15213>>stream\r
+%%BoundingBox: 82 -553 493 -229\r
+%%HiResBoundingBox: 82.7622 -552.2969 492.2744 -229.4507\r
+%AI7_Thumbnail: 128 104 8\r
+%%BeginData: 15054 Hex Bytes\r
+%0000330000660000990000CC0033000033330033660033990033CC0033FF\r
+%0066000066330066660066990066CC0066FF009900009933009966009999\r
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66\r
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333\r
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF\r
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99\r
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033\r
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF\r
+%6666006666336666666666996666CC6666FF669900669933669966669999\r
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33\r
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF\r
+%9933009933339933669933999933CC9933FF996600996633996666996699\r
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33\r
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF\r
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399\r
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933\r
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF\r
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC\r
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699\r
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33\r
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100\r
+%000011111111220000002200000022222222440000004400000044444444\r
+%550000005500000055555555770000007700000077777777880000008800\r
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB\r
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF\r
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF\r
+%524C45FD0FFF7E5A3584FD7BFF59352F3559FD7AFF353535592F84FD79FF\r
+%35352F592F357DFD78FF5935355A355A35FD78FF59352F592F592F5AFD77\r
+%FF8435355A3559353584FD76FFA8592F352F592F352FFD77FF84355A355A\r
+%355A3584FD76FFA82F592F592F592F357DFD76FF5935355A3559355A3584\r
+%FD75FF7D352F352F592F352F593584FD73FFA95A355A355A355A355A355A\r
+%5AFD73FF840D592F592F592F592F592E605AFD72FF5959355A3559355A35\r
+%592F282F6084FD70FF7D352F352F592F352F592F3505065960A8FD6FFF84\r
+%355A355A355A355A355A2F2E052F60A9FD52FFA8FD1BFFA92F592F592F59\r
+%2F592F5935350506055A5AAFFD4DFFA9595A2F3535A9FD19FF8435355A35\r
+%59355A3559355A352E05282F6084FD4CFF8435352F5A353559FD19FF842F\r
+%352F592F352F592F352F590606002E5A60A8FD49FFA85A0D352F352F592F\r
+%35A8FD18FF5A35355A355A355A355A355A352E052806605AAFFD48FFA95A\r
+%2F5A355A355A355A35FD19FF5A2F592F592F592F592F352F59060500062F\r
+%6084FD47FFA8592F592F592F592F592F59A8FD18FF595A3559355A355935\r
+%5A5960595A2F592E5A60AFFD46FFA8592F5A3559355A3559355A59FD18FF\r
+%A9592F592F352F5A596059605A605A605A605960A8FD45FFA8592F592F59\r
+%2F352F592F350D84FD19FF355A3559356060845A8460605A8460605A8460\r
+%6084FD44FF7E355A355A355A355A355A355AA8FD19FF592F5959605A605A\r
+%605A605A605A605A605A605A605AFD42FF7E2F592F592F592F592F592F35\r
+%35FD1AFF5959598460605A845A605A845A605A845A605A845A6084FD40FF\r
+%843559355A3559355A3559355A3584FD19FFA859596059605A6059605A60\r
+%59605A6059605A6059605A5A84FD3EFFA82F592F352F592F352F592F352F\r
+%59A8FD1AFF5A605A8460605A8460605A8460605A8460605A8460605A60AF\r
+%FD3DFF355A355A355A355A355A355A35365AFD1AFF84605A605A605A605A\r
+%605A605A605A605A605A605A605A605A85FD3CFF59352F592F592F592F59\r
+%2F592F592FA9FD19FFAF605A845A605A846060608460605A845A605A845A\r
+%605A845A2F06A8FD3AFF7E353559355A3559355A3559355A355AFD1AFF84\r
+%356059605A605A60595935605A6059605A6059605A605960060528FD39FF\r
+%A8352F592F352F592F352F592F352F3559FD1AFF60605A84FD04602E0605\r
+%280659608460605A8460605A8460605984FD39FF5A355A355A355A355A35\r
+%5A355A355A35A8FD19FF84605A605A605A590528537E532E052F5A605A60\r
+%5A605A605A605A605AFD38FF842F592F592F592F592F592F592F592F59A8\r
+%FD19FF845A845A605A600652FFFFA8A8FF53055960845A605A845A605A84\r
+%5A60A8FD36FFAF2F5A3559355A3559355A3559355A355959FD1AFF5A6059\r
+%605A602E28FFFFFF2E0552282E066059605A6059605A60596059A9FD36FF\r
+%59352F592F352F592F352F592F352F592F7EFD1AFF605A846084602E53FF\r
+%FFFF0628052E53065A8460605A8460605A84606084FD35FF8435355A355A\r
+%355A355A355A355A355A35357EFD1AFF5A605A605A60067DFFFFFF530505\r
+%28A8055A5A605A605A605A6059605A84FD34FFA8592F592F592F592F592F\r
+%592F592F592F592FA8FD1AFF845A605A84602E53FD04FF7E59FF7D2E5A60\r
+%5A845A605A5A5984596084FD34FF842F5A3559355A3559355A3559355A35\r
+%59355A5A85FD19FF59605A6059602E52FD07FF5306605A605960352E057D\r
+%A72E2F84FD33FFAF2F352F592F352F592F352F592F352F592F352F603584\r
+%FD18FF8460605A846084067DFD05FFA8066060605A84602E052806282E84\r
+%84FD33FF5935355A355A355A355A355A355A355A355A355A5A605AFD18FF\r
+%84605A605A605A5A0653A8A9A87D05355A605A605A602F28050606605A84\r
+%FD32FF84352F592F592F592F592F592F592F592F592F5935605A6084FD17\r
+%FFAF5A845A605A8460602E2F2E2E0C5A60605A845A605A84605906606060\r
+%84FD32FF7E2F5A3559355A3559355A3559355A3559355A355959845A60A8\r
+%FD16FFA86059605A6059605A6059605A605A605A6059605A6059605A2F35\r
+%605984FD31FFA82F352F592F352F592F352F592F352F592F352F592E2E5A\r
+%605984FD17FF846060605A8460605A8460605A8460605A8460605A846060\r
+%2860606084FD31FF5935355A355A355A355A355A355A355A355A355A352F\r
+%055A60605AAFFD16FFA935605A605A605A605A605A605A605A605A605A60\r
+%5A60352859605AAFFD30FFA8352F592F592F592F592F592F592F592F592F\r
+%592F5A2E0506605A605AFD17FF845A845A605A845A605A845A605A845A60\r
+%5A845A60602F2F845A84FD31FF7E2F5A3559355A3559355A3559355A3559\r
+%355A3559352F05062E855A6084FD16FF846059605A6059605A6059605A60\r
+%59605A6059605A2F06605A607EFD30FFAF2F352F592F352F592F352F592F\r
+%352F592F352F592F590606050635605A60A8FD16FF5A6060605A8460605A\r
+%8460605A8460605A8460602E6060605AFD31FF7E35355A355A355A355A35\r
+%5A355A355A355A355A355A352F0506052F60845A85FD16FFA935605A605A\r
+%605A605A605A605A605A605A605A5A5A605A84FD30FFA95A2F592F592F59\r
+%2F592F592F592F592F592F592F592F59060605060559606035A9FD16FF84\r
+%5A845A605A845A605A845A605A845A605A8460605A60A9FD30FFA92F5A35\r
+%59355A3559355A3559355A3559355A3559355A352F05280606068460605A\r
+%FD16FFA86059605A6059605A6059605A6059605A6059605A605AFD31FF59\r
+%352F592F352F592F352F592F352F592F352F592F352F592E06050605062E\r
+%605A607EFD16FF846060605A8460605A8460605A8460605A8460605AFD32\r
+%FF5A355A355A355A355A355A355A355A355A355A355A355A592F05280606\r
+%052E60845A60AFFD16FF5A605A605A605A605A605A605A605A605A605A84\r
+%FD32FF2F352F592F592F592F592F592F592F592F592F592F592F5A2E0605\r
+%060506055960603584FD17FF5A605A605A845A605A845A605A845A605A84\r
+%FD32FF84593559355A3559355A3559355A3559355A3559355A3559353505\r
+%06052806062E8460605AFD17FF8435605A6059605A6059605A6059605A60\r
+%84FD32FF840D592F352F592F352F592F352F592F352F592F352F592F592E\r
+%0605060506050659605A6084FD16FFAF8460605A8460605A8460605A8460\r
+%6084FD33FF5A36355A355A355A355A355A355A355A355A355A355A355A35\r
+%590606052E0606055A60605A85FD17FF5A605A605A605A605A605A605A60\r
+%5AAFFD33FF5A2F592F592F592F592F592F592F592F592F592F592F592F59\r
+%2F060506050605062E845A605AFD17FFA95A845A605A845A605A845A605A\r
+%84FD34FF5959355A3559355A3559355A3559355A3559355A3559355A3559\r
+%062806060528052F5A845A60AFFD16FF846059605A6059605A6059605A60\r
+%7EFD33FFA8592F352F592F352F592F352F592F352F592F352F592F352F59\r
+%2F06050605060506066059605AFD17FFAF5A8460605A8460605A8460605A\r
+%60A9FD33FF3559355A355A355A355A355A355A355A355A355A3559355A35\r
+%5A062805280528052E5A846084AFFD16FF84605A605A605A605A605A605A\r
+%603584FD32FFA8592F592F592F592F592F592F592F592F592F352F593559\r
+%355A59352E2F282E050606605A605AFD17FFAF5A605A845A605A845A605A\r
+%8460602FFD32FFA92F5A3559355A3559355A3559355A3559355A5A605A84\r
+%60605A84608460845A602F595A605A84FD17FF5A605A6059605A6059605A\r
+%6059605A3559FD31FF84352F592F352F592F352F592F352F5A596059605A\r
+%6059605A6059605A6059605A605A605A607EFD16FFAF8460605A8460605A\r
+%8460605A8460845935A8FD30FFA8355A355A355A355A355A355A59846084\r
+%5A8460605A8460605A8460605A8460605A8460605A84A8FD15FFA959605A\r
+%605A605A605A605A605A605A5A2F5AFD30FF84352F592F592F592F352F5A\r
+%5A605A605A605A605A605A605A605A605A605A605A605A605A60596060AF\r
+%FD13FF84605A845A605A845A605A845A605A84605A2F84FD2FFFA8355935\r
+%5A35592F5A59605A845A605A845A605A845A605A845A605A845A605A845A\r
+%605A845A605A605AAFFD11FFA8845A6059605A6059605A6059605A605960\r
+%35352FAFFD2EFF7D352F352F592F5935605A6059605A6059605A6059605A\r
+%6059605A6059605A6059605A6059605A6059603584FD11FF60605A846060\r
+%5A8460605A8460605A846060353659FD2EFFA8355A355A355A5A8460605A\r
+%8460605A8460605A8460605A8460605A8460605A8460605A8460605A8460\r
+%605A85FD0FFF84605A605A605A605A605A605A605A605A605A592F3584FD\r
+%2DFF7E352F352F5A5A605A605A605A605A605A605A605A605A605A605A60\r
+%5A605A605A605A605A605A605A605A603584FD0EFF845A845A605A845A60\r
+%5A845A605A845A605A8459592F5AA9FD2CFF842F5A35605A845A605A845A\r
+%605A845A605A845A605A845A605A845A605A845A605A845A605A845A605A\r
+%845A605AAFFD0DFF5A6059605A6059605A6059605A6059605A6059602F35\r
+%2F5AFD09FFA984845A845AA9FD1CFF7E352F5A5A6059605A6059605A6059\r
+%605A6059605A6059605A6059605A6059605A6059605A6059605A6059605A\r
+%6035AFFD0BFFA9605A8460605A8460605A8460605A8460605A84605A355A\r
+%3584FD06FFAF845A605A605AAFFD1DFF842F6060605A8460605A8460605A\r
+%8460605A8460605A8460605A8460605A8460605A8460605A8460605A8460\r
+%605A6060FD0BFF855A605A605A605A605A605A605A605A605A605A603535\r
+%2F592FA8FD04FFA8605A605A605A84FD1EFF7E355A605A605A605A605A60\r
+%5A605A605A605A605A605A605A605A605A605A605A605A605A605A605A60\r
+%5A605A605A6084FD0AFF60605A605A845A605A845A605A845A605A845A60\r
+%5A603559355A35A9FFFFAF605A845A605A6060FD1EFFA95A605A845A605A\r
+%845A605A845A605A845A605A845A605A845A605A845A605A845A605A845A\r
+%605A845A605A845A605A60AFFD08FFA96059605A6059605A6059605A6059\r
+%605A6059605A6035592F352F352FA9FF84356059605A60596084FD1DFF5A\r
+%605A6059605A6059605A6059605A6059605A6059605A6059605A6059605A\r
+%6059605A6059605A6059605A6059605A603584FD08FFAF5A8460605A8460\r
+%605A8460605A8460605A8460605A60355A355A353559FF84605A8460605A\r
+%845A84FD1CFF846060605A8460605A8460605A8460605A8460605A846060\r
+%5A8460605A8460605A8460605A8460605A8460605A846084608560FD08FF\r
+%A8605A605A605A605A605A605A605A605A605A605A6059592F592F592F35\r
+%2F605A605A605A605A605AA9FD1AFFA8605A605A605A605A605A605A605A\r
+%605A605A605A605A605A605A605A605A605A605A605A605A605A605A605A\r
+%605A6059352E3559FD07FFAF5A605A845A605A845A605A845A605A845A60\r
+%5A846060355A3559355A3559356060605A845A605A6084FD1AFF845A605A\r
+%845A605A845A605A845A605A845A605A845A605A845A605A845A605A845A\r
+%605A845A605A845A605A845A60602F050605287DFD06FF84605A6059605A\r
+%6059605A6059605A6059605A60596059352F592F352F592F352F605A6059\r
+%605A605960A8FD18FFA935605A6059605A6059605A6059605A6059605A60\r
+%5A605A6059605A6059605A6059605A6059605A6059605A6059605A602E06\r
+%05060052FD06FFAF5A605A8460605A8460605A8460605A8460605A846060\r
+%355A355A355A355A355A59605A8460605A8460FD19FFFD04605A8460605A\r
+%8460605A846084608459592F593560608560605A8460605A8460605A8460\r
+%605A8460605A8460605A602828052828FD06FF84605A605A605A605A605A\r
+%605A605A605A605A605A6059352F592F592F592F592F5935605A605A605A\r
+%60A9FD17FFA8605A605A605A605A605A605A605A845A2F06060506050605\r
+%2E2F605A605A605A605A605A605A605A605A605A605A605A605A602F2F2E\r
+%5AFD06FFAF5A845A605A845A605A845A605A845A605A845A605A5A355935\r
+%5A3559355A3559355A5A605A845A6084FD18FF855A605A845A605A845A60\r
+%5A8460842F2E05060528052805280506066060605A845A605A845A605A84\r
+%5A605A845A605A845A605A8460605AFD06FFA86059605A6059605A605960\r
+%5A6059605A6059605A602F592F352F592F352F592F352F595A6059605AFD\r
+%19FF59605A6059605A6059605A6059602F06000605282852282E05060505\r
+%055A5A6059605A6059605A6059605A6059605A6059605A6059605A6084FD\r
+%06FF5A8460605A6084845A8460605A8460605A8460845A5A355A355A355A\r
+%355A355A355A35605A6084FD19FFA86060605A8460605A8460605A853528\r
+%05282EA8FD05FFA8532805280660608460605A8460605A8460605A846060\r
+%5A8460605A8460605AAFFD06FF8459605A6059A95A605A605A605A605A60\r
+%5A605A5A2F592F592F592F592F592F592F593584A8FD1AFF8435605A605A\r
+%605A605A605A603506050653FD07FFCFFFA828050606605A605A605A605A\r
+%605A605A605A605A605A605A605A605A605AFD06FF84605A845A6084855A\r
+%605A845A605A845A605A845959355A3559355A3559355A35593559A8FD1B\r
+%FF84605A845A605A845A605A84602F05287DFD05FFA82E7DFFCFA8532E05\r
+%282F845A845A605A845A605A845A605A845A605A845A605A845A84FD06FF\r
+%AF5960596059A97E605A6059605A6059605A6059592F352F592F352F592F\r
+%352F592F350D84FD1AFFA8605A6059605A6059605A605A5A05052EFD06FF\r
+%2E0052CFFF28285306002E5A6059605A6059605A6059605A6059605A6059\r
+%605A6059605AFD06FFAF605A846060A8AF5A605A8460605A84FD04602F5A\r
+%355A355A355A355A355A355A355A59FD1BFF60605A8460605A8460605A85\r
+%2F2806FD06FFA80528052E2828057D5228065A608460605A8460605A8460\r
+%605A8460605A8460605A846060A9FD06FF60605A605AAF84605A605A605A\r
+%605A605A602F2E2F592F592F592F592F592F592F592F5AFD1AFFA8605A60\r
+%5A605A605A605A605A2F0052FD06FF5306050605060506527E05062F605A\r
+%605A605A605A605A605A605A605A605A605A605A605AA9FD06FFAF5A605A\r
+%60A9AF5A845A605A845A605A84602F062F2F59355A3559355A3559355A35\r
+%3559FD1AFFAF5A845A605A845A605A84606006287DFD06FF7E0506052806\r
+%06057DFF28053560605A845A605A845A605A845A605A845A605A845A605A\r
+%6084FD06FFA8605A6035A9A96059605A6059605A605A5A062E062E2E352F\r
+%592F352F592F352F592F7EFD1AFF846059605A6059605A6059605A060084\r
+%FD06FFA8280506050605067DFF05052E605A6059605A6059605A6059605A\r
+%6059605A6059605A603584FD07FF84605A60A8FF5A8460605A8460605A85\r
+%2F2F2E2F2F592F5A355A355A355A355A35357EFD1AFFAF5A8460605A8460\r
+%605A84606006287EFD07FF7E060528052853FFFF2E055960605A8460605A\r
+%8460605A8460605A8460845A8460605A6084FD07FFAF5A6035A9FF845960\r
+%5A605A605A60592F062F2F5935592F592F592F592F592F592FA8FD1AFF84\r
+%605A605A605A605A605A605A2E007EFD08FFA85328537DFFFFFF05062E84\r
+%5A605A605A605A605A605A605A605A60355A35605A605984FD08FF845A60\r
+%84FF84605A845A605A846059062F2F5A355A3559355A3559355A35592F5A\r
+%FD1BFFAF5A605A845A605A845A605A852F2853FD0FFFA828055A5A845A60\r
+%5A845A605A845A6060602F2F2E7E7D7D2E5960605AFD08FF84605984FFAF\r
+%596059605A605A5A0C2E0C592F352F592F352F592F352F592F357EFD1BFF\r
+%84605A6059605A6059605A605A5A052EFD0FFF53002E5A6059605A605960\r
+%5A605960592E052728FFCFFFCF2805605A60FD09FF84605AFFAF605A8460\r
+%605A852F2F2E35355A355A355A355A355A355A353559FD1CFFAF5A605A84\r
+%60605A8460605A84602F05A8FD0EFF06282F845A8460605A8460605A8559\r
+%2E0528062E527E5352052F60845AFD09FFAF5A60A8FF5A605A605A602F2E\r
+%062E2E5935592F592F592F592F592F3559FD1DFFA8605A605A605A605A60\r
+%5A605A60350605FD0DFF520506605A605A605A605A605A60592E05060506\r
+%05060506000659605A60FD0AFFAF5AAFFFA95A605A8559060528062E2E5A\r
+%3559355A3559355A353559FD1FFF5A605A605A845A605A845A605A842F28\r
+%28FD0BFF5328065A60845A605A845A605A84605A0528060605280606052E\r
+%59845A845AFD08FFA87E535A60FFA8605A602F0605060506050606593559\r
+%2F592F350D3559FD20FF8435605A6059605A6059605A6059602E0505A8FD\r
+%08FF2E0505595A6059605A6059605A605960592E05060506050605063560\r
+%5A605960FD07FF7D2E0528062F7DFF59592E2E0506052E06060528062F2F\r
+%352F595384A8FD21FF846060605A8460605A8460605A8460842F2E055259\r
+%A8A8A87D530628066060605A8460605A8460605A84608460602F2E052806\r
+%06358560605A8460FD04FFA87E2E06050605280005052800050506050600\r
+%28050605282853537EA8FD24FFA935605A6059605A6059605A6059605A60\r
+%352F050600060506052E2F605A605A6059605A6059605A6059605A605A60\r
+%5A5906062F6059605A605960FD04FF7E282E282E282E28532E53537D2E2E\r
+%062E2E53537E7DA8A8FD2AFF845A8460845A8460845A8460845A84608460\r
+%8459592E592F5A5A8560845A8460845A8460845A8460845A8460845A8460\r
+%84068460845A84608460FD04FFA8FD43FFA8FFFFFFA8FFFFFFA8FFFFFFA8\r
+%FFFFFFAFFD07FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFF\r
+%FFA8FFFFFFA8FFFFFF\r
+%%EndData\r
+\r
+endstream\rendobj\r21 0 obj\r<</Length 65536>>stream\r
+ø×µ`\1e«×\9aY\16nÄrr\8a\87F\90G&FCè\9bºv:^\17ïª\88.\f$\8f/\8c.ÓYt\11\1aÏÈ\ 6\85\8bn\8d¯ÿ"\86ÕO>γ\1d$FZ§Êç´   \9bÏ\8f\80V\1eàÖÅ\82q7_<}B¬äí¬uk7iPÃ\r¾:\8bë\9e@köZy[+\ er¶VqÆ\9eLlÒÎæ\1aZÖúHh¨\v\18ÔçÊ·°x\1f¾µE7\awçä\17d4\87îLµ\ 1ämf\eN\ 1f\e³[\9dmüMk¶ù\1c\e³ôâPϨþ"ÝñÙ´åF\a\8e\11;β\1c\ fj[Oü\89À|.\9a_H;o÷Gt`^3x7ùÔkë:ß\88älx\eÈÖè-ëK\1fÌYÆÍ¿mõ\85¸<-\96½Ñm\1ekÜg\ eÈ$¨å¨jaƺdS\15,\82\9c\1e\9fã,y?\15Ó^ºr\89Ö¡rí.JÊ\95Ë5¦ØµY\9fba·\9a\81ý"=\8dÐ4Ô7\97\7fßÎp>(EÌëÒZ>\9eÇd#>\8eЭÿÜc\850Þ̵CÑIÎ4þ\93\87\9e¿ió\ 2\r\84\18*úË\é\v\13£Vs*ý\0ÚP\7f\9df\9c°»©£¡ù\99\9eL\aV®s£¬Ô®\9b¶Ü¼\aìä9'ç\93ö\a¼M:ð\1d\99,ôE}ò\ 2½êäUºb\93\17þ\93\81úYþ%Î×Jé\ 6m-\v÷áê\10^§ëü#\8d²ï\1f\10\1c     ö'øäo\9bKå½^!tÞfͤfaõyoÙ\88\11V'v3q\9e`uUsW/cÆ\13éù6.\8e³gا\13\98¾(Ê£ú\90g×Âw²8ä\10é\ 3auñ\8bt)\91\1a\19²\b\96IO\ 4Û$(R'´*ÚÍ^EüZ\12\96QúEz\80Vr1¢]Ë7ÔÕÞg\ 3µ²ôÃa\93\ elöâg}ÞÞæÃ\93»\1cWîNî\99\80Öi¾Ç\963¨ÙÒ\8d\93\9d9ÎkyÏ\9f¨Gb:\9bNN\rC\99.\13GÖ´\877Ñå£/\99£M(ÚÄ\12\1a»ý56\86\17WbÄEµ¬Ë1B­\8b;B½{2â{.6Úm?Ø8_)\95Ç\8c\84\97~\91\1e£u(¬\83hÞ?ïéש_\16|Ox>Ï»zA9m:Ýï~\rV\ f×Õhg\7fÍ:Ç\16ô0xÖ\7fòÐ樧!ò\97QE}:\9aÖ\8a\rE~,\1fó\89ѲLÉB\ 4WtÀþqìFíûh÷l~G\85Ê°$\94\v\\8b\9f\88[\8e¯V\ 6\16_%Æ\11\7f)óe¡¬¹\98\9fKÂø\9b\8e\19Y¢ë\7f_Äù\v\ 5?V[8ºNOåç1Wk^÷Øg}Ú,®\15om\97ì\8d\8d®é£éÏÉ·¡·\10xa\ 3ë\8aÆÍë\1dõ´:ÐÓZÀðò"\17I\93®f©\12\80ôu1\aÖ²\94ê8\1f!Þ¨ð\ 4\ 2¡|\8d#¾z\ 4Q®±\85\eì\1c\1d\ eÙÖ!ÖÙÖ³ðf\1fVRàTv\æ\82\8bYÊ(ü"FÊ3ô>ôüÏÙ¨on\9e\87\ 3\97í½0Ëî߸½ø»wà\88Y[\93iÞ[¶Øè®\93Ì\r\9cÃ\9fQiVº\82ø´®OIyq*3RüÝ\8cĵÌÊãí¨½\18      \9f0{\1eâºåå«wáÔÃöÍÎ7\a8\1d÷\9c«Ã\18*QÃ>»Ìê¡\87}Îy\fã\8e\830Æ«PbB\8a(²í\15SøE\8c\8c½Ò\r\9fcòfý½4¼]6:F\1d×PÉ߯Ƨ²³\9c\97\9d\8dnáÆu¾éÏ¿³ñ£\82L§Þ¡ö\93\87V[mé»}Ð"\ 3©ü\18\9d5¥Q\89\ 1fü5ñ\96Ü-\¹ìB\93\8eÌR\1e=\86«Ñ\ 4\1c¬\99iy\90Ûû=z;\1a©ôv,ß\ 6Ã\86\98\1f¬§\97â\10ø$\85!E\14пd\9f&[¾o\8b\9fXÌû°EÚþöÞX\9e×ß/z°ùHß\99*\17غµªYóMÐ<Î\8e\9fÚ{\1a¼¿°üN\87ÉR².·Dæ¾'GGdÀ\b\13=7â\e\8d\93µ°\95Î|ìav\b\f¿FÏ\e\82³´¿\ 5Oz   \8dªã25:¹Ýþ¹Z\99ôÏéáF\8dÂf\8e\8d\ 2Í%\8f\1fÐ_<¾\18þ½Ì+ÐÓ+¾\80ëF\1fHggÓ\ 2\8f\96,µ²²kÃxËÖ\9c\83×ó\99Ôö¶Ó\19½½Éáj\99L\0\95(\88\b\17ÔFâF%øàU¤¸ùôƱÆ`%1äw¤\r!\ 37\aùYeK\17&¥+U\16*Q¿*\91\ 5rºÓÚdC(I½G駴\97\9c\1er\10\19 b¡_åæH\7f²u~s\87½O|\ 2Êêm§ø×ë:éõΫãÞö\96óoÚ³]Ï\9a¦êc¸ªèPi%÷¼ÎIr«\9dp|Ƚs£
+ídWh~¶\1aàlèÇ=f%n\87Ã!*\8d\ 6\1cD)´\10ã\ 6\85é¨Û¯©ð\99lJhØkO     ´k<ôv·»¨\88D\Í\9dºÆ\ 5\0»aY,öÚ´\8c\7f\91®Æ\9fìÇ¡ç\8d0\7f£Ï\97W\87¥ë\17ó6döúÊ0\1cmä_\r\85ÀÏ\8aä>§\v\917ÍÍè\923}¡1Öbî\8d\b(K\12H\85\ 1\1f·ö`§,ûô¸%qÔ¤FMúõsI#ñ=\9a\1d\ 2½Î\1a>t{»ú\9b \1c"×qs&Þ\19îê£Îpß>v\86Ö;é¬o\83\ 2\ 1ÖD4\ 3ùŹÛ{<wÊçé¯\9d\1ew]aêîh\84Ia7ç^ÍÕô\1e\831\13È\9aÈ#Y;Jü\13     \f.,\17<ÖºU\9fÌ`\82\0\83ýñ\84Ò"·¬QòxFô\9b\bE\93m\10\17zÝ|}Úí\ 3\15\93\18À¸×a\92ν½\1fh¹vaûj¶\8e¼$´Ä¢xl\8d_ùlîîÖ±$\172ÐÖ\11\14ò¿8 ·þmC\88\166èeùôio1\8c\r\93\939IÎ\1fm,úå    ×Ã\8b,\ 37\ 1yÈ-ú«ÁÈTÏte ¾¨:·È²\1cä«,\95z\1fdØè~KT¯\væñ!\ 1\17ëb\a\85+óö\88\1fnZ\92¨\ 4øõz\ 6ñz£RkÞ\1e\1eß\9c-ö^sÆÐßæ\8cp
+ÍYÕ@\9a³¼\9aÿÅ®î\87Yë¹Î¡R`ÞÖúQ§.ÁvvÉ×\1c9ºS\86X\OT¾ÃÎÇÃ\1d\7f\8f\90ïnO!õxëô¢qîÚMäbØ\85f\15\88Èë\95R\87\8f:x{ü¬ôZ\97N\87Ã\ 3²§à\r\92)ÍÖv}n\18\ 5 n\10G©R·*\0S·ªe¯nF»o\9dTßh\9d\14\ 2¤\96\0\ eü\v·\9f[ßVXð¹\18½cÕÓÆ.ë*Æri\89\9ep\98ó:ô\90\99|\1eÉ2·\94\8aö\86= hÒ\9dâ\91`Ú§¹©´¥\ eh·®fçÔRøe\88ß\8e\a\bDZ{©¹0a¼±tÐ~ý\9bë\8cê\14'-jë\83·«ÁXñUÝ\86ëb\95\83*gMvU´øùT<½\90\8d=+£J\94\ 2?~c\177u\7fÙ1ùã\9c\9fYÛi»}µ%$\ 6Óqɼ¬2y¦+RMtÈt×E\8dlKã¨ÛÔ©\rÕ ÝhTOØ\96V§oÓu\1dZݳ\8bMmCWÂZþÂäª{YǪ\85Û®U9Ú(SÁ \9e\8cÉòÊÆjõ¢_Ví%\n\ ej\9dÒ3\17ÍJsóþ(Í\ 5"Wj\ 3-¤ÔzVó¿X¾*Úi\91G\8e?ý´Ç3·\96¸ni)à      ©1yW\96ûO4ýÍ°hS-¿\1ct\1a¦ÛÅk¬ PUoUPª¥R+½þO\985v\8d´#VïÛ·òìtþ\94^\957TêX\85RÑ,\92­ÂW\9a\ e
+ÔÇϲ\1c\ 5Ðê9¨+Ü\1e(|¦Pdgä(\84ï¾W\b\85\bjG0\82\8eßù_,\ã½WU¡æNroÊ\124~²`òç¹Ò\7f\11±=Ù4~ß<ºu'_ËúÐ\95ãR©bÓ\8aÈ\94\1f\ 4¤\96Þ|²(F\vhU$?ùMaPÈ\1fÐ\8dXöÑ|H¤\97°\1e\9dä\8f\88äEz_\87/\9b\88\84kh+«\92õíl\ 6Ù[®\89Ý\11èáK=h®vuh>+dã\e¨\8d3ß_̪Q\7f3\19¶F+á¾Óu\ 6\ 17jÿ¹}J\ 4\ f¼X¼Å>zµ\8d\80à\98l÷ÒÓEîÔ\8b}\f 
+\83:À¡,~\13\90½~\15óGk+ç1`\9d\15\8eÁòp½È\ 5»­\95k\16<\17jcÞ\ 1ìÖ½,sz\r\81\87¦\;@¿#JY\81¬\9br~\ 3ý._ÊÒ¼TÊrú\v\198,ìQ\ 3v\r\86¥.ÙM¯þó\93\93\89\ 2\bòÍ7\9bôkH\11i\95gP½RX-¦\ 5\96p¤ðù4ó"ynÂ\17Ç'rÁÖîB\8fø\v\1ar\99\0,5é\ 1}¼0H!\85\14MIñ\8dÿÉõ.o?\99Û6
+fU½\8d4Þ.\9fò6³Lï5å\9bå¦Iô\171ЭF1`\90q\fl\98\93\0Ä\0Ò\ 5£dÖF¢¤ÄV£ïÙ!£¯\9e\8c¢/Kg\rAôíº\9bèÛCý\94Q\94²K\7f×û\96£/\897SFÝèÛX\ eRné\9b\9aµY\8ajG_¼|KÑ\92èKCé\1fÓ$\9eB·þÅÏjþ¯ßü'Ê7\1fÇ 4IC}«i¨\86\9a\8b\92X@£ÄÛ4¢d\94ÐQÒ"¥èûÖôè{ùì£ï\95º§¬Óµ^¿hôÝU*)\ú\9fî\96äÏjv76úî\8bé\9bö¬\96²w¢¯G§oò.Pô½\93µ\14³\e\81o¦óq\râ?0Ýjû_ÄÀ\85\8eb°5M㤵\f\aøI©f\89jàòÀb@)¤\7f\99(ùÚJ\94\1c¾«(\99w\ eQ".\9fY\ 6=ÝúR§\942k¦\9czQÚË\1a¦4G)bú\8eI\96\9b\96Ë»\14ý\119õ2úÙ´ZÙø&\14\90Fû}\1c\95»o±\ 4\11ïòéÝùáu\91.í_¤QNÒPm;\8dò~øÆàá\90¤/ßi°\ e]\8fÁ\81FÆ`î Ä\80\8fj10¥Ö1À¯¯?yè>ð\89\81f/ý©¹¬¦<;1\80ctJ\96\9bÆ\r9\1aè\96\16å\88\8bõÙÄùý\a¡\88[Xd\9cüëZÜT\9ej\1añ³i\1e{\8fy2'\1emGìÜÃÁ ý\97t5\7f_¤a\99Q\f¡ç\94Þ=ã\93ÄÐ\94ÉJ§íf\fõát(\ 1t&1¸\96\8c\18\94\18$\90[\fVÙ$\1a
+\12úá$©òAá\ 5\1e\8eø\15ù>\1dW\83·$\9e²fí]ÁBù¥L\81ù«Þh;ÏÙ\<=\16Ë ¹÷Ä\ùF)X+Xß\8bÝ\0Æ\9f\1d\9fÓ×ø\1fPbÑüE\f~Ý0\86\94×'\86|8\8as0  Æ¹Î®ü\93R%ÐN\9c«rL\f\ 5+%\86Ô\9b\19å\87·}xx¬/ï\89²|½¦ãEò¼oLäÙBv\95\87N¹ÍûÇÝ\11w\93¹\ fnßýG¸Ñ%P¹\81\b\98ª´ówjü¹\96"\10=OÅo6¾9iÊ\v?¾înýH´&ÕC\ 4\8d+\asCc¿\88!ÎOCýÀ\9f4Àz\1aêZÏÅ0\88VS8"ν¶\´%®J(úCí¥\1a_óñ~\9d7wK0³AáÍ\19\9a\8f\9bß ï8y¿°\9c\97®ã¯Q¿\Zóö9èªýscep§9¸\99\1cßÌ{y$<âè%\13ýëAÖ£¼Ï¯\83ÚN¨l*»\82o\94·Ç©\Ü\8a\r¶ð\97t5?Ët[\82i\94C<\8dò4úþ'\91º¢~ÒÒ½\88\aOì[ù ì#\8c\ eDU%@®\81~\95ÊÖú|£úÞi\1ea×£ñD^\87¸\83%\a \ 1Â\9eó¨c^\ e«di»=«àÝÝþN1»bK\99l\8fïÐÞ\¾ÂÓ½AëÜúY{VÖí\95WrBjUp\96¥%\92\91ÿE\9c«\94Ò8O\\9c\86è\ 21\1cãÅ?E³ùî5»Ãþn\88¯ö=A
\80'\8dÞµòí²'½¹\15\ fv\81\9ayÃeÉÜs\1a¼Ý\8d&\9fÓV\12üÛæºö?\9b\86Ü\19ù@×Ïù#\8d$LÚNh\12\8cÓM4Õ^\rÑÃjÍKÑ*\97\8dfq\ 3\1fµPì\9cÏ\80M/<@¿\88s\v*\8d²\99}Keð\ 2ã<Ë\95âüf[\ fe\ 2­<úà\ 3ñ\8f<\82\9c[/¥rp*p{¿/\1f\ 6»25\19\80È\9a5W\e$ÆZï½]ç£=\ eöW>ú6å\1d_+\17<&+\98¹!\16g=«æ\ 1Ì\11f\89éòËsþ²4ü\12s7\94×\eL\ f\96\ 6¢ßåBN׺y0\ 3øÅÏyó\1c¥Qª³0Ý\8cÙ\1còC\17|X·Ýç>ÐÇ\9f@\98¿ß§\10\aÂCnà»\13ÄW7Á«@¬ßÇÍÀ±zâئ/Íé\8añ\8a\86Å/\9e¶yð\9fûåùè\9d\97Uìú4¦Üíç\eÊîö\vÑ[9¸¶Ð¹^\7fÑù®å9\99ë\1e´o\98D\9a½ëç4ÛgAÍþ\88@Êøû\8b\18\90tk®?\9f£pMn[ø}ö±P<\9d\9fçðpnGëìFþ!÷À¯;i\únðb\80:±#ÔíÁ\ 1!¬}´\1d\98âB\19-e\9eR\fu\80ëú¼\ eZ\8b÷\18Ü-\88\vz\9d\93ûïSs@8Ñ ¢\\981\16\8d«{ÀåTÞU6jAn¾¦Gv\9b\8do¦Gù\98L\8fFðÍ\88~\11ÃÂì\13ç«Ïï#F¦7ÿ4\9f\1fÏ\9dÉvs¤NÃÍa¸CÝ\9dt3=÷%L\9e\8e]h\83«m\1c\96¬Ru\85/\95a\8f4\9a\ f0«¹]\84¬+ÌcJWæ@\95\99k\ 3\81±gì\90Ø©{\93¸¨\85\84\ f§å\90\85\14¹gTä@{ôeu`êr³¢Üä&QLä&Ó\8ceõÌþðùE\f[\8bðçV\84Q\87nÛJr¹Ì\ eÅý\91\ 6(ÇC¿þjw6øåF\9b4\'\81\véëM\10\9bç¬~ø>D+zGÛµæ_dLjk·1\9c\89 zâCQ\8bÛ@\9fböÞQj\86ãÉêm\93\8dÖ&óó&\92ÂjX\90º³vG\8cñ@\16W\90\7f\16cq\11\89ñÜ\8b¤n\12~2Þ¿øÙñïÀì\84Á\88\f.'\93ð¶ÞÎGíÝä2]n\1ex~±6\93\9f[ßv^³\8eVy&¿\8cG\11\ 5t¢w.Îmy\×`7ßV\ f\8d=9=c\ 6£\¿ìH¾½»ÓÉóV3&\9d\95zyì$®úí×x=\1cæƹݺ1Ú
+ÝÑ\88+5ö£­\r¿Æ0Êes\r\8d\87Ê"Ìxý"Îç¯ñÏ\8e¿ú9õt¤û³Í¾lû«ÍcÕÒ×ÑÎRí\8d20,\91íî\96Í|.Ð\89Ð\8bæNy\fÏö TVÇÓ}sZÍ     \9d,\9fv·kÔäeä8é#\E©·¾j"ez«ñp¾M#
+\9f\ fÁ»\7f\0¡ÔîTùSxexÉÜ»ü¹j?\84\92\91vYÆ\10þÎxþ"Î\13qr_\97Èlß\ðCópÈ\ f)w\elLË5Î\ 5Ý\19Ì\aʪH#\8bå­\19»zظ^æÎ]zk\bÒ\80Ô²ï J0`+²ö­µ&ÄäJH¤°¦Ez¸\10Æ\f))#¾=Ô\85\832Úðç±\94Í;Èù¬\12quï\dïã!ÅjXßæ\1a\0}ã¦Â9äüýëÅùÁ÷ù\8b?\a(W-ø'sòÜï\8f|i½y"SkÝ÷\1f\8b\95Ç\15\16,§F\a^f\87À\82ÊI\a\8d\83:\ fU|Þ¿Ê­ æåv\ f+IÑùZ\13\1d\1ao:Cr´oà\8cpÄJ"\7fAa\8d\v 0\r\87Å/l\8bê\84\8cîê\ 5\86`Kä0½¨/\19B\89|æÝÑÂ\8c\1a¶µÞ=~\11V?ÃOPj<®GZ]ïvòøå¸K\9c±\9c\²_XÒ,\96\8dź#-¨yE׶_|¯\9e¢¯¯Ü|ó#wr]HZáOT\1cì\17Ø\18\19RYY¨HÖ»\ 2VþÒ|\r¹\8f¸&xVÙVt°\98.p?\f-\ 2|\ e\12\8bF\ 6\ 3àÐ\19@î:û~ªýu\90\1c\e¯a¿Á<\87ÖtrÿÅ3\84üçÕ\1fì¯\87üBÊæ¶Û6\8d\83³¦\98\96µ:´\1d}y\9f\9cä\85ÝóymÇ\9egêY÷Ýiýd\9fåÎ\91~J«/ô\15áê
+\1ey'®$H|¥Î+­O\9b\9bÕÎ}vQryf\997\95á
\97\ 3çcîèM²Ë\86Q4ÒN jÿ\99â\94`\8d4ÊCØ\13\9d^U_ô\16k<3n¿xôoúã¬\8f\9bǽÈã\e7ôLÇ\81Õ\82eUQaa\10ýÙDÛ½ÇCuâ\92\13åÑä³bX\99\98Ò\9ed_Ë\81\98\a/\9fѸ?\83\84\8a\8f£Ü}ü­°/Öo1\1fÊ%\87«hÂ\fÖO^¢·>³HÛW~C\95rzÐ\97¸\a@^\8fd\83T¤ú\94¼\9e±C_\1a]\9eý\93÷¾S%\14Ê>ÍÏò/·­Kß\8fvtóvµ9ºYÛ ¶^\1dNÐj©½kó\ 5ýéHª\8cçi¥]x\8c&Ö2\9aK\83\8e÷³ËyT\ eæO^­t¿\ë\88æY¸\97\87    nf\ 3\8f!T\9d\10\83|\91\19Ð\ 5\98\1c÷ÏNuÖ¯æ\985Yÿ\8e/=\8dÞ}»¯mµÚ}íJ\93îË\8c÷=\8dp\9e½»~|d\ 4¿ð¥$
+¼ýb±ß,\8cïÖa\88\1c\81U]\1e-ÝR\9f\9a&h_Q\ eÓm!­{\ 2+"\eV\1e\9dF²%(UõÀ=¥nÀ.\vÅ\ fÓß¼Àá`u(\f\10bZ¥\8bM¾Ma\15\92ê×
+-\81\1aÓ^\e%ín\17bN\84źټ\83D\1fmU;É\11\1cw\12\11}`þ$¬¦q'"usûÅY·\açÝ\95\1cî×ßÙy»\1a?\eëe»%\9bóme9Sk±=\9e\80\98L\8dÎU¯'Ô×'\9eÇ÷¹ìÖ7û\91\905c£ñi8¼<\9f\ 3\8eé\12£å¨J\7f\î×;é®ÅI¢×ë´\eL·WoÈ\ 4Õ"ÍΰÆ\1fÚÛÙ.ls-\ 2k#!,´\91k¼ms°zO\99ßÛÛ\8eqû!]Íß\17\87\8dú<n\16[xçä\19{gªÊÛÑ\81\98\9d\8e\94*\7f\18z$¢ß\ 1Í\11&Üd\9c\1cØg e(\róÚÂ\1c\14\8cÕ\8eºàÊ¥\1f\10Ê\8b|4¹¤÷î0h7j´²¬:\91´[m\ 2ªWéN¾Õ\12Û¼Ìè­ñLÛãç×ë\8dO\8cq\19¯öp\ e¯6j;¼\92Ìïxå¡ÞðIÃúÍ\1eÛÍ\ ek{õõ¬Ë\89Þ\1aÝ\8bº\9a£\95köpù\14¿½\14\89\99'\82 Ö\0\8a\19\8c_8\8dét\8bªYã´)+ú
\9c «^¨V¼n¼¨øݾ_\ f\89Á£
+vØ°\h{½F½ujU»-Ì y¼¶\9ahMõµÛ6\9e]ôÙ\98ÇfÖ\87\ f\12ÛhÏÙ´K\8cíïõ0·¹×ß¡uûŦsÅ\ f¶PÝyË\ 5\1a¹\v\18oZj#7\9cOèýx2\92Ç*Ç®*Ë>}òL¼÷\198\18áÒ2N0Ð%{ø¢³SªJ\87¯O¬öA3÷íÒûà·&Ý{\88û«\blÞݨØl!\85fC\1f\91\83úç¬Éu²\9a¶¸ö¬\13ÔhÜGj\10´\1eÔÀ«áVÝÞûV\1dÞ\8fAuxØü\17éj~\96Î\86FOæ\f&v:XS\9dY%Y\e2ùzÍÆ\18\17\89\94c\ 6£k©GêB¹Aäén\19\ fÖ^¹Ù&·ÍF\b\0TÃ8±R£+m\8czL@Ûº\15\11×:ÐçÃÚ\1ap²oZªå¤G¥Ê\ 6\ 5¢â5\19¡"<ï&v":gLÊ¿ \fó¶}\fÓ6Nù
+Eײl<\82²,_ü_Xòsêéßr°ÑJ\11\91]_\8cO\1d\96ÞO\ 5ñà0W\ 6¤\1eðm"\7fP«ø\rð
+õØé\15ª(u/b\13âUÃ*q¥\8bU\91Õ¨ì{¡V\9ejÝu\8au.7è$,=°A¾¤]7\8dâ\9bÌ\ f\8az¢iEâT9\14¬Ê2.\90Á0Ë@¡ÉH0Ñ\ 4\7f\9cѤ\9c\7f ¶û¸ýÂXÚÉV;èM[1zÜ\9f¬>÷é\1aâàðز¤A¸½Îþ¾iàÍÓµT\a±R¾2ÆÝ\éÑdòÅðOÍmq      âýB<áøB?Pä\ 2`\9d\ft\b<×hîÜ<#[}\1e"Ht\82ó\9e×läG³=\9b\1f\12>C_\1f>cç\ 2,ùK\16®\bê\ e®4£'\\ 1Þ¯_¤«\99ïfª;m\85KóOb¿s     äÁ±\11
+¤á~é\8eð}´\9a\8bu\©1¹N\ 1«¦W¡¢Ñþ&\ 5À'Q\94aê=d·¯ÓùóÂæÇ\8b\9e\b_`N\85'»Å2\174¶n®á\84YE\174\87\8b/ÐhP9\90H®M :±<Ð\87/K \9f\9f\ 6\0\19·
+\0ùÅ\ 5\80L\9a^Ê>L9~þ2}̯+\89Ë\7fu^oCÓaa_\13É%Tg:¥B\9eh|ôbÖÞTùe¯Tn\ 4S¸Ðçü\ 4á í\9b\1f\1f\992|qv-X\1eø½\9cÊÙ$4\1fOú !3\ 3À\9a\11,ÐÇy1e7\aú-t\9d"]Râ/Ðo+\15 ß©1ÿ\936µï\7f\8aa\99"Ðï¡4Ð'1÷\17\93ܦ¾\14ðGk6\14ª\83      \19Ú\8aÐ>7ZdÃ<\ fZ\95£2ª\94Ú\82\86 \83ï\ 3Ì\8fØñ\17®Ê\11\9ak"I\11j\97\1c\ 4\88\ 2\16ùYMs\90®¦)§!4\8dô\94jî[)\11\99\86ÚÈ\82\9eLRîé6lõ¼\94Óû?U½\1d$\r¬sÑÓx'é\aI\aÌ)zí\17Q²ßß\7fjn£Ëý?X\9b\14@¾GßNÿ\19}á%\18Å»'\16ÅV·\eÅ\82!Dq?Ò¢\98¢×)î)åû\88b\1a\8fSƹ\14»\98òªGq\eí¤PtÊ:«\84\8câNÍLÙ_¢\98(\7fRäôw\84\ f̦ôÿ$\ 6òÁ=\ 6\88÷í?ä\1f\8f(\11¬4Χñ\8e¾\8b[.ú\12?OáEß¼HFqp\1cEñ­±HÑÜ\94WºÖ{ý\952\ 1R\$åU\8eâ#ÚHé\11)\8baJ8\89âÓ \8dó\94øQ|æ¿Ñj²)|\86M±ø\81\ 1á\ féj~\96ávÝ/ü"\ 6\98(\rPO\82ÿÀ¼\83\ 6i¼^þ\e%T\e\8d\12PnDßó\85\8e¾FA\8c¾,³H9l¢/Wº¦péGê\99ÀϧéÝÑèK¢\95\94\1e\9e2#SNlôícJ\8ajFÔ:¹~`µ\1c½\ f\9dbî]2±ÂëLæÐ\97ô\rÑWåðü'1p)ÜâtØ\16üÉC\17ü\18x\17Òx7\8d×O\ 6=\ 6º{,Jâ¤\13%v\83\89\92ñT\89\92ÖÙ\8c\12\fÝ¥\8cÒÏ\85yQ\94Tàô\18ªôÊ\11=íÕ"¨1j\7fÜÇ\8cüäÛK&Ü\85W),\90@v\8fà]\1e\f\ eÏ\0\15\9f\8fGk\rÝßÝ\15z×ã\19z'<\ 5½E#\ e¹Y¥^þf\81\97\18,W\83\18\1c·ü\18ÔZ×ô§F\8a\96î$püÎÇ`»Q\8f\81pLÆÀÒþù>i\80ûj1ÐÀí(\87áÞ\a©wüt<Ù{½\8f\97á÷\8dÕÆðërÓ\8a¯\1a®W\9fÁk×z6\893\99\1eR_öѦêÊÝpgέ¯>ïA®\13&>kÁÈU8\9eáË   Ó¡\8bx\9dd³Ä_0\85\ 1Î×z'ùK\1a\16\91Fy§¯1\84\8eý\18ªë÷\18âÁ$\86\10C\ 5\1d\8fÁã\99\8a\86ák\14\1e ]~K«©þª\13¼ýÄ\9bÌîÑé0\97ûrÊÜoñc\9c\rØo«¹\ 1Þ\80ÐB\83aÏÁ\82Ü7À}\8e\8eÈ«·­
\12:5Î\8aq>\1f_àá}øT\1fࡧÚ\89·z\8ec\8f\91\avZá/bð˧ÑqZ\8a¢û?õÐá÷\1dç*tö\ 5\8df)\86|¿ù)l§ÝWP\83ú\8f7¼aïä@\16\97U\ 3øÍ\9a>\1a³\9bkéÕ=\9c}\v»\9c\e@óyÒ:µèø2qðØIz\85\839àj\a2·êy6\17fE}{w.»;¾gùÛñ8\88\8bóÙTkâÛõo\83ç¿H£4o1tÝ\ 5q\ eK·JnÑË\12¾:\14çÖçb(åZ¥ç<\90Kw\0\8d«\ 1\82xYëyÅò
+uzìPöhÐ\1fé`uï3Ï¡|Ó\83Òñà\9e\89î\87ݾy÷w\85Åëµ=\12h²-[\rt#\ 3\r\86zßUóumÝ:)\9eC|NOÛâOo»_X?WÉqq_9¢\94\9d7?Ë¿ÄÐv\97\ 6\98M\ 2\9e[÷\18.*YÎ÷\9cû\94È\16ðì0\8dè\96»\ f
\85N\1dL+\1e¨2QßoGyb'|\82ÁVL\82ñF\ e÷\8a{«ïu·9Þdy\81õürÜ;!²?;ÝÑåa[ç÷×î˵Âʹ   ø*\87\1f9\8b\8e)xçëò\84\7f\9eKñåß\96\98¾ó3®KÌ=û\7f\89s¹sº5çþ9\86\9b\9d{8A\ fÙ§y|N\8fÓ\83\84\8f\97\e¬\0Þù>,\1d\ e_ãþØï\98´Cs\1e
+\85MÝiÖÖ¯:Ðq>¥'m\7fó'Þ\ 6\81õd5\1cn5kkn-\vyl7æ¨}:/OÊõ±Äîqb(ízɨ\85«ìñ8}Fö\17\8bç1ð\16\9dNù6ÿÀ\ 5\92q\9e/·Éé/qnpOã}Â~8©\1fü\9bûÀ\1c¿<\93\96\97\86\ 5\1agÍ9\18\aÚ ìݱZ>m¦aôZë\97Uvé´\93\12\87®Ü}§fñíoË\1c×ïäò<¾³\86ÏîÆF}åNu\r<,\17/âì.:Ö+]õóûÔ²/¸ÕV\91ÙÐ@
+\1fÏ\86ççz\ 6\eìu\ 6o䫺cÙ\93º\93Åã\ féjþ¾\88sÎë\92înêqO*ó­/Ö¼Õé\9d\9cµ#\80\92ê\ 1:?ä\9dØQçî#\147\8eµé^mè\85\84\96иCË\v7E\8d\80æ«ú£K¶\17ïR\81\9cGp4\9c\93\ 2\94µ\9e\9a½\86f\1aø\81\9638ÉoU¾]¾L\ fK:\9a\8e\92rvZ\942\19¢¦RílOJuø<g\1c3<¥*Å\87¿üÙ\9a\1eÜ\98¤¿9Ï\83\8aqX÷øìÖ÷~\94ßK;lÑ\1d¹ÏÖsâ¬ðÐZq\80ç\99\ 4Æ­\8e\7fô¹\9b\80\8bnÿX\98÷;NM\e\14D|Ææú=ußë3Ó#Ý\15§e£;S&·ÁJ\ e\93\e\13ë1Ñ\820'½q6ëCK\ 6Dk\92\81Á;ÉhSGÉ\18p^Æ>c÷\97\9fÃ󩯠\83/Êñú¸\1a\9c\17\92W¶Ê\9aMC¼\9f\18g5\e\8dV\9c0\9c\9bÒ´ç\1a3\ 5>-³ÿÈ:·\140\89´\9cÙ\85f\88X,ªE6®N1êÚRjĺ'«ê\9a\99<N[IzûÛ\85Ô-\]Ñ\92r×qâ÷¿ãAë\8d¡§£\8cs ¿\1e\ fFwo<\98\19Û\8cÍ\ fYJ5[Æ°À=ï\89tô.7jë\1c\86\8a½ØU¬\8b쾦\98à|å\11½ÚUQÎ\9cä>\8a¡\95\85Y²÷ót0}\9dqSè©\96ÊÁwZA¶°R{)E¹\19\fk\93ö  oIK\18ÏjÕÅU¡\9evS\a\9dé8×ë\98\96\ e\82\ayoAØöÊü©P\1c\vE\15²\ 5!\9aî\85Q^ßel2Ü¿D|\91{Ý6Óùþ\14î{\96\87jãùæ~räµé\0Yëi3T\9d\8e=04m2^|bÍ\98\83\11¹\9eñ\95üqz\1e\1fo\8a\12Ëo\19×Ûɤ#À°Ô\e¼\8a"Õ;ÔÆkÛ'F[ã0\1c!7_\12\8ag_ç¥\1a¼ã®3êÁ)¸\8f²7cÅe)ÕzÎ09Eªî8eÑÚr×'½Épÿòö\ f®\1fì\1fâþ¸:¡æîl´4W÷Å\89\ 3É\1eo\1d \90Z6\14\92\DÝ\ 27§Ï\8dÙ\8c?&«é\ 5\95FW8ÿ\94]\9fk\ fÉäÃ\8fh\ fÎàxx\1fçF»VºK\ e5\1e\17J#¾ÏW\18\86ç\94½¦±w`ç2/øå3\8b=\9fc:£\ eÍt´\9aÎ,¾\97-óê½]\167¡5\8bï
+ÿEö(I\8b%Ï>¶Ä¶\87áõ¾ÜN½\82¶¶HA¶óñV0eþNé\ 6\15\83â~0Û\9b\81<½,-Ci¼Ewb\94\8a\a\89Ü=}\11j/\9fã|]\8aG\852               e¤Qä«¥r\9d\9b2Õlj\16\97YæµhM\87\1f\93±\87½\87~\1e|\17\ 5``\ f\81Í<ç\83ïe¾\19\92\1d\9aãã:ÃùË#\9a\97Û*ÜxèÝ66ób¢9Î\91U¬Si!\18϶\99\1dis'\10ë3a7 §W\8c\1d)Mm M\8c\96\0ø¶\eo\9cÕy$Ô\87wA,ã\1f^F
+ §\ 2\11Âj\9f\vƼÉwg\18µ\1f\83AR\7fH\ 3z^6i÷J\1fé|}\17S»DkÓùþ*+í¥\99U\7fCo\10Ù\1d@¬±Îpþrw\16Ñé´\f$gw\81¦\86Ûí\ 4\9aÍ\86mÅT\18e¤/\15\8d\9ay\12V\9d*­°#?\ f\0;YÊEU\ 2N¡9f\93¥;*.¹l\ 6\7f\ 1Óz\ 1w«¥}\96\950!|Ì\ fÓ¡NiØo;ø`P·(\9ammÆÔ^~èTá^õúbKûôË!Ñè\97?Ô´\7fÔ\8bkªðjÿ`S\ 2>ø/n\b¿É\1a\82#¸¨¬¶j\8d\0¿ÑV%´¨,qu8Z\80c\86\9aúè­"/n\v\ú2\vJt\8bki\8cò³¹pÆ$\87Wl|ÏáÄ÷Ìv\9aþ\9déUÜÏ\90*\18Ð`\98\13\v4\87\8auÊ£Õ¬2¥\7fêª\ 2\9c9YÓ\1f\9bÞ­\9b\1e\97ê·Pí©IEîÝÈ\9bCÖ¬\9c\11fÿÂ\97ÚâÁã\95ïjÓ¦Z\86½u¬¹éÓ¹©nJõ\91\86¦\9dTY\97gYÚN¢\89Ru¼;\95\88ÑxÚá\85j»£r÷{ÅdõÉ×eLá~\1cÒ\157\180\ 5íMó9>¡\ e=\ 1í\9f[\83*é×úDï\8e³l\ f\9fÌÕî"xl\88\ fN<\89å+Â\88åå+\11\1fl\9dõlº\1dñédØÝÅ  ø/Î\8b×m»»\8cÏ«õ\8aÈ\e«Q8_,[Ämº\80z\1fA\95\81w_\82ôRit\14õ\ 2\1fØÓ\ 6ß,¿\86ìûö\990ÖÄ\9f\ f\1dá°\1a°\15;{ê\9b\16
\v\98{ÿÒcb2 ûpïÑm\97»o¼Ù""¢?$HU\9dvìçeÝ\81\88Æ­íF\8fbÛ½}Ä\ e\84\94­Ý¡¹kJÏ[ýå\b\ 1#÷ç\9e\1a\a&£¥é\7fE]'\9f\vE+¼m^ió\ 6)"\93a\8d{je\98\89­\ 4K\87\r\rb8¬Nø\ 1×ÔUºèó\ 6\85=x·¯`ü\91\9cÕé ·(·Âî\12Á\0"\1eµ\8b\ 4À4\9b\9d\9cÐÏæ³i³kUnyp`·\8aB+ÀOÅw\ 1?\81ÿ\87®û\T\14[ÛF},\98³\98ÈA2"\12DE$(æ\8c\82\9eÿ\av÷ªµ{¯÷Ï\85U5çô)&Ê\187\ fÃ\8fÔßEêbPk\ 4«\fç_läjnå&Of¹\94äÈ\9eE3pj²\13l<¹\92\14§\0'\14\13[D¿Ã\90\97KÖpImy¶L\1ed¹M¶^G\82\98à%      OO÷:ö\f\ 6Kôí4\ 2äãW÷\bUnÜ`&W\8a¡5\ 3\96\ 6[¢Ù\1eÔ]\96è·Ö¦ÜS¿Çy¯ãR§îM©Vº7¶%võ«>ïêá2kTîê˩ݽ&îò\ fAÏ?»«â\ 5_-º·ÙÂJg\16¦>jæ\94ñ|\93g%)÷B9kþîÐ\9bÚ½\82\9b¨\9f ñ!¬ D;é"ß+A!t_\93aßZ\99p)þ]^\85\ 4â²\1eìÜè8h\96òQ\1f¬\15\80\9e6lÖ»÷5\vw¢ÝLè Íx\ 6Ægi\ fÚZ»\bÚb\9f\añçr\ eâ\87Ð\ 1qÏ]þ\vש/<û8,­¬\ 4ìekB\1aáDÕÕéS\91äõÜ\1còwb\892ùÈé\90 ?K\v|j\1f¨^x$\83V·Xî\9fî\¯ß\81¦DïVxI=}\r\1aÝg\15µ»ÓÝxÓy7ís\aSwopyKJ`\ eêuÛù\96}Ðs+øDz\8b[Ia«2\1aäZ\15\86d\9bá%\9c5E"°\9bboùo\1cþ2   æ\90d/Í`ú°&7®8\19y\8fª(hh\99bVß\16L\9e¬v\eýTj%H\ 2z\9f_\aq\83{\82\94\97{·ýv·Ðf.\93v»¤\1dÐÖ\86¬s-!7T[Õ\83»hî\94׺)\83½K³\91̾\8d1ùh6À<MÔ5v§Ö{\15*¨Ýï\95Oí¾\87\99\9a  \aVm°\ e\96µÁb\99½n²íò\ f\8b\1e\17ÿÓ³/\8b¦âÄ\8a"\82\83\92Å%IµÄÅ\0Ã\vv\13\92´i¡7p\82\18¤ûÅGSÞMîµÇv\10U_ÑàS\9dûZ¥\8a±ÇnåÓid§µt;\91*ËÏÙ¬\90«\96WÉÉÓKÙk~\80òð­wËÅ\r(\94ÖÚ}UâIç]â©']â^C£Ä\ 5ËU\89\9bOSTÕù\83E\82ÂR?ðál\8c\89xª\²\9b\96Ø¥\9b0\94ÒÉa\18.G\1dH.½ªÝèö\ 1ÚA½ój\9cV\93[\rvòçJ.>ÞJB¿ô)       $]*î\ eZ+å\ 2\17åY\9b)6Q^)\9cÊÛya¼­\87\ 5Ð\98Fù+T¬æ{ª\98\8d\ 5r\8fny\92\9b\82\85\ 20\8b'\ 2\80\86­eÊ0\0Ð%æÿÁ\90\8aÉb\1cKÅ¿\1aáÙO¿ÇS\8aÚ'1\ 2@ ¨\89\82Í.zï\14\ 1Kê7zñ¬âT#K\aË%mu.ÊCáT8÷Ç¥Bç`7òF{ÖÎY5¹\v¼G\1a\ 2\19\95\12Ë\0v¡¬\94Ã\ 6À®ÃWʧ\ 1\80\ 1°ûØ\ 6p\0\7f\0x®Û\ 1ðÆÐLI¶\0Þlf½\83¿í\ fuV\81§rmÊO8lÉ\8aÔ±0\1ab\ 4¡ \83\13K\83\9då\8e¬´ê\87\165\ fq%ï7\1e¥ZÍ¿\16Æoù\92{Nü(\87ÄP>}¦Z À÷½Z
+ÝJÑz¿§yÜ       \0\7f¶ù\94\89\ 6\10ù\9c\v\10\rý\ 2\10ÍV1å\84dËÞ¦ÿ\80ð{\80@\eÙ\ 2\bg\18 0W\a\b¼æþA\ e{\v\9d{³«\11Ý0\83´ÖÒ\8d\1a\9c\8e\ fÝ¡ªËfS9¬KÕ88\7fÊe´\1d\15\9bûã#÷¸£\17\0/@7\80è\15\80ÿ\ fà\7f\ 2\9d²ê¥ÜÑ\7f²Þ_kï'[ÆA=\ 1\ 4Ô*üÕÚûëB6Ó\7fCð0[\8d7þ;\9bF\9dî\1fâo\ fÝÆ_\ 2\rão­¹\8e?æÃ\8f?\850\88\13n\19Æñ-¼Ä±ôJâ\98\1eÖSNH\1c\ fÓ\17a<\9ce\8bѧÛh\11ÇL7HQ\8e)Þ=å\19Ç1ÛȧPÕ\14\vLy¢qÌa|Ê+ý\ e\9eÝ¥\1c£8\16Ê@\8cï.\9fÿ\93ìi~\7føÚò.\85MKÕ\88\ 5
+i©ôÉ\8f\93Ó>\8c\93\11'8\97\8f\93\8aã]\92\96ê\12i©îj\12Ç^ÞNÁÓ:-e\9fâ]S\9e¯8\9e5\80\14¦òûß\8c\8dô;Çg(\8eÕ>\93rµÒ*\89ðý\95\85ëËï\10Ñ\8b­Ð¯\17Û\11Þ¯Ò\87ý\9brE\8eÿ\10\7fc-Ý¥±°\8e¿\17:H\8b\85\82øó\0Òb§àá\97ÜÂB\14\7f\8aa1N.åN\9cØ4\1e'\9a\89^5SøUÊz\97ò¹Æ\89Ôz¥\f¿)V)åÐ\88\13¹ØK\19\121qÒ\85·Û9\99/öUÞD5§vy6}0K\a\1f§qóýPÑÚû\ 1&Àÿ$\ 1\90Y\98\0\8c¹N\1fÉ~Zoo\15\7f7rZ¾¶º¦GDú\eý\1cj\95ø£\10Ýø\83ØdüiÇRü\ 1©i\8aãþþ7åç.&ÅÏ%Î5êÑ{8®'ï"8È¿8\1d©¼*}¾\15\89\96Ò\8bêÈ\96|\8e\96ÅÑ£Ã\fW·éc¸»¾át0\87­GÏË\87\1f>.N\15¾ÿ\ 5¹kÝþðKn=\7f\93\0\87U\90>2½\ 4Pd7\ 1¬Ë!\ 1Æí(\ 1ÊD.þ\86Z=þ\8a»Aü\1d¤ãø|9/½Öûxòª\96ò³¨Q˯\9eʨºy\9cÏ\8dÃc2An÷Û\1d\7fÝ\a\10þ¹=_¿[°n\bf6®ïÏ\ 5ºât\83½ä;Æü´É{\9b£\14®¯\87¶Å\9f÷\93¸{ÜwíêawÇ¿û\7f\91äê\97M\92ë\1f\83\94\8d\97äÈ(ý#Õ>%¹Aú:Êå7¿Õ\12Ò£¡õ.+f:Ësiôq¹\97É»9/ð·\99\ 1(×8ª\99\97oR^\h²é]
+9t{f\19âtÚlèû©V\13â£<R\v\87ñdÚØ_¾\ fd÷(Òãíì>[\85ÄÜÞmÜ\8a\99õÜn
+\12½]\a\r(\³Çæf]\1e\17Ö\7fHrb\9cÖ¶\8cÓRÃÈKò\15|\9f¢\~MÉ1\93_\ 1Ñ(.ä\1f}N/Ý0\16k\\¯Þ;Wª\1fô¸\ fÎÔA\95ÖÙB3{}¼Vv\8fëVßÁýób;·nn\98ÄÏM¸\\16Oa.×zn\86\f\ e¬\83\8dÑ\sbzί#ªé\9d\81©çuFËÐÕÏbàö'¤¿zvûÞ¿Hr·FøË¡+ù´J®í'ùÀ8ü"Õ\98ù8\8fçä¬\9do\8båþ|)\ 1ÃÇñ°ª|ö\83þ¦¸}_ìzèLÍîÆ[\98è¦x7éuå¥ñ\81\84\99JPÿl¦¾Bílï<Ûù^'¹d³5÷æT\1fî ÁæWÖxÓuÞ7~´tüÅb\99/o\ 3Û\v\1dÏ.Õ%çÇb} \96\7f\9dö:É«\r7É¿øõ[HGÂOmO¯\9eÚT^_¿!¼8É\85_;Ï.²ã ü\9e£ó¦ôÚ¼\82\9d\13äý1ªW<\8dÔA×DÄÁ*²Ub\85<F\8ccêäàoW_®ºîl\99\9eͼ\1e{»´è½\16üW¯ÌwÃÞpv\9cØƬýýzÖeuÏ\96\ 2³4z·´z\85Õâ_$ù9\12üª|\8dr_ÿ\ 6D\9c~\ e÷[åÔü"òñ\94\8fÄm" Ê\86«ö\16AóVX{:\92\9c]èq}9ÉÄý:\80éU\96\ 5ÕÈzÕmvkô\16ÂQAæû²BÍåp!ÎN9g2\ 3\99ôxÐ67\7fú¨WÎSó0ú\9a/0×7Ñe86Ò}º0\88csi\0ãÂÜ\0\7f\93äOT\90\14ämv@ß>\95ëì,Õ\8bÚþéÇüöãÑÃm®{%×¢#2~Gç&.¼á\96\ e\87Ë¢\O\8fÆòû9?änßÙ)Þ\14­ëîY}xÕ\99N'6l¾î>ebÍ\8d`,Õ\8bf\0Û(ûÝèÃfu£\17NÊSã:qm\12®¶üD\1c\r­I\1dV\17\193uÿæ¦ÿ")4\8dðyݬÜkñ¸\9c\1d\ 625ÚR\a\8dÝTå\0\v\ eÛ\16ä\19Â\ 1_áø:»â±dÔµ¹ØF\8e;o÷¥Ðº]\90Óô¹ïFæ{]ú\18\1fçU0ÈèQÕ=ð\ 1jëþ     Ò*Ê\95\9c\88\97DT\ fõ\82¦¶\14È\19\9f۳㸣\17r\8aþ¼\90\8aÑpt¥\7f<[J?zþnÄL·f\86ñ\87ß\ e½¿aÂ97Hlº#*%yS«5\87þåÆ¡Þ öºÎ\97ï\ eì\r×\1e.\1aÇîxÖ}æ­i4\89\Ónî¶\ 6µ5Ï:ã\v\ f\8d_¢Y\ fÔdû\84óêáR¯¨í^\a\1cOF}X¹\9dÉ¡2¨\8aÊÈ\92ç3ù}z\842ÞEßÒç\ 1Â\92ãÞG\92s ¦\19\86ä<y=CûCÌ5·\87\eU-/\ f÷É9k"\ f\17\ 3µ\90\fÝ׸\8e¬\0\18\e\7fÓ\99\1f\9f+ÌzÔVÂ\14\9dغ±:  \v\9d\95 O«\95Ë»I\13x\9dÕö{ÿ\18wïËX1\9b\8bü(â\16µ\11²õº2î;\98´*\1fx)O¾³¸;=\9aú\9eXb\83»ÀoG\1d\81¿Ó¢À\7fï\86 Tc]Ø\b%-cò\87¨Ó¾ø×ÒàµÜ%\ 5e²©mÌ,\87\ eèÕÒþ K®[mÏO$Ý´¦=p`&\8b^6[3\86\ 5PÑB21'r|Zªàtî\8f{\93ÑN\81dò<B¹ÎC¶\9dV"­üjAÊ'\8d\86Èö»\90°±\98!¿³\951/÷¶6w´Z'nÌ|êÜ\98}qÜXÕ\fn<\9fiÜñågã´l«þá©_.Áy\87\ 6öÖ­ jpz\b¢û¦Ü¡S\9c\1e\90Å¡\11µgý6P5?\85SÇ(\ eN\84\810iµçêX\1f\r§Ê\94\87\9d\11VÈù2\91ܶ\12ý\gCu1h{O±¬í\0¡6Z\95yù|ìr§jDpà¨!³Ú\9a\9a1\8fîvÏ\98\ f¥È\98OuÈLóÍ     ó Ð\14\89VÙÞVþ/\1eðÃöO`\8e\9b\87\£4öõw/Ë¡W\ e\97Õâ\16\9dw\92Uk\8aí¦\ 5\95\rML8X=3Cfl\0ØhôÆs\9a¼\8cÎ3ɽz+18\18k!Ü0;¡^\93n|«\88¿9\15§\vìu5n3\8fù\18\8fÏ\ fçÔ7ë¶\eb\ 5\97|îK/\85
+A'\97«:ÄÀÂ\ fe8\1f7ÿ\8b;\ e\ 1â?ÓM½}Q<\v¯ \8ew\15\87\8bcw\81ZQ]k\19Þ\1c\ 64       ÍUÕÉèÝ\1d\ fz¹lî9ZÌ\9f\82L\r¶c©x5L±r\90l¡¾Á=¾å¶·\9cún\9cYýö}0O¨\96c`\15¬\ f1\ 3\1aÐË#;¤sàJ£\86FÞ§\8a\ 3\8aÐ\16£\86îT¡<`¯f(t\8ex(Y\ fT¶ýqËó¬¿[6\1dãw\15Â]ìÊâRÈaÃùeeaS\9b\91ÛÚ®þø¨\93Ç¢¨D¸Õ\1aá§\ 5"ç%c(nʼ$ìr\94Æ+vÃJßnK+ööÎo\98çí\9e\rn\19¤q¹\ fqðò¡\1dñU¥¼1У\8aa\93"ùº \12[eç\12\12\b©3\81\89í\ 4\93ÉÊY\1f\93\95÷\!ùÖrô\87\8bÐ,»Û!61ü\9b;SVTô\12mY\81³û\bfæ)=\85Ó\1aÑV/¶\1e+3¾\vÈßW»*ù\ eÒ\17\ 5\16!\85f®Íó`©­r= d±\83W´d\90ÛÎ\1fâ\91\9f\9e\92ÁÕ\95òë³7UR\82\12Y\15B\90\90Ü\a\8e\1fK=\ 5o\væïVùK½ûÀ&Çî\0\15)\ 5\1eáÊnøCþÃé\98\9cVaEbþº
+á°ìCZ\80\9b\ e\1f\1cû\85ÑÊ\v\86ß2}\¿Å°¿*\b{&îðj-ή{rz1fÙi5\1e1h°Ñ\86\843\9bÑnÞv)?\19oÈÍ\93=\91µ6û$\9a=1\87\8f\16¦M\ 2\f½ï^"j\8eØ\ 5\12\9d£\v\12]ó=\14\ 2Ï\ 2j¦g\86\f\19½\9fà¿È"Õl{\80.ðb­ \rÝ%ªìxY[\9eäy¿×âL7j`Z\8bKÚò\90:Gb½?¸ñª=ørú^®³Ó³\r1ó»O\ f\97/_¢ÝÛL¥\82ãxJ\86WaIÖëì\9ah\95Ðì\10À;5è\8eéCâ\8bNy®\8e¼Vs\ 4Á
+\ f\ 1^òÐ\f&«÷tÚ¼\8fº0\99sxxIå\14\7fKpb\14ÿ\8b]®y\9bù÷^¬¯
+4¡.NÏpda§\ekT.¿\9d¦\ eònKâ¡Ê\873øã\99y¿\8eïáçó*\ eóM°C3*KP¼Ár¤4&FÄáÊ\1aøù\0ͱÛ\ 5t±A\rÜ¢H±vA\16\81\1d\1a®À¹@\87 ¦râ\ 6kº9\1dðÍcv×÷ ²Þµ\a\l°)çÑ`ݾÉ\19Ò\1f6[ðÜø½Ñ\97\9bÌû\97éÈô¶\1e«µG+T±Á%(6N\83<cËÇ\e]\8aÐ;U+\v_R\16Ý:q|&Y[\ 2~¹$\14Þë\97E\fB
+*:³ËS$~\94\97ð÷]XÃt·|\82X¨ö\1alT¸4¨Þô~_\1e\ÙÞqÞ3{cìr赿÷V¯½W\98^Û]Ë=å±ý!ý!k\89×ʸµ\1aV}sq6@ÝÂG\98¬ïX\9eQ¡®\8cʬE¶ù\9eS-Ð\ 1·y\10\9dZxÀ¦\93à\89ÁD¥\80Î]²\8d|\8a*\82\90ü\92\81Ý] ÁÅæ^\838õ:\1f\84Û«;¨7\81l\9cÖou
+\8f\9e*uÒ±Ùq\ 4vûà\89îL\8d\9eÖ\81\aÇm\a\86â\ 6øZ+4øZleð5ñ$ðÅ/Ä?x¨×\98\82mÍ¢öC3ÙnE\9e\ë]F\ 1æMD8=\8a¿Eµ?HT¤êÛË\eCZÁ  fÔþ\ 5â\rø5ØFJq Í¶íA\83« }eÛgúmITz\93£jtïà|Ù\1dèÁºc=\1f\170F\9b_\10×\87\8d¶ó\fð65\83Ôv\1e½¬[Þ'Ê:ºZÞÎ\1a\18z+·\18ÈKi.¤?ü\15íw%b:]¥\83J]\8e\18ëîh©n\850\87\16Í»~   7A;\86}S=÷Ç\96µéBSþÔ\99\17­¨\83®£lR\b&B»\ 5\12{\1c\ 2\81©E·]ø,·é¸h´\v6æ´8@Ý7Ãa\185ÅR§ÒØ\vS¤1ª×F\8dæó\18ÔO³K¥~Â\14ª>¾­åúxëÈu\90RÄ?ØÇÂ%\8bTÿî\86ÿª:õ(Aæ;,Å\ f¦ChXº"MBÛ±%ÄmCïAó\83]:ó=\15¶Ö\ 3?h\1ctsßhçü[ýì}¿õ³O×ê\13ÖìÖ»à\9d¨Ýn\r¡f\18¼^\eP\87,\17¨ZAåTE8\ 3¨ÄÕJ·²¸\aB\ 5\9fÒNÙ\89Û\9fò·Ü%Ê\9f«1*\7fBE.;$.ýa\16EìÜä\8aKc¢_\ fÊ\88¡/\1c\7f×öøÐ\8f¶=⺸4Ð\}\9fÝ·6hÍ\83¨³\10¶§Öú\9e\ fë\17\91öªh÷á\95é Ü\94\82ÎõX
+º`Tbïb¾T^\85Íb8,À)2W\14\8b;­(¶)?}#8Ü\v{\9d©\16\ fQhFs#\7f\9a\v\97üiag/ÏüI\eÈ\85¦M\8dÿÅ´à^§\9azªO\94|­!
+\1aÛ¤\19ú\v£dGI\aº¹m¯:hÃÍo\a\ f+÷Võ>8Ô{¢¹©,»/·\14\ 4S§Xw¦Aþìϳ×M¾[\9e\9fs·ëã\9d3\8cz!7 Ä\16`ùé¸\ 1Q\ 1\ e\9a         ëö6e\9b\0ÈfÒ\ 3\90+9\ 2\90[m\r ÷r\11@\ 1D\ 4\90Ç"ýºÇañ\a½er\86â\øìÓã~\919ãNT\82\9cô=\18Ícf«\7f\19q\85\ ePæÞMù.]jSq·/{@m]ÜÎOA¡-MýÜ é»\0ÚÇÂ\14õ\ 4 dø\0P©ü\ 5PcT\ 3PçÚ\aÐ;Ë\0\9b\ 5°\9eµ\ 1°~ë\ 5\e\ 40i/\ 1\98¬y\06e\12\0³p\ 4Àfý)\80ùnð\87ñây\98\88ÇÏNdÉáuH\9eÃ7\86Ò\85¸××Üe\ 5¤\13ýÓ8Ý\9dGuAå/¿\1cº'\1f\8a\8dum\97»\1f§k\0]\92é\ f*Ï·\7f\83¾.\0ÆõÒ"æz\ eÀ\82}\ 5ÀÞP\ fÀ\8b6   àLºgqëæ\ 2¸¯?\0ü\ 4×\ 1ü]\18\ 2Dñn\ 3DÉy\0\ 4È7~\91j§B\ 3\ 4öZüA\92×¥\11»|Ö8ª\8duHtµ§\90¾Þ\a\9a`\11½\15\1aÝZ.©¬ò\8d{Iè­.\ 5\90ï\1d\ 1ô:J÷        èîÒÿzr\ 2p\88\r-?\7f9´¬E\0¾zåÿʨ      `\f\ 2D/Ê\96s@ø\14Ï\0\88A\7fýÏ\8a\13¿.d\88\ 3\b$ïüº\90\ 1\ 2íf}È\8bÎ\1fâÏê´\8a?¦kÇ\1fh4ûõÜ\9e0+\8e\93·\19Çäy\16Ç\14¹MÙGqLc\95\94 \1fÇÃæ0e¬¤\1cÓ/fªn
+\95~\1dc\9cS¶Ï\94Ï'\8eÙn1Ej¤¬Óoã*TÊü¯\80\98ï\ 5±]Õ.)Ñ_\81îû+o\92÷ªiÇÿ\8bø[\ 3Üøó½.Ó¢\97óøSÀÌ8á\8aF\1cosó´ÄN\90âÞÓ\12[\85\94)øW\ e\r\10\98²ÒSbû\9fX\9aߧ,®)çWZ`        HÁ+1\1e2­÷ª>\81ÞÔáƾ|\90´^Ì5ؼJ\ 6p\8døçãö\17Uk\7fý\91u©þç\ f?â¯P^Å_ü±Hëu­ø#sFº_;)sÑ\89\13ÌÝÅñí\9a\96jÖÓg¥¹_\82\ e§Õ\81Ì?ûu7M\v+­R\90Ml\97ølÈñþ
+üõMíùçËoII´é²¹¨jjµ§ôÚô\9f\8d\ 5%=\94¯3»_è³\7f×
+ïí½\e\9cÃ{÷ôÜÞîê!ü\17ñwS[ÆßÅk\96\16ë\1añgÇý~7\9fÕ|\16\7fè½\17\7f\8aÀ!NÖP\14'\8be)Nðk;Nz=,Åäc{ï\8fc µ3ßôäb¿üûÝ{\95\9bÇuTëlvOÙØ\9c\1eÇhw\7f\80è%¾÷ÈkþfúµÖõU\9eeSÜ+*ÆÚe\99\v0SÂó°LmÎ\85p°>\17®øæ\14èÝõ\1f\12 Ô\¤\94ÓRÏW#þN\ 2=þj\80\1d\7f h\13\7f\1eì9þ\8c´Wü\81\1få8W½¶^A\10f\17V"Qr±çh\1c0\8fS\18\88\8fN}¯ÞuådÞ\1e\97ëâ\ 6÷\1eîõõ,\84W\f)\1f/K»y¿ä\0(9\ f\87\14l
+ÄáP\ 4\95ô{\88ùÎ(@Ëí\93+Ø[«\9c\8ePàëc\11¾õ}¶2lø\16\83Ù\8f\ 4P\b\97>\82\13=\ 1\180}\84\10NZþx\93îsÿòö\8bò3Ú¾\9aÉã|8çï\83Ú¢r}¯'­Ëg7é_r§     vf:Öð´6\1cñ¸\9dYÊá°\9cdñá\9d3¬ýDq\9cÝí²^ï\ 6Äû¼µ¼V¼E\18§¹ù\92-ví·\87z°éaVPu[S\7f7,N}¹ð6}éu3þ\90\0Ïñ2\ 52S@=ÉÕ5;Éål÷¯T}µ~        g`ýÐ\96Øæ\86voû\v]±®'\ 1d^\87\ 3Ò÷ Zi\aµj\8díl\ 1õÒ\83\89ÀB\82¦éÍ*`ùM¡"\8cÖþvf¬Ë\83\8d\1d\b³Kàï>¥\8b/oͼ7>5²\v\92nÏa¤Õ4o\98Î\8b¥t\a\r\e\93\1fËDÌ«\7fHr¤¹H¡\8d$·4­$\17ú\8bweÓ\9b¿Ä=°¸Oµµv¡££z\1c\95\ 4k÷XCÞ\16\83 ÃÆujÙ5\82uà×â \fëy\7f\7f¨TüV»ÞòT­Ó÷:=\12sõé\90^=Þ¢¸\9a.\96\9aóú\86s\a\e\ 1\9bå§%<\97¤VhÙÅ!K/¸µ?\99o«Úx.ÞÇãyÝd\95y]&F?Ò§ùmÿ)Ð\9e½«\fmÝbfÍ_üæ\97\92F\9c9\1fÂ÷ý\95H\86\ eEÊëõrhù\87MgåM¦ý\9dkLZç\95e¶"g1¯\7f\96\9fO»¸¤\ 6\8dê2\17á\1d\9bA©lȱX/%jQÍM\84ùÖÛjóFé½\9c)b\7f?k×\ f\80ÕEEdj,O\92\19ÕO\8ai\1d\ 2ÙD\94¹\94!þ!É%»E\92G¿Î\1d\1dt\94sع\83\96@èn¶V³ë\9eÛ\98ú´7ÌÁêûÇ\91B»÷\95¢¬Ð\8eb-¿\91äÚ¾\8el\16\e\v9-ª\97Ám.÷ðxv\9cÒùYûLT,­Ë¶§wS\1eL\a§1aFê&}Ö[d\186Ôv\r¢°}ê+~\92-\98¡ç\1f9Vcá\8a¤\95\8bE1Cø\17¿*\9f\9aü2¯\85Í[9ôY\9bÞ\92\8b\10Þpì³µ®)Ý\8aw-ì\1a«y~\ 3/Ýþ\86µË\9bÍx¾\1fùÖL­þ&ì\96^\90\83é\83\eïÍ\17Å^LÔ\17"ÃNØ\8f\ 1\90bQ§=½¥\17\10\17ÒXûDOÂ\1c0\9aÔ\18h¦îK\9b\83ÚÔgõñ8ª\12\97\84\f^¹²\14«\Çü\7fñ»\14\11 þ}^Y\1a§CÑ\90·\8eÒ#×Û\80\1cø\13Dj¸Ïæ,ï$Q¯l\aÏ\1a8?ÔjøL=\83Âô  \15\r&é/î°·\8d\;}Ó+ÖÜ­Æ\8d\82ó$\»ÏI½\1a\11½Í®F\8dOÁ³=îT\8b¨¢Ó-vô\b8m4å\1e\81üº»yy>ea\19\e^8\19\eEl\ 6\931üCtÜÐó[.?2~yyX\12
\7f¡\8a}w\ 6\f\1a\8eã\10Ùí
+6\ f¸¹yë>ªZ\ 67\1d\98ï£N\19\8e®\8a\1eª\1aß#­\89ÔêتR-ºã³\Ù\8e;Añ¤ô·¹çÈÊç>ò\9bmWel9èHNN"$Ò;(¢Wn-Åáõ\11\89Eã·\18½°¦i6c\98\aòÇóÚ#\16\97\8a^×v¸îsëÆËÅ=\b¹õ\9dÕ<®ÛB\19\0æéÜ4\9eFà§`â~±­ûõ\1c¢ñ\97\1c3iÈgQmsÛì´6îJÞT\19°Æbd-'\9e¼ð¤PúÄüI¢\b%\12½©\99\13\8bïMSàñ\18å·nWॡ3çÒ\97ç\99;\84ý6w¸¾hîð)\ f\fò\ f\8f)\ËN\ 4§\83ûÑB\9f\91YÿZÑñU"¬ûKövoÌOÀ        °\ 6Qø0¾\9eúÑÙ\9eU\9bìÖ\8b¾:¦\rbÜý0Ì(ò\11I\8e\97\r\9fUS¢â¼-úÝØ\15KÓüNàÏù+¿ë¶³Kß|CF«\9cr\1a÷ÙKgð]³j0wh½gÌâ¶Á\98%\ egîJ@g\90\19Ä\1fî\18\97Ì\ fÆNR6\82\01ÞC\12\9dZ}»\9eß4f½³ù5   \11Î\92[½Ü«¼&òºQ\1c_\9bÕ\96bÞªð\bµ¾¤Lh\11'Ñ£\9d$²¼­
+\82l\9aü.Ðl¾Y1\ 3nLÍ\8eìÅ÷#¶\9b\9c
+\8cI\95;ÃÈ'È!Z^©tz¶Úж\8cTèøQÏ2\9bt\8b\11C\94\18\91\19¿Gø\8f\e¹½Î÷Èi\90µ\98×\18w>Ãðåºh\fægpÖ\98¾«* ³ït^Ð\f\9cûX\1f8_\ 5J659ñ6=É\15V\98È\15eJ\10¾tÖAÌï!BæNXoÂ\81\ 6h±Z\ 4¹Ì\ 3\84\f¤³÷áì9ÍÑöeÞ   \1dÀ¨Õ\93\1e\15ûT\ 1\8d\8b\14\1d\9c\11\8a^\17   Ê-¶ð\fì\ f¿\v;Ûïí×y\1f\80o\80Y-\93\ enKUª?3H¹a:Ð\10\98ìwÎ~Ü\1f\fΣyØ}ɤ\82\16¥b\ fm\8a\15\98\18ðû{\13ãN'\80æ:\9d²Èöë\ f\85\99*/cøÚ¼ì!V\aÖô\92)\9fi`\ 3e\87\0UØs5\92+N!²¼)\88D¨ù.!öý<\11\1a\93\ 1'Ë·'\96\81þá,-9+d½\9dä÷±\aãxb\8bX(&>°¬\83Ð4\18\15Ë\8do\1c³\e-Úq\16ÛI\1e¼¹\89Ü÷ø\15¤\16\95JÒá&\8d\ 4a\8dò\95d¬ú\89\1f¾\99P¦?\82«Ñ¤ëÎ)¯\18úT\11?\1d\ 5Þ\84¸¨\94ñýwØÇG«=\8f·\86¬\8d\9d\17\83^\8a\91\1d\ 2øÈwÐ\fä\ fÇ\vS1\7f\17LÜ·\142KÞÊ\11\80@¿0Z¯:­Üè\1dåCÉsåµ°Ý¡G^\99³/nâèEÖðç-&*\aÐ0ÎÍqú[Ò³Q'M\11ªHy®®\92ë\858%+_uEHôr\8f\1fæá\13;;Ï"ÖyÕ»èm®3è Z\9b¡\83Z;F\a@ÔA\r\92A3\10ô¶Tþ\8býÌ\h¿«%+g6Ïrh[.~È\99\91_\18=\19[\9f\9c\9c·\8f¡ W\12\87ÓÀë\965\aÀ\9d\89|,7\8cC®N\7f\ f\\97¦Û#\94bkC\8aÜ\8c8\81¬®\87
+ÑØ\91&>.\90KìÂ\89!z§F7t௳\94\ 3\99Ur \1cS\18\ 5Û\8d×\14ÆO÷'l\17w l\97Ú(\9cN\1eR\90\87­Û¡&¾Ñ¢%Ç\a\97Ü\ 2Ä\9f\94\85Þ\ 6è/\8cV{\97g^\fk÷=§\1dC\87\99=õléÉ!±\99\9eh·v\8aé\82U¯Pe»\ 5\92\87\89=Ü'ðSú;ÄA³.aÚ«££æ­2C^\83~\80 cò\f\13úè\ 3­\9e\87&DÏàôL\98\ 4ÚÀÿln\ 3ÿ>k\rüG\1e\85
+µR¶ªU¶\85ÿð»mÃ\8d« ´¬ÕGܼw\7f\ fM×û"¿0Z\99?\ e\ 5á\90k\\98yèºt±WwÉð]Ù\92u\9e{\12£\9d\95ÃÏй\81wÔs\17ÓÓ\ 3\1f}\ e>ô¯\83xüæ\91ôô§ÂË(gÁ9°âAC\1d>\ e8\8b\8bûáÅ©õE½\8eõöÏ©Ú;äíso\7f\92\e½}pG2àÞ~~\84þ\10\9c\85ÝxE7Ëòâ¤\8c\ 4k~Úþ.áUì#¢\1aÔ¾-{\v«ÀO\94î}\98Ï\ 5\ 1¡¨Ö\f»ç-\1f\e°\87\13\1au:    \8a\18T     YDJ\vÁg\ e\ 4\9a\80óä\81\9eoÊ`\1d?Íþ\ ex;ý\ 6Sßõ\14\9b|u/\80ó[_ Ë\14Ñν4\1fw\8cPØw\f\87­u\fã\82t\fi\aw\fÊ\87þàYom¼\fÁdôë37=Ã\18j\8aë£\8a]\9e¶Å\9d,\15Ù\99ÐxRµR\10b¦³°\11 ßÍú\ 5à\ 2ÒÝ@AɺCeaû\1d¤\83éê@8\f:ý}\e\87ûM\8d¡z§\9e%öÀ©§uµ÷Ùî<\88\81¦ð\ 3\9c½\17åvBäàö\12\98\8eÚ\84ÇnÛÄ\8c­µ\81²\ f·¾\89\rµ¾W3\eÜþ¶?V«»<Y\9cë\8f±\85Ã-Qß\81\b­\9aüø¿Âèá°\10G\84*\9c\ eÈòè¹\ 3q½±zêËv»7l³í\1aÕê£ó\94\aß\8eÕ\94+\1dø´\ 2Á·zÏ\8e4p\81·\99ög\85\8fÚ\ emXí\p\bZÃoîÚ\Ó|¡É\17\9eýÆ\96çÄ\86T\ 3\83\86\94\83ª\rñ°\82\euFKAdè\ fKqNë3K\9b*fÉ9\v\93˳D+\80\964\12N»O\8bYÆÇ\ 2y\906/\f\81÷g\88×-¿{\87ÌYûk½¦-¶vZ¶J\87¦¹±èkS@fI³\1a\9fJ\8dݲÜnÈ$
+7\9au\9b­\1f\ f\91\9a\8eB\avír5ö5ͨ|«÷h\92¥\1cUs^çª\10öp«P¯P©BÀ\18®DS\16©D#\ 2þâ;\0\8d)]$\15½É.\841Võ)ñÐ\9e\ eØ\85¤4¨]q\À"]xÁåÂðÔÓ6T\0\12[aÑ\14{n\16ÛÕ®÷\8eQ\85Õú¢òî`~e~Ó\8f\15Ì\b\9få\ f\94Ë\95\9d\ 2Ù(\93Á\1c*ç¸Ç°\9c\9bÈzÉëÞýÒðÁ?KE+ß(®\11gXä\12Î.r·i¡\18|!¸\18Ü       ¬\18ì ôGú4¿­EÔ\ 2ͨɹ\91
+#mN®8M\9c³Î\95\1e-ôKuÜ<\95óp@\0Qïzx\1fAR\8düf}Y^Ô\f^4Ë_ð \96\98§g\14v¶³(Ƚµ[h<Þ»üÑêÜócDüf\91*X:Ôs\97°\ e¥Ìù\¯þ2\81ûQ\b\ 1\7f\0¨³ê\ 1P\95\91\ 1¨'\1e\0¨Î5R®hJBüÁ,O¸É¤O\1a\7f7o\ fö*2,£F\a\7f¬´ìå    \a±ðíݤá\1d̽ñ]ãX\96½j4      \16e\1a«\98Å0·Õó'MÒ\80é¤=\ 5à.b§(>\0ãç#\0\vý\17\0kN     \80\97õ.\0\87Ë!\0ß #å\12\ 2ð}ò\ 1à\a\9eÝ\1e\aÀÏ¢\92òØ\ 2ð«ÜJÙ0\0ün¨)íÉ\ f­Ã¾Ç#o\15óüݾ\12C6º\r\88þäÛ\86×ʾØ3¶î»íÃ\8bs\ 3,¯6UÔ\ 6ÜRÀ\r\17Åú >ÏÝ\b+»ô\r Ce
+ #g\ 1 ÓO\0 ^\7f\ f \87Ñ\15@s\8f\ f\80
+\80Ra\1f@M\82\ 5ÐU4\ 5н±\ 3ÐCç\v Q\11N¹j\0ú\9a¥\7f÷\96K\0\1a+\1c\80&E+¥µø\91u¦PÂ@\12´qoÈ\14î\18F\18\87\94(¨Þ3ñ"Ðf§ïG]\aãC\85\14Àu©2\ f¼ü9"W\0²ß¦?£_\\ 1¨Øñþ
+|ÑPܤ?w\7f\ 6°J9\ 20\8cþ\ 2\98\1aV\7f9ôº×\a°·?\ 4p\841\0\9cÍ\85\0>\ e>\0>\1fõ\0|M\8f\ 1|ÓÞ¦Ü\ 1\0\ f\8d>\80o95ejþ\10ÇÆ\8cgÜÅ\94$n\9e\ 1!lÅ\ 6\99+µËO8®÷U$K\aË\9e­\1d\8aÒ»ùO\ e­Ãþßq/\1aî\ 1lü8\ 2XPH\v|\81W\0o\12w\0\87ä\bÀåk\1eÀ]0ËzÍ.@ôód\8a4JyÛ\7f\7f.\eÔ/¥¼°_\ e\r\7fÖo¨æþYµÁëý\88?Íá4þ\14úz\9cÌÞã8\ e\151\8eI^NY\9bqLõ×)Á#\8eéN1eÞù_Ùé/Rý¿ãS¤\9cb´ÿéê%\85\vNlW\85c\8cïü׿s]ꤽÿEü\91\17BBýI\9c\1cߣ8\ 1­ô\a\91]6e¡¥UVÜ\94é%­²\98ŧ£fÊõ×\80\9c~ÉP\eÿ\13Kÿ\13\9fþZ\90í\92u\8bñ\8d÷z\7f\85Ã÷½ª}³\ 53Þy¥Úzùm\1e}1\97Ï8ÚôI'ªZúî\17ä>w\88{yJñôülØ£Ó¿\88?;Õ\88?&¦Æ\9fÆGJ÷«ÇÇñ\95çÒ:¥QÊÛNëäö¿\9dF]ßÿ$èn/-°@þvíûË\13ã7µ£\8d\97ßdç/æ4^E\9bÎ8\88øÛ,-ÂðÏO)Ú=\9f\8dYü}(\9ffõ~¡Æð½ë\7fG·;Ç,n\83í$¸F\12\9fÝVz\9d5pï\7f\11\7f«º\16\7fî¤\92îß\9c\10'\91ÇÄ\89\7fN\8bæré¯öVYı\84mþIÐëùØ.pÍ7µ%{Ñ\ 6¬ÃÏ]¿B<\eV=\eÜ>\94¸%Þ/DK¹k\0¬ßîClv\e¬±å5âGë+²Ó\ f\17»\19<ÏßI®x¦îSôäC\ fñTZ\94õ#ÿyé\87\1d\15L\ erÃý\87A¨ýø;×ÅGÊï\10Ø\15¹tÿæø´èNZy\934ãä¤:q¢î÷1a\9cî/?\9c¾#\ 1á\81ÇxØ(Þ{Õ|í\1aùÇæ\15\ 5ãþÅÖ¿èùûü\92g\1aͳçBy0:±â`r\14\94îô kÝì6\9fýx:Xï®Eë¾ëiHs;\ 5Öd8G\8aÊ&Y?G\9båä6Ú\90Ý­ü/âïy\9fÖ»V¥´Þú0þòbúw]5=\18îS3­Ø]¾*ÈÇy\9cÖ\93ìwsï7ùýu.\r®\17\12l¿Î\85gé{\f\17¯ÂaDï+ûSpmí;\95Go§K/dûx\15¨-\8c\95¹ðõ\81\94\10£hs³<ÎÜM\ eý^ÖCgV\r\bõëN\83÷\94ú\97sÏÊ.K ÜI{Åü\8b\ 4\80¯j\ 2\14UþoZnV~ ÆÔn4y*6%ß,J\93.䳩\9e*æiº?KÓå®\9f\8c\82-\92S\ f!ÞÖo\e*\1d[­=×É¢¡u©è\95\83õùÙ
+ªÝwÏ\97¦9Ôo\faÆSÖCÙ½TuÓí\9a\8f`uO\aÛiµIgiÃ\10e\7f×½¡MW\ 1ê/òÛ\aù\87\ 4\98^G 0Ú˱;ú5'=®\1e\8eßÐ\13Ú¹¡X¯\7fÅ\ fûÞqWy÷vfÝÂC\9b0\84Mþ½Ð\ 3\81\96f¾¬\1a\9e76&¡{Í;g·Çz\8f\95\19n\13çU?\16\9cÙ!®-\130\ f.\89e\17Y\ 2$\9fVâYYr»\bJçÙ\82½\8aǹ\10\15«³Q\99\93È\11\96\9a­b\ 5\1e:ØôªTÐ?$¹\s\92äê=íÑ\7f:ÌÅ\9bÛÈ©\1e\aíý­³.íµh\90\ f\97ÅMy]\ ef\1d¿\95·³\8e.W×ma\ 5\89\83       +kI\8eV\8eí\9eýµ]ìî\ e\vÎ<^çáë\12ÍÅ\ 5\0ÌößZeÖ¢Á\96u.\b°ÕáfÌTß\1eÇÓ¾Éxæô]ÿ\1a\8bªÑÕ?²\87êNÓBtòed\83[\9d<)ð\1f\92\9c(\98Ïó\1c\96®Ô\ 3\19\1eÒ\91Ã`kK·Z\98×\e¹õ\9aÇ_þ\ 1¼'nÿ\12V\9cÅèÑ_æ¾\ f\ e\1eÂ|»}\8cg\87ã5\1d­\82/Ûêö¯ÞÔ°\1eYÛõt\80\16N¦¥\17\1eÆûYK\f\1cé\97ôO<jë\14±D5Ͻr\1a£\bóÉúÚxLªä®©J~\1eV\eL\ 4e\fÆÇÒ±ÿ\87¸x Ìû¬\91\93NûJDo\93\85\9e¥\83ëPTªþ©»øzÝÄ¿­\10\ez.ó\93
+°¨\ 6Åúìh´\ 6\96Æö©ôlÜ\17Ì\19ÓR\f[¨èúw_\9fét«µÒ|¾\1eh¥]ç0\11\9aé\98©z\1a}T¹³¨\8c\8fÆ¡;n¿\8aÙÇ!*\97ùHU4\1cÜ\8eî{ <\82Zt_\8eÞ\7fÑû\17\91²
+'×Õå í§:\8ao¸ ÞñÕxPua\95ú:D\8c^lVu/ó&+F\96ö\9c\14Í\97`d\9d)Ʋ5\81t·kPZ\0¥CÇ°ÃË\93\9a!iª\1c)Öø\ 4òö\18Ô\95\9eÆaôh/\1e#HÛ\ 1òì\11×e4\9d Iv¼\10$"$W¢Ûh~E:
\94k7£#\16fa6#øm\7f<µf \9dÃÑDÜ:ít\98¡\90gе̸âä¢üg±m¾Î3\15Ím§ÓÑój$ß÷G\1frQE«¤Ó¦I\1d\8c`µÕ\8fÈq\a¹°\8a®\1d¥ÑtºQå×ÙÏf\ 42ÖÝ,¤ä\1e\ 5\12    çO¢;i¼ÄÂ\9d.      \1c
+åw\9eáEÞ\9añõ\9aþæë}¬Åí\9fC0£ý/îÑg49ª«\12\17\16¿!êw­mÇùª»Ê/\87¾\>³ó-8Oawâ\199z°Ó¸\eò\98Ô}67>ër]¹)BwôÔXX~\8fPBúLÀ¡DÞ{¢è5Á±XT{¦ÀÝ\b\87ß6è\r_\1fkWî\0^s\˨µX5\12²\97\99}5æÆ\17\1f\1as\13rmæ¦UÚÙ£æ\1f\ 69Ù[ Ï¬¥@\84Ýh³è,}Ç®Ì\8fî,±\ 6GýlPÝêR«$\97µª(\97³r{¤\ 3\99¨\ 4dὼؽ\9a\92\13\9c:R¾ò@ÄR>À\ 5\9e\r\19\f\91\vUNaN\16{Þ$\1eÛÍ\95\8f\8cÁ ïás£W\87\96\90 C¤?\eÓïȺÐï\17U¦ãº\9dÑÊhþøEªéöZH*êöódé }Ãà\95½çA;l̪³+l\7fͤ<ºhüñh«mEp\95\81\8b¦ç5\9e¸I_sü\15}lT\16Kƨ)Tgb\8f\18Ä)O\fg/\bÉ°]\8d̲NÆxpú0=Lì!²p·tÜM"\1a\9föK\94óÖû\14µ\ 1%*/6\ e)q\81Ê\eL\93¢nJÊ\96¯ÿá¼\ 5nãÐ\8bAÊï\r:°ãÂLg1Båª5åÇÙlÍpûäE=.Í\85\ 2\ 1\80-\13\9d\93/å£ëQ,W
+/¡\96/æøf9WáÀÚ§ÅjÃw\97¹¯?\b\ 3ÕrÔpF\7f8:^\17Ç4Qį́\95<\SùÓôFúê§@\96îX\97Ø\98׬\83\98\10à]H\b\88\9d#\ 4´Ô 6³vý?Ô~\9c\94¢£l\84Z\81ò ¿\85,\83\ 5Ò\99«¡P\9bÎï#@ç\14ø:îYìB¶_®%\ 6ù\91#\b¡ºåå§{çÆq\98%·¬öð\8a\8cùvjÃ\17î\81CÔt\ 6´ýòp:\9d\920\14í\1c\8fn&YÆ\8a\1e!8ð\89¨QN:!\br Þät\ 6;U\ 5\ f;Õ¨/Þ\14¢FF=£\96\91],\1e@]i-Ë/j\95lÞ°½­\ eº3£NÔL\87\16sZÝ®_GX­0\13\ 3©¯ñ{½8çT¤è³ºÐ?1\8f\1a¾Î|n\88u\95
\94\95\16åª|\8f\1av\f\8c\f\fkH\96\8fVv»\ 2!\82k\ 3ßëÏì\839\8b\aL\ 5\87  zÕ½\ 6ªS\18\8dö\vµe:'k$¨>ܤ\7f\a¯j\19Õ\8cÊ\8fÝ"¹\v\ 18ßS«\ï\89,\ ef·gY\1eÝ0¼\13\97\9f´{­û/\87.\gü¡tVØ[Ë\9b2Ó»ã\fç¯í\96þð¹;MîZ\1fÊk\ eJTQÅ\9b$·E:Ķ\81ÃD}L\91øèÊóع®L°\8e²°QýrÛ!Ï~ç\8dÀÖ¤\ 6¿Ñ"\ 1Ï\93\0\ 3Ï?÷7<¿³UøÝ\1dÿ¡òc\9b?ؼ÷Ø.)§èÞÐù$(õ¦v\9bhêB\85,\8cÍæç.òÜuÁÞ\c4|ïp\8dvÔÁ\8cò\1c> JùÅ\99äÇ\87l%rb{\8dò\84dTkøáXjãm°:À&z\9b@oÏ\ 1\87</í\11\82ô(\v^L­\rôy?\9f\90£á\15(\ f\1c°\81çéæÀ\9b\99O(÷BkPîÔ«d\94!ªIT~l\84\8d\9cÝ\82åÎ#\95²·ç5:3±êÀ¤\ 5¨59å[\ 5\ 5å\9e\ f¡q{9Ì\fö&\94\8fF
+)ä.\ 6±cK+¢qÅ÷ø¸¯<°\8be}0\8d¹Tл}l \10pï!³a\84Âñú;\84       \94½\v@«á`
+å×J0`«\87{\7f\16ûÕ³\ 5÷«\17QïíDúÖ¯:\85rJ¹Ò¯\1a\ f\81\9a\9e\11V¹+I-ÆÝ5nÍ>]Ä(»`[ÕÑJQv¥Ã\93\aw`¶pó\10à\1d\9dØ×M\ 1»öX\15ë¹³9:-\1e×(ti\\90yoðBÐ\87\9c\87\97°V\83\81\85Ù\86è¯\rA\85Õ\85\1a°¯»Ð\17>±ÖÛÓ\ 3·×\f\8cK÷Äç\v]p'õ;×Qgܹ2¿\ fEí\\91S©sm\9fÊ]Py¥0×Ò\ fϪ$Ü2\9d#\ eç=sMN\81(\8f\ 5ÐVÞ½gQª\8c½\88}BPHq»­\85w,\7f\84`\8bÂ\b&w5\ 3ò\9a¨\ 3\r\1e*Î/Ù\ 1=Xã¥Ï ²j\16û[\9ahôë\ 1Ûë)\951Ö=K6×í\1c\8f\93\8eÑ©:àS¢\8e Õ¸\0í·\8a\8bÎGn/zÍs{\ 1¸Åöü\11\94Ûóý²ô\87\95s\f9»É`Ù\8cÀ\9aÏ\17\94QÑ6°zs\1eà\88\82\ f%¡ÝW¢á·\ 3î\bå´] \88í«PI
+ø~c9\1d÷Æ9wÚk\1f\v~÷2F\8f]\r\1c?;wÝütÌþ¾Ü\81òe\10\8c|\14\ 1ѲÀ´mÒT~É­w\9c·V,rhåCçÓd\e\r°Y:\9eÅf)HNÍÒbZl\96øiùopµôc¹        ]a®Û¤`z\14OiÊÔF\94\98uA©º3JltÁ_Ô&*\1f°GçöW\ e=Zé½\13ë\8aéx´"¶\97£¢Ú&[ð¬\r\9cU¿åN\82CkØ}=ZE \ f4\ 3W¬6¹¡ÛmV\8a/¼!
+M¡Q¯\99V}4\8aÂz«-%5U\8bÚµN\7f!Ô:\8dðX\ 3_Ãì>éêU\1d\96«W\ eû/\16§\83+[xz¦Ñwå.¥\9a¸\80Ȭ\ 2·þ\ e£[ù\17¡ÚÉ        qòg¿\7fÀíiÇê/G-Ï<³õCÄ\bõ6Ê+µs²\98Ö&á;[\86ºÖ\95Zûê½1¼W\8dãôS\1d\8coÕJÔiõ*\88#Rå\98ºªe»@{e<\88Òù"¯5J«Ú\80-Q\1e¶+9Çb¾äøýjÉ\99µþ\8b\99E\88²Y\92<N\ 3ëÕì\8a\87\ 2p\0$¨ò­É\90\9b]\81T\ 6þ\v\97§Á®>ñ»\83@°Z¾À)\8dfg+T!-¦ÊÀdÅ\96èïN.\r\81\92Q\f\86ÝeÊ$,rÅíµÈ\95Zßby#Õ
+¡p\80
+b½\9f½Ùä÷ÊÜÊ\8f\90;éA>§¦o\179µ90sj\8b|åNÃg-ß\9c\7f\98æ\17-Yo¢\ 6¯$+\8d\10\ f%µÏâ\r¦N5&t\1eCëô\vªuê\87.d~ÝvaVÎ\16\9fÖ}µò.óBÉkÝ\99"ßÝqyE\9dɹn\83\18\ 1Æ\98Ö\80\ 1jÛ)ñ\ 6\18`Ô-e\ 3\0\ 3\1ei§lI` \fÓ/\11\véL\88ô¿À\80\92\aÀ\80Æ'À\0\16\9fÀ\0©Ô³<m\80pý?\185ê-\8f_ç/#m©\ 2Æ!ê§Kí¦\97ê¯]\13\12\9bË{\17&\94mk\9d\97\9dú¤5\9fV\16³\9bZb<J.ì\84|zÂUÇ,\0\94²\9a¤\²»ð\0Èl¯\0heìSn\ f\0z0\ 5\0\ 6n\1d\0ÎqC\0n\14Ì\94Õ\ e\80\9bB\1e\80[]4å£\ 3pûu\ 5`0é\ 2p\85¦RLþ\87úx2\7f5osÑ\90\84haIe\13\ fìuBË\90¸/Ç]8~\9e[¼tY×îðÃ.\7fOýiqóô´ü\89\0Üñ%\0V#\ 5\80×%\15\80Ï\94\ 5 EÏ\ 5\90Ö;\ 4\10\ 6>\ 3\88²\8c\ 1įW\0$r!\0m¢BÊ%ë~\0PØ8\ 3(\82\94\ 1\94mÑ)¯9\80\r@'~\a@5EJ9\18?FÅ×\8aáÍ\9e\8b\r˳m\1f\87ÍU\ 3ÚÚz¾\8bÌÈç¯)º\ 61 W¦_ª]¬7\8a³\9c\ 1(¿\ eb\ 4æM\0q½ô\87\ 3Ï%\80Ö>\ e\80\92u\17@E,ëô]\9e\0ô\9a<\ 1¬\ 2}\0\f\06\ 1\a\0\b\0^2l\0/w.\0\ e¾+\0Þ    (\0Çg\v\0'\98;\80\8b\8d\96üõÜJé\81\92!ôÊ\ 5jÈ5s0þ\14ò Ì\1fkµîLÚ\7f\9aû®q­¾\ eæ¶\94\ e·ý\82bèÞß9ô¯¦_\ eý§µ÷\17øf\aÌ\7f\ 2ßßÓ4å\17\80Ó§,î\85\1a\0þ\98õÿYÄÁÑÿY«÷·¶pÐÿgñ\ 6jûϧ±)Í\94\ 3ô#Nü·\12'¬'Ʊޠâ\98¬Ò)¸ð\v!IG\8fcªå§,oqLWr)z;å\81Æñ\10âþïøôÿ·\82\ 3_ÿ§«·5\8cíJhÅø®·ýu©Êæó¿òݼ*¼þwÒ[(¦¥ú[!\8e\93\ 1\19ÇÄ\1dý§ÞIZ\ 4ùY¦u\8eÒ§¦þZg¢\96\12\ eÒêÊÔ_­½¬\94bk)÷yZ[Ã\8bíÒ \8cñ\ruü«UvU3^ïüÈú¾üÖ±ò*M¾\9d\88\7fàTT\9d¾§Ï\1d2Üü\82ÜÇ\91\18\1eÿ<ú\8bô\95\90u?ü¶ñ\aÊIq\12­Ù8\19Ké^%V½\94\18O«¤Ä\7f\1a¥±0%|þ\93 OÁ\18\ f\ø½ªì©w^:q/æx\95£\rø\98\r\98FU£f?¥¨ö[\r®1ëm\1eJ\ 2\1dî\17\92¾ß»Þøs3Kûúm\10ÊÃë¬~Ô.ñ8¿L©®.vûë\ðË}ùãüÕvö\8f¿ÂÝOc=L÷+\8fÇI¹\ 4DZ\16!i\89mæ¯CàO\82®\9fßy\91|F\9b6ö}îzTùÙ\98òÍG{Átï\93/\ fßî4\8fßÌ\82Á\#Î\10®³\8a£\bÉÓ/øq=;¯ÀÃêä÷Ïá©4«Ü\ f;\92)\1f\1aÞ\19ùEªå
+·o\87\1dy§Õ>â®»¿   ÿ"þì*|ü\91Ödº_\91A\9c\1cy,Nf
+\95\16-±q,JòûË\18Ó\88?·íG{vñnwò¸»FÌåz\89\85c\94>Íù;Ú}ÎÔùT81÷°rÜ@aã°Ã\p\7f¤¦½}Û\9f#;­¼$·w1ä·\83Ãu\1cÎÀò|c÷éÝ\ 6\8fjÅõ
+e;ëür\8c\ 4¾®¡\ 1K\8eÿM¶Ó¾Ý\16\e\7f\ e\92Ö+e\9f"h éNöè´è5÷.(]þÙì¤Ç[äÎùów'\8eO¾ÊM\ f;¿cïÇbÅÛiV}»5íâ1|\ 1\95[\88\ eë¯\8d½®\7f\84*­W÷ß}\ 4ë\ 2$u\ 2vn þæã\rý\9aô\19{òKt½æ\99ø¸à7h¯tó\ 5;\8fW0p¦óyß\99\ 6îÀ\81¹iÿGü\9d´èøÛy\13?ÞÌ\98\82¢íÈï¾*ð\ 6ºëâ2\8b\86.KèÝI§Í<´»ÚUb\v·Jü&¹çÇ\9b\¡:]\17+%;पç\87ÇFè×ÑÁÉ\e-\91»{®ó\89«\1eÌÂêÖ^ÕW}m×u,à\8b;°GIËEÉ\9bÛN\9f{.<å÷Éå\8bb\92ëÌyâÐ\9eW\ 1ïÿ±õ\9f\8d\8a2m×\ 6ø[0a@r\ 6      \82\8a\ 1\ 4EQ\14³"&\14õÿ\ fØÝïuÏ3óå@{ïÞ\94\bÔY\8bU«àÿ\83äûjkÉwÍ«\ f\94\89©Ë\e}BQ>)çÃuȼBm¸{ì¯0ôÚò!PZ«\10\80\ 6»ô.¿ìõ\80´\98Ãï-ß^\80\99©o>^\ 3Î,©\14¦3Á©/½/Íí<i"\9f½¼æ>§ên\ 1L6PX\99èÏ:áîy¹áB»\939>\19ÓÓÈâ¿yç¶gaÇ1\90ºCÓPÝ\8e\9fyè?¼\ 1e\95M\8f\8b\8d÷´qùÔ\1d*¬YíÚ~tª½·ï\11rÞ|wÎq]\1aVÃåÉ*¼üÛ:W\9a\a\9e\ 1å\1cí\15¨\9a4mº\98>imÉ\9e{¨1C×8*î8DÚþ\18µºëÑ\85\98\9dFÄ"ÌNhgTüä\1czCÖìIµK\ fߣ\8b>\9c±\8eo-ÚøË*<<È\\8d­\9a©±­ª   &b%Cù\87\97VÑZ·\87ªKç
+ES»DZ\82\9b\922OVµØ\ f\97á=\-\b\9fÏì<³÷\9c\8c¼Â\9b|O¶G©ìv-\ 1\19\ f\16*=\1a®UÑyTtÕa\8c\9e\84½Áð\83\99ΰ1\9f\9ct^[Jð:\99ër96µ\9dZ\18ì 1<¨õ\1fBÿÈ\8fì>¼o]{fý\92     ]=,¼\80Ýë`[ú\ 3\e\9b\15\7f\88»«\9a~\91F¥ÆÁé\8e°Ms(\95\ 2Tf_~|\14ù`ð\vOyLýI\aÐ7ãóÔ¾\8d¨ºýuXÌ+\ f¿y\ f\19\80²Ô¶\9f=÷4×G_6+H \ f:Ö¦;\80\88Û°ß\e}½Þ9©¬z¸H\85Ý\e`¾º\94²\a\8d¸\84P\ 6Û\9aw:    9;t\84´(i\7f\9b|±í\83Xáÿà\81}\8a­s%½L3?4àÀȪ\9eä\8b\v\ 6\83\92ÙB\ 4Ãi«ýðÝÞþ;\1eQv0·=ôt\18ʹøa\956·¯Y9<Á\81\81\14à~\1f\7f\13½h\94VNø«Ðè:\ 2¨\19±_5\f®\80Z\9ddÕô:bÙÉTõ¶ßÙ\Úr½\9ak\ 5\83&Üjb\89ªoüëJo)\83\97Þê^\vz\15Þå3äôjq    üpc\97çÖÏ¿½)£Wx9üÆ¥yã\18½¦»Â%tÑdî;ϲe\rý\19\9a©\1c\16\88 Áà\0pa¿\7f\16ã\9euS\80®óT@ãÉku\83\9b·ñÎ,ßeÒj­-¶³\15Ø[«ÜÐh\81êl¨oKO_¯¶ëGÍ86_Z½w¨4C®)6Ñ95k¢~ñ¡^\f5{L\94m\81¿\90ùï\ f\17ß\1aëûI÷άz¹iÝ\7f\85~Ñ[oü×\ 4)o3\85·ã\ f\17}t`¶^\8ba\7fP\1fN{Äg¶é2Px1xôòê4È3Ð^\8c\1fåÖÊ;g·Î\16xß!úvô õêë%h]1×l\86\v¸ß\1c(ÚD½¬'\e\95¬ÜïÊýÀ\17\15\ 6^Ñò3ñGòó=¾ÊÏO\1e\90'³Ç'Ã;}\9bûü\10\81\8a¤írÂ\8c\ e\97IªóùÇ*N÷bð\1eߨÉÙþ¼Ô\85¹«Þû}Læ\aéÁÊÙ\9d\ fZ\9cwr\rrß.ªÌ¥¥m\94\97Þ>H9í\b« \ 6\9bj­9¸é\98\9a\ eÅ(u\18Ú\rå\81-ÛJZ5\ få\17\8de\83B\99\9f´ÏÒì³\ 3¤Æ^!¤\·Þ\97r=$\94rãõ7Ã'};\7fgH~\b»\95¼ºYËmj\99^\16õYÐé\97&ý®ó\1e¹ýa4\fpa9@\8a«~\97¹\9c;\9dFbg\v\8b\87ù¤U>ïVzív<j=úqk\9aüõ¥^çqN¥òqI\197\13HaË\10!O;8/\v\90®Ió¦9\90rÛµ×P¡Ü¡Q\8c\a\1fq=)b¢Î\1f\f±üÝ\1cÄJU}\8bº¨¿3¡+Ý&ÿá8t}yÝ\19ðÔ\82\ 3$ØÛÄ\ 6èZgãíxïÁÅj\19Tг¿Ã´ÊR%µ¥w¡\8eÞ\99
+\8e\86ÈBºãUg«Ú»N¨Ä\90yWؾý\96§\177sBJ_Ò«HóÇ\1e\91òlD7Tï+7J\rª+êËÞDØ\97v;¡³Å^ü©6­ó'¨­ó½°µåO0òÎ\90dxý\87ý«!7V½+Fù¢BÁÓ\ 3'g~\81ñHh}ìE»{5ë\93J`$!ßkmÄ|C;ñ'½iAÑ@uÐØU\ò\9b\16\bne/\vo$\92ü\ 6õ\94òKöÛ\bÔV©QÚ\18\90تZ\84X9lDÁ\80ã6\7f²\90\11\8fÜ;Ù\1d\9a\8bF\8f\98Ã\13¡Âáï\9aÊÞæÕ\15\87\7f\14ñ\ fÏÿ°\9b«u1À\1f\1fr^0+ð$Ü\8aåÑdßü\ eW\8föm\80aк#Ï\8b]½^ߧ#\9cØP\15wÖ̺5Ù[öm\19@\82¹$[Ѷ\11Üã°\ 12ß»¸I \8fX\15Ñ\82`,\88ªPW\9a8ß_÷9îRñ5\8e\90#\8buÖÐ\92¥õñ\95y\12H\99qïW\89áÆ÷\80qc?fÜ\93ÿÌ\90ukÌ\13Ú?\7fØ\96ð»°¤Õ\175\ 3¯_ؽ\92\Åù8Ý\9cµëu\1f}r\87l[ÛñµÛ\1cb~Cá.¨$-X@\93
+\1e:h\80\vÚ\15·]g%VÏÞAèâÁE¨ß¢\17\9fÙÍ\86G_`\85\e
+u\84½û4Ã2\85\96ÊL4ߤßóÛ\9c\9e\19ú\85\ 6ÂS\81Z\98fzúY3\9fZ´¹\e\rlûñ_ÌZ\8f\1fÖ{y+øoëHy5#\8f\8e\1fKºêäë\83L\1a2{^ãÑMò\95\9d~l\16M\95±}YRº[NÜÞ&²X£\ f\86ÐM«\12þ\©ÏyÌ\11·Ü\95î\9f9râ<Ø\a\1f|Yf~(1Óü¥Îð+\90¢çeZ¦sR3í \82À#×åR6Ù\8fÔvn\8e,;\12K\96\19YîU/dY%\1e\7f \8déû\ f+\94\1f óÅbNMáø\8b\8d\12\96\83\86\e­]\1càw&6|.¿×"\10¶åo~Ó\14;B\9bâM\1e\13¸ëNË4\e\8e\82\86\ 3vìn',˽\ 3æõA\8f\8cÐI\9bü\85\8c\84\96úÃ\ 2\9dGW5Jmoqr}|
+d\ 5E;DgØ\9fàÇG´Ç{®úÅ\11¾Dá\88@Nq\ 4¿\9cq\84\0\1f8R\ 5î?d.Õl»\1cQ\9a\8bsƽq_Âù&MÄ2æJ©÷\84±g§9Ë\1f\9b·KÃ\95\ 2÷Ö\16\90Û\88cÙÇ\83c\84ä*Ñ~»fÐrMq¨`<\9cSMvµ¡JÉ=$73ðAVsõ_úè~©\94\89zi\80âýÖ\8câÃ]Ǭ\9e8FoQ°Ci\12J\90ø±Ç\90\8c\918\9c\85
+ïH<ÙÞþÃϺ?=Uìô¸Ì¾\94ݼ\13Èàâb¥îÌIJH£Öa\11\9fT¾¦x\8dê%îr#zÑ ådN\91í¢Î\13\asÜ$ºø¹OÔïÅ1\1e.\1aK| \föXÚ\11]°¡~xai\83\vè¨\vC(\ 3·\19db.\9aðû^°áÙÈÚÂÀ+É\92úê\vÏEëJcéÔ\15J;Õ\95üðö\a\v\aóR®,N,g*\8c\1a¹/c\1dÎ\ 5¤?zcåÎ\9aú$ÚÕÜ\87òRÕ|\ 1\ 3泺4É\ e±d0[.1èXËg\95\rÊ\96)\1d\99\ 1"Pó    ü\89ÏKx>)\1e`\89gnp>­¹êËݱRW\8d\1a        ­CE\86ôAhÕv7zUë8ûgõø\12áê11\87Õã\16;V\8fCíþ\17íÆí\87ì).\94ä¤ñs5nØÚfÏ\98Øõ\89\8bO¹ÕÛ®\13Õ+XaÃ\0È\ 5çry\9bÚØa\v·\94\9d\80\88Ü\1e¯\83\88ÅB-Ëi@Ubߪíï_³f,Ùi­®v\82jXZ\9eªýÍ#\9b']EÛx¾b\1dõz\85è\1dùò\1deºez¶õÁ§$ßA7~Ö@n\12wANßíA×Ã\1eiÿSK\7fÐ*þÁd(Ö\9a¿\ 4nëxðÙ¾\9b¿ã\9d\16¾.7ãD}É Dg\13cø»\9e[2Jõ;&\ 6Í\83\81¼¿K©^&Otup¨befw¡Á\97\ 1\88à´\8e\1f6û¥ÏÀ\1d\97æ|\1c\94æ\ 2\e\96\1a_ûUÊù7°¸T\ 4ª¨\16wz±¸iL\vkñr.è¹nVC\17Ê\ 1'\17Ê\13iUÐιg!\1d\9f½
+«Wú*Ã/÷d¸{C\8dÁÍ4X#8*\88\90¢Rx~\9f"Öz\86l#¾®È\1e\9e\8e6¦½®Q×\a¶R5£\r\a&f\81(ÉP\98ÙG\v\9bí\8aÏï\97C1o¨+-_/=û¹Ó\16usýv+\0¢£\17\ 2V/I\0\ 2\95«)b\1e °±      \108¿\ 5\88Êû\v\10Õ\ 3\ 3\10¹d\ e\10ùñ\15Àãóû?8¥t\14\94U\9dh./ý\8f\18\9dkùyñ\1c81û\15F!yR¥%\9aì\88Q½¥Ô\8cª\15\b*8\83\1d¡¸2@¦PC\ f4p-µ9\80lib\8aI\13 ­w\1f \87ô8\85\e\0ä<\9f-L\93n{ß\14_\18 }[JÏ)ÌNñ<\ 2äxR\0H·É\ 3äD÷\0Òl$)\8eÕ\14\8fú\ fÃ:ÚÓzoÇ\10ÚÝ\8d\9f\13[mônu\80\13Ùê\83ª·_\aô=\b²9\85?_t\95\94Î]°±Ì7\8b\95ó\b\ 6
+\05\9e±\0µ¼4\0*¨ê\0u\92{\0\15»v\8aÈ\ 3è\ 2¾\ 1èúô
+^\0èî\1a\aè\1eßLñt\ 1ºï\9d\ 1z`T\ 1ZGä\9f@Ü*Î\0ºM¦¿Ú>\90\0Ý©6~è?×±Òi?.lszÝ¡\12ôò@îÝö¿TWë^Ñ\ f\83o~¦èÊبY¥åC5
+{!iå\b¬©\ 2´Í¥¸öu\80þ8­\9f\83¸¼é\ 2\f\9e·\ 1F`§\0cÚK\80Y¿\8e\0\93hO\80år\15\80uÓÏÅ®¸n\8a\9b\ f°çy\f°Q\ f\ 3Ø\vo\0ì\15\\ 1ìî\ e\0ì>\12\ 1ö®÷\7f0Ê;BÔÜ"\99\9diÒ!\aÕy\1e\ 3\8bÔQ\ 1\12ôs\9f\9eþ\98¢ÙïhRj¶ÏÃBÝS\ais¼ö\1f\1d\9a\85%\e`»ö\18`GS÷¯¸úS}kð
\1a\83\13À\rÃ;ÀíÐ/À}\16¿P\ 6^àx\80÷ò\ 3\80ß,W\0¿U^\0\7fÅp\80ÿVû)â\1d \0\1e\0\b9\81\ 4\84<<øA§î#Nn]z\18ÿ¢\9d\1a\r\1c&\à;t:%ûò¬rñ\8bÛ96ÉcÞrô\7f\9fÜûÿ¬½Ü{¸ý«ù6Ãã_Í7¬fI¾Æ\v\10è°\0\b\ e\b÷\13ÿw]¶?ëÈm\1fÿÂ\e8\1d\10Yhù³ö²Çø_Lï\95ý!y\83º\9a\98K\121bÿÉ\91?\97¬=H\12©èÿ4¾$\91\81ï¿\90\81\ 3\9d$JUþ§\9dþ\½¿ Þßnþ\858\98a\8aõý_\88CÚÍþuõ~\84Ä+wû¯¯\ 1¬^~½yýOáý\93\82ûCÉ®ÞÿØg3çlòîÛi;/¥¬\9d\ 1ùÛ\8d¸¡þµ÷g@¾fù\rÊ>EøL[É\80\7f\rÈò\93ÿçêý\85"l\9cÄ+FÓDX'\8b\97_IÖ/éP:<\ 3¸t~ªg*ݵÙ\ 2býæf
+T\q¾Ì£ó\1a\ fî'áåÿ\84Ü;²\80\ f·H)îÿÄ#ü^ý¿·É;°åäÍQé^E\aMá¦\8d\10OLÚD*sõ.í\7f9\13?ù¼ø[oMX\91Õ\97´#Ñg\0ñô³ÔWÄX¿(J\\19\ eÚ\8fÎcл\9fØ\81uï%\93ñ-\12\9b\ 5\1c\9br9\©\rp»¸U&\17\ 3\15       \11Ý>û\845:KwgrÎ\8f\f÷\87Lëü\7fo~HÞ±ÝHÞ.\9b\9eSO[iÔÿÊÒ\8dR&û÷z/¿d»Ï º\Å\eø\18>öøùqï=×ï[Ä\9f
\9b´¯\©à\ 4_\ð\84GIû\94Í¿\89\84ã\89?ûH$\9fóV¤\85ê=î\9e6Ìwxì|oî¡_ø\ 6ûH\97®{|ÿ\85vNZ!lc³£þ\81\8b\96½Qò\7fH>\90ɧÇ5\8f\92UN\92È\87ÿ\9c\ 2\16ò;´OußL¯\ 1ª ÞÌ7Ø»:9t|a7uÿüí\16Öç¼    \1cN\eêr>v޳ˡ\9f\e\91:Jöøf\9aÛ9Õii\ewçµ-{^¢\e\ f?2ë¯ó\90ÖÒ«üKµ
+\ 4Í\r6ò3
+ZÅn1¨¬CliTfè\12Ú\ f\91ÿ\83?âî;®¤M]&p\92\ eòëi£#,=«\9fµ«ý5\vQ¢õêç|_¢Nú\83\12\ f½ï7SÕ÷ø*îlãξ¿IúÁp#\6îÚ'÷óu~¼\ fVjrÚ\ 5\e1
+\83Êâv[\1aé§_\9cZ\85ü\ 29Ô«¾\ 5\8bÄüfzÊ\9cºãî,>|.3\8e\95\e1AÏKz 'zjV\vü¶?$\9fù\98I>\94@<µ\85Q»]Aâsy\9e\95ëÅ\9d\7f.çü\91\8d\8eÐóôØÝNîwË\91ÃòÚß\fÐU³Û¦\83Ö´+.\r¿­.Âú°³@\a£\81o]'Îü.-²É\17s:X-fÏþ{?ã®\85È\9bQõ§\a\ 4Jaª\80Ãú´p-\88\13Mòlw\eªg·ÆGùqwîçÆpÇË\8dÎ\90\ 5ü\87ä[¾
+O½\95à7êô¬\9e\ 3aû9ö\96¿0\93ýU6\96\ 3.7oo¶^­¦£hy\b»¯ÅÀ6\8b>Ù4¡93\1c\133~l³Þ,\197¼\k©M\95ÃÚ\98¬á\9d9)\9bÇ\91»Ã?s·¶\80·ã^\919\8fáõ0\19\99ø\11t®£Zv³qlå`ØcËÚ\r\93ô>8\14ºñÛú§Ä\9a\9f\83×\7fx©'\9b»[Ó\808¯Ône\7f?å^[`\12\1d×`é0\ fvÏÏhÙ\8d;#\9fÊéËÙÔê\9c¼|Q\7fLÖ7#»\v¸û\82Uv!Í\85Ç\88í\91#3öØ\11îî%Ç\ 1\1d·ã®íB\15{\98¸ìl(¼õ\8dõ\9d-/\96\û|Í ÏBf\93\83Íî°\18TiñÞ7&Ü«_çÑç\ f½Ó\aÌFÒ¿m¼\7f\9bÂe¶j\12\87ëà\Ú,GãgÐC\9b\87ÅðÜõç\13\90\1dÌ\84W0\986ëÎØÝïüÕ\18å¼Ó\88hïcû\89\ 4_\9bó.àp\ 6Ü¡! <1K\8e
+\8c¹"@Ñ\ 4GÕì\84\1el\19Î\18T§Ía¿[qgýúþ¶ï\ràʽ\87¾\9cR7­\12\99.Y˹ƨ7\f;ÏdñèL¼Ñýÿà~9ªâ¹\1c\17ðí·ß)® \9bðôã1z\9cÍ\9fpæå\98j¯xà\1e&õÎè2¾\f\1c¦z\99\fgÓËÊZ\1c\80Ð\½ªñ`û\ 5?\83\9a\f\17ûÝ\15\9d1\ 6éa6Ov¯T\9bï\92î@1Fï\89a0³\8bÓ\99æÁEûÓ\97Oí9ºù´\eW.{âÑZÊÈ ¥\16®»VñLÞõµY»e¸ê:\9e»üp\9d\12%ápëv\91õæ\ 1\15\16\eÏ\81Vá4m\r?\8bq$\a¦3V\aÊp\ ecm«èÃÖ`7 ½~ObÖ=³¯d#\82îõÒ}t)rð6Æc;ßy%ãrG\10ÇP{¾\98\13mI9r­åú¡´J\ 4ÜÓ×÷îT¯0«­¶Kª\ f\rj\8d*ÍSMn6{±\104\11wyùA\8d¸qô\17¨\99\15·Ñ2Üó;o_®\a¡\19å}¾q{zåzxr\aìná<1Ç\1aÊ\0¯\fv±­ô\91v§Ý½±¶mÄ­å¼\93\9b\8eðz\9cÛÒ÷|k\ 5òõÕj\16ó9}£\97@½²¯Ôµ½Áf×\8d\ 6\85\12ßìc¦ÞD®ç¡jÑå\85J\14F\17ÅÑ>\ 5\85Æ·\82\1cß\83\99\1c?\84HvÓQîÿÁ¹²sùmÁ=CËá~_\98çz\9bçä¨mÃÑC\9c/m \96³<\e³ª}ä\9eÕ¨\b\86«GJG¤ãn[ÖK£V°Ç}}ód·z\95\97\98«·f\98W\9fÍ~`\ 1ê\ 5t@\95h{uå^\8b(\85îçeù\89J=\99\e\8e§Ò[*\1f%1è~%@\83\7fU'`ÊÓÆ\ 2¿\9dRÄa\86Ó_T¢ã1z×\99õv»\84\16Lèä\7fb´kÚ\93Ð\99\8eÆ\81µæd»?è\\15\83[ûL{Q0ÄV3­\9cõªÛ\1fh]0\984Ãö)+ \9aè1ÚªCävRîV|Uè{ò\94\9fãjNæ\12´,½7\ 6.5ª\9e \ 1\87¤ÓP\10jÜ(Dó\9d¨5Ê/±\9cÛab9\7fw\84íª¿Oá\1cÅrÁ?eø½:î\9fÊ*ûnVÝc¯æ\v¼U\98î«ÎkìäGgÛ/Ú+³3ä\9cTÚ\v_&ô6y§µn³ 71\12ì¨éÝt¨\8c<b¢0bs)O\16­­ô)\1a'©¡÷¯R\ e\ fÞ\8dÅí^l\14\19 \93»ÅÕ\8bcIJÐo
+Ûïm(Ô\14\1fáÝ\83ïF\1d\98\87\87]\93\87mt\9bB<üA÷Ú:þ°\9b\99#2À\12©6\97výâä4²\92¿b´i®\aȲî\18Ó¡\9dÍ\93n\95'U¬yF\16\94\8fxe\\iò´²íI\1fãâH\8dðé5\96Ø{Ù(:ÀV\ÓèYÔ\vͧX^\8drB§¼¨\bµÝ\9bä{uTæáÐ\19p&ÿ]rØ·wc¯\v¨ÆÚ*\96ÉÝéö¾fí&¸g¯\ 1\ f[ÅQ\88%%RµY\13j\16ÝK±ÿvÞÜäjm+ö¶O°è¸\93ï©\8aÖk_P\95ªj¸<Õk\944w\18IÊ=µvCå\a¦¸\9eO²:M¬ägsawºl\84Î\08ñÇ+xç{6ýáαRâLw\86±7ð)²öNì11äÏ\99q\88D\f;8\95éDxué\84\98\ 4\fk=÷\7fѺì~Ø\94'0¾`\ fø/W½åÊ%\97X÷?éA\19ÝÌ\83cîztDLZ\e\8fR\9aøò\80ÉÂäUo\ 4ù\1dÞ(5\1f¼Xi¿T¡\13Ã=\ 1r\e\ eß{k\1e\8fÌ\86\ 1\17µ·\aΪ=¯ì­\ f\83\92E&\1e*Y\9dÆ°\8f       G'.С\85·<¡¾Û8¤ü\8eS¢äú´MÉ°¶ |e±û_0\93íê¸Ëá¾\bW ©ñ¦Kc\ 67¾v±1y\fÎuûÐåEtª\ewDU\9e¥_\ 2L#°§\95lérD¨çL\9aï«s\89\8b¢k\87³\86E\8b½=j.ë,\95%K«\83\1dó,-"\86km\9fô»úÉÓb¯V£üHa(ÙÚêdð¨\8eÉfÚï\91`SÌ\13Û²ª\11\9bo-\e°§[mK\82\7f\10\98\8f+>/ð        4Éü¦#~?È\rõÚâÙ¿NÌ£\91\eU=m0buù\1d½\19±\9d\1fWxt\fA\1cáU0vT\95\ 4æÙí4\99      ³î3Üë\97«NÏ\84Ï\8cn\0µ\15\r\1c\94\13µè\ eïTá<û\92\1a\90à\1d¦\886Ómâ\87ihã]QÞápZ*aᩤ`apöðú\93ÜüE\b¯\7fXÒÈ\91ð¶ö­îÚ9:sw;\92<,X\90:yõÆ×ΩS\82ëó&U\94\92xs\ 2Ü\9fCéèôV¥?õ\rL7\ 67\9aΠ \88L)>Û¦\8arÇ$×õå\84ÔÂë\92,\9bÅ=ѾÕ"¢æ(   Þ}\9a%\1c\9e\80&lðÅdôjL\86¨\r×7(yÞ¼\91\87µ\11\91G{<A\1e\8dÇ\1a%ç¹ô\aÃ×ú\a\7fV\9d\12¿°ð1«Ò5[}\8eJ¿4æ®\b©akoÖ\17*{6û\rýXmp7ð\98uÒ´$»%R\97¸*±;µ0¢Ó÷y\ 2B#\15ïÍó]\1c\91p\e\8bòª\87\99§é\1aÃûç\10½aå'JÙT\1e\89©1\82°î£\ 1O?ü\0\16æaPÿÊ­gÝ\87[l}\9e°£ú<\9ag\ eâ߶þ--×?Ì\8b°INÌ~\8c\8dÄ\92\f[û«Vê;÷îÛ(ôÕHG\9dÂR\ 1\84±%\84¥ºÂrí\aI\81\85 \8cE\9b'\88ÞîO\buÆu\12¥YYDâÄÒ\10ws\1a¤»A¸Öw\f¿k\88\ f\8b=v\v\ 3ìøZ÷\93\18¨\17\1aP\rZåÆ<\ 4ª\9fnm\v\ eüZkW\7fÔª\ 6@ÔªJÞ©U\99κV\85ÕU­¥è\7fàu\84\1e=\8eg7Â^Uél\ 1C-\9b\18Óã\99î·Ý\1e²\97&Ó¼\aR\996mî\ 1\80Mzqʱ\ 4\8cí!\94\11ïE8W\19Vêi¥\ 4C«pFBÚäÙ\80ÊBU¯m¿â \857©Õ\8cSP=Â¥Sµ{V_UØÜ\94+\83{)ë=+ØhÜ.\ f\93¢W&½Ù\ 5|4\ 6\bø Üa\99\94¡U\99¤KÁ\1f\f\1dd5\89\8c\ e;\9aÕ\12zX\83ëhÿÁñ\15c)¨\80\8e\97ò\97?\ 1\18\bÖ\19±B\97î\90\1dï#`T'Æ2\aq\9e¹\80µÎ
++TÌÇ«\ÁÝ2\¾q\fUvÀ¡T¦¶«\16\18·\9f&èBè\14dOƦ\94¸Ñ­äñD¾$||¼øõq­èÓëIQz5ÎżW«\15óCzP\94fQP\9c\7f\13öâüòÝüàÒ¡-Ú«äÄ\98&^ÀzB\ 3«¶¡Aî«z´\1f5öÞp͹.5¦A\81èawøÜ\80ý÷\9e¨\1dð{­Bìj\85Ò{³.\16\17£yµ¨0G´Xx}\98b!á³n­°ò\ 6FA\13·N¡\9c+,òÛ¥|Ê×J^\92;l«P\ eÎ\19\ 20P\13\13@ß½5\80~\98/\80Þ4\15@ïÕ \80\1eZk`\0\18\7f0ÊI\82øG\8c\8ee\80ø\89Ñ\1a­ÚÙãU\19´\9b\11\7f_\93k¦X«L\b¬yï!\r\7f)Cµq@WÈ0\84K\9f\13Y)ª­G9ß\99Î!À\á5\0×$,Å\94KñP\ 1\gú\0n®<\0·êû\14Þ\vÀ\87hú{í\9fû\ 1À;\1d\eÀ\rì\bàò#}Ë\84
+\80³·\15\80£ø9\85tûá'F\9bøÙáþ\8aÑWª¤\14a(\11®âûÌ,ûÇ\15a:Î\18\99G\8a\ 1\1d¥BÝ-¶äÛav³)\82h\eÉ\85ð¹
+\10þ´\9eâL¤ø0\0qàÓ\8f~\18u\0âþ´\ 1âÁù\0\99Û\87\0\99g¿)N\b@\16t\ 5 \8bð\ 4 ^\97\v@$\93ô¯\\f\r ®ó#@ìkï\14z6\92þmÿ\7fÄhkS\10M×}²yG;\11\91\87,\10\7fù´¡ºöè\94\9f­¯\Rp\99/´û\17\1a¸²$\ 6\90     \89ÿ\ 1U\1aò)¶
+@!ï\16@qDÿç n:.@õ\93\15@Mô\v@­¾\ 5\80:\8fI\80\8a°ô·¢û\1c .Á\13 ®}\f n\82\ 1P\87Æ    \8eX%Å(ý½å\8céÍh\99oÃ-\1eWç.Um ~\15`ýõûN¢Ë]¶0\r²è´¼ZøR¬2¿ÕÛŵ\1e(ùÞ\0\15ÿèÐtî)\ 24\ 5J\0-Õe\80î\10
+@ÛF\e ç\e\13 où1@\7fÙ9ÀàË=ÀXÌ\13`¢Gº\vp$\0l\990\ 1\16K¶?­\13ßä\0\96\18ó\0Kj\ eÀRt\ 4°´\88§\88Ô\14ßÖ/Ùº)Øs¤qZ»àoíBr0ç/hÎ̯kçÅeò\vç(¶J\94\91\8bBWû«C\7f\9c\16ÀhQ÷§Cÿ±\1dCæ_á÷\97\13~\8f¹\0àr\8d\ 3À\91³+ÀÙ0\0p×-\ 2ð¸¡\0¼\b\8d\0¾u=\ 1üp       \ 2¼=JÿÍiÍ\0~\84?RÄu\80\1f¯õ\14\9fì»ÑØu\8d\94\8ce\1eâf³g\81\82ÃË\v\95ºö©fÕè\ 5è¯\98q±:^\ e\81{\18w\ 1fòíÿmÎ\7fZïÏÚû\13|·Úú\7fM¾?ÁwR\88~:tØJ\0¡~)\ 1BWÆ\0áQR\ 1\91<»ÿVeËò\e\98B#Åmò/¦W(ÿ[B®\98Ùb÷ô?Åô\87Lëý£ñýB\ 6\9f\9e\8f)îÉ¿\90\81\19\9eâ-üsõþ\93Oÿ\ 6à"A
+u\9fb\1cýKp¨äþ¸z=pI%®¦½|h;\7få\aÕð§ë¦»yªWâñ\1f~\96Ù\9f|z½iëM\92x7ú\9f\83\87ÿk¯\90%8\1cÇi\13\99Í¿\9c\89Zþ_xÃO\96\ 6Ó\8f¤\88?£²°\96{¯¯n\f_ÒÞ\18¿ò\863{\ 6u?x\96\ 6Á.Þ`Ñ9Öoùø±§\89ü\ 3\9a\18ð½÷­èwÄ\9fNnVá±ýÅÞþÚô\aYFÂÏ9ûÇ%û\ 6óô\1f\11²\ f§hAÿäÓ\80L[    ))Ææ?\97ì L¼|\98¼|ðZx\ 6µk5Þ G8®XWòѹ_Ùû\89y4î½$×¼Eb®}Ã\17¹Þõ¦Àö\95Zc\99\12ëÊ2J\fm\1f    áä~öñ\1cxÎ;\v),M\9eýÓF(اÊ<´\8eF~2ø\1f@Á \9f¼¹|Ú¦\16\a¦­«\17RÈÕ\7f\a7æ_~1Ñ\9eê!\9f9!cý\fM\1f{\ÚÜ{OötÃçÈõJ\ 5ÐóÂnK\9fÈ«\81ùó·W-\9f¥¨
+\85\ 1QEÃÒ¨J\1e÷ü\939Bó·x@\82§º·Ê`wç@ug\e÷\8dÕ\96½BßtDáb\e!\8e³\8e`ís\ 1ÿÿ\ fÉ»\17¥ÇУ³V\16\80\7fímAq¥¯\81÷Þ£\81ÜpOã.±ÒnF^Eë\9e¥°1<m¨Úø\by×é\ 1Y\9c\17{|½Îê´\9dSYﶱ±\v·l¸»n<l\17¯¿öñ³\96â[q\15pImU\9a\97ð \12@üÒ\0õöâÔ~Ì\16Èiøð-ôZò-,WõñË£òÃü6<\96\7fø#î&\89\ 1þN\81´½Ou\87>býø~\©ùëzþ¶ÇqX²ZÀá$ÔÁ=¾*ÀÛ¸\ 3P\e\ f¹§\9f\95¸È«\809h«Ò44\ 2ý\e\ e\96{9´\97Ðê2YôË\97¹\1fuî+\1f\ fs\a\ 3³\0ÚYl£É\8cM\a\80\9eÇM°éw\ e(S9¿\99Oó+*\9a\ 4\9aþ\9c4ËB<)íðÇ\7fH>y\ 4{-D£r\ f\ 3ñsy®ùËy\ 1²ë°d\8aÞ>jÌf[·Ú\bÖ_óçU_©Oì\1eTæðgqj\96
+~Ô.¥\87àXAæT\94'f.\91g¼d\94\17<áUR¦ß)Ò\9aJ_ª?      dÁ\99\94VúÌm\95íÍxoï¢q½Pþ\8e\1c\e¡úÈt.\ 4ºv\88C?\9b®`ßGÆÅ\1e1rô\1f\92\1c\12#\8f^¥P\8e¾Åð}<>:§Ý\98¯Î6\1f\84´6\0=\1d\ 4\9bqÒ_\9c\ eÑØ'ô8\98=\95RèÍðÒcº K\9fÉJ«\16'à®^uÛP=\e{\8e\ f.M\8eëo\9a\1d\85³¦4ÂjVË\19öܾC"\91k\8f¬ïrøʱáp²\9c¾­\ fX\82­ÆðÕ3\97Ðhe\16û\8bã`ÍÍ\8e\ 3í=<ü\87\1aaW\ eÜV\8ea\99ÌL\16[qu:¬ZÖl¶ì}Æ\ 3ÿjYÊü~F5o\16Ü\8di\91|\8eÜ\1d\b,ÆÝGa?\1a$\85ȹ¶Ð§ýèV?6s®å\87S\1c.\ fùo\ 3¶æ²BX¹U\9b3\97ÚL5\8b×Ko Ó\85lÒÒ Rh­û\1d-¸ö!\9c\ 3\ 5ÔìFðqÖŽâθ        ¯í\1fØßóæ\87{´öñ3\185ÊÛ\ f1~¬j®qX\90:?\9b½gøÀË\7fAy¢·1n|\\7f¤\11Îä²\89\98öøVt\86^\ 1ó-¿\8c\80"OfÉe®\ 3ýÍ?ûû¶\ eô\8d\9a\9dzv­\87DS¬\ey\ f¾Kä\8aMãvÔL\83Ff³\8eë½\ f\1d®a|Úo\88cÚâ\ 4\1aµüOgÝ\92wzæOkÉsiõ\1f®\13º\85\1fìò¼°ÖMᱸ\91Üq6\ fËóiù\9c\98ãð}P\9c;>'\87É\ ea,¹\89È&HRÆ ªªN¿nõæ½þÝ^w­WooÜõqd\8c*묿é<\8dõ»Ã\85û|û=Í×Úâ\17ÂÛ\80¯
+-¥>oë«ÁÕÖ5\9c    tð\e>´íb\80h5Ä0\9b\87wiÝìzÉê/¬[ðC¤Ì«ØNèKù OW\1eó$\ 1³ëfºÙå\16.²¿\r\9dñx¢\ es\9aD\f\96\8b÷ë¯\16Ó½ìû\8aq\7fzÝΫ¼q:|çäµg§[ÐÎqß}K\99}ÃVQ\82îº\16 \89\ 3é¼Ö¾ôkÍ#é\93Íîã+«ç¦\90\r
+U\13\ÎUìJFÊÕ~T\14ªpÉ\16È2ü\14Öò\7f15\16!T: \9b&      å\7fbôLþ¾O\93úñ±\1cÑ\93\8d=\94«\8a:ØÅ\95t\²®Ö\r&Ø¢\1dþòË\81\96ïfKEѾ¾\1eÒ\8e^~\88\9eÖQ[Aó¸1vM¤j\9cÔóÁ½©8ì'Êõõ.)\94X\85å\18hñòx±oK    \82¸Ò4\9aî%a&å\e_Ii6ü:襠\16\r¿PÏÄûßö\87\83ý"¡Õ¡xËù\93v\14{eú\1e\8e¯¥s`¿?\9b\91¹\85\99f/Ú$d'¡V\95v¾¦Ôõu¢\90Ú\1eh\8bÍ\13\9b\889é©æwë(7ù0U\9cÂs)ÇÚ;«:e·R\r¥Ä¡\1f\92G·¾\92ð\Õ\1a>ÿ¤\1arEn\8a\81á\ fÅ&\8clÄÒëü\116ÞC\16\95+lf\97¹Ðjlg\7f^eØ%»O-\18¤Uì¼1\ eâ?bô\98Xfé<Ã%å\8f\a]\93Ñ»ôbO¶óo¥¨íõk¹Ù§¯\88jñ/F¹ík²\1c\87µ\96ÌaX_J®\rG\12)e*\ 1ùá²!7'»F\ 1<Db°}?ŦÝ\0\85M<Ä\84\96û\94øCYÌN\ 1ÞØí\97|Ý齸\901\ 5.d\e£\14£Ù_ \ 3ï\87­\1f\9fkKRvs3µä?\7fÙ\17Îô°^[ëÀsûf\85owÞ¯\80Ò[\ f¬¨^
+fQqvzUvO\9dl$-yo\9b\93\80Æ\iÈËe«QP¯\ 3±\19½\1c\11\1c\96=aK2+¡\9d\e\9cø\83:¹óÝÒ5Ç×·X\9d\e\90C\9eCc Ç^ܾÏ\ e5èÎ\92\15\84aÉjn\98¢1Ëà±$ÀdO
+\7fÛ\8d\ 6.k\vfÕÏyzËy\8eoÒ"²¿ÝõÆÜ£î¤GÉd§½Ä=Z\83Y\f\ f\95\93flRl,Ú¥z£pÄ)QC\ 4QØZ\92*Tïz\87ï2z\9fï*;\97\87\8b\8fìLãÂ\bÞq\18ÁDìå>ü°ÃÅ«Æ<J$Ã\8c6\8b\ eÃ\fé\19ý"£+=\89#\92\9e<×&=y\95½\fSzrÎM~X×j½ª/`F~Ú¹[¯1\9d_\ìük¹\1d\9c¶^\16lÖui¥×Ò\r\87Q¯­"(Í\8e×w£H\ 4y±Ì\ 4\15¡&lP¾ëG\f\ f+y\89\e\9c!\9dÃL¶Ç^ñ\8eÃ\ e¿óôØøç5óP\8a\9cù\17ý2§e\9a¿=Hê3R4j®<³r\90\92\99Ê],\94Êíô^\8aó\94ÊÍw.Õø\'?\ 4g\84­Ì%[ÎOúJ?\19qýÙuØ<\9f\ f\ 3t\18Ì\roÕèëФÅ(cÿSn\14£éS¨­Ù\ f\ fïé\ 2gÒF&Þ³×\89C²6¿\11\98Çü¤2c#o0l\1d±èW(Mèéd\1cÐ\ 2\7f<RóùçAI²P$\97á\1c'U³¦\92%|â\10ú\ 2=\12ú²^#ô\07\bÝ\1d»\7fÑ7ÇÄú4ÍäîåÕ£ª³f^,üÑÍgÜênµ\85ã±OÖÒ/gÁ+f3ºÊ¬ìuaH¬XË\843ý|ÂÚÁ\e`b\f­2¬Íaô4\96\19Zp-\89ú67-Ê\aã\ 1%í*c*oKÙô8R\8d;;²ä.¯Ä\86Ï\ 3De§£ø¾s\95q(ä\87ØipÙb}a[ÂúÄ©\85\9d\86º\8b\9dÚÒø?,Æ\87JÕkõ¹âø>µ¾öâ²\8dÍ#þ:÷\98q°lk6\9f=\8dRï¶!H\v\98A\84:qü2q°\8fi±æ¼)¿7+P2û¬\93Á¬@\92Í\ 6!\90`NV\89ÍÑí\12­ÞÞ&ªHâáû7µÁë\r=ÂÂÜú\83¡ÍR\1d½\80¦\88\12vÎDîÔ(ë=\11ç©å\11çeiÈ\1d\81ÆȽT\1aýÁíõu|±\98¯Më[¢4zá£ÜpÝ>¼\ 6¦|<\ei\15\1f´:PÃV^\92'74\93Á¸Ëâ\96§gÜæA6#úIlE\ 5 ª\8b\ eâ\ae\81âõsÈ`¡\ 5\80@[\18z\97\aèeáºèP9-Q²T9!£\96ðD\18âT\85'c\9c\83yvÝ«¿ß|P\9fÍÁO}æÓj}æ\9c\99±qêï}4ª¿ý½3\v>Q6Oz\825è²óÙO
+Ö>\17¾ûÔd\1d\19ù\96¿Ö{§öø\8fí¸öm\90ì\98Í\83\94r9=qØxÞ1lpOÐáõ\93\8e²\86<d\r\85\11\870«­\ 2¿ÌB\17\9eâ\84]ÿ8òì§ÜÒÞ®.\15Ó\ 1ßR\97K\90Z\89h¨xP;5\1d¾Îkåhò¬\95/a£¦\97-»¦}ú)®-»¶Æ,ÇkKQý¯\89ÛX\81f\9fÝ~z\1c\7f¾µ7\a\7fû×sÜ?ecOÞ¢\15\86þZ¥*±'ã\ fj?ï7XpÛ\8fúüÝ}×¥Ù¼Xϧï \0*\93\90zb\ 4¨Ôïjµ\r·\1dÔô\ f0©î%tU5òýt\98\15<s\95~YÄ*È5ÑË\91c{eü\85e~è2\1e)|Ù\ 2\1cq\84]\8eÐúð\87ɹ\9f~!\7f\12E\ 6\93ò\80ðv@\17\98\9f\1f­.ìïU>ÇO\eÕmd°Ï\81ÆSÍ;\ 2ãhP-Àoíý\80À6v­\1aç×£Z÷à,6§\12\8a\12X\19\0&\A\17Kª|Q\1e\8dò\10ÁÚàÝjXà\88H¿aú\ 1\1cKÏqë]\9a°O¸Ä½-µø\9eCnq&]¯Å\19Sd\8b3xÑ/¾\95»]â\96\80SâFOÛ¥¶\11î\14D.\9b\n\86ö Ò{\ 1»|Zà®c\8dô[{¹h\15§üUõ»LÎÖ\1a\ 4¼\860ä5\ 4Ah-\ 3I\15\17pLO¯¥©6}\96\84òú[\12*ùrqn@H\8a\ e[\94ês¥(ÁÅ~1wV²þ¦°4W»Bñ^\88óëѨ\96/'\ 51·³\1c+W{@»\\a\12ê¹N½¦çvòÄÉ\97\9dÙ\1f\8c\e5l+(: \83n­+\15ç\ 5ý|\14îÊü
+î~\ 1\18¬Wuú侩dÊ-\1a;\15²Þ,¦c\85>_\ 4À8bâ\12P8Þ\vM{\9eä«\9cþÎ\19Ãf.W'\9d
\1fû(\80²7\16@\9b\92\9ebg\ 3(\ f/S,®\0*ð \80\8a\80\0 \84?\ 4PR?\0($üÒGÑB£\93âà\ 2Èóâý`¯¢\rm\9eÍ:ÞKÀn½Ýyâ95ÙÇ·Æ>Zl97îL©­ \ e°û¸¦Â\85mDUCÿ\ 2\81ÏǧPÊ\11ÝoA[ç^À\99³ß\06³2gJº\rJ)\92:\80Í)
+ÀvS9ŧ\v`{ÅMqÙ\ 1ØA~\ 2Ø\11H\7feé¦?\rÔ   \80­j\17\0\9b|`\0³ªC\0kyë\14Ñ\11ÀÄýá'F\ f(¿Jv6ÓGæ¶Óèñò+m;­\v?\9a2\eZ;V¦¸\rÞû°Z\18Ë5¤ä3àë³\80\8bËw¹\92ß3ã"\80Ç×\ f@\14*\85\14B5E\aN1%\0¢þ\12\0\ 2&5\80`&&@¨à<\85\13þ\94Ûf\15Hác\0¡©-\80\10j\8b\14÷\17@\88[\12 ÈÛ\ 4  ñ%Åã\9dâóý+F?ÚèO\8c\96W¯J"\90÷û\99)¡Ç5n?\8d1\1c\88\8dn5r!     ô¦D&\r\15\9bÁ\ 2Ï×\97å:@|Ç\15\80\14\8eÐ?<\10\80la4@Zm\11 ½\99\9aân\0äE\1c\ 1ä{\13\0T\99½\ 2\14v+\ 1\14Þc\0\8a\80{)\9e\e\80"\ fy\80¢\\1e èñô'\10ã7@!Å\1a@\95H¬»\0ïTú§Ïue)\ 6\ 5á\ 6\1a1\13\18í\90 Dd      ¯J¡]½t\96m°Ál¤bY&ø\1c¶Ô\88ôÿò)Ô\ 1\r\15÷\17ÇCº\9bÇEø9\88!B\ 3hªß\ 3h)\18\ 2´Sò\0zoï\ 1¦
+¿\0\86ØA\0ÓhK\0#U\1d\80éÄ!À\18û*Àtç\1aÀ\8c\87\v\80qGy\80\99\88l
+Oý#FK\1cT\11#\ 3\ 4Ø\82pÏîiÄ\90]îáÕIôªÃ/l\82¹#Þ*t\1cGùÓ\18\1a\ 2\1a\7fÕçÌvüÇßû\v\9bТ¿
+ë_ÕW\1f\ 1¬²ó\ 1v\89í\ 1.7º\ 2\9c\ 4ç\ 1nwÏÜ\ f\0··Ú\0wg}\80{äb\80Ͻ\b\80\87î&À×\83\ 3ÀÃý"À³\14\97âØU¿\94\r§åR¿Ä.Ôæ\9bÄìÆ\15)î¢UÕ^ÏÜRÐ\98\ f
+u¢b\0ô®¥ýç9þÉÝ?¹÷'<ßÏÞ_ÇñÿÉ\16þ\1f\93ï;\ 2øUë\r\bõw\ 5\10º\16\r\b\0Ä|9\0Dèþ\ 6Äú\8a\ 2D&½\v\88¬\19þVcûY{¹]úÏ<¦þK\15øO9ÍäH1æ\93¤¡vþ¹d\7f«±ýB\ 6\9c\rà\7fK\87ý\½¿¬^×ü\97à\90OG¸*µþcíí\1cÿ\858¼Þ\89\aBÅ×·-À/é8\15^ù¾2z\ 6è}ÿGÜý9x7\14pû9x\7f\1aê\85\8b_ÜÀ?oìO;ýágåÜP¿Ýü1 ÿ\973\91ÅôJïOÚÊFå\8f\15\ eìë«]¤\97_~k¯¼\ 1\18Ï ^5\9fjH\8c\9e¥\81èÅúU^Æ\15»¿{tbç|?qÁó\8eÌÞ¥\9b\957²|\81\e¾B¬«S6\97\7fâo\7f9·Y\ 6îOßýIª\7fäÓ¿â®\98îZ¤Áÿ\95O\eùÆÏ%û/¦WÙ¿|P¹>Õ#ó\8cõ\88Ín\9d¿P\84û\89akwd* ·HЩ\eîëÜÕ)è\8d+µ2\9b\17·lw¢¤3\1eDÂi>ú\85"\9cóÃÏ>,¹ÌëT\99]\89´%XóO\18BÔ.wþ \8bEØQg;\9b\15±I\9c,©ã\8f^úSN\7f@ÿ\bÔ/iÍáÏ\92!
+qe`´\1e\90íXwÄõ¦×[ÃY^Ü\92±\8d¼jëtöaùrÎ\9bò#,9\rÒ\9f<p\84æåü¡\9f/gZç>jÖ Ý­]DwÔ±Fo]\84\916\89Õîl\84ûj¼\96\12"\\ 5b\b®\9a9\9aZ\95\96(\15lT\90\fZÅ7ñ\1f\92ÄBóÿ_í,\0±~ª&wd´ÊJ\8e«ý\1d\97¢DË\96²\82L:T/¦tܳ\92v@\16PgwÓ¾ýmÜ\89\87\14\8f7\1e\1a{k\9f<ùëüø´Z©I´_\95¼ä\1c´rùÇr¯V>KhC\83\väÀÁ¾\ 5[Üüf&Ùc¢9u_ïgñ\98|§£I6ï%\1e\92û½úïm\92lÄâ¯\81ÏR\a¼ß{wòx¥æ½ÕÙ¯\95vÇ=ÝÚí­|ý¼\8dÛ\85x\93ôàüÚ'Ê\95\94\91@ÿ¼2gÊÒÈ_\99Å©ù\10\17Èö¡øVí¡Ïo½\871§¢Ç`æ\12/ÇKÆ9Ï\13\92r0õEò8Í/\94û¤Y\9cæÝ\8dþÁÜÊaÕ\eï{b06\10?\1aC\91sþat²\8cð\87ìºÉÌÑOP[\ 1×{·{=/Pis4¤\8b½Ç\97¹ÞÆ«Ûæ* X'¨Ìðùâ¤"\eߪBáÜ\81¡ûÌÅ¡·çÑ`nú\9d\80¥©ô©Ö&\81\ 4Â\93RP%ÜM\93`ÝÊ\96ÎòlÆFMÔF§^«7B"gäXÄfaßFÉѦ\126\19ºb\84\r¹Ü¼g%AyfyͲo¥§áÿàU¸7+7r\b¾ÃuóxÞ=&Ä|\93\13>\83\15xùªË½Ed»ñ#mÕ\98Åý\81æyä ?\95\92îhRZh3·U\1c¬Ç\ 6><\8eNþä2B\v\93\87c\rV\1fûv]çm\9aZ\83C78×\87\9cV¤,ïJ6,\80RZ¦\1cÌìl\17þ\0´¹¨¿\95\81¬\80ê·\99|»wX÷¦½®iÏ{0Þ\99ý\87?btÞ<|vñþ{øÙx\97ÈÎ\1eÌ\1f÷¦<ãm\85ð\0ëAM@½C\8f»\ 5S\19¡WÛ°ï\81\19\ryr\99\99ú¬Ùò¸³r¥sh*­óu°:\9cã\81Öý¤çqR)õk"^ï\1d\81\ eÝ\83\95©Ü\1d\9c\1f=ãJÀ\13Ã\ 6\16G\83\*ÅÎ\18å\9aí×ì䶧\8d\16jþÿàꢫl´v¸HÅçz5÷\ eK\fîÎgï-kN\83/ªº\ 6ð"Fçέì\90m\v\1aò\9e\8c[¹nK0\8bSG\1f\94÷^¿ß©\aNï8\89Ò\8fþ\89\96]S\8a6Æ5¸\1d\8d´.¿u\1eWèÕa)"\9b$ÛNò\16Ô\16\9a\eº5¿æÕ\96\96\1eäÏ\81®®º/½d\ e\ 5­\ 5T-­r@\9dÿ\83¨Ðkÿ\11£\7fvãùÔaüéº\87\f]¸ùn:#|I\ eEÒÈ\9e°\9bª±(ôw\9fQµ×;Í\88®ùÞ
+\86S»h\9d¸÷ìvØwaØö\1a Ûú.«ó\96\8c «V>\12\ fz\93\90#\1d\ 4¼Dk)\87¢V-\81HÓ°\9aB³Nì\rµ¿Ä=\15í=nÊ\ 5}dý\8db}f}\85\98¯\86ÿ\a'\98~\14×ëµôX89úè\ 5|ÑwObÞvâÚE\1f6\9ecz°M¯\99\1e*¡_Ãñ^\85\ e×ý@mÑ+\93-yQ\13ô\15Ì4uÐü\85\9c\9bb6\ f´â4»\85ÑL\rµÑR\1d\94·{åbß/Ê\90®¿\15âÙ­È#í@ÉL\85Фçm3\96xE8I¼ª£\8d\ f\8au\1a³\8bbý/¶¼¹\1fK½ü
\91lêâO\8f\9e¶æÅå\980¾#[dö©ï:LÏdÀrçUº'­\85οu\8d\16\8aZ[ÓëÍÃÎ$Õ0\1e\vêÀ]«Êå½k+dû:\90\1fPn$3ýÜTz¡X MÞÝSãÓ\98d»iÌk\9fB£qR0qÉmeQù\10\96\98ÖD[amDUAg\96\9a ³ESÐáÏà?l¿(\95[Faþ1[\10ÀiR\7f|\ 2ç¹\8aÇÃ\82µíôO'\895Üò³ÒZ\8e\86\99x¯µO׸       ÏÎ_\15[Þ@\85\8c\12X\1e\93%Jz\8d!A\9aªR³ñÙHí\86TUû\8dÜÁtÄåh7\17Uæµ\11Ö\e8ím[Ý\8fP©^!~÷P\ 4\1eb·=î\ 46\ 3î\84õK\ï&e£µt»\eüÅ~Ùÿa\134*¹Å\bLbO\93/§ñ\15y¬ì\ f\9fLÌí}Ûí\rQ\89ï\88\9dgM¯LÛO\15';Wù\91HO)\ 1\9a¹Æ·Ø,7$ÓBÄåÍ¥DÕÙd5´°)DjzV|;BE\87L~_\11\¾s³\97Ü\89^\1f¹~±üä\90u¯ÌFV\8eeñ»ÖanKÀO\91|\19§\197\18GÓû\19z\7fÁKÝu\15\8e\0\9f¯m\1eÓv\18f\1dÁ\98L>\e\8b§\83£²êuG[Ul\17\82\vÔ<}Û\89ì"ȹñ5Òñ`>-\ 6Å\92\ f\14\84V\ 1¬ò{­\8eò\ 6&3ÜÉn\8a\\9f²\9a\1c\12û\ 6\e\ 5±ÍZ\1a4c  ¬³cn×]Vª3´\f\15égaLÒî\19\9c¹ð¨·è¼¨w#\10©·Dõ©7\85ôþ\1fº«úôôW7ïñ\87ó\88\15¯\9ba\89ºyýók;0¦\r]Ò·\97\15¤\ eiå-¥c»ìÁ\8a\b\96\9dH¨Bý;oô½/wº¬J\1cJ\1e ÖZÞqæ^z2Ì\1dD%ƹ4[\f=tMúÙ\88&ô$\ f­iîd^©\19zÊQâ\95Å(`~n\92\vY\9b\90Jzm\93
+ÒäR|³R\9dTJq÷\ f\16lÒ]^|\17\98)\89\e»çÏ!r¼êkgµòɼ\8f¯C«3\7ft\14íØÞÂ
+3à?âÊØ\1føn^\f¹þ\e½°Ã\1aýbî½F\8e\19!\83
+ý´\860=!\16ÙÀ\83æ\81gzl\96`\93\9aõÄ\1eÕ@¬\11\ 5\80\Ìð3YÌõ>Äê\94G\b­oÊD\99\87Çøös¿à;\0¤Slºøöî\eD\99Øw\89r5è,\1e\9fhÞÙ^l\7fôÈì<æ>Ì/z4~\18vòDZÖ4\97\vDúìȯ°«ßBöò.\1c\98Ñ(\féçë~§y\11øP\9fjzY5º<Dåà6N.Ò¯\87T¦¡B\16E C¬«\9cMh\akN\94\11o'xöÜ\13¯y\ 1\84\1dÛl\ 3ëÕÎC\f>\8dNèy°À1øl´1xÝú\8b^Ñêø¯\81\91\9bî\89´Ö¡©ðf\17\94Ïq\10rßewRy\8eÚ këªÃ®0IÚu
+ü1ü^\981\11fÏo¨9ÞÞS9g\10\91Kzñ$\8b«s\8eXë¹
+¡W`\84(ß4\ 6ß9Ã\ 6Þ¡·-ì¸z\9aXOG§\18RéoÑó-\89QsdT\91ë+â\10\e T\9bÜ#T§\8d"\94\fj\88íÓY\ 61b;hë\87ßâ\95¿$î\11\17\1cîC0É\85¿\f\fcæÜÇ­j4n+n\12\92\8d\ 6yäÅÆ´\a\¶d\89fvD\85ÇNxgÎÜpHj¿±\13´,a½Ó\19Â\90A.+\aÑ\bÃxÔü´\9bÈM\1av\11\aº\8c\11*DWp<po0{}\17ë\89ï0uO\81ºu±xÝÔÓk \9e"lÖ=îݪ{è]ÿa¦ÆtþOòI\83\v\1dÁ\97_\0FöÜsY\7fNtØZvå÷»À\8amh^eï\ 2û¢äî=\9b\rÿY£Ñr·C­Þ'Bn\97b\8c8C
+@hR/ÃÏÜôÿC×y.¨ª¬[û
+ÎE\94 \923\12EQ\143¢(&ÌYÌzÿ\1fÒsî^{\9dóýy\1a\9d\9aVªj0j¼\fíO·YZ-¦Lê\95\11+\94áV\
+\88\9b     9¾±\a2\1f.¿I\16Ä\feE¢¸ZT\88\99\12\99Ú\14'2VÁ$\8aÓ¡M\14\12\11^'v\80³,Ü붺 S8\9d\1e­z\99\8b\92\0\8cÊü\0\ fK¼°mæSKÁÐi\7fNÉýÈþ\88(\ 2ïÙÓðñõrÐ}£¾ ^\93ú\86Ê¥;'
+\1c¶OrÒzBdA q\12¾è\1c1ë¶T¢TØ\16        \14A\9børQ
+pBXn°Í5ûÆheÆ¢û\97QB\9b#h\84rñÅ\vmzo\ 3ÝoÄ"Fã¹oqG\8c\ 6r±¿wY¤«E]ȵGð§ÉO\88\13òÛ\1fÛñ­»mÿØ\8e;Ë)\93\85¨*Ä×ËÔ\99é\99é\ 5i¥ù\90@×Ð\ 2w(h\83\13\8cm\9bÖ\13«s\1e\8cÑïÝ×y\8f\1eÆ\90\88¶òJ\ eåá\8e\93\1f½\8cÄË\vä\1a-ïH¯\9b£\10\17Ò\8fg0H\ f\86k\bQ¸¹\8e(è£\88ô´÷\ f|qJ¡\9e9^fÚäõ\rê÷4qsf\19~\9fx\8e¿3\9bÿØ\8eå`:àD\1c-¦Ùh\93½Qã\ 6±Á×\ 3f\82ò/\7f\9aɦ\1aó\18\8b\1dr\9bÞ.\88ß`>ñ56\9f\891fÓ\81»SÒAG²Ó\86ÔëÀ\9fÛ;\84ÇýÚ\ 5Îëé¯l\a\85\80\8c\v!\8fÏ  *ª¤\0\85\8d\86ÂÕ\ fþ$\8aÌ\86h³ý<§jñ'ãQ©Tø£u\7fÍ&¹åÞl'\9eci¶\18\88<'U1z8\10\9eÄr)\1fÑS¤/âf\90þ0\fÓ)¤º\80\våò\1aNãþ        \9a\ f¨T{A\10Ê°DªÒÎ\8b)B\bLPëF5@+Ê Æy\ f\93\ 64'ª1^m@c»ø9\10q\80\85\18½2 ®­o\98IRk±M\9dûxC.?ÒÕ´\87¾~20,¦0Öy\12iËféT\12êÝ\9eÌ\f\96\ 6\9e\f°ÖT» OÊÙ¦Í\11´\82°öx\vê\ fc\v\98\b\98\96w\8bqJ\ 1&È&\9bË\99ÀÏ\ 2f\b\15\ 1ãZ­\18×)`:µ\b0\1eG\0¦º7\ 1Só}ÀXvü\9cÚQ\0Ã\11µ\18\85N\82\1f\ 3uÉÚ¨{Í\94ëÃÑ£ð)\19[cWCÇJÐ>ºßa­ê÷mÖ_\9b
+¹xfH¬}F!äUÖ\1eéüýp\81ð\1d³\a\1cØ\1d\0\17¯\95\ 1\1eñQ>\15#ÀcÄ'\88\83$=Æ \ 28\18íÅè¯\0\97f\9f1N,`\9f?\eÿÙ\979\ 1ì\99x\ 2v­å\ 1»Éô\ 1;ÉÏ\12´\ e\ 3Ah(\8d!SYç-¸¨
+Ø5·a.\eµoÎÇRÅn¸\9clq%ª4ü(Ø9{¡\91w#\85¤Ó\9bV*U7çwÀ«Î5q\10\17\83â\1aÄx"\80/a8à\9b&\e£'\ 3¾ÿ¶\0?/5c\9cF\80_\14\ f1^\10àãi:àGf\ 3ðcz\ 5\ 1\ 3¾v)\0¾þ\99Çoe\9dcÔ¯MiÍ~W\ 4Îbþ&JÙé\1a\98Ë\91\17iò °Ê¢[~ÈõÜS3\89¿À"¡-#c©ÏÀe1\85\83¶ÇC@¨J0\10Æ\16\ 2\84µ\93ù\8b\ 1        \84è*\0\11\10
+\10ñ\82    Daò\1do\80\98Ët\80è\ 63 v\98K\8c5\ 6DÏÖ\81Øå< öà#\10ë'\12\88\8dE\19\88ÍÇ\1e\88­\ e\ 4D{Kü\11£ßz&?O3/íº¹\1f³ör>çnýª\9fd_`Þâó\r9EòëL\16ÆO.\ fD~NÄïñ \81x¤¹?\9a/Sø\86\13W¤?¨\ fU õî\ 5 \85l\ 5H·F\vdÉh\0²Õú\ 6d»é\17ÈNæ,ÈN\vE\90ݱC\90Ý#\8fD Þ?%\90\9d¯â×\1fg{\90=M(\90=SÚ\8f\18mácXï\9cÊ7\19¹k;¾\v\98\90Z\96g\1d¬ëw*Ha\1eæ¡:ûRÿt"ɾ¸\9eô?vãQ¾\98 iæoÞÄ?\85ß9ã\ 2%=\18\ 1ÅJ¯\802u/\7fêÈIw\r¨ùq\e¨5g\rÔ\9e\89\0Õ\97\v@íãÃ\18·\eP\a\v\ e¨\8b\822\18f´³ðW¶\93gØé"\88Ì|C£\rc\88õòé\16\82(L%ul\16\v\7f¬ÐßnýȽ\89µ7­¸ÿwÄįà\9b\98|\13ÁW}%©½ÚÌ\ 5@§q
+èµc>¾^÷z@÷s\a Ï8\1cè\aÊ\ 6ú\13\9bÅ8¼\80þr\18` há¯|\9a\88¦        ~C\ 6\14ûo5¶$d \7fJ$Õ\9fü\86$þ6qõþ\86"\94«ÿ\15\80\8bMbèËg\80Ø»§¾è]\1ec|ôz\98\9b\ 1Õuñn\1d\1fõ;âvg7ûz9ÿ\968ûJª_\eo\12\ få|/©Ðõ×\16\9b\88¦\89\86Z$þ\86\f$1½IÎDjô×}\9c\847pég\0\17ÈǧTá\1fæª&ßC²iÜ­]R\17÷\8e4f\95\9b}\9aÕ¯kqÖ¾:×\93\7fÙ)\97Ñ\85 ^óè\98\13\ e\11?­¾Î\1er¢N·\8a_9);hð\e{\9b\89A6\89\91M4Ô¿ân&\95¨}?Ö^ö?!\ 3\89\82nV\9eú´ç=ÆÈvr·6«Õ-¾ê\1f®¤7ýO(Â\1a\8aøÑ\ e={Ð\8e\8a»x5°Ü\89Ç\80Ø)\87\98;\98Ǩ¸\ f\85g5ID\88\9bÙ®\r$Øì
+úf}´oHÜ#G]yô¨\94të'\14á\9b\8207_¾\9aHªÿRN\13<Æi\80Þ\11gI\\9dÓD¸0½\89\1eñÁÆ>K\93Ó×5t|Ú\9bîáSÝ\f÷!×\9fì\16\92;ß:¯ÂjÓHÉÛõÑ\12\ fk~!F+\ f\97\1fË[Mþ,\95\83\89,\ 2Þ&ç\1f¯#Ρ~O\9fYï³\13\85Q\88ͩ״\8a¹ÔdW­Ð      âf&\r*G\8d\8fM\82ø1Êþw/ÿj¨¥ÓY\1a§.G}9\7fì­xµ»u\1e\ 6º©\7f\8aì\9a\9f\19ÙåÍ\11ôųÁ\16æ\1f\17·çP\ f83ë        \1aáÂ\0ß\93\16b\13Ð\9bVÓ \98\92s*\9c40v5nSìa\145ÕÛH:× ¡/M¨àÙÇs\81þ\8e\82Á8o\1d\ayxð\1c@³ÖãÇ/û\1fü\9cÃO>|]\9d£{8wÞ½ï\1d\8fç¼\b¶¤\7f\1a¬<D\e,\9e5.\9c\9bQz=³îÄ9´ßôsJ\86HjÂ,¡Ì¸M äÈ£?ìðÖú\88C%z~­²\88ñc\95\1dëXy\0\8d\99F¿\bK\9e¿(Y#\1f[uV\89¤J®¢n\83ý@Þ±Ó\91½v¶ÒíDýÍ¢ãi³E|´_þâñ©®ßW
+ÙDÇ\17ÙYn«ÎÝ[yéAi¡ï¡Â\fé\ 5¥)91*ã6&´FñºÂ\ f\9e\1düë\81
\9b°\1c\98/aß/¦¨³¿°¨\9b\8fųê^\15§SÝ]\8d\rZ&¼cKc=>ÊI\1d/[1Ü[¿k»Ê{Ùj\aæ+h}fê¦\95G\17\9ffXõ\8df\91&[1Ì^\139Hß­\8bÉÏ\ 4·
+:K\9d4[;o8¯<^ä\ 2´\15.WPqÒ\88NÒ(rÒlðlÏ\85\81ùè(þ"o\9b½u©^é6H«á\1d\eõø$¸ö #]\9d\89ë+μý\f\9cu;0:ß=ì­Ï¤\13µòéÞ£\19Ú\ 1h"ë\ 5Ú(S7®¾naZ\9d\8cÌr­\91\1dx5æÁ­«í6MT\ 5c\9f¯
+®Ñp.¢Pwº)ö\a\918¤ÞÛ]ªµ_\8c%x<ÝiÓÖè\86·\93"Ü#© ög\13\1dõqé[àxs\87ãv/\84ëW_BÛÐ^Zk¼¦\8aÍðÎV\9b\99\92Ún\94Wj·¾\91òA½z«Nk{µº¨±KoWu\89 ª
+ÛèãtU\1c«Ü\87\86\88\81ùµÃÚå\9cÚ\9b\97\0µ'Q)o\17Æ\93ª\9dÎw\9d_\1cÍùþ½R«\9fmX\ 3ýÑèÞpÚ\ 1lçK~UD¥.oÞÐ\8eÜ]?ÚêñjÎ:)Ш\14ÓX½æÒ_S_­Ù£åê\19Ñ̪X.ØNwS¨:r­Öªô\1fÝ^ù­w\83rn= Ë©êek\17\ e *ÍyöS*E.Y\å/jÑIç«Ö¶\15\8d­º\10A\16\93\1ai\85ÃöQúA«~ø\ eÒÉÏÄ\1c\9d\88Ñ\13qP\19\aSÑìøµ=e{\97ùCv\rw\8cµ\10¯|¯oëñ\18ÎMÐȹ¶ÐWå1\962å÷^§Ë&g\89ötT×l\ 4jåKóp`\970v^/:îükµ*\92âµoÕ{ï\89Å\14åM¡µ¬]\v¼{Eò\9d\eÇç¥pV4}\94í\99>/ÝsÏ   "å\9e\9bN1\17Ô\1cë\17«ûqz\r·\8dÆ6I\rî¯\11Þë\9eßxÅ}¯\1fI80ªxD½\89ªOç6~oË\1fÉÚÚaÆ\8aJ\v±þ.®-\ f)\92\8b þÐ
+kÁb.\91Rh\17>f>\9a\7f\8ay¯LVÍÛ\86i\99~×î\9bª<\9aå\82ùõ\903ÊÚÇ\18_¦´\91ïÑß;\1e\ 6l-]}\96ñ\ e\1cðzñÃ[\7f\10\91\85\ 4Ëܦu\9dò\15c;\84fâÔo\94ù\9e§\92\99jÛº_\8d\ 6\83Ç\8dÉ!þ*OJ«M    \17n+k÷Xl\v'ìx)\bÕç7Þ0ï=¨\8cy×YÒTÇ\ 2\97{UËJÎØ\97\8d\1chzE#\7fö\1d\ 3\1eE\1d}\96Ç\86zfo­µes~Ó*º\82k\ 4¶ÕÔZM¬«µ\1e»QiU Uº\18\15â£]þ\17ß=\1e_Ý|ì[Ôv°xÓaO\98\90~\a\14\85kW³\16\98Êh     Þñ07\88;8oÏò2\9c]\9aý\92±Ï\r;Åk\ eÜ\1a\1f£Pì#F:³$õReÃé(qÉjË\e\9eÓ\b\95ý.ØÕÍ+\1fwf9öUºò\99\9b~V8\7f\9d\96Ï%3+w¸GU\16£É\\96À\9dÌ^§\r3\81,^Û?\98\91\1ev\19\ 5G|×ß8Ĭ+ÓXß\85_p£±ï\1còUÿPNâ?\8aD
+\14\99bo\9f\97£ü4\97\e\9eB£0ݯôÒñrÔVÂ+>AW\1a¨[KΨu¤@*\87r\89SZ¸++Üe\93\97ÏÝWEîXjG\96\10\7f\92íµ\9f\87¬"\16\81ôL=yi°ë}\97Q\92ÞÔ&\92>èb\92\1e¨9Iogÿ\81\90\85\91k\92\19íïoèÜÓ\ 6È \8dV@³Á9ï¢3lµ\ 5\e/<R\85hØ:ä>Ya¬ÛJs¬9Fe¦Ö\v\95\8dr\987¿ÓA¥Õ\9a=äs´\ 2rÇ»f²×û\83Ìöæ´\90\9c&=ù~I\1aD§¦¤O\84\14ü\8d8fÈ·h>CV\84\86JQ\b\9dôH(Rt:ÆI\15ÂZ&'\84\ 5`$\98\ØÛwµ\16ÌƯ}ï\L/:#\9b\1c\9c\1cåÖÅÛ£T\99|\1ab\89z¼áü]ì\9c\8c°IMÔ\9d \ 6\90\1aË\91N/ei,î³>,GÒ³¤=¤\0uR\92~\1eaâ§s`Åq\1eUÄ<,\7f?i"´ï×\85°yñ\85¢\9e_      Èg÷à\17\9b2ÍãôÑäqe>àÖ¯C\8a[¿»2\8fk{\83ǹ¥\9e`|wwפ\80aOʤ\97\1d\88çÇÍ\1d!xµÞ,U®¤£@.ríÔ÷n\949ìu"½|¦BE \1e~ö¶Z\r¥çn:\95\f\12?§ÇQÌ\8bï«\bCÜG\bC\13\11\8a\8d\ e%dعÈ/Þ©\1c_\1eÉ\15\1ew\86]nCÁs®z÷nì^\a8ÛÄ|\83e7úwôdÙmóͲ;Mb\9bdWg\9bPSK0z§Ö·þ¶¹?t\157µr\9113i2WµW}öéjÙ^¯5Kü¼3¹)Ó»jµNv!g÷\ f_2ÂÖ@Ì/í\910#ês¡¸\1d}\93\93ø%3=óåçõÉãC\ 4â69  çjD\9dç¨íTc÷~Êf\9bjÎeNËÉ\94q\1dêÌ\88Ò\12¥/wC£»ý\8fKËeúAw\87)!\86¨Ò\97\93ü\83\1aÿ\88æ_1%È¡\9b$\90¹!XY¿
+8®nWó;£ LP<\87 ó\87zèT7Ùþ\83\18\b³¡Ôã+\162à6\vlÂÕÊÊ\8a£\85ú\91Ý_Fw¶ÙÝ\ 1\96³ \94q\17\88eS¦¯Âè;HÓÝË#\9e¹LK#êa]\8e\94¶ÌÁäÛ}ÉäH
+\9adî>¿\90#yÄ\92ïÚ[I@i[T\ræ\81\7f÷ùÕéÜ\19oÓÛÖ&o-ê]¥\188ù·Ü,5îG3\1fL4Ú(³ÐwE ò\9dñA\1a\rÄ\11Ol±.ÛÂ\16=æ\]\ f\99\ eõ\9c\ 1ÛÒ×\81\1eÑ=½þ¢\1ec\ f¦\ 6Õ\1dIé4$\92ï\83\92#G\83Q\8d4\8dô\80\98NJ\eª§S\ 4ÂôE|~ÊVq{d\7f¿\9eø<2i|¾îe  \ 4\9bÊ\84¥Ïå\9f\90\96¬y¹tà)whîïöªÖ?\96G\89í¸xÚ\7f,sR(qzõDÂò\1dZ\9cÅ"_\b9fÊté޽ݥ\ 6ç¼Oé#oB~Ìð+\10\93c(:\90æ\fº\92PS\ 5DÈ50Â:\87\1c¾0o\1a^\86¥2\8eÍâkQ\95O/12ê¿Ð]WäPæ±´3Ç`½F\99×\11G\e\9c"¡»\92.aäÌÎ&\89áÞ+¼Ü\ÔÒ¾ûÖ\1a禳©\8eÊÕIÙ\91J\9eumavn\9en\8aêé
+¥³96¼\bø¸²`.\8aäS\80+{D±\ 1{øâ\ 4÷ñ²+Lq<W^c\9b\94\7fªÓõ\ 3£\8a\0\19\81DY·\9aÍ\9cÄÅw\ 2\95ißÈVF\b§3äR\92ïH\17=ÓHví\96Ò}º8G²S\1fC²!$!Þ\rù\81/\1c¼\8f\97*\81g\9bDJ×ú\r­ï\9c0^cØõ[Ó/\f"¬b8v3«(éOFJ\ f×ß\92{\\vv7´\16\98C¢ÔQÛèþ2s3§G×˸\83Y\90\11õS\88\\ 1¼\89aDHwã\7f\10¹¶GÓ\ f\ 6çÓýcÕLkíc\ 3~笠       <J=.pίãpJ#Lhò¾\f )HÖ\9epJ\b\ 58WÞIðpqËv\1fú\10ê \1c\a\9aÇré^\v\9cú!±\1d\97\ 4¶ÒO¢\8eµv¾¢dÇ\ 6\84\vätýb|ÔÝ\93!p¦Ø\ e*w3Rmö\8d\9d/uÒzµÙ\87?Ôðk\89\87Gûý
+6[à\bC¼ð\80¦Q-\rYã=\9bZ¤a-eÏË\ eXcë> \vÌ6F\ 4\ 3Ò\1a¨\80T+\1e 5ÿ  H] \ 1É\17Å\ 4Þh=CÚU  M5¼MéY\9dÄ\93üïèI\1d¼Uá5åúƦ²p\94¾VÐÄe\ 1¢ØKyü¡&¤{«\a{\9e¹¨^\90~Y \aÃÕa?U>k}@ùh\10#7\8bÑß\ 1ª±¿\0ªÉ¥bt)@µ`-Fû{\87\1dPml\18c~\ 2TÅÆ\0åÐ& Ì{ü\1e\85ø\vLÉ», \14,~\8e\81r\9d\f¼ÄZlHÿ\ 4`8¨Ú¹ü©»\17\1d|M\T\9dlÚG5\9e;G\f\9d{¸)\82\18\96¾¿\r\9d5¢½¢\19l!Ù!ØögC@\9f\87\93\18\9b9 #°\8d\91\8db´ß1N( /ª\18#\1e\1cé+ß\ 6ôv\1a\ 2zW¸\ 3zO°\80\9eml@\ f¼ø\r\82\1d\ 6\93D¶Ò\95s-A»ÆÍ\88F÷Dd~20Z\16y.@Äf®·ÎNO6\ f\94#4ð\87Áè/\8f!ÖÕ\12\8czJî\86\18Ôè\bgR\9f5Ø]\8c\10°\ 5u\ eX¹¼\89á\1fc,.\89rkAï\18*\12Ãgb<UÀ\16íJ\8c«\ fØR-~½\8e\82\18û,`\ 5¯       XÑZ\83\88\ 3\16\0\ f\12ãqóì,é$\0£¼c¯oK¿{\ac·Ñ¾{£\14c\buE*Ü8Ìk\×Iü(0h×!ÒH
+ä^Ðò<º\0®ýÜ\ 3n\89\1dÿ\82\8fbØÏ\18\1e\0Üi\8dÄø\90\80{\9bR\8ci\1eð\18×\8c1\19\ 3\1e\89@\8cßQÀ§|\ 3p7«\a¸»x\ 6Ü!>ÉÜ1\1f?\\1cWñ»!\87\86âÏØʺê¤\8bj9^\el\8aðNÕ¤ÕDÜb\8d\ e;`ä2é\10O\15í\95\96tzºxd gn¦\0\1fÎ\9fI3\89í\98\82À?\91\18&\ 6\84|\8f\ 1Bu+\ 2¡\8bê@\98Tl \^\1e\10®\8d\ 5\10nÈ=FH\ 1áî\14\81ðÈM\80ðd_@8Á2\10Vü(Æ#\91»\85µ   ÿ\11£·Ç\94¹\\ 5\17õÑ*­%§Î\8fØgîÞ&\9dwËBýBQN\87a\97ý\13{\91\bÏ¿\9eãDðM\10¤\18 .Pö¯þ[Ê&\ ebf\92\ 3\92r/\ 1©¡6\80´;\ eA\16vö \9b\90¥WY\90eju\90e\8d\15ÈrÙ\fÈòd\ 1d\ 5t\ 2²D:\15ÃeK\97\95\92É\97\ eäKëM^§,6\-8U«öÉ\rÍ}ï°£êåh¦Ky\Iqu\99ûÓ\85D}®wå?roâïMð\9b3\91¨¿_kí\1fÕ÷Ö\ 2
+\80\92\80Rï?\80\12j\14Pö°\95xnï»\ 1PÓÓ+P\91\81\0Ô\8cÛ\ 2*ZÜ\ 2\15Ë¢@Å\91|!½ñ ½ójܳ\8b}nÏÝ»XH\11øÌC\a\99\96\93¶ùq\ 1t¦}ù\8fç8Ñz¿\11\13ÿeíM|Æò#þ:ÿä÷&Âï¿4ß\9f$ßæ\12h\æ
+´~\1f\ 6Ú#¾\14èé\8f\ 3tå<\ 3zqö\ 1zs¨\ 2½åû@\ fê\11Ð\87$\ 6tw¤þÏ¿ò\ 5\12$rä¿B\ 6\92\98Þ¤ÊÙéñ·tXâêMB\11àÜ\7f%8\84\9dg\90Þõ\9fúü6~|ÊÈ÷ÞÚÃÜ`Û\aTÓ/wëà|îHkGÞ\16\82\9d¿a="¸:Ow\9f\ 45$H\²\89»id´Ú*ª­ì¸O*úW1Å¡¿jj"K\7f\8c$£÷ÇÚ\9bT9Kò\e\86çg\0\8f\9a~@\95\a~·¶oæ¶`Sâ\rsSÊu-\12¹+Ù#¬ËN\11+\17&\90\eÑѨt#~Ò\1c\9e½ôpqºÙûãIÙ\88Ð1`@îði7¾êàoòmbãMÔÔ${ )Óõ¿åÓDóMNóN~|
+·Â\ 3*Cµ;Rü\eÖâÇ\97]\16\9bGG\rÛ\9e#\13:\9enÖó{é<)\8bÏó\18\10\0\1c\17|\1838~\80Ú8½·.\94°³\1f\19yë|2¹M\ 3Î\94Öm\94j¬"§:\I{ä²ô¹5\9b\98v\7f:öñwz"î&1²\13f/\92ÿСÿvuð¹}îÖª\99º:'\1a\8eZ\8f+v\96ÆWî¤ÌÞêQ_§­\ 3Ôx;;ûºjlvF½µ>\16loÍÏíþÊÃìÑòVµÃ¥²·\97\8b\80³·óOÇ9ÍÍ[ë;³\99\85ª\ ffÈp\81\85ØtÍN«\19Ä\98ì*õæ\84Ùå\ eã6{Hÿ\ 4 xâ4\93àÇ%«\7f\1e\9f\7fèÐæ¬ñø«¡NW\87O\85ßììh¼Ý0£üwr»\8a\8aÆcy«\14 EÀhØܼpôÌzÐB¸Ð9eºÎ£ú\94\9c¡ùÉ®D\97\8avÆm\92n\8c¢\ 6×\19I'y0ôÅÜ4xöj\9b@\7fö£ÁØ8§ây\93Èö\91ÅÞñËDû«ÜúØ6:÷Öõõé\1føZf\7ftèoZCÔº_WG}q\1cn×Ò¤µ\92æ\87ÆBß×[3ëÆ\7f]²Ìp²³ÈùøX&·£¨F\9e\87·\16v\ f\9e\1eô\ eô;ü­\183\18kpf`¾)²\1f\9a8ÓGBJôË\19Jé­+\82Ù#·ªÝm0å¦wlû}\8f¿ìæ\1dO!#÷\16\ 4\98«¦Z\95\7fºd\91÷¨õY\9c\87ÉÑ=DÕÛ9j\1e¾\ 2ñ¾H\97ã¿ =µç\9fÆZ\ f\17
+\9e\9d4à¥6òÈ\92\11<]¹8\18+\µ\1f\1a¢ë/
+\9cß[Ûô¨G®¹Y·A\89kïØ\14÷\1e\7fæN\9d¨£Ý:ÒM{¹¾jBíçÐBÛFª\9e\1a[\ 3¹\ 5\85f\91\e\8bº6h`ÇÙ®^\15ût\9d¼e\8bµ\9dßhü\v\97Æó~ÛÏ\86úrù \o\86¢diÂF/y\94%VX _\98Lßz\1fñÞºè\7f·\95v\99mUðøcUíH\97jÞU\1eÕr;Ð\eõÖgÜh·òp£Û\fK\8dA\13Y5Æ\8d\85ãÏ\eØ.ØÔ«ìøXÛ¹ë{\8d¹Þ¡j[ÅI'\1aæe'\9b
+J\15¿\bu+jf{*\aNïûÛ\94\83*aþÀ R¹\ 4Ç7/\9fW×}~2³»)wÜY,JÁÈifû¥\89\8d÷âµÙËkËå«ëgÁ­­¿.ï\164=¤\e\8bò\8ah`\9b\ 3W'\ f+©Öà·Z\8d\89®ßyZµ\9d½\96\9c¨\7fu\1cOO5+·qÚ«¨\14\1d\94\83¦<³?ïæÁÎ\9b³g)ܧ±R±YÉ\16\17ïK¥X^\8fÃ">Yg¬MÝT¬M¯®[5ÅÒ\12ü\88ÑÐ\r\9eLÚ«Õ·Zé\10È~Ù_/sJ\97\1f\93\84û\98DÏv\8a\9b\99:½«SÙΦzâ\ 6\91s1çïʽ±NWÔÓ\91(\ fsO®\f¦OÉ\9e4\18Ã\86OL¡4s\95r       MY\8dbÅr¼"\81\8cFV­}þ~Ò
+û+q)4{­tþ\8c\\85¼»¬ØyÑa'f÷NÁf\ f>ʦ¼ßý\ 3«Û\ 5Ù\865a9\19\9e×_FåJ×­\8b\9aû*AT\vù\84ïú.UÛU;°\1dVúÓãw:XÎ\95Ã¥]èî\8e¥Ò`w+®°\17(\12ÝLƪ=pÒ¢\a\ 2W8èy¹À\8dóz¾CU­¼¸\ fªf\8f[¸¦\1cA£Ü ons:¼z\19£\16O\19&?7\8dÔ¥âëÓ©÷Ñ­\86ðµZé\96¯\8aÉ\83\ 4\8bIi·\9d¸\ fw\12X¢Óõ\19¸Xí<\16\9dv ¶AÝ\87 \9a-Ëûò\98¸\rK6\9dé\17\89oqs\ 6\ 6\8b\ 2\8f\82]¾Ó¡.æõÆ>Í\9e\9f\83L¥è~\r0¹ÁÒ¥sze"\1a£ëF3ÌÞËÒ§¯LU·\96å\9e¶ Æ3;1\17\r\v\17\98ZEIE%ÏWW%/øCÙM6l\8c\13ÿ\8b9j\ 6ÛÑãS\99\ e°ºÕëz¨úÝ®à\9a\eÚl:½\ f_\13Ï]¨\92+pÇÒ\92¹M,æ¼ï奡Ö3\95mn\94\v\94æÒø\ 4ݽ\91\aýÈ\80\97\ f)\1d9¼Q­l ´\86\ 3QT×\93\92\1e\7fR»%ew8µ\94F`|\17\85ò \ 4\a¹½\15`Yèí²Ù\8bZod»èð\92íb\15:\86Ëý"¬«ÕípLiÓïXë{þªØl\17k²Õ`\9e\9foZC7mÏ[ôÙ:\80õ4\9fÝu;9@?:\89ÜÍ\9f}=\93=\8fµò<µÔp\9bÞ«Õ5\17©\94Wz)\8d»\9dRØ~\a\95\94\96]ô-g/UÔÌv³\95Z6\e¯9¤ûÜØJ\1a¿þ\88¯\8bÁ\89Ã)â\88ÃP>\8aÃ=MÆÈ}ïx\88Ã\99Ì&Htó \9cåf½\93 ô;C)ßjUÒZ©.¸P¶ò¹MÐÒ\9a\97¯\85Na=Ë\rO%WϬ{-uÓ´\\95:;}¥)µ&ò)\1c,e13Úe/Ëm\94íV\1eß\15AV\96\18Xºßt\Ò\8au^|g¦\9a8<£\151שtÅ\94ùZ \85}ù)¤\9b/\9a\9fë¡ÍÏ\8dó\96\9fçæh\8c7\93@H\8fPv"]ÕÝ`\89\8a³\9e\bÌÀ\9d\84F;I\95øÞ¿\91      D©À\8d\19^lT¹[ÞOGKÃÊÕºjmoÖåsêÙ\90Å\ 6âe»'2\90\1e"3\95´\1e¿\14ß\96}\10GHë"æ\16Ó·\98\10a*\92´`¥\1cEHo·%ÞfÓm\1e}u¿n;n5Âo\9cãÌH\8e¤\8a\16»}´Vìöi#\1c©l\19\8edæ4çÔ\ fÌè\85P»þ¦ÃÍ»rM\1fºéF±Ó8è¹Ju\90âõ2\9aY\92\96\v\8b\ fÓÐw+ݾ6}\85ç¤ZV~\86µDî\ 6~S\1c\15Æñ     \9a\87\81`ñ»PHG·\15?ï"\aÞ.èw\1eK7RÜê°&8§\r\89\1ciXyv\aæ\r¶¾\95',Ó;]\98£ZÁ\19~\ 5\9b\f¿ff\f¿Á ¦\8dwh¦\r\92\92{ÌÑèÑI\12w\9f6å¥7\90­qÛV«Ý\ 6\8f\95ªÎ{«äìÊëÂ\14º}ù\95ËGÇ\8dF)Í\81,\9dùª8ºT\1dÁ\1adküü£¶y{\\8egnpuÄ93\7fÎ\91ÍÝ\8eÝq\9fït\90­\7f¤\ fË\8cË\19æX]pL\9bF\f\86\7fÔkt4x\fi¯ì\9e¨Û6\85P~o¦Sª\1a\8e~\ 4\8dÛC§¨ÛA"é,mRCø\ 2ö>\17ÒËÎh \8c[ëLÛÿSÌnj\7f\85®Òö\fóù\ 1\8dÙ\ 59¨Me6Ϊ\1d½! \aÖæÖ\1ep8ò\ e\1aì®ÏvYæ-\ 4Ìq\94\ f\99¶ãm\18\81\fOtt{>i¯Ï¦él©ÁPwt­R~$9ä+Ûë\93Ã4÷5\91\93Æ|\ 5\93 \R\88\89\13\13©þ&\81ó$Hc\8d\90¤1ú\10\ 1\9a\7f\1dz\9d\86¸î@¶9m\91'\7fP»­û­JX¯\17\b\17Í\ fê@úªË\9c\95³r\9fIÃQ¯ÃWÒe\87e\eËï\1d\ f¦}ZÖè\8b¸iÓ]\bôélHM¨{Q]RýLõ@©§ðN\ eÅ}\8aÌA\14I\82°\9c%&\8dc\89(pz\17\9fuVk¼\94·\ 1\8e¦Ó\12\9cß;Ør\89Üq43Æñ\92\1aâøÌß}ó\ 5\ 6Äþ~ìö^ÜÆ-êõy\93­\ 4Ã\9a:^vÊK¤e\17\ 5\89Ê\9aæ»\87èd׺)\92J­Ä©9íqµC¹BwÝ®MiJ®L¾\9e\95:9\fú\1e\99\87d
+\7fÍ\88É\96Ú\12\85^ñû\11ÀgÏÆ\e/\ 5K\14G+¸\80Å\93\86\ 2\8fmt«:\v´öN¿Pz4å3-ªÙÌ\1c
\ 5¥§E\f­]Ë?è3¥×Ù\v\q×.G­eÃÍ­'Õ\vÓ-ãÏ\91cu¥ü÷\86d.|oq­\11ÿ>Ùç\90Ú\bön5`y½Q£tÂ-\11\16NØø¼\86:ñ%Uláè¡ÐÃV\83î\18\19\1aF|î\a´^ÈÜQ\86.¥3\87Ã\84É´Ú\19\e~\13\89\féLW_G\17"\15ã\8bBï,ÖÓ7¬\1a!R\99Å\90N ü \17\8d.QgBÈ\87Öf=ÚÔ»×]è\14ö{ߦ\83U½ð\90<ÓX®Þ´r\19ÔßR~\8bïxJ=\8cè[\14´HhÛ-aUøú½Y\8c2«©\9d9:ÛZ¦M>Ü\f¿GûHÔ\94§\88ÇUÖ16\17\10©ôm\¡Ò~~¯¥U:_\87\9f\87h\ 2\aíú\15ú\!\12\1a÷V%èsÏì`\83Ú§á \0°\ 4Ý{\1e\92ü\142<TWûÚ w[Tìæ=(µ\82w;?ò½\82^'߬¬\8d­\8f°|f\ e¬ë\9e§_'K\a¯0ÃJæT:XH6¬\17Óý\8cS\8e1m¦ÕÓÃ\87_\1dt\f\ f%m\ 5\e7÷«@ÁÀß\7f ü;\8dCð¨\94M\95 Y)\95\99©}PA×{\80¯\8bi\80\1cÀ§\85\19ÀÃÌ\13T f\ 6,%7ã\r÷\99g{5íß\e\9dýêX\1d3ÏUâ9.J\97«\9b[äò\ 5µó:|\875iz/C<c°\11\9dçļ¹öÑC{YGzzÚ\86ßþÊ\81¬\94í¤lD©¥ÐÀl\83\95Ñê\ 3b2\98Æxl\ 11ÍÝc¬2\80\be)ÆÆ\ 6Ĭ<\0Ä\9c<\ 1b°Kò\ 5\88`P\0\84»\\ 2¢\13\7fA\89Î\8b\ 6\84s¡:VI\ 4-fÑ|$\19\18Nø"wÿ\88:n,à¼\1cl§¼Pídaæ\9eÎ\É¢±Zb\rs\11 ·ÍÅM\e\ e!¯k\12rJ>­Z\8cN;Ƽ\aÈãc\fÈ\13·\8cá\9ec<\0 Ï\ 5*Æ^\ 3dT¬ÇøL\0¹\19Ý\0\18@\86t\19\90}a\ 3È\16\85Çðå\ 4íu\87\83\1a\17¡û½õ]3Þ\8f[\85HA{«?ì\8fs\95x@Wåü© ¡B]àÄ¢\90¡
+Îé\86Óô|\93\91ãùQ:gQ}\bÍÖ\@\9b©6 %º\17C\vbT&1\86Ë\18÷# ³Â#F?\93(·Ô\8b\a4]-\0\9a\81:1\ 6ñ«2Ú\aÐ(\9a\ 5Ô{ß\ 4T´>\0j\13 \80\9a\9aV\f«ø#F÷'£\943'¯\8fR\aó·ùôQ\1ei\9dú±\99µ\1c·Àó¶$Òfíòm\ 6¯\ fû÷Lo=Ú§Íág amc\ 2\98Ùrð\aýKüp\80/cħ\85\19ä\ f\e`æ/\b0\v\83\8a±P\ 1³\94\1cÀ\fçñÿ\18\15â\97\8cÑ\f`¼Ó\8fû81*[õ+`Ô©\ 1\18Mk%Þã$\90¹fÒó´}¸Z×\82¹Â×ú±¹
+ä¼\n\bl\8e+0\80Ý    \ 4Uí£\19ÿYy¦óûU\94ª!Ñ\ 6pÀ_\ 1\ e\1f¯\ 1',6ÉÑ·\19\ e?\1e\0G WÀ\89Ò3F9\ 5¸Ü\ 2\a\9c     ñ\80sZyÀUÓmÀåÝ\10p\ 5*~]áB\ 3N\19\97\ 1§¶âç¸Ü\apX?~\88çÇq3Þ²®Wd¢¼Sß\1fˠ¯ü`ìñæB1^R_Øï^u&Wíä\bº\9cå2\ 3\88ΤÓ\13\a¤è[ç
+xÖº\0¾Øº\ 1Þ\1f\17Âí\eð{\f\89¡\10\80¿×Y À\a\15\br.ñC\vò¾\a\ 4¥¸þ\e\93\80 \r¾Õîj; \b\ 5\1c\b\ 1\ 2ioc\1c\1e\95µ×B\8aj`=s\e\9f=(oé\1c\8auÌï2£@¬\10õÞMË裠  \ 3/\8c7\ 6Úy$Éå\10²X
+\b\9e\1e\1fE-ôGóý\11\11þÇî\9bHÀö\99\ 2b@\v@\Ôt >7E ±B\13HÅõ\18H%ë\f¤\16\86ÅØæ\80Ôîû@r½\e\90Fí$-Aòì6\90jnü\8c\15/b³×\edVFã«ú\98»[\89´¤1k¤î.±[õJ\19£\95\95á¥Úçÿt"iÿ+<ÿ#b"ñ÷&øï\88\89¯ð\9bÈ­¿ÂïûØ\ 2²®\a@\9e_7@AF\0(lA\ 4\8a\80bCË\18O\ 4(íw\11(îf\ 4\94Îø \14Ï\97óè\0{i½-|\96ÖîvÉ©ýñ7\ 4\88¤\ e\#3\9cÜ
+pe\9fQÿ\84/'Ýú\8d\98øiú+7këê\1fü#]â?\99Âß$ß\9fh\87\1c1\ 1êÐÝ\0\rÅï\89µ·¹Á\81\1a@;\9a= ½¸\13ÐQ\82\ 6:\96©Åx®\80\8e\87\13ºð× \9b\88¦\89\90\9a\98f¿     \ e?!\ 3ILïoxC\92}ûS:ìO(BRêì¤üdà\ 6i¶ôøجó\18cjóa®ËÝ\9f\0\kï\7f\ 3pwÛ\9b}~^n\98gÀWç¾\10¯ä`Ô¹4\0±ü­n\96\ 45$
+oÜLR\97+Q)\7f=²ÿ\152\90ÈÒILob@Nª\9c\11Ó§\1e\87¹ÌEwk«=nöQü\×\82\92¾\92]\ 5»ìd\8b¾0\ 3\8b\8f\8ez]þ:\88ùqË8GùQñ,ͦÎÉG·íãÓy\f\8eú\9e\98\1fÆ\ír\80<\99ß[÷\93ó\93Ñð5\19'Q\b\92¸\81¤<×ÿå\92M4ô¯Üý)\14¹»µÎÊ7{\9f/\×\»v©ß\1a\9ds\943ú§\9b¥\8e\8fϲ0;|jÔê`\1e¨Ý>ä©Ó\1eñ¨ë\ eëÃ\8f-9¼¿7\8dÔ\e^\1f\8bi|Í/   vå\11²²ô\99\añl÷¿\9eÛ\85~¥æó±
+\90Y\98ËggÅ\94\9aMDÞÄ%û£¡ú\8a\ 5ÿ«\97\ f¨T¼_×Ìé\16µ\1e\95Çé\96WÀQ_\91\99\83¹ã\99\92Òf§/\94u\e\ e¾Æ±\95\87zÖÒ'\eåųѨ-ôS£5\1f\8bÕÎ\1cêUý\99õ¬\ eÃ\85Ñ\bClâ­§Õtp\9cììõc¬_éq\9b\16ؤtØðÖµ&Cåñ¾'Á\aA` `ð\19\1fÞIªìWR-\13\9fè\1f\81\r\vâ\15ýSCÍâ£u;Õ\1f-oåÚ|\11Ð\95ÝÜ\8c
+Ñ̺\97^!6RRS2\942\93FF!Çm\82aFQ\9däG\1e#ÉÃ[\9b×\86Ê\85ÿnW\b\9e\ eô\87]\1f\8cõzg\0\8d\aÃ~\11Þ.ý2ú8÷ÖU\ 5ê\91û\83\1c¯Þ\96ý.sÉn½¶\f¯=þ~_%èHïþü©\8fwïD\87\902Ý-xÐYE\85ùW@Mê­\85\vÅ+Mv\85ì×(Ë6G\1e\86>\97\1d\aú\r\9f\rÆ*»é\879üÐG¦xä\97\11üîc\vöÝ«â\1cÔÝÕ¸L·Ak¤wlå8\8f\8f*J'^s\17\_\eVÛÏÑ¥×6`v\9eHª¥àÞ\82Ö\9eÚ\fkRû×\eû\ f\97,V_\9e\8eÏ"2Þ0CººÐw\91\11÷\ e\16'\r\86·ú\81\1d\ e×\ fuKöË°\9eë\91+¾Øm\90JÕk³Ò7¸¹\13¹J×½õ\98¾ë+ʸý\f\94\0Ò²5.HÛV>m\9d\9b¡mß\9bȺ\ 1\1ae*ÀêëæQ¨í:O£ÖÈ\9aµê±¿\1aUùOíáx\ 5M\8e±´\9dlzXúEÜÌ9[zo7ì\1døó\89×s¦Ô3¯\ fïf\8a\1a|¼í»\8f\8cÌWwW¾}<þ0L¹7¯\8b\ 3­FµÆfMh\86Å\8aÒD\96µ\£LÔ¬úº^+×Éc­VÛµÝV\8d¹¸^µ-»ßxÃ*ÿ\88¿ü\9e¾YUnãû©¢¦ñWÙÀdÔþ¬'Y;OÃv)lùÃRQ\bR%äÊ\b1\94ì/ö¨(-\17#¥äM\19\b)\ f\a¥½Ú\9f\v#ªGKmà       Ýâ×\9cä*·n|nRÜ®±°\1fÇz\95:\k\rî𮶥\1dìDþ\11s¤WDWü\Ä\97\9fÓ([\8e\87gÍþ,\9e¦\9dÇ?%\eÚ\92µR\91\91:ÅEÛ\f\8aØ¥³´ªòáRØ\ 5$\h\18½¯\b\99?N\89J¾]¤¶ùvã\9eÎ\v\1aEþb-eÛa¸. ÞÈoß\9c\ 1r\9bèÝ£mÓ\1d%'\80Ö\94¼\1f\1a\95ÂaZkô¡\91\13õªAÅ7òÓrP0\96öØVw6\14\95¿kÏR1[}\16\1737UĹ~ÆZ\9fg¤E\99\e®°\87îr\81\8c|ûLÙy¡Sl\99]h<ÌÝ\8bÏM®Ï9/ã5ºÑÆ0ß²\8c\1cÝ_\1a\94\8a1#~±\18;ìwOá¤ý¾v\83\ 2½¨ööÃn®Ó§t¶\15\1e3P\83\1cnNÕNÞ\99T´zѳ\vð²S\\9a%ÏÚ4jC\8bzõç\85fn²Í\9f\9bs^d67ór¼¼M9\97\1e)\ 2Ïi\16Í\18o¦ô\1d\b\8c\963RÂÒÑ\vÝ\97§Í\91ü\+-vW\r­äqµrýäU\a\16\97*1»\ 2\95\98\13\19\958phr4+?ïÓQ?\9cvû+=¬wÅ­\9bÿÉã%p\1c©  ÓÍ¥bpöWè*Í/\19תCt-ïn\ 65³û\18´s\ f{ÕÏiëÃÄ\18\85\91j^·ú\94O\9dôÂG|hó¼øÑlØÎhè¬C©\ e7\97T"Jå\95zV®+\f¼\1cÉ-\eßË<?\83³çKþ\9b5\94íLë£lgWyÅ\98¦\7f1Ý_\96ÓajÙëùu/ht\9eß½\80ó³\9d­·
+\14æô\8fË\9b=s\9c¥µ{dºy)XÙÆ;Âl#uû8zúõlj¶\83õ4\8c\94¾µ\89T§¡ÌTRu6J}X?*L®w\95\8fÄ\11È|ý\96ÉF,Éd;/G\95n¹©-ù$×\93\94Ûr#\ 6\1aû\16\rô"
+\9fõ­'|.\8f\9bh\88\16ü\8b\89xèN\ 3$7ø~={üÞkºã¶[jV%[©yé,Y\81ÀìQ"|{]\101ØÏ\ 5\97UEGÂ\9d¥:×¢¥ì¬\86£0\v¯%·q¿+ó\97Ý(ëÉ»0+=\9eké¶`N\92_ÖïɼT\fºã¯ª.\1a\16$\89\0±,!ß^¹\ 2,j\v~\96º<ùbØdùL³Ýæ3­^Äg\ 2\ 4\8a\8f>)¾xÄ ±¢»a\7f]¯÷»Ù\92ßva£_nìÉ\8e\a*]F&ûw\91a\9d­ù¨Âßü4#\9d\9eWÕê)ÈËí\0Ïg½      (J÷4ìHª\9di\8a/^í\89AT\1e\89 [\ e\85  \1cl\84ülw\16à\16òâg¼\91á\8b\9f1Ï-ó\91ÁUh»Éá\87ë\94Ý\ 4î\8d¥Si\92¥Iü;\81biJ:Æ\b\ 1[«îR Fúº9ëSJ'ðÔ³ç¶3\9bn¥~ò[\86\rÖ.wß©Bä:ûÜ\87¢F::?4\14Nlä¤~vi\88CÎÍ\89`4,       \ 5hR\15àpÿµÄó¥Ì¾ËgÎð\88[vØ9W1Ë{\8e\80ü+»ÙÝ!¶Ö\14(\96Ö\ 2\8dÙ\7f\90*ÃU;#ú,s\11í>¶8-\ 6C\9b\16\97Ñ\8eî ñZ×};\1fú¬y`\98ÏÖæ>»h\r;ÃQà}\87µJwX­\8bÅ\9eé\80O\91/mêD:\1eJ{§\1c4c'\1a©\9f[Ùk¯j\8a¹fWãg;QçQ\96\8a+\968B,ÔØZ¯Ðbi«ë³tý2e\ elfÍ4_ù\88á\86~Üjåõ\95íè\ eiÈÔÕ\ fËTO\93\ 6\94\82\9e\8fäcÝBÉA·T$\a=oM>nÊ'\ 1¥\90ú'(ö\vó\9e[n\8d:)3èþ\ 4`ôÔ¹U)Dm©D[2\9a×R\83ÈÈhB¨2\9f÷÷V\84ôT<KH\9fk*G,\1e
+[ÿ\9a©\ eµG\81i1h\85\89\ 6Ý1r]Z\ 2µ!-áû%uÝÂGª×3\9eäãéfÈÁâ%\92z¥X$>âÇ'F·Þ\9e\80JL\1a\ fÑ·\89\878û5Y\10Pùö"Ì%ô&F/ä=¨ ¹E·{©\8f]\8b\fý&Co\9aÕgf[ª ØZ-¶\94\12a\ e·Ó«^ÑÊKÅ\ 5Ü7HäXáíw_c\8eà ÐQzªÑ\92=5©\ev°)¥zø\9a,ȧ\9cvÉÁ\83ë\93ú¼\12\12\1f{¸%ÆüëF\98\17\19& É\84ÃC\8b*àÈ1ð°\85+m°²xLa84Õ1\1c¾Ï°rañÂ\16Ýõ\ fúµ\8e¶ô\1e\93δ=¿­\a\8dÖãôý¤U\ 3ö])ÛñÌÝ\8a\90\1ae¦¶×§¶Õ\82­|\ 5¥¡8)"u®º\9a\19´WÛ*äs¬gI\ 3Ö5â³oYĸ9r\88<·j\12ÐùÑÃÃ17Á\8bùÒ\1aÏP³\vVn^\ 1\86ë¹ï\862týY\1a(U\10Z\99=\1d-3\8d\9da\87¦\92aGÝI¦\11\19·Ì\9eo<QÊn?ý\16$¯:\1fº\15¶ÖÅEP\8f\8eÀ«\ 2\94¨ÙÕj\94³²È\84ËYaú£1Úñ(+ ?\15æ\19æ;\81b\9bÎ>Oõå\83Bä÷\92\8c\17Ï\88\82g:L\ e[Jz       +ß\9c\1a\86û\83\ eº)\9e\87(µ|Ï3{G<d\9a\95ao\ f\1c9Íj\1aâÚ \81\88X0O_6Ê+ÝíaÙt×Ï\8dÒ\97=þut!"e<\11\11Î>z\1d_ÛtòéÑ¢E©Ñ¸\9e]P¾\ 3\8fèFi_\80
+Iº\84±\b\15XmëÈEú\14ú3Þq¥\ e#A¯\12\99;lelùF$´Ö[g3ûçBÍ4\17ñÒ\8f«`ß\9dÅÈ\99\90\9a\88»µ{1V!"úè>}U\v\8ft/sÀÓòJVà\87³©Á\ 3ª8\85ÞÍè
+\8dx\9f\81FÂÖ\83Þîä\0k+ø\ 1\ f\19\7fAs;·8\98®\9aM\r\9b%u÷*¨Ä}OZ\89\93\99R\92.¡o\1a\ e*ߥè"\16íæ\9ccSz\8fz6á
+\81Ø\ f\1d­\8f0        é´})}½xJº×\1dçbÜì´b\91\rø\89\98=x°èL`½|ØB\1f\82¸AfÏA H9\7få\87\945Ôl°Hm\ 6À\ eË'\80i0\ 60\9d¯\ 3; V1º70?öo\9eáæ\ eí\8a}Þ5Ü7¿¬\9a@\1d%\9eãb§àTÍi\ eÖ´æÉÁ³¹âñÆoÆî\8aé2J\9f̯2ß+4V\1d¿Mä\ 2Å\7f2ÕX+Ðç\11/5òzY\87 \8f\8aùÀIeà]\e,æH\0p\8c\9fÇ\18\9c\ 1.0p\8c\11\ fpB,ŸÇÿJ\8e#\80SU
+ài§\ eâYÇ\1e`Ï}â\1dÄ\9e\97\90kF­:ö>Ö\15\93_;Ö¤8µwR¿_xêJÕX=\96ªÒëI¸8ww\ f\8eÛ77ÔHP\86xe\97ifÎ4]J÷w¦\ e§\b(\97ByÏ\0\ 4e|Ñ.ÆX'%\90\b\1añbXã\18«- \18ú\1ec\84\ 1\82¥e@d&\ e Ðò\14à\1fì\1e\0~9´\0~}]\0¾+¥cÔ2®-.\1f\9b\8ej\ 6¤ï*\8b\89¿( js\90\87aä{±ÑÚÕ¦\9aÍ\v\bÁ7\98àI?;¥\1da?\981ÚzQ\1dD\19䪰\19N\8b`\9dþä\ 1i?\8b\804 r\8cøÏG\1av'Æ(\0¤p\9d\ 3R\94\8f1&\1f@J\1c\1dcb\02«¶\12\81\98z.\ 1I/R\80D\9c¸û¯B\17\10çö\e\10Q\86\ 6Ä\1ag[;köJ20ªù]ýôã9\1eZ¨oÔÄÐQÔ·¬\8aø>"Y\19ø\1f²\94\91\ f\18»&C¤O\b>\9c\8fjßfRøp^\ 1Ô´^\8e1m\0ª·uc\»\7f]ÈZ\18£»\8dñº\ 3ª\99Cbl\ 4\8cb\8c§\ f¨ro\ f¨\8a\85\ 2ʤó\80Ê\82! èl\ 6\9d\12ãù­\7fó\13Èü:h/\aeëQ±{§\16&êÍ{j\ fÏ\96%\e\9c\ 4\ 5\14\95^³o¬¥¤\8eÈ \84,`\8b1F`Û¯y\80Asß\14\88Ò÷¨Ò\ 3ôÛ\rb̦1ös@\7fÀ&Qn1#\8a1\ 1\80Áq*\86§\ 1&\85Ôb\8cÆ\80¾å®\80¾Ó, ÷w\aÐóEü?\87\10\13\ füs;Æ£^\7fà\a¸ZøÈ\9fÒy~;æ­z7Ô"Iò²Öyoóü£÷µ(Ra\1d'°ãpÿF\ 2ïp\86\8b&öµ\18ã\93\93\8d§;]cö_ÈÏcxÛ\18\8bS\8cè
+Ø)ù\8e\0v\e      \80ÝYV\8ck\a°³Ú\12°sö\93\18\95\17@\ 6lp\8c\9fv§GÀ:\a  °ù\99\vØ\ 25ùÉÀ`*\83GÁ|g·úqÿ\1eËùIèò§J¡D\172Ï,ÎÁC\1c\19\ 6î\aF¹Õõ\8fÝx\b\1d\0wbN\80ÏèQbí\8d\7fþ\13\89\ e̶\1e\80W×)À\97 \14ðM\9d\ 1|\7fª\ 2~.:16\ 1à\17å#à\87\99L\8c[\1eð£Ã\bðÞä øîL\ 3|ý8\ 1|Q?VȽô5\8eYFþ\18\19{c¸RÀË\f\84æ>Ó¤§ÙA\1e\8f?J"2ò9\fZ=¬Ô\1f¹y·}\ 1\ 1z|\80\90g ?\82ï/~\13'þ#\ 2\8bØù»o\r\88\86¬\ 2±Ý·\80¸¤Ú1Â\19\10Ïö\ 3\88ñ7\ 1\88\9f·\ 3ÄËi    Äí&\ 3Ä]\18¿î\91Ú\ 2ñ0\82\8aêÂyåjEê ¼«©¹È`¡Ï\98\8bR\ro3ßØ°Î\9e\87ªÝ$¸ùO\17¾­ÿhÎ\89Ïø§¨\9dö7[8      vHdÖÄî\9b\ 4\fÿz~Ílñ§\98\9c\8c)C ë×\ 3\90\8dN\1aÈ\95\9c\ 6ä\8eÐM<·c&\ 2ò\84\11\80¼%â\97îÀ\ eÈ3@\9b\95Õâ¦\ eZÍ­¸S\94    k\98T\97`;£x¶¯\e*Ts]á\9f}Jzòmÿ×Úûã/\8e\91èÐÿN\97@\9a\7fÒ\1d\12Í71ù&ÕÛÜá\ 1h¨ú\ 1\1a÷â\81¦/\1c \95{3 ¹\1d\bh£n\1ehãÆ\bh\13å\ 6´-Dÿ\rhͤþç7_ \11~\938\87Hý[å,ÉoH²oÝÃß\92l\89«·B>õY\8d{|JÝìÃ\uµ\aäLò÷\90ÜØw¤±©Þ\16ì½}Ã:À¿®%á»`¿\92~~s©¿¼kt̽Ш\rEvÄÏzãß²f?.ÙoÜ@\122\90h¨ÿ\1fù4\91¥¿%är\8cõ\13Þ\10¤ÎAâ ^\1cfw¤6__×|o\7f%½ÑåR¿\8f\1eÑQ\e}"~4\86Ï\1e4FÏR¸¦N~fÍ\1d\9f\95]ö¨o#ã0f\9eÅ\ 3äbõ½uÕý\9dýl-¶ääüÜ쬳þ\13\rjøêÐß(\84¤\83?I\ 3ߺ\ÿgWõ  \9e¹[«%vÃ\1a\13æ²\13\85é\9d
+g\ fLÊǧݬ\1f\9a»\ f¹\o·\90ÄÁv­\12£Í.\97ú\9e´\r3yÏ×íô{½\8aì÷~%mRÑÒ§ÑçâÙâá\85\1e\99ä|\9cmI³P\eågÈ\98è\84å4|\9d®í>õãàýæ!$
+ob\90M2\aþeä\8d\9bùÑP\8f2±;ùÐüx\18\13ñ\85\15iK\8f\7f~ÖGó\9eYIË\19±T¶3n¡\1f\87ÒܼtÕY(ws3dеBûãÚÓuÞ­NÉ\99Û\9c4P·3aV³`Ü&7á(jÜ¿\11zÃ[\a¾\ e\95\9b\f\ 5úËý\96\ eË×ã\11\9cßýV\ró\17\ evI\92d½c\97ÚüÉ\94\80ýç\95lWö?\1aª}¾¸k~J·\17ÏêÔ\9d\9bçzo\86øö(Ä\86Îw}3\89¯Û»ñ±l\9eGQM¿\ fo-þ5T"!\15\ 4Y\ 1        ô»\8a\ fÆ\9aJ\ f \91Ê÷C³(÷\91°løåL»Ô[WÆ\8d\1e¹=ú]æø\99ymQ?{üõ\89w¤×¶êÞFµÐõÍRRfG\85´é\8f[v\^\ 5\89Z\9eèÐ\a¨Vö×mð¨,\ 2ò\93\víg&¾VÌ\86\92\1d*'Í\1a|z¢3\80\ 2±Õ\8f×\ 2]\1f\9bÓA¯\8aqÓî®Ê-ºÌ\9e^{m\8eþ\1a`<þ,\9e;\9e$ÞÜ\9b/¾\å¥@í gá­Ï´ÎµòÈTo\86åG¥\89lÅn£Ì\fWõµÛ%êU©h×É\9bßü\87K¶¡\16ãµ\88\9c\91\16î-}Lÿ\ 65ü?¾ÎsQU¥ÍÖWÐ\17Q\92sF@\14E\11\14EQÌ9ç¬÷\7f\909÷·Vïî>\7f\1e\95É\94R\ 4ª\ 6£ÆË|³\86þ\11y]¤;LCX4Ïõð6½°©ðP5\85æ9ÐÕÆ­¥f\1aÚÃ,\ 4\99\8fêÔ\87ñp¼\ eMÕzÍÆ¥f\r]\9a\1dß¡õ~uå\9b\93ªÇ{«Ê¶\11\1c*Üuøð\ 2íø\8d\bwÃ,àÊ·±\9e)G\85\95ï<\17¥\85\ 5ªôÙ^Í\7fa?ì}F\8b{\95ò'ej\92\e\\8a\a\0\ 1Å­Cã_\89\13\1c\9b¡H\9eã\ 1×îZ·R­GÍFÛßs\9aï\90M¬ê±Uª²­×ù
+wn*^\10\9faÝs§nºÊ»\9e\ 6íRY\87Ú\9eÓ³»õÒg1\8bJÃòc\\9cøȦ\88\1e\8d»=o\8cq\9b¸áé\82§wª\ 5ú=<æ·C\8b\8c\11|­½yßrØäÅê¸\83;Óâ®î\råµdvÇÜ\9boW\96+¸y\19\85q\ 3oùi\1d\1a-ÇÕ\95§\8d+¾@Ì<ñúY\97o½í®¬\83óÅ1\91í£4,m?%\8b¸#Å\89w'\8aèîþ5\8eÙó:,ÚÄ\19V\v«\907\vô]µó¾aW­Ã l[\12´\9dæÂ"}Ê©x\ fÍF\1e\91Îê,Õ\8dñºfu.\ f\9bÏC\1aJ0\1fT\eíQ}K»½a\ 6ËEôh/6o|øÝ7A\8e°.þ2ÅÎ+5úÓvU\14\ e\9c\9eÕ\ fJ\16\8bè6Û±\1d¾8*xrvV ¯åuÞ×*\aëÐ+\9f­Àl<rçQã\93\vóc4{\9bͨ¬Nl\ 4ó¹F\fÓdåbfX¯}gEd,ñ>1&#ûbØù\17i`Ü¡¤/°ÇJ_\b\8d×\1fL\1d\aÑ\ 2­t\9cÛÅjI³½Ò\0r\88û«\1a\88¥Ç¢Ü\95\87íRÞëWl²ºtòÛK¦h\ 5õdì\99;\7f\94zNõríl´+ôÍ\97áNÌÞ»¹4\81ÛÝeFôì\9c\81ýåÃ\98ê\1fÈÀ\ 6\ 4©/Ü\82¤\93ÛvV«è\8fªÆ¼ËÃôn\ 5Ni\81©`êña\15Ô\13Z_¨\8d#òHð\95TO<û\1cû{6ê\8dZ·j{\8f\1d\vÍÎy\93®\17«\11UåOêÓսǺTx\86\9dÂf \97­Æ%ce;ÍaÖÌòv.3ê\aN\ 6I\85U£X\1d6õÅa\18éå`;Ô)ó3×*£Ï·\ f­±\ 5ú\98®ÍÅ{Z\b|X=IsF\95[Ï´Òzj%%=ßwäG£¼\93\8dë\ 3\96ÞÑ:'½§\9f\99ô\9eU/        ä\fÒ¾\ e/ËwÔ->nµV³|,6rêF¯QÏ!ë]sæ÷Bà\8c:×­½\96¢~^\82²ÕlwúÉd\90>¦êåý(­m2\vSc\87ëBº\ eïÊiaúª©M\11\ eUùÌt\95\8f\95¶ê,åÇ4<ÈÝâê!g\b\f\95\ 6¡%H9ue\89ã\99òý      \88\85Òr.¢Rù-Ì®iM(Mì\810\87\89Ó\1f\f\8cÉ&êÐâ¡\1e\8b\13 \9dM¦z\90"Îín\8bP©ø¾î\vµÑp\94ëðFÍ\84>PNw×\179]÷\fIU\ 4ä;`WÚM\W4E¶äî$ëÈ\19»\\95>X«)å\1aý\8e\ 4É»±8¾\81\95X\98èg\11µ[@(\1d\8f´@\f¬\fïAó*Oï
+\13n[{ß9?³\979?\vw9¿¼:rÛþö\aßËZ\8e_v"n¸\r\9a½ê±\w\8a§lU\92¶Rù3i Ew\98\9béÉ$ñò\1a\v\8f\ f\8f©¨Dü\9b\973\9b± \r¹±"AÁÌ\10m°±Dtt-   ó\ 2R\15\1cTh
+Ä¡øíÙð« 3ã\19°ÞqÛ\róäüj\ 5çxí\95f\83¾í²\92\v\r\99\vÝ>3áÝå\19µÛj1áÓÞ1\17-8$è\15ú³n;ðÎÍ&Ðî^Í{_­\9f
+qV4"ìíPþÞ^µÚ\8fíÜ\1c7j-}Ã\88%õÒÝ)2\90\97¬h;9Vp*"/\90lFá½zÎà\19ѵ¸ígPæüá¦Æñ\95T\9b=²ò\88\r\1e\8d\r+u×W¦ER\b£®\e\12}o\93%Z\7fF_¹\9bz-´#Õw!\9aê\87Ù&õºð[êµæw´Aêû®C\8d{­p·j6àù¥âï\96ï\82ש\1cTgêïh\9b\ fóÏÜsÿ\eær§£íw\19Wy8@\97àë\8cá×y\82ævÆ9ñÜò\83\ 3Ï6 ³ÂJ\93\8fÁ\jb\81i      9\97Qßí\ 6}_î{tÇÃç´¡\96OÔë¾IQý\99!P)b\94'G\17+"ó­ç\8e\98¡C\82\98\1a\89\14\17K2?\ 3;rô\80w\1d¯=øz9Â{çÐ
+\8aÁË÷\85\10)zÆ\980\1c\¿°\85ãª\vr ôÙdHjÑO\9fk¥ªü!ISÄÇ\e\96\13\8c-Á\n\ 1É´¢\88¥ï¯H¤;ý¹F\eå[\8ezÓh\89êß25*\eÕ¿\1e(*eï§ä\18§ödþT{\133eO\13\9c\19\1câ®\18­qêb¡8umWpW©Ìñes±%ðÓq\17í´Á ùÆ·íú2\v׫§¡\v\aUÎ,¹\ 2,\14äá\12ÎæMú\eidTR\97Q:ÜÍ\1aòÐq
+\82»Å%¶YüPt\97·    j «\14\95½Z<\95\1a\a*9.\f\80nm\129¢UbÖPB¢\94m\8eðåx¶Æ]\9f}à4ß&±Í[01.7
\ 3l~çx õ=      £õCÎE\ f|z\86qvm\93 }\9cw\87Íì)¾VÓ\14Ù¨*\9eá¹P!c\95hC\92óíð\8a\993I;é{\88\9c©÷Ý£-ÃÁ¤Ìo·F\9a\89D\94¦ YÂITþ\83BbödX\820\19\11_\ 1]ÃݵoáteXƶég\ 3«>ãÑ2׫.Ñ\83s½¡\ 1\95ÃQñú0\90sÔ¨#¡Á/\10\15¿§\10\95$\8a\88
+®#$Ìf7ȹ_Þ¶®R{Ô\18\ f\9eßóV½òa%²Êþ¯íø¤ªÖ³\82\90f)hßõzÎY«Æ\9eíI¸´­pǨ\92¡{\1f\9a!1Ê"qú³Æ±ípGa¾uç1\9eeÒèa¯gÑ î\95PI\1cÖ\90óçó=n\90p¤Í\11µ2¾ jUÁàè0HÃzC®@¯ì}
+\99\13ÿ    \99ÓÀ\80úH»\v½4v\ 3ëíô6|¬»\93`®|\ 6þacFÞKm\ 5?\9eã`ië\96\99\17\98Ì*ؼµ\10
+¾½N\ 5"ð¾°im}¶õªd©Ñ*#àë±I ÇpG ÒnJ!-aÄƸ+\88úaLø>4\8b\8a¯N\ 6¼\8a ×\9e\9bCY±p\84Ày\v¥òiQLÁ\8f\8d\ 3\8a\ fpðJT\ e\92@Ñ¢[1ºs0\r\97«¤àb|DÐc_Ú\ 4}\ fì:Í\1fÛñe\19e-0ª\89\19¦\ 1Ai]÷öÒÜÃ\87¼Ø\9dÄ=\16¹\96'       8'cuÍ"\916s$á.>úúl \ 1]c ì¶/A)\7f­§Æ\ 6\H!\ 3Æ\ 3³\9c\1d\ 2|\12\8d\0>\85v1B\0ð\19'ÆØ;\0\9f·\86\0_Xw\80\ fT\ 5àÃR7Æu\rð\11²oÂì~Ugî\99y5]\b¿Áfn~ºh\97\93_hã7û']¢Q9@Ê(k\1d\83\8cÙè<oPvµQÄý¢«¡Ê3äà^ZâS\13\81Ò1Ï\ 2¢Q\16c\8cô\18¯\ 2 \9az5F/\ 2D\bÍ\12å6¬\9ec|âg­¶
+\88\11¯P}M\ 1áÏß\80(öâÿ,íG\800³Ç\18\95ëopt§´ªdÐáäÇs|ÀØf>\93;\143\9b¡,¥»\99  ,-9éÈË\8d÷÷\9e4=Ú\rC¢âT\1cô²l\9að«·\92!xfÉ\80\9cìD@F\17\ 5\90\1dX\8f¡Z\80¬yå\18ó\0\90\1f£¾\8eñ~\0\92\80\19@\96Gu@ºÞ
+\90\96\ 4\ 32O\7f}6\80Ô²\v@r\97' y\ 4\ 4Ô\8%\19\18^îpXüØ\8eUðnæÐE`ë!ÿ\96\94ÂÎ\83\85ú\85<3\1fn3#ÝfØÆ\9a\95\8a\87dèA\1e\90\ 1¨³©Ä\b2\80ZEÉf¨ÕÜ\ 6Ôpë\0j\84Öbä¢\18ã) ÆÔ\11Pí:\0T\94âbtò\80ê\98ñ_ëÐ\ 1\15        (³[\ 4\94\ 1Ji¡\80¢Gd­~a/ñ®\1e\1c\7f<Çþ\99ù\ e
+ó 4hdü\ 3\99O\9bã\99$1®\8e°/ãr¡\9cV{\8eKº×Az³N\1d²íøP`84÷\v\94³cäÜ\18U\1fÐÏzý×\82ü|\ f\ 1ý2V1¦7@\9f(4Ñ¡O#\15Ðgµ\fèÕy\0èõø\ eè±+\0:\8a\7f\ft-\8cW-é\1c 3\9eâ«\15ã\91ÔÝûËsL\19b]ëì¦\96\\1eåD>Ý\87Q\1a·[\17¼±Ê-\90·ì\7foäCÅa?üÞ\80õÿFùZ\ 5¬\8b7b¤£\18ù^\8cÚ(Æt\ 1X\ f>Æp>\80µ\8e\f`ó¶\19ãS\a¬\16\1f߬î¦~ã\8f       ¬\ 5X %\92*så\fÀlÜbÕÈ7\81[ÜnîöÕ³W¹\92\84ôôë¡WUJ\91\91\13\94æG¤çD\rÆÏ\9a|A>Em\r\95\9eþ\ 4p»Ý·èÜ¥\ fxø5øAòò\a\ f0Jtè\a?\a<âlc\84Ç\18«;à9\15\8b1\91\ 1Ïk%Àc\9b\bðxm\ f¸O\9a\0\8b\80»|F\80ÛB0ব\13cÚñÆ_K»¨qg«0\9eÎ\8c\8dT;C~oE\b\17di2öØâ\bi\80@ÈH}\ÿ      8þ:\8e\13³±sÞþ
+¿ÿ\e\121x¡]cTß@8Î\11 ¼Q\ 6\88x;\ 3D\82M¼ê"±\9e\0\91ôî@LI\ 2\10\aÂ=µ\ 1Â\ 3a\80p0[IÎÄW\11xå-ÁÞe\8e\b5Nãm(6\1a\8d23}\13:!wF4\9a
+ÆPjÓ\Þÿe7þ¯ÿDL$\9aï\1füäL|=¿\89\ e\9cä\r\87¹¯ú»äÿ   \18®Ù@\96ÉV\8cø\ 3˹\0\ 6²ª\19@N\v\11\90\ 6d\1e\8e;\96\82ØI\ 4b\91½\17Ìðs5kÒh¥¥øê@\12v|À\16¬\8dM4×\96\82Lx\99Jùb\ 6úÝt²Õ¯Üü£õþX\8b¿âê¿Ó%~Ó\85\13\añ\1fá71ÙBñþUÝù·\8e\9c8\ 2êðz\ 5êzÌ\ 2õÚp@\1aòg@½;\b\85\ 2P\ fF¼Ê±\8cf+\91\ 6\162\97\ eĶËYh§FJ<\9aCá\RÖ-Uc\1fôÿH9NäÞ?ÖÞ$X"A"ü&Nß?Åäþ\b¾ÿ)ݦ§ð        Ð\eë3Ð\aÅÄ௯x\13è\17¨\r\fð8\ 3\83z\7f«Ç½\1aÀP\ f;`¤Cô\7fj\92\89µ7      \19X©ÿ\948KÂ\e\92ìÛâúÇÕû\9b\88°\87\12Iuñ&î\13êÍÜÑê[¸Íy\½\95\8eBæº\92\ 5ëê^³Îe«\15ý\v׫\84ç\0t\ 6§s~·:)sþq\8cÈ»rÔ6«Æ\9fÄÛDHýqÉ~«p%\ 2ê\7fý·|\81¿\91ÈÒÿ\18\903c±ü\80\1c®~\9b³ttuÏÐàÂE·é¹þz®Naê°=Þ
+\87ãQ\9b\1f®\87§ó|\1d2ë;Ø\ fÙ;²\87ê¯owp\87\86wn[zÀê\86\1e¼Ìµ\ f3Î*ÀÍæ2¤çËE$\84d"î&¡\bIPÃ\8f\86ª\Ûèo)®ÿÙÎû\ 4\8fGS+\9eM]ªW\ 4K\1cĽ\14{¼Y\ fù\90Yn\8c\8f­méZ-®·¦è¬\ eyÂ[\893¢¶\f      ¢¹¸yh{¡íÐÞ¼' £Ù§\89Îf¹\e½\99Ntå<Eû\85÷ÄI\85øØC'âȧ ÂðP½~/ÒÃ\80\9f¥þä!ü\18eÑ¥xM\92\ 6þåå½l¥lü\ 5å
+\93ý\90\82\16\9b\95jÎV\87\1c¼Z\86èë°ÐÖ\97ÛìSß}¦\13u\fOæÆ\80\98\10\83Áwß\8céI\93\1fùX]\1aq\8b®6\f¨vfp®¶­AÈ\8dKý[°¬öµË¾ÙË<N½îÐÄ\17]h\94=wld\0G\ eÉj\11±Ñ\87\7fª\86%~Ù$U6QSÿ\89\98HryÏbg³øKC}z\99Òt"\9fË\13¢×«\8c¶ù \18\ 6\84\17\r\eö#Á\99õz\8a½î\ eu}×\85úú©c§ô[\a\1d[¯ÈA³ ½r²HÛ#Ëdk[©|e»\16·o©a NsÍP]\97\e·.\1c\8f5\rzÖöVÿÌ\ e\99úÐi·êкÙI\90\18d}âtkÜJ\9bãé¨M¸Ñ\86\8e*þB[\89Ö´pUÕ\117\95\7f\²½Ì¥)Æ\9béBÝø\ 29·2\99öª\98)´¶®V\ e\ f¾â\87âQk6CY\8b\1a·¶ÒkhOq\18ôLñk\95Õ\96õa^ÛÖ¡YæT³\89ÂÃ\9f{\ 1ì\13»    Sõ\84§VÙ\86\9aSáî\83È\v2ùo\1fÚ=\8fòÿ6Ê\96£R¹\90¨å\89\97w6ä\87Æ\98\1eÖ¸\81²i¢\89K6r îÙòÉí»y®7@#RËhÐ3\8aT}\98Ërµ\89mÈ5t\91Õ}\87Ê~ÝÝÕU|q®Ò\a£TÙ\ 6y¯Â]ò5/Hç\9bî¹[ì¸a¦5.ß\86£\95ó\9c.N\8e\19\9f KC/Ë\96 Ý4[\9cÔíV\11½\94^ö¼MH¶£¡ò\ fæmNÙxʺ1\eÞ¹B¢C\9f\8fJïÅ5ñ\ e:à®­­ãì\9a¡0\9a\a\99¸\13T\9bäßk\9fXÍv\95m­}ò\ eÍúÍ\13oÍ·«¼|¨\1ce}¬¬§"Úé\15"¾ô\99\87Riè\fµ\12´\8e\a'6;)Øóúü«\ eÚÄù\1c\14¼4ÚËo»\99eÞÏÌîÖaD\10\96\84´3¹ó¼?Ê\85\1dc\8dçTj\84%Xtªr}\\19Ïó}cP\96£%"âa#¸Ý\83\97;ý¶®\14UWî³í\ 5²ÿ\1d°»ÊSí8Ï\119(\r\8b÷qqâ\1eçEt{ÙØ\ e\7f9ØÄ \\v\9e\ 2¾%._\9f¼¯ã\88uèã\84\15de.w\1e\eJNEãñRä´\1có¹Þ5M\93c&\99Ï¡wÉ\f\e\12\99\81®·ïÔEc\12=\16ƤS{üÁ´\ 4\ fª\83öȲ:sLVZ¢û!\82÷cò¨\15\8fµuew.ô]µ\rW\1c\13N;E\9bÚ;6qèº\ 5úÒôóÜ£Ú°ÄO©\9d;\ fëý\9c
+׿w£²Q±>ÏêxwcöÜöÞ4éÙ53ô\97¯\8cÅ?ãF4QÚ@o\8a¢;z5¯\13¯GCórÙ©Æ@Ç[z;mñi¿4\fÓ¾\93YÅpwi\9eÌmÇ\³Tí\r»z¡½K±_ÏmS÷?ôO`\ 3×.ÆG\8d@ôKcââÛåìÆÊóÖ-ÞA\ 3GÏF¶\941{eÆÊ|6L1cq¼gL\ 2¾fØ\92Ú4Ð\8bÕÑ\9d´5Ð\89\87?Ó¼L°NoWÃSÚ÷nßYxêáÁ\13\r\14åB<KJ¸v#ù\9e~oåè9Æd}±ódýÝ\9bÄ8¯\13\fU[ó»ØJ-¶d\8eÒ\83QÿÉú\15u\91òÂgíèX
+1²Wð®\9e\17\ eM+ûÀÃoªUfd®%Ã\9ee\ 5ÝYɲ¶V³\86Æt²¹ôÎ(\17Óü²æ©G·SW\eÊ.R.Ñ®¯´\f0\93ïKf+w\û&½n}Xêw`AJá~A\1c­ \96\88\950}(°Pì%3½\84â\82\19Å°\16Â\fó\96ý~\96ð£Ê\14+6\1f\ 1\95©Ïr¨P\15¦;Ä5\9cÖ¥\84M¸i\817\8eÍ\D¶m3u3e½¼Ï2éZ4£ÔF¿Í(×T[PÒ\85®*?ÐYF6\82ÍwÖ·ô\96\1e\7fE|)¥áMq\8cfûb~Þ\98\v3r´\17\8a\eðâ\97Z\9eâËÏc\86Û\94í:W¥\9e3\8eÝN\0»ï\9c\8a\1cû\98\ eb\¦\U\ 3³ÞèJ×Ûu\83t\1a\1f\92ÍÖÜ    úõªW\94â\1d/ç¤Å£HÙÚº,ïí¬Ù\1a8\86\83éjzÿÁ ¥-gPé]¿¡Rö|&ızcÅü\ 3\92\84Y\ 6J\v%BÌ
+ø*Wä\97^µÂ»Ì Ém:§\ 1WÍPK\8eý\94¿^u¶îm\10Vd\r\85ivw.£\98Î\90¾Qâ\83nos9ú¦f{\8c\12v&\8câ5ÆÝ\12\87\ 6­æ\89q\eÐH°üm$ª^\94Á(§°^¿l\ e\13/ï?F^ÏPC\8fýÊ\ fÒGC!\11\85ý\94\80¿Õ\14¿\:8OÓ\ eÍmâ¾8Çñ¡Êî_«,[ïß\8a¬èr>s¦K\11Ӽͦ\8cÒA\ et\84»)Z[>Dª§VJTæ\81õÈOwu!\87ÎÓ ?\8bkû«\ e\9axz\94 ãÖ\9fAx\eH\95\9f\f\fÞÖ4÷E0Li>z\80B\80µ÷¹ø\98\1dd\8a\8f\93¯Õ\1aaVé0iN\82Q\ 2âÝ·øæ¸öùÍÖ\9fÇ\14+ö^\18\13\82\17Å(\eþ{Y£oU=MGZ`ÑÚsîRÏ\ 5Ô¤zåÌ\902åñ\96\ 2\10û&-»Í\91\16\b»9\8d\bLu\8eø\ 2  U\ 2+4\9b\84=~\ f\89É-õSÅ°ù\82ÈJ}\91Î\16\7f\8bÙ}ô¯e¤D¶q8\7f~ÍNÙ¡j\8e\r·û\ eÒMy\98\97û»¼(bs\ eáü¥öa ÷¤o\97èCëé\16Dõº-,Æ\8e¥L\aV(@ò\19rxñJ¤Õ\9aÔI¸\0õ\bû\90[\11X0ûN\8fÃ\17Ù\f\8d\93ãM\ e[ÛÅ\10«\bü\1e\92\88U$-ÀÖÁl\80\93\87ý°}X}¦¹åý:ùÈ\96*\97WÉ,\8fV\96X\\8fÓX¾Å¿oY\98ñfú6 Bõ&\9fKrN]hBùà~{\9dlÃUÞ´¾ö\1f\94\9fä\88P?$\1cf\11\96I¾·x¢\bßu\ 2\9b\91y|Qwª8ù\19FØzø\99a\95\8a±ì\87@w\87\89ÖúF\88
+Ù×\16iLv\f*T¸\0­\8dÚß\ 1{òØ\96Zh»1\8aÔz­2+\96+éE5÷k;n\17\81SO³\bGKÝ?\94»jÔ\14+ÒD}\99ü&>N\99\ 1\15½\88é\8a|\108\ 3¿ðÅ\8e\85pJ\10plýÎ\7fÍ°XeÐP06·È¢{\ 6scx-´v?LQ¡«\9d\91&1Ç\90&éf\10ùJ5àk{½\86Ûz\a\87¯\9dC\ 5\91\1fõ!"ïÝA+\8d@Q\ 3±Í\86¿¯W<ïq\1c\14~<ÇûMÿ»\19Ëx§?\99%¼ÝjÇC\7f¨ê§z Ù#Ëæ¹çC¢\9f¹\b!\vùÞ\v§¶÷;VÅÖ\ f\8c=>\0ºoâ\18ZWäø»¹å%ä4é\9bHÓ¾8\88"¨Í\18\93 |ýp'X³\92û\9eÐ\13á4¨»ß×R\1f)?K}d\ 3N}\14§\ 4e<´\ 3uWÚ ìì\89nPâíÐ\17K\1dßË,6%§ô¹\99¶Ø\9eò¹\8fP\873n\1a\8d»uÜk¦ôO³\96H>ô"{1\1f
+\r É·(*á°Ã\17zÐ/wä,\8f\1eHóºø Jû\84 JDÑðÍÎËp\84µLX;^ÊPOÁ\1aPæf\ fSC{¾KY¸\9a\ 2\13w"\ 1\94ã\8f\98\1aǸ|\0z\84ó1z!°±óW\87þ͸^8íj\98Y\ 4î°ÿpK«\vj\15Âö]ÎYø\0KÒ%Ò7\8c\ 5e\16ñû\8cî0\9dÑ#MNý\15\853³5@¥\1aÿ\86£ñô\ 5½Ðþ\aê\1döh<î>Q©á\15ù\9e\ 5RV[ÖÁä\99/\0{>­\ 1¬\f÷b\84[\80¹\f\88±\95\ 1浫\0«dg\0+°)\80ÙV)Ƴ\ 3°¢8n\8c?Ü°¶]Ä}ú{æÕrá&^-1kÑÎß},\9d\83ëÈwàaðéêS5Á})®øfÄ5\87ºKç¸\94A¸Ø\8dCOâ\11FÒÅ"\ 4e\v×T
+!»)\80³U8Æ\98\8cñ\16\ 1Î¥\8d\18\9d\12ÀyÐ\88á\8dc<\8f\0\17\ 2\ 4ࢨ%:´ø\ e\0N\8eV\0§Z\18À¡y\ 5àp)^\15î.\83ùP\9bÔøÅaT1$²\93Ø\8e\8bµu©\9cïlm3\8b\138§µÄÌS\9e\95Àgë]¦Wc<rî Yì\90}\8a\82}c\f \ f\1e¿ùì\88 \80 O1(\84\ 2D\8aåb\14Õ\18S\v\10\10V\89áE1Îs@À\85k\8c'\ 1ðGÛ\ 4ø3\e\ 2ü\88íb¼(\80¯¸¸Ù«Ó2Q¤ëkÏý&*ûrù9õ²\17©ÿc;>­»U+ÇÛ9co\8f\19u\0s/q}\1e­¹4WèQS\17«â;ëm¡jû£ÀfKgS\98Ò"\0©WèøôÙà\0\89µ\84\18\8b¸\89¯K\ 6\10ï$ó>~\fê1\9e\ 3@|
+\9b\18§\17 A5þ4W¼\10ãØ\ 3Ä6º\0bêð\80è\ eâ\8fÔ+\1f\ 1\11tîµ½5ÞV\1e7hñë9Î\8dº\85\88íÖ²D\15\98Ú\8dª2òì\ 4}ûi|³VÛ0©\8b6 ªÜ«\86¶ñS\ 1\1e`\9c\91*Î,\11\8b\ 3\94\85I\80Rùt\fÝ\0\14ceÿ¸\90\ 1\85 ­\18î$Æõ\b\85\ 1\85¥d@¾:e@¾íq¢C\9f¹¸ù«\8f
+Èqz\ 4È\b~\ 2ÒOÃ?\19\18ߺ{?QÇÁdÔ·`\86®\18AØ2Tˤi\91çæoæs3¶¤'|\ 6\98r9\ 6ð'DÊ)'%æ\0=[\19        \12å¶>\89_ÔÏÿ¸\90\1dÔ\89!V\0m\16\1a1Æ}@gñU\8cÆ\1dÐJ\8a\88Ñ\89ÿCUk\80f>K@#«¸ùÏnü    \8fë\19 \96\v41\1e'\ 1\18\89çø¿þ\89:NlÇljè¦ûMA\97*Å-Í\19içMQà½ÅZö|\88d9ÐN\95\r¤
+ØT·ü\17\92+\ 1smÇÏ6ãj\8cS#Æ»\ 5\98\8bQ\9c&Êív}\0Ì.\r\03\9dr\80\99\99ù\18\9f6`z³ø\ f\8d&\r\18·\18¿\91å¬\0\93\8eø$ô¸Ò¯\vÏòâå\9eít\a\9eeË÷z¨=ZdIv¥q\9a{\1cu\92ZN.Oìzî~Sâ\91\v5MÑÌ4\ 2\9cQi\ 1®Øh\ 3®Ö\89~\91¼ü\v£^\8cã\18p%x\ 1¸º¾\8b\11Ý\ 1\17`x\8c(\r¸2çÅØ\8f\0\97\8b¿fΪ(\89@\9c6\ 3Àq\99\13à°®  Ø·Pwg\16ò**Äd\97\9b\1dò#ý¦Ý\ 2Å\81Z6\7f[)*í\94v\ 4®jå\a\9a\a°#½Ù¯¿xdÇÏ.ÁâWõý\aßÍüµ$\89\9føÁí\b\ 4Y|\0!ëC@(\7fx ¸Õ\1c\10\19c\1d¯RiÁ@(xñ2Û\1d\ 2ÁȾ\81 \8eÊñÿÚ£\92XÍ\­I\ e^\19çÓà{!P±\92î\v--\95§\17m_ÄÓ
+\8e ù\8að\ 4µ#ºÿÍ6~)§_Í×oß\7f\7f\9eýDLÌ\9e?Æß¿\94`\86C\92táÄs\e¾5 µ*e µÉ~\8cí\19HQÄ\0©S\8d\97uk+ õ*\ 4\90\1a¾\v$·»Ï[Åà\909æ³³4|y¶E¹Ñ÷\98\12®\99x»¶ã\90BpÅþ¶\e3ÐOÄD¢4ÿI\14NÄÕ\7f¥Kü+[81Ù&Á¾\85F\1a([Þ\ 1*4\f\81
++\v ²\10\0jú¤\ 1U[ÄËøI\12
+s\ 5¨â \ 1Téø0kÎn£¥ìîH\12\19;d\vk¼L(\97@Cl»ÂýJÐ\7fìÆ\7f´Þ?é\12_kñ\8fê\9bº\9b\89ô\9b\8fðû/Í7       vHü½×ô
+è©Å\1dèJ\8b\aºå¸@¯\14\16@o\170 GÅ\12Ðkú\14èuæ\7f\91Mÿ±öþ©r\86æþ[~\83<{f&ùÝ?¡\béûmΥ߷ҡ\0_WR\ 1¿Æ\9d\ 4ú²M»ü\85ëV\95sýSÕOg«i\9dBxé\1eoÅk㨭¨o¯óÐcÊÛýP¸Â»\89º°\13\eo\82¤jØOÒÀ7I6\91(ÿ\ f\997\91¥CþñÉ\87ê}B\ 4Ù[iç\97®tÓ©\9eë/õë\1a:\85)):F(Ó?ôHl¼ÿTàÙ>·\87\89\b¶Û¹r9lVúú¼¡û»Ç\9a\e/>«\0=aËs9Å-nUJ[h\87bi\9e¹LÛ³Ü3zN'YU\8aa§'Äì(&­ûÊv\89\86ú\9fj\\7f×6\83£ç\8d¨®O\17®Õ¸\9f\9a\9fôóð,ÒÐþãrä\ e\rÎìz\9bñ\85U\0[Ê2Äu}\11Ѽ9ïñ\985û4°â,w\85Ë3¨M~\83\9b§\85'\19Læ&Ó\9e\10#¾?ö\10}6Ú\96\9cÝðàù·¡¸[£\ 3å\1c\ fü#uRí=»ãc\12\85\90ØxÿrÉ~3\aþ
+Cøª\93§³1\9e'%ÃâÍlÜÛ1Z\89ãbg\11\91l\7f\9eÙãÓ\19Ô|¯&¥×f?öRËËÈGgÏa@v?\83\a\ f\94}\84õoõ!Õ×ÎC®×S{b/s_iÝÜ{bv&¹\95ÝA'·jäàtÔ^¹\85ï=é6½\1d\9f\89&Â@\15ü\9f\0\84o\99°ÆmP\9bþ¸d-rÐý©möõò&I\ 3ÿMCµô±\a°ì0ÀûÙ\81²mØ}íØðz\99k#èB½â×yß±A¥\1f9H~Ô^\95ò³¶GTÖ­­WÞµ¸]ñ\18\ 6\12\8a§Ú«\19*õTã\16u\89\86ö\9añA/û0êC\e/Õ¡E1¬ÙÔnáÏý\11î;ÂÄ­®\9aÛ ê)\93zb\90\8d\1dú¼\17ïdj\9dèÐIY³\19Ôð´DCýã\92í \839Ñ^Ù!Ýò)\87\ f\ 3ÎV\9a¡d\19\8d(mZÁ³k\16\83ÌÇtëCËôëÐT\ fj\93¢Õª¡K«\9b¸TikX]ùÖ´J\1f\9d\97ówhÏ?\9eø\8aû5aÖÔÊQ!*;Ï\852vz®K%á±\7f¹d-~l$ML¼¼\93Òã.\rÎå%ÞË\9c¯\9fÄ%\9bÈÝksßTÎà\14ôôѹn¥j·\9a\8dVÞ¾CºpÕc\vxe[/1\15î\\12¼@-Èî¹SÐÜð[±ç6(Ye\1d*\15\9d\9eíz\8e\89u\e¥ayÖ-Nª\9bi\11="\aÛ\91\vß3taÕ^ò\ 5\17óÛ\81·Íû\96JäyØdþ`y®l\9c\89SÕµ\81\9a½R]h×}µéy°ÿUx\9f\8fA\r\9dU\87U\8fáFÞ¡q\18»¡6\9c\95#³·vzùÄ\99RúÌÂsÉ"Â{        Z\r?E\9béCö¼ÖÇlG\98R\85UsÊ\15èÛBÎÇ=O#ϽAÁ
+r|5w\9e8\9d\9c\8aÍ\97ÙÈ¥\1fæs\e1f¯VõLSl\1dLSB@æs¾\7f\92gñffð.S\1aÊê1ÝÍ\a\ 3ºµ»\95>\8dûL=Ôaé\14ï4w\15x\81LVÊQf]+}¦åZqâÊ\81íðHXX5\90N~Ûz\ fòÜã=±\ e=|iI\0ÙäÎ#ö\98S\11ê\92½Íäï,¼¬Nh)³çåðÌgçr\19Kh§3ÐéQ4l5ÝÔç\9dþLw2ÒC'>/I[\8dé®æ\15f\87\18Ëc\82qåz¶{\83f+ÝÞì\vt³ÝPA½\0½\ eÕÊ~3q/\8bè;³Ø1-!_´©f¶àI\.ÏÝϹÜy0)do\93¨\94Õ±È3{å¨\96ùl¢ffX\9dt2ÐaØ7&Ájb \97ÕB\9f·n;\9dx|.\9ag\12ïôv¤bi?\1fIêavË«\81ã~§c+çõi¡\84Õ&PT~TTTÁ\eÈ·S4\8b\9fMæC%þ\ruæ~M\ fÏ«\f\e\fÛ*ì{Øëì)^wê\f4«YÄ\r¹\94¯\11O5\17º¤`>çS!3¬TDcRÏ+\ 6\7fgzé\8e\9aÏj«N¾ Ñïl)½\1d\94+i?×\bÔäÑR\ 3{ÔWÎ\8bÅTQ©ãF¾m\99\9b¬óEDê5¦¢d*jQüÜV\91h\19\99\9dheª\92\b\83´\1f£ßMÐ7Óþw|\131\8d¢Ñì¨\ 5¡\8eÍ%´rÌ\81[¹7\1d,\8asÓj\178\1awrmø¬\99)tÍ\18X\1d!µÕ¶\8e¥·}\ 5S\ fc\9aT%\94f\95Ð!\ 4E%EU¾]
+¦¬§\v\85´]É,u¿é<\12\10OqcÂ÷H\84óÙ­`ÏZ\ f~!¥(Þ¹4L\9el\93\ 1WA'K\8eYD8Ç\9c\ 6\ eÇ|Ò\9d\ 4=¸î\94ZÇkÑld;\ 5©F\ 56鵶ØÓ\19Õö\eÛ[;]+´©¯-Áü\b\aÃ(\91}FcÝ%ª\Ö\9f\94|¯÷\80ôò\9c\94dÆ£n    t"ZÌã=^\84\97sE(Òs]ÀnÏ<¿èÐ.O¾Å:·^Ö{\1cK\8fçìîÎ^YÁ¨cÌ\89`\rFö:_[\ 2}eÕ\19Ý:0\b\9dîÓ6Ýz-[ôU?µ;\8b\95å\84×j9\17\14\8cª\9a\14\89s\1f[\ 3\94f\99Ô¡PkEÃÄË\9b\99,?9\9dnMyµi»)ÙØ\8f_"¢?oB±q\88¿\98ë6\19\14\ eâ6\18 ¸Ê\82dÙ=E\8alm£j¬Pu,¦ñ\8c\Fî\1d\9at;\85\ eéô¦¾§\1e>\ 4QÆ«©\90ï\ 1ë\919h4"SÓN\8a̱\a\9bÌq\99\ 6\96\9aÑƲÝæãYü\86j×KK7]\15G\1e[þØY¨D\88ì9\7fjm§\7f¼¼\1a\9f¿È\8av¬#\12D\94®¼K\85G\8e\9dë'¶NJ\17æT\91\1eL\93Í\ 2úZÏ"t[,\93tú3\12©Çð¨SÝ<ö½éEeX§F\ eê½.\993\8951\1e¹O¢P\808|vè\16ñR#Ýà   \85\84eåðÒðYÇgçO½½ßY^33¯\14j«f]¯\84\95\80/[z\ 5-z\84qË+\95ç"\9bZ4Z\ 6åe¾÷\bÒ2
+Òrïµ!\85yX}pÕMxd\14f½¥5¡³£\1e§Ñ\89Ê(ý+ù¾­ßä`òFÈ\\91¥IH(ÊÄøÔÏ\12\85ÁË%PKoá¥]o\86\13\86¹\9f!\8dÑ£L\1eÝæ\1fß\9b^¨Ï\1do¨/À\19t[\9bÔ0z·­·Å\9aUùÉê`rí\8cwOGb\19¶û\84½ý\94\9fVT Öfa±èêUËõÔ6*e¤QÿÊ\bd8þ°A;:RÏÚhC\ e!cMB¶ü\1d\14\12\85\85p ÐFñ\1e£\vðyöDà\ e\84ð8±Í\eØÊï\970úuo Û\819F}÷|AyÆ#\91Ã\83³\90 »i#\92Ù9#Rv­!Á ¬!\87÷°ÞRÞfõ'«£F\ f¾]õ\1fÛq\91\9fRvM\1c\ 3Koçö\99yÿ2Ð\ eÖ ¦<QÇ\92òoYä7\80@\99Ëøp¥ÌÎqGض¼Æ\1dó½ÆV£Ç\ eóªÔ%Fþ\8d1\\1dA·Ï\r\8bú\vJCùrþû\13@ùÆ¥\81\ 47~\84H\93É  ¾\14M\ 2n   \9f\9e»!to\15\ fнÝ\90aõfUà\16\1dÔ\7f2®¿Y\1d¾ ìóî;}Ó\1cÜ~q¶\90\7f\95\89\vÂkSé\15æßàf       -v4\9e#\v\14Ó¦\9579\9aÁ\a\9c\°kt\97\9e-Qÿ±Ù¢üì}Fù¹üB\8eN\ 1F\1aR\97FdðPáËXÎíj§\ 6§y0\80î¯ð\b\199\18M½¡\9e\9eÊ\16Åz*\85?¾Ó\15RYG\16b\1c\8b©7fÕ\9b¯¦\17üdu4¡«í\ e
+D¦´¬1b¡)¥°\v<»\19ë¥>O_ZÔ·R\1cZ\11ç{\90ã\ 2²ÍÑÝ\89\ e\88Y       >`lCÞ 'ä´AäÌ,Ñ\ 5äÒû\f_Iê  ·Ö\19\18\9a4ôHo\14È\98#Vêíä«©ìeÚK¥Úü\16ä\9fý\14@úº
+\90\ 1äÇ8­\02\8a\a\8aÈhQ\ 4H\eøÍ\14ä4~²:®wÄq!Mùz\aKtQWò7\92%s©ëûeTñh\93¾J\8d¡\92\82
+\81PÁï\16«VÚ\ 2\16\8c»gò\8cÖûå=|=¤öÐcµÜC\19fvJ½ï×GjÐ% TêÃ\11`¼ªJ\0\19\80²xR7
+Mwº\0Õ⦢Ú\11\ 6¨\1eé\05
+\r\80\8al¼LÊÇëË\98\vPÊj6ò·°UãÒÇzEÛ     Þ\8fçØ7\1c-\1f\99E6[¸\89)\83\8eiMZL¥\99\9eiðBîø½\85G¿öm\89Ä\1a\16\8aùCý\8e\84\8dÑ\ 5zÎåsÊ\82\97G`ãí\13@\97ã{\8cg
+ +\8d\8aÑ\96\ 1zAò1*µ\18¯!@¯Á\11 7\1e\8bñÌ\ 2t7h\ 1t_\8b\97\1d\16\89¤\8a.\9cxÕŪ\e\94ü(ò\ 3\r\v½\17S«ÿØ\8e\8fB\98±^fGÌbJ\1dÓ\83\12}U\86lk*Ò2Ý`Ûö¢@åÏU\19¯ll\ 2\95\r\97G*O\1a7\80M\1fW\80uÞI¼!Öe?1JX\8c\19\ f°\1e¢Ç(\97b\1c\9b\0ë[Ó\18·xýAH\ 1,Ôò\0ká=\80U\8eñ2\9f4\ 1f\1fZ\89"]÷ôU¿zÑô\8e\a¦\8d\86C¡3ÏnÔÎß/Íê÷îi\93Ü6\89ô=÷¼Jó\951á%äÓ¤?\8di\91X1õ4zzZ\14üص (µy½\ 1¾®¼\0>j\ 2\80·ÚP\8c\19\ 6ðÊ\89\ 6x\95\95cÔr1.\15\80ûf'Æ6I\1fÅk¹'À\8bO\ eà¥\99\ 3p³2\ 2\8cßH      
+\0gr\83\18ãUm§\7fÆ\95ûÓîÿx\8e«è£fË\ f­\9cË_\8e\9a!\945\Maó«°ë°SV?\1fB
+«ö\1dìð.|÷\r\12õB\1e²\84Q|ý<\>\80X¤`@ô)<\86L\ 1¢\91f\0\v1úñÁW~Ù\80p­z\8cí\10\10^f\ f\bk\9b\ 2\95\ 1Q\90«\80ÐÁ\ 2\10ü\1a\ 2\ 4þ\8c\9bý¹.\12\81\18¤OþIP\16Þ{\1e\8e\13Ûq\89ó³­\9f¢v´XQÓ\8fý\13\93\96U絩ë\94FjÃ\16¾\8f»Õh:W5á\14\18Ê\80\82úä\ fÈÛ\88\ 6ävÍ\ 3rr\94\12\vr¢Ü&.ä\1a\9f\8bá»1Î-@Ös³\18û\v \9d\1c\ 6ÈrÊ\0dvÚ\0d.Ü\ 1RµãwcÝ
+ ÑÖ1\89¨¶\a\99µ\a\ 5óy\99x\98\13;,³­\1cz\8c\8azhüÌ&²á\b\15Ä5sa `<#ª[»\85¶÷y\ f\86\ 2tÆW\ 1-:Ê/\b+nùÇV\ 1uö¿~ä^.Ƽ\0¨ÕÁ\ 1Ô\9a®Ç¨÷\ 15º®\ 15.Ç\ 3¾I\8aM\8cÊ\93þ×\80lu\0Uç.\80*}x@e\91\ 6 \14õ\99x\8f+¦âî]»\ fmJþG\9aZ#±ÛÈðs¦ \8e´\81$Ö   aÍÓîB2ÝÂ\fí¤\986l\r³>`ªZ!A¢Ü¶söï\92\82\98ÿ\85&Æ/µB9F3^\9fë\ 616mÀðÂ4Fç\b\18\81\85\ 1\83\8f\10\96\v\18\92\18\ 3\ 6<>qÿf£\ 3z»î\ 2º\v£Ièñ÷ê9ÊÍ.ÎzýÙ\15\8clm`Vú\1f?ý6Z9©òà\ 4öÝZÀä&k\9câß/4\83óO¾\aØ%U\aìI\b\0ûN7þF²ìßÈ\7fo}Ç\8f\8doñ»éä\9fºwÎ#Æ\8b\ 2ì%4\ 1»á¾Õî\1ekÀN68`;#\e°õ(^Ù\89¿\6;v\Ü\1fßì6£/³ËpßÑ5Ó¯Èî\ 21¹§Ýã(\ f\96¿z\1a¦\9d÷GØN\9d\17\7f\9b\8dÿ\151\91<ûßð\13;aÏ\ 1?\9aì\ 1¿þÜ\0¿±à\18\a\11ð[·\bø\1dûÕl\0?=\9e\ 1?[\v\80\9f¯ê\80ï\ fv\80o^UÀ{\97vQÉ\1c\ e¹9Z\9bè·\88\ e\15Ç=\96ùè\Ò©uæEc\1d­ÿ\81\8bÂàü«+\9bÛÍß\15í\12Á÷ÿ\171¡»×_\ 3ð\1f\1d\81\81xw¹\18§\f\10\1fñ5@B¥9\900\0b\9c\r á§.\10?»'\10/Çx\95-1³&Mþ;ëÛ¸à\9b\81\8aÍü@hµå"]ÞÌU¬KË8\b\8dÏß\8eãDiNDæ?é\12I Ã\9f`\89?úï\1fé·tb\12\añ\1fõ\95ëd\80bcå\18Q\a(µÂ\11(u\8e\ 2J\80\94\80Ò\80ç@ib8PB4~Ya×\99c«²H#2×\15åãÑgJµf\1e×â\ fô\93rücwö\148Ñ¡\13Çq²õÄqüGdN\Å\7f\84ß\7f\aKüGðýF<ü§\84\eÐÒ\83
\ 6\a\f´É:É Öv\93\bh\8fÙ\1dh\87\99\ 6´~§\r´\81\7fþ?äÓ$«7©rv3þ     o\187\1f\9f²ÿ\80\9cåô6g»Ë\eQ\1fì®îy|¾lÕÁw²ß\85ë\f^çú»\aNç\\ f9)\93\1eq¼Ù+î¨-\ eÊ¡G=ÍýÇ'J{¨ÁÕvh»Ðßx ¹[ûhUüÉCøOâm\127ðã\92ý兩þmí%¡Ç\10ÁÈ{aygo\84\7f\94/[ym\9cÅ^?\7f¼å\eΡG\14+ûÜN®í
+'¶¹-ÝR­\rÝÛDk\1f,{«C~9Z\89³Ùt\19\12ËÕâæíãþÆîúý4ó\9eH@³Ü\1d\13#§NÑÁÌ\99\10ÓÚbì\11y<iàðP£¨¤\81?.Ù¯#õß^Þ¯      õR½È\9b\932Øï\ f\99\85{ØM8å²%ZÐ×\12¿:ä\86\9f¥²¨Àóg5\8bÏ>A\9a\9eA-\81ÿ§~\18\9b\9e\10\18{0\9e\1dÓSÁ\1eù¸P\1e\1e\ù[?L\ e\aÊ1?èGrcÙëiÓK÷ÓÇÑ®\95\1ae:\13{5M\1aöÕ:¿\8f\89Èû#¤þÇ(\9bh¨I\ 3\13\r5ÉCX\9eó×ʼÇTý\19Ô\14ë\93¹N´Æ\1eøôFÜì<\1eÆ;k1PvÛm_;M\ e½\9e2\89·\1a\r¿\1d¨îP\9f¿»P\7f\9aêØ©)\1aÍ\vS2"æ\v®½rîjk[ye[Ü\81wÃ@rZÍ0Ý\9b6n=úÞÐS\9c\19ô
+\8fnR5,\89@øã\92ý­\1af\8cç»      k~ÏÐÿÒP\87âR\96úÚa/w?­Aº\vu\aÙ\ e:ìÚíU±î¶ée³Öâ¶n#\fx7\1eÈ4JÝf(×G\8d[»:mhOw\11<{Ím`\82ö©>Ì\ f\1euh¶úzÕkèêLû\ eK§««º[ªÒçSTá\1e\95\93\8d\f/Èb®'\81Wù/\97ì×\ f½ÞêùêOZ\ 3ÑÝ\89\89\r
+endstream\rendobj\r22 0 obj\r<</Length 31846>>stream\r
+\86Ú\1dªãW4Ï)ÏÖÖ9¿Ã\80\1d\81¦rn|-#\rí^#ë\9fA\9e­[Pñ\9b)[L×ÐE1ã;TѪ®ªy»êqåre\e\14+\15îR¬{AºÜrÏÝZßU>\9dY9²Ö{ç9\83_¥Ï*M\96\86ÞÂ(A{3(ÚRõ\95\84Ç~]ª_{ì\ f\88ÇSJZ\99xyGÜT {Ï\80Nu
+oí\96¸d\e·feZÿô\85eÍFN+\9fX\r6\95m­º¯p§úÅ\13oîÃ\ru\1f\94o}\1f)ë)\ fwz\ 5\87JÔA4àKCÇ\97JÐÚO\17'\95x\f\81î\87¶í\88«Ja\15ÞÂ\ 2ýàÆyîS:X\81µ\85,  )©¹Ð1Ú9\95²ß\8976{Û´Ð\ 4ItðÈWË\Ï$ÑTD\8c\ fß\92\14¡¸»,\83\9e\8e\fã\ 6fÚUz;\ f=ñjµÊ\91       Z\8e      ï:%\v\9fö\8b\1fÛs¿?·\89c\7f]X5\16\87\ 2}\9d\9eóÛöú\9eç\9eë·\15\98\9b¸\11à\8açÂü\9bÍÞæ¸\92ÕIù;`7{\95\8a\97ùì×\9d\8c%ñë\ftY\0\ e\rÃÖ73\ 3}\e·\ 4ú| \'ä80û\86ÂòQ¹x\86\9b\97\12\0¿8÷\89\ f\14z\87\ 6ã\95£L±P²°\87mÏ«ÝbÁ\93
\91tÞOk®\15d¸jî<ä\82\9c
+s­lTäºY\1dW\86\15'¦Ig\96\99¡\9fÙf cîdL\1aÕ\87\81^#Hw´9¥­z\1fUcR\99bz;Þ´Ó<\96\87Å\eQ\ 3/î0HÌí\ef¢J,´J0\94[\98ÑEæW¾%B\13$\18\8b
+\v¯\11=#çU_¸ÅIÙÕ
+\9e¸\95­ÀðÔ\9c
+ñªù\9cßÓ\99Ïzgd ýÈ4lq\947ÐóÚÑ\1duáéÄýøM\1cÓ<ã\18jôûÕMû¹×0ÍÃÌB\r\8aê^9/í»¢Ò\1dD¾í`IÖ\ 5¯(=ÏPGê\85\83\83d¦g²øyv\1a1^\83\ 4ý\8cq4"ºµ\14\9aÚ«\87ÕÑ¡ÿ¨\1c8ù«\v\94»\8ds|\1a`Z^\81å\3w1tÎì9Y<n[\8aÐçÍ\19¡­¢6\95Þö]&ͧ\A=\8c\9bª*¡u]9Ï»9E%Û\ 5ù¶\9e¹²Î.kÒs\7fmI¦\94\1a\88Ã\96°\14­tí{ÇC\98\88\80\81´ÂÏGë2ï\14\9c!ObÚ\9b'q7Ï­\96×F\82îÄÝ\99­`6\93\1a <!}ï\1e¼\7f*¯Y44´ébÇ·\9af)g¾\15I0¦-\ 1Õ¼Hþ¤y°|%r÷¬ú\92o«ÜGÖ\19\13\92z5\13\93LÁ¦ÄaÓæDKñea\12ù\9a`ë½\1c?ïOJ¼\93½Õ¸Õ\84èp\9e]\9a³ÛÅìÂú®F0\87í2Ã\ 4µ|ÀH"³¥Ï\17I /àüÕ¡éK
+r;¤Ý7Ã41SêÓÍ\84®Ö:ý\94kHåÓ_^^íÒ´3\ 5\9b\97\8bcj£\9f\1dQ»J¦??\89VÖ9
+vA?óó¹zã\1dÇ\8a¿\ e©\ 6s^«öõ§qL~ʱþl!³|\0Læ(©\ e#\8dü\ 6\1f\1a÷\a¨{°B(ýª¥É×øá\93}{´$³ø\82!³¢c\91ÙÌÜ\8d\98×(×4\86ËtmY\98³\95¦0\82ËÙKã\9a\18y¿Ç\8dô~ýãåå­tú@°¤¢\81øô\96²Ð\13¿Ø\98;n]¿oØ\9d7Ú°ü®¿g\8e\9dÝ\95i\18÷\17}\19<RtËc   :Í\18\1cÕéTÒ\94aLóä\9b\88ÇòYÏì\12£ûüÛë$ò]3\85O?[\19/\8eJ.\8e\17\84\19¶ä\r2Æ+\8bã5½Ô\16\1aÓ|#ÇÌ´\1a­\9d\ 5ï\86ï0g¼\1e=ìª]ÝX­\ fß3ó饧{¯ £\9eWiFÎ\8c\91\8f0\8b\ e\8a\92ß\1f4#ײ³ïo}N=hjIu¶ò\8e|óò\89ì¿\8a\ f2Ûo¦\88\8b\13ùÍU \10\9f5ðâ1_ÂñÆ"Ä\\88\9fcÔvûB75G\88»TD\19eÏû       Ê^\112Æ4\8bVå××àßRR£B0¾o\fßG\9f\92§½_äo\84p4;ä\1e\1f{\94\99¥ß5mw\1cæTõÜ\10%«ªÀüª\b\9dÙz÷µ ÓovLf\9f\83\111\96ª#\ 2i¹S|\96ï®ñ\122;àøìúí\v`K\87Ha®T 0ê2PÐÍ\18) ÕB9@9ô2Aê\rç\86Ô\9b\f\8b\88ÊÊ\86\9b\9dB\ fnκ0|F\e&"j\8bBØÞ,\8a\ 1:=\99ÕÃ\11RÜÞ
+¦Kó+\ e\15\ 2{sÊeÎÁ×5\94)Uå¦Vç?E¥s^¨â´êâ<SË<\98ó\ÚP\99¥0&P²ÔÇ\96\9dO\17s3Ð\0£     q\86nV¹\rZ\r\9bç\18û7Ê¥ \1c9 %\11©ï÷\16"\ 6\82\ f\9fÍé\b\ eSú÷,\0ݪG
+\8axßJ=\9bD\ 4\ 2\80´\v¥B·`d7\9fÕE©îÔ\1e¹ªÔ'Ò®y\96¸\129f\91\82ÔAn9@¬\96ƪZ\8eÒg\9c.ËïóË\10\8b\9b%\93Ì4eZ\t¢\80PùÞúÆ\1d²9D·Â§\87rÍÛ\09(\9føì\f\18¥#"îÆ/øÜù`p\98Ñ\ 4X%\ 6Yè¶Fª\90\9e.÷S½îå\902\9d\ e\ 1\86\eÆ\ 4Vu\e\82á4õ\8c±\14S\0Éæ\9b¦¶ûÎX©­3©|å²Ð\8còh¨\vÅõ&\8bç/;ã\95\1d\99ÐÖðÆ£~:,º¾ü      ì¼H(¬Äí[4N?´ó\9dÌ\v£\15\16\8f\1d\87Èá\fõ\11\8càó\1d\9aÂa\87^Áj±p\82¢¥ûíÜBzs\8e¤^\16Á§ÌiÆH\81ÚÌ\ 5Ö\19ï\80xÝ-\80[y\14Àí¸©pûÖ\ 2p\a\7fŸ*\0®§ó\rk¾vk,\81Û\95t#gþx\8e«©\16\9doÃÍT6\1fhG\83¹Þ¿n»´:]6åáaâ\88Ä»o°ç´BQïÃíIàÍÑ\ 6Ý\83Óìk\9b\1fC÷è6J½úóqª\9f=/SY:\1eÄ\8e\ 6òº\a\ 1ø5g\0üæt\80àc\17 Dº\17ãr\0\bÙOêF!\94c\ 1\84\0a
+\0 \88\10¯\8at\9c`Ú»WýÚ\99-yÝrÕJlÇENÞñÖã>F²È¼~Õ÷\8aºP\1f\bÞ\91ó<TåwtÍ`¢:G\93\13éöƶÐb\8f\9cF\8fï9\rN\9fë\8bÔ@@g ¿\19N\0R\9d/\0âCq;üÌ\ 3 Ñ\ 4\ 5q\7f\9e\8fQ5\ 12Cü\18­!@æê\ 5 \vÀ\0¤?±\ 1\ f\02ìB\0i5r\89"\1dàeP«\9eV\86û\15S2ýYñÇv\1cP/Éê1\ fÂ\9c£û\97^o\86\9b/ÆÝjòPå\1a~ͤÍ3Ç\12Î\18¤ÐÃäx\82oma\9búXÍ\15\9f9@sDüLá¶1J\97\18ã\ f@U(ùÒÐøÜ\11ãZ\0h>\1fĸO\ 1Z\bï\0µM\1e \ 6Z\8eq\9a\0T¼¢\0\95^¥D\91þÍêXÕ|wØ8\95\7f\17\88T-³\92fMÇæ -¤£½\ 2\89ì×5$pÈ°Ê<ÊY\93\9cÞQ\ eÛÍ.\10Ò2À\rê£ò\1eØÓî\16`F{\ f0¡{\ 4\18>8Ç8=\ 1FpH\8c*\eã¤\ 3\8c4\9c\18ë6À(s\19ãù\ 6\184\94\ 1\ 6W\93yÒèC^\0ô\99¥\0z´«\89"]ó)³]¹\13»æ¯íø¢\15\v­\9c\93±Àº%e¼\97\88¨/ÌÙKÄí1àB"ôiH\13²øfqãQùsGaãļR\88cü?öÞ«Iy\9di\e=\7f«æ?¼Â\80#9ç\9csÎ9ç\µk\ eöoß\96\r\ 38\80\19xö·\9eõÍ:Ð\9a\e\8cZjK­îV_Ý\v\80y16\93\85\ 1\98\ 3\98Âx\0èÎ-£\9b2A7;\ 3@÷.7Ýôâ\0=\18*t3\98\0ô\18\92\ 3t\89[\ 1:Xd\0:lÓ\9f5{Z\80\16\979\80&­­Dz\9d¨D\ f\83má'ÕñÔP\88ú,ý±\8fÍ.a´\8c\11\93|d\98ê´ÕNMå,9\13\ 4A(ÜÊes¦\97ïó(!ómÔ\0à¡ü\16àÎÒ\1eà\86\ eýOb$\a8\18A\17í\ e\aØ\9aÔÐMØJ7C?3\9b\8d9C7Ý\16À¶Ö%À&3\f`Ó²\e`Ý@        `UÃ
+`Y\83    `Ñ`\15`\9eé(\9e\eQY\9e¨\84úµ|\81­hwBº~GÜCê\99L\96ú\91~5Q\97f¾*\89Q(|7è¼½ð(ìʽ\19\91\97Q\15 \8a´t!\12v\ 5 üF9 lv\14\10Z/A7I5\e\85\8c\1fªFº9¸\0~tFèfP\ 4øÉÚ\aø²¿\ 3ø*¨\ 6ø\bóÓÍ¡\ 1ðÖàÀø¡Kc'ÀÓ\8a\87Ì&V\8eÏ:LØq\88êÏ«¾M~\94v\85df\8fu\13nj\8dÁ¾ò¤5%K\13J©Æ«X*=O*Ê\91¾\ fQ\fgV@\ eTºÛ&\a4\80\8clYÏm\14Õ\ 3Ò£2Ñ\8dÓ\ eHzåÓM1@7û\14 Õî\1aÝL'\80ÔD\10@*\8f\ 6@¢½\18 \8e¹\1e \96!X\90\aD³7£9áRDë~|\18ý@zÜ«yäf=\fN²§\am§YnШténý¨ò$\8cc\k\1aT\956K/\8døm\9d P)N.nCMg\8esÃÆ#Ï\9c\80ê*ý\80ªP!ºqÄé¦\\0TUÁd\19¡2É\15 ²$\ e¨H\83~>\1aÊ\0Êk\9a\0ÊJQ\80ÒbQ@a\89\1d O\ 6]T^\8cÌCª]eàui\14EÇdT\89Xd\88ªOÖ*¤Z¦WíñÉ®9TÚÃé\1a\12Èå³@í\9a2ù¡áÿÏ9%®Ù%\98Ï\98ÆØ\8fÞ5GXüNW¤\9b@\9dn\86# 6;\8ft³Ò\0µ%ç\aj\8dµ\ 2ÔZõö\åî\ 4r\8c»{å\97\ 3ÕÈê\ e\93.ÓÜW:LZÎQÀ\97µ:ä\87\80!\1eK\99Õ'\92À\99bvÊòÄ=D\82]Oã\1c_\j\94ÎÅìDSLÐ\r\13Aüó       û\94\82h\ 1­::¦\9bÖ
+h­6\98lbl\ 1Zm*\ 1´:K\17hq\f\ 1´qâ\ 1Z\19B\13ÜPJ \99xãþB41rã\ 6uÍfí\ eRƨÖåÕT\8aK\b\8f#Æ[¯BYY)ÖHh¬\1cÝ\ 6\es|¾L&        Nb      6»\ 4t\ 6Ã|ÃlÃÆ\ 1Ç·@o[*\80ÞnbB{õ\81\85\17è\83ù"Ð\87\9c\ f\eT@ïÖÇ\81Þ£\e\ 3½×¢\ 1zk±ìîúÚ]Ûfã.\9aB\ 34¦-9\9a.r8sê\94\bAÂýæ\9a%Ⱥ\99\19\ f3ã\Þ,\8e\8c\9aNB0±\84ã6±ïMôoê\b#}3.@\vø80λ0§pê\b\8cK\9f\ 5\18\ 20É¢;`B\126ÆA<IUí« ¬iFw\95¬ÎRp\85¨\88       ±£\ ew\8cB\ 6
+zSþD\1c\9fé3T\19\82\8csù'ªø>±Ä5«\ 4$Ãuü2%ä\98 ßÀ2\ e,åT\1dXºê\ 5°\1c05°b B7§\ 1°\9cö\ 4°\82c\ 4\93®\88\9b\97ÉÚ\9bP³.U&\7f\83Æ·;ùL±m\8bÐd6Á)^ZSÙ}m\15ß\9c`R\84eo±t-G\vSs6\9d\17\95ãÅl\1f\1aof\8eáø0­«'²)\92Za\13ß
\19\11\86c÷Ö5HÓcê/#!x\15Ñ7M¢H¯¨×;\99|\bLÆ[&Ý\0ëC\85)[\85\86ʸ(·ÊH\fYGæjùJSÀ\88ÅÒ)Óέí\85yZ§jö\892\13t\8d"{
+ÆÙ\f\8do\90\96oBýe`\19í\9bú³D¯H\8dÓÝ}b\9cï:æãr§n\6Û-ë¬×VV\91y\voâû&Õµa\8d\ 4Q·Ôgqwº®\9f\87wl93ëÞ\8a0£cÒ\r0Q²w~è\9d»\9dØ1u¹\16Ùc¡3=\85ö­qW\9fh\ fãGyg on\87=ë°:í\9cR\99U»e\ eìZ]»ëÔ\1c¸­òKý0\13Y\9f\85õêº~¤ÑÕr\1aÊXݤ5p¥U­+\8d«R±X\83åS9\98,»Oår©åYô\8aÝ ¹.â\83\1aU\88ª\87Yƹ\9bO\18<c&\15\ 2ëH\85Q²W?43:Æ\87:Ð7¦¡nE\85¸Û¾u\ 5^á5\aN§¿\91P\18"uý\0MT7\89C¶R1ÎKåSaEk\91\95a«ä\aC\9aª·7,â\9dö¤0\b\ e\17\ 5j0Üä\13ªá!¯\99¬\91\ZwijË\1c©ËlJF{Æz\8c\85ÒN¤\91\ 3*\bWH!\ 3\80'ýje\82õï\86ôH\96I'ËDÉ®\a\9aê\8c­\1a\16?Xb\8cë¯9p´ul\1cê>íÃËHéD\14»î\ 1U\18ø»º|\82¬\98siMÑ\91Í\19Ò\9eÌ&\9f\ e0.Õ]:\92®8\12ñ´ã\94K§ê\9e\>\85´Ó¥d+P©'\95ýJ;\11¢ZÃø 1^ÄÆ\99å!¦Ùh\89\96°Dr®A(¼iE\9aa\eV¦Bû\81ÑÃ47Q²u¢R¾ø¡\99\84\rõY\0#\19\1f*\9bN6Aø§Ù\9c\1e]d¬\9bÉ2uªV7É\96/¶OtC\11Y\ 2\1fÆ\7f\12ÊÆ51Í2n\88¦Í\11sdY
+Ú"9{Ü\15ÞÔhSÙ\86Äa¨\15½\9cjÉà©WË\a=ä¨\1eh%°q@9\ f\1cü!ãHå\e\14]^\1fu\8c\ e½ãº\9fdÓÈÂÆ3k\e(f\88l,/\93­\ 1)Åw\85¨²2c¢dS§Ê´\9aTv"P\87\8eGUT=:Ë\fê\91\9cµØ
+\17\9dôh÷\8dô(äTäæÁz0½
+"\83ô.àW%\8e\ 1å$\8føCº<êÇ\17\rÊ\1755´Þq±mòj\ e\13§'í:\ 4ÝË\96!ã6£é¦«\18Þ,\9cûq\bc\ªIG\80  \94ebd¯\r\93\96#kh©e÷mó\9a¡aD³ÏÒdS!D©z*²Ì¯"¡}=\13\vÖ\ 3öxÀO)\12~|6Mù¢\86iÎ;ÎOK^Ín
+gãI;¦-\8fþ´î¹s\9eÅÐm\96\1fg®b`·tîûÇ\9d³\12¥d\8eÓÄ\84;<:\9fÎÞÊ\16\1cvåf\1dµ\85쮪uP£Õ³¨'CZU\8aYÞ2îf§×¦>÷´\8de/á\83³ÉOZÖCÆv<\8c\93¨%[\89\9exxSNú\83u\7fßá\ fiô6ï8·qxÒö\8aÃmFüN\97\r\9d\95°-à8\8dÌaG=îI8\90\993mo¥ýy»rå/ÛºùDã\92\a=PVêÔ]Z\12\9eåÑ<ë\10¸Ù\80\87̦\t\1c2\99ÕÁª±\98:.\8dÅ\8cÝi´\99Teºñ·\98¦jÏz\rE²LaÙ\ 2±ß§\14\89ö86ÅSõðvíI\a=%\99Ç7H\8dõ\9e\0ï=]E_[åt\12\ 3\99êÔvåR¡µá\9bµÞ\1aµ­ÍVêp´[\12®\9dË¢E\14~sÚ/\v\99\r(\197åÂê\8cq32\96\8cÅx iØÏ2C\83ÓÐ[ëë\ 5L©÷Xóf]«*\8fèü®:L\9e¥C\91¢L\87ʧ!m·cÌ3MÙgS\eò©\ 1N¤ë\8aå1\11\99OæQ\93\fÉ*ª´?\\93ù=\19ÏÀä²ù2¨\ 3\99t\80-d
+Êè1Q2ó¬1\93\99\96\9d:b2ã\15¥±\18­0Ŷlª\96ÚPI¶ô\ 6§n`Ö׳\ 3»ÞcÚxu­â)¬óÛõim·æ.k    $ÛÕ\f\95F\85ù0õ¸¿³«\13Ñ|\9aÖü<cÕl\966ªfsS\94n¬±âÀ¥0f7[%\95ò§\ eð"?6\97\r\97áJ©Ð\rt\r¶¼wºQ\84\»d×âð¦K¤\8d¨\85\ fô\0\83\vS.¨Y\1amÔr©?Ís\v½Ç\98^ëZ\85ÄNç·æNÚn%/×\86\9cUL3h4T\9a¨wbP\8f;+\9b:\11\84\86æ\98Ê \8e\16¨åtÙ£riß\8eܬ\96j²X\88ûH\9bÍX%mö\98\92Ø\9f\b;Ý8½\85DSaÎTíJu\92\ 4rEtÕ\mB\r{sà\1f\12é
+\13Ëë<Ù7\ e;¶*©,Éq\0æO3Y,\91\85\ 1øÓ#]+¿íi»å^_3\80ueTòäH\9d\bĦj-\96YªÒ\91ÌVe ª'*\97è()³v­"7\vÒDÚLv7±ß\94b\84Ó¶-ã§ch\8c{Ü[\ 4\97Ës\16¬Õ1Á@eÌ\1fr­0\7fF§ÁüÕ\92=\9f±bÖtc\81k\13±\95\16\8bìü`\1fRØ×\13ßdX©»·\89@Ê)Çq\8f\8dj\fuæl"\85\18\8e)ßR×>$\86\9a\98£ÝUkKê¦Ê\10\1eÕ©\![#i½\ez\aÉb·Ù'm¡Ñ\84¨¬\16KÂYP\1cð\86R¯À=³\94\ 6\97§G6, #C\18ÚLæÑ°\16\fPb^\ 2ÊaÖlRÆL\9b¸RµÝÍ\94\946à4^{.ßUØÒ\8a\9a\16³sØT\90iÁ \83\øtÃYÛmO\94r\ et ÷[\13M`2\15mMÔ\80èã\em?\13\1dªu¹X\93²\84\175â0ó\95     Ú\90\r/^ÅåSª\89µS¦\1e\16pD¦\18z*¬ÑÞ`)CI5B(\87» ¼ÂSÆÊ}¿RíÔe\15Éa£§H\8eÂ@¡£\95\aùÂ6NÈ3ÇþT\9e9\95IùÂi´³¹:\82\11\931¶´Ø(&æ80Àu+ïR\86÷]5\7f¯hïã©\88eÞ4Ø\8c\aÛ\9aÔû\1d}¨CkÆÆÜD\95\8dÆ\1a¤}Ý,ã\8aè)\8fö\8e¹,\1a®åò(é®\94\95#¤ÛPÆÆû>½¸¨\99bªsï\14Éc\vUèj'\9d|\11\8dxäYÕ"%7îb\1d¤à8ì\10+(ie»¦-$+û5ð6JV\ ePJÙ®=²dN\0s&\a&\879\96óF5ç°cGxç5­M#\97»\8dÖìä©\16·\18\9b!\97±Z2jõh\ 5\97k\12ÕýJeZÎ{DmÝ/cAÏ)§\8c\94"¹?$\14\0­5\85nî¯ÐM¥-_dÆ#yÖMmä&Ä\8f \85D]\8dXu\88]¶;fã2\87{W\ 3'y~\ 5Ü)\1d\ 5\10\ 5\bÑm\0\84\1c \0¡LÚ\8c»\81¹\92*Äg\8dnÕi\1d\13s\1c\1ap x¶d|æB&æ¦mì8fÌëuÝgtËKf]_\19'4:Ì} ¶!ç\94¨÷í-\f\1f\9a
+J\8d;\91\91/æDZn2ʳÈF¦-!\85¦§\89Xã¹\81\19,d\8e*r\ 2'\97\87\ 4îQ\9d±\b\90\ 4\1e\ 2HqT\ 5H)³\ 2HÙ¥\ 6H\85\b\ 2$}j\ 3$\8b(é&eL·bjO"1\8eØ£%KËȦ:N:ú2OÉÕY9Ûª\Ï\96H\e\væ¢ñ\146"\9e­C\17ñ\8d4\1a]{\0#S¨Ò¬µÆÛ\91@\17Uy­%\85\ 1\91MF\9b\95í\v 'sì\ eEPw\82\1að\10\86.@\86¡)@VË#@ÖNZÔÈf6 G|Q Wa\rº\99liñ\93Ñ\ 2¹Ò\19\ 6rÔÚ\ 3ÈÑÁÔXA\8eS[\1aµ\18}l\89À£b`fÃ\8e\933\12õØÃë­3à\19\8flÚn¬b..\82\1cx|º(e7«³í\13FºAn\8d\85\9eR§ðUåyjY\91Ueæ\ 2ð\94ç9 w¬\98rïr§\8a\1eG(: \9bÁ\12È3f\84n*j ÏRNº©%\80¼îm\ 3y\838\0y~b\0òB%\ eäÅÂ\bÈ\935\r\90\aIW*¬ö\ 6ãÆDÍ\13©Y\11;\es¼èZ\b÷±¦\86ûÆ\89å\953ëB9l\9aíºNÎÐvÖÃZ­Mm¦öµ1F(½¹-ªA]\ 3\85q\9am"öâ¦\ 6¼q[       (\94Ú\12\90ïÍUú¯\\97nfS @©-Ý$\14@¡=éé]\1e÷\ 2\85^\96aüÐú\12ý\94Ás\ 2
+£Ö\ 2\14ä&\ 5\14È\94þ\91Ba\ 2ò]2\90\1c)\92\91غ8õG\10\8dÆ\15\8c´ýf_v\9fT»kǸÜÑ_ùÖÖEËÐ7\1dS\8a²\9eT\87BêU\ 6³\90õM\17Ç¢Á(tÞ+õóäDnM\95Û2\ 4Ý7\80RÖj\0źÛ\ 2\8aÑ C7û!P\8cMKºÉÒ#\19o\b \98¸Ít3
+\0ÅÔ\95§\9b\ 3ýȬ-\a\8a\ e\14}\aýYݸ\ 2\8a|\80þgþ\0=P\89i9\13\8bÑK,\1c\82¾À¸]´{7³ªÎíÑu0&\8f°ec3\ f\8dJ¤YÔ¦ps\88:Z\16\16\ 2C[$ª\1dD\ f
+sµ±@\0Þé\ 1å\91j\ 3åBOÿÕ·\ e\81²f\1d\ 1eÖ7c<·Ùò\96nör Ì9ÔtÓ±\ 3e^\17¡\9b^\ 5(\v\9e)P\16      \f(\13K\ fP\ 6je t\94ö@é\ù\80Ò\18Ê%ôå^*Z)YâaÔW\861üc··¤9\98Ý\9e\9dQcO\f;P
+\98\9dFt¨\8f\1cREua"\ f\91>Gß\8a©G   RQ\90'\ 1R\1dUW\0\93×\ 6\0Ý6G\0m7'\0-õç\0M\8e\96t³Þ\04\88\9dè&\88ÓMß\0Ð\90ÎC7U\98\14CÛ \9b1\83,FÝ    
+ fk\0 \16u\13 \1a\12\ 1(ê¡gsØTã¹®<\1f\ 5¥X:\14öMcþ\85\82
+xK\9b¨Ë\85éÕZkÞá;\18ýÓá@kðé\vT=3      áÔ$eU\9aº!\95ÜQª*@0\9dÙ0¾NÂK\8fwe\\0lh_\ 3¬áÝ\ 1,\1f>\ 2,\16\atSS\ 2Ì»P\ 1Ìg±ÒM#\b0¿*G7­\1eÀì&úaûI\a0ý(\ 60¢D\7f&+ÑóÚ,Ó\0\9dÄ»±RÚ\0ͨ\88"PÍ\ai&¥ýÙX*æ\91Ím.{
+-PfW[¹×M¶Þ\9eê°Ü\17\88°¦\1aV®"n\9b¼
+¢ZÐCÂJ@h1\19Ûàûí à³ù\11àÝ\1dýÏ*Ì\8c\91!qº1RÌlÂa\ 3Ý\f]\0\8f\18btÓª\0<j\1a_\ 2\90³\16\80\19\80k\rS\80cZ\rÀ\96\91\12=ur\16­\85¢\r6æ8¾I\16}ÖN$î\8ctÚ6Ë^£!\f\91xz£±\9a0x\7fC\ 6\ 2\9aU[hýe\1cqÉ° YÇxu\ 1é\9e«\0i\1aR\80¤Úä%
+\19\18Wa(òD\a\88ÖÊ\b\886j£\9bP\0\10¥A\1a\10ek\93n¦K@¤\83\18 2j\ 6õM\84·E@¸Çk@\98\a&@h\8c\1d\9a\ 5ó\ 3\evL(ümÿò\10(¹ýþYØ\96KêÌ&TÞ´¹\98jMù\rÍ.¦\9fks
+ÇR\1d\91\ 5×\14­\89@lÄM\93ª0\91÷T0gáÅ#ëÓV@áuúGøÌ\ f(\ 2\8f\ 1
+D\8at³ë\ 3J\96Ü\ 3rCjèf\12\0ä¤Ò\0d'u\ 2d%î\ 4df5¢Ù1$"þ\1e>\ ej\aZ¨§y\1a\8efÖ>O\13>³WY6è2~B¡\92oJKl^×´\15U\9f¼ \vk\8f±K&    ºá¦\98\18Å\83ç¦\19\fÜ5\91 Sù\8eñÜ6×9 jY\1a\9b\ 1\82ÐÍÖ\fT©J\ 2¨Òñ\ 1P\85齧r»è\1f\99Ó\13 RwM¡Xl9ö\1eÉXÍ©\ eï\13\16×"éÖ§t'­Z6Í#xÊ\87Í\15µp·%\8bxzÌysSÊ\8eI1quü
\98øi®Y(\92ó\ 6Ð\94Í#º©ï\80¦b¦\80&=s\ 3M¦L\7f\9b\8d1×D\9ah@\ f4^\7f\ 6\915ÐhG^ß®¤ê¹(y³huÄÌ\11C|5²«ë.\8f\8a)f§8M²SY4\14m\ 3­WÛ<Ç\12s\1c¾LNáKB    Hæ&±\ 4ó\1dÓ0nákæá\9e{K7-úá¾ÕD7ë\bÐ\r\1a- k$N@×L»\80®\95­\ 3]» \ 3ºò!îÆÓަͦ<e\8dÑb Æ@iªr\8d\85\98\84ÒEØ÷²XB3=S¸Ö³»f\97¸f\92¸þÅM,ñãze\¿u\1f\93í\9a\80\1f\rÀH\ 4<\97´ÂË)0ºÇ\140zú\11`´ô\86Àh\9d¨\80ѶOÙ¶T¼l
+㶤Ö\1e\xÉØ>aTÖü
+T6ê¯÷7áÆ?Åì¾.ÕãØÐÞk:   &È÷\9aX\ 2:~o\13KÜåy`븱\99|7Y`>Å;ÀBØOÀBêl0\1a\89Yi\16³i\ f,\16«\1dX¬ÆÒ7ý\1fpV¢jÙ¶\9fòË3«|Y\19ww\17\18\1e\e\93x«¸ð\90Îζ@m\17ÈT\9d\ 58ªÕPj\87nàµe\rþ\84{h\ 2å \1c½y\87æ­Ö¬¾\92²k\Í\9ec\10í\9d\þÂÜä\ 1íMÌ[\9a\1d[~\13\ 33£V\17\8azL¡\88\7f\14¨ÇÀ6º\89\97\95iuÒ¤+øS3g£\92\89\8b\1c\9a\1f\13ùÆxç)Ú÷ PÚ`J\b¿®ÌÒ&´\16­Ù\9d\rtèÉ6\e\9bà°íP¤ä\9d\8d6oí¥\1d\95ä@\95é÷\86½úä4ö\8eVƩâ\8cÍ6~²½H§´´ö_5ëÖ½\81;¼õ®\ 3õÝI\1e]\1f¬\15\15¸64\19Î'BÍË\8c£»\15âݧ\19\a#\1d\ 5x÷iÆÑd\84x÷.ã`è\94ÄE÷\ eã ïRâ¢{\87q4\19©\8bNB\ 3\0¡Be¶ÑÉ\82ä\93Ó\88|ahT\94ê\r\93\96\0\8d\94ý2¬ë2é        ¹\1cóCöå©RxÐW­Uå½F7\8b«´ñ¬Ë¥\eX´)\83ò\80´\8c\9eÚbeªz;\18ËHã \14µ¥âÖª}¬#§N|yDhnN\fî\86½\1eð\1cA
+\86Qû,-ïÀ\9f\r\1a\ e\ 1ÚÚR\87¨ñÆ\1d\ e¥úéHÛXjCÖ®ãö\8a\13O\14Ü\1a[r©\90ÅÒ\9aî¼F3·5ËöÔ9y^>\ f\1a\v®\9c%X,[\89bi}Ø\ f+úúèXMøj\9aÚ\10KÂû\18ÈéLÓ\9bÐwZ5½bÓÞ­ÖD×TìÙiv\17ãý\89,R\1f\12mû|\14\b©\15ã&\ 5L\93ãd\16\9aYÓÍÒ<gÊ\8c\16³\9dÿ\ 4¹®]\87=¸wÓQì²;YoØÝ;¢\95mPÝXB/ù78 Ù0ÍVT\ 6×äíÿoy\1dè\ 4å\99a¬ \98&\9c\ 3\94Òk\ eXp\8d¨q¿¶f'êË$´IÈCÁSWYìú9½^\95
+Í´¹6iGÇ\8cO\8f7ü9\83ßoê\19\e8¶3\1d\86;ÊbI\f\9dpå&mÓu¼é J®¥3äÔ¡®6"·ÐËw\19ñÚC\9d\8a¯@å'þÅ4,\vj26\98ö.\145SþpwwÌGåÕI?æòÔ÷p!«\12ë¾Ï\95ÒÇ\8c©tB\8b¶2\83ÅfE¯æ\ 1\96÷ÚÊÖBõ\14\8b\16wMgµl
+h¦\954\81 Õñhmª\87¶ÛH£]\19TZ2wyB¯ë8ôOv
+=\97¾»\8cjý}­\ 6É\ f¢óE\7f\84\9ev`ìm\ eu\93Z â\9bî\89xnn\1a»zp\85ï\96\13£\9cZ\93ÈÉÃá5ÍHB\ 1*û´
+rÓ\8c\98\8f)\ f²\9aì â\94æj8§ÐUVu¥z\1c\1a(GýÍ
+.d\80\ 5\87\e\12\82F\ 2Ù\1c=\90É1²ª!\8a4§ê\1d\96ÍÆÜ\fhR\9a\82\1a®k§.29ÄôÝô¸f\94\9bj3\93s\97UÂu\rïÃhN×Óöxo7v\86BvÒÝ\b\8cc>Ë89\vjª![\ 4-Äzñ²¦eNÍÒ«v\ emlÔ\85\1a^J\97MIë\92^\96M\1dÍ¥C¬©Ðâmz9b»\8eÕEª»9äàîÍ:ãô@åÊB\175\\913\96K
+k^5\91e\rVzY\8e\ 3Ó=ð¥g\85ýºJ¯Íä`aÀ\ eË¥Ö\92\ 4\0±\1aúsÆuØtrm0}<\fÙ\97Ù6\8d±êÎ\8d®z´¨ðÏ÷ååxÏ0\12\9eß\ 2¼ü4#i2B¼ü4#áJ\13àå§\19   \8fª{^¾.{%4ÒÔ\86?2\7fdþÈü\91ù#óGæ\8fÌ\1f\99?2\7fdþÈü\91ù#óGæ\8fÌ\1f\99?2\7fdþÓdÊÝ\85´çBFÉd¨õR\9fìtþ½Lû#óGæ\8fÌ\1f\19^c
+\9a
+R\9e3\1e\98KÇ&\99è Ï\9e/)\ fþ
+¦x~IL\ 5
+\8e0\8aK\9bÍ®8h¯ ®kù\7f\9ci\7fdþÈü\91ù#Ão\8c\8b"%$£\ 4Èèzý`â\94Á\9f\893c·â6vì\85Á3ú\89:¬ò¢k\95\92¡åÌ"ë?x´\943Æò'l\90\1f\ 6°Gâ¿Ô\93÷U¹¬:h\8aaj        L+wu5\95é\18ûG¾\9b?2\7fdþÈüW\91±ÈJ0V\13V\93z"þ\16jOïèC6>ìÑsÔª«=öl*k[½}:\9b\86+hÑË\rº}¦\9eF\8f\-õÚ\fêA$\vèÿHG\ eÍqû½iTî¸\8f     ÜÃ\13éÕ\83I\97Ô1º7§Y¶]ë\ 5}\18ç¦dÅ\14©dkív[\86ÇÎ)1°\8b¿\17òäÙ\ 4\83±¢K7C\9a\81í¦-ÚïL[\8c8`bצ\84×_N\88wô_³ÊþÈü\91ù¿\80Ìr¤\r¯a½@÷£_Rá|uã¬[j[¯öás\8eèV³\80ÑÛ\0È\81òá£\95\84VK\99¡\88Ì$\e\11\95Oô᪯U×}ciE\1f}4\93ݤ\1d\90\7f\ 3\88y\13§kè£Ùo\9a¤\fï/½\9d\80ð\83E\ 4¢J¾¿Ý\93}7'Ò\17\19ShU>õ7 \14Ù¤Ø\14G1\8b\91²Ñô\90ð\ 3\ 2{}ÆÖ\ 4\95\8a\ 1%O]l7H\83]H¸Ï²»\1e\88¡^\93÷¨\1døZ\8a\86¾÷ð5\eÉP¹\1e-\aÉ\7f×¢ý#óGæÿ\1c\99ùT¾@½ÝfQlß3\r\95/¬ý»     \0Vªþ\84\få\89­\8c¸\1d\8a%b0s)Âb]fãiCK÷mLø"-QÚ\85E\82ì1\1a¥|X"D\1f\9bÌd¸\1e\8aÂ|\r¦î\12ÖPµ²ýúû;xXÕ   Q\ 6å»\83ïo@öÍ">\8b\ 3\11(r¢"6-\98\19\ fí6\8df8\1c0\eãÙaJèÙ°\83l\15¿¿\r\16EUPñÞ\19;
+\92¦%\1fÇ;¢¯²t\8a¸Ëȼ\biÅÅ\ f½µ\m÷\1a<c\85\a8Ó³\8a\90²\7fGbºÎÉJyù¡\99lË*©á¿uíÿ\91ù##Ô\98JÓ^Ü®¶l\1e=GÍ\1aÇØÄN\93Q$béôÃGc©\bÙí\7f\87v~·^ì\99\14\93Ó\87\9c±¨Y|\16Ô.S\9fõÂô~\975Ä´9\15h\8f'm'#\7f\1c°ªFOðAÊgÃ\18Í\10étÍÂZ¦\194'PÜ)ÌbÊe$ûÍh fq\9e\93±oZû̪\ f;\81Y\1fÕãV6I÷\81ë;5\91×Èd¸\83d\10µGp\18²ð¬Å\f\ 3¤'Ê\14\91å~¯jörªt\98\8a~\7fÓÝ©FñÀI`(öÉ4sÐý(ä\11±\v@Ü[(6íz£;\9epk\13ÁZãÉ¢£\8e\v½¬l\1f\12Û¦æ\9f±¶ÿÈü\91\11l¨ñÈ[u\1a\9e\92YÄ<ù±M½C\ 4öÐMo\8dâ£\e}\eÓ\8d**öL*>ëî\8d\8cv';VÅú£\86\89Q%§bÄ\8cC\94f9t´Ðª\99ýT\8e\16DF¾<F#2z\7f
+\99`?Ú°§\ 6å\88Ì\98\11¦\93÷0°dFÔèʧÜèÀ{¤\\8dB\8c².´\1cñû O\f~Yqª\8a¼>KÂ\19\9c°\125!ô=\93¦\94î\ 3\16\1dò
+¼*U¨5\80$¨`ÎÌû}É\ebÈË3\82²Hmh\ eV\8c\84\84äU\82\1cÐ\91ë¢\v)mhqìïÆ)\11×-f\88e;\99¼:\14EöþxUn°ü÷o\8f?2ÿV2¥Y¿P:æf#ª\18\8b\8b\8b&µ'\1c9TíDÊàÔ\8b\93¡òéN\0\1fÂ}¶µ\8btGå£k\93ùÈÈ\911,Ð'¨>2\95\9c\18yC©Õ\ 1A#²\13&}\18ÜÓ¾ÂX\90\16Q]Çoå\89\0SL'\9b\87\96\v\ 1?éæË\8cBy\ 6e\ 6\91°Ëùý\13\13ftP3Ëô\ 4fÙýfEey©/\8dº\9c\a\98ro߬F¦±Æy\12Yçs\19àï\91*Âw\ f\94ý}¶ïlTä­\9fI\930Ù4ÏË\vbC(¥åáâ\96?å¼ÜÉ\8c\8a>\94¢I\97À´*\ 5G'82[\13{\15\1a>V:Êq\9aä\9e\9b7\8dåØS\ f{r¬Ñ\9f\18\17§½£>>ü\13·Á\1f\99ÿ>2æ¸::·¶4\\9fÜMc\18®`ú'_fíé\83x)\9f\17y\94\9a\92Ù\b÷òDÌ°¤\92±¥Ú@2\eË{u"ñ$`=\       DÚô\ 6Ô´{%¡¾2Îj\97`T\91\86àÆ\19eP§ýGÓ\9am}}-ï6\99\92\ f¡&¤Uzò|]%«¨1²#Ý-\vñ¸82±òA£ã\93'§0\ 3RÙ½-p\rV\18\1d
+s×Ãßj\87Q^0½qX(°
+^E@ \13àûG»âênL\83\12J\99ñ[D³\92{\9a\8cfGºç\94Ð\ 2Êûìrç\12ð&RQvº"Z\1dPçC\8cÄûöãÓ\rßCQ2øóî¨Ç\1a\8a\14=
+ß:»:E}»õÃ0\84ÿÖ\1dõGæÿg2T­\9bF\94\11¯³Ó\171ºèfj2ùW\1aµ#Y£×pO,\9c\90ªdeËÚ\9cYÈ°Ê\0×9\ 3\1f\89\85\90ѦÆÛG?ß\8f\82\8dÓ\84Ñ\98dG\87Ȩs¦ñ\12gE\93  \96,¶pû\91«²=¸áô\89\ 2Ï\85¨Yº\15\17­I±äKÇBm~Þ«\ 2î|
+jDp§zf%-÷\1a\14º¾rð·¸3É\v\9cZ;VS#¹A/ì\ 4      ÍYcJ\b] èü\96@\91~\0\83¼\8bpÔÝ .\1aScÖãO\89j°}\9b\ 4tX*\ 2§Ô7uR>\ 1v\835\9a\84¿5G\f|×_¾È|\a0£_ ß5\86\92y¦XÙAé\87B\17Èd;GH$*Éað\8d\e\8aáp0´\93³±\8fò?tèþ£vÐ\1f\99O\92¡¦\13G\8f¯m\\e\vIb\89¬\11³b­\9a\88L³d\9eÓ&P¨âÁ\84Ì\88tt\9d\8dA\7f\14ê7\vè\ 3TÙ§\9a\99l\17-(b\15\1aMØæH\ 6èM\0ËfsÝç]·Ò\9b»8\83\ 4\98 ªÌF¬Hhð%j1¥:Ë\83ܾ|Ú\1c9Cg%Ø7îì(¹\86\eS\97\88ùmiÎ\97èé\9cæG\vB\ 4¦Dda¿°d\fWÌ8<ªÆ\81\1dLs\ 1\13Æ\ 2ëÞR*ùêpa½;KU\81kn*ÃJ/A¯Ú\ 1Ag\15\86\8b\9d\81\8d÷Û|\94Õ¬ä=\93à" Òl`\rCZØ[\86[ö´½ùíM\98ý\ 2Ú\19\ 1\93°\19½\15,ìj»£Q\7f¶SÕÇjkR<Vóß´\19ÿÈ\Ȭ1D\11N\8d\80Wù²ñv©\99Ì´5\a\fß\8eº*/\10\ 3\v9s^Å\18F\89\8cð\82m\ 6:C\90f\17¬à\85\9cw\9cKÀ=ìIÛQn@\ 6S\86ê¬Ý({-\1eîB\9d\b²¢\ 1\94{¼¾KFßY»\81Å­î­\10jÄd¥ÕÛ"\ɼ?\14\96¬¨RlÊB¯'SK\9f·¾\80\96@¬a¿¾¨¾Åõ\11\9eÎZ\r>\9bó\1cý*"Áº·\10;\7f\8eá"=\ 5\17\vÕS$¢qÈEʬnñîVå¹)#\99\11wVÀ=UI}_\ e\85\90À=\ 6å\91§\93\1a\8a%\8f\bÆ\95³
+Û7°e,M¡%\Ò5YŪ'è       (D5-ZIE,\9dÜTtW\94*\8dV­\3\8f:~4¼\8aµ\1d\82\8e\80ÿ\8eÍ÷\7f\v\19Ë"q|ðór\94(ë5DZ\11¸¦\1a\9d»\8b
+Æ2\8cmZëà¼@\95MA[-\85GÜfvO
\7f\98\ 2
+Ôùìý8\7fÄÙerÈØW àâíi\r5=\9c÷;\9fv©qÑ\b\9a¹\99ë:fD\fIµyafÀR\r\16\ f\87Ê\96fçí.`à\90fFSB\ eÕ\eõá2©TÝÙa´\v@+Y¼©\9c\82J¶_\84\1f\9eQ*%ÏZ\8bP\90\1d\95\8b\8d\19mÈäK\9a¸¿UZ\ fì=$ªW\b-\8aü©ræ @\1a
\7f\11]YÓ"Ï\83F(\8b:ä|\0h\ 2\19¾³±\88\93¬°v
\ 4\a\91^ÖÆÒÖ\8b-UK+ ¥6¼*\15¼ó\b\10YÓÐä\96\ 1\83ëÔÌ\fO1®\1eúOØl\7fd`Svj\1a\8d\99¢o··CÂÞdº1ç\15Aw%½¤àÂñG\84zêFb
+\8cÝ\83=¡ï\13TuÈz\86¾\91$Ðpá\9b\99M6Öf­\87 o\7f«ÇåíyC\bÙQÖÒ
+ºF¾Í\ 6ù\89\8bH½ì\15 ×\93\\7f\ eì
+       (ëç-ÎOÍ\92\8bQ°_~\0=\99û>k&Æ\8aLÍù\1d\fK8²S\19ñD\8aþè÷\9f§Ò¼\1fÉùudPF:&´\1e.\8b\8c\9b~®Ã\18\16ÏpÃRQÓE+\91\eùP\89B|t\96\90sÞw\15*\86¡2\97\85~ÀPI¨ê\ 2,V¶,rø{EìÀ¿¡-\8cÖlß\e\81ëV
+VUqVB¤\8c%/¼\84\rs 8rE\81\98?J¦Ö¢îøù\0À¼Â\11Íúa_\ f)`¨*¾^8âöÞk.¤\7fÇ~þ'\90¡\16£Vl.\96B\89Ú\r[£UÍ}híâðd\15~Nï\ f\141¿+leV\8d~ÜÕ\83\f\7f&]\\1e63\86      êàöSBw\bëæ\95·y\96\1e.^`\0ø±ä¥!ÜâßH&\95àn\186¶ü¼\18Ñ#/"J\ 1ȳ6"ã§'É\e\18\e+\11ÂN<×\15ó³oX\18\8a«1têÚº\9d5v¶<CÈtX­ÎÒ\88þO Á\14ÁHG\8d
+©q}/.\9bÒÅìk¤Ö·  ,\16\12S§Ø©\18ø"¥¨A`¿\ 2/¸Dn¦ÅÀ\99½ö­vÆ}\ 6¥2\18kàl¹&#-N\9a\8b³D\ e\b_Xt¬\83Â\14>Ó¤êI®ô=¨\ 3\14c\8eêz8×8:³9\f±QÈ£°Z­È1CÐ\8aeÂ'×.lÙ"ÓÉ\86\12\161\19ª°è'ãKÿ\19ûø¿\83\8c¹¹à\1a\12?K\ 5\16j(eärTm\18\8fã\8a$¾6\15C²=OähZ\84ZdïÍ=³u\8cY\90²EI`Ôg·ç7/\f ä
+2ûÙ\88×\ 4°\1e\97»fz\11òQ\81\8ané¢ððý\8cùVæ¬}\18öcóý\1d\e\853$å¸\82ëð\9eøÕ¡\12Û'\81Ü\8däü\8fL6\ 1\7f»;yZ÷\8b\9eØ2}Úz\ 1®±\11\9eìÞ\8bÖ\81ex\ 1\93ªÙirÞʼ+:kI\ 6\15¡ïê&\1e\91ó\9c`\93Ë}\17,\85Æ320\87\93uï(\ 6|\ 3§0Ýü\bvÁ+¼ºyÖÐCmȽ¬ÎywèÔ018\vwL^ã'8)\a\96ìbP
+¢}ú²`ÛÂ\97\8a×     \96¬Aè7
+QåNªæ\ 5
+\17.\ e\975z¢¯¹\99ÿëöî¿\80ÌrXÕË:\ 5Ci^ïnóú\8aÞ\96ᩰƽ
+ÖÉ39\8cN\992æKº\98=Á[»øÚÇì   ^`s±¦;{f\81ªàöq~\87\98\8d]ö8E\92\13n\9f\8aJfsÖr¸\9a
+3ñ\ 2Re¶·\13ßsî\98¬ßì\11\8es\1dO9©\1f\8d\ 3á¹7¬Ù\18ã-\86°\91{'8iaúÔªå5>ë3E\93·%æ\9bÐN\8fêó\9e\16\b\8fÙ\ 1V
+};N\83\15×\83\16\0:Iqc \ f\84,\12`÷s6)\18¨¤¹\Ãñ%X\85j[´À1fØç$\84ÖÕ9F
+VÌâ/\9eR-t\96\8e\82N¿rG½?»\98F\ 3S\83\7foV\88Ú¾¿eûø¶é¥Ê\98`.¦
+©Ý!\19µÓÚ\19h
+%®³ú¿c\83ý\91y¹¡Úý\98+æË)Û­BÜ\8e\17»!Êf`6Ø]ìI±\v\8b\8cYuýæ\10.D¥+ÍÝê¬\b\0*^ìñ9\1a\ e.Î)\12\vÝ]4\15ðº°âC\85Øþ\94HM`¢ ±\8d\9f·8\7f¯å,Ð\13ûm÷ë¼÷Ò\95Ì\9f½°@Yír¯8 rÁª\ 22\9c\17¾bØMÏ1Ì\80\14byy[û\16ÙÚð¾J'¶¯©\18ZÿÑ@äü·SìÀ¨\99ï5\95\ eßk6ÔÔ®\X6gAoU»y·÷\94jÎz\86Ñ\91\0ºÄ¡;³\8f{Ew\99X¦¼f^i4m\94ó|(\16\9dÅE\7f§Ì×
+N\81\15Õ   ;\90\80\99û0\9bEhT\ 2³áÈP\13Æ\ 3ZKm˦K\1e¤eQþ/Þh\7fdD\9aÝ1Ñή\86Z\e±Rc\14w_\8e\ f\16¹<\8aX°£³\8b'ë¦\83\9alk\92å9×À\80d\14®*\13¡Æ»íÈ/\19¿\ 6 O6Î]uúâ\9d\ 5\88\8ewA"ëU\8açmÏ\ f'É­¬÷{þf¢g÷\8cÀ\96ï\95|êäù(ç\ 5.Y\14ûèY;\99\9eBÝ{\7f\aÉx{\81¹\1fâÞ£Å\a\91\ 1{o\8e¦Ô\ 2ìÖxôç»)\19ßcZÊB¯\8e`P\12\8c\1f\ eÌõ3\ 4âr\7f«\ 2õ1ë4óò³=\94Üú\8bãKÄÍ\9f\fôÂð` \9cf\94\17se\fTª|\16Þ:\ eÍ\8c\ 4\84A\90     \8d¡~\88&­Á\93\88\7f\10Õøó-P2\8dQ\ 2\7f\94Áì\9f¶3þÈü#ɬú§a°7=αFët0\97\97r÷´f\1aeï~Q\1c\8f\83ªD\13è;¹<J 6l-³YC
\ 6\8a\9b¸d¨´¬XH+ÅÔ\0Ù¼Å\94\16çA+òfÿE£±$7÷\97@\14+.\0êæú\ 5f\9eB\0\83¾Ðd³Û=ü-ÿÚ\9d\f  KQ\15\80\9e²åE\93AV<W¨>çî\9d\0@,Ù8\9b¬ªYÏÄuб\9e#ú·²±\9e\87\0Q·ÝZ\11¶±\91-\9d°°ã\99\16?íCl ¢´\1d\f2\97÷r0\bÙc\15r§?Íh­\ f\80C]i×»'<k\9aiTµ¥Å¡\96\19¦éih\8c\18ò\Y}ñ|8ÿÝ;æ\8fÌ?\97Ìr0Øx\8bÛ\8eB\9e4f:\87\84h|ëH\97ç(G\9bî\fem¯ \8f·\887gsN×ùt\9c\11\ f\13egE\11ÿBj×Y'\8a?\11r\80\9fû97a"ràíÞ½¡Gö\7f4,þäÚÁ¡:'&MMËJ\X&\90¦sÀ\91\90HÈب@[Ì\8eÓ¡õæ\8f\83ðµ\90²\1d*JßB       O2å\91\92\89ð1i¼7\ 1V?\93Ò¯-\1eÖ\12.ðîÆè!\ f5\83Ú"ÃpO§¶ä·\82Q6«jÔ4À\ 3ù\f\f\89\80\12õ\88\80\97\8a\19«µXYÈ\8dèRo/\88çúúÇ/ë?2ÿj2ÁJc9Î\ez4\99Iõ(Ç\86¡­k=stgw÷ó%¿-\95´\ 5«^[} µ%wi\8b¡eíF53ÀILIŨuÉX¿\93\19÷38{±øb#\9f\88      Ë\f
+e\82{/Z\11ÞåÚ{S<\eµ\9emA\ 1Ñ\97Q\9fµ¢n\85:ÝûYHF\1f\ 4\86A\84{×^³\85ö,ÌA\19á\86\9fà   \19µmïY÷\13\by!Ý°ß\80rdâzê\8bÃâê¢\11á¡<Ï\8e4,\f¬Ä\95M\8b\ 2ýöY1õ\8d\8e\95\r±|\f\18×Óâµ\98Õê\94\83Fjéêð|ðç×jj\ 4\93ù²£6F()     \9fÿ\1d\8fÌÿådv\ e\7fËßÞ©v0#Q5>=Î\8aöTÌ[p-G<ø,i\1c´m:l"ÓÆÖÉ-á\1eGdÈÊnR\8f"\9büÝå{ÁÔfeIÎÁ¿[\ f\10\95\9c\96U?\14{näÓ®?\f\9cï\ve\ 2h«bò¬MA0ؽAH\9eðzqîd.Úì\1aîØ\a[oÛxѦdÖ ·kKRA\9cmI\ 1\10\16Ù@C>ÒÄ\97È\97É5\r¶åJL\913\8dp\99¨7¾B.ôõô¤ÊHA¥^µ\10|×SMU¯\85\83C±ð´]\b\ fµnaÛÐZì\9aÍûFË\9d´\98\9c#NL\b\7f!\r»Û¾`*\82\7fìzý#óGæ£dö\ e³gÌ\87¸Â¦\9c:Vt~³\95&\93Jy:Æh\ 3m\97B\83º/\1e;\1dÚ÷~#ªo\8f\ 6´U²\12T«ä\19sÇô-(g\988iV\ eñÈ\15²;\11¥Ïcpjåu\11ùBwµ¶àá\93¨\88Éï\87¶)\85êZùdé¬\81  Ø§£\E\96\17\8d\1fÈ\ fÎ\81\92Ôøn4?ÝcÖ¨µ3§-íA\7f)\b$\9b÷4òÄ·|å-ª\83³\8eH\ eRk±eR\9bµG\94î:°P/Ê\ 3m?'\96EU\ 5ê\1dY60öwãb¹·þEk÷\8fÌ\1f\99ÿ,\19Ü\10\9b\15\9c\94c\14ÀÛó!Ñvíf¶\92\9a\17\ 3{(%#~EÄè³XG WkÔ£\íH\9d\ fÅ/N'ÄÉ\14Ø\9e¯'\ 4ÄÝð\8c×`µ5ÜÌ\8b)'uÞüÙÆå\aP\17)&t¾>\v`\ 4\97    T̹ï\1aaÜ8ÐU\11®
+µÍ\80Tö[$&ÖZ\18g/ÞûÌJ \ f)å÷jU!\r«CjL¥Tk\18?X¸\1eÏÍFW%¾\15\86ÕÞ\16!å8É\1dáu\1a§(ÖW\97¼\9ezÇNt7«\80øK¬¨u\94¡åÙô\9e«rÊã\7fÁ¢û#óGæßE\86*\ e\9c¾Ù\88/3u"Ù\b4\9b9·C(s\1fM&Wkë]®Vܹµ¥Ô³\88¥ ×&\\1d\17?;\88F­Ë#æð\92`íe~.\80\92Ïû-\1aª¿\88¬zEFÜÉË\ 1\1e\8cZíP\9csÆ¥5BL(!Э\87\94Ç)¾\99^¡º±Ù¨:g\80;i\9bY\1er\b%\0=h4¡      \93¤\80î\16\8bøü\9b\96\12ÎPg-eçD£2wy<)\97\9fq'Ä5À\9a²eêVS\95.7ï\81Ð+,\ 3±ú$ÿê\ 5ùGæ\8fÌ¿\8eLqî®LOÙ~±¬\98§J\85¾JÖ>èÚÜNY2dÙ\8d\14\f3«1
+,f;Ø\11\96\r\85\85©Ý\10\133\82õêÅ%I\fb\99ð%pÙªÁ=¶\9e\83Ñ
+       Ýdi\16Lë^Ô\86\1c\99\13J\86osÑÜ3E\1f¯¶`OFu¾Ñ=\95·Æ\8dØ\85k0¬Ç\92ó±?\7fê\8c`Òxñì+m\83     @d|%\9b÷?-À\ÊÈ6ÁÑ\\0Äý¯ZI\7fdþÈü\91¹o,uynM\8c»ÖMP)\90òêÒl7[\7f=×6ìѼ\ 2í\ 4«I\ fXÏJæ^D\88L\^´.ôN§y{\88\99,ëz«ã/\18\1c\ 2\9d\93{Ór²\1f@1jn{Ok£@nW\15èö6ñ
+\94Æ2WtÙ+øzCá
+N¦±bF÷To\9b\8fº~¸¿Ðí\ 5\93+\1e\aûÀ¾-DÛ\ eÅlW\97\17w\8f\98\85\8c\8eºJ\1f|\90\f\9emJÅÍ*¾2J)¬öOxõ\7fdþÈü\91ù\a\93¡\86ó¥;Ð^\18ôFå£x_êXGí!K\ e\9d\95ôA×åH¡{2j\ 2«Y³ieÇsÚ\195cÜ\94\17)\8f\13\0\19\17A}-\1fÞ¶0\e?ñÈ\99~0ØS¤!\82+\1f\b\8cy·c÷ͪ±Qi:åcæiôrY\85/g\16\19\17\82úÏx7\7fdþñdö{§\9cÁ\9a^þ;G\99pþc®*þQ\ 3\17\9dÌÿë¦;è8þ\17óÅtúÿ\rn\ 6§Õh}üßì~3\9e-Gÿ\eì\1d{øÿRì3\9aôæ\98\1f\r6ûáhxþ\8cn|1['´\1e^~
+\7fÁ|ªÓuü£Él]\1cý?ÇË\97_ÿ£\81_Ü~ô¿öÿÕø
+\81XÌj
+Ò}\ fGLϤÛÔµ\90\9er_£Õ\90)\8aôL\8f\ 6ø\97ÞèÌÙ\r?_ä~þb¾p\18<Å£?8¶E\16Q$ïê\ 5ÇÚ\9aûç[=éÊ\9b§\07D]@¥AóðÒ\88t/\9c\0O×m\80\9aÎèïºc5 Oö\ 2 RÕ PiSz­ÆUÃ\18ú&\10ÀsÆ\83þ\90¢G\17\\18=\99®Ûà·\1a¬æºyUwªºá\8d¥bÐ\ e¯ßj£\9d\11Ì\r´ß»]}\1fµMǽ        ÛÁm\8d:+êð¦n,\87öͺ6X\ f×\8aa\97Ï5Ð\11>ËúLÆ Ï\91\ 1\15\91§  &Íb\13f§¤6$m0|\8aÿTò°ß;\ eE\9a
+\15Ój\8c\ 5v"×±\1d¬ácYßÞ,\94Ú¡RÇ\90Î\ûÝ·´\a'ݹõDº#@ÉL\9d}7Á\85Zs°F\8cÖ\9dcNÿ3²¤\7f^\vÞSmî[©fN\98jÄÒ6Ùcmµ Õ¶<\r£·8\84¯TͳDD!LÕ       °ýA§Ø\vSÍê\9aF\99ÞN\©Òd®\84\ f(\95R\89P5M±\1eZ\v        S5âMÒ©\9f\bÏU\16nÃÂ\85Hi»L
+MW\eö'¼"TÍ\88|½Ç]"Tkmmx\9c.\©ÂÙÜ\10\8e\0§R\17ï\14\ 5©F¢ú¢(\87õuw±ËP¥Wd?tÿ^+pA7Oî$$\8có_-V34\96:\9c¦jÜð\16TRë?SÍ¢(\87ªÉ´êl¯To\164K¸³oM×E\11ªÞ\9eÙ\12\96ë\ 4©¶=ݼ\18U\98X@nÀ\1cMáé:Aë\80LGyaª¹\0îÞÉWI!ª¤ciw_©Âws¿ \b\9b\11¦j¬Õ´a\9b6-HU\16\9eXäù\95>#D\95\r·Za\91é\9a\11Åb\9d
+\88Qíi#T·,L5¢õ¡#ÌRc¨Òd¸L>"\94çLµ¦Â8Lö¤\8d®3\87CÍEø\8ejÝ©MZT:H\95àP\85g\9b,:Ú\98ó=\95\9e&lÙr\97q²Qï\89P5#\96Å0Ü\16£\1aÔ¦\88\96\8d¡Ê¬4Îtc;»w¾Oç\ 5©\16\1c¨A\94jbT0h\85¨2\a\81±¡Ò\16:¸Lhº\aY":J7ê8&Hµ\8c®'¢T\vÓ\·ÏP¥Éð§Û\88\89­S\98jÒ (\85½N\970Õm\&D\15JhH¸Ü\89È\8e"Lnd´\15O"(L5å\ euÚ¹VK\90j+³\881T\99ó\86?ÝyÍ4\f\8bPmZµ­ÃR%L5=ß®26«\81C\15\92a\bwbªµ(\93÷\8a\ 2   D¨ÖJÚÐl\15\17¤jM«dÀÛRA\99F\13¶ï¸\9bçÔ±tÎTû\ 6\9c³yðz²G0Tõ¨\e\8bÞÏ5©í\12v\1f¤J]©B2\900Ýï|w9\ 3\{.ÕÃFé:S=zHÎ\A³×ÀYªþ\9a.v/\14©ý¡ä\86ª'$¬æK¨\98\8a\99.M5päÉŨÌÌRõè\12*\8eP¤¶Æ4{ò\18äö@\82¡Ê\909\13\96ï÷½þ\1aRÕr¨î÷¾Ñæ²\8cã\80Cõ`\9aÛÏ'\8fÇ\9eSs8,Û\8cºEV³¡\ fÚQ¯c¾\1fV´¤loì¢ßÖrºUYìÛ©6ÚU\9c®ßò\ f\ 2Z\10\a\95"?§ß\83\92\f\\ 66\1fY8ß\9a­ºNñüíaaåoOóz*«
+=ÀJÈlÌÞ\14ýÖª'ò]ño§½6ze\1aÿ\ 1\9f^Y\1f\88~\9b\1e½ø·ýÌØqý\96Ë43\92\91\rúQ\91\9f[£Ê¨³t`¿\1d£;\eç·%rvQ[Ç:\99\9dÏ´R?^X\v=ÀJ¼ ¹Ø\8b~[Qô5@üÛfÐîúa\9aÀ\ 3]EÛ"\17ýv~Ìn£¢ß.Êz\7fîú-\9fi«EØÝ\16û9=¦\9cÃ$úm\otW\1f0M1X÷\v\9f+\812Ö$D¿\rùRý\91è·q½G¦{À4\1fÐËq»È·¦¨6ä".³¶c\ eηd1wð\9c¿\r¨\9d¼í\19-v#\84ïú\80ñ`¤ò÷6Z@;D\e\81³(ê*\96ðÛíÙd\rwL¬\14òo\ eiö¯{\99¦?Ê¡\15\1a\0ª¸­F[¡ó"lÔð³0 \82ù\0l*\8c\89÷cß±ÒâL°\97÷_¤à^¦G]YÕYºÓvн\9eæF\f(ýËø\8aÙ#Ð\14ºÙ\19\9a\94u\8dÒÆnõDËY\99\92&8vþ\10D43W\1f§\ 5\95,´?uÕª;Ù»\97Ñd®\84\19SH\84ª\19\81vPC\98ª±V\17¥J\9f)s\1dWO»\9d.c
+\89R\85gà@\8cêð\96ª±\0\eÂÖ´¿pCu¨T"Wª\8cmðCÕÀá0´\r\1aYÞQÅk¬\89{Kø\8eÉ.½(UÆ6\10¡J\9b\8c´mоR\85³¹\9bnK\94*Íä\83Q\9c\rD©Òd y0\15\9e®\13¨\1fQM¢¢T\19EãJ\95\91\ 2w\84¡¢Q¼{µ#Û\85>ó×ùeà\81úp%å¹öiµ¾\93\ 2"\8f\9a\91];TÍ<}Î4=¯¾³ÜðÓ³nú.¢\93·\89»Ø
+2(\7fãÌq\87Oû³\9cQ\16¼\9c½¯\99!vêÚ¸·Ø°x¶é¡x:û\ 5Ü[ܹýé\12cúpÛ¢ò93\ e·-Ò\bÒB¬\17\82¤\rW1u¦ï\ e\r\95Ú\9c)0Úñ\85ÂUë¤GDÏϵe\9fâ8«h\19è×LGAÅO\93¿Õ¦Ï>¶ÌÏÃAH&r;ánÜsñ@Ñ\83.eéO\94P×=\11\17\ 6±ZýY8ßÌ!«¼çá\8f\8b\8e\1e±6nR(\98\ 6
\8c\12\1aÖÂ\16ã\fëvL\9d\13J¯à\14¥G=Ú\e¿\eÇ\81Èp\1d\8aÎÖÉ\9fxÆxØ\9c\87Ï\1aý\ 23D\81è\fá»ù\99\88¾ÆË;,È\9e¿Cäg\86Äe¥       M\12êµ¥\aü\92þ\ e7Ì*=\e\1e\12ùõ 7\1dá\9f\87E»bVÚÓe\7fá\97CõÒúº.®ûC\9a]_\91æîuî\v²\9eVyê\97\ 5ý6÷õþº-þ\98õ\fÓDøu/\85\14j\87î¥\90AT
+12íá\e  5cû[\1eþ\fú\8e\87JV
+       ³¯\1db4\9b3\93EFD\85(¶9³O·\16f_M\ 5D\85¸èöd\1cx\82\93«É^\9fÜݱÆÌÏà)\17SÏØ\1dI(ÏW\11\82#       \92\9c\1dk7ó\1aeÕÊó\12àÉÔ\10M¦¼yiJ\82Â\86^A´ÅW½áïÏ~¼]î]\I\8f®\1a\14yUÔV×\93£Qf\10ç;\82_òF+~pO7¤ë²|n\17\ 1\12îM'µ7¡®\18Öß^\13\11ü\rØ\v\80\8fw\1f<={²êéá\vEtTIGÁ¦AÞ\qðÖ\ 6-&±PBè\95B¦Ý¾UØÐoõêÁæ/\10z\86?"\91¿@2¹\9f\f\8c\9dÍ1"86w¤\7f\10\9b¦W;:\964<í\8cÿZn\8cÂ\14É\7f-ÃÈ3íLª\14ZX¡\1fZô¤\92 M^\1f¦u\9cÆQô\98\82\86Ç\v/9\ 2Ù\12}]©\12\94\ 2ÃȽÔ\16àWjs=\8b\1f\8céè\89\8b\9f\9e\99üyDRt=zLâ\8aÞåõ±§§\84×h\93?Ö6\9eZ\ 4w¯q­x¨m¼ð\ e#ÙÕµ«ó\82~£·ÂZÂÀàö\94ÔÛý\ 1óêÀ~.\8bϽÕ\1e\e9¯LóVÛ{\9fi\9dý'\99v/Ý^\1cØ\96ã³éZö<ëöè>üRs¾¿¿¡G\14\152\18Åt]Á3[ï¯NÁ3\99v£}\voÏ£Gö¹íé¯îä¯\99ÓìÍ.ïmFá\8dKòÊ\1dÆ`\7f\9dA5\99RªmrÕ:¹\fr\1f~Nê§þ\ 6a\8d\11\ fÂûæù«r\1f\1e[\81\9c\91\\164\7f0Oä\81¤\91pµÎß±å\89\0¸\19ÉÙ\92&EάI\14ú¼\e/\98îìÝæ}üÒ5jHß:ôÕ7®pú¯\18\û¡\17(\88¸?h\15\11<Òl\ 4%\89ÈF\89=ÖEØ}#yXÈ/E\ 1Gt½×:*\1e\9fÔREAì*
+$û\ 5Äg\88JàúÙ«þ\94ñw
+ÄsÏ\aWÍ¿ñ\ eÎcðj°ò\89¥\15<êB­Cä*#î£í\ 4-#\11Ó\9dÞ\ 2S\83ÔUz¹ôzÄ/é\9b]Ô,bÍ(\9a_/nö;~ýlvæ\17\ 6¹m¡¹ßéqf6÷\9b]Ð8\7fî\8b¢\17¯L¢3å\91Ó!Îuär\87óÈ\91Ëu¦¬â÷ú½\88éüÜ\91KOîfC]\96ÀË\1e\958\8ctHIu\84\Í(î`â§û\93ú\17\8e\10z1ìôÌ\94Ø\0\18Þ+\93þ¾8§¬\88\93謧\89ùõVqxO\{ËI\ 4\19#Á;È\11
+"¾\1dÈ ³´\ 5}#Dï\\12Û;5Û{âªÙôb\10÷?^$´\ 4M\er:ÁU³_aßYOcF¤x<"©\8e\b\83§dA9ËâÖZ{éhLp´ä_î\e{\ e\7f<¹çË=q=\r¯çÍ/ÜØÛ\ 4÷ \14\9b\12{\85'¶âé\15t\7f\fþF\14xJ
+\13WOû%o:Oüû\17\ fÔÏ\1e\15Ssi\ 6qN¾gçÒ­\9a{\9eÍÍá\aï»ÐÛ \108/ú3)+Bt÷Ý.è\0="õkÞrþ¬«\ 5¡ã\8fs½*ù*\93îMÌK+ä¢=\e\1eb^ZØÛ\v»PØ ¢7\ fMæí+\ eæÍ=>\ 3¯7\85O;º76_\eÎå\86\9díèÝ­Èöòcq^{ù\91ЯtôúAxõ\v\bôvwÑøÚ±z\7fË\88²*\a\85Ý+£\ 1&"ö#×\13\ 1&ÌõçþæÑ~\94püÀÞôê×o
+E4\v\184JHâæ\8dbjßÝ\1fk\évXà<évXp¯\ 1%H7agJ\80æ\8dw÷®t+]¥Û\8f\89û\8a~Ïíí¹t»ú\ 5\9eÜAÁÞ~/Ý®Û3RÞ|@ºÑoNHº½.\ 5è\8e^\97n|/\aÛÑûÒ\röò\81[\¦£\a×I\94\1fû¹\ 5ÒÜh6w\9e°ÛS©¼ydgßÞ@
++.F*Ï\89ë¤\8d"\9eW\1d~öîUîÏy3Fwâ"I¢Æ\16 w|æ(´«ÏÎû×\84.Ý[\19¼$qá\8d\87\98Ðýe@Åý®.3\16÷½Áþ\eµ\85~s\9c\80)Qaó¼#i\8a¿h/¬Ï\86îèý¨
\17\11³\9b{\91ÿ¼£û;|\89ni¡«\b¦·O8¹ÙÃ\91\9e!ɨ\1c÷ç#ý±ê\1díÿf©ödùÃûFaµ"Õùuëå\10=\1f+/iÿO<·°·÷µÿæNèp|ùX\83oîu\ f\98À±\ 6;zGû¿éåçp|ãXc:\12Ðþ\85\9a¸"\1dI=\1f\1f\1f\8e¬°iîÞ>\1fï\ eÇ\ e÷Ê\99%C\7fü\91P'(\8a\ 4£¼.§ç]hÖ5´CT?èì\1f¼\96[nRR®ðªÕw\9cÜÜ;\ 2º·w÷ùÍÀ\ 4\93èî\aL\93¤        _Þ&CFÌd¢_¨ZÒ\8e\7fp\r\e YZ¾U\a\7f\13±Ç\19\93è²`£\86\9eî3îI\15P«xÇT@­\91f{J8©ôþêP4\ 2P<4NÌ/@\8fM/\8d\9b\126YÿðÁÐ^º7Ñ»\9f«kHj\1c\9bAîH$?âL¡\99fyMï\10      t\84o³£\96æ¹e{\13Ùöµ\87\91¾ì²`.\8b\99\95!iX\12\97\ 5o\93]\ eiv\13_\ f8·)µ\164<Îï\81Áí\1d&@µÎu\0Un\87\80ÊghC\ 4_H\bË÷Å&\9ay\1fÎw{¬ñ±|_\1cÐÒ¯á|\8f±|¬\84þ\0\9cO\94*\83åû\12\85\bç{\8cåûº\85\ 3ç{\8cå»W\aß\80ó=Æò}ÝA\17ß\80ó=Æò}=\80\ 4ç{\8cåûb \8b\1f\80ó=~îë\8cú~\eÎÇÛÁwX¾«áñ&\9cï1\96\8fÕÓ\9eÃùî\ 2 \1f Ý²hXH\13\7f\10y/\ e\ 4ÑH\18\93°\838ø<V\9c\90\ 6Ú
+s-é_\aÞ\ 6¹\8a±\80\13\83¸\11¼×\0^{}·7\85An\14ȯYå î\16-\a½úsîcR@i£ù¨üÌß¹)|ÔÛã(/i3d½\83Ï@|\92gÈqt     ì\eé\8c×¼>&AT\ 4\1cÖcG×£1      \81÷\98Ù¼\84ß\93$vB\9cø\92\9b¨¡×`\Ç\97âKÎñi\82!&¯»\9bÅ|Ílb³·Ý[5\15òxr?ÖÚ3ØÝ}Àå«®DvAÓ/þ]O3\v»\13»öá\98QÏ`wâFìãÛ\8a\19z\18brg¿>³RB\1c\1cÅ×\1d\80YZo÷\ 1^:þ\8dO_¿{
\94&¿zá\97,cv{\8a\19Ç}\83x¨æK ×/\ 6\85\97\92\88\81\ 3 ù%t1~ÕÓø¾¶g¾Æ\85uËñ¨Ð¿- \ 6èþæÒ+"ª\8e\89\82Ñn\15(.\1eí©:&\19Sxz\1ayÿ\ 2¦°ÿ\14\7f\83Üù¸Ä1râ \9cÇj¶@ä=ê\9a"bÃò
+aFÅßáóÈ{Éa     ÃȽ×Sð\1d~IÅ\14Z÷Ï09\8fV\ 4'$\1eöö1Ìêþzo"
+\8cy¥·ç\vÿ\ 5¦Ý»eßeÚSàªôi^¥Ûï\98vï/Öû«5Õ}\10U\94\13Îÿ%\0(\93¦æò\Å|;ìgÏçE|\9d\8f¡{\9c>D:XÈ8\87´@\1f]}[\a\9bîÃ}\1e\95`\ f^\8dÂ'öà$*Ù\1e\14ë\80\17     ù\8b>\9eåq¡ßõ×Oú\ fi¨½_½¥\8eVÂysQt\84·\a\ 4Û=÷F|ýÏC_6\84Ç\89Øy¼Õÿ\b­Ç\89\1d\91\f=¥ÇùY.ïF\9a\86i?ð \ 4Xð(\81ë·\17+b\vz\1e\17$`K\9d\15¨'X=\9e\0\12\87e\1d\ 5\ føßèi1©{ÿºñÅõ´yì5_\90\8f\17\9côkVM\9f¸$Îû\ 6\93°\ e^ôÞÜ\8déξ\81ÃÒ¿â)y0¦û]-áX{À*£Ô1=     \89\7f\ eÏ{4&^\96\115ÇoÌ¢>á½\89\9bwÃàh-Y.Á{s¹)|\ 2\10\92ÛÕÊw¼7·~\81øûÞ\eº\ 3ìQÈÈ\vx¸ßxo¾xÐÅ÷½7\10\ fÇñÞp\94[éXAãKÞ\eá;\82¸\ 4\80\904t\10D\vÒ\e\82\96\16"\b\8b\94\15éÄU\91~\10«.E\916xJ$"aE|=FHn\13\9f\89\8d\8d=\87\ 3DOÎ\8e=\8b \96\82\87ûeÔüÝy\ 3\91l⾨\17`l¼`\88/Aèâ3\88ßË\ 1º\ 2Á°\fÄObLàC\88ß\r\98\95£r¼\18v\92x\98_ëf\eßj\9d\ fÃ\ 1³üüªð3\89'ße6¢AO\9fAæ1d>\11¶÷\18\99÷à\16÷\93È<Á°ëìêÓȼw0\1e/ ó\1e\ 6Ã~\ e\99Ǹ»ßÜ\8a\12\90\8b\95çA\88o óîC­.?B?\8dÌûâæReÁy\9fFæÝ\H>?Ì~\8fÌ»¿ô\92\10Òù;d\1eÏZ\13»\17\82\98º\ f\0ÿá\91÷±ÐKº«ûÐKQ­SJèey#)ôò©\148,\fïª\ 6\ 1&æBZÀåó\8e¨§K@bGRP,¢½\9cõ4¦£\ f\0Êx±\11\8f\9fK7\88ó\13w ñã«¿nªù\88\84X£;\82\17b\8dî\9e¼\fÎf\14w\rUËïìÇ+þéÖýðî~¤{{\98\ 6GP¦\89îÇÚVê~|¤ªC\9e¿fS
+.·\ f¥:f:zm\e     \9b¸LG\1fÁe\ 65\12\8fµ§\1d\89ç;\16K\ 5&\16ØÍÏwü4\9dÛ½7\9bs\8bÛÅ)¾Ë\v¢à\1eg¤zjvÿølÆ:ÙoÃNnf-\965ù7~hØ[G\ 2¬U*H¶'ëKñ-<\81\1d~\ 6$ÛÜ}\b$\v\bH\16âÖÞ\aÉÂ^>\ 2\92\85\1dIKtͱ\9b\ 5c\a\99\8d"\9e
+öåø%\uY\ 2÷û±úö~ä\80òDdÚ§Ay,\8eàa¬Ð'@yÂïæã ¼7|\9d÷L{lâ¿b{¾\ 1Ê»õ§±¸¼ÿ\b(OÈýð\1f\0å\89øÓ$ZpµG\1aã­PøºÍ\ fý\b}5\15\r\8b\95\92ý\9e£§\ 5ÔOì&©qd°+\934'¤\ 4Ç3ìM<?ß«\9a\r/\85ò«7\13_7Pù\9aÄ; G\99\87iÁ.t\ 6Þ\90y\8eºæBü\9a¢     |¸gÅ\8fKUุîdXJ\8f\12"x~\ fL   Pwf\1aY\96{\9d 2<\85Â6¹·\1d.º³!¯æ\88Â\83 \ôXjL¹õ`=´÷ú¢æb<àW\ f\ 2\ 1¿&\ 1Ë.\14\97óI±¼\1fôÙ?u\8f\b\13B¿1fÔ\19\10\aÀYsöìí"»\87Ý9\ 6\99Ô­Óú\86ªiJ(\9c`ó%\ 6ö3Öª\8f`wC\8d(Um¸è\7f\böSdf©\9e\18Õî\ 3ª\11\95í\86*\17\11f'\ f·n;.ìÎX\9d&\7f\8a6r h2ì\11ìN§æPýº¯SèX\89\81ýÌ\b²3\9f\9ab°»Æ#ôÛê    ØoS,\8aRU&GÓ¡\18ÕÑ\93:\85¹ª8ÕPº\11\11å°|mptĨBå\96÷jé­{\9e8ó×y¹Û%>ç\10zîì~¸{ÔØLJêÒ\88gÙçÎ\87iÒ, ¢¦\7fÌ(wø´ä\9e±\8f\12â{ï\95[r}\9eÍÝ-SV¹ù\f¸HB0,×Á"^Ók'aL·wk\ f\86õ,\ eöYðÈÙÄýdy=¡\92+_\ 2\19`$ø¢\1e\95×{Ím×\bJ\8eÄ|\ 2Îd3\¾\10;ø¬²ÞãØAé«êIe=Ñ\19òîo\82\12
+­H\9d¡\84ê
+\92\19ÿ¬Æ
+7\eÜ\eEõ^Ø7\91\91x=&ÑÐZ©Uù\9e8\88\7f\ 3ìû¥ÏæU`\9f\90\95pqÛ}\10Ø'5\9fÍ\9bÀ>!/"oß¼\ fì\13Bõ}ý\16\88)\ eì\13\8b\ 4ø¿\ 3ì»cÌyó^o
+?\ 6ì\13êêëI2\93_\0û~{H¿\bì\13ºç¹\9e\9e\1f\ 3ö   ¡úîü\ 2\9f\ 1ö        ¡ú¤F\r½\0ì\13òÒ_LÜ\ f\ 2û\84Þ0ë þ(°OHå¹\8b\f°O\bÕ÷%\92Zÿ\r`\1f\7fLSä\81\ 2õ[`\9f\90ÚÊ0í³À>¡w(\14jõ&°\8fÛÕó
+Ì¿\ 2ö\89j\9d\9f\ 5ö½À´w\80}\9c®x7ì\1f\ 2öý\8ei/\ 3û\1e#½>\ 6ì\13A}\7f\1aØ'Ô\ 1$óa`\9fÐe\v7òþ\ 3À>!AÁ1q?\ 1ì{v±ò!`\9f\84óæ\13À>!vܨê\9f\ 2ö=\ 5\94}\ 6Ø'\84ê\13\ e\19\89~ÄFT]mÄ\e¦Íc¯å\9c\12¯iƯáÉ1£$£¯vO¶ý\1dÿ\8d\e1\95ã\8d*~¼1\1d\99k¢OWñ{ rHcÕ\91D_bÕ\95\ 1\97\10$úTÛ\90¸\ eî \11_"pl±aqÆ$U(üÜF=\18ÖýÝÖ¯ÆÄ0\8d\1eÖKuª\1f\8dI86C\Ø<`Õ\83:Õ"ò\939ÖîM&\8f.~à\98L\ 6¹mû¤"ücWÞϱö°þßÛÅÿ¾nrtIÔ×\7fSüOTØÜÕÿûíä~Ò¾}\89\ 1ʤaú$Å\<\89\87¾Öÿ{ï}EjÛ/)ev\1e:µ$\15ÿ{î\84\84¼y»øßE³y\ÿïíâ\7f_,
+ïIý?i×OÛÄ'rt\19<%Ýã\17ù\ 2Æ#ñ±ð§mâª\8e\v\85óH\9e\9c\v\97ºJů\89`Ù¾§\11\8eÏV)\ 4ôA\13û±ó^\12¦OJ\ 45$ó\fï(\1e\19"\19ì\bÉ<\bn|!H\r2HÔYÈYÐÒê\8dѤ\11\94\vi\82©`Egý%\94ÕJìÂ(\92\12_v\1fjE/­'1è\92C­è®\9eǧI\ eµ¢{\93\18Dþ8\92\9a\11\84\9f\ 1\7f\93\ 2k->Èz~Y\ 2\12;\92T\ 3\97ÛÀ±Â'¶"Ó\v\ ffÿ%\b`~\8e´gz\93\84ö\15­|ÁEû\16Ö|´oaýÁô\86°·\8fÔ}fW\1a=^)\82íö0\13åfQ\88\9bÂïæÖØ|\14µMðo\87!(\90\1f²ýØ`\17\8bÚ\1e\1d\16\9f\ 1Æüdv~]½àw\95<IÒ:¥@Hé/²â·ÍÒ¥@é¥âÞ¢Wx°\16ÝÛ:\ 6ÛËÃðÑ\17:úD\1a\ 3¶£w+|³½\6ãõô|©\18\11\a\14BñÚe1N
+ìDz\ 4\b\854çýÛuÿ¾.xO±Ò\7f¿Ø\8f\ 2ñ\1aÏeÚGêþ\89«êçÒ\7fo.·sÝ?    à\8bOÔý\93\10\89º\7f_?\ 5\ 4ßß\8f\ fêþ}Ýc£¤ S~S÷ïëQ]\Xúïõº\7f\92Ó·C\bÖûhßæîªü\88\9a¸\92ѾtoÏ\95\9f\1f\19Ú·¹û%Ú\97\aÄ4½ëm\82\94 Nûî6JbG¿\10¢</\aÓÑG\0¦)­DkíiGâø\\ e\90êG\81\12ÇRÁ*\82¯ ï\85\80Tw׫PVP¼ýhÇ\9e¼\f     n°¯K-<\89X*)@*ÔÕæZ«·Ç\9a\14,Õý4\9f8\¯]]ß\8d(\96Ê\8eI\82Ï?´î¯ÛÓ\8e\9eR\80T¨kÍUÌ\7fm{V_\ 2R\89\ 6'Áº\92\ f\ eß×4Æê×\19YüF\15\ 2\8eÆ(\90÷±ZcÉ|\ 4w\eP\8b'Ecì\9bWëô½T\f\93áæ\ 3=­ö¹¬Z5ö
+ïC¸Û\9ahV­_h6ýÃKÅ0\9f\15\10Ôü\12w{³Q\7fB;¾$À±\9fãné1I\87c?ÂÝ\9eÝEðe$-Â\ 4/:!ÄÞE]ÅàB\17ðkâ\95 2\8aCï`ÐC\16\8a®M\97\7f\fÔ0\m\86\87zÔ-\v²\a\11ã\11¾ñ9\9fÿºÃ\ 3¦=ù[ªwÈ<\9aÌ\ 1)ײ·\9e­ûÒtö@£&\82ÌÃÅñ\80ûS×®ãHh\ e$PK\88\ 1\11Í\88Ü\92Ç[bxÀ¦(U8\eYxk\10\9d®6\82ÔK¢TÑX_=\11+M\87_©~ý\0Ê®LÎ\9aô7Tï1r\aÔ¢¼VX4p@\978æi,\85¨Òd \93¹\95øî \81=.\10ñ\96à  gV\84ª\19Q\18ÓÁî\8dç\96\vÎë< \1a\91\9bÅ©FrH]\88ê\17S\vÏ\1a½\83zr©æ\1fUXL\94Å©\86B¥ð}à\18MX\ e\1f ~þ:£BO\84Ks¿\ 4D\9e3\ 4´¢Ï}Ýâ=µ]Âî\93Ð%iß\1c\83\93\9euÍÈUG\7f.{.®¡ûó4ðÀ¿üsòI\8cΤùjÂ\99ë¤[Í&(!@SÂqMwîâ\82«\9e;SÄaQüÀ-Ñ11\vZ|X\ 1)øªçàªÃק
+Ó0~àg\85i¤ú\9d\82\8f\ 3·D_ßE³¹\e\95\18·G\0@n"Í7àqO"AY>}ý\8f´UŹ8{u\86Ww7Ä\0¾\\82RdL¼\180Þ¾\91Ìø\97bÀh2\8f\86%î_~mLPt\8a\87\81\9d\8bÃå\88®PÓMÜß\84\87\ 4*ÆüÎÒ ;\8fIHïýÌsÛ\ e}*\13eM\ 5¸Âæ÷\88¨\87niÉ×DíÐ;)v¿®\bI^Þ»_Áî\84ï¿oC\14%A\12\7fç\91¾\8fRe \89ïf×\15Êw÷%\8a[{fÕðóÝ=0\90Düi÷¡(\ 2\97µ½ðK%\1e\1e\b\9bðÇ,é^\98'l~{\87ÎbÿÄ64{éõ¼¨ßÝظw\ 4Ï}|_L\9dBQ\ f\8c\8bHXX÷¯+)"\ 6;=¯ªø\1dãk\806~\1d\8f7*Õ=FS}½\84ô²½\94\8aáfL\üÍ0òÈçüTU¿\eÓ\rBàrõ}³\7f_Ä%.ä\12°¥_·9º\1eà\12\9fU\80\ eo.ò\87\91çP!É+\82S\ 6úK°ÌÎ\v½=+$\84ò ¿\ f\9c2o2í)\9aHú4ïo@ßeÚÓ\92B¯1-il\8aôÆC1\v©\8d\17¦ý\12\92(\15\8fø\f\7fó\1c¨& \8fø($^\ 2$Q*\1e\ fý
+$Q*\1eñ\1a\fû+H¢T<"ëîþ5$ñn½<°By1·¯A\12¥â\11\19¦ý\1e\92xeéc    òu\8fôz\15\92(\15\8fxµ¤\7f\ 5I\14\19\13\ f\8fxwïÉ\8e\88?¯÷\8b\15~I/R÷N±ÂÛÙü\a\8b\15òÝ\ fÿ\91b\85\8aÔ}¦Xá\19±òXmy¿Xá×ÿ(\ 4ôÅ\8f\17+ä»íþ#Å
+\ 5C\14?_¬ðKR}Ïw\8a\15Þ¹\1fà°Ì¢Ã:sé\19bY¼Úác`Ì\v\ 5\ f\1f»$\9eGÛI,x(-«ÕÛ\ 5\ fo&÷\89¬Vb\ 5\ f_\8c\81úmÁÃÇÕ\ e\85\9c\90¿*xøØ\85$b°¿^ðPx      >Îjõ\8b\82\87\12\16ô'
+\1e>\ e7¹:ºÞ,xø\14Pö!?ðÃj\87\97óæí\82\87\8f'ÇõrüºàáÝHxÕ\ eï|\9dï\14<|<%Á`Øß\14<\14\ 4G>Lß.\9d7\92Ñ»\17\7fÚÛ\ 5\ f\1fç-»Þ°¿YððáÉ\17`\8fµ\ f\14<|ìMþz)yÖ\83\82\87\8fíaá°ë_\14<\14Bm^·àïW\1a§àáã^\1e¹\1f^*xø¸\17æ\8eà\13\ 5\ f\1fßÇ\Ý\ fo\16<|\fæýâ\82d\7f[ðP@     ½©vxk­A©ñë\82\87\9cý¨½¯vx«Üþ\ 2\1d£ý)xø\1c\8bû\91\82\87\8f«\1dþ\7fµ]gW\eKÒþ~Ïá?H\ 6\8c\84`ÔÝÓ\93À`¢È`\93ml²\8cmrÚÝûåýíïSU\93$\r\98äÝs|EMO\87ꪧÒÌt&Я<ððñG¼sÎíë\ e<Ì^#+\92È,\99ò¼W.:\ e<|\9c\87âܾÁ\81\87\8fèÜí©ûÄÒ÷\9f\ f<|¼\97Ô\81\81\87O?§ðU\a\1e¦½\14ªÑ³_%é8ðð\91W.þühoó¹\a\1e>îæÓjÞäÀÃ\87ÌúfAAòe¯\91=Á×O\v\92\7fÒÇ?\1dxøxíºí±\84\97\1fxØÊðö\80ò%®zá\81\87\8f÷\92\7fÎæU\a\1e>ÔËS\8fß}â\81\87¯üÄDç\ 3 Ï;¢°ã%Ù×\1d\92\11ï8íP
++opàaú¾Ö£g¯¾úÀÃÇ\9d\9f\87$íÙ\a\1e>~Úa׫?7\15\1fxøÚìà\13\ f<|Ê»¸opàáã§\1dv=û\9cÂ\17½\1aÜ\ e\9d\9d\a\1e¾üUýÜi\87ùa^uàag
+:\7fÚa\8aÐ/ÕÇäÀÃÇ\9f\1ek7k/>ððñ\87¨Ú3P/>ð°`or§\1d>È´ç\1e\8a\g+Ó\9eÿâÕC±ç+\ e<Ì@¬è´Ã\97?¢Øvàá£b\91?üäu\a\1e>î1Æ!îë\ f<|ü%ÝÄH¿úÀÃÖe¶\9fvØé§=ù+\­\a\1e\1aÅ\9eÍ\1f¾ÂõÄ\ 3\ f\9fæÙ¼úÀÃünv\16\80\8aßXyÁ\81\87\8fÛ\8a\87\1f"\7fæ\81\87\8fÛ\8aØ\17¨\17\98\8b¯\8fùn+\eÅ\8f\91´\7f\11ë§|\1d²Ýz\82üpFøñçýÛ^¢l\11©TÒ²òÏèÈUþ-}IeÅcUZl¦s\99ñFÕW\9a~ÊÒå\96hu\91^ó¹¹1·?Ë03óåÚÎr\8fªo\9f\ 6Ò\8aÞê*÷,\8dÎ9ªrQ®\1fí\Y÷æç|côì{ôy£¿2x^í\9b¸\9eP³'ËãÝ×÷\13~ùÛÁ±\8b_ûc½^8<û~iåzÕ»>ýBçx\ 4\9ec\8f¥ƶ³àÜ\94½Å\19»?±zºññxmÉßú¹Þ\ö®7+Í\1f=[ãU;õûÝúêÂéÐÙ\87íËæÇÊÅõ^pÝ{3vá/\97·\96?öõ¸\95\19¿÷ÇÎÜ\õþg÷\8e½üÖ\1cJP\80ß6\1dÝX_Û,;µÝ±²9¹Þ¬}pûÆTcbaB5~\1cÍ«\19ÿýêÍÍ~T¹¹\r·æn»wýÃ[ïpçSúæçzm¤>¸å¸\8bÑ»ä\ 5¼ßõ\9bÛo\97t\ 2_Ô-î`\ 1\9c´¼ò:üuq/\1a?ú|Eawz@&\1d·y¿¯{ûÇÇ\16ç\8bøÅìÀ\82ïÞóÞ¸=å\a\97Ë/XV\ eú\9a\9fº7¿®\8fö\ÜÔ\eï\8d=¹ï>;.\1fÓ»­óÉëªåû\81+»L\ fÄ-]ð\e\92åñÆúz¯êi\1eK^àÓe«C\7fÕ¦FXܧÉÜû{Y\966·8@\\11'FýÞIzvpêk£¹ÍG\8cN~\9fYÝö\97'\8fß\8dÕï>Ì\8fÕo\8f\87\eQ÷é§é­1w\17\9c»\18\9d9ÛÜþ6>ë\97\ fÑÑæuÒ¯\9c/ZѵÓ\80^¬ü²;6¼X¾áu\8d\9f_²@\8f/lmíÕ¦7·gé\17ÖüéÌ¡W\89\a\1fõ¾Üph¥êw\15z¾aïNp¹î9}É/]á\9c3x\12\àÏ \9fßE\ 6öÌ]áÏ\91\ 1\ 1\9bî>\98µ\9d\eP&\9däÎF½1m\96Bô;«jS\ 3½÷\8dÊìÜ\9c\1eèûy>}tz\1d©úhPå©Òì¾ëþI=<ùë ®qa¤\96»pÐ39\82a\92k\93\83Ù53ñuãcra.\1dp!?à`ÏÜÏ\847ËU\80Çå©\9eY|w\90ÒjYc*EÌì:GéµÁ\G3WC\8ahõØmò\96\15½ét®gýE\17\1c\99\19t?n\94\ 1\8e\9fÆúÓ)îqº\ 6´Æ\0ñ©\1f1zs"I\10\13$\86\ 4z!n_\ 1û>­ÔéuÍ\ 1\1a\0ôiCóMnOt~\87?wÜúÒÚ©\8b{×kµÑî\ fÝtµ\86\11\9csUÿ²\981f?7Ì>8â\7f\1d\9cª\1f|x?trÑ·Ñø0m\7fç\0Sä{fûsÞë-
+\99Ìb\84y^L¶u\8aa^Ýoò®;÷[\9d\ f?GáLc¬¯¹>5w<RN\f\ 1\16¹­\93M^7ÙÞ\98êÙ^w,U_\ e\87\ 3\fs\17Å\ 2r¸2ÈÒ\1fËòáF=\96þÃm¥\ f\17çªøµ£Ó\ 4qýp×\8cFs\ 6\9bwxà&¿\8e\11ïôé*w9È.*þÜ®Ç÷\9eî¨ä×®N§s\bó·8ÊÓáÕ\9c\1e»¹k»ew¯±WÝY0ûK×½ñjNÏ}Öxw"tÃáænõÇäO¿±2q\16v\87¹\802=\91T\96\94þ\93\15V²c\90ï¶\9dtÔ£Xxîv\95\9eÑc\15ü:Ðɯc\93µ\83\8a\15Þý¶\1dÓñî61L£¿::\1cl\ e¾[jì/õFy·\89\11²È\84Çv\7f\ 2î]m:vC\12\9cÍ\99\89\9b\8fAßÐûKc1ÌôÖÄõ&°²\7fª\16yöC\82\9aW\1fqai~êþàÓ
+.\8c|lD=«Ç\93ßç»gG¯{Î\17Û¿¥\10kðüy¼Kà;¹|=\90ïùj\8ciµ¤Õæ5a C¨IRýí\96®ÖS`ý\86?\83\eÆJ~×\9aß\89nÁÊ5Ë\9dSôs\1dï«76\18?>Z¥\87Þá\98\rlÞ$û\16|\10ÏùÇÆÐNa
+øÇîØ·\18ÄÓ\7fè\ 2¡+ù}\vÕVL\e\88îèC\7f\vµ<\10/Ö(£°0(\908p2R\9f\9aÿp©\80¤\8dL@¾\ 3{NÏ&ÎÞ]4Ú\91\944\9d·\8fàÔ¡\a\ 6wjª>3V£Í[bo\ e@4\ 6½\99i°¢Tc1\9aY¬+ïpác\f¢4>@4ë<\11\90NñÉ\1eKÈK\10\83\88×\9e\8ct«  g[\\eY\9b>Vǽ\17S77#GïóÞ\vd\8e]\8e\ f\v[©{1k&×\ fmæu2\8dÎx^JúØïmëãæþðÓ5ü¤ð^\1cÈ÷_Í|Î\91\8e¿ËQ.\8f|¡ç+VïÈÿÜhùèÅâ-}-áS¾\ fï²ÑÖGÙ\9dÛÉ:Xk=ÇØcæ\92\b\bè5öúLõ|" g¸\ 2Sw¢ÈÍ­Æ´\83ëþ\98vú®f¾ß\1e\90\1f·(ï婬\9a?ÿ\91\ 2Ãô\8f\1f`Ïk\r\s\ 6Ù\9fêüü\ 5\ 3\95ì\14íÔáü\9eù\9aµá³\8de\9aç;ºð¥í»\1c\89\81á}Ø._Ö§Åû\99ø²\938wð      \ f{V¿A\ 1íLûiÞ\14\e$L»/Ó¨eᦽÝyO|*wÉw9¶ÙÓÍf\94\ f\85\ ea\12b>\8c¹µ\96óÕ÷\13&ØzÆ\ 4\9aÎiîÜ,úx\ 4\19iáÃÔíZÊ\87oy>Üﬤ|hû\16ËÀ\13\98à\8e}®Ð3·1\1f\ e>®t>ùN|\88G-ç·\ 5\ 3\13ä\98\ eV\81\89êBWvÜ»7ûÝy÷{ã       Â \8f÷\89,\a+§1\13̽Î3áhe)\13\86®ö#Åûä+\172ssò¹X Zúhï\80ß5o\95È®ìÓ,\7f\12\ 3N`íù\93ÈGÒ}òE\91W,D^}*P-aÚ\93\16B _\7fÖ\8etªg~G^"Ú\95ü\8eä;\10N¤zó\183*\197\1f^ÈÇ¡Ó\8b¤\83þ6¹"½É\98Q4\8f?s³\92É·\9a\9dZ;L?\83sÑÁ´ªx'ò]\9fõ\89t÷¿|oÛ ¬ÝË%-\8fÁ/\934X\b§¨\836I{¬\8fçë~§¤å\99ñ"IËs¢³\83\1e\95Ö\9cî?(%ù\ eÚ¥¤\8bÏ)LU÷%;RypG²\ eh5\8fõQ}\9c\19\7f\9eD\95\15?3k/YHõ!ÝoßR\16\81â\1d©f;ò|Ñâ\ e2ð Õ¼l!ù-ý£læ\\8e\96>Ò]}áBÚ\10\8c\99öL\1d©>AQË}Sß>Ç\1d\98ÛÝ\ e#ÝÿZEíÏd3\9b\84dn\1f\99G[\1f/´KyèìÏ\8bçKÄ¢ÿAÙl\85ÎÇLSÿk<\85\18\11yë¹\\97ßï\86æ³?Ý\9e¡É\ 5\898\9b¿\9bõ8\7f\90~ÎLâ\80÷¦&¡s.\81×ØÛãX.I©&9\9bµ+Ä\99\12SKòåô\9d÷K\8eKU\9cºÄÊÍ\83½Jüëw\93>D2+¹;zh\80bÙÙZüçPeP\86\99\1d\8c)\8b\ 3ñó]\12oÏ©,¦U³\87\9c\ 3êb?  ;\17úóáñdïaza\80/P\96C®mèãô\9a\93¿éd$\19pt17 ûqój"æÍÌ\10[yàl¥2\94ÐƲ\84ç.?\ f½;ô!¹ÖÈòz»|h¸ÄÏ\92¸\98YQ$Ð5y       (\ e\9d\11N\1fîö¦\19ÎÏ5ÉS\1e^irÂ?\ fæE Çô\8d\8dÒÏ\8e´:ò'\rý©è\rØ\e}4»Â\7fÆý\1e}ÝÑñÎ}iÔÒtä\0_5U\7f(e̺\93\ e£ª=¡2gk½Ó\ 3QuwlXmöäs<ûµø\8c\15If´æ;Ú\9eTC¿u\11ÐÖN1ÌkûU¹~u½ûöCmcøÆ\1fÝ°ËãÁ÷ã
+§:ÈHW¿®\95\93\ãN\96"Ûw{>|Ø\97\ 4^õþø4áÃÖ@.O95;B\99ö-Gø5õuN³¨\9a©£\15/þu¶AuÏø\8fû\9d]V@3]=Ø\8b\7f\99\13\8fú\90ØÞì}\1d£.¿:\1c\8f\9a½³E%÷îݯÆ\9dïW·ÓÜÊWÓ\92\1a2ûÃÇ¿Ók6\8d÷\ fs«Ùß*O\92Æ\ f\93\rX\9d8sNúÇ?\1dýX\9cZ\98+¯e%\8eôáôÉô\99¦÷­\9fiKj*\13nïý\3\19õ{\9d\17â¾7\e\92'sß\ fïxñ¯©\83_i;7n·y>Þ>\9d\95Éuò:\eSgï\8eÆW׿õM\1f\ e\8em%[»tÑZ5é\8b\ 1k<dGº\9a$ú>]ÆZµ}*\98\ 6ë½{+\18õëݧ÷\8cQ,Ð\15ç6\ 1\16G"®8ÏïYñ\7fâ¼\977TÓ³=¿  ñf\a²\8c!îؤZ¬Ãå]R^\87ÓâT} \a\90fë]í_µJ\1f9\9bU\ 5\v\94\9d¼\e½nÇ4IïµÂ\99Ð6´#й\80-\b6g'÷OÇ\8f[j*\8b*ÉÓ-è|)dâ\9aJ©'+\848\18áË%\17\96héßÆc3139 4ª\151ØÌÌI+â×oI)Î\ e6(\81´\9cï|öãª\e\8bÊøÿ\8d\13\84\91[
+\82@\95ê«÷gÍ\9b\95\9b_'¿.J\ 3]ÿ\fwýS\1f\9fÓzãâø²qÓl®7ÿw7uyt\7fÞ¼¸+\r\95êãk\93ss¡7Õ<º<n\96\ 6âzH\90Ë\9eÈTã\8ca¾bÝ\92JdI\9b\98ú\11Í\9cÎv¯\8e\1cLýP_Fs\89Fq:®Ö¯Ë\ 3?\7fÓç4ʵ#§·<°w¼S\1e0\8dµreöv\80þü"        \96ÖäfK¥\90\v ýÝSÍ\9b\89ûéÚÒâV\9b\92qb%Ú_\9f\19\91dxsu¬~{ò¡>;þuaêkcsm¬~§.%µ-\95Ê\96\a\ 4rEí\82"8<\90»÷åê\87e[\1e¬÷mR-\9c\9e\93,÷L\85õò@ul\8cÈóåÚçwË´Âeºð±<8î\1e\97\a\96¶gËý×Ý7\94E\fóE\89Çü\83Ì9\90½ùKþAæ\1cð#æOð\ f²ªÑ3\8a\94Y\85\92\8a¯\ f\15)ó©õá\93ñäÂJV&Ú\8d\81jf$«#îæ\87\86jåk¼»ùÑIÉ\0Äð춿ÕDݾßþ¾Ç\85U.&V\9fZ¤Ì*\94ò,Þ_*RfÅD*\8c?P¤L2øEÅÄ?Ö'Ûú\8bý\9e'wù\84ÒdQ]2q\16ß°4YT\97äGe߶4YT\97¤Õ¼qi²¨.\99×\9b7*M\16Õ%[Þgy\9bÒdQ]\92|Ò7.M\16Õ%å)\9c7-M\16Õ%åe\867-M\16Õ%¹\ù¶¥É¢º$\aYo[\9a,ªKÆÐù`iòýóK\93EuÉ\96§¥ß¦4YT\97Ìå@Þª4YT\97\94§pÞ´4YT\97\8c\1f\92{ËÒdQ]R\8a¯oZ\9a,*Éuµ|êäMJ\93EI²¶Ôþ[\94&\8bê\92ò\bÆ\9b\96&\8bê\92\94;|ãÒdQ]òuÉðÂÒd\91\93áoT\9a,ªK¾8\19þpi²Hµâdø[\96&\8bê\92/I\86ÿ¡4ù¤\8aõëK\93EuÉgV¬\9fR\9a,ªKæ\98öV¥É¢ºä+$íÏ\85°¬\83\87\95ºß^\97|\91¤=©\1a×ÒA§¤½º4YT\97,\92´W\96&ÿT±~£Òäë*ÖO.M\16miRæ\7fÃÒd\117\9fôlÄóJ\93E%AJ\1f¿qi²h\12\±~ÛÒdQ]òu\ fb\15\96&\8b&\91\19é7+M\16Õ%_\f\9d\ f\97&\8bì\92 À\9b\96&\8bê\92,iÏ*M>#õ\98å\1d%    ù\97R\8f\91\93\90\7f\98\aJþVê1Ë;f¯fü\85Ôc\96wd½ù[©Ç,OH\89®¿\96zÌúë\92o)ü\9dÔc\96\1aÁ_K=fyÇø\81ù¿\93zÌò\8eÙjþBê1Ë'vñÇAþRêQ^qÌù\ 2\92\ 1\8aÙ2òE\80\ 5â9Îîc\7f\92ë[»\8a\9b\1c\\13¦ð\9b\92½¹\95¾kÕÇ5@B&\86"\8e=©®\9f\a§¸\\87\98n¬ü\9dùK¯ë\ e0j\9bï÷\1fæ꿶ï\1c©-þ\1a\18ªq\8e\v\901=_ôñI÷ãæòBWü©\93ì\1fº¶\11ç\1fÛ\90\8c\rÄø\85\17M\8c\9dÅSÉì\rì\ 6i¥xAñj\92JeÛS\15Yr\ fÛ\17Jé[ÏlT´R\19×=gN,1mÙ\89Ó{=cIzqfE1PñS\9f\19BÎl\98¤\98vK\15ÉaÊSÏi½7}q\9c¯9\82Ü\vÒZóîþ\8a\9bx{\13Í\93_\17\8b\aÿ6\ 1`º$ÿWø?ý\eD%mÂ\92ñ<üá\11uñ°ë\9f
+·.éjiñ\ 2\9dìÕÇoî¦~\1dÝýº¼8¸ù·4Ä´í¥Å\8d¹©ÒPIZï¡õp©\829©=4Ç¥*\97;÷h¦{]ÿ¨Ò8ý³ýß®\7fîéÇ
+þq¢(Ð
+óp\ 2?òCü×\9aÐ\ 6.~¸¾Õ\81)\9dRS\99.îý\97þ\9aǯߠý·¤Ui©´ó]\95\8e»pq\15«S\9e\13\84¾.\rzÖwðÃ-\9d\135pðÓ%ªv\ 2\e\18 RÜÎ8&\8aÂÒ\7fÐÎD\8eRA(T?Pà\8d\r\1d?ô¨¡Á/cKÚÓ\8e\17©P(\91gt  Úª=ëØ\88\89\91cB\8c«#\ fk0Dr=GE~\0R\88±ü\88H¡ã©0¤[\8dÒ\8e1¡'³\8bt\14\95\8cR\8eïÚP\96AýjüW\a¡\ 1ÅÃ\84Mäñ¨¸Áµ6¦\ 6.\18§]ë\18׳DR\8eÑ`*\98¦]\83nT@TíhÏGC\13\18_HÖ¸Ì\82À:Ú\r¹\9duTà\9a\12±4\f=f\1eMßF¥\ 2.c2?h?=/p]\1fÛ§U\14XÚG\1d\89ðCá\7f®¦\rÕ®\ 6wi\14ã[ÇÃ,x\97\\1fTl9¨X>I$¦â\84\11 <ô\ 3ËÛ\84Uk\1dðí\11Ø\18¹¼Ma¤1#ðÞ \fÆ¡}Ò\1aS\ 3És|\ 5¶ò>¹\8eë21\ 2G|jç9ÆZð\ 1Lu¢À`\9f\92F®2NhT(w&ý¹\1aâ\1að¨ÉD\í;\81Ò¸\95öZ+&a"
+ýÒ½$)
+\1cF\8fÔ0 ¥uðàß\98\87OÑ        ÚP\13\f$#Ä\88çÂ\19\b /\ f\9bï»\98\90u\1d?"QB'N\88n\98\83\98O kÆÝ:\f\82\8bv=ð\92å\ 6\òHHhâ\9eo½Ò\99,Gù¦\8dØ9£³xAaàcc1\7f\ f\v\8a|^HèbÅ\8aD\11¿dE\16²lHÎ\8c!\9dóD( (\1ek\9b\8bû\15í\97!á²¢W\16ÂË+"ÁµDÄz=EB\1a`áÖ\93fÐ`¿\849\81\95\1e÷¥±KñÞD\ 1´\93õTG¤\11\18\ 4|Üj!$\9e\87\19k\9fð@Û\1c\89E\82¨´ÿYÃÎUüû,ÕÀ~D:\8c¨Kht\10\b\80¡û\10<\ 45À¾Z¬\99!\82ÅÑz\91\83\r\ 6£ð\e²NT\bR\b=7\ 6\f\ 1\18\11 ð\ 2á\ 3)\ 4
+\12¨Y\8fئy5@\rè>I\8aõ \v\11ÐÉh`\84Âe¾×õ\94\8f{q\a\84
+$¨$$\81ÕÊ\0L\94O\82G\13\8c\,Û`¿Ü\90\ 6\ 16\1cS%\92U¤á´8Ï\0¥x\P]awèX\e\19\f\ 2-r#\9a øa°E\98
+vÑ\rheØ0?
+ÜdóLàÒ¾\13?\ 2ln\ 1\a\93\1d\b\0,.ñÛu¡\ 1$\90\ 6-5m\ 5¤Áx"\87©nXH·     BÙ\ 1¬!ò=fN(\13Á\9dPj\82\ 1E²FÓÑ!/%\0ú[ì\18-\10\82\80Wca14\16\b\8aÅ\84T(\84\19\rÉ       =\82\18ÿâ{5ÐWÇ2\eÐlÈ^°ð²¬\ 3k`\93"¨,T\99H\16b\ 1Ý$æ\80\9d~¤Y)\bãÀ\e@\80ÒÚ\bpc\97\0Bï³:\11ÉÊ°\9a>\10áÚ\18á]\97,P\0 \88B+cX²{0.\18Ö\rÄ^j²°\89)´$!4eÏÇ.k\1f[fØÜ\1a¬\ 2¨Âà\82\1e=e"Ñ<(\a\1aB\8d­&¥Õ$
+dn±\89Fy¾4\8a\94'c\10z\87n$\1d\9aÀ§[\ 14ÚFro\10Ñ\ e\ 1Y#±zà²\ 2ÐÊü°b+\92äRßX\b\92õp±\81!4¦T \ 5bâÀéP\93yu\rPÎbM\90\8e\b²\15\12\1f\f,¼Gð\ f\85ÄU\13\92-\818\12Haç g¾\983 $ð\82Ô\89¶p\90Ô\80ü\90\9c\19\84\ 1LÄÒÃäF\86Ð\15ÊkÙJa÷­ï\13²»\ 1\98\v¸\86!'\12\r¦Z63µIÆ#dv     ¦\8c£\b¯\ 6Á;è\85õÙr\19LG\16ANÒ\91À¯\18`\17\13µ\ 1\93\ 1Ï\ 28°\û.±\9a @û¾8h.\14\88lO\84½\81X\97\01\10\1d²&VAÈ09x\1d\91ã\ 6\84è\16hÃÜ;\12\9ez$\95\90\GÁ\8b\82úCphw!t.á>ö\14èà       \84\818lä\8a\91\eÄB\10Aê©#F)È\ f´ÉBç4\f½\17\12ÓÙÕ\v<\19\11SÓaì×Ù\0CjXÿ\90gæY%\ 6Q\1c\13%µÐwñ\ 3h\9d\91^H2
+\83a\95ø¦\1e¹\ 6ìô\18%ºG×"\93h\15ûmì;Â\9b\fYY<\9fÑ\14;á+øj>ÉNd\ 4¥|\eÆ\ 2\ fvEÊ\17ÆE!é\99\8d\98\97ä2Xòk!W!­\8b$\9e!\9c\81\0\18ê\93\87\85Ý\16\8d\84\99 \9f\0\130\ 1Ï\ 4\9e\93Ë»
+QÄTEx ~\96µ" [\ 58\a^\84ÄX8\ ed\9d0\18\0     HL\14\1f@çÉ\84C2Ddíàï\0        !\ e!y\ 1\84 4$\94#*uÊ\91èç=\858ãWO÷£HjÈZ\0­a¯\83ØëH©Ð\18\15\92·\fÀ   4Ï\89\1c*h\16m±bXOI,\1dXk¨L¾a*ÝIg)!\19ó(¯\ 3\18\1cvÉ+åºÂè>©TnÌ\84t$qK<¹´a¶\82´»Î¥Æ^{\1c]1;ÀVÒ}´!$\fµ°#¥\92³ì\92´Pô\0÷V6ÎÀ\9fÃt\ 1â>!uJb~@Z|\15æ\e*²=¤³Yw\19)\19\97Y\92Qi÷°í¹îHq(XÊ\8d\9b\90\98\ 4Ó\86¹Å%Ýu®÷èY^8l\8ea\81\86\96\aÊÄìʨ\98DäI°Åò\8e%c\a\r\ 5j\ 4¨\11O;!ñ´aÜÉIÉ5\84\14\8bæºË\91âq\99Õ\19\15®\rE¯YoØ|7 W!\e6!ÅÜ\8aç\976Ì­"î­sµÂ¬\rÀi©R-moq\94\7f%h¥\ 2\15Ë<Ì?ó\850)$OÔ\ 5ühâ*¹\0Ð\b"Qx\ 5pH\9dy׸Bõ\ 3r\ 3\80Câ¹°ÌX      \974̨U¼}>\ 5-\12\88\04\10\1c\92ëA@A@LM\10mH\bé\93ýã\10\ 6\ 5\84ÿè\17.>ñʧÀ¹Ä~\8câè\8e<\ 68ûI\0  cÌ3F\14\ 4÷¡Ô¹X±\88\9a\ 1 \8c¡@ù"\1c9"pÞ"ø9\13*+\ 2\0\ e\ e\92\a\908\13\86\89Ñw\ 3²?è\81©°6\96\e\92\7f\85½b*\f\8aç2P\93¥\80\11 Ü\8f<\ 2yÆÈÐ\13'Ä'   ö\8cÜ®4y\12à\ 1\1cV-ãÀ!\92\9c\ 1æ\14\91ÅgÐegìLXî»<:\99\ 6(G\89H\81Ë\9c#\1fÌ\8d9\f\ fÇØ@ÖÉæ'w+H\1aQ\1a\93À\1cb\9dO\1e\9a\11Ý¥`?´\9e0.\8c\¹W\a~¼Ó\9eb§Ò\92×cãÍ7ÊM\8c\8eáÕ\81\b·!(unC²=~\8a¥¾¤BÎãy{<¶!ïÖ3ì½JÚ\86á\95\ 4\93\17\18\85U\86B\1eò\ 3Hne\92¬*\90/"a\12VîÅ^Ê$Ér»lB)åÄæ\17á*gR@"P$»\11°\93¦\85¤¼PÜ\ f\8a\0ái\89K\ 6Û)î5\ 21-¤\88]\12\9fÂùÀo»×'ç(\88\aá0\8e¹àËz1n`äÞ6Æ\88\9e'\86U!rÑâÖÁÿäð   \81\9er[#Y@\8a«x\ 6ðh£0\8ed\ra\94fX\86ø\87ì\ 2\ 3y}ÖvK\81\18T[c\_³\a\0RHñ4\83\94G\ e \11   \15H|àOù>ŧDb\16àvè\8cÏ\ 3D\82i1¬F.\9bR\97@\888\84\86â+óü8µ\87îlèÅ$Ø\86ø^È\99a\fÅøÊ\93éY«b\92\93ÎÅ
\8a\15ò+á\88zÕR}íîæ×ÅI©211~tt\7f¾zyw@m[s§´éÐk¶\1fF\12\92çBµ.\ 3*P\89ãi\92ÊP\v RLÃÒ\ 1Q°QLJ\ 2<¨I\8cÅ "\120\9cã\88h;\99¤\f9*D\82+&\ 3è\98\97 \86\1esØcOP³*¹¶\ 2Ø\fC4*bÇ\98D1Ý\91è\8cÏÑ\ e\11Ó°Í5Ì9\90 ô¦T°Ø?0SÁF¨è©Ì\14\13ÕâõP\fá\89\vî+W|@XSÎÚJnÕ°\9f\ fá5A\9c\82ð½Ø¾\12\ 6Ø\88ÂTاIº3¢ßÜ.I2RÆ\85\82H\89§µ\92\ 4`ë G2\13ÄT¾PC\8a\e)@Ð\1e¡+\85\ 3°ÜºàÖÉ?ñ\a\93ù\937ç÷O\ eì(t\v\15£»G\86\16{\v.BK \8e\96}\12 \95\ 2ÀYM\19j\15\1fx\f§\b\v\9cØhãn\ 4"%K\v\8fØ#F|\13yÐ^KÊë²âEVò\b`\9a\85\ 2N\85)Ä(\ 1\1c[Kyé\903s\1a.\ 2\10\88 7
+X\r²\ e-1\17áw:\ fJ\82\85p\9cK\14\ eY\9f\ 3#ê5V \9a\80ñ9AàR\ e\1c\80\ 3ÏIéZ\8a\89¢ÄÅ      £H\18H\99¢\90µ\92\927\94\ e\0\1c&!8%0È\17"\ 6\91a\94\96\1cÀE¦\85²1À\92Cq       þ¥\ e=IHðĽÀg\aÄ\8dL\1c\88\ 53:{N*Í\ 5Äjv©(\1d\96¤t]Ò"É\"\9a±\84\95\0\0ì¦ì«\12\13\8a\15\11T\87Ê\vdx8^h\18ZéG\92úT¹Ê$Ì\84\84\16\8cQ´`\84ü\91$ÂÙG"®I|o°O\10Z\91D,\8f\f\9d\ e\1c    Z³Ý&l\8f`\10\ 6Oü»\80-EÄ2\11ú\9c Ä\1a8ãJ÷¦\92m\ 3rGaU\vXð¬t      \8c
+\95\18\92º\ fy!$\14\11\f ¡\14VJ]$*\898W\83àÄ\87\ 42\ 4Kð"\89\8e *\94d5\9c¿`\14\v¥\92DÉ\Ø\ fö~c÷ÙHtÏûDÙ@¨\15Ö&\19\ f\82IËÀLÄPKö\83ð\11\91\96Ë\81\e'N(Ñà¡aÁB&_\12°[
+\8a¥\1fª¹@úDKR*v\8d \ 2f\11Þ»\8aë`\b\8eÃ\12í\9eïr.5!Ñô);¢\9f5¤ê\1fçéÒÞ2J2*Ý\9aR\89\95,\ 5Yo\9c}¦${6lJbüHæ\97R³E¤Ý\15¬¶#f'Ðãt'gH\11$\ 5\ 2¼)\151n¨à\0\92n\85Ê\ 4\89.ÒÜ8\ 4ÈH47\8aÔµÔA\93\86ØGc\ 2/ß]FJÆe\9e¤Te¥\97¬;¶\92\94lÌÆMIÌ\93d\82)5·\8c¤»\82õ>'fw£Ô®S\1dÏ\ fÙíÏS\ 3Î~\12"Z\97­,¹\85\94xÆ_À\ 66Å       \89f\1d\8c3siÃ\80ê\86äA§½å(ñ¨|kJU\88¨i?\92¾,&\84\18\r\9a\92\8e\ 4¯evYÃl        qg\9d+}(^'ë\a÷"\12\89çÊ7É\10ìsÀ%=NÛ³\8cb\82\9e«x±\10\r-Hm \96\8dæü¾/5\a\e\1f\16\18X)6>>\15\18+\18\84Ï\ 4|"Í·S\99\89"9\v/\80í;7´\12ºZ_\89;%eqÊÇ"\9aÁĤ¢\81ÉZðÒR±\83&ÆõtN"³\93`¤j\84ùp\1e¹T°f\81\7f\Ee̦,ê¹PUÈe\ 3,MQQ\9ek]R\14"ÓãkÎ^X\8aäÈK\0\15\ 1°Ä\1f\10EÑjø\a\r]©èÑ$i¯É(\80ª%R£[UH¥\13î\97Üb\1a_¼m"yÆÈ\ 2\ 3JBG\91P97Êó#øb\12ÇÙÖ\8fr¤ô^Py¢Lå'\ f\98  \\9c!RDU¹\ 2¾¼ .ta»T µ=JÐ\8b·Mò\8cU\86â3óS\15DÒ!+ ä\99\93ép[(¥J»­(ªu\ 5rB\84¿\9aëº\]\87ä\87¤\0^$í¸8J)\10å3ÌSoV*¸.IiR>\f<j¦Ä^Éì\14F Î¬åÚoDË\8e\ 4ûCò\ e¸ZJ\ 5\84\88L\1cf\a/7\90:_ày¤\82\1d\8b}Ó¸\90J«R³¥
+\ 5+̹PY¤¸h\ eO\15\12H\9b(ªãR\15\18ö\9d6\9d«! \191þ±#\10ø\3\ 3\95\8d=é"ö5.è¹T\ e"\12ß  \17\92ù&\9a\8al s!ç\80úr-c\0\1e\93àβÊ\10I\a±\eN²(P\eû\99´\ 4\81\84_p&J\ 5\eaáÓ¼\10\98\8cb^\911\e\89ëJ¤Ø8ÐÓ3\94â³Ií\8f\9d(\ 481ß­h7S½\88ï%øõâî\10ÀØÒ\17j\98Ró¾_ç\84\16;°~q"~ lúâ\98\1fÙ\1a¤÷Ý{?\1d\9c4×o\ e~\9dÑóa'·\aÿi\96\ e..\88GÍ+\*\9dÜ4oï.o\9a¥Û\9f\97ÿ%
\94ÞÐÛ;½Òèúçÿ\ 1V£qx\r
+endstream\rendobj\r23 0 obj\r<</Length 65536>>stream\r
+%AI12_CompressedDatax\9cì½k\8f\9cÙq&ø½\81þ\ fµ\1f\fHÆ°æÜ/Æb\80ªdÑ£YÊ\12$K#Á0\ 4\9aMÉ=æ¥ÁfK«ýõ\e\97\9c\92ÍnÉ\1eï¢ë\95ØU\91oƹÇ=âüÍÿñó_>¹ûâÝ¿¼z\92oÃÍç\9fýÍß\9cÞ¿zñáÝû¿»\11ðÍO^¿þæë\ fï\19ô£_üø&ÖÛÀoÝýdü\ eoþúÕû¯¿|÷öïø³¨\9f>ãïÿèþÕÛ\1fßüèÇ\føÇ/?¼~E _½ýÀ¿}ñ$þØÛ¢ï>}ñ\81>\1dÿ5þ×\14\19\7f\97ËÍÏ\7f*o¼xûÇ\17_\7fýåÿC\9fÇ\96Gfàý»oÞ~ñåÛ?Ü¿û¿é[éæI­ù¦Ì|ó$¥É/ü÷/\7fñêë³·n{KòjºM³Mz\9f~é¥È\97nK\r\9d¿ùôÝËoÞ¼zûáçïß½|õõקw¯ß½ÿúïnN\7f~ñöæ§/þ@\9f¼¸ùí«×¯ßýéæþõ\8b\97ÿFß¹ûIýݳ/_¿¢A¿yñá&ê\1cÜý$¦ßÝ\7fóåë/þá\9b7ÿò\8aæ#O\ 1çß     Ò_}MØ\b1ÿ.ðþ»\9f¼!Ð/_}ø@\9d¦6e&O?ýíÿµ÷\85f\ 1Ï\8fþé\17¯þð¥,\rÍà?ÿØ\90¿\7f÷Õ\9b\17ïÿ\8d\11Ü<\19\8e1ÛM\9dõ6\8d\90o\ 2ÞûÇWo¾zMÓ.³\93渭7OJ\8aô\9fý\ f{\99\86'/\86ÛPBÈS1Ï\«`\ e\95\9axB\1fö\1a§}iMå«?~ùêO\7f\ fïÞ¾Â|ݽÿðK]ÓBøô_|ô\8bo^¿zÿ«·_~ \11D\81M\9d±\9f¾ûâÕkêëBñìõ\v\99(yâú\17oüã\8b÷\7f\81v»×ß|\90\1d\15Z\94ç/þüêýÖÈϾzõö\1fßýZºú¤\8d~\13\ 1×\9b\98jºiq\12@ÚH\9dæ?Mo7®\7f\81\9dQ1"kB¶ÖÏiu\7föþË?|ùöï\9e\f\9aÀرî\7fÿþË/Ö²÷t3ô\1f\19ËíØþ?íÿè2MÀ\87\ f¯ÞÚ\18\9d~ºm pûÓ_rË\ fo¿8½{Ãkñµ\1c\1fÚ7oiS½~÷\a|ºþ\90Ï\bÅ7_a(\ 2ø\1d-ÝÏß\7fù\96\11\7fþÙ?ègãw?\7fý\r}ø÷ïß}óÕOÞþþÝç\9fýHiÆ?¾\7fñ\92Þ¼ùÙ¿ü¯W/?\10\r\0`ýöËo¾üðêöÅ\97_ýø[PÑ\bß¿ºÑOéëò'ý÷÷üßOùþÓW¿§c¹\10(ôáí\1f_½~÷Õ\86Ø!/Þ~qó?_¼ÿêS\90ÿüõ\8b·/ÞßÈ\a\8eûù\97\7f¤O^Ðd-ì\vöIhiÏ|E\13'_\92\9aøÈ\vÛG\9fÔÔ\8b\ fÿJ\84ìÕÛ/¾vìúçYç\15ø)(\7fùç7ÿòîõ\97_¿q\84\7fÿÄÞ}xõþíÏÞj7ß\7fóõ¿Þüã»w¯×Dè\vøh-òû\ fú\9dÿ4\8døË\8f5@\1fþçE~zñúõ\97\7fxÿâ«\7fýòåcø\1fùÜ\eºòÝOÚE/eÖ\1fkñø\917vù\8dÿ\1cíðDÿþË·_ÐW\84ê­\99{÷æ+\16Qn~ù¯/¾b0¿ùl{sá­¿#"½\13á'O>N\9ec¸¹\7f»¿ò÷ï_|ñ%1\0\92Á\9e½øâÕÍ\87w*¿\10þ3\0\9bû/>ÿì\9f>ÿ\8c¸e¸ù\9bßݿ׿6~G\12\ 5ý\1aäSæ1¿{ôÃû¯÷oEú Õ\9bǾã\1fñ7î\9f®A[¿¯\8cåïß¿zõö¿@"û/7?{ÿâí\1f\98\1eÿ\80\1aè6¶ÿ\93º\16B\f)d\92ijh¡\87\11\v÷á\14\9e\86\87ð,\920\1aS̱Ä\1a[ìqÄ\19ïâ}<ŧñ!>K!Å\94RN\85$\84\96\88\9f§\91fºK÷é\94\9e¦\87ô,\87\1csÊ9\97\sË\9d\ 4Ø\99ïò}>å§ù!?+¡Ä\92J.¥ÔÒJ/£ÌrWîË©<-\ fåÙç\9fÕPcM5×Rkmµ×A\ 2×]½¯§ú´>Ôg-´ØRË­´ÚZëm´ÙîÚ};µ§í¡=ë¡Ç\9ezî¥×Þ:õ±\8f>û]¿ï§þ´?ôg#\8c8ÒÈ£\8c:Hî\19$0\8e»q?Nãéx\18Ïf\98\99g\99$æÍ>Ç\9cónÞÏÓ|:\1f&õñ.ÜÅ»t\97ïÊ]½kwýnÜÍ»»»û»ÓÝÓ»\87»g÷á>Þ§û|_îë}»ï÷ã~ÞßÝßß\9fî\9fÞ?Ü?;\85S<¥S>\95S=µ\13õñ4Nótwº?\9dNOO\ f§gOÃÓø4=ÍOËÓú´=íOÇS\92\81þ\9b¬âý3Âñ@\98N÷üsG¸©óÔJ£Ö*µ\99©íD=\bwϨ7\ fÔ§\13õí\9ez8©§\83úÛ¨ß\95z\9fi\14$JÑhÂ|Fc{ \11\9eh¤÷4ÞIã\1e4úF³@\8b\91h^â\fã\19ÍÒ\ 3ÍÕ\89\9b%\84\93f\90&\99æ²Ò\9c\16ÖYh~ió\8cÐ\9fÑ\8c?м\9fhþïi\15&½È?\8dV\87\96\9fÖ\89¤KzB{F«÷@kx¢µ¤\ eÒª\ eZÝNk\[ùü3ZïLëNÛ²\85ú\8cv\ 2M\fí\89{\1e\bí\90A;¥Ó~©´o
\9e\886yyF»\8a&\91ö×=í³;\1aÈàfKûü3z\91\7f2íÇHû2äg´CiÊi¯ÞÓ\9e½£\9d;h\awÚÇ\95ö3ÿ$ÚÝt|Ò3Úë´<´ëïi÷ßÑ\19\18r\1a¨\83t2
+\9d\90Lç$Òy        ñ\19\9d\1cZL:C÷t\96îd\15£\90\9a\bR\13dY?vоÏ1£\ 1~ä }\9fcF\8bð\91\83ö}\8eÙç\9f}ì }\9fcFÇc;hvd\9e%<ùêS®>õò!\8cú[»òô«Ïxü!\8c4%W\9f»«Ïýµ\870\9e®>O¯>\ fW\1f\9aÍgÛ\8fÌí¶\8bi\9a\9fN¢S\9dèU¥#\97é\80ħ\81Z{ \9av"ÚvG4n\9c:Q¼J\94/\13\ 5\8c§ ÔLi\99R2¥cBÅh1\8d\8a)\rS
+¦ô\vÔ\v\94\96R-£YJ±\94^)µ¢Ó\aj¥´*\v\9dR*¥4Ê(\94Ò'¥NJ\9b\8c2)]\12ªÄ\14\89\ eÅ¢HJ\8f\94\1a)-\ 2%\ 2\1dR*¤4¨  ý\ 1õ\ 1í\11Êóùg <Fw\84ê\80æ(Å\11zã´F(\rè\8cR\99IÄ·\13©¬ÄÉs¤>\12_\ fá\19ñxZ\10â÷4iÄûi`L"\99 \91\\10tAo£\9e\98Ë\9fë;Ã\9eë»\8a$\1cüv}OÚsuGû#;\9f0^?\15w\1f9Kö<~\ 6\8fÏõslÏ5
\ faäÿ>BAÎ\9eëÔÇ\1eÐ)Âx\9d\86\19\95K\8f\9cÍ\1fd¿\1fd¿\1fd¿\1fd¿\1fd¿\1fd¿ÿD²ßUé\8f\163o\94ìHÇL\ 2\80G)ð\82\86\v2ßçôkìôë£ÔË$C\95\r©\8f*\1f\9eQ0\95\12w\1a¦²âNÃv*¶è\18m\ 5¡dLËTzdj¶èÙ¢hLÓT\96\ 6º\ 6\99\92é\1aS6¦mL
+\94¾-
+Ç4Ψ\1cÓ9£tM¨\1dÓ;£xLó\8cê=\13ÊG´\8fh\1dS?¦\7f÷N\ 3§ÐA\96J»PB¦\85L\r\v("ÓD¦\8aQ)£ÐF¦\8eü\10FPÉ\93PÊ{¥\96"ÇN\91e\87ȳúÈ\14\92\8cREºÕGº\19\81\9eä\98(\12/ɼú\90ä«Ï\ 3\9e§þ\9cðÜûsçÏô\87è\19í÷\81§oO;<õð\94³'\1f\1fÂ\98CºòÄOx.~DÊû\96\9f¿\Êÿ\88\9cïRþ§Iú\9f ï\13Æ\vÉÿ\13\9f\940~¢>ð  \8fÐuÂøízÂwÒ\1c 7|ÛóízÅ%×úKt\90ÃC\18¿ã7\96\16óøóQÝæ{=ß\13cºþlòÄ_éù\14\8cçü\96\9d\13·£ÞÐ9voü¥\87âê\epSÜözülÐÛ±ïî\8a\18\86ÈÎùº¿ÐÊáû\8f¾ ß~´w¥\7fK÷K¿Úû\1c>Úó\1c>ÒëX¿¥×ôÂ\95^§qóÑ9\97Ï¿£\9bççß¼ÿêõ«\9b_\10àÅkvï\1c\ 1\847\9d»uT¹Wõ^\15|UñUÉ¿\17&÷T\98ß3á\1eQXe\86¯*\7f\17F;E\1f¹\136|\12Æü\0½$\b\7fMÂÎ\vô\93&,\7f@K¹\13\91à\ 4]åAÄnêÔç\9f       \87N"V\14Ñ\ª\88\e\1dúË\14qä^´\98\93\88)\ f¬Ë\886\13\84Ç'Ñh²\887$\19\91XÓD·é"þLÑpîD(:\89\9eÃ\9aÎ\83\88ðAô\9d(:O\12\91ª\88æSEÐj¢<ªè5E\ fº\13]\88µ¡\93\88\13=@ä\ f¢\eE\95pDb\92n\b"ýéò\fèLS\f\14w"\14²öt\12\rê©hQ\ fP\17T\92PéF&³Ë´\88\8a\Dج\8aT\f\1a]´­!\1a×\14­ëN4/}Nò<\95ç\ 1\8f)\1f*½@\9a\1aI\1fR×E\ 2\14á·\88¾¦OÃÓý±\9féÏ\1d\9e{\7fHÆ'\8c'y\9eúóàÏÆ:ç&_͸=éðÐÖ Á=ûSÎ\9ezñ´G\9e~|\b£ý>>áù\84\1fÂxøë¿}\1f£Û·\99ݪ\98\19.,\ 2\8fØ\ 4έ\ 2»ùí`\17 s´l\ 3»u`Ù\a\96\85Àl\ 4ËJ`v\ 2³\14ÐÎ\97]\7fçÖ\ 2³\17\ 4ìî\8c=Ý°\93§[\ eNسϰO\13,\b$i`?vì?Ûs'ì.ÛM\11;ÆöEó\15\9e°.°}á4\89\10\8bºøLì\fAt\r¶5dQ)«X\1c\9a\1c,¶:°ÝáN\94Ï\93X\1f\9e\8a\99Ø \82h+I\\15\11E\fqU\ e|\17»\ 4\e\0Ù\ 4x'Ö ¶O°\85â©\18ò\1e\85\ e\12Å0ȦA~hÔb"¬b&ä\87§H\8f\96\fâ$Ýad'ýy*Ï\83<ªè\9b\96#Dü)õ\91íVO\85¼>-x\94Ä\81(=\ 5éð£;ñÜá¹÷G\1a#\8c§§ëça{\96Q!lO<<éì¡múùg\ fùð\94G\9fúé\ fa\\7fµídþU\7f~Àø\ 3Æ\1f0þ%\18\7f8\99?`ü\ 1ã\7fF\8cê¶:\8f\8b\96ôê\96ocíó,Îñ\91\17T\85n\88êgÜ9®_®X1>éõï¨`ÿò\9b¯8êôÝï?h\14èͯ¿üÃÛW\1f>H,åõ\ f©Åì±¢·iÿ'n>½«\9fè×nìÿ\1e=ÚnCOó¦ö[6ÞocÿöwuJÏÞ»m5¦Ryòãíh!ßôyÛ{ü\bêë_y¼\85Y\1f\8f½õ\1d\97èWoß¾xóê\8b\9b?\0tÃ)T\8fA\1f³\86ü\10èðÿÑ@\aÑ1N¢K<\13}!\89\ e@\92\86\83\94¶;R\9aN¤`<<°O\92\96S<»Eü±]ü¨ì\17=\897óÙ\166aZVØ´-{ÒáÉ\87§lOµ\87Ʋô²¶égö\8cÃ3\ fÏÝöÜÛC\18\97&w:ht»^÷°ëwîÐÝüYÐõè!ÝL´¾Ã\93·§\1c\9ezxÚö\98NH+xÐ\r\8f\1aâ®%\9eë\8a®/âñ\1fÂx®7>\1c\1cÒá\13µG×\17¡?^×\16]\ 3\14_×Sñ?Ý\89÷§\8b\88ý?>\v\ fÏh\8f=¥É¾§=7iïuÚ\83\95°ej/>\ 4êß\ 3õýDc»cç·ÌÎ_-ô\91\1dßt\ 6ÿ\8a¡\8fìêþü³¿fè#»²\89\96ý\15C\1fÙ\1dýùg\7fÍÐGv\ 2\13Oø¤ÐÇs!çÂ\85ðq\a\83r¸¨ÒÊ5§Ì\95\8fÿRÞ\98Ê£Ì\91À\87ô\96Û|Lp¹ÍÒ\95G\18ùÙ\a*\ 3déöùT\1cÁ\7fñHÚã#i<\92|äóú³»Ä\8fNô3\87û\85Cþà®'\8cê9¹|ú\95g\y`Ô&\8cóÊs÷   ÏýåC\18\1f\81nÏé»>\84ñão<ý®\ faüÎßù\ 1ã\7f\ 6\8c\17^\8b]\86^R4äh\97¤U\96Þ=\18*Q«L}BxϹ\ fѼ\88uó"\9a\1fñèI<\89è\ 2o¢û\13\ 3<\8a ^Eõ+ªg±"\98       \8e4up¹\vé\ eÏ=\1e\11ó\bãÉE£%NìA\82\8bpÄíI\87'¯çóÏÜ_¹ÿÔG\9evåéÇ\870\1e!ã;<\17\8e3~Äûó\97>wûC\18ïþºÏÿ\1f0n'+Ñ\ 6jt\9aîè\1c=Р  J´\89\1a\9d\98;:)|B"mè*'áNvþ3ÙåEv3ï]Þ¥¼\17y¯©\17¼Ë\1a\88néz¥i\95®S~ªFI\9ad9xçvßܹg®B·ìð
+\9b\ 4\9f¯øå8ìÒýºæ¿5?íî\9fcýS}tðÒÉó`\9e:øê\ 2\82ÖY7Õ'»ç\8e\1f8ðÅ\83×Ü\8f×áͳgn\ fý\10Æõs\7fxN\17ÏÓG\9f\87ãC\18÷¿¿CØÚ5ÖNbÕ·0ÿïúü\ac\8cßç\91\14°\8f~þ½½\ 6\1f\r®$\8c\9f\12\82ù\1d\9e¿\18ãE\90(a¼\16>ú=\9f\1f\80q}¾Yýã\99Þ\18Hýf»|\1a\93ø
+[\8fg\8a­\88q\9e\18H\17ã/}ð\88\9d¿
+­ZÔÑ\98oJÝ\95é\rêïÝ\12\923%õ\1cþ\97j©9<ª¥\12øÜ\1aý¿U+0ê(\12ù<Jåjív{wÚ¤ñîRøý\8aäÛ­Þ$-·O·|[/`»T# þ¨õóNìcSldCì§M,eU¬®YìeI,µÁ\93F\1exùÄz¦ö³;\11\1c,\19n¥ÃYBÜâ\14ÿ^tý\13\99/í6\904ÔÄ­5kà\82e·$cåÒå@¤ÙÌïÓoi\ 5ÊÁðò\9d¿ªf\9cO:\81ý{\9fÝþ×3kåÇ}>\ 4>7\ 6ýo=fÿÑ\18m+\97O2¨n¹äfR\8dÈèY\99\8c\92ÇóùggY<\96Ãs=\83Çsxð\9c\ eY<÷´×W6ÏÝ!«çò\19\1f\7fÜ\99\83\90»-Üî2Ôî<Ðî2Ìî\18hw\19j·»q.]7÷ÛsþCëspÝ\sâ|ÒãdëÓØú\7f\9c8úï\8añ@&ÿÃÎ÷\81]~jJî'¸\83é¤~\e[|êìð\ e\8cp±ÁÅ\ 4\17\vÔ,ð\95\a¾2Á;\9d\10c\7fåß\81ý}\92\18ùýØÜ-        r\8fq\9dïúÕOfs\92\9f\91oiA\a\7f÷;1º³ï¢ÍOéjJ\97>\94ïøÅ¿\94±Öú(c%ðY94Ú1\a\97ãîtÜÝ\8e»ã1]T
+¸Û+\ 5H8w\11\9b¬¸ Ý  inÈÇrmÓ#\99¶æ\94äD\8bÇrmÅA\89\8a\ 1ê¢\5\ 3\80U7@\1d\96\92kK'ö\99ø\8e¿c¶í\96k{\96mK"óe¾m½\96oëüù\ 1\9eûÓâÒÈ·\1d\12\98r\9eq{ίÓGùõYÆ­$þÌG²nÛG²n\ fy·çY·âz}¶ùð\8dÖ.\aÓ²\10íίCîí\9eyK\18?-ûö2ÿö"\ 3W'ú#¼õSiâGÃç¾ýçPÝãz@À·ÕBº\b     @Rʸr:\9f\8apsYÅ#\8b\81÷<\a^Î¥\ 4\1a}{\r\ f\v\16Ðp\81ö±ü÷Ï?C\ 6ü<Tòx,ûýa«ç±*zØi¬v\1aÅñ\92¶Ê\1eç§ñ±Ì÷ÇΡg¾ÓI{pYù<ï}\HÌßv\ 6éüÑI»r\ 6\1fÍzßO_}ôôYÆû_1ç}Ëxÿ+å¼KÆ{þ\v³Þãñä|¿\93¶QuÛI;m7ên{jÑø\ 4â\17\ e{\8bÖ\13®Ã\93Sü{¸\19ça¯íu\16\1580Ó¾óÄÅ\19<\ 3øá\8c\17\1c÷á\9dçË\8dm?\1a_À®¤]\\ e\15\19lw\9aV\17}\19\9e\1dxÅ¥vwÚ´»K½nélý¬jþ\8bëæEµ½L;ĹÉÎQ¶}½íìgg¼åá Í\9f\a8\9cû#î®ð\9bK®sv\ 26\ eôX°È9\17ºÆ\8b\13âçâQþô}´¾O\96ó¿ÃÉù\1e'íjÐø£Åt¯d©·ªÁV\1ch\ 4±»ÝÎ\10ÚY<ÖÇÞû\16yù;V\e\96rÿZU^ke\93\88ýüÅ\1f¾yû\82¥jüÆ\16ª[:\råf\94ÛX[æÿv.Có7¿ûFû\1c1ìßüYÿþ\1fôûÿ"è\9fnÊÍOoþé\9fÃÍ\17\9f3ü7¿ÐÏ\81ï\8dþ¥èn\9eó_Ç&\8e0|ëù\ 1\87üõVA?³Þp\7fþMÌåáæ§ÔrI·¡\8fx\93iJ'Í£4\1c\13é!\894 tK¢À¼\99¤»\90
+D\7f\960Òͯù\9dN\8a\13_\1a@=è\81ÃÝ\fÃo\ 5\ 3õ¡\95x\93Âm\8d\83\96iÞF"¼¬Må<æÍy³'þÒïù\1fû¤öÛJgôØ¡\12ôCt(ÏÛ\16f9t¨ÄÛÜ#\ fÓ0\1c:Tú-Ѫá\1dªÔÁLÓyÞìe\87\87þ4j´÷lýi\8dT:Räöþ´q[;k{\86àÐ\9d^n\89\98zo:õ®\84tsÖæêÌõT\89\7f\87}5k¹Í!\f\1ao£.îZÍ2os«É\97ó|}¤ÓµÞ\12cI¾¨=Ò,´æ\8bzÞúê¶}rXTë\97-*úuXTë\97­êù2\1dúekký²µ=oý²_ûÚZ·lmÑ­ÃÚZ·lqÏÖëÐ+,±uÊ\96ø¬é}\89·ú\12²ª)Þ\ 6\1eGη\95\16LwàÔÞ\ 1\16ûí`\9bEN\845åõ7\96â¥|\aÀ4n[¢õ2\1c\89F\1a¨KÖ\8eý-_J´kx:ü¥Bã \1e\1a\12ûûÐ\92\ 3Ñ\1dC\82Þ\9e\rè¥\8fÝ>h·\99d\8bãH\ 1³AЬVÎ\10²\81*Í;\8c\96Äw\9e\0AðvÃqhÁ\a\81ox÷7¤\ 6C»ö]ôê¬ã\8f\8c\88øÖHg\8bg@ëp¥mERÜú\e\eö0*ÚW\83\14<\1f\16ï×IçÅZ²¿\ f\970
+Câ\7fï-9\10Ýñ±¢»çcº\1cíè·s¤r\1c­\ 1m £Ý\92
+Ø×ßz\12\ e\83\1dù6¤\91}°#R?é\14zCøû0X\7f     ã0$þ÷Ö\90ÃÐ\19Ç\81Î\9e\8fh\8d\95\13ÞbO\87\88L\91^k0\9aÀ\99êðcà\7fïgÅ\80\f\87\1d8kçp*[!ZΧÏ^¢\8d\17\98\14\e\12ü}hÉ\81è\8e!AoÏ\ 6t9ÒýTZ/\ 1³Aàtø@·\ 3d0\9c1C\10¼Ýp\1cZðAØ7¬û\eR\83¡]û.zuÖñGF´\9fJ\1f\12\80Öa;\ 6þ÷~V\1c\88\ 3eHìÀYK\87SiÝô\970
+Gb\7fï-9\10Ýñ±¢»çcº\1cíáTZG\rh\ 3±\83à\7fo\87Åa8P\8e\ 3\aÎ\eÚO¥õÓ_Â8\1c\89ý½5ä0tÆq ³ç#Zcý\16\ 1é(`\93Ø5HCg\81¦\87"ü($f\88Äò{\1eÊë3÷\8b  P\89\9b\0\ 24ÂééÐÑïD\91éë­ðåZ4MÌ\7f\82J\0ÞèÆä\8f"\9au\84$\98\19\8e\94AbOÙûQÚm\8b¡<. YGH¢J­4ïHæDR\89\ e¸\14ÍÂQ(³\9eôz\eC®Þ\13ú»ö\9aö®ô|;b¨\8fËdÖ\15\92¢J+ûB+ÙJn\9bx¾we\13zÎ&Z:×ù~¶Ø|½¤\93L*÷õê$¨5å\8f²bg:\92ô®Ó\16\99Ìx±btðB¨ÓWì¬ñKeà°zÖ-[=ëÖ¾zÖ+[¿sYùÐ-[?ë\96­ßwÔ\9a¬_¶\96Ö¯ÃZZÇl5Ï\85åCÇl5­c¶\9a×µ§_}þÙ\ 3´i¾\94Muéï­\92\ fýLî)r\?ú\87W\7fò\e­â\8f?\ f7wlUøÍ\9f>ÿì\eþeWÁ\1fWÀUý~B\14\86\16¯÷ÀÓg\7fñÝ\87©\8a\84\rã·e\12¿½\ e§o??ࢿÞrÃ?ûÜï\rú7¹Íè§\9fÛ[,dÔÑöfYÇê%mè\ak6×á@±µ½\81~¿ \996åÈco\8b¶×\98­^à¼
+\a\8aç\97XW[tÞç¬Ü\rÒ\ e\9b
+HGx¢½3ËåH®Á\81çù\15ü\8f4MÄ«å4.\9a&\ 1\14/\av\r\ e<çMoð\8b¦Ih\995^6\1d\1azÙÄ58ð\4½à\17\13^éØÓo\17\13NL´>6±×àÀs1á\v~Ñ4QýQËeÓý6çGZ¸\ 2\ 6\96\8b\86\17\9c\1aþÛoØøøt}w`ÏÆR/\a\8by$z<b[ðVcù\18¼RKå²o\1f\81\87\14\ fgHûy\1d¾áé¬\ 6\85\8f¹\9f¥]â¹\ 6_óð{&H:\7fcÞÆTëö=\9d¿1hWÎy\81o\83\1fúµá¹\ 6_x~o\1f\r\92õ¶¯`éØxÓâåÔ.ø±K\vÏ5øÂ\83¦Ù^TÊå¨;q·y9\8b\eü8º\85ç\1aübÔ,à\96tÙ4±æ9\1e\19Å\82\1f\9bXx®Á/\9a¦ã>s»l\9a\18?µsÙô\82\1f\9bXx®Á/\9aÎôb~dÂÓ-§"]6½àÇ&\16\9e\8b¦YB\89ã²iRaZO\97M/ø±\89\85ç\1aü¢iÒI8Âè¼éNÚ\14Éa\97\87\8fM,<×àçM\13*ö­_6=nÙïyÙô\82\1féÍÂs\r~Þô$á³´|Ñ4ÁS       ý¢é\r~<ï\vÏ5ø¡é¿%\89óW\10\16IÀ<\8a\8a\9f$B¦¿\\84\84s\\88\91Éè=)P"<^\87\ 3Ãó\v\9c*N:ó»&W\92\ 6\r\81\94o\ 2/5£3$±Ïf\12\87üÆ@¢.QlÓ$ÑL>A\fdêU1ÁqdQç\19>Y³k&ô\85É/wbxY\9a#àL³\v°Ü\96\9a\9ar\1dñ5(\ 6Ò?f¯ íDZôeZݤë\99H#á+Р\98o\13_M-½mì\98\0\ 6\9eµ\ 1Y¡ô(\18Ú¸\r\17¹b¦¬C»\98\87\97\aÎG£\8c5NmAt\18Ì\13\13Zh\15Ýa\e\9d\8cL\14 ícÐ73\9bîI\9bD\1f\93Ê\fDÆØ\ 2¡£LÍ\ 4\ 3®\r\ 4\f£\18Ñï½\16Ã\90Øð\85I\8d\93ú®ÓÏ{\ 1â9\7fMG1ñ¦/\13\17\91R¤¬Ñ\85\82\85&ɱ¨üXo\1e\1dÿK?FJÌkÖ9e\9d\94Îç\e£´\1cp¤ð\98ia^;\9cç\87\95ïLLãµ\91\95Y*dÍ9¨\ 3¯¯`\7fí\94\8b6b     Ü@$!\91D\16£\4\98ĺ,íÍÛÎ\ e\95çö~\ fª\98ÑFªÑ¶O\8eâV# ôÒ¶ªìßH\9c\8a1\9f\89\8cDmqÆ1\rsºÍU[ì<\8c¼àEO\12á)KP&x¨!+<Æf;§\85!áÅN1\ 3\18
+l\91\93ín\eã8\8c\91Nl\90#Âð¾$g\12\89f\1e\8a\87N\\ð\14\84¤\12<Ó  ·ýCJ\v\80lêV`jÅ\80ܽ\93a\b¹ó\\91VV\98Ü>·ÓÁQ_\86Ù\95\a\82\13=á¾bsâU\8eº\ 1HÌÔ\ 2¬-Ù\1aÐ÷I8\8dº!\96j@à4'Ôß\14\83-\roÞÒª¢¡é6zI{¿\17Ý\874Û-g£\ 4)c½B)\13@\9aw\0W7èûYä\bÚÇ¡·´ð\96&d'ò\8e\8eÞ?Ú\8aQ\8eUd\83Hj\vN´½aÿ±R\v
+\1c'6%-¢\ 1«Ò®Øn\13\9boO\86\88%Ïe:fj'\84¨pñØ:<f\1d$\8f\82eõ^Ê&\ e\1a\96H\8fØTZÔ\88øfí\1d­Q       NN\b^\ 3\10´¬4»Å[ÎX\ap¤fÀÒìÍ\9a³a ø¬8Ñ%wk®µ\8aÃ%k\f`1`f£ÔK\9fÎÙ1sb\99Ð\11s\98\13¶b\ e\11¬\80\ e¿``§wÞ\bj\10¡\8eÀ5öf<Fe\18^\ f%ÈD;gK:\8b\81N¦}\9fv\v\1f\93½l\a\8a\84îØ\v\80\0Xjð£Ý\8cÔ\13|!(Ux\ 2Áı®@â4Ø\10\85\ eÛâ\9d¶ðÔ\1a»È\14\18ÊĪ'ö.+¥\ 4\a£qÍ\19½\vD­B¢Y È£\14w×VZ\13FN|O¤.W\ fSQÕ\¨J_êaU1\86\98
+\rH\86I@\92Ò\92\ 2k\9br(Y1TÌ,\8e0é:Y\8b¡
+á!F\95\98yº^\13rJ``¹ÚÉ$<5Ûûe\11oÖþZ\80!\85d\189ô¤BÆZaðI$u\ 1Hj%\80²QO¦y¥\1a`5ÚÇXµ_j5\1aq×OiRT\96J3/0\8dÓ\8cF\98\12\ 6\b³5\87U\83µd\94\98½'iÂ\185\16!à×c\87ØÌ\85²¶n(á x-z°\18\18\12Ä{1Ç+°@\9e£ÍSû°\16³\922\15¼³ÛB\98Å·
+x%Ö±ZL-A\93\92\10\a\87Ç\98Ýö\10\1aÖ}æ\98 \1a¶4\ 1ì\90öºRÆ\93\89   3¨ÔÂÒJÎk        B®\86$\8eµæ9Ëág±©·±vå\0úÁû9ÞØ\16\96\82+\13÷'¢¸·Ydò\bW¯k+´$ô\87Þ\1d8!
+\1fAÅç©A?®ÿ'&Á\ 2ïk¯\12\r`jÛ»D¾¨\80À\9e®\91\0\9d\14\bvZHT(ÝÄ_\86«ù\87ál\rQ m7Á\904\9a\bo&¡C\ 2\8cma\90óÉ\86û©2\0\1fr\9e,A*ÑMvòE\17e`\89&ÂÓ´\85\11 \ 4ÔáÛ«\15U\é86e(¤§ÅPÌ\14Æ<î¥éo z|bG0\1a±Éû¤\80c5fl0#ÂEh`±30¸ëéá\95k*îw;Q\ 4«âÂbX(~¢ºÉu\fÎ#âÝ¢º7\ 1\vN\b#\b\11@áLÞ\ 3Ú¹<\8d¤#Ⱥ+\90\ e\0\14\a£8â§T\ 1x*mu2×G1ídÙ</       ®ÓâÚ]Ë\19\1aº ´¸¦\8d\16·\dE*\13Õ\0r9\93
\fì\ 5Ú^mÕ\8e\99\84K5Ðâ¢ÊM\19N\8dX+«       @\ eäU\12Å©K@P¦±!±fËA/MåFm\8cÄd\0i\95ëFÌ\80\80\ eLU\7fBpñQ\9cä\15³O\1cJöõå,\9cl\82Hz\98Ý\960Åi*Kó£`îBÈ@)g\95ô$\94K1Ðf\85ø\97{_"Ðôw%"A\11ÐTT\88¦\13R%Qþ Ë\87m|r\fEÔ´ÄY`ɤ\1dñS
\11\95/\92°4æD\17$\1cîdr\1cø%c\ e\90\91«\94\15\17Ú
+ÚV£Mà'÷rz\ç\12q5áð\b\ 3\7fcbv\v\19¦ÿ\18\\8f \8a$\9b¿hl\8e¾\19ñ&)<mX\9bÔR
+\98z\12\13\13Þ\15\97\91è\16\f\1c\91\86\12ø\1aª\93a Á&}\99I½.¨\1d\92xk¢#í¬\á\10\93£êß\17\9f\85\f!Ðf¾yt¼\7fÞNY«ÂViöÄÔýÆà\9ck££®,\192\90m\f\8a\82 Û\96z\83\1eo{¼VÆW\0o:\17\ñ9\9a\9e5sè\86\16»%«ì\ f\f\ 4W[\v¿<tÃT\96]'fS\94^\ 5ÊùV s\92\97\86!us¶\11\97\87z\94t\91Jé8gp4$v\;ñ½\9c\1fßE4ðª¢\e\93`ÒFlêØ\f\91áX\12­\96\81Ñ\bTªBs~mĬæ\ 2°QÖJ§J\8d\17\ 4Ì6sÙ7\ 1a\1d®C3\u\bFÌA+\8aÖFS4TT\81\8d\ 2«oZ¡;)*\|s
+$\9dßN\15ë\12\7f¾2è5\1fÑ\94\ 6"U¢[¿1rk\9da>ÒA\9am\9bw\95æ\94¬J4\0\ 3\17¥\ 5§M,L¨ÖÂ_\1eºÚÔ·¡'\92\80%M\18Å\84þ9±'±Ç¹\1f\b\96
+0\90\9a\92\ 1\18C®Áè\b\r+q\91r\ 1Ëî|t¬¿uâBÜ¥6 \11\89ï\8dÁ\e[§d\97\9b\8d¦Nï\1d\8b      \98{:{½Á8 î8\f\85µ\8dV\14.V\0Å ¶\17\ 1\8aاÀ\1a\ 3|ã©O\13\ 5\18®2;½,¦\1fEK\ 4\14Æ)³¾\11\90¤êb@×,+8\ 2àÅøH\bör\80\90$áYÂei\1ezt\93æåü,[\18íì)ËR\98íå¾layÈÊм\8bÝð\89è¸1\88dV³K\97=\98XÃ@Ò1M\17d\ 1 \ 3^@JØüT\e\8f\85èGÙ\12\14\85\80r\90Ú\V3:gAØ\0\1d\81ÙõTss]_&ÂÊ"\9b\ 2£n\18\ 2ÒÛsà+UY\93î¦þ\ 6\88Ã,ÍÀrw1\ fÎôY¯\ eB\82ER\1ecy\96H\1\95"¨f<\8aZÉDÖ&i±\ 2ØÔ\96Ä\92î\922\8bÙÖ
+\v²x\97sÂ'\84õ\1eã\ 40³-[\80c\9d4\82O=\81ܵ\ e9\93xf\88\0\8aé\ fý\8aBËXX÷ÃÎ^-\80\83[³Øé\13E\ 6+j){"^ÞÐe{s_ã²·_LÎëmÞèèB\8e\1fam­áÆk6\9b©~Æ·\ 5\94\ 2\93ò4\91ÝÍ£ôæä7_ÚÌÇÙà\10\13õè\89zÕB5çOI\ 6$N\ fÅqã\94\83\r}0¦È~¶\94aþÎ6\19\89Å4(\88Ý7\16Ûè\ 6\1a£\93<o\1e\1d°óüÞu3\10¦¶\87¬Ð°K\93¹(mi[|\s×½(¼J{\8c-^Ø®áV\1f\86«\14ÍòtP\13Ñ\10ë/\80âWƲv1Ç\17\9c\1cÇ\10ÔRÎð©æ7\ 2j\18\1ccH¬\93\86îcbèÍé\v¿\Ä\8dËi\12¶t±\v\13/$(d\18¥ÙU£\e\9eÝ>Å\rO\17³³o"PÊ2UþñM\94ÔâGpð#ö06!µ5)yúµ½\v\99»F\95¦\14\bí\83ØU\87pÍXUÁªAw\80/w\9dJ¶ÂòKMó\833k\82Ù\85½\96j½®\9cV2Ü«Ä¢v\9fFt\94\91ôn,\8d\93>Øàöç+\83>Ðkµ»W\ e(\8aæS¢¯@\93!j+SkxÄìF@Ûå|\92S\ 6U%\9e\80;£V$\96Nº2*~9ËV¬Ù\15$BÛ¦ò\86¬óâ\ 6H\11\r\ 4.\91\88\8a\ 11\15\95­àÉ`)¢©ÝyGû\0d<±QÃ)óqÄ¿ÝNU­S6)\vÇ®\8eÑN\1f*^\11<w;ÜÄxd\ 1\8ak7LW\9b\98®ùøÕ°Ù§r\10Òλ\17\94=+§\16\ 43\ 2Hý,JþØÊ^ÚB\0e\85á!\19\15\17\ 5\9a÷F\80\15\aEÔ½\97\86a$±æ2\86      s\ 5\ e,é*ê,ä(³I£\15\víË+³£»è\eùß\13\8d9Iæ\8a`;¿\87¨\90ÒÛ\14l    ¿«\92ld\ 3\97î\ e¶SÎ\0g\92HZ˪\96Tvk\ 5\ f¬cSÅTO\ 4ÿVÌJF$\ eª¯Ð\f\ 5ƦÞ\176oõ±\19fz\86\8e*qª
+¬eÀ\853Ùþ\8cQ\84\ 11Ͻ/l\ 4RË*ëpQÉ\12\ 3Õ\f˪ÌT\1d\94­P\10ÝÙf»Úï\90L³±ÆÑÝ\83\94Å\14§3\0þ@\ 2¾¨_n\18")\ 3ZBv\13Ðh2\ 1¬\ 2ÇlÝ\87ì#ÊK_ícm\12\8bJ\18?±¶Ø!Z'x\83\a\9böUåjj\94÷\1e\94:L¼\87O\83íUai«>.°C\ 2\8eè®c6 M\9d\ 3Y%´\96Ô1ùMaeo\14^¬Ù\1dOl\99jfN\92\b\ 5\ 5\82é\89\8d)\9aÝ\10Æ\1c\8e\1doîïaÌêôe'\80½\M±Ë\y\al\93¶(\8c><Ýnl\85ÆÎ\9e\ 1¸¬Ø\ 2\9eU\10f@À\12Ì©-\vâ\1d\bm\9aí\1f\8e\19\16óº½ìh\8b\89n\fduc\19\9e[GLB5\16]ÌN\9a\81è\16DÈË\90º\9dB\101\80­-³¸\ 1ÊUÅâÃ.\82Þ\8cÌE %à\88yÉQÄ\8a`@\13vªÌ|¨í\84\80fæä\19Ñ\88¥¬ràK#´Y]QÒßlì¡vóv$S\1d\8a\9eL\ 1\8aûþdü,ö\80H\ 6\190îÀ?:\8bÊör(&,á\9cf8Í!\14©õ\94'w®ã\139\ 4\ 5/7#mY\ 5Z\1d\ 4\9b)0¹j±`×\f\vä.³\9b\19\11±ÄXce#Ü\87âhå\80jg\99Ý-Þ¢V=\86Ã\ÄÜ©Ëîg ó\16âvÃ`y®I\aW\17¸î\1cæɪêÒ6ë#\9b\9b\88A\90ê¹Mz@Äß2Ý\1e\81|n}ÒS.À\H|2\115Øþ\17ó\16ÄÀd'H\9c\8dk\9bÁ\15Åpߨ¶ÿédÍh\13Iª,Ú\12ï\99\1f7H\939j
+\ 1\8e¶Òâ,\9aµ\1d eÒì\bdâä§M|­jüoÎÑS´\97%"\17\9d\85n\11ÔÓï['7#%h\8d'½¨\9f\8e=\18º!{1òÈó¸<<|\ 2Ü^.Ê\87\ 1ã\ e\\93®r\ 5÷bÂÒÏ*Zé
+4/·èBÓ¨\1e\vêN\1dRµÙ1Û\açA©,Å@\ 4î0áS½ ÁN½\88l\13\8f\1e;\16`\b\12Ö^áU\88É\16"«"Lt¾o^>¦f\ 1>\f\18QY½­\1dÞ\8a\98\93\ 1ͦ=\95b,½¢fô \95b.mhͼjÐóØ!\8dÈݨâ\89\18/t\85\98é8pnÀE^f\86k\99´JÛÔ1O\ep\9f.L\8e\ eÎ6V\14\ 1\8f\ efÄáîv\9e\1e=\85Ì\eK5ç\97y\fX\19Kyc®°\88õýe3D.\83\1a{\ 6{\ 1\1eo\9eD®[\86\97\9d\85Äa®+Q©µ³u\fð÷:Ê:­DZ\11\13ïj\rlvê4\82õ\8emDµar3\9f[\9ft\98\86ù¨À>*Àî@\92\81|ÒÁIyí±B¢ËGØ/e¿hÇ\10ßÀ\ 6ÌZò"É0M°\1dÙ\ 4H\9a\1d\15\8aY&2´l-\880\13\8b\84àR\15âÙØ\82o¼¸\9b±\8b\ 6\8dJ¼¦\ 3\9e             'òI¯0®\16×\93ؾ£ò5\e\95ë0^Lº   Újc1\16ö±\15Øîju\ 2#dE''\15Ûë\9ajÅÓ\1e\98¹ù´[\94kX±\1eÅ}Ð\0þÑtµ^+v0\1dÃ\88i'N\aA2&ÛêÄØmÎX]\\8c°TLO\1dÁ\84Î\b\17iÖEÆì\8ehi9+Ð\92\85N¸·\92æzBÀÕ8\1c\ 2\86¸<ÅÊ    Ù}\10÷­.Ù%ê¹iÍY@Ó9[FJæ6\9a¤@@\11E׬CJ7q\80#HÕ$Æ3\83 \98l!7L\8e[Þ¦<æ\ e¡uN\ f\8e\89y$;+$,ø\94C.J 4:å0F²«Ë\84Öäû\94E°´\19\fc\1dðÎl\82~R\83!+:-\98NqTí4òòW\9f\7f6o~ôã\9bßüO×\ 1©Õ,l"6ak\1e°\ fs\1cÇ\12Õ²\18nD0\91lâ'ߢ\ 3F\84\ 2í: \8bîÂ÷#~Cs\1aß\11ù á\b3ÑJ\88pÛBW\99n!\b\929T5\16\12²\ 5\ 2¼<bp$\ 3yßØc\15\fsF\1f¢Æ²\b°ÍàÔ_Ū\b}Ëe0Ø\ f#oy³¯\89\8c¥s\86`\14\ e¸O  /J\9eãÉìA°UI\ 4\95
+\9d\9d£H\ 6\ 2°Ì\9cK@$\1eðȲ\að\8e-.ËV¨{\80\0Ç_%\83!|)"ÃrÙ{ÔÊËQ`\9cé\f:¯Î\11Æ\9aÕ\ fÍ¡i\9aa\83=âáb`£\1c_\a\8bV5U<"ÎE\81EÝÅ´E6IX«\97 \16/v5u3S      \ 3Ý¥\ eX´7\9dd\18\ e\84½¿4ûþð\97}\163[ö\10×X\ 2Nuöù\1eê\1aq\ f\ 1\8c\9fÜ7\1càd®\9c8üDq¨n.ØçRúÅãþV@í0\8fFr\ 3Èbj\9c\81\1a\1c\ fP\17\11\89\1c\ 2\85é\99]I\9edÅFÇ\90\rH¬×0d×ã:"\ 1Ô\19\14\94]2PÃ\1f\13\1e"\ 6Ö     ×\95\10²\85¡\98]$\a\10Ý\86 $Ô\ 5T]'%\15æ\1dÃTã7SXX\9194¹Y|En\1eé^\83Iu\12\1cãóУÙ\15Ä@ðÚà|Ã\8fr%¡þ\98´®¤;;-" \88LÒ·M,ëÑy+ëà>Á\88\eg\97J2÷TB°íÔxì\85`F\98£LSà.Ì\ 2;\99Åwôè6\8f°[\14y\10ÍÂ3Z\82àzä@t¯s\87Ö Ì.\8d¸ú\804\bækî\8fSo\1aÇ[\18Ê^Mh\8f\83wd´LGb3ãæ\12\18]&K\1et@t34ÛÓ$\16"+Vbö\0T_\ e\14ú:\150\18\bS*örÂ\1c\8a\11OAÈ/âhè²\ 5ÓrÄ\ eN«íþì<ML\90\80Yàõd\vT\Ç\9aæ\18ðaÆìlº;o~\93¦Ø¬«»\ e:\9c\93\161Mé>7Z,V\83a\13^-è?ø~N\8b¾:Á\10íÇIKVW\84$\9c.Ù kê¤Ê°Ó3TjÈó(É0uë\15~æ¾Y{=
+\9b\18\96ý¡6Û¹\87î殼o(izéB{ñT\84>LS\82eQ\98¸\vHqD`\10Ul\91ób2Ǧk\rµ¤³ózd\13J\9bZwy!²«ù,¬"ó#-Õ\83MS\13!v\1e\95lrÛT
+ïSn
+ç4ˤÀâ\ 6ó       ß´§ÒMuï-\18ý@þ\ 2\ f\17\91xQu'g\7f¶õ9\17Âl(\15ÁÝÃ\9d\fì\9aÑh\1df^\ZÄ]§ör×8s\ 5Ò<\83\81Zü0[\ 3@\96\86*¦îp\81ü+I\ep±s´g7ѯEcá¹vtVÒ5\16\ f\87\86\1dÕô¢sCZ\0\14-\8b\90`¦XÌ\14[Çæ£\ f±ACa²õÚVÒV\82úØ5l\8cå\b\15èX\11\85Å,ÀiéÞ\v\84üÊ        \ 6_í¶\98\9c\9a\90\869íàÉc1\82Ѻ\84\848`\16W\e(<g\15V\88\84#\83+J\80¤I-\1c\84æBZÐà̸4wö\ 5\ e£c\b\17c¿¡\1a[\98ê\976× òP7@\
+\ 6Ç\a\19\11i\13¾Ë¤qQjéÎu\93OJ
+0δ9\8d\ 6ØÖ\ 3ð\8f\9a-&Ó0Ì     Ø5\9eXg½¨\9aÅsÖ\8d\1d\11ßvªÇ\ 5\80&H\86ÉolbÕ5\8eÝ·Ù\88\96m\16±\vÝfS5RH²\10Ì\99<\95\eÄÍ5\9f,ÒS¶ÿØÜÑE]<¼Ù\87\99\e\97àãVíà\19\17s\8fBä%\86Ò\1cUßÄÉÔh\944´ê\f¨n7[_Ø\1c\99Ù#Ǧ:ò\r\18\1d¸\98¥'\ 4í2δ=É\94ÄT\7f\96§\ 6\ eÛ¶QÙÌ\ 5©}j}%\9d\1e¸#xÒ-\ eä\[»Tëöß÷2\ 6\92þÙи\bsªé\95à\11N\80?7¸\1dVd=0\92iz\1a3\1fØeò4ã,\8b\899Û:0|Z$ 9+9¯s\9aÊn\96Ü<ì¬K,¡#\18º(Ê\82\95\fq\ fÆ0ñS'»\ 4wHEu\ 1é2raG\18\8cÊíÊc*lC°\90
+\ e\84P¢Þ\17|Ep\99\9cÇH`z\b¦7\94Äëß!\10²­\ 5ýÈæDg\93\ 4\12v×N\85\8az\vh2Ç/ûC9\12Ïß\8e1\80öA\88eÇnIÆ\04\16ªxÆgD*\ 2zQt\e      IÞò\82Ù\9b],\ 6O\94\a\87çÜ 1\89ÉÄápÒG\ 4\810°jè\97\ 2\11&\ªk®C\9d`è      \9b\ 6\ 2\1c\9eâ\12{np\98²\ 5î¹\86\84G\92`\14\ f3\13\7f¿lp\9d\11>\17\1d$»À¼PºEjðPØ
+\89\8et\17i«Ê¹Ï\rÞ²Ù¼DÝtx\9f\9e<Éaf\80{\ e!/\8dÅ6"¿R#½\832
+\8eÝI&\92m1Ä\12Þ^a*\94\\88ç\ 6GôÑÙ^\9dZf     \fg\ 3C\ 4KÁf\84#V\0´Xh\8ey\89^ÜgÅ\831<EXĤðª"æ\b\17ȧEËZ-x5i4Í1\16\"zõH"!\8b#o\87\85\f\9b\99\95\83\ 3ÕÃÊ\12\b\97E@O\92ù\0\19\832"\ eE\9cÉô%ø®ëR'AÀ\80 X Ý\91°qlìôè]dóÊf\9fÆQ!yæéVh(\ 3''lÃÅÄ¡Ñþ\92¶c\86Ë\8aô;N\12\89ð^÷\ 5\18ðççð¬5"\0ïv\92.àâý\16¸\99¾9Ò-i<AñHÛÜÍ>&%yü\bl-\ 2\13v\96\8fºµØÆ|\f\8e\f!\ e7\80\970wMËP)\10Éø\9cZ\9eÌ\f*\8e\91\8b\9e\0\93¡ñEÏ\8d;ôM\95Úá³\98\ 6lÎX^²\10\ 5R\850.cÿ%¦Ë\9e\18ü¼'\19qdÏ}?¸ßÿ\f®1\1c9zé\ 3I\ 53߶٬e,«LÔ#sbð\8b\9ed\raõ±'\r²>\83w³)HV\8dfÊð>At%\ 2Q\15hoÖÃ\9e/\1e\eY/ªJ\18\88\ eÏ=Å\8fÁ\9b¦õ^à¹\ 6ç\f?\87\13ÿE Ð\19<\99­1¯L`f´q\1a°&ã\93H·0\fÎ\14\ 6¼ZGÌâ¾%­\10|ÏI\ 1ïuÐ9\8eð\e¥]`fÊ£éÄGÌ\95#g=îtªÖÈá\83ÑâNMYb²Úmt\12\9b\7f±O\0¿Ø'¨§ñÜ\88+2±Ïàl\f±ª\10\9e\82R¶4Æ\91\11Á^=,\16\18´'­ªéû\1có\82s\98êªÁÖª\89\99\9c 0ÔÔD@DÅÊ\94\r\ 3"ëBÂ-=\98aÁ½<^kÆe\1f\ 1ÑØÅ\8aàpd
+qÈa°Äý¦&]\8e8\84e\9cktw\99\15aßËÉ\10\18\9c¶öÊ\14å|þ*\e\94³u ;\12°j\18\ 2Í\9f\91¡\rCSâz\8e¹\ 5\8d\rvÌU=¦\8d¯ùÒ v\ 6*omQ=ÈÀ0$«\8cÓ\ 5Vhþ\ 6ßKÁpÖ\94î\8aë`ñ4xå\ 4X\8c>\ 2ßÐL¥<×Á]#©\1d\8e¬\aÉÛÊf¾\ eR\1d¾s  \92eÓFè+×JX\95.\16xªoà¹ÙQá÷¸
+gçðÜàµ\8a¨Å\ 5\13\9agB x\85\94\\18f\bD\1e\94­u«þaðc\8b\1c%\9b?
+/{>6;\16£\84kq£æqáT|Q\92¸{\1e?%\85¥u(nJXÐcsÍ\8c\9a\1c\17\10\8cY\b\1cGÝ*\ 24¸Ú\9e\88\95\ 1YC¼ã¶      Yðc\8bÓ\84\8b«ð¦VS\87ÛÒt7\aIL\9aí\91\81Ò\13쯫:uM¤IØ\1a\16øРÇ\1fôyÙÁ\r^5oÜá¥eÀa\v\94À\11¡¥m\11\0v÷ªE©±x\9a6G2²±ë\ÖÛayöu¥/±?¾i¼ÿT\13´û4\ 1g1;íÅÃà\ 3å,^\94\ 4\ 4¡Ö¨Ë¢ èñð«jÊH\96\f˱ó%ú×µøR\ 5»U ØÔ\ 5(&?7¢¡ä\18Ã\87\97ºd\13É\10\97SåðÅâÅ\ fØ¢\18²ÁÛV\e k&|Í®Ç\fOÅ#*\e<ÂB\ e\eÇ\96×U\9abX@\1fçÙ-\91\9b\93\ 3\86p·ZöZ\v£\18\83«\bJs8\82Üø\12\ 6\8bjªJ \ 5\87ì\19obúæ\9cÈì9eÔ"²Z*»ªÓV -GQ¸kÓØd÷\98\175Çr\12\13ï\19\87K¹VIz\8a\16Ñ^-Õ¨vÏ\89\96\98¬CËÓ¬s¨5g8\173y-\9a\ 3|ßþ\95ý\8cIñ,\82Ï`¥\9c\9c×\862<Ü;°ºéÕ¨x(\1a\86!Û|î\ 4!êP¦:¾\9dÔ Öe\9d^7DñÀLÙ\82\1a\9f\f\8d¿â\94·am\ 6\8dFj\1c¸×`G#rX\95[Jª\9d÷#i"\v§ÒåU\82wh\11\eÅ1sZ\9b\ 1º'sÝÚ7xÐ\ 4\ab¼k«"3¬%Ï)HZLL`3ç¶oVYr\82§\98ç:3\b\99á:6[ù\89dõM[Þj\e1YÒ²+\8d\r\87\1eç\0«  Ó0\8bsF\f¦òÐå\17æ`àVÁ]6kî\1c ac\85\ eA\9a\16j·Ç~&­èÁ]\80'\8fi\92fGpí \92\87\13\90oWU\9b\ 5vYNfRD«G@ôåàZ)Ç\ 2\f¯Cöа©\85 ZTkÐ\13\8d\\8a\9aá\ 3\ 3\96Çã%ËLÌÑòë\90M) 4H\8dbKÜD¢\8cd\15{´/àl\ f*ÎD\87³íÒÍ\8bÀGF]\8e\ 5UuÐ[d\88\15µÁx|Í\18\1a\ 5<Ýw,Ñ\95\16è=¬\ 4Ü°âH9«=À7Y\8f\ 3Ñß-®Ò'YëI©^¸E\e"\ 2jj|\95\ e\ 2\86¹³¾±\8d(#O,XöK0g7'\13[îÊ°X\1efqË@Ò\91z,\13_\91\17ÇN,uïÓ\1a\19ÁãøA­\16ÂÒ0W\91\8bL\80ì\88\16=³1aãz\94Q°À\10®T\98÷Ðv\14¥b\15¡[rWs9Ä2>Ù\95¢\ 1ì7äåÿmVï\92Ť<=²]\ 3ä¸:\84¥¢E+%ÇBAõTz®±¦5\ 4ÚÊ\17"\81¤N\13\95ºòT4\11oÜÿÔ¦Ù\8cYp\82\ eÒ\99OÇc¿Ú°:(|LÙ\8f¿Â\16\94\v¶²ò\1cãFÉ\ 2j±p\88\84Æð
+[\17PàD*WL´\ 6¥\8foy\bZ\ e\80ûªa\8d-¨`³b/¢åön~täÞV.\8fÒÌ}+R±ªbÑ\93\95\18&\12~'Ôÿ>Ì\7fU8¸(\99\8e
+ÌD.:w\r\8cd\9b\ e+ã."[òÁpnË@Ti\1a.\917&ãfTð:\0\1d·\87\88ÕÃârYîÖ]&¹¥\ 6[u[ç2Um\19\11ÕãÄ»×\94á\97ÍkÏ@+Ë\1aË*%É ?
+íÅÏ\19\10°&¯$f\15\8eÚ\16\1d\18V\ 5;\fï@W7\15cMØút 5\1e\82Çê\95O\98Å·\82¢·\13\95\94Ú±:P\16ù\80ÒajR\9a{Ý3\ 4\19IÝKwº[\8að*GÅ¡\9d^\15w%U±'?7\8cÁRh\19\88J6Óó\16\8b\86\83     L\8c¥\1e{!)-\920\9d,\98 YB\13ï%ëAô2TS뻿4\9dy¤        ³I³2(Õ,÷ls\83J_4*\0)\1d«$'\8a«j,ví^¼ECaÙ\90\89È2>È+Ѫ¸ã\96Ëþ!n|¬\1az^ëY\8a¡z\85Åâñ\ 1â¿yi\86\ 2ô!u/\96ÀÖ\80\1a\11¾\91°Ã¸\16#\1cØmÏ \95\1a\8f\16\95\91¬\88¨\98`Ôà\¼\16\8c\15÷l{J\14«\81pZ6\ fÖg5\10¡ö\90\9fõͬ¡\96\12%_\16\ 2\94=\90"\19öjl\16\9bc9\87LEU¸\97ô:\8f\14ãB±ÁB¨½^Î0Å\9d{0¢\97®Díù¶'\86µn      ¡       I \18°ærJ\82Þ´ª\93H>µ@\82\97f\11ëH}ì\9e©Ê\8aiµÊø\ 3¤\86ù ¼\ 2\90;Ù^\804dpØ\a§G\86TOÐeÍ«Yú¡EÍ\14      ;¶\1c¿éÇ\9d\1d]ÕCwªFl\16\ fq\15×:0t\8bÃæ\\15\16\r\80¡Y\88)'\12 *\ 4çÈÖ\82\ 45ñ4üV_æ;\aÕ YijüD\r¿Ê¾ä®\19åi\ 4\84ìÅg\8dõß\97fOεÁ¾Ý\11\8f\91Ï\12RR3©¸\95+lõRk        \18âfð7÷1\93\ 4¥\18|\8c\11\94ÁD\ 5\15\f¸\16\92\87ù°iY#z¸\8aÞÔ\1a@Ùó&¸`BT¦Æ\96i-\8e\91Q\84fyÒ5Õ#\17\8fÝË^\84$s\98Ø4g~ê^\920øÙæ0\81l\84À\82iØ\­jXêËÃß­*\17g=°Ré£\90\92°âi\12\7f²\ 2¡\99r¤;B\803W\vj\88à/.\bäi%\8b\16EÙJ°\ 2\16É\ 3±ÙS\ eJÖ´\94*ÆPÍ7Ìç¥ãeÞ{VÄ\ 6é\8eluv¯«\94\80v\97¢Eúe³6py%\8f´GD \1d\93¡l]¢\1aã:UH!\93ªÝÄ\1e+"\1d¼\90Á\1aTÕÌN7iVµà±\97øP¼\17µ!Rðb\rLÏ5Ô7ÂÛpìÙÐ\8c8\8cl\98\ 1\83=äÁ
+G5\ 4\1c,G\1a\e=FBw%oi9\8eóº]&m\1ei°LFÒ|Σ\16\15\8b«¼^a+\82\ 1碨ìÑÑ\84e\v~ÃaS:ÍÎu\94ê(Áª\8c\1eû¶y\10\ f\f\89y~¬ß\9dÍÐi~@TWZ%Í\ fþÁÚ<Æhzjµ\9aa\0ôâYÃNºù.OÖ"ªD\1c}\9a-{\8aùôú\13Ü=\15\98Ó\8a\90»ìóÉ«$1ã\9fVUt\95\8e\10\11®ÍÉÈÅ«4
+\82S]Q0\8aküha_öiZÅ<\8e=-\96\92\1cXÇÑr\ 5GǨhd\11    ¡\16ñΦ\0xÇP\ fúÑ>ûpØ\9a¸¤#¦Ý>\1cs\9c\15×oØö Å\18ú\rÞDj6¼¥~N¡ß\1c½¨Í#
+¸¤*äD¶º£jlÑÍ\ 5É­ÎÝ[\8aSÒ½\e\a/jm:8í\1e2\9bÅ\eÔÐ\F\f¥\ã\17Ç%æ\8bÙx¾\15M\93r_Ë\15ûæ\12.\12\92;\ 1kk¦S@·â0\r¿u\ 6E\ e6o!\10\9f®4¸úR-\8fð¬/\9e#\99\91\8dª@ó^Vå­\8a\1câ\11\ 3KÝhó\82o\ eçË\16WgÜ\10\99±\95\1dÚ|Ñ\\98Nm«WáǦ/ð¯¦=\90î¬é\ 5?61½fñ5ø±é\vüÞtóBBǦ7ø¡       ÒÆQ\8bþ*üÐô%þç[ùÌ:\1e\99ð\r~l­\ fWáǦ/虐YTÏ\9a^ðc\13\e\1f\85\1f\9b¾À¿\9a\96¢3¨yñf\812òå\96¿S\r\85,\97õj\850í>\8c¹J)°c3B\87¬\9b5ßá\1c&ÀÎvÇ\8clB\8e\9fB\>\9be4\8a\99\81`(SÿL\1c\9d|Úú>v÷\9f8{ÕèÇ\85K¢Ý\1c1ÔwQPÓè|à\8b\r\r\13b¸ØS÷ò\97ËÍlðs÷3K\b}\15â_x®Á\17\9eß\9f£*Z\90ù¢i\18©/P]\87\v\9e\8b®.øEÓ\9c¾è\17òmð¤jÙE\13×àÀsÑô\82_4\8dâÍ\17MG½\ 3ò¢\89kpà¹hzÁ/\9a\ e\9ahyÑtÐ4Ñ\8b&®Ã\ 5ÏEÓ\v~Þ4ÛÇY\r9o\9aÏß*j¾\9a¸
+\a\9eó¦7øEÓ}Ë©=\80SwæßÜuΪ\13ª"±\15\0UBº\9fÏáÂ\90â==ÞÜê\b'^Ö\9dtûE=\r5#\8eÄmÁ\8fÄmá¹\ 6_xÐ4Û&f½lº©åþ¢é\ 5¯êC\ñ9\9a\83Ⱥo¬V\89·&»\8aÎâ¹.[t\92³\ 20$ÚÝ·á\82× eÉ\9f\e\1c\19ë\1c\9ae\99ôÑ\ 2U94ke\1c"hDÂP÷[V\14\9cq­ñ\8a%éZ\ 1,xô;·¦\ 6\r.·X\9b\ 5\98\9cuù´\95\80\8e¢\89GoÎÁUE\\8f\1a±J~M/¹R ²Þʪ\91/õ6õ4\r-ïâé\10\ 6\ fª®­x\14Õ³\ 5\1e,á«\15{ÙMâç]>]\9e\15¾\88\85ýcoÎ\8e\9dÁÏ\8fc\e\1a·~\11¤t\1dnx.\9aæT ²ZÎc¶\ 5ö\86\8b\ 6Fjô\94\197ÍïÚÜ\97ºu±é5X§ó®³ùÒ\9dÜ[?®Á½#\17\9a\1eä]·X*À\1dÓì\ 1\8e$\89}\0P\8bä·ê\ 6$¹çJ\8cÃ\160wNc\f~ÑÇÕâE'\8b\96Û^+ë!0\ 2\7f¾æ½#^f3\14#\8f\93\952\]ÀæT\ria\8d\8c\8d>\17\9d\ 4ü¢\93«Å\8bN&½`Ùi5"\10Ù\9fÜÜ\14\8dÊ3-kys\ 5"\1f³!@å¢3\870\96Ë\16÷ÎÐy±C¹®Yå&Ô\97ÁEì\87¦ypÜÜÐ\9b\1e\9a²
+\0ûª\1cê¹Ã\fW\13-[Uaß\91\v\91$¡©\fÍ9À\84+\15\9fpÃ8\8c\ 1lÁµböÝ®oäúþ¨\ 2%\17*uÐIIÎuo¦8<4®'Âk\88<O¥\9fì_T»­Ü\86\131d\ f'kæÍ,Ié+^îV\ 1£4¯WËnó\96\8dZ{Þi   æ \14\93\98»\18a\15ã¸\96aR¶\85-uO~§±Y¤ËT*ã³3\82dïq|\bê ñ6M¾\ 3F\1c\8eÖ";ú\9e îÎÓ\86Ò =X}\ 51ÿ Bi° "\8e\92à\ 2\10îw0Ooñâ\13L7ôÞ\19        CÉ&Yà\1a'v\98¯Ä=Þ}Z\ 2\9bÆ&\ e\ 3-
+ÆÊló\8aÏQ\93¶Ù\9e\91¼è%+\ 1ªÄ3\1cá&¼\1dÔó)\96\ 2\16\8c­§alµüW!h¿ó©Y¦.\87[ ç¬yF\ fëýë\1a\85®\ e\1a\ræB%HÞºE»[5Ø\aÔ¯(7ç\82ï^J\815.5YIp\16v)ß     ß-Ê\8céão\9d'¨×\9c-`vu\0W,\8a\0Zî:GPjÚ©è`\1e_Ãa¬ÕjȺìW-Ò¼\fÝW\8f\12\87\97\97\1a\15ok.\ 4qÎCëÁÚ¤W\9eeÌÒ´^£º\0Ã<R\0¤JÊ´z5Ü\ 3\Ú;çÍ\eü÷>­ª\1es49\17«zã[Æ×Ñ.2l\92W\8bév\97ßÄ8V²\92\82Êá\8e²i&=i\a\14é¢ñß^Ò\7f6â´K­\8c-suãvMC:ÏÁ¸-\86\ 3ñ\8c½\ e=\1az\18¦\9d\ 5\9b ®\14á\2@/ÎYÅ\ 2\11m%ÇrlÊ\r\12Ô\98\90¡r´ø\ e;Îðæ}4Ü\1cwáµ»6øØïD¿lq_[°\8cÚÕGìk\e5¦¬â\96\1c\0µÔ3\ 3QÖ¶!ºC\f\7fûÚvu\19øÚ\ 6µîX;À׺\ 3\87±Á³\1e=f}\98zãáÅY  {(¤\b ÑYÜ¢iÙbe\8bq\ 6ØB\rïùÒ\1aüùÖ\15ÜGÂN\12Ú׫+)4\84«\ 4çÕ¹zú\84Ý\ 1°psôÉc-
+ÚçW\9a[ÖÈf\ØÒGÞ\18\1c7ØäUͧJq#h¡f§¯+:ä\90ò²r\18\8e)/\vÎö"Ö9\1dn
+R×\93¬À¬ÈK÷\9aúÍ\8b\12\15Ü#â-¢\8cõ1\15ær\8c>|Î×Ii·õ½1¸¹X\9b_©ÃÀd\17u[4\81,Ôº4Ú-á\\9b\óÿ\8f\8aó\ 6?hÁ\97=Ù;iiI\aw\a\ 1ÚG\97\82\88i\13.\85\16\94\91q:)|,D  ãpW=\82\9e\8aæ\98zç»\16½a\f¸0ë²\e¿ö\1e\90y0±\96f1Úg\93à7aJìR·ë\9bF·[á#|¬|%C3;°¤ëxªÖ\82ïÓ¸zr\r~n¤å\8fª_%¶M¯_\88#nöi\9d4gHñ°Ð\82²}ê{ç\eTO\86¡"F¬x´ýáå       '\15\ 3\9bùM6ßÎeßV·½\84ÖÙÖ­Vñ\88-$MCq8\1f{Úe\bÂ\a\15\88Ûvx\93s\88ÄÉ0,ø>\87\17-®Î\ 4¯ÿ\8aû#½Ä\80Ýa×ür+vÖ6Kø³T3¾[â¸ÿO\97\98÷Î\´¸w\ 6õ¯9º\81sµ½3\16\9b\96]Í,~[.Çn@êã»:pC<ë\80\1e#ÄVQ\r3d\fpÖqs\9au\9a\8bk\0\1cú\81J½U\r'îÒF\ 5\10Y\b\95R8oß3&\11\bPP\13P`¢D®\18\18\94³M^U\87w%"Ö¢\9a\80\8dÒ\14x\8e·â3âÜÕ,Ü¡ñ`OÔ\915=NÉo\v\9bѯH[\91\87Õ¯\ 4Ü\82\8cj²@8¹\12sݹ\14¬ö\0\97ªF\b\15w!XÈ\8d¤\8ehA\rö?\ 6»ø\1dY³"\94Öh\14\0Ù\90U¯±Àôzi<ÎÁðY³\88\eÖ44c>\ 3\17\18\9cÞX\90ˮϱÈ\86pÍ¢\81:ú²%é¢x«\ 2WlN]\bØ\ 4çW?ÚmsIã^ÔPÛü\8a(»Ú²k4ùK\9b²uåe\82\ 6-ë"#³\1aÂ\1cN\r\ e\90÷\v\0¥\8aA\ 2\8d±d9\16\1f\10,ÉÁ¥DmtÒË°ª\132Á+»5YȦÕdg`±ðÔ-ƨL¿~|IÁÅ\8bûs¼\12"Á9(<\9a3S®Þð]\8d2<|\ 2°]ÍÙ\ 5:\8a\88:ÑÅ\v¹r¸Wó;¥\99hixµD}\82ì\15\ fÌBpô\13Ä\bY(¨ðb?ÜRg^G\81BÑÙµ\8a¼Le\97\ 4Æ\152)\1c`Îx     \ 4ycp\84\84ó\86Eh\9fT4\89@n·\1f³û#ú\16^%\137ø1Mzµx\r\8e\9e8\81\141È,ñ¢\84£\93\1e¬\98×EÄ\9cÌÛýeT§\95PUßK«ÞÉ\ 1¾wfoñ\1a\z²:Yµ Î9\7fcF¨é\13\16ü\98v¾ð\\83\9fs³¼ªA\1f\9bnfó=kzÁ\8fM°ùè\11\8f1çuÕt5\93\92\15¨tgëHÕ\13}ºÒAíûßþJª\0ýÍÝOÆï\1eÞ~qÿþ\9b¯ÿõç/>|xõþ- ÷¯þðåÛ#üG¿zûöÅ\9bW_Üä\1f\7f\1enî8\bê7\7f²»BÂM¼      òüæÏü×ÿ ßþ\17ÁþtSn~zóOÿ\1cn¾ /ýæ\17Ô­\128Æê&\93\84-7]ñ\9cñUw\9c²Ü\16øù\19\98\93C\12Ò§\1cÅ£À\85àíêÞÏø\1f~âÍ¿)f\8eÔ#\95!Kí`v^ #Y\8bãg¿oB\81bz\14àh¬æ\b°1;ÎRK\97­ê'Ã\90¸\18\96bæ+{\ 1d"¯/×jh\89\f¢-\ f\84$xÒÌ\94¬¹=C\9bã
+G      /\17\16\8cð&ó,\ 1Ê\15\8c\8eA\9c£\8a9Â9¬H\98é
+\9cdÕ¾àR\9e;k\9dê¬-F\8dfR$Bñ\ f+"Nõ¼Z,\98·ªR»c\16¯\88b6\87­ÀEæ×÷ËÄ|\84⸥v\93N\12×ÚU\ 4=§5Í\91­\f\ 2\97z`\0ò\ 1\12 Üy\ 3´)âM\11IN¶\ 5\88yeÀ%(_^\96\18<\1d´$HÉ\9b\89sï°)\10\18zÃ4\8béRaÁ\96\84\88~¾yt·ÁÞ \1fMö:I/"Ô
+\ 2shì\98
+¦ÿû¼\89ó\13#\94\ 4É\ 5g&¡{¦FÝ`ìü\8c¶Ü\r\1dllÞµe\9dÕ§\83å\1fß36òªROÖ\9b\ 4p\94\ 1´\12vxò>°\87\aǤ'4×C·9Â^æ«æ{ÓÓ\10kO[\170M|¤8\16\14XGÇË"c\b°Å\82AH 7ïBäH+=\10        »¢h0¥ök­i\1dzøú
+t\15\11Oæß\0¢\ fÛ\99\96ëª\9c
+\1f\85O\9bH  \94\98(\14(ñq
+\ 4      aàÜ0H \8e\1e\8eÔ\9c\1cJ4>v¬
+\8d\ 2lÝNØàk/1d6y(0\8f¹0\87¡»\93ßHya¶íV¸Ö\88-¾í\b¾»*u\0sëxSJ\9bØÌ\ 3©Ô\88Ô\15j\ 1ïI}éÇ6û~\fÎ&ó\8dÃ\8bo\9fêh\12Ç\12\ 3ØÚ·\1cÒÇ_ÞÐ.àÅ\82j÷F°]<£æ\ 1¼1øÐÙ`8FÉl\89¯\r\11 \ 4=\ 3Èz\82\0Ý\1c\95'\97.HÊù¸\9ao1\92ÌðÑ\80¤ñ=\ 3
+\ÝÐ\8a \ 2Ì\1cõ!@¯{"ð\1a\85TÌ ¾\f\ 5JØ°¾\³õ-Ô\8aQ\94\8a"¹ú2ËÈúr,¶[¤\82BD\9fõ*\ 2\ 16æaÒ\9cT\14À\9bÊÊ&ßH\92m\873|è¨\83j\84À\1c5$\80àR6{\81%`TÀ\89\89¹\ 2\98Ñ\8a={¹PXÃB\1a\ 5[¦::Øt \ 5ܸ\1a\96\80«$¨       °Î\8c~×P\rØÐ\8b ÷R\9e\f\83\ 4P(\9cëV\08t$\ 1\e÷\91\r&5\a»\8e\90\ 4#¹&Q÷RÖ
+pÏ\r\1eØ@#ï\8b\97X\91ȯ\ 2ìQe\84KÌÞ¨\P8\86\9eÑ\82@;\ 3G\80{ô]Æ\8e\18\ 5\16¥=\9a\ 1ä\\11ß8â*ÌzÅ\v\9c\ 4\80ë\19\ 5Ü\80i>\ 2\8c;pa\8eÉ0ÇÑý\ 4(Ó.\9a\ 6õØà|Ø3\98@0÷a3¸éò.rÇ@l\84¢³§ÀÈ®6\ 5æj»z¢H(àJ\8a\19X\85Ù     \ 6%\11\17]Xk\82\89Ì\9a\87_M0íU³\³¦×'§\13\9c      Tñ¾TöV I\1e\0
+QQ \18%²ÞdP\8c'0|¨(\16\8dCs¡Øn­ù\9aÈ\1d&x\91Ôë¼\10\94¬"\1a_-UÛê\9aɱ ç\ 2HzW iÅ
+l\9aú\93å¦\1fK\8eW\fME4\92ËCìg}#aM
+³k\1f\8aÊ?y\97ÆypM\8e\ 4×        ¨ÊÎy.§Ê\1f¨ª\0`V11éíÚ'[\10©Ö§\13\9f¦ïå\8b\85zn\94&à®-\15\17&"\87\14®t\93áy\9aæ"ðiâ\85\b¾@\12Mfd1óQ̧½Q6ø¨\82\10ë··Y§        º5)Ù\vlÌNÓpL\ 3\1e\11ïD«\8d\0j-54Þ8|F£âRÕX\80]\85\97\99\¾|\948}\94\ fÐì\0\87F\11kk¬ôj/$\ 5ý±®í½\ e­\83\\vÏv^þ8OZ§=¨\89pqAvL   \9cÎfqþ\93ÀtshÖó\16Wg\86\16\r\16B VR'FÆ8«\1aÃôe¬Ä,È¥& g\1f+\86¬\86*L!'ïê\fpê¯\9e¾15GQ0PGê5b\84®\85\ 1pôW£J¬³êQW¤ÐÛf]÷\ 6\82NPÓ[)\158 ­ØÕí\82Vç¬éý5NN[\8fh¬tUÐ\ 6îy\14 ä¯aXl\19ÕY\9c\0]|2\99L\8bz+\95\96$9\ 3æ¤\82\1c\f§À\1050QûPº\88:,Ö©\84\96e\92u\98R\88\ 5³°f\919qª\0ë}\80\ 2´\ 3R]É`F\ e\89\94\80 kE\1e±l@æ\17)Ha\r¥\8e\ 4h]U\13\88w ôb\96\11ɵ\17`Tâ2»f\92\ 2¨JÀ<X4¦Üê\9cñ²\15±Ñ÷±\1d\9bË ü2&Ò|9\ 2,\10L8ä>¶\85ÙÖ]ãZe!Lxn.â2°)H¢ÈÖ·!ë5½tã¹­ú\18\ 3]\90\14a\ 5\12á\9c¶É\825\16\9bÐð\89b\1c¾olz\9a\ 6Wë^ÂÑi¾õ\19¨\9c\95¸o\87\ fª0\8fbLÛúµÚË\12À"@ýÛ«öË{2p´4m\\83ï\8féØ\8b\8c\81]Um=dØ
+¬);P\88>0s¸M\82¤(*0\ f\95òÅ\97Ù\r¨\1c\99Ñ®#Í£´¥\90K1\15(§^[\8bj\1e³;\u\11fÝ0@\7f\9c0?0°\9a\8eF;L!ÅO\b+ò®f~D\1eNh.£\90\8f\0s\17n9ó¢Ð\89½`\ 6,yÃ,ñEÂ1ôj\ 6\ 1\8e¤[<¡ì¯bHµn\fÇ1\8c8\81A\ 2\e\15Ø°Å\96¬ÁRN\ 3ÈU"6S\rk¿¨Â§Å\8d ã¨cAÞ\84\15\8fUF.Á\r\frW$x\9eÉíC®¥\ 2Ï0\v\ eï\ 3\15&\99.αï\8f\16!ÀbßóõË
+\18\ 5ì\fAgú\96Õ-Sö¤²97\15\94°òÝÉj\0d\9eU}ËÁ\824QIß1H\18\85ÂUÜ\eC\85q\85\99¦34!Q\99^?ð¬#;}î\9c\96\r\12º¾<ûÍ5,¾Ìk`çH\8c¿\ 2{®xY&\bÀn=\91]x2\f½\1a\S\10\14\98l\93\81u]ô`\89\ 1]ohÔA²;þ\8dÃÁ=2"Ý\0ì8\ 3rÃïÅ\9b1µµ¤½5l÷i\9b\92ÃQ{4\f D×\16åð2Ì\9c\82Öº{óè\bÖàP"PÄ\9fÙÂ&&²Ç\14\e\96+)(Ö yë]\a*;\8e\ 4 \88³.&\8e\Ìæ0¦Ë\94.\97I1\15´\85\9d\1d\f}\83ì\13Ø!m§Þ\ 4\9a U\1c\1f\1dÅ.QÂR.6\9c\98×\0;HMZ¡7g¢°0w\0q&¥y\9b\8dK1\16p\88F¸°
\9aUf4\17=Ϻ¶ÔàbÊ»\98-ºõzº\ 5\94yæÌ&|óû`*AkÉ\ 2\98ÝzRÒÍ£\88wÕÛlR\Ti¶M÷N.Ù.ÍY\8cQ²¥LTÜD=\ 6ºÓ\849n\e8\149¸£a¸uAä«iä£\85\94\8d\ 1`@·óª®¡ð\11¬\e0oòõë°äd.ö\¾å\f\1aCçDøf\Ó\8ck\19wh)×\84M++Kt®YÖè&\8e¼\94¸5>2ÀÞ®\13©\19\9a\e\8c`\9ec\93@\ 40Uõ\97\8cæD\18õø½\ fËä$\11K\0\83éøC¼´Æ\bKßFa2XB¥\ 6\1d2¬gl´J6\931'\ 3¦¸Ñ¢¬\9e\f7\87LZF\1f\Ïhªî\v\9dÅ\951«1éi\1c­¡¹\88Ú7Êx`ÍI,cõ\8dÇ\8c\9eAtø¦ºé¦7ð\80©\97\1fè\8cqé8ß«\92\r%kÔb0¥¢À@¼&G\80     4YÔ\8fMô]û!\9b0*&}}9%\13[\17û\8c©o"îÙI|¾Ñë\813\1dõ0º-R
+»(<9­\9c\1c²\ 1\93\92
\8f\8b\9b\84\ 4Ò|À\0\11ÃY\1f\94\86¬\ekÄjÔºi\\81Ípo\f>z\87\82'\v\ 4\8b\r×0\99\90iea\14X\80Â(ý²^κ.èV\83zÍÀ«\195ú²\1a¿X#ÎJËÙöØ\\9b\9cë\10\ 6\ 5åU+ê\b\896e£jA\95#\81o:S\8bã©Ùf6\9dY\b¤³\9aV\9e\9d_¥6Ñ\96_ë       ¡x¢o¢ó(°ª\7f\9aû\90l  \9a:
+'./v\ 4­\99\1a¢×¸)V\b\ fU£³\f\181»)\97MP\96X8\85s\1c\15\80êÁd\99\14
+\9aô«\0mª©l\83\80®[pW v\fÌ\92ïÁ\r\ 6\91,Z@hY\98F\86d;MëI~\ 6Ù\174M\82OPÛêº\ 4JE
+\9fu3.\88<a\96\b-\a¥À\90Ñ[1å-.\ eÝÀ®\17ÆÊ\9bÀ¬Åù\148k~¬\ f\15\96¥¢ª\06\94:AMº×­g\9aDÑ+«\96'\ 6JKYÎ*®BmÓ^LÂ\fz\8d³\ 2Íý¡\18|-ê²\8fq1L\98\13\8a\9e\f?\86Ë\8a¥uäÔ³ÕMàÖh¶Ã\9bévÙ\95¸.i3\16©\9b\87\8b5Â"\93\8b\80\9d/Þʶ\1fr^ß\ f]\19\Á-hÚV/ÙzÛÍ¿\11ÔâÍ]]¬°K\r$\1c\81\b£\ e{ËÂ4ë\7f«\ 64I\83ymÝü\18\12w¥«,ñ·\82v\80\1d\17S\7f\98\8cÇY?ËoÈ÷/T;.c'r±Ùû©ëzZ­SAlâCÇ\r\95ùL\8dã\82©Ñl\84Â\9a\ 1ä@Ií\1aL^rCð´\13°Är&À£Øn\8d*\15
+µ.®J\8eæÀ\ 3       ?m\15\96´\8f\80R¼18,æ\13·/>7¸Ä½\1eh\13\ 1\89-F\ 3\16\1fý\11óÉ\83£èc.)\97;â)\84t½qx0Ç:\91\ 5\99\1c®\9a_>\8dà@µÑ\8d­F\97Â=ÊÅz#×Ë¥³X\94Ë>¸\1cÍI§*\9b\8c\83Ù¸q\ 5õ\b\aÛ\6ì&Åß\r\1eTêa$¹\14\ 3*¥¹Äì\8dÖa\1c\85­0Ñõ8.»ª¢Ö\88*ö>·÷\83Ú\85DÓSü\\99\1713  7Í<\86Ù\e\95*s\16Ò#·ñ¼q8üau%x)\¥T\86ãp3PÝ        <\93ØÒ\f\84c§®\92&\8fµè\92\11§Ñ h¤°_Ð$£")5\88\94\80©\êÆÙ\94+Ge\90;/e\9f\9cìë%Y¬D\9cÍ_V«+\ 3s5àY\aöÕ±\b\93¤áµo\1c®\87T+øÛ*äh®91é\ 2\b¿/²AO¾îJ(\86Õ"T ªä\fL­^]ÇGûæSÊe'õp\1aó}ãpGU@ \9bDu\19\10Ú\ 6\ 3\9b\1eÉä.\7f`ðn«\ f_\81ªSª\1d0Þ<Ú\87\90Ô\81\80\99\8fáÊN\19\ e\89\89K}±\ 5V\81Cmß\f¬æ#\97Spº\82Ùç\84/\ 1®\1dÎÌ8\17Õ\93»À\92½ڽÀ!%\rè¾
+,ÀÏ×\1aÃÑz\81ù´-Dóý&Z\94/\ 4ì¢|ãAR\9f[\83u\8bA-Ûà;ü§E\vaø2´ippûV=vò\80ó¬\ 3+:h¸Ã¶ë\95µo\fnA  \80\ 3\88MÂ@¥\0\ 2¬i\ 3\9e\1cCÒmÜÕ±ôüJ\8b¾:ÉcCÌsúÆá1\18\1c"0_\90\9b
+¼¸Ð\99åú²i°\15¨Ô5B\ 6`\f\863#«\ 1û0¤g=ð\99â{êT\ 6\96[!l¢\18\8c\89ª\1ai¦À\15\0Ùá\bã\8c\92`¼L¬H'Ã\10\94³Zà!\80\88\10ããª\8cï¢\vk\19¥æ+ì ¢â¾1¸\19
+^dÉ©ºú\8d [\ e\90\82\88×'Çà\9a¶Y7¸¹2ÍW\0VsÙ\87½{gȽ{¦^1ÓéÖ\93¥®7\ 4RqñE\rÜ\13Ó\89[æ墹\86î\89ýÒкÉ\0\ 6 G\a\88¥e¯`Äû\92§õÆá5\18\1c\1e\ 6+m%À<À=\9a\91\84)\9e\11\f\87§w\91UÁÐ\0¬1\18\86³>\9c¶c±âJ+\e\90üX\ 4\ f\9e\96Ùyr=\u\82=V\95\101{¬Ï7\và\8dÓâJí@×\15\18ØÌÑÎ[/¸²ÇÅ¢\11îW\9d\16J(m\a     \87\br\ 2±ò\1c=\r\9aÕý5pã\12º\10ìH\98á"¹\8dK.?¨\e\ 6\8b·(¸À]û5&\18F\rjûâ>\14\v\j\8b\89&Ün ô\11ªeÚ)©TÄ\0\ 6H\93yÝå¨\13<\ 3F,¢\99®OK\16\12\9aC7r)u(uÂ\92G\ 4rÝîbBm°0ÖnA\ 1Âöº-fG0%ë\ 6a[L\vç­z\vÞs§~ê"\16\11­yßf\ 3°"Þu¨l¢0Kö×^D\8b\9a\1fË\0\9cä²6\84zúÚ7s\95I°3BV¯Òå\ 4áq\8b¼\17O8Bvh?4\ 3\1e\8fÀ~:F        °0J\9d\f?\1d\ fÃ\87\8b±i9]¢æ¤böÇ0 íÂî!\1d\1c\13Ú¶n\9fµx\90/\94\e\88£ÎÙ)ç©h%ô¾ä\8be#ÐÊ,\ 2\ê£Ù\8e/1ï<¼@\ 5\19ªn¾Yp±\83\eÜ9°E\0\ e\ 5\98Û%ð\88yEÓqL\9fY^ÄÙûfÁÍ\ 6\91,è-¸-»è5\99\0v³n,G¸¼k\86\97ýÝ\ 5ܱ\1eº°D.®x\ wVÖ\93ß,øp1Wux\ 1N\8b¦3\81\98M\95\13Ak¥8­àê\8d.p\9b+XnÚÈ\10\88mÏ^öá8yf\8eØÅÐ\1d®f¯¾ÇNZLÍ£#¿øþö²\87I&µÝ]v`i;S\13\1a²\86\985ãÕ\f\9fÆ\96Í(Wå\82\ 6\88\12âÄûµ½\9cºE\9f!´æðnL\8eଵµ\86Ñø\10\1f³\19Í­|   \7fîpXÅ"\8aö*\90\8dw
+\84ÿ\81\810ÚÄu\ fî\15Ì.ýÁØ)Q\90®,sNö4­gN\99Ü"\ 4\1cúA@¸kaZ\9dÁ9Â\8al-rG\96\85WÂ9Y\8a3ñ¬×\9c\85Ã~:\1c¥µ\9d4"\94©\8b\19\86\82\87Å\83\14\ 1¨é=\13ž^\1a\ 6\b²\13uh\f­Eîæ²\80ç§\19\eª\9aÍ\8a=\86ìiycp       \ 6UxSᣮ\9c\94é\a\94\81\88Íä\83æ¾\9a*N\ 4\10bÁ Çnâ
+\15\ 5ÆhÀìÆÂ˾ù\8aË\rS\11=\11\99é\8dÁ\87\ 25õZ!Hº\99\9cC\14\r¨,\8f=°ËCÅõ|Tºe´AÓà¸\\91Ç6Ú&¨ìÁª6?Ý=uü²FbÈ\14©L)7î5\fÐ-    ¸ÚPÈ·xG½\ f\86\19Q\1d:\15\88\92\1c¼\17\¶©ko\87\86Î8\86îßïö&ò\&.\84\14à\1a¬8j}ÚmáÝn²b¥©¯\90\e\907æ?ÕS\898\ 3¾«      \83ïþvu\9dñFãlczÜÚ£Ë\f8b\98§»,ëJÂâ\90x\e\1d¢\95x +µ\8bWYc*x(Ù\87\ 2QN¢$o\1eÝL§m\9f\9dm\94µÏ<Ø"4_f\vDbs©\12\ 6)%\95\fèb\8aÕáR0\92þ¤Ã\16j ÷r_Û«è\1d\a\rÚûs;¼+='hì6\80ÑrR, \88\v\10ÀW EÏ&H\vÃu\r%ªPù\12c¨Ù1(qºìÃ"|¬\9d\8e²\86îy\16\bÍæèÓ\1c-mÁ\\84\9c"2Ì;\ 2\81^"eÃ\96gq\ 6w×KR\83478WJ\ 5ÂÖ\82§þ°OÓ\13]¶ \87\8b./\1e\13<ÏjhäÃ\e\87O;Æ\16)+\ 5KUë\19\1e\89ñ0wr\85A\ f4bx.8/&´HÝ\8cnÀ©¡²\f¬\ 6\94\85!N\1cy7sì\1d3»Ìå(ö­n
+\86䩯\9d\9e\Êl\b\8e\93{Äb6ÑS%¾\8f\104Ä(òË=\19õ3{ËpãÂE\17NÛìC¾\11rëæR\86ÃÊ;=]\8c\8b\ 1¨\9b\8a#\ e\ 6¼
+ÓÂ\17\98\ f¬ÙçËe4HEàÅ^\86µ\841 xXª\14d\90\1e   iv\ffz\9fJáÐ\9c\9a>Æôý|9\8aeïgÎgHäx¼Ypã3\r¬C\80s\18°\7f[÷ÌH?=\12û\fí\82\1dºðHìÁÔ8s\9d­\95¦Ã\1eþlôÂýóAo×\ 1ãì\96\1aw\96V°b\ 4à\96\98\1ag¶Ò\10V\8b\16=ìÞ[¦Ø½[\ e\82\1d\19\14\tÌ\96\154\9dy\8d°Í\96°\1f\ 5ÂöÆÀ9ÊÂPG\18\17/Ãç&Í\8déh'vY\9fÛà*rcÙáÛ¬\v\88¾a`õ|IËò\99Z
+Ã1Ìn\f\87fÁ¢ûz±è¾ÊY_O>\1aòg\12\vy4t \98\91I\8fÅ àåd\ 28\9cI\1c\90\0#\p\83\96x\13\8cåõ=\86\8cw=\88)\9bþ#\87\a\91\9e^\8d`âÒj`ÈfÆ\17Î1Ìj0\8a¹u8@h\8b\1c/î.%ÖeA×Y#\ 6\14\b­^ò¬<\97±»ueìA\81\96L*7çv#:\16~YÍÉe¡G\1e\80Vø¢\1fÝï©\18\ 6«j0!\84¬0³\ 1.æßoÝERën³È:îA¬Ý1Xâk\8a\83o)Ï6¶\19Ï\83×\83j<
+lÁxùæË\18ÍÝËaU¥Ó°4\rÏ\10    ­Y\98nk6eÍBÒ\87y\855³ÄW\94«Æeì©\840"\91\9cm\aÛ\91\9fÎÎ&î
\80.Ë`  êiWàv\fa¦àå\86=uj\19\1d\ f\bôà\16\1dÎui&&\8að®Àe[
+ËåÆ}GÄfôø\193`é\86\0õ\93¸0;\84e\1fDO:b\1eÜ´ALO\85\ e°\92J\fªëÑulqm\16\85\115Þí   RcÌFfLH\fã\96y½9+g2FoÇÞÓ],\17  \ 6¯&í@\8e\98¢P>\91\8c\9d%u\12\8d÷ù½\88\8bõÀÚ4\93í6\84"1PMü°p\7fÌâA\vAëz\0\80Ëà6N\89ó\19Æ\1c\91Ð0½p\ 2÷-¢\1e\95Àkµ>\98iXâ¾¢335\181\10\1a\18ë\91\ 32˹¹:u\14lH\rv\14adç\8c\ e\1c\92Â%ëhî\9c\ f/;3³b(\92gb;¸¥V\17\86âZµ'f¹ûz\9f\9c±õaã\91sZý\ fÞ`5\9bD=§õm\ 67\18ϱ1.Q\1a\809\99À#÷¯;fìøM\10\9a¢\99\1a«F`\ e÷A\ f\8c\9cOç;\93w\98\11»\82ÖX\8d5Ý0\81m0V¤q\8e=AdzÜ)'u@á\10\fÁÖ\13¡!ü&êÕ\f½ÂÙ1L\17a5q­\84Àæ\17믨¢
+«fÊ\900~F pÓ\95§FÅ<w8\9c\86\13\100ºÀ\8c\12\94
+\84«OR\ 1\9bc\8e»uBX¸\0\89\13\18£\14\0ÍFÈ"\ 4Â\96´¹Ô\ f\84J\9bËÆj»8\9f\ 48\83in\12³ì\18hòM¼\11ó4\ 13\rÙ²        4¸X\80Ù­1Ý®\0$¸\\18oç0E$àZ\96ZеR eº\ 4÷\ 13¼{Òe@\80\92\0-\9d%¨%V\81\16 05¡\r\18¸\94\97\99!4\ 3C\80{ZFVàôìÝ°Ô0\85O\13\ 1¸X°Â`9\11\11\8dÕC\ 1B_;®D\f\83\16ýQ`-&\94Ú\16\89Ñ\ 3W7\ 3\96À׫uS\80æÔç\9e\904òP\ 4¯õ}hÐ"XÇ\86W\9b/\84$\9f)péýæò`xât'ã\ 2Q\93ºc´         Æ0\1cÃ\bƤ-³\84á|;¯K\15C\972V\vª\12©MwS\¹\ 4\10u_*\ 6ö¸úæÅRƶo\7f±\ 6\ 1hâöèk%Ú¦\0
+\89{npK\ eÆÊiy\8bEi7൪\19­\9aþ£A+Z #\1aY\96¨.{³ùZ\ e_£¡\97t*-\11\16É>ß[s§©ác\15\ 6\v\1a¨ã_\86P!i\99(9&ß·h"¹oÜÀÃ\ 2p-\1fÍ_G²\ 4ÁÕJ(@3(\82z\ 28\8c¤\9aë\1cp5\80\r\\a\87Q\0Â\95\88\15\12§\19\15y\13\16Ø¢\82¹\0[0Ó©f¡\v\10§\92;`B­bÎ\r\18ä¦b\9bó\82 \1a±Ö袣|  çgô6¶M\82Ð\9f®¶|ì\108\96ºq\ 5\86\r+\83\95l^,¨¯
+*ÍÝzÝ©\7flVª\86Åëµ\9aâòE\18\8f\1cB}×"{ò:(V\11«+oñ\ e¬0\1dµ       êéAlPCü¢v`\9aãwX\f\85Âáµï\10\10x\8eÝrÛQVI\80DÒÐ1OÎ\95ã\9e½ \9cOB±t'Vu°\15²:\97³\96ÔrÒ\1f9ÕP\ 3\17»Z×\9f\e%2\ 5½¡,\8cÒ²aźT\16\10\12\95\97\9c¼\8c\88iKDznðèHXÁÅ»Áª(iµ-E\8c\b»¦ñÙNè3êTu¤N\82­t«ä\94µtN\98î&î+\ 2^\19\13\ 2r\eB(\84µµi¡TÁKgÌìÑNÕ7oh[\99»2ÁÙº\11T¯}'M\89\8dUGVb^,×\94¬¦\ 6\90ç\ 6\9f O\r\11Ï\82$¢ð]\87\aB\80Eå        >\17¥o̼Oßí\12̪ÍM;\85ÁÆ\e\8a\88áß7\ 5½£\88¯N\ 4¢@p\8am\16ì°í2ÑEÁ\91­dIµ=%Qø
+\84XÞpß\93\16\1aA\94q[Ò,Á«%&ÙÂ=7øZ\ f\a "r%\13\86`1½\ea\ fÕ\14@.zWºubEfh\0°\0³\1feóê\9a¼eQ'jTÃDT\0%¹ÉfaZ0\8bEÌ*\ 6ÈÔuÕn©îÀ·<\1f\ 1\9aìÌ5.\96\bU]\17ª{\91K\91\ f\vN\9c\8d\83S\1e"fBê\ 5\1c¤Î\81²|@\9cY0ÅLÄ:]\0Ï\96q'Ó\ eáw¯\17\19Lh[Bn[Ù}\ 2/\1e\ 5¯iÉ"×#:\85M=AiO\bæî\1eÅs\85\15nÁõ\1cCXL\99Y\81D\96$3\87û©\8b.\11ô\93ÁN\7fÀ-7o\ e§\7fÕÃW\18\8bQ]Õ1äfd¢%ÓóB±¨0Ë\12\9bÝ
+UH\1c\10 5]âþQï©»\a®©Ñ\ 6\8ai÷j\9c+U\93_V[âV¶\91UÛ`u|\ 2
+\93r=\8eiAð\92½¼0 \r\80á®v[-Çâ\99°³ou8å\ 6\1aÇ`e,\vÛV\130¬Ú\7f\15¶²)µ¹\11ýÕW\92\97¤¢Y°\19b\ e¤d\8b\156´à
+Î&\8a\ 6L+\ fEò2,>Oȧ\9bKf´8a·\8aÕÛaS\8eìáê\ 2Sõ nýºU0-ÐdÄd\93·à1T¥á¨\ 6¯\7f8=\ 1\94ã!\11\f\81jÂú²ù9*_C\ 2XJ~âÛêBÖû\80u\81­úJÑ\8aàú²&@±Å¨ZDZ\8aëëÓir@ÑA\rÅQÊ\8b\ 2y[\97\9a&Âû÷Ë´@e     1ynðê\85+E$87|1}A\94/\eÒ¼\ 2gÈÅê´4ÏXÙ2'EÝ
+\98\9c\9c\86Uò1vZÜaÈå"Ê°9\8f\fQ}-T\1fÓ\^ßzîÐ\18.\88\1dÎ%sÖa\ 4QJ\99?A\9e±\85\96\16\94\a\13ÆÜ-tqzqQÆ\90-Ú9ÂǦr¤\ 3\9bg\87\aÛc.î¨\9d¸[Ì\7fC@£°ì\80¡\99cQ\8au%K%Ø
+\\b·m6dO¡6åd\9d\88\95\erËÁ\95\e\ 5ü¸eð\92\9cfG·ü£¢\85L\1dCH\16eké]c¯\vê\95Rªç:¡cîM°\82ÊEc$ÜO1\8a¥/ÉM£
+4\89©¬dÄâ\12)ǵ\fÏnÍæ       â6\10W3²Ç¸\157 Ki\15\ 5ÅèÁ\9ec\95\15\16/®g¡\9e5\8fèçµóðu¯~$\ 1ñͼS\16:\9f5\9eõ\89ø±,ª´¨\8aæþ-ÛO\1cËä/\9bg|\9bÜ µÕ\94\90­ºÆì@D\15Ýâ\8e\0öç{°³Ü¥ðä±2\8dîü/(£ÌËà.È\ egí¡\eG$#.Ì\8f\97oÌÝøv³\14ìéNt¾\89&]-ßøDÒ\eçZJ\ 46ð­UJ\9fòB:4ò${N\8c#°ÀÝ´\92¸\87óªì\e\84\9bÂh³JJ>\ 6cºYÝÃ>;Ù+\eZ:]\9fV+\87w¦%$\8a\99\aÀ\9a¶r«È/g\ fcõÁe°ò¤úæ\13M\7fD×8\11znI¡\11ÁjÑmð}ZÚ;g\vCrà~i\b\8b\94ÏsÙ£{®\83UgñÁYmç¸'\16r\9f±LIb¦×ë\båO¸\16\10[;`|°_KÕØj\ 1¬mw\14[\84@º-\96\7fl±ù[Ñ\8e`!\9cR?©m\9ejä~\8c­XEp\99/«ÛTOg\ 4¥Í\9a\93»\1cͨj\99W½Â`¹ï\f´Dù`\8e\10N\fl=³\17}\17WuG\1f\99'iZ\18¯\18&ÝSlÕÈY\9c7b\86:sRM!YA);BY­YNÎ\ 2\96'káêç\ 6\8eÉ\9f/3\93c\98\10²{ûxºµ²/\ 3áU\19Å\99@ÒpB'í\ 3\11?[÷Ê6C}\95C21$³xà\18ª\ed¹¾ç0\f\1d          \89ånÀL¼JºW\17w)¶'\85Þ.ï8¸o²\90¹m"8Pºzy.\10\14ɬ+k6Ç0\9a\12\90s"S\\80ÕÈ-\17\13\83EìXKÆK\14\8c­ÈWv-}+Û\9bø&Q;Aë\88K\®Å\86[´¬4b)\90\19\19\18²\19\vÞÜÝài\ f$_eÊ\8c#\a¿\ 1\v¨Y!ì¹,Ã+\ròá1\86\16\9düE§^\f\84}'jÀ\88\1f\8d\88\8dÍe\89<LÆ\ eW\!\10Á|à\ 3u°ýx\9aê½Ý\ 2¡T\ 2êbPÂ\ 6j§Þ\0î:\ eR÷ê,ÜËUß\85é%Äû°Ró§\87FFURÀT³\rùX` i\1e\ 5S\1ccG\bæ\96\92§Å\12Ók´M-\95lñý¾­\90:|\14\88PÿèîgÎÀ\87Ü\86\10\0\86Æ$¼lrHÔ\bE\ 5Z­ùt\bÒçt\1a\83\17dw4\v\86\94ôÞayý\15d9.ï\ 5\10Ø&±Rü]L:\9819\8c
+\\83\10\89\13\18V<lô\94 Æà#C\94Zo.ßaë\ 1As\95\8a£\18\9a\15ÿ5\8f}r\12Þ«\eÚâ2\ e*Ü)A4á¦y\12Jò «ÞÜÂ\99Ô\11î}\80ûÃ\98Às\83\ fD"sÁ\8blH\109 T>z\95\ 5õ:ñ1/\1eÕ+en¬8²\91®Þ¬\ 4¸\84÷¨æÏ@\97ÆbñÄn©ôàù`#ÚdNg\rÁk7\98o?ïî`»XY[ëVk¢À.\92ÝÌÀ»\f\8alÙsíù\ 4\ 4ñ\ 5ζO\11ÔSàýÓÑ:\86Mâæ=       u¦x\119\9etlÞâEäxÙ\86¥l÷m§_\14\ 2ÏfDNëÀ\15w ,!¤óD\r¬q\89\1eRÙ³Gþ'U\7f\9e\e|\9dï\89\9c\82îõ\1f\85ßVÀ\10Óc|Ó\11ûÉì\1eyF\99Õ\ 5Ó2`[é|U\9a!ÝL\18=ë¥Qúr³Æj±,r+ÄÅ@­\1e\1eÛÎðQÀà:J^\bÐr?ô~.\ 5NK9ß\82\11ú*4\91W\89ñdUó¹¿È/d`5\81@.kp\f\16¥XV±\8fd\81\1d\9bU¡K¡.«Å±´ÅÎõ;­\9a\87°4OxkÁôP\8b\97§ëé\88§é\1c àÊéª<Ì7\86\83Þ\17¸\0\ 5h¢[\81CWRR¦\17\85Øî­`øÒùªK1|MúJEM*ZË\8dÛ¦¿[Ù!¾;9zÊé"\1cr\r·\97òGßäbdÛjmh\10\12_\9e\vJ\97÷:¡m\ 5\92\0È­ÌVÙC\1a~r%½\fp\18j\93Õ\rlÓ/NY2;\ 3ûÊ\85«[\86\9biaIë\0b\10ÓE\1e\84\eI¿\8c\93íìE|øÝ\18\81Od[z\ab±ôªw\90\aÃ1X\ 5\91ì\92Tß5\1a\9b\86Îa\84¦7l强ǻ1\ 6+\91\1fÝþ\945|B`æ\8fÍê\90Zûl\13Ãã¶\83Ï
+=8Ü\f^i\15Jòâ¹ÛÄw¯Giù\86Þ¢\1dÑä\91b\82Á\84`×1\93\9fO\b\9a~êºIòæKT¨··H\12
+\85I\80\1a\16\96:ÅÉx^\13l;ÌQ\89å\96½j\82HîN\84£Ufbé¢\87\rn{\e\97\9b¬s\97\èí\10,½>\9fTK«v¢\13º!\17\86\9dÿ/{oÖ\1cçq¥     ß;Bÿ\ 17\8e°¿h¢ßÜ3[W"½\84g`[aÙÝê\98\98P@ (¡\85E\ 3\82\92Ù¿þËçl\99\85\ 2Å*6!  \1aOÛäaV¾¹\9e<ës\9cÊo!è\rU\8b¢ãj\8e V.Ù@Ä     g\v\87\8cÂU+¹qQ\99Ys¯sÓDÖê\87\97\9b\1a\v¸\0í3\a\99¢rtQU]]\13¨\ 5-\fÐÍo%ª|gU­(õ\84\89*\88\0V\80å!tË!¢$Û\9a}\vô¦*­*ÅÙ\10miK\9b\123ãRWϱNÒCf¬©`j\1f\13µlÓÂ\18áÏ\bbE5 Ç\99ÛÒC´\ 4,\91\v%73°\99\93·HP»³7\ eïø\ 5|F9\98ªP¸9È9;sÛ\ 1\8a2èuÌ¢'ñU\10\ fRv\13¯i\82o\9f\9d1Ì0\87\8bE\15Õ\949Ä={C ðì\91fb    \86\9c3®]öÓÅÍ\82Ø\93ç;ª9)Ù[\88§çRØ£\a\ eT\ 5}Z\1f¯Û$\ 2y\ ef\95ñ3à\1dè¦Å+\\1d\8a\9a\17\14F!\aË\80   Z)\8aɪqI\ 1¹#ÝQϨ§$\92GéB\ 5ÙÀöQ9\12²\11a.'\97£b³«\90­½F]s\9f­[É\9fY]^ Ù¨ª Á\958QA\9f4\ 1\86ê4\81é¤z=m\1aB\bÁ\9e?\eobÜ5\¸\9f\80+bº\16\ 6\ f\0¢W\86ï=k \84^¤s ªçÖC\97E\94w\r\815§ÉÞèuã\87×An¸\10å¡ó³c6§I
+t\8b¢\0U{­íìE\83ê
+\1c!g\1d(O\v\92)\90\93    ôAÂ\rÞ\81"$ôftA\ 5\ 2f\91ÓÒC
\ 6¢¹ |0M.\8f\94Ý¡TdË¢$t'\83\1e\12'\rZ\ fºq\ 3\86,G.ë\1cØ»Æf©\1c5G\ 5\ 2ë(\98\90£=ß\ 3\87\ 4gÚ$H\ 5\92Y\87\97\1a§¬¨XI¦^»AjgYAk\Ç\833úÐè\14B<\aãÂ\89\9d{r\aª"µÄlÂw\1e
+K\1a(\a+.So7Y\1d±iFý\ 1ÝÄwÅÝËÁ"Ħ\1dYÃÅ3®ª±0ÉÐéÁ\82\9b\92à\ 6\81\83gu¦\92ëÉz\18q\13d^\91\0\9a4S\1aĬA:K(\13g÷NÃ7¸\12O'"VR#KÔ\ 4\94)oSf1isyÑr\ fÔX°Ø\9a\19¡¢ZLS\9bªq\128\1ew\90\9aÕ_\8a\9c\ e#\8d¥¤'\94OVÃS3C   ¢Íê\18ÁxÕ«xà1,    º\19°×\98\98S\a[jfó\ 2ª\81¼ö\89\1drãå\14ëGd\97¨Ñ5\94 J©"Úæ\81\ 1£\ 6Úì\r\860rúôxQ½ªA\8b\0\1ce«T2³  Ç\80´<\91\18¦½W=>pá\8b#]\rÁÚ&¸\ 5;U\1a+g\0\17X\8c¦\ e\89ù`wµ é\1a³0\8d¦A\89\8aÓ\8a\15\16×è\8aV\80í(\8aý¦i4Xá¨\18\ eI<ö\18U\f¡`\8cÀ\f_Z5&5\8b         ì\17\94cb\10$d±3%\18©*,\18*¤Æ\ 2\ 4\89)"b2\13¸\ 1\e\8fP\80ÚÅçô\8c0(Ç»£\ 5,Q¥½j\a´ÃÒA\99\90\ 1é\85\97¡!LO\85!
+¼9Òö\82n¢R\a\13Õ\95é\rm8IY\84*e
+í{*ozþ\93-ÅðE\12\8a)\13£Y;T·N#ÊQ¼F¶\14\1aÑ>@<R\99v_¡±\92\95ö\80t1xGÊ\93\94´\0åy¬\85\89\96`\1fFNã\19\96\94bj«\ eXõQâ\83\82õ°b3Äè\82Z\8e\b\9cju1\83Äú21ê·´Ø\19Ó\93\ 4\9a\ 5«ï\835\16s\8b\17Y\ f\8b\93Ô48\95*\ 5^©Hp\81½\9a\1d\1aÒ\12¸æ.\1fcgò\84"^áÌ\9b}h*ý\8a½k\8aõXD\9f££©Ì\95
+Ñò\92\r!\83¢\90l;ú\94Õa'Þ¤d\11û¤31ÈWÊ\8aÈ[©\86\85v\0¯\9aÚÇ«\88¡\ 4\84aN\14IÔDæ¹W\9d}*?\ 4º(À¢=\1e)}1­@\1c\97)\98{Û³aí\99@\82¨\vÐ2"\88®yM\9esK\99X\9a^fu\rN "P@,C,y{}ÄPq¤ôþ\98é!Ö;cer\88È\\18\ 3Î\ 6p\13­À\ 2\99Ek1l\93bNG    ýÀ\80ÍiS\a\88\1e\96ÇÜÿjÏ\ 4f\85Äb\841e\81,ç)7«\1f\ 4p\92¤\9cT_ìhÁ¾Ã¢\95Ò´s~\80Y\ 2\88D\9e\ 3?&\91´v
\14\r\a¥\9a²BF*ë¡\ 6[\9eª\1d¨ä\13ø\1a11\98<?Â3\0ÏR\94¹+HU\8af}5Ë6æåÕA\1aF|\13\16Ì\1e©(\ 5\8f0_\vðPÇ\15\ eº¬V°¢zrY캩:\99²ùÁ\93Á\8bce\16\rÙ£p\0\9b\84ƬFFH\90\ 1\a\15+5×\ f«P\f\b5\85     p¥Ù»®õ$\0\va¾x\95Ýqî\8cç̳\bsLA0(¶\14L\85\b#\ f\85ïÖb¼R_£`\82ì\b>ÁµX4tiÊjOÞ\ 4ªÀIÕÖ³ 1\11k\96\13èÍ\9d\19Ø0ÉD)¬\87        æ8õ¼\8c=åi;-Ù\81#!!®h\17Tb ëf¿\ fMM\1f\940ÁD\8d\1e\fãùõfÀ        #\8a\9dG¶(?!Ã\97ñ\r\8a}QèN\81öp\91j\9aè.i\ 4\81\81\83y\93ë\83DNSK)\1apK*r\13\ f¤ØQéy±\1aªÃÑ\18\9b\81\94xs"\0\ 2ºè\òp:Çj\11\12#8!Ö9ð\82\v\8dÜ\89!-m\8b\1e\80¦ð+mª«ª¢ll\86=\14)½B:hZõ£\8eªR\9d¨vÀQ^\v\9f2îAe(­\agaCêÿLËì¥Tåd dø\19¡"Q        l\95\rÅÅ\92\16s\8aFËñO(\92´\98¡Í\96\ 1t\13EL\98ñ¦å\ 5\83W\ 1ÑÂä¦âLÉ
+PÕ8pÏï\1cÃb Úqvߧ\85GÄtyj\17K\87\82\ f2ê2\f\9f&ÙÝ­\83Å°Buß\9b\96o!ÍË\88\92÷\8d/\rÈ(Ð\9bÆä\ 5\83E\8e\93bvع\81c\9a4\ 2Ðp\84«ù>ÁDëtȬbt\95\0\80XµN\1f¹á\9cá\9f[$çä½\8aÅj\ 2\8b½ëÈèmøÑJ\1etå     #"´\13\953F««×\89~m%c\99å?hçÖm3ÞJ:áø\9cX; =ð\11ÆØD÷\v\1cÌ#c°\03R±ì\8b\1a \10L^\8cE«xVqÝ
+Ñ«ñiÒob6Ïuà\80¢#¥ëÃ\16Ø=iôäôÁ\93\a:f¶Õ\b\87gq&"\1fA}ûSD9:ðj*\98 \88\8b\99T%\90\15Kl|\7fÒcb6ûL`ë>\13\87\9dSC5c¶ \16\11\ 6¥\87\8fÔs\1cÓìh\17o×O`\1c\8eè@5\ 6\ 2ãÐ\8c~YüýX\ 6\8b\83%D\ 1\9bÅ@     V\84­\98'üw*} D§¥\17|¨ÓÎ9[\a­!\82\85´\13¬f.ì}°@ù!8ĬuÐ&æ\83e7s¢\ 4ØÆl~®\95â<q\0ôF\8eú`¢fÅD¶Gò\82\rß7i\15\90\9aå\998ËóHé\1aÍ\98X\12\1dt\ 3\f'߶ÑUòÈ\â\847DPU\b÷\99u¡w\82\96\87 9Z]fÑ\9bã/\8dû\15Ìijb \8cÞÒ¥\92Ú\1a"©?\9a\e#Êjtæ\ 6\89\9cªg\1d\8cÈzòSËä\9c\ 2ÿR`\ 5G[Do\96\8d©æ\83³hì0û;A÷ÕDeyn\ 1\ eª\ 2¸d\91 ¡S³Íd¾\8a\v;5\98.¾Ã`ø§Ä\vø¬\84j9y\12\ 1Ê=\84j²vPtûNÓüÏh!¤¡XB\\9c­§a$eÂ[c\8dÕ\99<\ 4ª\90-r2pî\91õ õÍ%ÐDz\88\1aA¤µ¤B¶´Ù8{\16B\9e\ 4Ü(56C\9a`¼5L7\18V!-\98 ¸!Z0Läø\0&\ e(ñE̺\ 1ñW*{¥!|\87¸bÍ,2\84qçôá
+IË\19\92\85Á\8e\19è&^HÑ\13èrÎH,6£\9dÕ$±;\1fF ÜÐW\ 2ðLíûql\83å\84\90ýglCÕã¯\ 6<t[\95qU¹=Xî`90&ú\119«ÇC­Ca\19\8eo%?\9b!³ÜÀ×\17\8eòÑ\81åbVI\1e\fÉ\90Pâ¼·*>\94q\94\93\ 5k'¶Kë\12¨`â\ 5n\1a³*ÊL§\80Ç`e`)ÅÆ\ 2\eð¹¢þ\ f²Ü\ ezÓd)rÞ\1eéYP\83j6\9bA\88æºïÃ\ eÌöB0¨\998\10<¨±_T0Õ\14Ä\10,97\98ø\17 éG\95A\86)" \9e%ÊÅ\16\1e\10´Rj\1dEF@túÆO\85×qøMþÔx\104.ªBSMgiiÉe\ 4ôk#¨&\13jRG\18n±l×$\98ÃOò·­\ 3\rÊ\e)\97Ô«zJ4S*\ 4S%á$\¦E\10¼0Ê\18g\16\1d\82BAc×$\90\17D{ñ\9a©\9dA\8cWa®Q\0¢\84\ ed\ 1\11!b4?Ô\8cYè-ü.±\1aiU\8e45+[hlðæªK\82\89\8e\97\9a{\18± Á\99¶7\15²r\ 6<\9eÌ\83\1cÜ\9406a\ 4\ag\a\9e\vãY\8b\86¿=Íb%þ4x\ 38\998\8cçäh>%â\15\ eÞ\82g"Ë7Ö\83ÊÐqvX\a?YkZµEÖ\ 1#E³)ñV\1d)Ûü¡ÜM0\8cÁOÚ³Ê÷ØÓ¬Ï\9b\17ç\f>g1_\93\8d-Ìö\82&\88¦Á\9b+ 0\92\ 2¯¥SU¢\ eû\14è\96\19iaQ\9c6²OÉæßUA\8céS\ e "u.\86|\ 2û¢Õ \8bV®aJ"\b\8bÅf'Æ \90ÏYM\ e\9d\ 4`¸Uè\9bÌ¥¨Ã\92õÞS Æ\91Ò5.:Y1yߦ\k½\89è¡(Ç\9e\ 2KQ\84Å\12°U\1d\ 51i\ 6ªÖ\87÷Ua\9cH,6\v¸¯\16\86\9d\f\8eÝ·©\86\88\95\0©&mçÉ\b\8f\ e\8a:\85\83x>½Uì\ 3\18\83Èö¾\18 Vf@Lé¡\98-%\9b=\8fJ=\18d\82ÄkßY\f\88éj\85Ï\16ìå­n\1e\88Z5¥\18ú\8atk=¨\1c\969\9b×jS¨\0]\f\92\17\ 3\96åÉæ¸@\19\11\11\0
+Îß´À·ª1YÍ\a\ 1cä²åN×XDpÒ¹µx\8e\1c2èZÏ\85\89A\0ä|\9d`Ľ¤FS\11\11\85ó\99ª*ú:uK%{\988P\85\15\81`½lÅ\98\9a¼ê\95½Í65\95t1\v6*{\83ùi"bâøgÅ\12\9fî¼o\16x\a\v\e ØôÕ¢~=!³JË\8cÇÎn¬À?\ 3ب-zc\9b\98\99Ëð
+T\85\ 1wyz1Tµ¨ì\1e;²w@4²ÆkÉüLÓ\81\9béÍÁ\12\9dÚ2Gâ\92\15ëpØRÀõ\9bÂ\96EÁþë\9c\f=P69\ 4\8d?@\ f\88è\ 6\94jéo\10\9c¢â\8bi(\ ­@ ­4\9b<De\8a«\18°Á\ 2Î\9a\r\13Å<\føK9¾¤\a,\8aÉ:\f\16!hF%z\1e"\92·b.~\88\1ca`¯\r\7f\1a\ 2Xj
+>Þ'Ãl\9cd\ e\12>X\9e\1e`-D\8d°\f¯\8dE\8c °¸b²\85W¨×6i\80NE\1c\ 2xtz~\fO_Ê\98\82ÖôKaR\9dÜ\8c\16+Eúp¢\f+n)21\8b¨'\ 4Æ\98Æ\1c¼Í¡T\93\86ùbubH`qN÷l\99Þ²\ 1WO\18ØònU]2Í\ 2CÉ®E\89S\81\ 6<E\1cZ¹z\80ý\fàªë\v\16\95\15G4H\96\ 4\88\82'8\92Áü\14ðt°\r¢è\9d\17=\89°_-}  ÕÄØ×C\ 5ãòÓÒ\14\98\8e0\96uP
+óÚÚô\88H\12,A\ f\9a±ÕÏ\98\9atZ\8c®\ e\95\81ï\8cºJ\8b¡æ"\8eã\19×\87\1a\90\84#ÊÎ[¬Å@gö\ 6Ý@\98\86IGì\ 6 `L\13\ 3Î\86àYÅ%\8dy°        \ 4\v\11½>\ 2\8a\98ë&\fZ_U\19\16¸¨.\fZVÚ­ÒMãáÍz±'\17\1dÖÆk5c'\0 \90\14¢V¹[DÉÿ\892râ\16 \92lY_B]])«-'¤ê·Â0\88yÃõÄ\18¤\\18I\89|Y\86W+,\8aÌÜü
\ 2Ì°\ eXK\96A\9e´\8f\89ê\fYPËÇMq\98£\80.\r·è\bôüz+\91\12\16«?î¹bÚ\10^­B\8fF!c¸,T7 \eÕ±:!º\11@B\8d\9b\94\9065g1^\18\18\99\88¼LaE\80v\1a¦Ø¼\19IÁG¢\961$®(Ä¢Å\ 3Ó\88~D\ f¶CZ¥2\98\1f\9d6\9ec\11µuyG\ fòVX:} à§&Ë Qâa\0\9eSÌΤ\9ejáy¤\8f/n<»zÌ\ 2ëÃò®ÈÉ\19
+\8a¸c¹\834k8z~\83 ñÝõ5\19\9aÜ5\84\91\8f\eZ¨7\1c'\f\81óº©L¤)½EÀ¾Ã\8aeÑ@z¨vxHãé\1f\85\11ë,\11\b\8e\ 1\86L@t,&°ñ\9f\16\82} aÀ¦Ç9ºeØû\80ÿ,\89ï!NõÐÌ\10\19Õi×â\9c\9e\11¢½.\91¡«Í TìlWÁ$\81½Êjc©W4¤©äúÄ\92`
+\94å\1cU\ 21\11©#eatS\a\9eßM3®),²·èÃ\90µì5\1d §æ=I\90lqö®\80Î\ 1­-\98´\eÌÉ\84\99õ  ÿ»¶\1dWQ«\ fÁî'\8c#
+4h\80\81PÀ~Z\9c³L\82%Ò¢"\94ÚвU\14\8d\87Ã\9e)q(è`¤Ù£­È%Ñ\82_aÅ\8eZáÝXDQïE'RÞ¥ôP48Y\f\rE\91KhoX \bÅð`W\È¡Z\9dMËÏ\fÀ#ñMÏ\12×l\86¹^J\ 2Fö©H\aM\83ó§33ê\81`RRH3.V|5Î\978.Ó\ 1\vRù&.\1aðÒFxl4k\82\16ð²1\b\14D\eVå¸h\:f,\ 2M\4H\0Ó\1dh$¨ç\92õ\ 2*2\ 25®M/ZÕ©)#  \9c\ 6lc\90H\1cô\90YyD¡\12ÁV\ fÃîÔì%\ es2~\14yU\9e\e\vò¥\1a\94N:ltêÃÁk
+Çé ³I
+\ f¢\18Ü"É8r\a§EnV¦uò¶Àe$\87Ú\vp#¹\8cTx\95\ 4ËgäÍ\92\98/-        kþ°&Ek\83\ 5\aƤ)\84à ê}Ï\1aF\88\96µMîEe\ 4Áìüä¨\95\85\90¼\88;\vÅ>\9b\1d\9c42¯\8eÄZ´ \ 6ã;\12QLxô\16ÚÕ\80O·ê\93áu\ 6bQC§R¡\13^E©ÞáÙ\ 4*¿\8fVäRpQ¥SÛ\a­X\ 5ÿ£\94\9bs\8c\8eas\18\ 2¢"\eÀ\83m\13\96\84ÖX&±\86¬­æá\97B\8cZùw\8a\82Å\93ã\14&\9e¨r\8chر\18\92\7f°2V±j~\b\bçîô!Ç\90Dy¤t\89¼h£H8B7ä}
+\16î\8c\91\80á>0\ 5%
+\167ßç\91.\99&¦p \7fç`\Ì!\8e\98\16\ e\94\87\88\17FQ0gÓ\80é\98\11ö\92Ó\14-\8cµ$\8dø\12\9f\82Ê*Ò\83Wc\ 5I\e\16\98ª\ fl0\10\ fÄ\8e²¹\90\8eï2E\84\8aÛ\15\ 3Ö"fAC\92Û\80\80CU»¢·\8ab¤¤\87h\1aÊj\f_R»Z\e\89ö\14\92\82\96\10ICs\8aüÐIÏ\86ò\801K\9d\r\84/ËëäMçEà¸Ô\18s\8cZqÂ=Ô©\94¬E*\eÆ4î¡V·[+\9e)c\802¢=k}nÊ\19iI¯\86Ä\8a6\85\9b<"Á\e'¤ñM\96\9a'\94c Ën\91ÜMíØ´G#Zº)d\ 1\9dT>iy.ãjyi\8b\15\ 3\8a\9c\98É=\80.umà\86O\96ö´(\10\12öÔ0¾òb%<\82åꤦ^Â&ø\ 4L\94\80b\1cÀ)\11Îi\8a
+)*NSm´D\80g\a\89\f­(g\9fLïèaQ\16ª¾5$\17    pº7KCvf8ò\ 3V\983\8e\16UØR°Ì\17\85§\8aoL\8bA\19Ø\ 4\81F\99«Nïg\1dÅMýd\0S\89\10ópZ\9b}\91âLëELm?\86qBsb±\96Vd°\88þ\9fG    _2ÕL\e*)\8c£\1aU\86]G5}­\ 5\9a\9dÌgs>\96\96^^8áwLÎ\f\vMlÃÙ[m\ 6ÇÐ\1fL\94BÒ@Él£*¯\9f*ºZ¦\97¼ÐÜ\83ÀÆ!-Wtß\95ê69h\888\95´\91lN\ 3ù\98\f\vHSmº\9dmøU\91Ãk{o¥f½\16mÅ«î½f¼)¿]\81×ÊÎìW\83\93S·*©©Ë\19D»t\93.\0zÔw\8ejAXN¡3\96k\19\96\96\v@\ fLÐüH]\870Ãc"·Öd\99d.ølÞsÆNÕÔÍÅØÏ\94Ï9\9eÚ<\9dx8ë\83¬\90¨¿Hç\fª¦¨\9e\9c\ 5\ 5\94\89x«O´\83È\0\8c\18±âU$³\18L)ʨó®=Xi\90\80|xg\8a\ 6\1d\19\9dÓ       ¸À\10wRl\9b£ÅÐt¢\14\86»µjU]åØþR\15\ 2@%¸)\13®j"p[     \17\ eå\8bªnd\83:oqäTW³²\aráÛ\10$P\ 3\87J\8c\92\ 4T¢ZP\10\83JY4Ò\9dë,Mp\1e\12\82Õ·¥ªÒ^O øÜî,+-ôªÊ\8d\14s\80\92\9e½(ÂC¶\82è\93ÚV$oïVùt7\95\ 5×\bÀâ\14²}u¸Å,5e\82Ir\9aÓ:½sÀ\9ep:\µ#\ 3½Â«ìFá      Ö\83$\99\ 5\80 ,Vô)Xêq±\98\9cæ³+NÃ\91\9a\v±¨¥R\9d1@ò\88Êbê8$\84ãÓTjQ\f\95ʧ\87\8b@|L{XfØ¢hr\8f¦0\16o\95p\82E_\15°&/£%\1f¥\8d!\173M)2\947\9bE°Âp@J\19
+zÉ­\12÷\ 3\aãSE'2\1d\94h@BÅLim\82\8bò¦µA¢\9c\ 1Lʸ¶b®,\88\19^T]\95\88Ìb\95!pN¦j®°iåªçÕ\19¸\94¼gÑ`¤¹¥Ú=\92\9fz\10P Àu{\83¬\92¼?ÒååÂ\801xù\16\19\87hjû\84ò:\eÓ´\14b\89Z7Yy\97õ\90\8d\9fh\12\ 4©6A5E\85Xh\9cûl\1d¨M\90\ 6\99¥m\ eÚÁ²D\85ùÒ\82ìavW\15\v6j²zÜXb³\89M9\9dY4U{J^\ 5&\18ç\94\91Z:\0{\82\9d\90d\b\ 4Ke2o4ó'N&S \93\89¸èÆ(¢\19æ)iM×Æ\føÅ4û\92&\19[³7J\9c\ 6­\eÍu\13æ\80 \92&O\84V\90Åç\8cmØ9M\87Ê`&L²ù\89%\99çHé\ 2MÙF\99y\ 2æ\93\v«(MY\818É41\16\ 6e`\94Ëåh#(R\871Y^\1d°ä¤\8chbðgë¡\8b»ÒX\ 3\91A\94g7±\vl\8d8$\9e\92\18\1a\99dÇ    ·\ 4_têzT@ðR&q׸ÜJ©ç`\89\8b\13¢r3\vR\19\95J\ 4a\88\89¢»hñu顨\ 6OåÏ-\ e\11Ã`b\962«@D\96Ò\1aÍÂüKÕèbrÖ\9a\ e\ f\1cÀQÚn ^J\10!ÍÂP\ f\9dÕ¿Zݸ`µ\95\14¨±X\10B\eפXnMåÌ%\e\82\82fµñ C\b\8a\12ò I\9d\02\94*Õu@\0ceX\19¡À\ f\81S®Ó¨4\b§4\8bb\94â׶;\8a^PW@ܪÁ\94W\vh*\12rÂÃPd7\94\86©\12ãAéÒ/´\a\8dܬ\ 3â°\19:¡ÔN\15bÕý¥0ïqrªV\90\9f\90=ÖK\82\e]¢M­À^`\1ci+\9fªK¼V\1cù\ 5\97wæJOMëe\12ë¿0z²BÓ%k\ 5¨©00E92Ñ)1k\ 5Km,'¶XS;XV1nm\ 4<¸E*;C\12]´fS-Z`;[At\84&IÙ\88²X       =Xãد\ 2ø6«ð3Eª\934«eÁ      GU¾æ´Æ\9b\1aLÐâ5Èr³\ 4;\bqV«\99â}\r\9a¬Y±:cÝ#_\fö   \95íFAð\9aË\84Æ\97%ÚlÔ¯ÍUåK,\84ÂwT\v¸,£â\rÑûé\96ÆZc%\8f\94Äb\81S\98±$¨\17\8ehxq÷º\1fiIph"R<¥Q*Ù\85ê=jÌ^\8c\ 1\90En\ 6\a\9aG\90][\ 1}ªSéKI\96ÈÕ²ß\9bUíÍ#\ 2\fµ;'¥e\14êÔêè¤7E]c7ÐÐV¦ÀgN«\89ç\91L\ 6\16ÜÕ£\8b¡\98iÅOµb\92\ 6¥\1f0U\e\81k\1axA\90\16/ÞÑóÑÊi\a\8fµ\ 2â\94Bvat!ªH\94­úhÕz.\ 4Æ\9b\94\97NR6j\95em[\92¡ôJ   \82j\a\12\ 1\87ƹG>\18èRq§\9a\19h\82ùm\86\1c²>\81\17znJÒâ³Ê).LÐ\88Êø&\98\ f´gm\9c\1eH6l@ú\bZ5^1:ð\9cK\mc\7fêxæ\97dûU´q*Zó<J
+íúØÆ°½r\1aªKìô¼CK©Zà4)ÿEü\95\ 6:\89Û\81°GsQÆnyÔ ÛR)\92\1d\0LmÒ
+\rAP\8aÞ^ÙñdÀN[ôrxÕf4ó\84.\91\81\9c\rù\90\13F£fG6\ eT\92 Û5T[4)jVî;Îê\97&æ4\16\7f\99(OÙT½\98´:\15£f\0Ë\ 1è7OB\9f17ì\ 4Á,Ü\vë]C\v\95°Dg&jôÀH\18Zzýέ\½÷pâ\17]\ erS_\18]\92\1c\9b\19
+A\94\9cÁQ@\18ù<Q\83/§eB2JÕ\8aÐnäÔÁ\91/Þ/©¥ÉDM©i#\7f©Lñ¢uJj(S¥^­f\12¬n'ØO5w¹Â\ 5Õ\95\98ÁÂQvL×°Îb`\fm¤k ÒXoê2\92r\11y`qÂ\82\94\81I8\r|TWÖú\ 2¯>öÑ\eæ±ÔýºPºæÜUf\9bB\94\ 2\9c\94Èþ\9fÜt 84C¿¤´Q\95\94\8b\ 4ØǤ\15OW^\91\98\96bì4ËQ`JpvÅ\1d\19§\12ÝS5)´5ã¶\eÕZ4V\92|Z\96\9e*Çk420£\1e\1a\8c*TÀX­náx(­¦ºÔHÉ\14Óæ°úcY8à¾9F\19\9aC\16Îí°\1e\94\87Q4è\91RÕÑ1BYcPì\93¶Xb^ô\9aÖC!\95#yÛk\12\11\15ìUßx4a@Ñ$¢a_S\11_ûýÈ\99j\16K\b\8fû¸\18"êÄ0\89\ 2\11Ä\91íS-\11%zK¥j\ 6\15\19\9d\ 6\9d\1fkã4y\86\8eìX§ÉÆML\94LT\båf\b¦\11>\15\95"¦èßHþ\ 6»áA\eg\ 6P "õ\829á8Þ@4Ò\91hî&uNÃ=©±:4ü\14e"¾P7§Ù nCl=\8b  3\b­(\1a¨«·\87\826Ô-Ó\92YÍB\9bì!Óç\16\16G\9b\e¹\8fMq£È\9f?\aÛ4N¸ÃØ4·Îʵ\83ù\8bôK-u\1dÜ(k\84\9eí
+ký Ðô­£\90Z\16\8200¯|\99lTÖ\83&\86\19\9264Ãui\96\ e\13\9a\81\ 3\91ójë\80\96£
+\rz\90J?Í°ý\106´è«¯èy\98rQNF(¼'ÚòèqÕzwX\8a õ\88\15-$\f\b\91:\ 3_b\f\92ÌWI¶g\9a"AT\ 3Ô   s\8dâ     \1d\10t{2üÈ\83\8b\v\93T\1aÄq\12à\96j9L\88"\92ÚEuTµ%úȵ »Ã3I \8e*¥.E¯\95D©SõgS ¢³r9\95ó[ìn*PnåX"&jÉ¥\91\9d²þ\0\99\1c\98\15Ú\13®Ì\85Ò\15"³ZÍ\844À= ?G\85\92S\0=Ùzq\9b\ f%®ÍV      \95Ec£
\96\8a*9i$Æ6öàY`B4ï«\82o¦lÐòÍ\ 2v\11ï`\19\eu\82
+\fO¬Æv\1aÀs\Ū9s&\ 1ÖÉض\81\9d%\15P¨ç\ 1-\95-úÍM¾Á\94Í\90î\fk%\e¯q\ 3ukD%ºY\9eLy
+oÐÀ¾T&\8e 0\ 5\0\9ekjí#A÷\85®»º\ 1\aÖÝ\88ê÷D@Hm\16¡\11§Uk-Kc\r ¦\1eÔ{¿,Yg1ª¦\92¡h,\91þÞÂ+15\vÁÖ`o´dcAó·Öw\ 4\8aä\ 19\9f¬à µÏ
+øç\87\r9\19(^6ÿïTÇ\85O\95ú'Åy\95\12»Ö\89¨QX \9a\97Õ\rË     è\12\93¿b[&È5\r\934|¶d¦{oV\1d\0\93Y\80ŤT\11}Q\v¹Æ5EÅÐ\98\ 2Òè[\16Õ?
+2\ 2DL¢\ 5\86å?Y9E|ÎÐÆ\8a\85PM¡Î¸\8cö5­úF\98iêÓÕ\18#d!g\r,\84\99çÄV§éÞ\eÂRV\15\8e\1c\15Y\89\9a÷á8NÇ\860\1cvS\95\9b\ 1¥6E<`}\99I47ð)áVÒãN\8f°õ¬ñ2\8bÅ\rcѽ>ï*\9b\ 2¡mÑ\90¦yy¢Å¬.ævLÑb\81\87ñ\b\10~lY¡l±)\12L`\0)oÈÀΤìasöä#\1aÍkLÊ\145\99\9cÚ&\89\e\ 4[\1e¤Î©IÕPV½"ᢱ¼î\ 3\80\8a$\ fËðIn\96\81\v\80\9eu~ÄR\8c.r*åk\19X\99\14\96¦ØT\9aq\88ÜC\ 3Ï\1f\18h\9aë$\131®­É\854¶(«AE¨¬\ao\86d\ 3ÂsS°¥±;\ 4óèÖµaVO#©b±<\89ä\14\r      =\b\b\8br\±Ê:\90\82\9a\14_\935D1Ú2\18·[ô\rÅtqèøΠîÑk\92dWRµ±"\7fµq\13\17Ã\19n+xk\ 3ì\f\19Y¦õ\88å^´ãf0l&ª«i*\8e\9cæ6\1dWBÞ²×] ´\19\86M­ãò¢\11d\9c
+v¥X \ 4è¦0,
+6U\rB\112iTXªÔ4_vÊî\8eŲ`\e\vÊBLJÔ,ù(Öt&\ e\14¢¢i\1d\18\9a\ 43\ 2\8b+«Ô\9a¢\ 5\1f«|<\87¥f\ 3ÙoÆØãÀ\8a!\0×&ÄaVñ£\8cj\1c\88&Í\÷q8\1f*×Å`¢¢ÍÔÙà?â\84!_BX6¸­jÎ"\95.b±|ø\91ú\1c-\82\ 6-'Í­\1aø\13\92Ê\86Ü\89Tdµ­«\8f\1dPnbLªV½<6Ëß/\87ÃÅ\ e²à:\16S7\0&'0c\85ã9\84Èú\11\fþ#\f'-V;¢Ì¦\874\84ðBe"\8c\1f)\80\e3èâÞ*<üÁ1ŵ\845h\86À(Ö§jª0\0"\8b®ÑT;\8bèÍ\9c\85E{\10\1f1mvÑØb-\8d×P\8a|³\1c\9a\96ªï\89\ 2\98\97º\8cÀ«\1d-'\98ÕQ\1erØõ7 ú\19­ó\83zX\19\83V\a\aÇq
+\ eºH\ 5¯ÊéÉLT°Ï:ÃÌÐ:´Y30TMÅ(ªVf5y³è\v¾\9d\8eÁ\95i÷Çì\8a\9dc\15ö\11àç-.:7­\9dUæ$EÐ-Ù\1eÆv\99\86ºW\v'\8c\v\v,,\9c\9aРÁ\81\94®¯r\8b\9e\9cÌ\b¾"\9b
+Èt\99C¶ S9u\94iq²T\fF²0\94\17÷à\9a\ ev\ 6\86²\99¹z\14\13\15\f\18ZOa¾hz\85\17³b¦Q\ 5²\f¬\7f(yU\96Á\8d\ 4\1c\82Z/\ 2Áf\90ØUê7Õ¡\88Q9ae'É\18Õ\88Ü\ 5T\ 4Ä      \8b£v\ 6\ 2\1c\82«¥Ú]1\90Íu-x(È^mJ\84\ 1QÕx\9býdDÐJKÁ
+\1aÕQÚ'Lº>\9d\rq\9a\ 5«RY\rj\93jÚ¨Ã}&
+ Qåø7ëAAD+k·\16á\1a\9b\15¦>\879ZCv$\aVãYiö£\ eP0(¶6\17È\90ü>\92\ 4¤\18B8Ô·v¨\9aYbÓV¤\8bláR\88R\90ºÞ¨*b>®¹\fÕ(«S\19\ 3\92\ektëb¶\8d\1c\f¸cÅ7\81â&^³Õ\83äÛ#D×\84EM·@1\98:\84¯Q,\ 2¢¾
+\rʦ0\8b¤æ+\v\81O\86°ÚfHþ\9c\fÞ²\19"'Âq\85q¡±\14RÉS\ fô\84I\ f\0\81Ô8\ 4²z1Q@KÉ\96_5$X P     Paì\ 5\80çTh¶EÃ]¯j\7fÕc\96-ªsaß\83õ0\89Ý\1aa\9b-Ãu1\98#\10\9bÆ\19\90ú~»\a\9c=) \90³\19­GøPÎV\ e½Íø\v¹h@ï|ö\8a\e\92V.öÖK\94\81õàEôi\ 6\1a\ e¢ù]5×\1d\90\ f\9c\9a\\f^ªñ\18G`´ÍMEª\f!4\8bJáô¬\97I+"\vá\89ö \15\b\86³\11uÉLiÓ\88+Ô@\13'Ì2Ûÿ\11rm\16cb\8c6¶a4ÒÜ\17\8b¢*XfGÑÚ«Pa\96iÙ5AÅÍÕ\97\ 4Î¥\8d*Åã\0«oÓ¶>%ýÚ\YÅjáÒ¥Ëz$46Ú¬d\14ÿ\1eu\bÓ\89\88êN\1c\10\ eÄ5,:Q;\rúL¯Âi\80IEuå©[!\8fØ_gÚ\ 3غ@z,+\95\96ü\8aû³h­\93á!\\92\95/s\8b\19Þ\a
+/r5\8a
+\7f\1a\98\93ý\14\ 2¥\ 5\90³×8\142¼ÏÕÒ¢×\98\ fòû[\1e\89V\8dl\f\91fôTÕÙie_F}¶j)Yë\ fߪ[¹Ä©,\fåÀ\\18Ý Þ5J\9f\88Vº'h\84çÀù\9d\1e\1fj;j¹Z\8céT\1dg"\1aÈ.\11_¼ch\1c\8fòÿýc8e\ 1¶Ñ4l\88~{¡tÅ=+3&V¬*¨iÝR\0\86°¡\8bäBÓé@\8f¦\9c\88¯\bx\1fKQaQ\96x}\f&vø2éS\10»ltÉ»\b\97Z\a\12D\ 2kâb\0\1eJSÑp\ 2³£ù-"·LØðk\1f<\9a\86"¸ö\8cB¤ñ\ 3>«ø¡^&&\8eÃ\9b\a\fËà|\14äúB{ÐÜ<gF3\9fÍ%\f³\8b×\95r^ïeK\96Ñá3£¿²IPôgt\9b\14\90Fq\9e}²\\157{ù}Ò\10G\8cMj`ù2¡4\85bÄ[ë0ïV´l9J\80´íRX&ÏìÄ\16[\935<[.\8c>\8cÂ$]\1c½£\7fÛ\9d`vdE͵è\ e\89Ô\ 6 ¯p\11\ 4l,ZØ!\ 6\8bîÐê®\81\1fÁ\11Ýá­\8a¡\84î#Öa \8f\e\80é­!¼ÐHÌ¥\9aõ\88+òI æ(S%¨ÂGL_,\82-pl<úhSÅ\1cÒ¿îêØö\ 2\91
+Aë¸Q\ 4Ó\85Ò\97¢t\9f\17\8d\15(A\8b\9dið-e»+\ eäTx\a\89íE«cY2´\81o\10Ä`3ôoëaª¾¸>¶£iØ\1aÛèÙîhÃ\96ìÈ\1a\f\ 3\91ÐÅ\9b°HºPL\D\98\ 1ÿ[òøh²ým\92x\82\91\18¨²\85=D+þ\1aX±|ñ\8e±\8daÃâÙÔ]Pí\15\80\873Z²ß¨w\8eö\ 6¶à\87=r­\9bñ\85j `\81=\1a\17j¼Ó\982A[\19Ùæ^K?\91ìuô\8e~Æ'\8a\95}\ f|Mßó\89wÓoõ3¯\93\14¬§´-\17Ç:iμ`5\eðC3\98\16?òC×û\99O\902\ f2C\97q\82\86U\9fäË\11ùÒ\14\r¬©«ØÊ<B*Z4&èVÇvÙÒ2\95h!\8bò\85ÒµÖn`¼\3Ðåjõt&\1f\ 5R\9e\15â\97\8cJGïè\7fL7[V\8fg\84õ\v3©zÍýÓ\f~\80$H\ 6ö(²\ 4t{§\89p\13¤ÈÝ=dË\9b\1a\ 5d×Ç0V\ 6õ\97-\bÑÙð@7-Ú*%Í`v
+d\b¢\85ÔSv\84y6\14-µ)l\vz-ªG縨·ãÖ\106\19\9d3åt\1a\9dÖFi£nÚ\9a\17bxn\163\7f\9aPPQ\98C\r\7fjxð«\8e\80õ¤ïi\1a\8dó°Fù f`\80Â⨦\90
\12
+\f\9b\9d©\8ce z&o%lÐq4Ð\86\98Ìûb\ 6Âj\18\85\ 4°1¬\89McÂmÞÞðr\11)\95\8cø.kkQeTU>ú\9c\19\ 6âb\ 3K\1aø:á\9e\16Òoui¨\84¦é¸VtìÖ\ 2Ï\11!ZÆȱ\13çB­l* :\v·NÍ\fîÞ´\1d\10\93\96\19\8a£~g\1aè¤VÄ95«QáF\99½jb\8a\9b\80åÀ\11\13TvÎ\80\11´Â«³\88ÕõI\8c³µÖù\85ÒÕ\14å,Ç/\8d:H£.7\15àã\8dr3~\15\1aK̼\eÎìªá.TäÜùwNÐn¦F»!;·\84\89o$Mò$¦4|\18\86\8bä\9a\89\92ëý\1cM;¬\ 6m7_~\0\188-\14¯A\8by10_§\ 2\1fÌ¥R\80\rs\9a곦¨¿7\9b\853\17\8e\8fvpk\ 4'ÓöTCÒ%ã¤m\8fY\14\r\8adÄK\196ÈȬ¨s\0\1f\1a\17\8b$\13Ù\8d¶\1w½A\99¬~~¶\ 4O\1250¸Ì\12\1c¬¤\95ÙǼ¦¸Ö\91®\99¥\»\88ma\82l\18\14^  U\83\83\96ÃÖ\12Qëc\18\a\a
+Þ;\ 2¹PK7¨/«Z\8d%\0«\b\v©ìÿ?º»\97£ic\14\12)2*\8dm\8cFA\1a\8aXj\96\94\1fL-C\aì@@\ 4ÉT)³\19`\ 5\80ú¢²\0       (lS½³¦\12.\88£2иº\94þi\15\ 6ãX}¬µ9ÌËw«o[?©¸H0\83Ƶ\9cEúX$B3¸ÆÀ     \9c6?)¨Ü´ÌA\1ay\96Áà¢ï\9cÝ+µUiðÍÂ\91¦\17f\ 4Ëj\10¤2ñB´ø\10Y\8d\9f°qKº\18\ 5ãUm\-\8f4Ê]Y\1fÂ\18\9d\9b&N*\8añ\135\1c\8bÐu¤í\ak
+\82ÄE\ 5\94
+Ñ)BIWÿ\fôÈÏÐ0\8c\ 6ݬ\96T¶bx\ 4¿á\f±¦*\8c[\1e\11ÁëC\9e\13ÁT¼rl\17´4)5K¹¹à\10ÚsT\§\134ªÑ\83\bH½½&h©\rÙ[^Äú÷^LC\19O.5ºxß'\93\bjnΰKA¹²Õ°^ëy|4\18°ÂÂ\11;\17J×ØÈ\85\ 3w\99(r'\19º\9d\86b1Õ|\85\vÊ\82â)UãÙ].¨;Ç`Ã\ 32\87Hj\9e#ò,u²\8aSYâé,mQ%c?ûþ×û±\13PHjY\7f\1f)+ÈÉ\8eNJ\r²r\8a¾fä¬\1a\90
+âá\93b
+Gïè\7f\1c>«§Þ¤ê\82ÍNÁN£E\råf\11UA!°³UsT°\97\17¶<\86R[\87\82\85\ f\16\85 Ô0\83\91\86Ú\ 64fnª¢ák\ 3îo}È6\eÎ\9bQ\81\ f)\91\17J\17$kT`\14»\1f|ÂV$\Á\1f\8aÛe\14A#϶\16­Ôh\11òK{y^UE#§´¾¹\13\ 44\ÍNï"yï\8f\94®Õ,¼yý¨\93*Ïn\92¼!ÍM\r\³ÔÂ[ÔoÏö\16©I\87Â\vV÷M+\ f¡\9c\83Ù[ÂH»®\ 6&P\a~\b\8a<T\1d\ 3Ù\f\98¨>JÏx°ÖC\1ae\94¥\8e\ e\95\94Ð:Ê\ 2\ 3@µ'²t0\19ÿP\17#ëÂ{\ 1\7f\1c©\94\9f³5MO¹3\1c\fªï!w¢YSuØ\r\11\9b*¢ðr96\97Ûï\9d       Îjã\ 2\91½\99$ìk¯Z\91ÆÍø~ÕÂn\89n"Nµ\10Y0æbk£\15w\9c¡³`
+\92\ 2¾MEC²²vq¡¡(\8fWAYU!\9c¦¦\93#àBëAKFQ56=ì"\15T       Lbâ`\16$uÛ\rТϼ\12GvåD÷r\94þ5ÈÅ\1e£l\aX%L7ß8]ô   \0\ 2M\17\1d\9a\ 6?Õù¹QHn\8e[ÐU\1f/.yçmçª!\99R´~RõM¤g\8dë\17¥\81\1dy\14\amªABÙ0,²
+\82¦\10¥\80¶³\fë6\8a¼:\ eA\90\1e²Å+°>ÃCkI¡\84p²%\84 %{\ 4Æ\1d\0b\87±#7*+5©*\15¬@/\88Ñl`Þ0¯\0cãõnN\80S\84ða<MÌ¿\f\1c¢¬@ä\b\fl*\19n©9 W³\87
+0\14z°ª|Z\82¤\r^\807Ââ,ñäHñ\17\81²bb´²åE|Ëxs\82.N3\9c`\ 2~Ò2Ê\9a©Ò\82á7\fÄ\14B\83Rn=¥æ\10Ш\969Ê¢\97\80>L4\81#P¸ñb\95F5\17\1aáðcÆ#\8b¼\8dø²È`YÖ³«Z\9c\88\89\94\f\9a\ 5Ã\9e\1cæÚñ\14\17\ 5ºUü#Gâ\91\1d× /\81F\ 1Â5möO-ÃÇ¡¢ú\f\fc\15®L²\12Ø£F
+\8c>Aké¹ \1c¨ià?UO\14ÆÖ¦\87Ç|õ Z-UÝ\11Ê(,¶>|\01²b%$ýÄ%´¢54 ä\ 6÷\89VbZ¯\ 1\18\98\94³\92\ 2õwJ\f&ø­?\96\17ÆJ\93\9a\9aÕÆF\15:\8b6\96Ø<ªM¦5±&´Lj¬õ!5D\86ºuóçÞõ`¿R\1e¢É¼\8eÁV.~\92·P±Q}\1f\ 5
\13õV:\81"¹«ã±$$_\88\fC\ 5ÚdIâô\98i\18$WéÍÊÍ8´\1a\e\9d«Yw\fW\9c\8a7\ fS\90IÓ W}\1fÔ¹O5ÊÔR±È]\ 1Ѫ\98\ f\eàú\90\87´\18\15É\eoOlc2*Ø;\vªÓª±Ìó%pç\9d\82ÀOL\86\13\98ñ¨É\ 1\1c52\9dE\80®\8dìÅ4fálð?#\fÊ\ 6-\15}\15êyÈ\1e\ 6\a\9e÷z?³\10=@L)ÛÈ\84\15Az\8aàg@ÌÔx\1fÁ.C¥,\9fí÷~\12¡\15µÐYý\84: í\9dU¸X\1fÁ|)Õ® ¬v\fNÐ¥â̯AÏ
+/I\1eÿ£wôcóo\88@´z¨Þü\7f­i\ e1\ 5\84Ú\9af/Q\15ZÖ&ÛÈë\f\9cÀøB{Ð×*\98\ 1\11Ý\9a5OóFÖÇ0ßû¥©\87jBUiEí\19ô>Ê£\99\f:Ék\18\f¤\fa\8dô\ 3\13I4:Ôsä\95ñ\rµæ3X\9b\91Õ\eãÙödô"ø<Þ|ø\9d¨\15\11\81íÛ\94Í\88\1aGz\8f]ØV&߯B@µQÿÙ\9b´Ü\8aE\11ù\19±­Áê¡\9aöTƧUE\7f¯R\87Äè©.ʽ$¥¹U\13¹½æÝ\80\16uÈjÍCl\80Ó\84\1eZ;±ÔtºçàÃÀ&\ 2\84DPc\ 1~üéÄSËÉW¬iòÔX\8d\ 6\9dÚÂuéäl\10Â\15\135d7°]D:XØv\1f\86fÇ=°n^\ 5S\8e\89s\91nCåÆ¡\95HQϱµGÚ³¦­H\û\91µgx\:\19\1cº\84¥·c¡h®\r6p\15Þ¦âÒ­N\9b]kÕ\1e\80.ÍL¢k¢Á!S.Ck\ 6Ô\12,P³\99\ 6\vñ½ó¢É\80\9dú\8dÕ/Ù\8a¥\e\ 5Nܺó>ÎÁ(Î\14ö\\84\932=©ÂNa\ fGF/\1a Æª       \13­P6\97漫çñÑbJD\18î&¢«§5\fH{êJb )°¥Í\83yÇ %\80`><ø¨\19\10<c\92ubö*\13E/á÷w\8dðÈ\ 6\9f-\92\às.\94.eF\94\8f1mD\ 1y\19È\PÛ"¿xö\16ÓÃ\85ϸ\87E9:\83\9bRK­º\1e\86×\80{\10\97od\ 1\>'ã
+\92\ 5LDuK\ 5¾\19/Þ1¹1ï\0\95Ræ×\0ýx¡tµQ\85\ 1\93AüBa\ 6FàÇ\9dýÌ\9f¸Õ\95}B¯æêþ\aÃ\8dâÀ\19¡y\v£"\8c\e"\ 6\13}M\85zÇØe,Ñ¢/¤\10Ò\85Ò5íD­lDÌf\92£×\94\89\8a\19xúÅ;z\9e\17@S\83Â\10\9d\98nòü¢\95ÍÞÑ\15ÓUQ\9b\18\12qA Ìïúâ\8bi0·VÝ\ 6#\99¯8#\84CÄĪ\9a\v+\9düŨögS.~b:wíó+ÕÃ4\9f\99\v\16]¨â8
+\ 3M2%E  /\ 2\90ëÀ\91L\1d,æO\9a*«®u?D-gÕ"Ã,ÍiM\ 6ö\96HÁ¯fð]S\ 1\ fª, \8e?²ª\9b\96­%\94À 9\1a\11\9f+\8a\88\9c\17Î!X\1fÃ\10µ°\19\8cÿ\9d9HèBéZ\1a!\99o\97\12èYÒ\96\92Ôb\88ðL\9a YÈRÎ!Û\89]èL\8cV\9b)·f\96\ 5\83+\9fàª@\17°ïdµ\ 3)ðÍk·^\aàÄq\95lv:Ú$mI\f\14ã\86\ 4Å%³¯1оHÖÕ\99\81\1f\81¡æÚT=\9fÊߨm^ë@üÄ\1e\89ÆÖ\82\15£D\13-Ä£\ f÷\8c½ì\ 6þ3c9+H²dBPT[\94½ÉlÈ#\1a;\1d33^ë@§\909\95G6]NN6Týõ\930\ e\897ïga\1dÈÎpö¼\14ÅPó¨8\ f\au\15N»ÓE«B$G×Xa9®\99î\8dô*u­ÊØøµ!\8cÑ\15ë\ 3\88\0\16Ä\94:åè7@Tj\16\89\1a1\1aàbµ2m\1e\10\ 6ø\14ç\a7©X{¤ôQ\95UC~1\f§¨u^Ê\9f¯\8fm\1a\f\ 2À®\17ïû\9e3\0\89næÆ\99ò\8dV:]Y¡6P\8e,\16\13ôªÙI
+$ÞÊTúTÑbï\9c\87Ð%ôt1ø="¦¬Ý&ëvu\fã¡Hæôñ\fCvat³ôr\9c\16\11ÕjîÅ\8cMb\87¢øz®aýB{Pįé©I\93§¬¨¾°6\ 6\e\9e\8b&\98\ 5Ö¯%à:MRkR+'Ó\17\vç¦LO"\8eÇ\93b@ïêx|sT8]p`-ÈÛ0J)î´ÐØ\9dÅmSÐi3¢8!\9d­÷Zã"x»UÃ\ 6      «#ä\83;Çp2\ foµs\e\9e\16ås\82âDÄf\a\8au\1d°=õD)ø\97\f\ fX\9dfYA\ì\91Ò'Ü\a\88¹FWÆë¸Z©\fC^iÍYzÇ\82ôéüã\93\83ßüöàËÿøÉ?ÿú³?Õ¯~\7fùòùõ\9b×ß~~|ssz})Ôç§ß\9c]®Ò\7fó\8fËËã\8bÓ\97\aD>èô\83¸üö\93åà3dË|ùã'¿z\83\83\85þóå[üí\7fõ?ýW§ýx\10\ fþ|ð\7fþïrð²ÿâË¿õ\89\16¾ä}ø¥d      .Â\92\97\b\85\1dÁ2\83~´Jïª\13§\b\1f­öó.úÜÏ%\86õWü\17þã\ e¾Cª\12\ f(A&F4Q?B\v\8b\17\17L\aîK\7fÏ\aýYg¸\88\95ég \13û³Þ\80ÌSÊ\ 2ät\87¡;z^ùQ(}\93:ÿÈ\81\eSvY'FJô§Æ\9e3);1C§\89\85¿¥\81i\9d\fèW/d\97à\v§i\ 5\9c¸þ]DܹÒ\89\90\88\94¹|B= \9eGW¦\98\1eQ8\0DÇæs"v®OC@à\ 1ä@"z¹fÔ\96²\86\88¼\102#w@}VAò \92CÍ&"Æ&5ch\0\9e:\ 5\9c\86\8f2Vd§\83\88\10i/\93ª\856aIü\bÈ
+t:ÌÿDïÒQ\93Æ\94\8eÑ\89\10sZPbò\81\89 \13\1e:ï¥É\ 6\ e,\94Æ¡
+\91\vB\13±3/ú\16ä\812:è\8f¿\90ù=$b\83öCÄÅ'\9dXÿ#µ\94\94%顱\80\1c\1e`\18'bÂS.-\17íA³@\89L.\e"»Xõk\14»Cç\8f\ 1¾\88ص·ÆDïs\1e=ô}\16ú2¾F¦µþ\87ÆÙ+¼anÁN\80H\8bk'É9\8c\ 1t\ 2¥gb\7fY\9b\10\ 3/\ 3\88\90\ 1\99\b3¾õ\901v¢ó\83Lç&°Ô\89\95ã~é(ò\ 1\ 1\8d\ 6+\1d\0O7f¡§¥ê¹\ 56\10\11]\8cI\88)dm©õ«\89N\90Ü\9d\8eÄ·Ä=HÑ\16"r\95P"\12\80)\11a\9f\92!@´ÏBîª,¯\ 2j(dí \16¾OðÁãîb\b\14¶/=È\9d¡U\b)ñ×\b:±òö°ÞLÄØÕ!9c(B/=Hr9\1f^R\8d¨Û\fO?\1d\7f\9fJ\95\ 5©|{\160 é!³+\8bè\8c¨×\89\89=\8e\12\ ew\e9.\86\88].\8fº\90¨\84Ò¤±×\1e"\ 36Éçøf£[(\17\92¼m\ 5\1c2<eò\16gmܲÜlr\12È\9a\17æ\170ÜÌc \82-D7Þ\ 6}ÍKc\1fm\83}\10\1aùÓì<9\982ék\9cÉGD²\99ñÚÔæ¤\87\ 5â
+±¬~²\8c»\ 5®{DtN­ bJJ¬\85y\16Æ%,\8fÖÖ\8eS\17½2óGOx)DÔß\97Á\9e#ÇÕ\13\111\14\93]\ 2¨L¦ì\vÞõÊ<\80*cÈñ\90\97d\91Wq\9cFy\1f*\17^fbmU:`Á\8fNÝR\97,Ä"X
+½-¡oW¦\a\99-2ؤÓ%3\7f¦\9cT'³"o»ü¾Ó\9dΠ3ð(\8dõp\80\18\8d\92ü\92d\ eÈ°\rE\1as\10c'\ 28\90Ä    ¬lò:¬¶ÄÀDª\91+=$¾¡¼=\14*KD\ 2«a¢<\1cp#V¯o\97\91ðéµ*ôRù©\a\18`{\\94Xåù\ 6\94S\b£\87\14\8aczÌK\93ÆÞyé¡34î\ 1E\87\9b\10]¶W\ 2\85\9fEÄ¡ða\80+\16\ 6'>ãÁ\88d÷'ÎRsUy\ 3>\95H\ 2Ëâ¤þ\auK° Ì\9b\12¿\7fd>\f\93ªü\91Ìõ®È\93\828T\190ÆÎÄ,¤>\ 5}eª·Ó\94ú'\9c¼2T1\8a7\98|´ô1öH\10±\1fÇ,ÏòbW\92òªõ\15\ fEÛ*·\82S\8be.
+ÑsÒ\81:×ø4És\ f«*³ *¶#ZE\ 6\8bä\ 3\ 2\9f\16µ$¨*\9b\ 3í+ѹ\1a'\11»,+<(\89À@Á\ 5¼\8a\88P eZ\ 5\ 4\0°$²\14m¼ä"\93àÚ7t@ºÔ#=\10\v=MdAb\96·Èá\85é¥d}#ìNè|  H2\8d;\91\80Ø)Ì<ëñï[WVÅ1\ 4>$þVâðEé!óm$zFÞ\17\13u\1d\12o<¯9aÓÓ\89¦\87Ãn6Y%ä¤Ëç
+G\12\12Ñ#ÜJ¹KTbµ÷\9aQqõ\ 29\16_  ô,Û­rÊ\9fú\13 \\9bø\98õ@ 7|/uÙ+\87Æó{à"\13Á!\8b\12\1e$\ f\8aé5IÛþ$X[fü\14Ϭl\b\rù÷0\83À\85Í\1cca\89\81\82\82\9aL\98+\9b\10± a\8a¹P\17\rF\ f\ 5Ê\ 2%AÄV¼¿EDÀ\92ò·¢8/H=c{"o\9bç%#wZ\92×:\8b \ 2Áªò\8b"8g4\86ºPÄ_\14\81\1eô\10\1d±\81qUP1­-\9e[Zy.jÜ\8f´HNr"+dßZäs\14ó\80\96~º?^\91×ø¶,|JPç\90U'ª\90
+] #\84\15\8e
+\19m"­\13\89qp7ñ,\1c¢\ 4ñ\fgØZ\vm|Åá\94ç\ 3ò=\f\ 3\98\1aê\bLØ49¨t\I\96X,ùß;Ñé\10
+\15és\9e\89Z\80\958g¨\99È\99Õ
+Yt\1fEÓä¬\8c>\ 2\88\1eP\84ªÍÁ-,\91\b´u\91ã\15û¼¢$Iv¢g\ 5 /Bå8\eé\80\0áiÅ<W\15ã¯9b§\99 ðè\r¥å¢\13BDEkí\8d\9f>·ÈS\ 5\83/\16¯7.bcî-Å7Ö\19Wc§¯\1c§
+\96Bê¿·]\83½$\93l]\17\89\94ëk»pÎw'f.\aÁ=xØÚ\82H\b\18\88\83ÑBRq^y\ 1+[\ 2"OM\ ed\14Å¡«üý:\13\94\ 3\9f=\a´6\92\85é\87Hõ{\12\ fd\f    G\9a.&4?R¥kÀÅ\dß(n\eÄÀõ\93Y·ì¼Cz@\91\8cìHýI,Vq\ fÑóM\811)ÒâøÆn:ºktFd\fP3Zá\1eh·ÐCBý\9cÄDÖGÐk\85\r\8a5\1a\bç¶\90}Cå<±¼Y½$GÓïÙvR½·¡úIfÀ®\91קo%\10Lx+     ?\7fq¼ï"\ eõ\89@\b*<\ 5rÆp\ f±pòj¿3R~\97¯pXH rT\bNÞ¯(·/s¡J{p©\f:ѹ\ e)?ú!8&6g\8f\1dåUP¯\8bIN\88þ\f¤Jà\f2\8fo\ 2öÙG\85MÏ:*jæ\ 3?\11|\1f\1c\ 2
+\99\ e¸0b¯ý°ëSé u\92rQc4Y¨qYb^\82\ 4ç[Ð÷\80\ 5ù
+\18£\16Ì\84E\8aiE      \9dRª>\89ú\WT\ e4-\89pÌ@lÂ\1c\89\18þ¬P [ãÍÍ#p½T\16@=_`r;¢\aIÑ#öÚ\8aã1$1hd8*´T\0\8d¡ore:é\92Lt\80O&^ÌziE\15>\98\e\98\16Ç\10pÞ³\93\a\85âöh\b\ 4QJ\a\97¡dúÚP\9a\13\1a\83\86,ÊH×\ 1oôB¦¡
+¬«D\1a>"ÿH±­\85*\8eF>¡$\13ò\10¨¨%\ e#èÌ\82\9a\8aÔ,k\10Ìb¤G«ï,iÕ²\ 5\8eñZ»À^ä\14á\82\8bdCð*ü:5}/|\1deÕû1BÜ\10ý>\0:\82ÇéÀDH÷\f\99\9d8Ê6£\96]\182\95\98î­£7\ 3À\ eÌÙ=\
+\r£Mã`àô/tcRáyÉ\10²<\ 3\ 59ª²[.r.-Y4+k´`\94\89lG%KýGáì\89ÁRa0\92\87\94¸©\1d)Ƹ[x\95IAÌT:×îac[B\1f\16%/5éÁ5\12e1VVkð°\88\ 6\ 1jÑÏÃONw\ 6\80à\91\ f\v\16ÜÑ\82\ 3Á<ð.B\ 3\8b\ eâK¢\1e\84©\ 3é2:}\1d\ 3Y'\93fßS\aý       £eYØhûB߶Z©1aOò\v\8d!\14Z\16JT-FtIÇåª\1eb¦;\99D\13ÖÓ8\7f\98\89`ùFÌ:Ý0½Ð\81'\a\b`ÄËòÀ\ æ\aNìù]Á,
+       ï¨ ä¥*\90Ò\83Ð\ 3\89ÞL\´±\E\10éÙf¢\8fã$\10nõ8¤L\8c\95ô»NLBñ\91´\ 4Tÿhq:H\14E\ 5A\eO}´ÆÄTQðDeµÄA/D¤¢ v\16è¸\10\9d\0Ï@\84êJ\e\11\15ÿ\89\88b\8c\9b¨:9è\81å渨\11\ 1Ä¥\1a±©\9cC\96ÃN\13\98\ré\02\18    ä 7ÙvÏW\8e\88¢ÕpK'-\ 3X¢      Þ\ 4â@\9bF*"_\89À\9a'jJñËPÀ\1dá\9a'¢¥ç\10½_Ô&t\96÷\88Ø\8aô@\90ôD\93+\1dåvY\alS¦\ eÄL\86\90P¶ÐÐ×\82
\8eß\e\10\83ÞJ\88Z\95¥^\8c7\8aºã\99\8c\17\8a\93\17N7=B]0\15\88ܽtÆ8\12\88µ°¥  o\8dB$u\8b\80\90·\98'%\8a-)¡¿ âw¡ê
+ü9rY\16Q`R&ËQ\80\9c1\8d°9Ñ\18²XÑ%##\ 3µÕ9\bT:±ñ\10\87\ 2\ 4lTæä\8e}V²¶\91ôÖàØñÂËXY\8c\r\8eÏ\95ô\0ã\bm\1aæ\10YÑhôÖ4&\8aúB-Ù\91\10\ 2;\12l\f~!  *\ 4)±L\ 3^"í{@\ e\80\9cè\ 5a\9e\95\89´'v\1e#\e\9f\83(\95|x=[m\ 2\9eÏê\84¸°ë\86Ö¡æ¡\bÂ='Ò\12?Ѥ}\a²\ ezÏÈ\96 ÂûD³ð~\0»1½jã%ó²W
+µ­B¬¬JÖEMå \ eÃ)R\v\16ºmøÜÂÎ\fʧ$+«×Bð¤°\11\96"\11 iÞLe\89µg\1fÍZ^I\ fkLt\8d=~\15\85ËI¿ôq\12UÈÈÃgÇGIt`"¿\80ðU\8a\9e]MjôHê_ÜèAT\r¯u¥Ù®Å\ 2\83\17\8cZ\91\90I\ 2\ 2\91\12WÍÈC,·Ó\v\e^ÄDC\ 6?\1ct\92\8b\99HJ(í&\99\83^h\ fâ¸\vAÙtÑ,J><1ª\1d1¶&\92LuÃÐ\ 4e£ÊI«E\r\94K\8aÒ\ 1U²ãýéÚAfbS¡\11¦ma§\9d\r\aöß\84,'R-h¥\8a\ 2Â78i\a\95Ï,\91\95\95\95ªr\f\16!\ 6uÓT6*ûÆ\1e]\e\ 2\95\9b!\89ÎìT\92 CDõwQ´H\13bKÞl\eÀ ¡å\ 5}Y¢öÀ&8\ f\99\82Ý!U\8c\144\ 6ï\8cÍWyK\88\1591ûüïª08Ó\8cT»£\96KLÃ6Q\111³«Yw¢O­ð\18\18\87\9c\88\8eÕY\1c\9bá*\85
+Á&sh\95º\ e4eÇD¥Pm\19¢\90¦a·RÜÈý\94Ò\ 3$W\95\15}\9fD\1e\ 3\8d\1d\97¸\10ý¨Ú\85\90"èDgdh"R=\18¾\94êp£\14\93Æ×\9aN\8a\12K8^\9e\ f!.A\1aS\142\13#{#@\84\95×z \14a¢Gg'\8f\89¨<\8fêu\aùÖ2,\8e\85lpÂöªº\80
+Ãa\12\91\vZ\90ÿ\88ðO\88H\82 ù\95º\b+\f2.Y\eÇ\18¥±\13\9b#ig\8b²X3ZÂ1µdiË\15<ȽGH¦\14\1a\1d\88Tx\9b\89nD\ eD>-BWg¯ÜTÐÄ3æ4p\ 1_
+qr\9a\934ºÂÎ3\85té°ä\80 Ì\82]~\98\97=u!0÷#\9d>'f!\vpG\ fØâÃ2m\ 6âFaÝ¿pÞ\ 6ý>Á\9c\ 2/7ÿÞ\91O(A¤d)Â/â\9f\9c"P\84F\13H°Q\16ò½ZÓ)JÆUöý¬\12)\9f\97\7f?\93\83Ô§\9b;\1dQ-w\84À\9chHÑ;Ã\85\12¨_ýåêòóë³Ë\9b³Ëo\9e=\13:\85\11Íÿòɯþò=ý\9b\1f¿ø÷?þáì¼wõɯþÕþ|ðoýo_þùè/W/OéÏ¿;;¹9»º<¾~û\9e\7fúôà7ÿ¼8¿ìÿø¬\ fðúìë77§¯\7f{ð/½ág××Ç·Û\9c|{vþòúô\92\83\7fýÓåÍøGü×ÍÛïOé\1f\7fã\96å׿=ø×\7f\\9e\9d\17½ïËoVÛþp|þF\1a\7f{zöÍ·7?Ý\1cÁTÔº\8fGÛÿË.Lîdz\977ßn>7iþPSûìO_}vþý·Ç_¹\8d'xö²7}ß´Ðè¡æ´Åfýsó\8dúçNLèíæ\13zûp\13ºúú¿NOn\9e_½¹|Ù\87øüê=Û0Íï\15qÀÞöæõæ3]ùÑ¿l6±ÇÆ`oÞ\\7fýæüôòätãµâ\1foºHö©\a\9bÞÆ\13»>}ýæ|\8b÷CÛ?ØýíbêÆ\93ûúøõé\1f®Oÿß\9b¾×[Üæ[?{¨©ú\8dçyùæâ¯'7Ç?\9cnq\91çß<Ô\f/¯¾¸9»9yÏ\13?Mô55ÿûÙù63]ùÑ\86,ë]óq?5\9f»\9fò\99ã\9eþ}f=ï\19øOïÊ\83\17Wo®ONÿx}üý·g'\9bK9\97\9boÖÙå\8e0γË÷ÜÏÕYù\87\9bÖû\96\7f\9aÔÕ÷§×Ç7W×\9bÏlüâ\81\8b«\8bï¯^\9fÝlv±îi\14$\1c½\7f\0ÿú»ÓW\a\9fîõн\1ez\1fS3=4îõн\1eº×C\1f­\1eúêú¸Kàç\7f¹:{½×DwP\13ÝÜηÛ\8aèæïÈ^\11Ý+¢{Et¯\88î\15ѽ"ú\11uµø\94\15Ñm&·s\8aèóÓ\1fNÏ¿øöøåÕ\8fOÉ-úÌ?9\85t«)m­\92î¢zÆ2\ 6\99R\9e\9c\84ñõù\9b÷¼­;¬\99m®¯¼¾yù»Ó\1fÎ\8e1¬mäøùW\ f,nüñøÍë×gÇ\97ÏyGwO\94ß|·^nÁI_> +ÝbF[0Ò\97\ fh\ 1Ø\8a
+\ f¼zõêõéÍó\9f\89\13>$\8fø+Ít'¹Ã9¤s\ 4z\9e\\9d_]ÿÛ\8fß²bµ){\7f\85±T\9aï/ÙG\9cÔëïOOþúæ=Wf\87e\8dÍ\83\91^¿¹~u|rúÅÉñVgråW\ f¦¤.\9bO³oø\9bóãëßÿóû«ËÓË-¶rý\97\ f6Ý­gûâêòõÍñ\87ÌvürGÕ¤®8öÿ·ñ\8aý÷æKôß\ f¨\r§mæ´#\1a¾Ûj£îEÇ¿/    çó«³Ë\9b#±ü=\98Õõô\v¹ÔG"µì¤Èµí\93½+¢È\87ÙsvŹòÔ\ 5­½óèñs\8eÍ\1f\97ïÞ#bÍ\9b\83\8f_\12ün\vFñÝ\ 3ò\89-f\14\98Qx¸\19mqêÞc\99[\99Q|è\97ê©F7l/_ìÊ\e|~vóùñÙû´À\1d~\84\8f¯Ïn¾½8½ÙâTî\1fãÝTë?À:þ\ 1\fè!·÷ϧ×ß\9cb]wRÖÚ\9a×<éݹ×Qì\ 3¹ö\81\\eLÎ=å@®\17WWçϯOOÿ{sïÛã\8fâJ\9b\8e\98x·¹`û¼¢;fú\14ò\8aÜáæÐ\ 1×Ç/ÏÞl±>ÚþaUã§\19\94·ù\8cvNoÜîÑØt¯\1eðíxyv~¼E$Ê\ e\7f¾ºþþÛ«ó«oÞî¤\9eô\94\99áÓc\81O7]t\8b\84®=\vܳÀ\8f«\15\80ä§Çù6wÌí\1cëÛ2ók;Þ÷\90\8ca\87\ 3«\9f<øÄ6§nWxÄ\16¢ì®ñ\88ͧ¶+òѲ\85æ±Û\0!\9b\aÁï\ 1B~:\ 1e\ f\10ò\916ì=±KóNm\99\90ñ°\99\18¿ìWmwB\81¾Þü\0îÜS½ùÔvå©þls§Ù\8bo\8f//OÏ¿8=?=ÙÊ\9a±þË\87\9aíß6÷z~ðl×\7fùÀïÙïÎ^\7f\7f~|rzqzyóçãïwòQ»8îÝmî\0Ý%mm9Ðÿ\1c¬ýÑ­üqãéÓ\1f·\90¾´ý.ðÕ]yÚ7·<îÜ+¸%ºîî\18µ^ ÓþÏÊjv\8fKn³3»r\8f6×°wî\1em>µ]\91&·H\1fÿùð\87\1eÛ-}µ]0᫳ó󭢸Îwaÿ_]_]l1+jý`\12Ú{D©Ù\9a\89z{[X1¹ùCM,m>±\97ïË\86\8f¾y@\1dïøüÇã·\9bO¬¿\ 27Ç×Û=\eü\83\aÛµÍÕ «-\94 «\87\9bÑõ))¨\eÏëøå˳\9b³\1f¶PñÆ/\1ej\8e\9b?xóDu\f\7f¡¹l<ÛÕ\9f\94/¯.·ØÓ\93\937\17\1fW³2Ïé7\ f5Éó³ËÓãÍ3ÅN\8eÏOþ|õr\8bI\8e_<¨vt|yvqü°Ðλ\8føø¬îã\91\1e½Êyòtã\91\98Ú\8e\99nöñH\8f×½ͩÛ\15\1eñtã\91\98Ú®\98¥~A¥s·À«ÜG$í#\92~\96\rÛ\èÝ­\88¤_ö»¶;\11I'O7"i\8b©íÊc½\8fHº{¶û\88¤Gõ¨ý\92"\92Ü/."i\e¾º+OûÓ\8dHÚbj;fÖÚõ\88¤mvfWîÑÓ\8dHÚbj»"M>Ê\88¤]ð\8fíbdÕ6çw{nó\90;»Û\88\9dÛD:î÷å\89 èìζÜë(\1er\ 4O
+Bõ³?}õ;ÂÝùjK\9b×G\14ó\1fÛ\9alaØÜ1\80¯§]\b`\ f µg\84\1f\81\11æ=#\94ùm¾\12{F¸g\84{FøT\18áï¯;e/\10î\ 5Â\1dç\83§8Ç{6¸g\83ÿ\13\17\a÷âà\9e\rîÙà/\96\rÎþ¯¯¶\8c  xÂÜpó\95ø%ú@÷wkû»UöwKæ·ùJìïÖþn½ãn}~öÏÓóÏÏ\8fß~µe~æc\8e¼IËAÚ<@\94÷ôoÛÄ\88N?y¨9îK´m½dק\17WïCîØQô£'\8b\13ä¶\98Ù\1e(ÈL\ 5\ f\r\14ä\ eܧ~9p©ÿ÷rÐÿïÓþçþ¿\9fö\7f8x²¡ûg\97/O_\9d]\9emáVº>ýþôøæwÛ\9cÜé'\ f5Ñ_\ 2\86\1e2i\97 \93^\7f\ fФ\8d§ù\8b\80LzlbÚS®6ûõùû8ý\ eçpl5¹]ÉâØ[Yv\89wlw\ 4w\84i|¨ãmg@\12®.¾¿zݥ濾y\ f·Ûaæø¾Ãö4\9c\8b/t+w\92{ln3üî=ÖÒysÐöÁôðÍg´\ 5·øî\ 1\99Å\163zODÚÊ\8cÂÃÍh\8b\1ewêÊ\8câ\8e1ôÝz\8d·UOvñ-~º`¤Ç×g7ß^\9cÞl!Ní\1fåÝtú|Ø\81Þ'\9d~è(öÎùûpÎo  \8cú\98\r*{çüÞ9\7fÇ\92í\9dóÿ²wÎë¼öÎù{çÀpÏûåÓí¸ñÞ!\7f÷\86î\1dò{\87üÞ!ÿ!\93Ü×0º5à\9fÞ\88\1d²xí\865oï\90ß;ä÷\ eùÇr\ 4w\84i¼<{õêÍ\16\15\93v\8dol;¿]a\1d\9bÛ\7fe\ 5^\]v]ír\8b­[ûáCÍõíéùùÕ\8f\eOøüì\9booz\83g'\80}Þ|¾·\7f÷ø·\96\17Û\95{YùÑ\83éí\9b¿|o®_uupËI®þjÃ\97ï±=8{;â¿ì\9e\1dq_\r|\17í\88üÄ|úÍõééå§]Ð;ýôìòåÙ7W\9fþpvu~zóéõéËO¯®\8f/¿Ùü:î\r\8cwïôÞÀø³Ø¢6\97\81öVƽ\95qoeü¨B@ÝÜ\ fuüßg\17onÞS\86\10ê\ f\1eê\ 4æÍ'wzÞÿ¶\9dÍjúÉ\ 3\e¬~wFzï\11\83\ 6\8e\15ñ#áé;y%\9e¤ñìõ÷§'ý9¸~ÊÉ\1e]òýåX^~v³Ä£\9f¦\9cðßÿóû.\mc=\ÿå\83Mwó÷J\a½½±tý\97{£ÓÞè´7:í\8dN?iq\81\89\89\8dNb\81"ÛÓÞè´7:í\8dN{£ÓÞè´7:í\8dN\83·<¹(\8e½)í\1d\97ë¾\ 6ò\85¨i;mKû\10³Ó®\98Ô\9evJú/Á`¸G\87\1cd\vä\91\1dA\87Ù\ 2ydGÐa¶\98Ñ\1e\1dæA_«§ZGhëØé\9dy\87ÏÏn>?>{\9f}\7f\87\1fá=*Ìî<Æ{¨¶Çÿ\18ï¡Ú\1eÿc¼5Sß\95wøÃôý]{\8b÷\10mûÇxç!Ú¶?Ì{x¶\ f\1dÅC\8eà©Á³}ñíñË«\1f\9fRá´=nÙ\aZ3öà\18;'`l\ e©¸Ç\91xøk¶y!á\97ïaZ+¡zÿ|¸ó·Å\8cÞn1£·;Â.v\85\a^½zõúô\ 6÷æúôåvlþ\7fÀ\11\1f\92\95füKTDþ\a{ý¤5\92ǶO?\9b\aiw¶h¯4î\82ÒèÂòë\8dÏë·§ï\ fß\9bϬ¶\7f¨\97ÒÅ-&÷ãÙËmB)¥ùCMm(ûO\b\88ý\99K\9bï×\16\ 3ÊÔ[Mi\v©ú\ 1\85ê½Ifo\92ù¥\98dòÞ$³CRx}r&\99-f´7ÉìM2{\93Ì£Þë'­ï?¶}Ú\9bdÖ¶ho\92Ù\ 5\93\f\9bãmÂ\8c\1e½b¿W\19·^²W×Ç'7Çç\7f¹:Û"t\9f\7f¾é2ÙÇ\1ed\82\1a\õ0SÚÜ\16·k\8að\16\95¬íåps\0­¯\8f_\9fþáúôÿ½9½<ÙBѺõ³\87\9aé\16ÐY\97o.þÚùÎ\ fÛ ÏÌ¿y¨)^^}qsvsò\1e\ 3þ\8a½\ 6Íÿ~v¾ÍLW~´£\ fËSF\ 6ÛâF¿º¾ºØb^Ôú¡æµÇ\ 5ÛE\°åpóÂP7W[\88mW\ f7§=Ð×;f¹\8b@_[\b5{\9c¯\8dç¹Çùz\948_÷eûúû\9bë¯ß\9c÷\e´\9bVÒmôº\1dÑÂ\9f6öÐ\1e\97çg»ÛOʪì\96§\1cè·Íäv.Ðo<1_½\a\95`\97|\ 2[ìØn\84úm1¡} ßݶ£\9d÷ÚÜÌÒàÓóÙ`zOÖű\1c.¿\14\87Àæae{\7fÀÇö\aì\15Ñÿ9kÙ«¢{Ut¯\8aîUѽ*úpªèæ²Ò^\15\13Ú«¢OT\15\ 1\84O\\19Ý\1c\8de·uÑÍç¹×E÷ºèãã,{]t¯\8bîuÑ\9dÕEÓSÖE·\99ÜÎé¢ÿquõò\9bëã-nþ£WD\9f¹'§\8an5¥½2úD\95ѧ]açIC l\aØ°#¹_\9b+\9d{\\97\87ç\1e{¨Ý=®Ë®a}ì\1a\9b¿R@\97{cô\ fÉ\ 2?\ e\ÍÃØñÏ»\9eóìäêüêúß¾>?>ùîÓ\ 3&]}\7f|rvóö߶1\15¿¾y{¾\85\81_\9a\99¤I?Ù\e·ÝìvìÂý\ 1Gt'ïÛ\96Ûòô_²Ý1\ 2ÿ\82\9eë×\ 4þûâ¾YÈÞ\96ÿHlù\8f\8dK>Iq\7fÛJÉ»Æ4¶®\ 4½#\fcs$)Y\81\17W\97¯o\8eßWctEµ¾ýÃ\87\9aë\8fßn\ 3¾p\ e\aToðl\ 3©f\9eîíß=þ\9då»õÅÉñ6úÍÊ\8f\1ej\8e\9b\aR¾~sýêøätËI®þjÃWï±½7.l¾LÇÿ}vñf\e_¦ýà¡\8e\0]·§\87°\96\1d;=ï\7fÛÎÆ>ýä\81E¹ß\9dÑ£p$Ñ\ 1\ f\16\99Ñ\aB¯Ô\91pï½dùX$Ë\ f©ý½kÒå/K2ùÙ_íÇ\8e\1c©Gü÷ÿüþêòt\eÙzý\97\8f_ÜÔ1o¯I¬ÿr/\92=V\91l/\91í%²ÿÙ@¾\90Û¾Ó"Ù\87H/»"\99=í°ø_\82ܹw\17<~\ e²¹`õÝ{\9aÎ\9b\83\ fuê6\7fH¿Û\82Y|÷\80¼b\8b\19½\a\86leFa'fô\9e\10\9a\95\19Å\87\9ej\1cõÖþ©\9dy\87ÏÏn>?>{\9f\9a¸Ã\8fðñõÙÍ·\17§ÛT-Ú?Æ\8f\9f-îÈc¼\85x±#\8fñ\163Ú?Æ»ÂÔwå\1dþ0}\7fÿ\16ïßâ]~\8b\ 6¿/F»\e"×ÏñTìÎîÜë(vò|<y°®\ f3³ï\86¸ô÷íA¿wM¤øå@cïke®Ot\8fGö°¯ÃÅqïns\94\91]z\17ÜÁ"ÿ¹ëOFÙxîôÇ-N©¶ß¡·cW\9eÅ?ö_¿~\7fÐÛÇy\15\1fV\ 3=¿ºþ³ÞÑÝc/OY6ûE$\83îÑlvéº={zp6Ï6×\ ev\ 5Ïæ粩=Èäþú \89ò\ fÉ5v\18\0f{9ê\17p\fwÇÝ\ 4ÿ\ 4¦ø÷§\fW¿\8fÁ|ü|ä\83\ eâ®°\92yr\9b'ÒîÚ5s\87\9díEý\a¿rO÷éÆ}ûòÕéõ\1fή\1f\8d}ç±íþÍñ×[ìü.YmýÁæ^\12Z\85\7fßÒ,»ò£\aæB\7fxsyò·\9dd?O÷\0\1e\96\83åà\97u\ 4ÿ¸?\82\8fë\bº_\1a\13|þ Á=¤|\ 1\1eàï×Ç\97¯_mR\82æ\11Þ\87\ f\92\9bvE(üÐì¤]2åð\1c\7f.±woÌÙ\esîÜ#
+uüìü|¯{}Ô«º\ f»ýÐQ<ä\b¶¬H÷ëÏþä\96¯~\7fùÒ*Ó\11-\81ôÕ_®.?ï½\10ÄÔ3¡??ýæìrþ\97O~õ\97ï¹\9fÈÿøÅÛ\8b¯¯Îá6¼úñ·\9f,\a\9f}ò«åàË\1f?ùÕ\9bÕÿ¿\1cü\15ÿå(Æé;þ#\878}ù\16\7fû_ýOÿÕi?\1eÄ\83?\1fü\9fÿ»\1c¼ì½}ù·O~Õ\ e}u%\1e\87>µR\ e.@\8b5W\7fð,\1eæV|9¨\87ÅÅ\90\ f\9eùþ/Íç\83|èú\1fÂÁrØ|*Õ\1d\9c|ò«gËa*Ù\15\7fÐ\ ek        KB\9f1\ 5\17\ eBo×\ïp9¬5\17×\ eB=\ð»\17ýwî0»ä{«x¸,}
+\87!ûÒ\ e|í¿öîàßû\9d<lÎe\7f\10ü¡Ã\aÊ¡ÏÑå\83Ð?мG\93|\18\96è\ f|\9fO\1fW>l%ö\ fzwX}\1fÀ\ f\9füª\1c¦PS9pé0õNú\9c\1e\83õ%\85vàÜaé]Çþu\f¦\ fÌõ¯µZ\ e¡\ f\83þ÷\12úðêâñ¿\81ÿu9\8c9ôIa     :­\85r\80\19\85\96\13ú¬K\9fe_Hï]®\ak«Ý?óªïøWýN߬ò°_\7fõ\9bÞO*Kiy:\83Ï\9f\7fvròæâoW7Ã\96úë¯pú¾²\13Ð7\a\87 Ï´,)ãë)æZ±µ.\1eöï\a\f ¹´D\f1ç>Ôgõ0ÕØ26/å¾\84ÏÚaÊ>aZ}©\,½\8d[ú<ZÂ>F\97\92ÇTóañü\11>\1aϼï=ôÍÁÖ\96Ã\96\9b\8fDô-¶\83£>È>ª\98Zÿi8L­/\1c¶=Ѳ¹>ò\98°[ù°·\89\ e£Àa\b}»úÏ\8bÃ8Ks\8b¿s)×Ö{mCîÚ´Õm½½éw\1d\8bRûBõÿ\89­\ f¤/éâ\12Î-\r\14çk        \11k´,¡-\99¾\81C\17é\ 2,.äÞ!(ýp\83à}Ì\8e\b¡\9fKPBð\v\7f«_4Ü\89>\81°ô\vsРÙõa=ë\13Á\rXÛã\93{9P\91\ eTÅR`ûû\12Ð$ú\81Â\82¦>\9e>\90¥a½\ eyðÏúÕë«\83\85åUxæC_çJÓZ?,GÄ?n\1fªµ\83wÇá\;ÀëGü\8e5Z[ǵ\85¾k;ú\9cú\96wb:ì\94ÎWú·Bô4\9e\1c\88o-ÑÇÝ\8f\7ftæ|ð\9bß\1e\1fÂöçûÞOnn\98x_­¾n\ 1ÛÓÇW\17º\ 1±³àÚÛæ\92À!±ò\8bOñà?q#û]iýâ\11±ô[\86íH¸\btw;»\r9\10±\ fØ\95\ 5\97\17ËÝ;ìÍ\96Xj¢\rï]cEÓÒ|¥&Þ5ºcýápt×qN\9cÇB÷\9bÙ/@¢[\9f\97\16±\86Ñgl\7fé\a¥ß \1c\14\1c\84\8c\15¯8g\81¯vè\e\rJçø¹áQjôÊtJ\8c±ÿð\84\ 6Ú\1f\fGü"w\9eBç0-¾á3\9d\7f8Üß[Ëu/¼\18\e³>Â\vº\ 3·'²>Ù»\96¤¯\17ï`g|1áUå\13_±6\85\8eå3W\ e\ 3mh?Þt-i\ f:\ f\ 5\võ\9d¥Æθ\9eù>ñ%÷\vÒG\0^G?\8bxE;K\ 3\85ì\7fîÛÛ\1fÖ\92é`÷\r¯}ßúk\9dBç[ÿ\89\90Xap\98A¦=íg§¡£\16»$\81F}#rê\eÑ\8fSj±`ü©æ¾îýU\ fKÍÔ¨Ï\0#ì}'W\99\11,`\8eýÑ\bý\94c\84¥F°g\9e)\8d°\1eÖ\8cY\87Ãà£'.Û·¼â\94¥>å@\9b½Ä\16<mvH\918G§õå(D\8b¡³\99~"º\\91\89\90|gUw\1d\91µs´~Ôî<\91?\17\17\0\9f\8d\8býhxå\1a\1d¶¾¢%\96LÄþXâºv\8eçè¾v¡¬a\1e}cÂ\82ÝëÛXq\1epÚpùqØ@c¾Þ   \15O\196\e,\85(\ 57\19\94\12ùþuâ\12\12w\16\97âé\83¥\94@\1flÌ1ú       \0¯\ 5¥³\95Ì?LàÌøP?®\ 5ÃécÏÄ\9b=Ä:Ü\8f>Åêb£\7fª­Ïæ\ 5Ï[ø\ 1\98^*ü\ 49\9ak_\12º)\1eü+9bt®è½è\eد"Ý\a:,üvÑ\85h2ÙÞ>\aâ{¥\8b°©ð\17»\bà1\11'\8b\84׬µÆç6BZé_¦ï\80â³N±\ f¿âÕÀ]\82ÐASô\89D"ç!\16ôUpYD¢\ua\12ñÕþÖ\ 4_¹Q¥§\15´\a\9bè\94F\13í߯ý¸ËºÈ\10ð6Ó\eWeoú÷Ñ\15\8d.â¾Ò\84\13?\91¸ùqÉ<:9éÊ\ 4¼\88ïë\87í^ä\ f:×QÞw\1c\83~·«0ÑÎKè\91Â\8a\aÒYº~Ak
+vêé±ÎÄ÷p&«[èîC8 ö\85\81ã-çM\8c¸ý¡\b;Äv:HªÐV¢ç]ÀµÁñ\f\95\94\e\9ey\ 2;\r]*h¥½ë"­ß·õ;yÇjÞ±èwlÌ\9dû·¶ÍëGáÎ\ 3\93Áýi)\13\18\1aµêÏB£ç$Ó\a{OÉaP\11wGÖ\14ï]¤\0\91¤k¢D~\99\và\884ÅF\9d»~\10\9a\1eÑ&Í|¿P\9eïp¨\91Õ
+Gcà÷\12Ûér^¼~±Õ>Ý>üÊ«Û9õ\92
+/\92¯\v=\93]t\a\ 3Â\ 6'/bEçæà$\9d\96"8I_\87\1cä\rìja\0¥\86\ 6¥\17ë\98\ 3O\11\83àátq\9fF\8a§ª-\95Î[ô]sX?¨÷£äEa÷·YÚ\ 5\13os¾uîx'\13íG¾6fx1\9aæ\96ùh1·¹\9b\17®³Ì»Øê\1a÷ý¹\9eEHêKâ\89A®%e8Á |\rO\13\96Ä\93´\1cpuº Ô\ fA®,\7fÕâÈ^Ñi%4\92Òj\8cøUï\86µLÒî
+\b}zaæÞ`ð\81X¾pxz\ 3°Ðô\ 6t!\f\924\87\97"ÓKÑÇÚÕ\8d\13¼8t     èÅñ\a´\15ÕËV0§¡½\17níaá \8d\80\80M\eÑO=öÁë6xâ2ø\91Or?ÁÍp^\88    Ðyéw\93Ö\86\98\b\8eK¦ãB/3\1fô~Dhâ]\12ÊòvwÖ\83\17\9ev|zá=±\9a\0\88
+Qä\a\12\15H À­\9e\ 4\8aN+\ 5ÒF\97\16S^èW­ïM'@ìÃÚ\80\80ó\f;RdÎ\82\9e\\rܨö3ëéVGꦯ$-{,\9eÅ\99þ(³rØú¡á\ 1RÏÐø\99\9dî{~°v\98îíÕÃ}ô\90\84é  rtj\89\8dÅñNañ!\9cÚS\ 6}\97T±éÁëo\8d/K\1aÏ"¶Î\910\85³åaâHÍ\ 5·Â¶è\ 5hQ\98[Á¯úý 7Îñ5ïë\19Y\88\1e\²óÒ~WÚà¥\9dÝvq>\v»íïZçÉ]b\94s\9cèZáòäÈ|\ev\14°ö\86çXY;\1e\80èÊÊ\ 3\80à   \85Å\9e     ü*-e¼$Ø_â\84Ó{CgÜçñ*\81Ð\\19\ f\17\9e7\ f¦7=o¸÷>\92æJ&\e\1cn¿ÀòÐo°«)ÝÍ-n³\945¦s×aZ?q·\8eä]Çvýl¯\9dþ»¯H#\19\1cW\15³J]uÄ1è'.ä¾y·\8fà}Z\98ns¦\v"­q¯[üí.&èeQñj\91µ\ e¢y\91wm\89w³³5\9e·Æ\15×9ç==`\9d_º\ e\e~ÿ$­Ííó\7fñ¡ç\1f\vçYèëZj\84YÚ¥@\92e`æú±îç=ª\ 2¥6fU!5U\ 5È\9c@DÇbè-Aìߥ\99OþV³\95Þþóã\ e|m'×eYQÑo\8b¼ëbñ]Ò3¶Óù8¶ó\19\98\ 5©$º\9fw
+Áë¢òº8}\97ÔýQ7uéÃ\91ÿÒ¥\89p9\81g\95\92£.MÍ\90±\ 3¬æØ3HKÎ3\ 5ú\1e|\ 6x\93`¥'"?e\8dxZ¢§\91\96õ¢Hw\84Ø"Ä«ÎZXÔ\ f0g\87Ƚu\16\12ð\ 6tvJJ=\8bl\99\bQ\14¸Õ±~ÜÅiàw`¼}ðK\8aä\9aë{\1d\ 3=BýAîÃ;°S£\84\1f\88+°}Á\1aA÷,<ÐXaØêü\1fÊo\7f\aü¢\ 2 /ô4ô\9d®\ 1~ [_\7f{\8f|\1fæ\ f\bz´Ó¡±«Êõgµ¸¡\fwBdn\fC[¥]\82Ç'Ð]é¼?ô'·¿bý\91à\97Ó¹Îèß\12ë\8a%²¶Ûe\17\18ó\16ºï]aï×å\ajQ¢Ø\9a
+\1e¹~ÎJKºéµH7Ò\bj}\17gfBXbYí©ÿ!õ\99$88\16~yȨø\96F\r\86Ëz;î³\8d\10~\88\90¨§.\1e4r\819\88\15  ¢\96za\17ÞE¨\19.°0&zÆXH\19ãÚÊ~Üm|\16\871£Æ\85µOçøa¶\9d#\e\7f\ 6¶®ñ\ 5s0À67ö\ eF\b^tì\9d\v|[aú%ã\1am\1eþ^\8b\18%|?°?ð\a\17ç¼l_"»o\15õU.íÛ\95f²8+\14ÝÁ\89Ø?Möx\\1fòCM{\88fQlÔÑ-lzà\91Ò&\16é\fL¶å±\8b°4\94Fz7¶±\91¥!\86´äy\1fǺêPo/ôÇÝÇ5}\19²$½¦j]¿\0­46¢·.vt19AJM|"\97\ 5'4Wæ\19¸\ 5,7<\83¿w![QÿÙRØ°ÔB\83L×)-ó\83\93ÛB\8fw\7f$£Sß\ f\9b\93\cÉ\ f\14v}`\0ä;É|]i\94]\19§ß\85Ãì\16\18\1eÀèaxpö\1cVòe¬Íí^\r\87xA´Ô\17\92\15">°ýÈt\15"Ñáa×hÂ%*Ì\13ª\13ûS¿2uYøÔ¥@úWß\92\9cF+ð\9bØØý\96ái#\85¬ËA\8e\17 ã}\ 3Á{vã\95þ³;\97äö²­/ì]Ë\7f?"ßÚÉ¢ãØÏ g\1e½\14\9aDgë\81å=Ü£þ<g±\r\93\ 4îê¼\84\85ß\90¥ÒëÞ'å\99@\9aÞ$\ e\8a\13í\84\9d¡ló\82\8cØøäE¿ðÇ\ 3\1e\88;\8fðúA_¿\rw]\9aûR*ÖÄ-È\9aAÞÂæ\e\9fÎÎ2\97\12\0½\11q;\8ebt\8cô\ 3ù\9bK\13Aº3\ 6Ø\ 6\1c\a{\80Qt¶ÿ\16ëÝ"\9b¶aJ\80Ú\0·q`>F\9b\827\13âíÂ,\9em\93}\84\99¯\ 3\f\ f$c¹Î\8bC.£÷\13\1a©g\9f\88¾\18Ì&ñ\96è\aקøq¥4\9a\bÌ\80\vÂ\17\14\8ex\0x\0Y\98ïü¿\91\8aåù\9cý r­\83ß\a
+\98\ füJ¯vöÃG\1d¬\83­\8c\1e-\ 4´4ºFd¾\84ÄTðiOV<±\7f/)ó\ 6õQùÌÖKß5\84\83µ~>î0ç3û\13\7f¾ûs*=kÃ\11\96'ÁtwÆ×½ù\1a    %ë!v\16Yww8\9d[nÅÓAxX\16\8bñ\97|Hö8ü\ f¬¸\ e½9'~(ú'\9cX\92^ÙpG-È\87CO\ 3\13Wþñ\19ÿ^»Ä_õk£O\1dJoøükºþô\9fçß"4ò7ÿ¸D\10ãË\83\8f_\9e\9d\0\ e­ß<×èÂ{øÏ\17z;\11®4!¨¹\83çßô\ eè)    Dy¦\7f\19\9a°\10\96®\11\91cüàù\ 5\1d\8eþÝç´mñàÏ\9fÐZ¾ìã¿\9fí|ñæëµÍ\\8f\91ü\9b.\89;øßwm²Ã&wíý\8em~\16+ì*´Æi!é\bö\11
+p\8a\bh+\81\84\ 6\9dÑçþ^SdM>¤''S$G%Ú­þ:éëw­È"Q­ý\9fþx}öòóóãËS¹?ý\9fþvz|¾úo\8aQ²Âµ*Þ?pEð%×9í\ 5\ f\82¬ô]h¥ð\r\19¬\ fEF[û[Fa@ËBqy\9d¿AâîÏÙÑ]}Þû,\\17\8f;c\11keä\8dÀ8$H\89,ÑÞ\86\\1c\9e`\f9i<SW\91Y\88è\92\rûP\8fîì÷Þ§\12ý!Yhr¿½979Q¥«|\9dÝö±»®+É\91\82M?ñ1\vQO\ f\19رq¹òÔnwxï3(}©|\17hBé\1f\9fÇ êÊ x°\89\aÛæ£Ã¯d\17¯¸Ýíþîÿ4-\b
+\8eô¼ÅÂVE\f\ 2\12\@ÔRö:X\88\97t¼RÌÓ\89\13\r»È¡[íñÞ§\0\e}Zpb(>\96ï\ 3Ü\92\1e!\ 4®oG\83JÅá\96\8b\8f±k{8]\8b[Æ©\81Å\8c6láHÀµNïÿ(u\11zéK\!J\afN4
+Äwb\14\12K¼rÈë\92ǹAÔy?7]\8adÚ­\ eï}\ 6­\1fò\ 2ý¬\8b÷ý\ eóY¢\by\8fAt¡p\1cr8ß1ØE\ e>\9f\9aÎÀ\9cø¥\8eîèð¾g ï=â~+¢7ÙW]ù© ãN¼>@oj4ÆUf\1a\9a§ãCoE×\8c\88ñæÈs¼ÝåOÍÆ}\84Ù\80çÀ;\89÷5²U\19C ß&\r\81\87Ec­\14\82ÙÇ\9axZx\ 1\v¤tz¯+1¢ÛýÝ÷ø!H4\98rÁõ\9d'\8f\ 1Æ\80(I\92\19ªÓ¡&°&\1aªJ ôC\92@R\8c+Díí¾\87ßOyWgèJ\92´\80\13\84C\ ew'|\14\ 1Z9UÞNJvb\ 6\8d,AÝîîÞO\8fïÊgW\85rf¯Ã\ 5\ f!tÞ\8f{\vÿ©\8c\94ô_:PÌ;£\18ah\8fx¡owö3\1c\9dJa\ 1,E8Rú0\b\98\8e1\88hCMÙñ\91.<.ü4¶ìè\9cøb´Õîîýðô;   \7f\vxwã¬\83\ 63r?¿\9d\19\96Â7\12ç\89\1d,:®ê9\81)\ 6ç$p³Û\9dÝ÷àq\90ÉÀß\10\L'gáqö\11\84\1a\83\8c3õ;\80qÆÊL\a/õÒÙ|NH\99¢qÞêêþÏ\8d£\1c\v\17\ 3G©^Ð\10º\98\99h\f\14\87 ç\19Ö\e:Ï-ó\19q]Ø£±B\86]äàÜêï¾'\0\el!\85\ e\1e&\84\15ã\11⧩6æA`÷\94<\ 2v\1fê]¯\98<X\81\1cá]Ï®\88\17 \89¯uùS3ò\1fgK2\85Êó0\10krAã\90p\e\8c£\8bC2^ö)pËRä\ 4E6;#l¤\95¦\9bu«Óû\9e\a±w\ eº\r\12b!
+t\8e:æ¶,MÆÌnXkz´Ò\94N\93h\16ëÝÞÿ\8e\121\ 3t\82\90\87t!¯p\95W\18\11¸*Yäª\rK\92\13\94\1a­<\94Ï\85W~½Ë{ß\8e\b»+\99óè\ 4±\eod\ 5a\1c\v\1f\16\9cµ\85\9d]ÒRn¶\v\1c®\8e\13\14Ĥ±Öë½O¤\ 6N\10\95kʶØ>\ e¶Aó=55\9a\93Á¬©\1e ò¨ò\ 1ò¬)­õzïó \vQ\1c\16\1d!\92\13\7f\98\92è¤Á\978\89¦h\98à\87\98Dص\ eï}\ 68ï¼êtz<I\1d\18Æ\82ø?\8c#¦¤\8f\ 5²þÂh©\87§%Ý´\94Í\86³ÚéýÏ\ 3qq\9c\9dJ§'³\87{\81*çḏ5\1d³¸Ù¤©\1e\1e\8e\96¦Ã\13\9cÙ\9dV»½ï\99¸[æM²_\7fr÷üî4[¢¥/ÙÞ;Ù¨¾}ýW\91|\ 1]fÉ%¼{\820Bßexöñ·V£cÝÒÜ\95¯Ã\1a\16'¦fÇYn}é\17ßø\e¥ÁC\81O\7f\89÷\10¹\97\88\ 3¼Ý>F\87tà4µ\7f~²]ÿÏ\7f¢ÿ~0\11[ÛÅÒÕþÍö}\8fÇô\ esÃ]òÖÝöèw\18Aï°8|Ø\ 6¢ÿÞ©,°O\88\ 5Ç\eB\vL\1f.µ$þ06°\9f²C8\9eo7\ fKæDÇÑüùÉvÝ?\7fw÷¥6Ïé:«Ý¿gû>\8a­å\ eQû.\15çÎ\e\9eÞµùïÚ¼\94Þ·yptÛjE\a£     ­\16Å0ÐjÑ`°w\9d\19pFõ­ö]C@nq\1fÝh¯\9b·a÷Ï\7f¢ûéî­tÿ\9eÍû\18jÆ;=W½\87çWWèáO.|~|ssz}ùûK\80¯ýñÍÙK\ 1s\99Æ0µúç÷W×7\7f\92_\7f\95\81ÀáÊ\81_(>ìÀ#¥+÷É:\8eNÃjÐp¹\\f~²Òaûâüìäô\8b\93ãó³Ëo0\9bÿ}úVºNë\9fÿÛé7g¯o®É1;\râ\83<q\7f8¿ê\9f;øâæúê»>åwa\98\88\9b-}­\1eÖ\v\ 4¹Õ\80<\a\b&\83g
+Ixð_»\8c¬\94Æî \aÉÈ5DIsô\v\ 5\80"ö{q\92 \85P{\98\ 2eW\ 2ÍÉ¢\80U'Ë2QàÚ¤t\9b*\91Y VD\9a\9d\1d\91QGQ'\14¾é<G¨7HÕ\1c\eâ\11\11}\9aH¡ìê\ f¢<=1æÂÙ\15$ÔQÒM8¤HM\84å\14J7Z:ßJ\9cÍFQo>\95®?UN&B&\0~\96ñ$Ev[xpÅ®¿\1f\968ì;7¢ôsÆZ.\9c~\1cI_\91\16Ý8ò\ eÉ\89¾&Ñ"«\ 4IvÁó\90\ 1¹Ðd\98­\9fM\afÕ?\97\ 3\96¯!\8c×s¢6'\·¾Y\1cÎt\18\9c̯/\14sm/Ñ^\ 1\ 6\7fXL
+âvs=\b\84\1cÒ\97\ 5á\b>Ó6\ 4 < Á\96\90\1cà°q°¨wõ\ 5Ë\8bôä@Je¤\84\86\9c9;#ø\855Fì\10v\1f\84\ 6§\bv\a\8e«à ÀÂ\1dôÍñH× _9>wxx\90\12\87_\11ó\89\v»¶\ 2\92;\90   \1f\11%ï=\8f°"\a'\1dDÌ£Ð\0\9dï\1a\ f\81$\89z\90úìppé7]ÔÀÉNÀ·\ 1\ 2Î\82Ì*<\v]S)]\92îgü0\14ú{sKÖ\ 5Dp\j\1c\90ßE\eZI"ÔÚ'ÛZ?ÿ\ 5\7f'¯"í\16̬ýÏè\a)\ e¾e6 tBòÈ·j"çô³EQ\91²Ç\ 1¡?ÐC2ø\13N\ 2\12ü]Èíª\85³ÙÒÂb0\9d¨Ä¡¨\11aù¸1\15\16\f\ 4lyr\ 6àG}µú\1e6\ e\1fU\8eðé÷»yìbm\1c\8b\82 çZp¼`Xë§?¤q«\9bç+\8f@gJ\ 3i\81\10    Ý\ fU'H¾9.\1f<Úô«¾CÀ.       H\0FVE_0r \ 5yMò0°\ 1"¿¡\ fÓ²\13°\ 2>E±\89a\89\fg\83 õà=m\15\ 4l¼î\15\12Oûè»æÙµÑÞ\18\1c>ÓIÊ`>h@Ø
+}m\ 2O
+\1dW\84\9eÂ*\9b\v¾\14Ø»\ 5\ 5¤¦J;^a4\89\b+\94\1f-\b×* Á¥D\e\ ef\13\11\ f\126\1c\83(p)´\10}_\91ã\8f\8eû"ÓjQ¾uDì±\10ÈUÕÇ\82peþUâåë´èS¥FÞnCÎD £\1fÇQ\amÁ2EhÛ\89»^\80´\0\1f_Ʊ B¡c\82H3û\15\91qzpJ[\1f\bþ\1eúZ\12\81R\96û\82\92\90H?B\8c\1f>/7ï\9ci\ 4óÒi1eG?$à\9a~\b\ 1\17\0±6\ 1|Þqþ\19&\82\90ÈN\8b0ÊÒz\10û\ 1\88V\88\88\87é\ 4:ô'¼¬]Y¢1ñSÓ2ã®Ð®\17\9ej       1\82\0\ e+\9f\ eÍ\føXø6õâ`\80­BÈ\89ÖÇ/¶>JËp¸\11\81ÎA?Ê°=Q¿\10\17ð¹è\ eö-\88È\83ª\9eÇç\904\88é
+w ¤tX°l\ 3a<Ét­S\ 2\83Ã\91\83\13äl;\ 4Ç;ü\8a\907\84Y\ 5\84\8eÆD\80Ntm\b\8f\87B\ 1p\ 3út
+M«ð\11\ 3­"\ 2\19\v\ 6õ\e\ 4@<á\1e\154B7x%\ 3'ÊÊ\97*în\ 2~SßÆ~_)\b¶_X\18\820\
+ÄDr\1c"\aiN\8d³!À.BkôbQP(\9e\83\94x\17rW÷@ès\95_!\8f\86iµ,X.Ïqþ\ 1è\ 4HÄk\8e\r!4\18¹lµñc\8fW¥+^ÄLI\88'\17+²6*ò)»\b\8d³$\19\9a¾v>\1dh\7f[ÌhCì0н\86o\8c~\ 43\ì?êB\8b~\8aÎRBVxáñPØ/t½\fÉ\ 3÷
+ð<\9dÛ\93ï_¸\ 1áÅà\ 5\80Õ\89v¼öc\9bàJÅ\19\87¹\1fÀ'ô:EÙ*\8aÜ, QÄ,q+dD$\84ÖTÇ\e\8cSÕ        K?\93ü«>wz£úzÃÓ\87\f\ 2\0Ç¥Ä\99\12\90\ 1(\107y
+næ×\92òú鱡\8d\85\b\0Ñ¥¿¸Ë\12#\89\0 \8fy?[\94ÍD?ê75ö½éG\89\9fX¼Ý`z\ 1é\b5\10!\83UR¦qËú«´\10ÛäÔ$zÝ\13ä\88¾­\89>M©\ f\1e"JÌ6¼ÒW\9d¢åÁó\11=\89óá0>ú\92'L\1fä\84ÒþÐJ\14\ e\1d®8ÏIÎ-9å\0Ë$·3ã\90"7\94P\19\90'ÁAÛ1õ\9fyXª\b[\ 4Ú2¤ÒR\ e9\9c¿\11'\b*%2j\ 6dBxÂIAfp\92(ùÚxq9ç\17r-ßc\8f,)D×Rþ:g\6Ø´Y\b¥È1\8f\bÜÅs\86D     \81y\rò¬ª$¹Sä»g7\ 4ÿ\10\91¾$ws¾\864!\81\1d¸IM\88\80Û\80\bß%Xî>\0õªË¢âº\a\9cW\12LµÚO\a¥B\ 3\1d®ö?ô÷öP¢ß\1d\80\:¥\9fª\82#I©¼AÒ&câë\8c\0ËþÜÂÕØ\14Ô\ 3\19
+P6\90\eFqá\80%\ 3\9fÅ\ f\11²Üeh$\0
+\18\15\94\f\bÿ`ÂÈ«\86*\93(ï¨ÄÊ\12\ fH\9abÍñR@Uj\141^\88\11\82@É-¸\13\928\ 2Z¿\89`\998G\8e`\19:7èÜ!Ôt°¦2q°ù;uØß0@Zja\8b\94¾ÕÈήáB\8a
+X|ã\0\92NEb\19B\9eÁ`\80¸\ 6\8eEûR\91ø\85ð\97~\18É\ 2ExR\b§>¡\1f\12\8b[$ç\81ðª \15óÁêg\ el:à\91¬\9c\82^\12ÿÎwn\17\82\97cK7 \8aO\ 6\92·¯$\1df\ 1ºäü!ú!       i       \ 1î\95e2\84î\ 3Í\f\17:\ 1,\10j\ 4\94\ 3Ø8ª|\ eZ\82\88X*4\14\87\97"÷7+Ñ×\1akV\10±»\$£\ 4CGÒ|B^?\94¹êøâB¹h\95_\13\12iúk\12Áóùw,h`\bÙ-Ü{lø.Ш2ó\r\0r\97c8\eÌ-"ç3\80Ûuy°\91\0Jk\0   \ 6 /Ä\9e\118IrXpú»ÀQ=\91\92£\ 2}/ \13½3ÛÆOefý9&ÖÒd\98PC=-\8b#\9d\13\ 4ĤEÏ©î$¡@\8c\0N\8eìÀ_>Þùt\a¿ùìòêò \8b[\13T\88Z\1f\12|&}I#\0Ã<\9dÔÜ\99\ f 
+#ôÙ~û\v\82[\e      t\ 4@\81ý"e¥ðz÷\eÕ2k\7f!1 H¿êl\0Àùð\94ÊXø\9c6vø\13\93@Ö>\14-\88Q    p£ò\1c\ 2\1f£\82)áý\8988xG\1233è\r$×%FHtXW\845Q*\\ 1¡¿TàÚýô.\9c¢ã2ð/\1dó\15À«\15èq\9e04(9¡ï\eËrp\83EùT\13\v     \8c\12P\eû" \90¶²¤\ 6þ\9bØðÑï\19ý\98¸tf\8c\98þn§XتB(F\891\95øêv\ eE·¢\8a-¦1\80A\86Î\r!\1aø\8fHXÍH¢@\16       `Ü\0Ô\0Ã\98è¢\94C     \9b\18;\87©\rA\86\16ä\8dB7\0\ 1ã+\88X\88Þ~\85ܲ\12\82:\86 T\90i,½,©¿=%\ fp\81\ 5ÛÖ¯féK\8b\98O6\15uÆVñ~C|\ 2Ç\0\18P\85ÆSäÁÂ\ eôuªà#°\87ÀØ\8e§¹ªvµx\96
++tÒÊ\ 3\84ß\18ÀDÐ\91!\8d`ÕIZªÈQEÌ/\8c(\b!¬¢\8bÐ^\ 1̪+Sô-¼/\90\11ðRU¤Åàé"\91>Òh\ 4×\14B?Þ¢\8aíLôx\12Âj\85vI_\8eüâvÂÿÏÞ\9bìL\92\95¯\92\9b^ZBEDUD\14\±}Õ@.\88Þô\92`;\8b Ñ\11, Xõþmç|WÍcB\ 6\13¬p\90ÅZEüâ¦6¨Êp\87ox\87S%%\0#\84ß-e²±5½'
\16\v"\f\18'¯;Ô\9e\9aHääk&wæï»Sw\1f\89+yS':Ór&àâÃ¥!¿\1fïûÖ¼ç,\11êùÞ\96¦ê\ 5Ã_Ô\11ý\9d;±zÝ\akUs!ÞÁ÷Ùa\ f½\a\ 6ú\ fÜ_Y
+\13±\8cH,ò\1c<§&*a¬\9d\83\1dè̪W½Ó\91dsï\ f¿Þ\13ñ\99\15Fýïo­@K\87!ê|\e9fº'ú{\1a/¾é¨     (\93ý}7v\85epkX¨lûêT¶\9e\\87'5+×jÜg ¤\85 ð­I\92Þ»Ñm\95N]Ô÷nMÝdT^\82ì\17º\16{G^\84\ 1×ʾ\93\841ÛMP6ê\86ûY!ÔêîRðágî÷í~ÿ­Ä\94\v\84m\8a§xÞ\9fUåÆw×¹ýCÆ<(n\ 5|\9ao´øÊ÷\93ð\ 3l\82üÌ\9cb\aü\9a(ï"ÿ`JPMäÎ[´¤?@\90#»{òb¯ZyÊ·\95¯§\96˯hïSÇ\10\¥V\a<Êë³d\2¶k¯Ú\9c©\ eÔ^EqпCÀñ©ó\90\19\9bìÖüN\ 4ènî[Ë\96"Vô}O}ûºA7 á\93\88ñ$Ü3) Í\91G#û\15düõÌ\15\8e\8f÷\97Þ\bUô˧.:\9dipÖ\80tFæJ\8f¦WWyæ=ëÞ\13J\b»\13\8a\94\9b\ e´\14MÞór\9c\8f\8a\94ôÏ\8bÉ»Q\eä\87:\8bÙN9³¸ÉïÅq³\ 6Þÿ©\95öùþ"sgÃv)Q2\9f,Äy¹Þxè,È#¥[Ö¤ÑÛ4½]îh¨\9eÎ\9d:\ f+[­ØI©=\9fänõ>ù]\81\9c'l\10Ùî\81x_ÙE,\93­R\böª\9eZÜûW©\10áþ\ 4\85\95ͨ\11\99ß=»éb\9b]×g\93{ïKà¶O¿Ï\b   \92%ÚVò\f÷\85Ý#H^_PòÆ®¬\91_A\14É\91\135ôP÷ù\93Mî¶\98\vCånÞ«I¸Ï
+\ 5\8f\96¦\18/Ø¥I| \1cöÞ¤\82ÒáE§\vvW\19\83g2xÌ@ØÖ®\8bÞÛßûXñ\17X7c\9d!\ 1ãÏF9ýý¸MåWõ\86k\87£ o\83\8dè\ 5\14 É\11\87'¥v\aÀ¨pÂÎPY\1d£\1eʼ\19»^\84ð
+;9\95WßöÈYþ\94\10Yi¤¤\80
+'\8bèØÑ<\98T\f\9d\8e+IùdÝUÝ\96`\83\89M@½ÜQ¨
+½¿\ fõéväÞ¸..R¿q>Ó\8fÔë¤âÁ1ÇÞgDü~@\91Ç=Bi£Ø[Ý\94\8e\94²zýbb*ÅW\14]b\92\10w\81§}\ f4è+f\90gU\8d\16?}\9b@z
+w~\r\19\85R"\89\ 2gÕ{   \ 4]TÀ\11 Ñ48ÇÍÂ/¢h¤\93;y(ñe%äÄ\9cÎ?Â}\8aèT®\86D\83Áþ½g´Õ¨±_!|ï\96\15DQ\8dÏ\86Àg©\10æ×áÊÚDºÖ\17Sf\98\15òQ¹g³{ß\85\ 3öù;$´!ð\89§Gâé/ ±\11\10GÃÅ\84mVeÞQòæ¢VAø\ 2¤Èßé\ e\0¡þê\ 5V\9fù"×{«å\r\8dÚ÷þÓ/£øï\91äþä3¯Ê\1cþ\8f\7f¿\9b\vùì9\86\1aG\ 1\9co4@\89>è~Û\1f\82CÍ4J\82K|N\81ÅçL@dóãð\81\8f\84\8e=½¬ë\88(Yr+vd\89ðKµ0\8fnb\8a÷¢YóÌ¢V#iyG\9f¼Øpö=á·d\9ae`Ú\8câv®w³½ÝÊÜúó-o\ eùK(u\ 5\7f-\87Ù$´?²×+\7fìæÿIÃ\9f°hÎ`Ð;å/\1eÛ.\ 14¿\10Üð»\ 4#ÿ¸\1c°ÿF\ eH\ 2Öé×\\7fVZ\ 1Üó\1dÑ«Q\82zÔÄ\88\8f(\11¾O\1f6!qi¶\99RÎ]\1cÍ\9db\81lz\83æf³\v\8d9\83\1cógµ®\13\18ßµå\92      \924Ö¬¦\ 3\14е\a\1aE\ e\88Ú\16\89\10\9d%£\u õ#\9a{\94Ø@\ 5¿³\9a\1cê\94Àè\16}I\93ü\ 4].\9f\eI\9c³°>\8a\8bC\ 2¸î`¢Z=B÷¼\84A\9eQ$\b\9cv\bè°W\1f\9ep%ñ¯BqÅ,6½\ 6ïC÷¥S\9aã\9f\b9\f­\15{\1cj*\1aGYKäà§$Dé\93rùûë¹ó¨ÉDìxÕ÷ånÎ\8asf\89´\r¾æûµsç|y\1ar༬4ÑB¼ê¢\95\9eë \95¥ÄN\9aG½¬Eã\94\8eø}\1cé\8e\10'Z=?ª\84A\ 6FH¼{Ê\92çJ\ 5\9fZ«¡-5w¨EÕÀ\1cïÛ\7fq\ 2Yaç#¶ep\95S)\84hxòþ\1dÒGª\13Ù\9d`\9c\8dó¶Êb\82µÎÈ÷S^§ÊD*Ê\83«FäB.lÛ@«þ ý.jÂÀGxÅF\ 5\9dÀj\9eÏE2²Ú\81t\1e[\12\1fuÏaõ\ 2Û\85ô²\14Ĥ\8axÍO\ fX\9f\80ÖJ\0\97\8e\83Ú\1aT9ÓÏ%dä\9d\0Þù*\ 6·G\9a¶O
\fô(\12P\8c¶÷̤n\95eÑÄæ\ 4§\84bQ\99\8d\97       Þ\81\96o¿Zé¾\18i$ 8\99R,\87#\9a¥ïd0Iƽ#\ 3Ç\80\ 2\b\eÒ«\bqß_\8d.6¡  Åp9>ï_Ä:çÃß{ýZQQñûm´+¦É¬\81\14\8f\93ÚÊ\92W3ü\996\1f\1c¨|`\15ÜÕ%v¥è'¤z)ÝxÚ#×\ 3g!¡YÝ)n4ÚÃ\8b\ 5DZ@Ç\88Í\84:\ 4\84\17\1a=\r\18\ 3Saöëiþ\9c\97u+%*ø[\ 5ã] \91¼\80ÔñN\90X\17I\12`
+\1d=\9d~+\1c\ 6Ðö\17vjH÷\88?A}A¡-\94\ 2\89\81ø\15f Ä\v´zJH÷ý­ºÂl! \13\fÿû÷ÝZ­Ð¢£Ùò|^âÖã=¬»!Ó{\81\bXt³2`§\8fÕn´ÆÇe+ì«öáûNÃ\89\ 1ÕO¨³PX[=]l³\943_\11Ü\15*cü\fqY«\8e¾\eÍmö%âCà(ï\ 5ü^˵AÝ)ÁÝÏB\99w^mO¶g˲JÃFúÄ÷³6ûP§îk;\19¹\953\ 6<}xnwUÃØ0ؤ\8bXÍG\81\ 5Ùv\ 5ýzÔ\1f\ 5
+yÿ\84¤©¬§;7BØ;¹ä\9a¹{\17\vu\9fa.=«ØØ\ 1-<òÖµ"°É\8c£¨Í£B?`SóÈ¡ÅóTE\e\9c\a%c\ 6D\11ìâªd\80ÙűqÝÏUsw£\ 2O\19\ 6ÔR¾ËÕ\87\8fâÇÒõ¡`ýL
+¢ð§{î\9cð"ôM8l×\99T\15hC«Þ\92\15Â÷?Þ3ôNn\8eE`®\9ag\1e\9d\9aí÷õm¶óô\8e¼ÈM¢SS"\98\a\83ÀNÚ­_¾ÿç&aª¤\85ú2µ\17\91)`ûhÁ\11¸ß°\7fYjï\81\ 3¸\13¿óª§ÅaǹLºJòÍ@J.=|Üwø\1d)\19RÞ]·\90±q]\19{¯Ë\1f26 \9bÜ=Ö\1a\9dJ,}
+\9aÖ"!f\15Ro7½È1Oº¥ÍªO¿üiGz­÷\91
+\ 4ïk-ù>¢@ú5\9feTÁcíþ´\9eM\88ê\12e\1e\ 6¬2P¨¹J\9a\901T«ø,ºZ\fäëØ°Í\9fÛï¢Ìm]#\f\90\1f±    2çÈÁéOïÞÔ\ 6E\8d:ÒüÖü\14ïC±É2\1fé\8d\ 5\9fQH¾ðÌ\9d\r)S\8cR"·\85ó{e}\1a\ 5ÐظèÀS\91vG¡ÿUa\11\13\8a2\80x\11RçUÉ\ ee\83eÚH\92ÃÛ\\91\ e¯ÕæþάSi|Íì\ 1O\13\85ù\9eSì|Ö\8cÂ\w¯Fÿº\83\ 5ã¤Ðj\855C(ëqð\9cF+Mk
\9d\9bµè-¥r}\8d|7£\râ\9cU8A¶\v\v\8e\9e5#P̳ÇïvT\2)c=[¢î^3s\95¿%\18¾¿^?ù\81\13\Û¶ yíg\1f¥çÁS9R7v\80\8f|J\80\84\87öóæg÷ÍTSbiûu\9c\84¢qî|a¸\fìÙí*\0Ùê)ÿS­Ù\84mk$"»e:\8dÚ\15o\8f°±*Ö[\15(qÎX)yßQ\e\ 4\1cE\1dk+O0ÙÛ\8c\9cUÖå 3p9\82\9fà,´f\ 3b\ fðf·ÂtúÎ\ f°\93êÐIauËñ¡\81h÷É\1dîJ<fªO\19k='ó\ e²\8b\89qx\12sSS×\9dV\vIÃ\89³»÷s\95¬TB\85«ð~k\92\ 3NÚ;\81\82\9e+\ f½·:-A P?Ù$ðÜyæ\9a\90\ 6z+Wâå÷
+º¨H\1e\ f\88f\97çÏ*\93\vnª±\f°UÔe\12H%²\12¡UKØ2̪¨\94xÌIç\94¥\1cv±,  ¿væ\83A[˲æîrÆ\13.ZLÛ«\ eÃÓ\9cÁ-x\1cç\13\1cR%¹«{ÛOB¤\9eÄÍ^ÒEäp3°UáÌG]O¦5²Ã\11ÑÚ7 \80¶VʶCMR\1aä¬\92:\9b\bÛ81´\91¡\93\8c\1e\ 4#âr\98-1aëJû\16¬\b 'T\80\96\98\11­-sÇÆÞÍù\143@=\e\12Öï\18\Ø»$ý\ 4Ü\93Â*\88\9e»r\ f°\8aBEGå\1eå\13ô\ 4'\f\1cô\r\88ü\10ù´/\rt\92\87?æ'ÍÙ¸¥-eê\ 3?Rè\97GL3\9a\9e÷¢³Æ\16ýÀø(ÔÑ?\9bG\1cø\9cù\1c\ 4\80\84\b`»Ì=¤S[~i\85\97ïïq\91\9bI_gÑ\9d\81\12"A6\84q ðâ\9f\0½\va|'\ 1\ 1z9g\vÊÅÝ£\8b\ 4\94Iìd\14Ad\99À\8d\85SI~á\10­µ\ 5j\17(êÏ\8aúÔ¼R\ e\15yá&Þ\86ïC9\ 5½×[8¹»\1aZÎói(°C7\91C°å(t¦\97Ö¿õÔ\8co\ 5\80d\9b2\817Qj1»#Ãï\0UZÒ\e
+QFO-êé\96\ 2æ\88µ"\15¬\95°\ 5F\ 2u⦮6iÜÊ^ñ%º\ eÉú\81|(\9bÁÜÍOÚÎô#P\ 6¦r%\96í\81Ë¢õ\8c«\84ùè©xqNé3\85\rL&ÒÍÝC\a.
+¥ïu±`\90\9c\9eJ±Á\au\9d\9e­\89º0\0¶±"Ot\1d\91\93áG!2{r¬®\94\82[d³Ç]ªDÈã\a\ 1,\v\1cy\9aÃ-\9b>eç\99ß½Uêo   dÌ\0\a\bº\96hU\90~3\86\17ïgÓÓY7\18 Dj§}\8c(\7fr\ 5ÍÒQBJÈö\8bê¸Â>øeÑê{\94<SÊò;\9d¤J\96\8b/+(7\fOÒBº\97ú
+,Óvû­àå\b\1dRK¤´ÌÉý~'S\19¸\10¦\97¬²Ui\ 5\91+ȽûÚ\ f\98dD>õý¡;Ø=v\19C±µDç\15éH\96Þ;\8cªëL\7fz\ f¤\82\82^\a«Ìû3\13ç°.·r@?¡S®<ïjË\1d)Mz¾\0o´ËÄöJCÊn\87\11Z}^\1d\93«\1a°É\9e)±³ÖÏäés¦Ùw<\88\9e]i\92HäËÝLl\82\95AÊJIÑÞ¿\9bÊáñA\ 2±\8a\89ty3\82ìõtcQ*\1eù\8a&Hwe\1a¹ÌævBúT&ßaÕE\9f\9fèLd\8e?ê9Ü×çã
+)HcKêÄÚösH\13½·ô\94H\83\88\rÆ\ 3 â|×\86\10\88>ÚÐ\f\0i\80\803\8f\12¢\7f®o¿N½e~Íäãæt{¼Ïø
+²É\ e\ 2\99\96\16Ï\1fW<\1e¿Q<\8e\1e,¥}r¦£Ô@«\90!òø\8aa\9c\1d\ fª\1em\ÅÀ9ÝU­\ 1~)éè\13ï\8fU¤é÷å×%âãa÷\80\1e¤®Ñ²M±=\95c\v
\84ó\9cùlv¨|6uÈÒ\ 3\9e Ïë\14øs|\19gª¢ø´"¯Ea\16{\13¼|ºÏG'ÔÚ\ 3\e\998\a\91}\98
+}Á\1c\81Q±F·­\kNB£èN\a\83\13\80\90\8fªÀ°ò\9c#\88J\91+\97ÖR¢Í»´Ð©tÎ\91¸ªüö¨­\0\10ä¶\11\9e½Ø¿{j¦\94\ f\rÈô`\ 5H\r\99\7fFmjÕ\81\a¸lÅËêÓå½î\ 2\94\8e8\9965~4Ó¨\ 4Î\9e-Gð\v\8c{/\0+\88&\99cç]Ñ\vÌ,½M/²Ù÷\94\14Óõþ\93\93«=%îÈ\ 6\ 3ó³\18D\8d[.\94àiÎ{n#o²¾\ 1+&\9aÆ\b<]+.J\ 6Á\80\7f\19±,dI[\a.Øöý¼\9f\94\8eÛû"4:¯\14OÌåøRï\90»\99Z\8c¦\1eùH3Ê£\8b~+Î30z\8cºÍù\8eü8\8b   \14õâ_w\15¢¾\82þøð]í9¡êÄd$Þ$$u\87îkGH8Æ\82§}Á\17\11·­Ñ{\ 5\83özº§Æ\94\e\8eßYà¬/aÅXÐÅÁ\80àE cÀ¹-s\ e(µ¶àJ\ 1\1f×\ai~Ç ²ôÛ\19±\92ù\12wl\10[ù©ö¡µ\ 6\8e* ¿\96ñÎY@É[\a\94!\8a\81Àb÷éõ\14Ú5ÚAT\99:K3²^ö@¸eÒ?\9eö\ 6yíø ïÅIS®j3T¦pÌ ÕH³©
+óéBþ ý\17»ìYBÌ>\ 5a\9a\14`\8b å¯\ 6.^\93\85\ 4\9d²÷\bÝÚÚ3\81p/\13\10æ\80È5¹q\15¶Òà\9a\92\93ßoh¯\87|\ f\8c|ÐÑ-Ù+ë\ 1ýs\e\95\13$¿Xúü\1eÞý\88Ì{KÅ\8f/ ø\88}R\10æSýÖ»\ f\1dÆQ¿Í\19)êW\93\1anIS\85 úôÞÉ\91\92\87\96\bäÔ\93Õý`\8cð<V9®¼¿Sû<9úðº2\1d¶cW} \13ªÍKZ\82\87.#ÇH½\13n\80\8dM\r\e     \92\a=\8fQÆ¢¡+\12ó\8dû1Ù,r\f\81ì¹#Á.§\f\8a÷c­\950tTáUTsõr\f_\87°f·\ 4dtF` J8¯0ü\aü£©\9aK/ÂÊùèß\81\1a\16:\8e\ 6VG:\81C\ 6V\8f\87»%-Fî^#¡È\91)     ¡Ç\1dxt\8f}\ 6EN¾4î\98g^öx\ 6C1â\9dÊ^ð\bîík>PȶּĿ|/{Ó¾\8c^:#e,ß\928ya\v×ÂAH\1d\ 2\1e/T\83#ó(\97\8a\ 28\8f"^9\ 6Öö\87\8c\89ÿà\17MNOo`\14ñ{0\9dÞæP}GZìÏóhE¡@¯9\ fäL\ f6Ó7º <ß\16GVvsâ}      &#ÊüÂX\99)e\93^\8d\egJÿs\19¡¶ Ë\9c\85\e\99¤ÎMï\ 5çôõ\10mz\1a\15(­s²ØÏ»{<1Ö(Âï\8e\90\ f\87AUîv\ 5ÌÞØipªÁ-l\92l,#\9b\ 6\8b½_uV
+\1dÕÆïÙ´8`\82ñ\7fïK÷Ì\ 1s£îwØ\92}\16û\15¨mÓN­xNV§]-Ý\8dÌ\92\ 1JJµGÛ\ f\83\1d\15¼¸«­-ñfV1äý\94\82Áú°·t\85ã5lL\ 2Ùy(\98\að    ÖFHÆz9$|        ¿RmÔ\8fÀ?§\94ñ°\9eò|:Ç\81À\99\17\95ý«õçÜÊ®r\19\ 2æ\1c\89æý.vHH¡
+[Q'¯D\14´\87÷²]YTnG«\1cb\8c\94¸Ð¾±¶Ê÷Ã(ºÒ\80ÄMÎ8Ê/¦\ 2?ÜY\19fÀbo\ eÝñ\r¸Ë¦h#âÅ2\96h~\8f\b\88ÒªßU\17%\1aºÚç<I\98öP\9dû\93\e\10\vè>HYF\16ÐE}¾\82$*3\97v.#\15\10ÊÝ.Þë,öâ:\83ú~      +\1aíSê\9dºV]å\847±IÒ®¾Ä<\r®\8eÄ_"É¿¤Iìýfp\1edÙÂë\8dY°EÚFr\91ì"ú¹«|Èîì\81\ 5\1cçæÝ©øÅ\8f\0Oè(K\89(Æ$\9f\90S´Ý\8cÌô±!«O¬\ fÎ\98\ 2Ó\ai§V®>ÒV3´ið7c ý\8e\8c¦=t#\ e½Ì\e#íL]æ%\ 1ô)¨\18j\1eT  ;iãÊ\1eJíh\17Þ\87V\10[qK\91\r0ø)Réý\91ËV³1\18,/qD\9a¡³7\1d)\1cRÑ'Z'çÙ AÏê¯c\9auKB\17\ f\831ÏH\97\82¸y\a\ 4µ¨\8dÃ<     \90àÏæ;q\13\bÝ'IËeOáÖ\9açO\1cx®Õ¥i\8cô«Û\12`¡©¿¨µ\7f&Cla±ÆKè\1d_\10¯_
+(\9c\11ü¡\8aÖϲI£¡\7f\88`\99\90©Ù\17ÏCßÍÓüD\934\0j\16
+v\19é²£¼_\riDËe\ 6\88k\e\18\942\19ô\7fè,^Énu+r¶ÐS/\93^\15äh\ 3´?ý*¹ü\1eU\9e\97     !ufjVçL\99\87ù(|e:Ñ\87'\96@eµ#ê\94ÜôLá=\1dg¡¿T\85ê"\15µ\8c\85Es[\95\aÊÇ\90áa£úk¡è:è{\15`/§­ü7Î\90F)\89¬Ù\10þ²j_U\1e\96\8eú\ 2Ú6Á\8f§¾i®\8bwªn»@Ý\12¥\9c\ 5ZI\91¡?\ e7\17\18\1a&ÖU\87íkv\8d\ 6=\16Õ¡f+02ª\9a\14\9b$\19Ó     
+ïrW\8eh\99b\ 1w¶é¦\8d$¡Ë\9e\ f£j§ b$\ 4\85Ëm\99\16È\99m\9aÃJ\8d\ 2\19\83§£?\7ffP3SpÞýÔHð\9d\\8d\9e3V{\11bÀ=\9e\82Ï®êg¬Ï¯ö\8d½nØ+×\1d áY¡ëº®º?jWl·©\95\10Ý8E5\93\95}\91ÈKµ        Óðñ\872¹Îß*Ä\80wC\12ïÕ?Â\8cNIR\13QnqJ¼¥V\8b\8d\8b\8b\8få\87M6\94\b       \ 3\19\9c½ò\a»Õò\93ª¸\0È\97îm3\82Ýc\16j\97ø\19\19ªë\10i1\98Ä\8bÛ\ 2\87\14ë\9a\96\ 5\94\r:0-v\1c}B®ôÝáÃ
\8c \ 1%\94¢IÃúºgìaÑ«¨\8e&%\1dÈ[\97x=\80R\95ú¨eÐRR¢@\81j\ 3]\15V\1614ÕÍÎB9ÿ\9c4þ*òv\e    R8w\85v©É ,É\88¼ñjé\ 3_èVõ2Ç\83\8dsT\aZq\ e±¨rgi\89\15   \vx(ñ\vedpÿ6\8e\89\97LJ®?Ù}\86pöç\ f½YD\90S·Ú\8d#­ \97\94È.b\8b¼äe\117\9d0p#Ï\19é.`\17ýª¬rÙ`ø\90Fu¦ó\99\10Ç\9fY¬Cv\82\r±^\9b³\88ñv\84\82b\f}\17\87`\945\8aôG£\82ó\8c\98J\81\86\86\1eÀÒ\83´JPEº0\0\ 1¥ÒÀñh*7Kßê}\ 4\85\ 2\ 2x?Ä\81ù¨\1e­:n\ fO;\84·8À\87ÈËÎþõ\ 4êL\1fÒV3Å\1d¤\14ÔîÃ\94\1dh\8e%æs\96(\11#wi\1eÙOcý8HßW\81\1aN,\8aÅ<\11ñ\1f\96¡L\1fÎOGÌî9º\89û¸\9e\19¤jR\ 3j\f`\1cLë¡[¬'Û8JAi\15v\93=MX\1d·Á\f\9dí,¡\19Ø\9c£
+ftªµ \94\ 1FqnS\81$\9b\91Ø\99Ú»\16¢ììÆ:\86ºG°$/\80.$ª\8c\88î¡Ð¦¯\0#úüyH¬\12\9fz\O\14o\12r\©r\ 5ì¿\1f£Ã\13ªsõþ)²Ð¼"\94\ eq\83\fÊÙ\80\ e\a\98^n\ 3F\\ 6àþ\93\8eâÃ\8b\8a8\v\86\r\8a\91<\1eº\95ü\1a\ f\88í¨ûÅ9I\87\98\82¿d(l\15ìá   X"ËJííÁ9Q\96ñ{\893¿l\82\84HM±\8f<ëÚ\95Ç¢\1fÑWA#Wé?y\96R\ f²Ô©eQÏIÇ1«\fË\vìg!Egq2Y\ 3\11¹\98½¦)ð\90[\8cÒ(\8fÀU-¼/\81V      Xz\ 1ƶ$Å/\ 4hð¢i1\84o\1c%\94\f\19¼Jâ >¦¡Ý²æ~\9agD+\v>L¯.qÊ\99¶¦
+v\a\84ݸ\7fÝ1µï»¾3ÓY²\f§¸@ì\17/.\98\1aà/:\81Ê\85ö\16\85\15M\828Ý#¹B>¿{­ÕÒ¯R\83}fuFPÀæ<\99\ eó\9c=^]"½ÛÀG\8d\aî;\82ày        \91)\8c°\e\ 64J;\8dÇ#{\8b\14áh\9fr\81Éùë¶~ì»\v/{\ 1\vÐOX(ñ\9djiÿè\88ùÅ¢ÎðÈð2ä\ 6ú\12\95;)\83\89\86Q\82ì(V¬·ç\8ef\8b£æ\b¢\93¥ê¿\7f\7f¦\8c²V-JeócÈ\9bL6ß\86RgÏ\87è\ÇH\98= ¨ÕF;VP\ 1\8d\95\19óý6B8\113¹êSϽ£µ¤\8f\81C¢úêZ\v
+\8e\1eÐö\7fȨ\99\8d?Ø\Ä\9bå\83n>\81ÜѪ\91\1d=ýߺñ{«±|´\8a+G(\9f<
+¥7\18\11\13«¹Ì \r{\1flW\b`<öÈT4\8e\14&R\8e\94\1fy}\1eu\9a\1d"\81z\10 Ba_\92\87@\rÝ\95ø1)?ä2*Õ«¶t\9b®Öôõu \0ì\8eÁa¬/í¶Æû©èZ&\ 3¤¶¬\16'Àf\873!\ 4ül\10\ e]ïA\Óç§AÅb5m\15!Ká\9aUÞiHÙ7Ñ\8fO,ÞYX!V¹åè\9dÜ\94\9d­qCØiÔ'fïQo\92ýèÑ\9ac\93RÈåå>T(#   
+nmCQ¾;X\1cû2½àx×]\9fx\ 1²_\812^c&ÿÐÉ\98#Òº$rÂRñ¾\ 4òV{õ\bP\9a}K\14Ã+¬©á\1e\9f#\98ÝûQú\ 1îªÂ=eUÁø\82dm\9e0\7f<\11\8f@!=g0\93®\9dÌ3çõÑþÚg¤¤L\95¤½³\13Y$¢pr]\9f\87h\9cA-d\15²¬£e\95\92É
+T<Ò\87×e«¶ÎÍ4]À\9c\=\ 5=US¸õ\96e\82\81'\16\9f\ fº¬\97\1a\rÀít\9fã÷¸fÀ\9b"ôìL(o¸>§_\ 5,,'\1fþU\9b>\1d    $Wyø\942\9dÇWíÔ6ÕîlÌÆÎ\82Çn¯»²Ò\8d\99¢õ\ e§°BuÀ\1cö÷\b}X\ 2Z[²\97\10ùÜR¿\1fï×-\88¶Ä\ 6\8a ó*t³|\7f\9cIËp\9fûÉì£ó_Ë\ 2HE\8aû\1c\8d\88é#j\13gS\1a|\97\8a\12³:ª2é\12ò·Ç^[ûpª\94M#d\8dÎë$n?-%\9bÆ\18*ß%uM_å2c*Ä«\r\99-t¡\ 5\9ae©e%Æ\96î{Dv\12ú«èw*Ð0d9\1fv\11\9f^\97Á\84\13tWÏ[\94ñ)QB@+M!z3¬x\0h¼çÌ12)®\v\8fKÕ캫í6²\95\ 3Æ¢lHOº\aäwé)+yJ\1a\86º@(fÌ\94|P\9aâ«¢T´²VÏÂ\fS\13#|E¶\85\14é\8e: 9\1d[âñç§s6°\83\92\ 3\9e\afwiZ¦²ÚÎKÛ´Ë?Â-\ 3¸g\11\9c+\86¹V6¾Ãåt\ 1p;ò\r\8aäÊ\16y\85Qe[çðÐ\1e¦\9f\1e1¯Pt\ 6?~'\83y\r      ¬:ô\f*ó¯ëÏQjWcÈ\14ä¡\82\19ÙV½\fBî%\94§\ eèj'?ÝCå\99ÖVú§\rZÃ^F\9b\80¡aâ­­ö©»/ñt\8b\ fr\8a¥]\9axü3µø»\1c¼g/óA;6¼¬\84Y\7fQ  ø\9dªÙ]\8a¸ÿß¿ý¿þÏ¿û\ fÿô\8fÿå?ýÓ\ f¥_ûïÿ\9fÿò\1fÿñ?ÿ»\7føûÿô_~ø»ÿûï~ü»\1fÿß¿û\87¿û\8fÿî\1f¿üý?ý×\7fü¦\1c\1cÝß¿á\rþÃ?þç/?üý\7fû§\7fxÄvÿ\86rÈû7üÃ\7f¨ïþÓÿo¥`\9c/E\85óg#ÿæ×W÷\9f_\ 1µý¯_0~~Ag¶ýõ+Î\9f_q\11Èþú\8a\7fóû7ïßþׯÿùïÿá¿ý~ùR\97¾h:\9d\12¼S¿¤mu@nö_£ôå~n\9f\94\1aØaZ\ 5ý\8c¢ÂS5\v\90\f¼Fp\7f\94¹8Ýhƽ\17ëU6Ü´ÿ>EO\ e \1aó\ fþ\87f\96)¨å¢¢?\99¨¸ÏÌ\87a;\1eËW\94Ç\b/\9a²  Û\14·\r²e\8a«ìi\1cc×ú\80¤H×\8c\rAo\1fä\9cð\1f\f=\10\8f\bxl\ 6>ÍÁ"ôûS\15\82¤©7¥pÏR9\13\892\ 21\8fÒ\1a¼Qj\8d¹\94Ú?È\15Ì´ßÁ\ 6\88¦\f§ú
+-å~\ eã\11íêúT\94Ï8)\90\92\ 1\9d\8câ_\9a1bàW\ 4\1a--$\vX¿\8bíú×\85ü¿ìBþVÛ½~«¶{UÓáT\ 5'Þ"Ð\ 4(³\¥lÇn¯Ì\10ýh£\vX'°Z8\0`+\99Üíª\0wE2XþK¹ÅS2a·ísD¬×¾{\17\rm`ÞZz¤Ä\ fM©­4òé\95\1dÅ:)ʱ\82\8eÀ\ f\ e¨\ 1¾\85eIäIimÀÊYiZ\13\84S\85"¢à\9f®t¨\85I\1c
+b\12N¼0O}êx,.-(Øt(\1dͧ\9c`;÷}TR9\112\b²¸TÊ #ºÐAK\131[õ°Ï_\a¥\0Ìri<ïÔ©(c¸U\19|´Ò"±9µ\12Ú@CTh\1c\f£\8e\92\91Ò¥ÓZëû\96m·6÷\fÑ}B[,.&J§²\9a\9e\b\ 5Ñ©Éõ,\8fx¬l\1aÕqðá\16Î(èõÜ\11k­"\86\9bÞ\91©¤
+r\aA\89ͯ\97\8aÑÃLl\84g6\98M¯dÈ\97\165±µ\9d+E\1fÍþà\ 6\15\9d\ 5à·Ôt\1aG\95p8#ZÍÙʵ\11¤áH]7²á³\1d¾ßU£\ 6\ 6÷<²Gºõ5+\80¾Ù\bn\90\91Ü.öÑ{\95BåùTÁNKKHV\ e#gª¤°\8c\18ÉC\96A¾Ýõ\19¬\14ºðU\8eäFèmv:\92$\80oJ¶Q\17ÖnNítçÂ\9e\1f½ \8dþä+õ8*}Í÷ÔS\9aßGIÞ_|¯|\9cE'FN}+¹nGK¶   \ 3"3`ªöò\17=\9f¤\9d[O[\86\9dÉê)\8añÈto\83·[}Ýh P\17!i²Á\8bP·O\9aÍaF\8bŪ\13\ 5åb\f0\8d\82å\9aû!§Ï§~<£º­>\8b\ 13Íï;¥:&nÀ\87\93¥»í\1a,\18$â4©\ 2[òê#¹³ÛÆ\97\18\87éc@v.\vú¾\1e\14   Y0ÑÃc-\ 6. ºV»\88\8a´$.B\ 6ê,®å~\84\8b­\vÊ\19ñK]\rØá¨\fÅ\8b>u\1dùèV\13\95#WÊC\ 5¾×\8c¸<ûÈ\19\15Ò\97\10Bh\16j\1fÐ\82\97\13\86ðïR\9eöÜJI¥¯t\93û\9e\ 2\19F¨6\88!I\84\90\90\11nÓ·ìm\1c\9fÞ¼>\83]\89VÛËrUÎl,äFÇU½\9b\8a\9aÎÔ·I\re\8d\8fÈ\1fRo\8bá¥ê(6í\96¼nå¹\1a\82­\87©¶\1ag§P\9eÈkñ$Rd&\86ó¼Q«Âú=ûá¤1®il5­\bìF\96)@\ 4s\15¿ªá\1c·FlçÞ\998Âc.;¿·ýì\17 ¤Ó×DìõEÏn\8aÿ<³R®:\rÏ|ɯ¿qPþ寧>ó_jÄ´Ç\1f\9ce\80áSzê\81GÀnѳb\8aA'±µí\84@\80,A+\87\0Þ×b5\eÊ^,ɽCÒ:Í«Ýl\98ó&ú\97\1aN$$÷õà\ 6F\8a£ZÂPÕè\8at¡DÓsò«Ä\84\15\87d$+Ôy\11\894D\80óYÈÅ   £\876\1e\ 4\13F^ïeS)    \95pz±bÙ9le\1f\9a\81Ì]Ýçó\f\8f\91Í\ªÆ_\ fÓÿuÒým\11ñü­\88x\14\8c\13\0)gß\8f\19;ÖíXpé#Â\9b\88ºÞG\ 1ã)\8c@x(ÁVJ|\17jN£\85\89\ 2\10ÍW\ f¢]Â:DkEáÿ¹:\ 5¤{Ê\10\ 2\0E(8Z^c-\97YÕ%'\97\86Ã\97@¤$-\ 1ï:\8fD\94Ò7{     xªælOxçGY':\1f\0\82ØÒHyÜiÚ[¥Âf\9dïÙ\8fº\8a¬      EÞ#2\7fC\18C\8b¡\a(5b\8c!dÂ3¡N\ f\7fÔ\8eðh;C"\ 1\ 5\8cQA«\1c÷ü\86\8bÆY\ 6)>b ¿¡+^]ëÛ»,{\8aJ\7fK\95}\94\11\ 2Ü\8fU\12ÏhµA¨Ñ\80¡\8eEp\19m?òi\83&*ðÊ3\1a¹*' p£IN\89ÿ\9cë£1JJ}Ä\98\81(ænévèÝp\87m¾B\7fÝé\ e\12\88È<ã«ÒI ´ËÃ>U\a\7f\850]2|
\10\91\80«Ô;aú©b\váZi*èÌ`Ä¡¼´^d\9d#_û*\16F,À)\1f¶$\b\f\84
+<"{ÿ%\14\1fÀÂÈ"IÝçEÂ\1e\b\16U\8a!Ê9"Í3®BWà\ 4\ 6­¤!)pGpKeLkÅ\ f1}|\18Í\0\16u]¨vh\1f\89\\96òþÄq\808\0fÔCâ~MðQ»¤\93Ú£¯ø\18ߧõ¸ïh¬­\8aWfn\86\88\ 1ê¬P`Ý\9dwZ\13Íf^ó\15\1a\85xUKu\89\1dÝ\1a?'\92O3þ2»Ø4ÉÅL,\15çi\8a\81(÷·i_\96J\94\ 2´\ 4\1fISv¥\8aÂlN\95\81DBoAîª5H\9e\1f\85èÜ¥\93»µáõÓ\8dµU\18Ü
+¿(\86¶K\7f6\ 1ëcÌmd¯^Ì©\92°\ 2\9d»fkÔæ\8c\bé9\82à\0\fDfA·\ 5ä\bÏ\97\99Ì#S\v\0÷\9e(\ar 5\0d½F4\93]p«\14q\1f¬\8aM¤å¡·\8b\86¶j\86§'FT}fÉ\8e45CÔæs\85L\1d¾*,\17º¥ô´á\8cÒ{¤ÍIe\1c\1d1*\93¹aNÉÝÒgàq\915\81\8a\869#\8b6\ 2£ý\b\ 4Ji§[YÏ÷³ð±Ùï§YEÏ\13\ 6>°µ-F×{|÷Rk\80þ\14\85\12Kë>\8eS`¥\f
+T\ fJ6\83ÙDëK½\bÛ7vû¡r2­\98\90»$\85U±©il\82Ì\_¥\7f R\9d_ÕG\0Sìa2x\12xÃSg»ân\ 3ÄcÙÙ\14\92nÖ]\9a®¿À\84\92îºÃ¬Ü5¶«¦       G÷\81o\17x\15\e×úÀeÔOXQ\ 1OÃCÎ9\1d£"LØîRk`DgäÙ§ØVQúc\13mZ¹\ 1\81»«\ 3Ô\94¢³\89T\a\bM!bª«\10M
+.\80ÛF}t^i£\19ÓÓVê\8f\1d)\rMLxãã1FBg/ªX$\14g    4|\11ÙÆÒ\ 1\83/åº\v\1dA\8d\8e        ²Ê\1a\ 6M\8b;ªâ³\94¶A^»û\9eÉ\ 5Å\9fÅÝ©«r¸«G\85+\12È\82ë\88_\r¾5Wõ¿\90 08h¾a»JAb
+,\ 1âä)ß\83,8gaÌ·¸t,¡J\8b¯\15\10\8c\12 Ô\bOk\7fó\9e\ 3Ce\1d3ä#ÛZKl\a¥\1c1\14e01ZHNPf#©\88\10Kf´\ 1\83\1cØ\9dH'!Å\fu?YÞ\1dz.\81HE8-¦Ý\1d#ÆY¤\9a\82\18\ 4\11á´(Uàò[\11ÎÊ\1e\ 6.ó´DÆf?AR\ 4¤D,5öLpÕS(0à¢\9c\88\87Åi^}$\1e"\80¸kÀ\9b6J\90ɸ\8d\ 6\9eá\9fI(1Þ¥ÐÄ\89\ 6\82Þ \12µÊñçKâCe9!Á³q\eDªW1Òø\15ºx\1fÞß~\a\1cÍØàÈÇ0\r '\ 3ç{3å³ìñ¾\9e÷ãý©\15ÔUêÞð=Ä}\0\0¿3 Øί"ØßéÒýó`ÛG/ÒPO7çÇ\añ>Ö4\82s\ 6R\10-1?ÜDè5jsÈc<>Àö!B\ 3      Pò-\8aÀ(\18\ 1®cnÂø;.×Ö\9a\ fÅÿ\fÈ\vR.ú\1aó\8e\82=Å7
+\14j\9c\ f×\8c ìJÁVÙ.Ð˽"³h\17éRîÖ\rM(\ 522ÇÓ\9c\91\16}*|=z\8217lAàGT\1e\13\ 6\10G¯ú0äë\10\0!\08¢¹5ãy¡\1a&\a       ÒCH³aæñ×\13½ÿ\11\88÷ú­¤ç\1c     ÅX\9eï¬ôL\1f \170\94ÁC þ\ 3\89\93\8f~\85н.\97qY`º\1cn½$`\v\bÇ ¾6×,V¨/\1fu02ò`þàL]w\91GÃdÅ\vÌ\8dD\9aç\f¥ü\146çÈ=\9f\85>\8e»Õ lÐ\95M\92·Rè\10Þ\96\8c\8c"¿øzÓ\r
+endstream\rendobj\r24 0 obj\r<</Length 65536>>stream\r
+¬÷ï!*à\7f\8e%\89ïÁ¢\80\bßw°\18Fu_Ò,\97üý\92\e8Cü|\87\17¡:«ÀôJu¼=s>?\91\12\ e ÎÛ¨ú\ 5»\18À8¸kCW0\e\ f\9eý\ 5\17\16Þük¦"õÒÄk[»j&WÚ\87§C¨¢Z)Í\ 6\1fø\92        ÊÎb¥Z\8eà)~ýTOÙË\vÇÀ¡\ 6Þbj\835\84Êa\10E°B1Ï\8cÐn\ 2\ 5@ö§ìÑ­´õ\80bjŵ£Ý¤iBWY\ 1\ 5&\8e·1Êç.
+$/¨²rWt \94\Oï÷Ö*F[Ì×ãÊÀ :C)ÒÊ\95{yƪ\88\83ã\ 4,óþÛxí\85\1f]!X©\ 3C\86sRïÛó·\ 5\84¬É\ 4\7f\8f\98¬Þ±`ÍE©"Ó\ 5:ò¢4\8dw@;è£ú}Wÿ\84EW\8f>"¨)M¤¯Òµ\11·º\86X\7f\80+=\96X\94v­$ısÿi\96\\1a}g+¨\0\88åç)ÎW8\9c\875\8dô\ag¦b\8aÔ¨HEÀn¬§Î\ fU{\ 4\ 3\ e¼Ë\8aªö\10\11\ 6\93\ 3øÒ.ä}Û׳VPN¼Â\ 5DÃ\B3úG¨i mÇVþR¬øÖx£\ 3¬\7fÝEfãª\a²Æ\18\ f\8e\ 5\8e¦\8dí^\ 6üâKT\9báOmyQ\9f¼\ 5§ì\a\9c«´c\14¯\ 4M©"6vD{)¦ßý\83W%­°+\8fPadʦXÆ»\97¿ÁNþáE=U@~\94\ 1Æ]í!\7föÌÍz/P5ûÕT÷î\ 5\e¯åMÏEz¿®\11,\97w\9d\ 6WË÷Û-\8f\1c\0åó\9d\rÇ\98UÄ£/=\ 4\89£gx      /õ\b²×Ͳ\81a^h\98\ 2`ÒåðHÿ]3\86;L/ûz©u\ 4ºë\9d\1c\1cp\91aX\0#2\10úéê\892ÓZ°\95JçÏl\83é.\86]\19ô#\ 3\11ÑÀ\82y?D\17\1f¾\v\8bPçêEÄ\84Ù>³j¤£³>¥xç*m:\13JQ|mÉ'        ÑTÖ&¢\96qF\r«*_¬G
+÷ÖZùª×QOË\92Ø0\8c\ e\ 3Xe\974¿\b¤£\8aPz D   l?ÒüiéÑ2óª\10\v\ 5î!Æ,Ê)\11¿Ö³ø\15\81\185Ë-²½¸\ 3\ 5å\e%\8c@Ù,ÒÌÑL\1c&Ø]\ve~ÌùÍ9Pz:AÈ{.]i\8a\8b\14¦Æ­±«ÌëÒoÃ\ 6\99y2R[\88\909\8dîæ!õ1\89\96\rñ\9c\v[\191gÜ`\v\1ew\10\93\87PaK\8dUXW%f?gt\11\ 3_O\e\1d(a`\ 1qcêö\®\99ÖÖõP\9eé\97Û¡\14\8bèö³\8dÍ\9ag\9f§0yÊUæ\81%2÷j\1f+ïÓv(ص\95ÿf\93Gåa¨KpÇ;³ÎuOÇþDþ$\10\16ï  Þp91\90 ¤ÎÈ{Í~\8b@º,ï^­HÝf+N\99B{G\ 2\81U­+\ 6kh*\ 6kD\15\að;ö\9at\1dÃ\vèG¼%\18Ù­FÎ\19Õ)Úø\9eµb?\ f©& «zb\12\81\90¾U«(EÒ·\17\ 2w\98½\82\99\9d>'°Ï\8cøp\7f\15ç}\97Ü@\9fõ«\82ªoÀ±qF'7dÜ;Åí\8a/ÏÈÙyÆ·UaX_\15\82¿\ 2¤\8câÃáÙÊÝ~d&Â\1a¢m\9b\96`DõëJm\1e\9cÝ·ÛS7\97?\91\eXâºp<\12XÊöþÑôJ£\92¶ªIé¹³g¿Dp&ÅÏd6}\9cu\19t{éB .ÜYZÁÏÙã×aý¬Ë\83P,á\1c\7f`ä¿\7f˦¯¥²Ä\9aUÌóG\ f\vZn®Ô\83Já¥\11a\16¨Ò\87óù±°\19[¢þ9¾¹\88\89äovU\91@v¼\ 3æöy\87\ 6\ 3\86ij\80\8d\11zÙ,Ï\18ö}\15\ eÖ\ 3\93\19g\ßstF\ 6A³ï®U]è¶\18\84Px\81\92%0\90\9eÁ¬¸ç\bÎ@ñ\84#\ ehÙæU2=cp'a\ 4ÎAI_¨\7fêfF\89\95
+g\7fÀ\f%·o&ø\80\14z~׺r®\ 2ePR\14\90\80\99ÉÜQüG¤\8d\9aØk~3¡Øê­ä\10¦\ 3³\8b¸ \9a\84HQÊ\1d\v\7f])æ¦\16inËY~q¸S|\94\828%6ý\ë¸_3èjÉCÁÆÌ ´mVL±1\18­·¤²Q\19\11\ 6SÖO¸\18<\10\1a«\91\96%\1fð\8aø)jo\11¸\80\82z>²  \84Ö~1hC´_é\86È\83Q\81ö\8cÓÀFQATÈ\19µí¦\8d!1\17\ 4×Î\99xX\89\ eTD\17\1e¥aÅÌÏ\928ª¯Z\ fï\8c\18¯Ô%f\91`~U\83I'fÐý\ fzCRÑ)+Å"P\93Á³\83\95*\1cÃQá\bÂÛWõ\ 3\1e¡\18fÆõè¹²÷£\9a\ 1\8fP%ëåw4ßä¢Q\81\ eê×+ökç®\89¡D\11:2CH\ fôý]uÊYÀ)Ãk\8d\0ÏÀ\8e:\93\93\17äV\7fc¢HÛ\95Ìs%\11á\8d¥t2\ 3PëEöùô©AÉ«\92èC^#JGç\1dun5\ 2tïhª
+Êö|=¢¿¹\15\1e\99nû6å\ fF\86s^wq\1aÜíï#\9aDUò\ e\80\974\a4\b\ f6ñ£E÷²oI ÅWyJÄÏ\82Giþ²½ÔüÇ\17ªg­ÅÂ7e5=\12Ú~Êå\11×a\91\8bÍTþ\9c!\92\89\bó½\8c\89øÒ{Ô´\ 4Ü\12Å(*I\10]Z++®W&û\91¥PÒFbpF\81\91v<\16\17\83\ 2ã§g1´\a\1a-<W<¢h½Õ>ò#ϵ+\ 6¦LX]²\1dº'\ê£üæ^)æW¥ÿx\8a\8d­\1c~y0yT\94æß3ï.n\89Á\8bú7Ïòý(@uÍ"Z5<\15«Â£÷,g     å×\1d²µö5Ø«R>¢|=jS\1a\91lì=²§ê!Ï\88\14Õ¼öó\88(\1f­#ëñ\8cG6q}×[¥$x\1d
+ÊÂ1\eâv\1dtue×óùèEN?\84N`\1dåôªªYÉ\ e ·ÔÞæÕÒC\94Ïé=Ni\92ÙÐ"°Fót Ù5£\82"`Êg»Ó°ðq÷\9aÄ\91yrr]÷g\1a\87©ç\9e\87\8d¦RÒ¢$Ýx'\80ËV0\83LÇ*Çks\1dÆÇQÎxðsÚ.JiP\85Lî¬\93ûÏ%¡ÏÛéSÀRÙiÿ\1c\ 5<\89\97Cf±\18O\92òQ\96¥G\ 1÷Ì°#h½\8a«w\17\85\95/èQB¾úP¿òøFXïj(c      ²\8b\vf\18¢å1!\a\99Ï{¼\ 1%u¡,ËÖiQ\a\8e0%a²ëÚ¾\148Ïé\18Á'6=2oU¹\8aѸ#è¯\0ÎK#\81\84Äìy\16\87ÀØÓÙ\0u\9bÃzE\ fW\1f/V\bçÏøÈl
\93f\87t\90¦&¤§v\89\80Î\1ee\80Ç\88Ë¥î\86þ\ e\1c%\16Ç\99|É­Þ#·ÍÁ«Ö2\ e\16«ì×i|\8b\88\9a\10ÞÙáðâT\ 2n\96\93;#Â18Ní\ 6×s3Ùä\1c\86çH§®H!k{\ eÏÈ\\82Z½>K"G3,\8c(îS\8a¯{KÿØ-\82Î\13#³¥b\81È\8ce!
+bÔA)\9cô³\82\18*=\942ü¤÷£\7fúÑQsX\8açÙ\87s\vUÝxÛ¨\160ÌÏ\1ag\90\90PZ\rB\883ùZ|Þh¹?Ú±\194­ÜÄjáëßFñ\10­[úÅëéØÌCôK\80\10l\8fWÉP|Ñ\92ìXwé\90òñ«Ìà?º\R>\12}îýØ\98±Qê`ç\ 5ç(è©\1e\17¼¥ÓP\97Á\18\12¬Gm\95¾\15@\13\9e×y\ 6[vZ\14Ü¥2H\12;3yE¨«\96Vp Í\9f®pblN"; \94R+\1dÆ\14 ]ú(ÛØ\98¦\95"\8e-¾/J¿_áá"\9b\91\1fuµh!^\86,\97\1e\84-J&jw²\1d\ 1»\a°ñºJké:⽩\fo\vb\8fûVWÝâNx\91\9aotUì¡þ2Sù\1e©+?FPù¥\15{µµ\98+áÃ\95i\92ÏåH\9bb2\ f\88Ô\94c@\ 6î|\84\89xèÈiP\1a\13àÂLMÅ\ 4\rÀÓ\1e}Õåz\84-Ò;\82,j\bvEë\97\8d\81µR¹RÈZ±¸u\85OY\1d.\ 2ó\9eÅ\15¡\14j+\92\fpöPe\8av\95º,t¹Öø4Ç\9e\9f ¿øV\ 6:«g¥"óØ\14¿b\bQ\1fy?*\88Û
+ô³I0õ·zö»lÐظ´¼z¾+±L´\85\ f½e+ÐË1O\986\8f\84\b2§^±oè\7fdÂ|g\1aü3N±û\99Z¿Â\1cz6¹çôõ`\ eeuq\ 4\90\9b2\95Îq    ¦Èß\94ªß«G\19­]½ë\9d\ 4];È;âpòñ¥"\17^GC\82Ä:Ô¸\14Ó\ 4:F|7,Ð\9fæýÇL\9a-Ò]\r\92»ZR+Õêë*Võûû    \ eBÙHº\ 6íl\94É®\11¼ã\974×EØCÛ\97zÝï\18L_-\88?*uï\9fݳޫ¼F5\17\8b:Ë»}>½¸\93òî´Â\ 5¨eD@û\9d¦¦\98Ç\9c!gE-fª\83ã\99«×§QÙë\94s×þôôl¸\8a%\8d(\11m\ea\b¥\ 6v]Ñ9y:v)\8a$0A\1awZ\16\11\a\8e\8d\17`L\94«hs\90\98î\84
+Èg\93:q|qNS\12\14oC\91\eQ\82§}3¢ÊòE\14\88Õx
+FïWþE'\83\eâ¥v^MÀ\84\90\11h~È\8dR9§&¶KR\95rt\8b\18\11 ehH£Çù\81Þ5¼\ e`
+;VÙû.  Ü\18´Ñ\86bÓÆ\ 3\92Êñ]\92]ãL<©0Åõ¹¤Å\13ñ\1d±k\e!öî®Ê\aè\v&¬6\14%¶~\84ðî®sõ¸2ÈÇ\86Ä\88ô=p²+´wõ\81¹#e¢dpK1³ËÆ÷o¥\1aèýªóuT\1f\9f\8bZ   \ 3\9aÍÈô¶/`hvi\90üg[¥ØØÁ\92HE^\16¾úÙ\87\88\e³c\12_ÄLøû\88IÒã½\87òØ\15ßt"R20\1a&tÿI%0!Z#\18Æ\12K­ö\86îQ÷\15¯\ eq\ 1©Ý_áj\90N\9f\8fåS¹Ê\811Úe\85¼¼D \8d0^@s\1cAe\81wÇTx_A\ f\8ebc(?±EÓÜ:\1a\8aF(=Ü\180ñ½(rÑS\9d\ 2Ðèî"Å\90ßq¬Da\80|\95Ë\aظô\ 3õDĨLD\ 6m\94\9e\ 2Å.HTO      \94¨\e}\ f\98\z>\15\1f\8e26ÍU<6Ï\80tÀ~ì\95\ 4Ô\8fSF~\8dÊæ
+é±f
+>«Hi¨,I\ 2\ 4\84\18\ fQ\86áT¼h°\9d«\1c\13)l\96Û è/\8b@\ faî/\19\e;&\1cã\=\86¥\ eì\94A?6\99`eÏTêÎ\9a7¢éZ\80h
+ÔÇßs\Áx©pv\ 4iüÕÏRzU$îuç[»8x\11\11¯\bå\96÷5÷ÎU-ND>\0QÉJL\99÷\ 3\96ä*,tü\86ß®\8aæ\1c?\83ê\8b¾\9dg~'Å\11þf^z3î°9ù>\1aåZ\r>FÝ ¶5ÄiÁt\0\8an-gºmX\v³#*pk&\9c\ 4W\9d\14pG¯À\88Snã>\8f\8fó£=£L\1fóc\15t\87>ÜÖÏ\88\9aHWð\f¢$£¥gé\88\9fQÝÝe}\ ehi\80\0]      UFd\8d\1e/®/:Ï(\9d\ fª²ÇXæ ûêÊ\ 1\94w)\vÆ   ¶a$Ñãõ;ÖÃ\13\15j\13^Då"\9c\aúø¼Ë==Þ\1cj¡é\ 1\f\90Â}¶\87\15ï1Ë\1eSÁ7à:\0\953Õ]åý%tÊ\\91ÁÐHp'iÊ.£ê\ 6ÖQhKRy\ 1ÿæ:"ÑE®\92ô>ÆidzÏB\86\r`\12\86?\8aì\80\8e\19\98Jz>E\82#Þ:_Êfg\14&^]â;>\8b\f\83×\86\a¥ÂU'\87ø"+Øvè\87\9dq\7f¡õ\8eÑ£#\85ià9\9fý)n\7f]Ð(\a\1a!%\ f\9f\10\9dx\83»*Ì{>*! Þõb\89ðm\0ÂWTÈÔÆ]Âc\ 5.×o¡ã\v.[Å]ä\aOa\bq\1dº"\87µî\98\98æFË\12%bG\98ô/QÚ¥âLN+\88\95\9c\82$ Ä%-¤©õ\99¾&°àsu[\92IJnOú¤.`Q\92GLÛßÙ\7f\90P;åiB®^\92ñ
+\96¢¡×\ 4àÍÀ\90      yÎVB#ò\96\8dÁR\85\165\e¢4ɤ0\92¡µò¾cVPvG\81ðbÕï@³\ eÀA\ 4\80*Øsvp¿®rí4\0<#!\82`\11Ç-¬¨¶\10\84![§¦E\«÷     \1dãû|\82M\1fÊŶ\94°V"\ eúQ
+û1p¨\89|\17½:C¥\9b©hìrQê\8c»ÅÊ        ¥\95\98\ 1»Æ&3\ 6\18ª3\10È)mGô\83\98!¯(\e
+Â\^L\1fྯBq¾'<ï\vqWÄ&µ?\1eä}´ç¢Ö褵Â@\11$A\8eÑ\0\9dæ°Q\93\17=\9aï\ e­®I:É¿oB\99kZ\-¼(Qå¡BN]"eTå¿#\9f\13ÂÇQx5Þ¤\a\9aÅ×Ê=È&\81uHu\15Ýyø¢%~\8cu\86~\11os\ 6o\13dl÷ëHÀv\0Õ2>¼_A¦êþ\8c\ fêì\9fÏúYîó;ÄÊ\7f¹R\14\7f\9b\12ÅA\11óo\92¢0¹þ\9b¤(N@±\7fý\8aë\97â\15÷ïý\8eùó+&Ëú\8fe\942\9b[f\9d\8fϨ\96¬²¡\ 4v¯$Úsd¯a\ 3\11tÉô=\1f\1co\12è\99üï\92û\ak}X0S\91\8f\15õÞE\9b\ 6õw\99t\81Z"\ e\0û4\v\85ª\ 6\13Õ±v=H\a\9aíG´ÝR\14\89¦Ô\95#\8b¼\92\94\93ú¥~~3ø\8e\17/!¡¦%³{Î5¸÷->µÏߣÜÙ½\e\88ø\8e\17ë­í_\8f\1aÕ{ÝÓL3\9c9r\9aßåAüþv3õíû\8e7\fÄüáÁÙ#6o\ 2O\88´\9f\99¬:ç1A í\v+Þ`\bÏ\92ª3(}îÂÿ\86º4ÿº\19üs2}÷ñ\eU7ôÂ)KM¤0O\91/\b|\1f\1cX»`\ 6;ÀÇØü\rË4,\a}\0¯ùäíï\85Cc¢Ì\19D¢Sº×ç\9a\1aØ\16\87;f9 ^:5¯GÌmG\ 1z\89ä6õ \8aFóâ:Êõ\ 6øõ\94\81I\9e\ 5×\95\92\ 52\86¨ü  \82ÙRï®\1dl)v^§µ¢}Ýw¬UÃ.\90\99J\13\82à^zWÂ%©æCÆ\97ؽ¿\98d\vï ¾\ 4V\1f\8e\ 5½!\fÏ »\91b\ 3T|ÌE\92
+Úë\11+p®¤\8f\97DBPí.oB! ¾=|v\98±bÌ\8fhwð\12
+È¢¥o\93Û\b\93\1f\9f*³ùî\94\ 6èfÂ\17\ 1\86ÍßPUÙU\88;ѽ>ã®Èw_\ 1
\1c!±¤< Oô°Æ@pÈO;\92Á\9dýóU\85\93pCZêðü:\8doIÒ{\9aQïP\8aç@0
+¾ùN\95T\13Ñ\1e\94\17¬HBAÊ|ê´û°\ 5«=\ 2\9bI4µ,XWT\17{YÌ\80ÑÞÙ\88\8ft¥ôÐø"WÚ\94\14I\96[q{Q¶Ê\81³µRrÊ\fµC\90â\94ªD\80nPDFË\10Á'ÀX\83]\9eªÎ²:y<B\893aè\iÒñ7\12\ 5ó\91£,.ç\©¬|õ\12\8d~g129-Þk\87?u:\99)\0ñ÷ÎáåЪ¡\9d\97@\86q\85\96ÂÿOWì÷è\0ñ­Éy§­ñ;Á\ 3\18\vñÚêfÞAM \ 2E\91QÍNÁeû#@\87±É\1d¨XSÎmE÷\91\88n\80r¼(ÉÁþË¡<\1fܺº3gKCå3ûf\fê\99Ât,ÿ°>Èn¿\ 5\1c,VÃY\ eA?*ñ©ê¿Üö4\v 6ñ'\e\1eþ®÷\ 3É\ e§\80<\80ö\15eüµM\99\¥08Ðw"\14\ 3l\ 39c¯\87ò Ó\ 1t9Íd¦5³\f·#ì×\81Þ3wÈ9Gð\18ë\f\b\93\0\8d\9b»® ?®2\16\1677l\7f\98\97ÌÎz\15[\9b6\e¤#²µâÂ;ë\85\8c}ºÏ Ñé¡]Ù¾Õ\97\aþ·-\ 3\9c\98E}>¤\ 1¡«\9c5\80¦èDó\85\99\81¬\11*.}ºªÅ¯²¬\9fwB¸õðmËý\11X\1d\8a=:Y^\1f¤ä\ e1d\12ÙýàPÖå\1d25ò¶48x\17ª\1a«¼ä9ôÊèw\1d|-\99%¼úNçBalZ\9fZNH¬\1fyuHJ\f1EÖc`±#\99ÏÊàäó-ê\92²\90ÓÜ´y\ª|Æß:Õcµ°\95)°{\95ûg·\12_\a¾\aXê÷\91\86v
\aû'l(u\1e³\87)Ó¸x$êå²     Si\a­±YW+Èp\1ej\eÏ4P|\80çN\rU\ 3ç\8e^ðb×k\9b\99S\1d{xa°\8bV\98o\8a\85YìØT\ 3Á\12\0\eXçó\80T¥GR\18Ü\eÝ{ª\97ôÃ\90\92\ 4:ÒÒ2¯5Ócû!£É\ 4<óÿÈ\9c`\95)vwÄ9\96&=p¤c\17å©Yz¡\8eÍß\92&\a\ 5\8c\87ìCM'Mx#\80«*\18W)ïS\ 6¢Ú}U\ 1ú«WXq:\vìË%w\88Ñ×8R%\ 2Ö\90Õ?ë\12\rë\1cjvÜ®]¯8¬a\897p\87Ù»®øÙ¦ó;µ\82\7f\1e\bÀ\b8\8a=    \94V¼¹gº§ç\9d \84     \0\12é¬Z\1eÊd\14;¹Åý\91
+\ 2ôIÉ\9cl\8e\93\98\13\9a¶!Þ¶ \ 5±\9bmQõø¤>LRÚ\19\ 2\92·\9c\15ðCP¹\89\1c Ë`jò¸<\89=f"sp\f\ 5\9dÅ)\vfÚ.x9R,.ì©ÿ¸\83£ÿÆÁ\816wB\ 6¦Ýå\89ÚÕ|½\14\18\93\80ÓI\8f©\1a?\8a±½\9f©M¶\9f¸Óq\8aRw\ 5eG\9aÜ\15\80\8eάF¹£l\ 2ý»,æT\8a©1öt\9céV½h]ÔæϲÂAXû(»ÅSö\89â\93Hæ(\10 ïLÎ`ÜÌ­|7¥\9e\13æ£ù8472dB\ 4]\8e\ 25Y¶k=\d\f\8fO\9c\85ª«\fÖ¦àþÖÖE\9b£fç£+Ân3³}C\9b+N¯¨ã\15ð\8dþ~ü:\8aÌsDÌ\1dô-7¿\84ít\13Oðwê$x¤|ÛjÚ`\7f\15'wúC­¼i[:'\8e½oÖ\ f\19ÓÒ9¯Ö\7f\10À\8eö«\8aÔ·rÝ*\98ï×\#aÏnkÏ\87Ù\9b\ 3\83êc\ 1]L½\ 2äæ\8cÿ;cBïé\84Y§ âç\1e\9b\98!eÇ\0\1dUJÚ´\89ë*I¯ªxë×\1c%rêËrÓWàp\88Æ\8f]¾%³ÀÀ3\80{ï°Z
+4dwÌ¡¥¡2\8fÎÊì\ 4»kñg¿Ø\87I`\8dN^¬|f`ëMø_\99'\1cAçb©Å$\ 6P1"¦®Ì\98sË.a-\ eçãʽTÀ\8c\9b\fûç\bÖÀF\15³8ª:Wîß\97xe\e\82\ 1\ 4ã\bÔ¥\88ö\0^ZZ\95³bH­\90 *ÿ-W\158\ eõ\9f       pµ*£ktEØÉÅ\19\7fºYJV,àô\1f¯0¸»R\10G\8b¬ ­§6Cß\15ì\k\861¨ó\8e]Z}0\96®i©í0\105\943A\82\86L::\9d±¹ÿ\9a«Ôôk\85îí\16«Î\199\81\16\8f\80\9fíCß#\9bðC­o\9dîñ\1e&\9aGá©Áýã´è6I¦7oc­\80ú³Â\8bì~íªX¿_\8fi$Y¥Þ:U)À\9c쮥g¥\90æâ\1fºÓ\8fß*° rÄZ\16Crëw\88é\96¼f,Õd\89ߥ\94\ 1ÿÇ>gOf>*\ e¶Ñ     ç\96ò\ 1\ 1.7
+ 2å\94\93^\1a.Ó´&\r\164x*¿\87\11\f96Pç\8a\93\97ØwJ\f \aÞIA\1az\88oßeu¤\95e\8er\e¯Ýíz\e\87Øgî®CZü\ 6§Õî»\82\ç*7"\10>D\0f?<\9bV\1ddZüµ]¨Ê\96ªH4Q\84\ 1Ý-e\12>\9bÝ\90Òʹ¿Íì^PIThXa]S\89ágÛðî½\1c9<\94Z¶N\9bÃ÷ú¤V=\18\84Äpü·Ë\9f\f}~'ìçGØ,:CÕT$]\15%\ 2°º\13êå ªV\872\98s\90Ñ:àÁpÕ}úð\1aK\ 4Üu\81\aÊð\94Þ\e\8eª\97ÚkãÀ\82\ 5w$\1cÝÏ\19üZ·k¼¢¨³K\eì^QU\96}I\83\1a>\bä1ReÎ\87¦9Î%&À\9a´Å\8f;2Ð+¬Ê&â\ 6S\1e\1cÛÈç5y<\84º\18^|ÉTv;\ 1þÒó\1a·7áP´Âwù÷\82\87ZY¡\8c!\85íü×,q\8fTÒ¬É\ 3\ e¡V\8eßÝ(\81\81¯¿±j~'È\1dÿ2kà \9aþж\10÷Ù­xüd+v{R4\1f¬ÞûÌ\11¶t+]È\16Ò\94L°ð·[\85èl+Ê(\9dÕ\ 6a\82ÛÞti\8d,-·á³Ò׿¾\ fÿë\13ý\9bjû¿åYÚ?>\\0ñ¢âÉ\1e\1304à&ó\ 3IXrVwÒ©®\9eZK;î³M\8fèÖé½£»ÐUæ·ì\8f\84lMÓiÁ\15×Y¹É\11Q\12\ e\ 6Í\8dz\7fìç±­æ*\8c`ç]\9e÷»\ e­þa|õ\0¦p7²Ï(Û\8cS\vª¬ô\8d@g¯'\17\rPÚl¡`6â(F\r\1eÌ\12#[ZEYuÔ\85E¢ùó0_1­Ò\1eÆ\9cR\81è]$\1aµÌËô\8bÆEøÿ·5\9b\1f2V\14[!)ÝKca¦ÒÌ\9dïµkäôtù\9ao¡P\18æ\ 3\1dAµ®\188(\a\96§>!}F@ý¥×g*\ 2½\97\9aÝ\v=B²«®Bª\122f½Þ?½\18gé!Ôç\ 5I<\1f³_¾\81üeî\ 3e*oé\19ëÓÛø²nWnÅ\8e\87-\ 3r`îGè\86/.yç\16T\99\97\12%Íiè«®¸\8a¶ÒVb6Ä\8d\94xã:>Q´b\97ª\v;÷H}\14N"ý\83¬Ë!m:\1f÷ú
+¿µ?)6¶õPÎåø\ f·\12ôg®G½\86 tÖ<bIø\ 4[$\ 5]5q#¶ùãÊ\92\82\f     ®Äã\8eG°¬Õ,d$¬Ö \9dï\1a©wZ#rù\ eJ\93&ç?úãk¸Ë/å\97«ø»\84è|h\1e\rF§UñçfÅ\87\93Ú\7f\13\¼K£\97\eJ½%\93X2Q\ 4vþ¸pû·¼<:ì·­\91\1dËõ0ÞÆ\88\12\84¬ûɽK \88Pjµx6Fîç<S¶¤su\9c¥\1ctF|J·í\10\1epèP\0\10 Ô)â=6\89l\97º\9e\91\81bPnïè\8c\ 5\93
+\ 5½n\ 4\856\8ckCá'\1e\1dR@wtcd?\8d^,ø¸ª¦"ñ\ eÐ\1e\11ÈìèW\19MèË'Ê\9d\f`Çâï,»÷ÁJÖÇÇäê½?þ%\83\9a\82(ßᥫLð@!c¯8ÀUÇ\15\9cø°åG³\19º\eâ\13\ 1Zo\ 4G\98\11Ë{C\19årê\10Öø\95ÞîQì\98S3\82?1\10Zìy¦;ÇHXB<\1eü\8f¹\ eØ¢F\13ü$0Û\8c\84:zÖy5¢±\98\9f=F»rá.ò\17\83è\85\91\ 5#\1cQ\8c\bUt\84\93©.¼Ô0b\10\ f\19\fÙã\1cabpÃr8\9eå#Ç\b\824ùª%\99Ä#±øèc;GnþUÜ»³G¨\92\87\9bÓ\90Do\89ï\1cÅ:b\12®»î~OÿÔùÄ\96;\14\9eµT\88Æ\83\96eä¬ë,\12p\ 2\17NÞqfF»&\9cãyg«Ð.\8dY\1c$$        \99ÇCñÖr\8c´\95ªÅ\92^\ 2§"        \ 5¿_éÍò$Q\ 1bu\86\0ÚYĪ\19ã\riHò%+{èB¼\92\1eý\90±\96§¶Â\1dcDA××Y;¬¯YÎÁ\15\13\92¯õf±>ÞÑEí*Ôs\86\9e;\93×­D\86\16\8a2\8d\83³^öÞ8μÌeÌ\863ÿôë\1dè»lØ÷ã¶sþdÃæ\91ÄÞ\86®ý{çs\1f*hå\1d°\91«V®:+ë\8fݱ\7fKk\9eÃVVá\8bÔ\ 1ÔÅ\8f)@H\13\82K:/í\vGI\8eI·ÜÉó\16m{V\ emA\8bÓ\12u/MÈÛ#\7f\81\ e\92õg~£\9c{>bëG),\ª\b\10\ 2\16\17\1a_Ñf0Y\fo\ 6V;꺳XÉtR­ý²§Ò \854(ø¶³+©. \96´"êq\94\84ß,\85½.1\89]\ f¼+ü\1f\99I\ 40ô»ÊÐÉêäãr\1d\8d\1e*eÀf_ª·\13%\92µ\97\fÈÇ\9d}\9c¥\13\86\88\9e:øð2Õ0\81¿MàO[@e$\ 6Z\14Z)\8f\1aª¿t['x\ 54\1câñ\ 3ü\97\awå½-ýÔ\85÷,ÇUÉ\b\8cDàOð\1e\8c&>1\8engt\15¾æ\9bFc`\8e§=1"JÎo\96b­Q6M1\92ù\80@îèÌp\9f)\80ý%±êTÍF8ý4è\94ÐÀS\14ÜÞÁ\93ð\ 3\11ÃßU\ 1£÷\82\1c\1esdºÎ\ 19)aèÌÒ/ó® þêQvu\ 2VE\8ayª!\8f\ 5¤Ì£VÖÒ\14o=\1eÄ4\1eóÉ°BA%c\96îÕZ)ß(àÏ\f\81´~\8c\89\9c¬hµ\ e\e2°á«¢§É\ e\94xu\a\9cÏÈ        \16çk®\v>Þ"Ú\99··Â¦\ 3¯\16Ƽ\95Ü_\17gm\9e¿Z±ß£\ 5\99\9fÙòå¬\8fWLÚë;s/;I\ 4\12\1d<\ 1ÍÎ\9f¨ê\12Jñø\v\9a\13\1då*\8fù\ 1KRð\98®Á">\9f(
\9c±Ö\1f¸7þ\96$mC3\Ü>öd=È\9b\86ÒA\84\19zh0M}¥~\95\ 4\99´K¹y\8aÞ\ f\1d\8fÞg\94wf¨o\8dî«\1aV³Ô½\e\98*E¤¦XÝÔ\18Anxáj!V7<´ã§5¤ò·]\f\17Õ\95\8aê\92\93æ%;\93f       .\0=&Åï\9bû~#Uõµ;^\1f8!\83Ñ·\ 5¯{è={©I\8eJN4ûà\0î\12\93üV ,A(uÄ ¢é¡|F±cJ(R[\83¼þ¾>\8ca\ 6ÅÊ¡\9b\13Í'G¼p\85enÙR\11ð»ÄÊ\9e\1fØLsw©VÀ3U\1f\ 2êäÝR%\8dê\9et¢+¡«oW>òGúF(ëë¤-+óöËêüáKÜ\1a¾æ7Ê3ÊÛ\81n x\e\99Þ÷g
+>âE1ǽKt¸®\8c\92\82\83\97\11T\ 6\95=\ 1\ f\97\80Ö_/å\85_/Éé1Gà\ eÍÖòàÂÇ\87yõз0@ oñ~Û÷åýÕ`R µgd©\81\18\96|{.LìÈ\ 3\86Ý\9fß¹\9d\ 2á¯rÝõH|^û3QÔèQÇ\9fFß>+þ³±ë\fk\8f\7f\90Ö­ù<&d/g¹4\8d\99·\8a}hÏFC\89©-I\ 6Á­US\1a\ 5\v\83ñÇ             gìÜÖY\8aD¬³ÈCr~Ýå\ 5È\9b\94ÆÆ\ 6WÈ2¾Õ¥\99ªç½\aδ\81ãn:kÍ\9e\8f\86\9aâÄ\7fj\91\ exиIXy\93\ 2\131\0\ 6#ë6Ës\8d\91<\9b      \82³eäç»ËïDªÿbk²û·\80ãÿ\9cev'\82J9-\0·\14Úç§V2âòÆd*ßú+j\95ÎB\8fnÅkæÃ:`\89Òü{\ 5\9eÅ\ e\0¨\8d]lzn¶\11ÿÅ_ãü½Öç¿>Þ¿­æþ[R\92ô\9a\95ü£pCSëý µT\91Qx\16ªû
+*\ 1\ 5\9bÙÆþPà\95õ\9dÙiî#|KÅ!P\ 3¸Ë±(\14ÃKy(ñ´2ÊZ
+O°P<
+ÀË_-´ÿ\eC7i{àï´F½£ÊÒ\1esª;\186y<H?ÿ%\8aX9Mñ¶DW­\ 6/e½ÆJLÐ>ÎÊÈÙKÁU\83k\85\vðÏàUÚ\e   Q(ø¯°\16ÇÝC7/õ\9f;E,/\eñ®b0\96N\18L\1e\b\ 2©Uw\ 5\88«ëkìR"\97DÛÓ;ÑJ\85R=\90û!³+¤;JB¦.´f.7RSûv\95må0b\1c~\87(s\8d\99\14àk¬\9d¢\139JÃ\8e/\9fºÙ(K\1cFL\0\19±\9eõ5·&)\ 3÷\8bæ+·4\8f\9a;ߣ\7f\16ñJ\ 5O¾y»´á\9d\9f©Ãÿ%\82X9^iåNYÌ\ 5Ð|Å\8eÌ  \10%\ð\a½ÌP\11\990T\92Ê9$4\99­h¥±»tsc(Õ]¯ö\b#&dz>w*\90\93\82¥%¶C\19\8d$Iô\bÎ\909è6«XK\95R\83¢³D#;\19ì¥\aϺ㨠Þû\8bKËR\1a\12 ñ\119ãVNH\8fð\16\fï«4Ó£\r\8fB\1e\ví\11T\92y\86/\14\97¬h\1d?E¾_­áï\91Þ\88)»bû ¨É\13â~4ÞÉLøNJ÷Y\19\1dçC\12\eu\88°²þØúÍý\e;\9e\10\7fÕ}{*ã?:\16\11\1a\1f¾¯\9aÎ^hj@\12oÁ²\93\1e\ e1¸±¶¢£nÜ\85\9e\98>\ f\84'ëR\1e,Ú~\ 47gÔª\ 1I÷*u¸\9dA2J\14µ\82{\ 4V\9dêÈ\8eRe>+\12éð\15N\9ci\8fÒ\10[UoZGôZTÄ«\12+`ñ¸\1a\0qk¢Ã#á\87pÙnÁ©;GU¹º\1eußxÑ#gU\10ðÈþ\80I\ 5\16fòuFðê½½ì\aâï\9e\80±\14õ%AôÇcí\f\ e\9fíì\8a¬Õcë
+¬Ûª\88RµÃ«"\ 6\88\v\ 4\15î6\ 3\1d8¾õÊUYÐ|Ê\ap\ 6\80ðÉ\ 4»W©Ó¥zÀ\98J\93\8c\9d\ 5á\7f2Â[Né.³ m\80¿]T¾Ì\8aÆüà\98\9e\bþ.<FH<Ûc\ 2=
+\ f¯¹7¢\ 1-".¤²½ÇüÚê®\ fr®2e\1eÁè_z\94«,Y0óôÖø\9f\9a\1aJ\89\19ó\8f\f\882|=!|fXÜ\95¸wô
+xJ\96Pgé\9añEï3rºgKïÛÇÖ2y-¸\8aæ'1yOo÷13      %\f\16©à®yy{§©M5Àò­D\7f-UNñÒÛÒ8Ë­\88n\uTÉÉ\96\10\9c\bO\19Ý\v\9aWE\ 3ó*@ä׬\81sÄüC5\ 2LÊ-.Å\87à\ e{\87\83\83ÏjÇÃkøÉØ9ÿô³õ\8f\16ÖÏ\ 6ªSó«Mâ{l©ÏÊõCÙ\18ÝRý\95wj±x\8fámÑSÝT2\16¾\97\15yõ?l7½\7f\8b\8f        \18\8eÆ2¢ÄDGÔ{hº\80bFWi\ 5G»ÑÃ\ 4¾z\89c5Óc\8f½£ú%îîýüãû\1d­¥\9cÊúH0¡z{P\1f\88\17\95ÆIÑ/^v\92(±£r¬ö\990ÄóOEÛDuÃIýE\ 5¦´ìÁ \béXÕ\93Á\97\93Ò\ eP
+Õæ\97\\9b^\f¿\ 4\91è\96¦@\93@\8dS\14ó;Ýam>Âb¹J½ø\17Ø"V=\9eGÓ2\rh\88¡\81\9au\0UÚ«UÕKþ\r\98\81\8aâ¼è\8e(p¤\1dúý¸¿¶¨\89}\8d\1a\17ÀF\15Ôl]\1eÑn\15­\80ì\ 3BQº! i<\82\84\1a\8f@£ª\88\87\ 2/Ê 1ð^îÊK©\19ô\8a\11î¨ÏRU\9a±«Üp%v½\14\1cËg¥ø|\17\fÃ^Tlè\81*\ 2ñDú,º³\16¨4º\rÚfk\e:êfx\96¾¶G\97\18Ð\ 2ð\90B\87ê\18fê/¨@gê3½¤°AÃØ´\10\98b\v\ 5*ü­\1c\8cr\1c¨°\96\95U?#\16÷\1aò_\95&K\9f´§\8a\88>Ì-Ö\ 1uÍãQ\02¿°©N!\r\84:\8f\1f\892Ef\ 1\1e\ 3\ 5\9cj=Qµ\8aq¨Ù\9a[\84\80\1c©Ó{\1dÀT¡p?Ò+@û\a\9d íW\87µ0z\ 6
+ìèÀÛ±ew\rö@ù\95\ e ÁW~\1eD\8aÄѾI\17Ò\b¨Ò\8f9\14\95¦Å`ä½æ\9aé÷­èøéÐû.áù\ 3\17J_(l²\7f±ü\7f·uHÀp¾ïÿÿÀ6    q\99"m×~ã\83\ 1¤Íɦ2m[\7f`Z\9dØ\80©&UÍY}^¿¿Kþ­ßóÛ.ù[¼K`\b\806\10Y¡|ý£CÎ;XiàÂγ4\16Y0§\7fï"3\96å\a\1e#\84Ô\f\81±\16´0¢\ 1\83B'Ìo°\1fþ\9dâ\98NzS"\92}\84s\96"\90~\90âtW\14\10\ 3d\83!C\90ÄÈÜ!\8bÓoTL\ 3\99\13WþÚ}\17G[ÏÉYÉ-\7fï¸M\18çú\19ùç\9eôñù\12R(Ú\15»¿Û+ì\87\9cêÜùg\vÝ\8e_N\8d\94+ØÎuRÙ~MÅ;´L9ýZ½%09\1fbæQÎ\9cg\90@üM\é%QáQ\87ïk.¡ú4\8bþåß¹¢\ 3\97þÅ3ü\1e]r¿ÂÈW\9a»\ 2\82S¶ª÷kÄQQõYþDÕÜ\e\1eí Âð?.\1cø-\9e\18ÙÈ\94@k\1fïÇ\8a¤n¹nï\83ÎÈîP\9fÅ©\19>\1d\99Í,ZJÂC¿:Cì¨\ 4\83 Gæ\15\1d£U1!\7f\8fñD\94\16\9fhð²±I«\7f\1f\90\8aH\9fQr\90\97+Äñ  x\15f`\bͦ\1f2äÜ-K\rCà¼+Û\9e"`Rî¯\b\ e\92oC×ÌKr\89\1am?ûû®+l0ÌRX±\81µÎÜ\90C\ fo±_ÞÃR\14ëIph\83©ÝÐÓ\b%{Ú   ºm9\90a­ñ\ 4æÉ\9f¨\8fÍ\99\80:\97Hg[ÚÙ\8f¢:?¤V\15*\18êã
+ã°çS\91çâÙ¢\94 \ 1îc΢k5C°qBT\9eù\\8b»ü\89×\e\7fÓ\86øÅ\ 4ù\1e\8bh\95lß,{ñ\1f\16ÖÅ\8fÃPjÕ\11Ï\8bZ¤?\9c(³ô{¿ï2º\8fà\96è\0\91¯ÿXåÕ.\ f\vþÖ\94Ü\96\96Ý\11\8cÆ%ÇýñE&¡õ]P%lEå.)\12dN\87lT\15I¾¨»\7f ÈI\8eq¨Ì¯`\e\7f²ýÜ%\85½f\140sŤ·\v©\9aó\97\1e\19x6(®KyÇãÈ\9f3!±#wD\13\80\90!=zf\90owIÏò7tEýønÿÞe/áPó\9b!\1eë\9b\86¿?ó½\ 5\9aø÷ôÐÁ0\0T?dp
+Öw9Ëñ71ÿÝ\92\9fCÁÜë±k\11, *ÀR\9a2J!3Í'\1eR)\11ÈÅI\r\\97\15ïpûö\8a+Çè]\íç\81\15W=è©\ 2¢I·\7f\9fõ÷O&Â÷X/|&\95=>s>¾_L/P\99<g\¿\1e\85K\9fYn¸wBÄÎ÷],V\9f\8dRÎh3þ\981m\1d&e£\11IS\85\ 4õsK\81:.çp\95Ë\ 2¤\15ìÐÆæ\8eù\8ciÛ<K\83\96\ 1úÔt9ïrthßHÿ·F,\f¸QR4:κj«
+pUçßwF^z¤Iæ÷¡ÀKIf_e\17Â\82\874>«'ëØ\95±SË:\87X\8bsD¸+¿|û\9a¨3'Gì\19ȬS\99]ëÑ¡_¡Í\r\81ðRÔ\8f\f\9c0\18æ73Q["%¶ \90¢\8d\0V\ f¿\94%\92ÎÀÎýyì\9c\1cC\14\1166}c\ 6 kpëÛÊg     nçá|îj\ f¤\82\a\b{Ø&\r÷\81§\f\1aLS\14#\893D̺ê \9eèØ{&Ö\1dr§T2âéV\w^sTCè§óç{,²|«Ì$iÇÉbø\91§_mìú\8d\1cI_ót[¤\ 4ÈοïRSN!Î&\8dÕô£\1e\10Ô¼µ!ëÑ«\88\84òq¥æÍÀZy\85\9cõ/^$N\90±yF\17\83#Hë¤s«j!kD\ f\95²
+Aé¢Åää@òD}\19@3GÅ\1a|\15¡\11ÇLÍ \17µ\18\ 6M¹a?d¨]\19R7ù\12\9fs\86k9fý³Ý\89³* ¾I¤/\86\ 6,\15Q\9cemÕ$D\ 6å\ 6\ 4Î\9e\1d?\11]\17Ù\97³îTþ.\97!<C+Å»\13,;vµ;®ÈǪ\81Håÿì |\97\ e,;\1f\89pV\ 1Û\1f8e\8a\1aÀsWl\ e_EþôF¶?\92Èü\9bs\15H(ßoìÔ¸\7f\8cÉ
+\8fÖÆÓ\8cD\15(Uº©f ;´¶\81SÞ¡\19\ 2¬r¬\94âÑ×á¿ô\8e!\16ÌbæòïO.ât\1a\ 5çæ/ÊÞ%dë\9f\ e®o\15+ÑVê²\86­é°Fµq\8f±ÂÂw,\rGd\81¸\9fü2ebwLn\11
+ þ\85\9a\ e\e\1cmã3\99*\1d\e\92\ et0û{9x'\9a7GÐÜOn\96\97Ü?òI>\85\fK}\144\83¿90\86-\92êå\88Î\1de\85«ÉÒ¼ó\0öý§_>\90ï1u\7fú\99ÄUq\82áÑÀ\84Ù±ð\9aeÀ4\8aa¨P`nùî×÷Þc\81\92+\19\8d
+9w¾àåî4»öKi`\1c\8fûús9µ\1f\ 1Ñ\80 \1cw±º\8fÄ\14\94\1dV7t¹]f¡\f8u@Þ¬^\88ô\16\18\ 1ø>º\10Âzó\9aRnha$î3-èºH\95+ƨWý\90\80±ëÊ\e        Je@*§\81Q¯·>J\ 3¢\ 5×·\1f\ 3g\rÌ]\ 3Wþ¾×s\91½\ 5Ñ\92g½3\9b¼>
+Ò?Ë\80}\97àk}i+õûJ7Íû3¢\17?[ÈvNa\9c6Úy>7U\8d\17ÇvnªøJ®Bsèg\ f\90*ï×_<Tòò\9f\ fP\92ýåcÿ\1eËã§?F\9eÔ\876·rï,¦d\ 2,\1d&\8e}äî^¾â\8c½ú÷^!=\1djô!çÊ\ 2I\ 6Â\b¶Ð²/\båÏù(9\8c\84\1cç\8c¾Ä\97 Øµ²¢"\19¢ÅH(\ fíîp}\8c\94\9c\18øhM\14È\1fUÜû\8a ÂÑ£`)(N\85\ 5ZA\94K\1fÛ\93öM+÷\18¢¾Ï\0\85N\rvý[e3èB«ü\v\18³8¼\ 2?ø!cª.Á :wÞè\ 2}\84l'²V^u檫4¸26¼Jîf\ 6\8e\1aè5@TsÖ¡XW\19Ì\9d+à_\7f;13¤\9d\8e­+Z\18\8f\94Ä\88H\10cmçQ¸\88t¡8ò&Ü\15\7fÔ(¶v\ fæ\89\9b\81\90&\ 3®_îi\87'Å@äLûÓýshç\99÷\90e\95srZÔ5\9eÁ\ e\94®\90c÷·±L¦þ\99L¿\9c\ßg\19òÍ#\9cÑ°t©e8RÖæ\1e¬£nö¨é\90Mÿ´ª¨Úê\7fGSã\9fy\19N\ 3z+OH\12²\f©òrtÞPó¦ÒIÂCùÛuIqÑÆQÁ®lÈ®ø§P\83\91\91\ 6\12\86æÍã}ÛgÉÉÞe*ZWÙFvìÎÚP¦tè+aµ"/\ 2\e\ 6È\86c\80\ 1*4\f\8c\14d3F      \8d1ø5\ e¤\8e$<\9d\81\81âµ\ 3A#ðKÌ\16ï\9eÏd@ïA^¤À\92\ 5Ç\9e2Ú¨Óc\16\7f\9f\85g¿\1fJù,\93JîÐø\$ç\9b;­à\ 1w\1eþ)\ 3è       :0â ¬\12Ô×çñÔÓ\99yÉÙ~ñ÷·§÷]æ¹.ÏÛéÑw´\85\18\9de\15\84\9d\0ÊY¤kõ@F\1ec?\7fW`ü\9f\83=\ 2GÕÎ$a?fL¨h\vX\b©±¸N\87_Òõ\10\89$Ügk\84\96\ 2²K½9ýh®4Ý[iátk±W\14é®2¥Y\91\92h#|OUâ¸\19\80\1d!\85&î5òTÙ\e\19ÓÙ\17\9e×´\92ߢÞÝW\19÷y\ e\\99Ò\8e5¥ùNÅï\18À\aÊ\ 1\7fUa%\1c¨\8b¾©\7f)\85ß­\ eOßErR_5ç\19(s.Æ\16ôrO³\9e[\11ùàÓî\1f\7fÛ°ðû\9d\1fÁ<=H\19£yÏ\80@\19\7f%«iE\11ZÉ¿
+g}xÛ¯,§Ñ\81º5Ý\1fy\86\11tFÆöësM\r1ÿüÛ+ÚÜ÷ó÷\9d\81õí\92\9fÌ\91ïB1ãC×yæ§\ÏzR·vE|\90ê8OÄ\87ÞJ}ÕÇ\98ï*\1aå;/§^\16\r4ãuKþ1TÈ#~§GàB\92PWèDïÃ\83è£ßI2@\90\0Ý\8f\ f2\9aÏ3ìÕØç\82/\ 1ì\9b\91\80\16»ua¸þ*Þªír;{\80ôDl\83\ 1Ôë\18)\14Z\7f¬\1a\9e1\aÄÅy\19¢\\9f¯\14óªñ\×V®\9b\16M»p\17]\96A²À¼\94Ô¿\85Ñ\fw\8a/¹]\ 6f`\86T\9eT\9eE%\86V\9e\0¾æ\f;ëc)ë`\fÁ\8f\84\17\8eÜ%KcY#Ú/uÛE³~}\ 4aö¨A\82S\1fÙY\17ê\85õ«\87ø]\ e\10\7f@,Ýs\8b\7f|\865¸Qá·å      È\\ 3Z4¨²ù\94\10#öiÏï>çéP©«=?\82´¡À'\ 3°hÍ\0J\vÄ{\1eó\ 4        ;¨\8dY\92¦\84 \9c7D\8a¸i; \0/ÞÍ;º\0FÈÂCκªÇ?\16¹
+nB´    \8e\f°\810 \\aWõ´Ì\1c\ 3ÜÉØ{\9fx\ 4\f\84\ 6ñq(G¨\1eÀ*B\v\ 1­\1c\ 6ÈÄÏ´À¾Ôo\a°`t˶\8d\19¬È{G>30cN°\9f\94À±Q\86\ 5G]5Ê$ðR:á\17÷ô»Ì@ý\ ewr»þ\99\80<ÊúEWçÌ»\vúÍmX¥² È«7øû\17\95tɺCË\13\96ýã3x\86\88'\8c\97\91°Wà}\ 11\90\ 2¿\8e\1d¥p4J\8d;`a\ eUx811o\ 1þw\99&wÑ\ 5\v`\a\19$dÄÂg0ò!Ê\1fÇ\1de_{оæ*é\ 1$¿vÞ=65\98Ûª\ 3û\13\99\80ï窲\90\83í\19ÄôÍ\11p\89\8e¨Y\0óø~Fª\bEµ54\7fmYý\9e\11`\81\9e\88Ö\1c\8eÝ\0\95"$îï\13r     RÉ­ZÚÌ\8ch\824\17U\ 6$Nð$
+­áí»óª\89)|D\f@]2r\9cõdÖª\812\ 6d°)­à`ÞÝ3"ï\84¡è¯\9eüwY&~³Qßì<«¿åïT´Bkã+wñ¬ç¡»\86Ïzî\8c\98\ 5|çnò~æö¾Ã²ÿ±\ 6ýR¸Þ\1fò\84+Gaľ«4_æ-¦»k\16MxE\86 \9a°`\ 2Fb\98\8deä%ßw\95\9eÉ]­³º0t\ 5\ 6\17ê¿û\91\vèÅ\88Á\8c#ç±\9f\v·,(\a[\9aÄ\fJ rP~ô²\8fäÛS\0t@þí],mÚÄXÄ\82\8f\99Ôr\19\91ï\15Âôþæ\99Ê Ú7ÜCCQ~¶ó\19\86|WEs¦KîÈ
+ÊÚÁÃ\vw@½Þy\91\9b¼\15j\11¿~@ߥ_Ë7s\7fy¾Ç7éIÙ \e¤ìÊc
+Pü§·LU7îìþîáö \11\aÊ\9c\92µ?fÔÐÔQ   ;¾Pò\99îï4P\1dª\10rD\9eöK½£[\18£\bµ20ó§ªÌ\ ePwyÁÝ;ZïÏuÖ[\1d=ï÷3gH?Q\87Lk\19\8a¸\81-äk?\97ê\14\91A\96×\ f5:z\ 6µêpD%\0\87f}\17\19¦i@\87Uì ÇZ.½ó¹7¦\185Ôón\ 2\892\84æö×(IY2qT)b\86\86ÒK\fù{\19:5Ô\94¿:ÊZ\88Ñ
+`Ïhìý|H\12\94CJNé©{Ìõ¹\16Ø\87£s`*ÅçΠõáÏîÓ!\85\14ïo×Æs\93Ç\r\82Ü\17j^\99\190v\9e£R§\ e­¶¿Ýû\15ðtO¿&ÏhÎ\1a:\86#I\8bÚ£"X\97ÎYïW\13åyÜåqê¤@[º\86>\13l'+\ 1\1a\9a\9cßÞª_\19\853%s\ 6-Õe\14E\86\9f\ fÍÏ\95ýùE\88A|ýÍ\85ò=\92ø|\99»îÜl\8fP\8c\ fÃ\0Ã_rh¾+\10¯¦\14õ÷Ì÷]\13ï\9dÛ}÷ãÒ\8e²\81Ñ\9d\88ìÇ\1a\94àe»\9c2\ f\14éÈ\1fÝië1\12ML¨q³\84MFy\182\18kn\8c¡\15D\95Ìȱ7î\92×\84B×ÖçBEÝ\8a\19÷§\86Ú¯ò\evè-\1a\1d\96Â\1c¸KÆã<\8aAdÏWc\80\96>·/k\16¤Ê\1aÁïT\ 1\94\83½ÞMÂï\ f5(×\8cA$\9b\18\91\ 4î\8f\ 4:åkäÃiì\11ê·cù\89ð>ò"Å\12fY>;â¹ËHA\a\18ÌÑû¸þøíÝ\87x\1a\b×4EòfFÞ»Aÿö³ë'\1d±ð8\8a\9cÉ\b]\1ao\17ÖÊÒPïÂrAXïw>ñ\80Óܤ¹×£Î\85\98Çï\96;x\9cñäa0\eÕ\8c\90÷_êa+\0Á\97UW\9e9\81\17\83\b»\91Éml\81\85\92\8e \0à\17ØiÞæe\80\88\9c\92÷ª÷\8dÓM\ 6÷3è[ï'Æ׿hÿr$Z\8f¿\9eàßcSðS9\1dòu+Íô.\8ezà:\93óxm¸8/>s§da®ý½[³\9c9[
+U\8bR\ 1»\81¢¤\14\8fp
+×:\85³ÏýwT\85ß\r\8d\a?zH.<kàFÑ?è)\1c´O8¢\82ÄÈH¨¬\XÈ\15aXÞ¼Q(ßö9È\199
+@uO?±EÀçësa¿k°®»êï.\ 2¬\82\89Që¿®ZGÞi\14xk¸©\8cöø²_õ\94 Û\8d\12\988Îâé¢\8f\ 1\85\8c\91<^Gè\vp;]\84¾Õ(å\83\91'ÌØé\97ªN\80#pDó\92£Õs\b\13ö\17\83°,\1dé5\0\97\8fï»\84Ö|h\8cº[\92×Löã¬\b\15\9f=4i¹\8d\11u \1e\1f3\1f\87ê¬<׶ÿ@-\81ߦ»ôª\9e®\16\8f\9b\aÊ\8dn!t(ú*m£É\11\11\1aÈ@\9fí!m[¼\96\88Ï>µJ=t\15æVnJ\v©üÑ\ fóµ\12Í\8b¨¨×\\vS_´\ 3/\ e5Ø.z®Ñ\9dÏ1Ù4=õ5\a´7ìñZràÌ=eÌØرé\eGÎÜ\81¾2p?\ 3\89CÖ£\85òþ\9fw~ª©UhÝ*       \Z+>¿ò\9d÷\ 5>7ÒËñNHÍ\18Õ\a\90£ÑâǨVñê\1fæ\ 2o¨ ãj\11Iäwz`*Ó\10ëÍ+ìú9æ\87(o-h\151"\14 )\90\8eÉ\82é±\92t\80\82ʯ\9eù÷X#ë\91Ü\96×ó\84\88Ê/Ìè0\88Jd s\ f    \9f®w]rÏG\95é;¯\8fQõ¾û\bµýGÇVF2ýÎ0\81\18\10\b­¡ÚûÏöAØë·Éä\13E\10\84̤\97ýïP4ÄÌxÕ,W?LÖî¼ÈV»\94\94Q\9f´Ã7\91Æå@\v       PS×\9dò\8cq\8do£´\1cD¶!q%YØ]\9e3_ý\86÷óÖg\ f\ 1DN>)ÿè\1a\1dF;í.û¾/z!
+\9f³6ä4WLØú\91\11\8fáÔ\rêVhEzUÝ\86é9ª«t\17ß璘x\87\82w­Ã¨ÿÜú\rº\ eÛ=«HÄbùåsú.s\9a\ f­oα\94)}\96ª­,\94)\v%\11-\13¦7I=©»ò\84æw\8fpвNnz¦:ñc\8d¹ïÊe][ÅkíÓPpWýY\1dô\98%\ 4\89þ%2è©kk\vKBßÁJÞQ\8dnG©iëÄ£¶tmüCï.ßléMì@\84ØWx`èr\97Fy5ñ¿F¬[>\96\838\7ffäª\11\98(\19\99»FJ&\80Á©¶ôT\10Ó¯µ\95\9f׳«9"åÐ\9b\8fÐ{4-l\18­åË"Ý¥ úêÞ\19Á\ eÊ°\97º¬\83
+¦0¸KDüô\84áÂF¥È\91Y#W\9c©\7fñ|Ô~ÿÙÈüÕÈ÷¡Uýì\17©$\9f4\9fû\11\99û« ä¨X¨¦ujc\9c\9b\9d\1c\84G\82\9dÕw\8eê1¦ ø\87\94GO6¢\88Yù *hã\8b\94:íÑ&c\80Ó\1flßÑJ\1díÊñ*\ 5\12YXúOA©À®NûBè?½.\9aáèµj¡)\83f\15»Çã\90\81\v½&_Q\12qúcô\µêª;ï\82nÀûïZaò\93Îú¨\15Ï2\0y4µ\1d8ó}\16Ez\ 6"OÙC\7fø\9a«äGt\eV?äÃCR"Ρ¼þ¸u0 Ö¡FzÓ\816Ç|¾²\11¯F\83=/\92DÏÀ\ 6\80Â/of½ÁÚ×U½\,ÝÜ\15\84Û¾F\8fâÜÓ\1aè\8fºÝU~\8f#eµ¦\8d]oQk!gáq®G¾e\7f\1e\9f\8d\86VK1\13ã\16\8b¤òÒ¯fÊwI üZ-_ë:çÃ¥ºR\12b>êªÉÍã\ 4\177JQ\85çæÃè1sü¾«ê.\89f\9eß{
+Hò=Ã\9eå\89\81\9f¼kWçἧ·\8ez±gôn¿oîý,º+âa¨\ 4C\8cE\ 2\90\82ø]\8a纭F}é¾\8adtf\ 6Þ3\1a`bº\0Ù\95L£p²8áÜ3,v\0D÷{yÜ3Vw\82ßÞï\0\80¡L\19¯@\ e\18Ú1Ñ\XÎãú¦Åç\88\12\19\7fïÌI\9d\87¿zIH\96d³'¯0&iå\1fòÓ¿¯¸ó:\14\\93\0¡»\9aL"¢aè"\91¤\ 5å\ e\14á\86Ê»½\81V\94P\bì±·\1c¨WÝ3ÅÆf§à®KÚ¼}$\v»Æ;2¿<!Â\13î/\ 51×\\8e®»ì\cpÙxIÌa\89\ 4Þ³M©aup#¢ó%SA0\1eCïLש¡â-Pº;\7f\1f~\8a\9d\87¯5{j\bajÿ\1e¹\ 4\8cÜ/g×÷X\88\8c_­mð0\87\99\81=s\18Ä\bs©Ç\18U%=\1e\1aâ3í\9b\9bÞ÷<Ú®\9d\ 6\9e¬\97\1d»KØ\964l\80W\ 1\fS\88üÒ¢sÚ­F`Ül\9c\1a[;Ji¹hW\94§Ý\8dvQòo\9eÔ\88¾-{î\8dãCú2ö\ fI/£\ 23´ÖÔñI¡\1aæ¶\0\e\82\ 6p\15Ú×>ì\96\10§SP;rnÙó\80Â!)½U<ù%öR\1eº¥¾Ý\95Ôb¯Þq]×\96Km«\96\ e«\10\83\16³\13¢;\11Ü£|Ôð©QZgT\8f\83\1d÷\1f\9b[¨daÔu\96°ù©«ât\80\9a·n\97å\vp\96BµÖÚ\80C\18\0¢y]IÔ¹h\12þ\;á\82W]9¡Á§ÀLÇTW\7fKHÛË«zú\ 4Â\8aK\1fJ?\19è·w\ eM~\85a¶ÎÍ Å\81\80Ð7À²\9e~oá;8ÕÁúöBiè\1e±J«\83\9bãN(ܶ\15\ 2<çÇ\88K\86¹8¶à¸Wh\9b\ 1J~\1f1"÷ª
+[tOî\81·SõäB´7i\81v+cïy¹)5ékqÄÚz\97ÿô×øv(\\83£3Ä¢\ fª\11qQß\ 6$$ÅùÇsùkà\8a\b\8fß×øfÓ\8d\16òÓ\82m`à:\v7ÓÓ*\w±+FÁ\9f×*Ïm\9d>"Ü\0\9fze\b÷b¸\1f`_ ÙS      _.HÈÛ<Ò\96ó¢r\ 6\83\0æ½X\12åØÒP\ 1ª'ëEâã*£nT\966\94É\16ÇÙÌ(\\1f¯"·©Ã4ÃfmuÑ\88\9f\91\1aû\1e)~\8d;\8aA~ÁÇ|´\15ROOÑ¥\fÛûf\a½\1aë×:t´\12T\ 3Î\13®Öè\9d\86\14\fÃ#¦Â·Nà¸Tæ\\85ØP®\85t\83{\9c\9eÝ9nì\9dì\ 6\95Ý\ 2Ø3Ô\fu~=
+¡q\7f°èúÏ\bhaV\18D\95Ëéº\12\8b\ 1­Îù^Uû\85§ÐN\88ï¹*êý\18\89©«\8c\ 2\89\10\ 2qà®l¯\e\90Û9Kã\ 3\ 2yÿ\11\ 4DgõH´þ\ e·9=\96¢llyû¢-ÇÀÝÝ\ 3¯\1d\9b¬\8cñ\8bK'\93\ 1\15£Z\19Cýj»ÿ\9d\7f
+\89ñÿNÝð ×÷\8f\95\85¿J\ 5±µÐá
+\ 3SµE:¡ç\88Ýá¦áÎ\13'\9f\17\17§kk\8fé±g|Ç\0\85ÚÀY>¿ì÷¶_ܨµ\ 5j\ 1\15ìòdýë±ÁÿÆ\ fë[\90ó[\9eÞ@\91àoò\18Êk\8b\b\9e|a\ÑI±        ³tø~?\97è\91X\17Ru}\96>J\81.ÇUûI¿Bõ\90\8d\12ðòû3ÆcÃB\83·\88è\8bH¸q \1f±âÕ?¼]¥\r\82s_9·¾c»\98Ì\9dñèÄQBkΫ°\9fM}Ý÷bÆ!é1ÖXPj"\83"\9d\1e{\8c¨\9eÜÑ\19b¯2ÒB¤fÇ\9a\8a1)*»¬­\1c 8ÅÎ\99ð áVð>¦¶\f»²â\98Ê\82ªÀ4[6=¾è\r      C\93\9a\9eBØm\11 ¾ß\91Äý\86»ÏÞ\a¥I~Ë¡røåï\14\a(¨êx,pZHÅö¾\96\e\9a1\9cÒ\130P®3àjG\1e\1f\e¤2Ä<\bU"\a>«øq\QHmXÿ\99¸\b:ªë\80\0ý
+\8aÞ\v\9aàã{\1a\91\93ú½G\1e       L@®\87R\16-aq#H\¶YùÝ\14Y\b\ 4\88#b*S!3Ö`\104\1dTfÒ\0âýµîÛZ\8a\7fÓ+CÜýNÖÇ\98\8föÞO]c8õn¤B-F\90dÞþ}\ao×8\8dá\16\129[´\92!äkd\7f2 â\boz\86\ 6į\b\91\ 6£zB\9d¦\9aýí\ f\ eÖ`§sJ\ 3òøÀ+T@\10ÐsɺêÁZ\ 5¦%ci\84Z!Âë,ó\80\90\83Ki\83>1O2ç\7f YyÞD\93v¾w(b\9e{\91Ú¸¢xż©\ eòY{±\92E#\1fh|ìôZ\8fd
+zhÌ3Ñ1\9bûÝ/\1e¼­¥Ã*\81}H'ó\99\9e\18búÈ\7f³$\\91w±C\}\14\81¶ôcXJ\92ÝX[Êþ0À\9a`õÑ´&h¦VÀÅUÄ\83\ fG`\ 5<Gt\ 3k\8bÞ\9f\1e2,\1fÄ. x_;¤ß/ÉßtÙ½\8aë˹e°\88¿Ø0¿WêY\1a\83±«7¿\94\ 1N©¡\ 1\88°%²\ 4\9a̾V¢\19ÄbiV6ëâçUú D#\ 5_\1f«\16(\12\vwöÞ\91\92\82\8f\9ceælâ>Î\14\13x\13nß¾Ë`~\aÖóÅ-|¶\88k\88!\rÜ4\1eç\8b\fà\ eæ\0Í
+Ôä¿zIô7V\f\\89ø8DÙ¡\89}\7fy*üN(tþ/tº\8ewHûÇ\86B<"Ö=\8flîG\84\16\11\ eø­ã\14WÁFD¿\92\ 4\87\18\9ai'\b      qW\9aZÆ3,'ýÑ.Ü-\88®î\ 2\9d\83Ä  }\16\1eÄ\1eB.¼F8\ 5Ú¡¤¦2ª\12
+xÂHØìsº¡\1a²ýõ\10ê\7fã\87ü-\84ú-oúW\95Óp\0y\1f·Ö¶Ð\16V'\14_\9c¸ø\8aàGSꥵ;\81\94\18\8aS\7f\91³h\ 1\1c\85ó±Êá\10ÐBw\16\ 2\86ói
+$<57Qö\9c"¡Ùb\8bç\8d\81\96&·Ö·{5uO
+<Õp\19a«h6x¤D®n\18\82ýqãêQ\10×Õ³\ 4È[áP5ã³T¬Àh\vL\12Eò(ËÌØ2Ü\85ñ\83\9d~ÇËA:ã_|§\82eôO\95/jâàÕT_»ÊÔqZ1ÎþÍê\89; fp\88;ß#\ 6\82Wש\1cXqØ%ïmº\1c0ßÑ`\19g\8a\ eèU(æ§Z\ 6\8a²§êúe\95К͸¶²\ 4{É×à\14©\80A\ 5G4Þ\1eØ\b\r»½ÓÚ\15 Ûu\99H¿®¡¢ÓË\1dËN_ù~Ð\10æw\9fúXøíD·Ä\1fZB\11:a1e\96\18\92\8b\82 8Eíø\1a¹JÔ×n\8b0< r÷¾Óäí=}qÆú&¯\12õ|å*Z_]ìu,¹ß\87Çs\95<k­\9d\87ÔÐ\ 2¾`ÈÍsí\9c¦ñ\83¾Zñ«ÊBãÌ×\7fìÈC-\1d©Þ|\9a³ù=w>d\86lÝ«Hòz\94¥{Q®sÃ÷£Ë^ö <\94uç)íóg\8f-\8e\e:'<ä¨\92\85\7fï\92r\ 3è¿\ 2ÿÇ6Õå×\9f©\7fY\99\7ffQ\0ÈW}~o\91\1cW\81®÷Ü{Grá}\19\89Y\19\1a\16ôä14+à\ 6~Lá«\85J\1e\ 6ò,Zܳ8Ï\82ïBª$­\1e\85òÙ\98uÿb\99ýz\95½\7f_VÙ{sê.OMÛ\91\ f\18-\86·R8µzj1å»*ùQ\11fg'Xy\8dÔ&îêêá\8fë\8cÉ\13Ü\85=\84Üé\13?\1eñÄ(\81ǽé}çõb9\v{Y²\8c¬g±\ 2\14\15yþ§\14¸\16ÿ0ä\9aô\ fìn¤ûJhuø´FL\97Ìí^M\84Ð\19c2M\93Y¿tA\18y~\18\83C8¤\83¡@½(;Ê#ê¥\9fó:õ\86©wcI2bí÷\15\98\84çó\8bÿÕ%\8bd\97ÖÕ\8bÃÛ\9fØKôùW\87Ã'\94ú\8dÈáåç\8f\®ÁTb\87\95\86\1d÷(\96\9eW4\95ñýh\14þÍÈ[loV\84Ñß\97\9d\11þ\80-w\ 3±\83\e\1es`m\16Ü3úáS\1c!«<\11À·\ 3ï·l®1F\90\196Ï$39ð.MÚHU9ÜЮóVhñJÉ^/#µ\96\1f\aʳÈôS5µwBN\7f\19ñö;\v\8c´¼ÇsÉ>\91'Ýä\97\8aY£ëx8ùÕÙ\9dÞ\a²»µ¿\15\1a\90ÏA\81ë\88=\ 6%LÐ1{äl¡MI¡}K       ª\9c5H\ 1|<9³\8aÆuDg\f>\1a5Ã÷bÄ\ eÕÆ\1f\85¤/î\10ÆäxUó¶-)\88RÚ)£_íý\ 6<^\88\1dë\8eª¾'ÿ\10\e±îÈ\92µH\aР àὨsI¬±2\91¯ú¢L\16\9d¦ú\v¿\eªç«\92\9f\97$\9cË7z\87\1f\ 6\19/\92³\92<¾Ù\7fÿâ*\18
\90zÅ&\19RÅòE!fjÀ}x{ëg¾PæXg¾\92æCP7ïú\8eR\v\82\88ó\92\88Ïà»aY\9e\ f\ fÛ\95<\eðæ
+êÇ\8b¨\95¯*\1eäªfuÖ\1aÍí·¹\9c4JA·|;*P\\ 4±7\v´«e»*\97eæ*wðh\9e0\90^\ 1\99N4\ eøáÖ\18¹\13\92\83¸5BfWÄÔ½\7f\94\13\ÔÞg¿ VÔ§·Tï¡\9dgA©ÅÇ\15qê]\0?\92W\89\ 5ܱ\12çk:²ûL­g\83\97 \8a¿â\ 4~Y\9e\1eüésq\17]ÖÊH\97Q'Þ\88\14íxÄaÚ
+_\85½p·`\rsXH°Çä· 8ë\8e"ß1Rë\17\r\8f-í¸«&\13\11\19ÜkÁ è¡h>¾³ÿÜ6rFpx(È+A\12\84í\9dÛ\ 4\16áRëÝÍ<«1Ú\99â.(\81\1cê.ÚnÌ\1c\7f§ à-\91U\12âÿ>i\ 4\ f?¾µ<g+O3´¯\9a\99\1fÁ~I¯\96\9d\7ft½Ù`\8f\1eÑ\81\9eÉ\8b\19\93cÀÙ<5VgU\1c¥\ 5]¦0bÎÜû\924ýj?üË_Ûã1x$ GÝ÷£\12pÅ¢\ 4M¬½³¿Ày`_\9bÖ\e"\98¶Ë³Àý\9d2\8c\12ÿä\9bZ³h\14³¶]ªÏç°|×8ÿû÷öS\99flúÞ{\8bG\10çR\8cèä1è¸É¶*Û¡\978K/¥\12Fv°\v/AXD²4\80ô,gâÁQ§cÓ\bï ä\9fòÀÃ4DJ Åé      AÕ\1eóI\9c\83_8"\85g:öGÕ\84ÑÃ\1e\1eF\99âÁ_T;]\1a\fÅ\84\94d¦ sG`\17¹ö¼ã\v\ 4\ 3J:½&\1a\12\98ÎVÉ\0\1d×SÃÎ\16\15öú¾])f\82æ¸k\1en°ÿ?{ï\92\91e[N\85\130
+U(ÚìF»&à]F³æ_¶Ö>j×Iú\8bÈ\94
+z\95¼|")\92áJÃ5\18 \9fóÙ\1fwÑ*\19½4BÆgÄXû\8eG\ 4·|+\1aÁè<³%¼3\1c¹°W\8bïö{è\\ 5 l\1fYEö\8e;ô3ÂyíSC%7
+#«ºü\15ç\15£HîùNHÏÏ]Æ`\8cê(\ 5j8\16Ê<\80\99¯}G\e>
+\9fTr\9cøn\19\vùH\93Û¾\8fü°X\9eò/\95w.©\8e74\8eý\86®ÃCÕ7i¬|D        \94·\1d-\9b\98#&\9f½<W_g9\1a1s\80·1\93Ú\90\80ÓS¨Ãêë\1c#.\9f½'Ô\7f\ 5T\17ªÈÕbáôD\ 3¨ãGq%¸Ë\84;ReI¤øHUu\90<õ÷,t{\11/Ûâ\86þ(à\1e\89ÍÂ5S\193&¢ï©^ûÃídað:ô\8a¤¡:3r\9f\9aâ!mtÇ}T¸G.¼\14eÍ`.¼"¦áò4?ýó\82ý\97\11æÞ\15¼\15r5·\1fæës\85ÞÄæúd*ÕS¡\1dqgÝ\98\r8\91Æñ£pqü¨Å´J)\92ݺßåXáÙMö ¨©\an¯RL*ʶ²ùï«L®V\9c4©`\887£¡ð\ e9#\1ds¤1!,\ 1\b[\98êW\ 3C\ 2ôy\92k\9d¥\14\88\ 4\9d\99\7fã\8cÉ°1#\b\90ÈI!\97µ;U\86\ 1ÈãN/Â\1eñ<>    yú\ 6ø
+\9cÙ¤ßë?Å;ÜÊmº£'2ã\1crV\ 2\91\e\99\e\89y\1d\152\96I&\9d\173¢Y%a\13´&\ 6\0Qæ\80Y+£\81ÛHÀj\9fx\8dyÇÒÒ\8bJ\9d\14[À ú8åfü.C\10\1c\11B\9b÷'´8¯âÏÓ\95Zõ!ªÖ\9aÀ¯4îhôqÍSÍv_Á¥jö;~\e~H\17¦\95EïE\9eò[Eù\f\97â4\9e:=]\8ah[°òÖxÿ(2?Q.ÍXFì\9b\8cÀ\0\19Xd\ 3à\7f\9eØwÚê¯kÎ\15elO}ɹ¥>§_¢\f\10ñï<Áÿæq\9e=\8f3ÀG\9f9üðYúß¾\94zRãRåî\8c²ª¢\95ëC\93m#\12Ø7q¢\13\80î\ 4\13à^a­ò\1f\98$u\r     ôuVccX¸Uî\b\19\141¡$ÔDFú>=\95\8eßi'Ò
+e±2«Ý0Ç\15\15\11\93àk \89Y¬gÂ>Ø\904Þ§]©\15\16ùµÊÖ]!\a$m\17Ê¿ÅW,{íKã½´ÒhI\J\82¸\9c©Í]ª\92l³å\bHÝÑÆsGÈ\15î\87n\1aýÉÂ\rw\13\19\92\1eEYgºUÞ³}\89(4óïq\83PÏç\9bW\88\ fU%\8bðweïØÄ\8b?ïLÿjçô³ÍÏÞµ\8b½C°;àûK«ñ\99§\85\ 1\8d&*û}W-\1d\96©Î·Ôì(Ò\13\92ð®\94Ñ\1f\0{\8b\93,E\19\8aª¹¬Gî1Ö¬¡­ï  g\a×õÐ\9c¶mþ\97Óyz\ 5éxõ¨­\80sd\92ð\1d×\15ß´s\94Ê\ 6ý      Â$\1a\8b¦zì\ fwÁñÑ;¢\8e (ð\11\97umCÎ_,б\15\85s¼íK&¯\1eÂï¤e\14¼®zâ\vUcnÍ\15I\13\9f\92ã(³6Ú\7f͹l\10]MÄìÚT¦Yþ7¬ï÷t\e\0\85ȾßÁæ\0¯\eØ^\80\98\ 1y-<;ÏU\16ðCµ\90÷¿[D\8aÆø\ 4| ZäÏ\8cÒÄ`@ü\92\9eÐlýà^È/\1d\18õUWd\a\18³Ï¾®T?\av£ü&µ×\ f¿kû¢£«\ræ\8a!Q\9ckd'\12øÈ{`\80\e\ e%\871±÷#BÅþ\15ý\ 1gÔ1ù&-}\19\88\9f±wÃ\ fôéô|\ 6èÕ\18å]Ão*È¥ÎÉõ$>?|Ô\93ø<\1aQÿ>¿>ó$\9e{?t©¹>?j\99¼\85#?AÛ\8eud÷ßÖÁ¾Þ'íT~ø:\v\7fÁ)Ê£¡÷ê\94 V:Æ\17oBzé;p~O\14¢¹SÓ±åÄz\87\13\ 5q¿ÈÒ\r¬(Ráà çvè-\80\ 5\11;\ 1\97\84úîá&ù\8e.
+W1C\ fqúâ_?®\0Yg\ 1;F\ f\99ô\1aÕæ\1e\16.ªjË\8cV\ré+8¹\f\1c~Hy¸\uÅ\85ð\8c­ï\99Û\1f®a$\82\19\90\0%\8a¿¬ò\7fµÙqµ¢ùXQ\9e\1f\v\1aJØ-.'\89¦ äÒ:\1asK_]¹\8e7{Îñ_Ü\81À\86\1a/\80\7f|ç%Q »"ýÜJq\19,èIù©YÝ\88 \99\12gh\7f®/\18®\14kLægiÆ \ eìz\aLѼÆU¦©1Ó\ 6µ©·0MYb\9cv\95ûtO}(@aJ||gÛ@áÂ\12\90ʨ     Êk¤>$\10¦\ 5\94\9c8÷Hçß«î¨\83\99ï¡;w¡"Ñ\fvßi.\7fæ)©ù\82Qs\15\8e)(\9b\8c#\8f\9e\ 1\8dzõÉ>20È=G\172Q\17q.XÅ\7fÿª\7f0t&t\183ÀÒ\1a\93M:î²-àCà¦Géw1 .uÜIr~ËU\ 6\ 6 +D<\8f3]\15\11Ø@ô\86ð¥\87\ 1}¨¾å*µ²F\99\eûå\80Ù)e7\94\11\85\86±2q¿å\87\98×ó\97X\\ eP\1f\1aåËÁ\80¨fîæLöäØ{
+0\84~Iþý\b\11\ fÊÝÎ'\ f\8805|Øüöc~÷Û\8f\88O\8dR\1e\ f6\11;V;±}?i\ 1"l\9eýÌS=B¿\1d=ÒY\8ci\8cs\19\r\bSj:ÿ\9c19zêÝ\1fèK1)\8er\15\0\9a\82P v\9egÀï"9h\a*ìÉÄã\b\15<W ã«z\9cÌ÷tÆZì²ð6a¹0Éïã\f\12GV\82E_¥\ 1ù\10\92:\b¾²\12ü3ººL\ 1Í¢\ajÕIÌ'y\9c%\16©\952\81©\10lÐï\14>{\19³{U\ fO\8edúæ\ 5õ\16¯wø\ 3z\90 ¥\ 11\16Ïæ{÷îÎÀÍ\1c{\aQ¿gL*Q+¢ª\1f\8adúûÿ¯Ó?}Ðïa\87\ 1µ÷­0óê.Î\98!0àaÁ\0\1c ¿ìKÿjÏÌ\9fknX\16×KÖð
+\9a\9dÞ\r\12ðM·\9fé³\92oË#'\1c\17 ~W\84(B\1dL\1c\r}d;xÅj5¢þr
+jg\8b\ 5z®~~Û×\15öý*µýLÃ[æ\ 4\ 6ÖYìÍåõ\aÜì×\ e\17ý\aù@Ï~Jÿ÷þ¿ï
+\8eZ¼!\8e¢¿Wz^/Òr\9aìTo\94Ý\ 1Mu\13«\7f\b\92K\1dë×\14\13õ§
+_½L®_ÄÅï\8d\1a\90\80ôeº$\1cpG\19¹oöÛë¤þªË¸­TZe\84"éú\92\19-eæ@sÒ¦\80
+6\8eªt\92\ 2ÁÇzIÔB£®\1d«ô¢@-x'M:¢ví_$\87÷è
\9dÑÇö_\ 3\96_#\91glMͯ|Áö\93z©{}Ô\a\rr_ÌÃÈ\19Áµ²URJ­ù\94Õ}¯\1d\96Þx>É<_MKDj=\14\9c9$_è\81?JÐ=ÕvðRL\81Øô_\95ç¼\9a\92\aªí¨ÝH\95\1e
+\1dÎ1\9f\82¦õ¸£ÅÄà\12áoÝ
+\8f­÷Ì\aoù(á£×]ÉÖ\8f\0 ß\83W¬wi\87\12\98¾GØe  \1cÉëÞ#ïã_Yï\1eª[.Ì\1ff\15Gö¡ãÌN\94\1avËÊ\88\f\98.{v_ø¤Ö ª&ßø\10^¬_v=Ô?®ä\18 Ù\19(\83·áá!NùºêV¯\9eó;*BÝü\82\8c¸Þc%3kD\8búÄ{ú\ 4§jbÈ\r\80õ\ 5¤Ãò¥õ\9cGÚc\9fÂièìê \87\81\a\8e\15\96ð{\84\0âððSØ××ø¬¤J\1c\91À\16óÎrú¥²Û (Ò\911Ý;ªÕ¥²ôc\98'«ï=!\9e*.ô\0 ß#ô\11\8f@øg\95\8eß_V®5ï'zèÁ¾f\9aÒW\vÐ1\17¶.\96r\93Ãß\83ëWéù+¨`¿P¾W\9fÁËySj\8a\ 1©[£\96\96¾´¸ª]ÁýPi\ 6sÙK¸°IB<\9epÔZÍï\aW\8f.q-Eæö<%ÀÈqþÔ\13µ\7fÄA8\83ÀÈì¦\97Ù/Ó   ß\8duZïÊÂwéY\81­|j¾ }\bV\89ÀѦ­â}Z\0\1d\99\97yó¤\94Ôúïjÿò·t~à°\7f\94\87\ 2E|]\ 6\vï\88ஹ\0(]\11\81Zûܼ¤[r\93åÚg.\9cñ.\1avv\98\vìh$øcîç9s\8eSF³ÎÏó\13é@z²\ 4j<\ 5O¸D$ÖF\ 5A\19\1c0\18"u-\1c¹|ñ\12\80#­ÕRÊ ªæ
+\84­úótݯbò8â\8e\bòd<_7J\8dåJó(?Gü\1dBuw\8aø\9c\v#3­\ 5\rî n\13¨\vÞ£~¡\ 4^FNïü2Ê#²Â](\97]¥Eñ\ 4P\90\11úr@¾g»2b\1eI\83åL@ì \90\86«*`¿× [²¿ñ¨§å\81Îs¸ëi\1d\18Q]-Þ©ûi\99\98\ 2Á9\0dÄP1ou$Ðæí|½Vú²óLú8ëûÔR!\ 3\9e»\9d¶Ë\1cïú\h\89üª×ëcnl\96\ 2ÜöÈÄ\e\83êþñY\98+^fì\ 4B^\9c\92÷JAoO\s\14*üëþÚê\8et\ 6ôÂu   X¹\ 1\fI$B³Rú½¯\9b1\96:J\80P   M\1a\ 1t§\\0\8c\1c\0V ,´c~\16\98ûv/ÝWW¸r,WDU½oQúP\v\8eÏ´U­\92±(\96³£ø<M;¯z5\13mÁÞc     \96ëzløØfìV5M\8c\9aÛL\9dæ@é©sȵ©\1fè\ 6\8c3\0\12@ºT/÷÷<íª\9dU.;1}É°¾\aG5VTÅúÅ\ 1]\82Í2\©ÈP\83Þ \96ìÇóÙ\91õ\ 5$¿Iô\80-Q%FiË»P\8eÓãK\9eÎ^\99¢)Æ
+32s\ 1\13qR¾\91µú\ 4':\9eü\86¼\vm\8f\19k+§\WÇ\90\81+3\ 6a\8aü\9dóó\ 6\91\85ìg\ e>'\1ah\9e\ 3\ eÀü\1câÜç´ ûY\13\1câg\8b\ 1mº¬\ 6\124ß0Õ\8aÒ\1ftÙQ˦ÕfÞ\8e$#¤R\ 2\{;C®ä¬
+~\ 4\ eg_¾æ-¤à\85¶Þd\83\1a\19½G즶\99\Ë[\90W\ 1ps\9eççN§dô'\0\8d÷È\88Ý6a\87¨Pâ\8d\81â/ \8e6ëBÚcÒ\8d)DÎ:®,¢6]ljâ.\8aåôê·Ã\96o6=b\8e\eÛ\84\ 6\ 5\10:\82Ä9k
+Z7x±¤\9f\90\92S¿\8daµè=Ôò¬_\92Ó\19¹ßÏz\18n\83x¿+\f@8O\9b\17\ 2Tö^cÖ\a×Ñ\97¨8\87(Sì ¸ï\9d\8a×x\89\v\r,{W\\ eÌ\8cÛ\98\1d\82\12\86æçײDiõ0út\ 3\1e^Òa¼ÿ¤í÷\82#\7føÌ\88\12ûY;\ 1èY·\7fBLuæ\8c÷\9d\a\f­\9d\17`\91ìÈ,\94\16      Äi\14î¥>Ñã\8c°9CRáÞÿ#L\ 2îí³\1d\9cíÉSñ­½ (­(êÑ­71Òë\9b³\açèÚ\10ô\91f£¹ä\fó'\80ÕÁë¦;H\1f%\9fÁÈ\8c.ÝL\91Æ¿¦¾5§±òá\8að\10\14úäÏ_þ\9aëýö\13¤'üV¡mBÖGU3ß)å\13\17µ\ 1ó\87ó*-\9e\17Ù±"]\90£4=d"\8a\98ø\96«   eÕB$E#âò}\95,ó£1î\8b:Db\14ú@U\ e}OÅ\9eÚ]Ò1§Ä}iXH.F3Å\83`\86-à_/üNÎ-vk\8a \1ed4°íþ̸Ke×\90\84Í×\85\8d\1aû²¬lÈÎ\1eá\fÂ\86aä;\9f\18\98°3?Ïþ¥\86èÕ,x\12È \17@úgµh\9d9¥4¥èe0Y\97\12aA\1dUN±¾â¢¿H\92\1a´\10dA\96m·ãÔ>¿³,Ù{\99 z\84ûD\bîö     \89ï\95\9f\9fKI^ãÝ©T¯ß*ùðº\vÜ`0ÈÒº*ðÙ÷{¥øHi=Û\8b:;ô.\eàÔ«\ 2¨éö¾\9e¿Q5ñ>\7f\bϺ¢HE\18\8dÒ9Å\92 Í\8dñrî\ 2\83óWÀ\98d\92ÐNãà7²®D<ļF@Y.
+è^\fãã@\96¡ý\83\1c#\\18\85è"1ê!µéÐùÞ°ï\b\eðþf6ì\95çÎüÛÅ\ 6ºÏ\92\85\ 1¼è9rj%Õ,\8cM7R\ 2¨i}\7fî¸MqpÊTt³\ax*\9aõ\ 2Ù©õ\9dJ²ãÁ>-\12n,Æë\94ýA)ñNtü¢ó#Óª=å\96Bi\87ïák÷)¡ÆÊJX\18\81a$\13\86lÀCß+ôT4\90\ 4\1cRÐ÷÷        Ü´ÁÖÔ\r}\a\90i/°\96n\ 3ï÷\83
+^\0\1dï\1d\14cAE\13\92ØDVð\1f:\r¿Ú\ 6±\btØÇÙ{Pêá}¤à\9d\112ae/\fÈ\18y\9f=J½Îq~]ÈÏ\95ZvÕÇ\1a\0
+\14\1a\ 4ì+%\ 1Û\0\ 3¿»}ݪ\92sÀP-\9dñ\8b,6®²Ðñ9\b¢\ 3\19}¯]\1a»T\92\\95'¿P¥\10Íx\95£\a§ÚÃ\81Iûh}*jG\8eb\8c\9bë\0}\fïl2\9dy5Â3\96\95¡\84m'\8cI0\82pIµ\99 ;d\82®*íXÀ3¤YE\95Éu=ì\v~\8c\f'F\1a"·t#/ç\10\82\82}\ 4w\9d\97ø9\ 1;\ 1\88|Z\98Ä÷\93\89\7f÷\94hóÇ\11»\ 1É>ç¾P1?MÅ\87\92 Üªò\85[\12Þ_³\ 1±\1e¸¹0ÌsÚü\99ÛÏJmP ýåd;bû\a8¥DtÞ\83Øy\1c\81îh\98Ðô®\10 ã\fó\95\8e(¥¬\ 2\928\e&á9\13\8b¼ê¥;6Mñ»§ïàÈ;aUmõê\15¬)ý\11\15 \17.µ:\1c/D"2Ò\82AY×\87¢î \84ë5bçà\88,Ƶù_q\1a¿$B\1e\9bÝ¡\eu¡Glö½t1§þc}\8a\ 3V7ôéÀªF\9ecòãÔ8ÝkÎ\83@ÕX£;Öåudd\9d_\11Úû÷´\fZ\8bx?@[\168ÖÞ×½Gn\9dgÍrÌú\19\ 4(\82iÚl\15<øÝOß%®cÅ\8eÃ\91óª\vÙ\8c\1f        ÖV8½ùè¹µb\1a9ÂfÅ7\16U%c·cÇ"ÒÎHÓ¥6\1aìQ\86\8añë\13\85 \8cQme\8cEð{ÝÄ\82"¡:®Áÿ©Z¬#\ 1\82ê\14\98\9f]Ã;Uà}$$_WÍ£¾.ßW\ 2ñ²}\9f\8cHÇÞóÁ\89¾f\95ÀË\ 3Z@ôH5é,\1c;\13iî²ÆY¼\16Öôá{ES\91Hú^»pÍ\1f§\\bzàún"y\82*+´jK|\94\80Ò=4/\10\8céÔrb~\8e\81\9bÊÕ,>{\96\\84\86Ü\94\\98Á\0r0õ½ \97\9dÊYôkW¸)\12Ë×·ÌFÐÐÎ\ 6«×+#f¿ðä\a57<\8d\9f\81cÁ²\17[Ïûíºõ|·I\9eé9ß%Ëç\88k\8d]LËJ÷5pµ\10RÖ¸?\9b]\90è$¹Ù^\8b\88þÏ\96{°ï!\16äz>\9bÝâü_*XôÚì\802£&d\1cmm±ç\15öÏf>i欫L¶x2&û Xf¶é¢i¬\11I¶\X\87\14\13äv\82p\9c0£¨w<Y_-\ 5ãUþ\88y\85\ 5E]\9fò\15\ 5&I\15\ 5Òð5Û\95R
\9e\9f­@µêU½\v§\8cÍÝ\9bÝ|ì\ 56n\8f
+\ 5£÷æ#¾\ 3\90Îð9\ 5\1cÇ\11Ýj-e:¶\90ÛöujÁ²-Û\8f\ e»":ºþí5\83\80Üõ\17äã\8e÷\8d\ 28\OE\ e¡Oty\14;\93yÏDs\83ª½1x ü¡ÔO«\18\87å\vÀêÊAnäiQH|ó~\17÷H=xåü-Ùm\9dìlà­Ú¸é\17\17\1d±\9dÙ\117_Ú¨Î\ 4\14Ñ[\bÓ\89ý@\98¢9¼¡ü§2oªÄÅ
+çu\8aA§i\Z\98\ 6\9b\91\9f«\1eR\82ÔUN\83w\8aÇ/\90z\8aá´\15Ðá\vD\9fÀ\85'\87¡×½7\83wæ¿\8cxeϪ¡3,\e\89¥\15;\ 1\9fòD\8bâu\8f\18\13ô\8a9\89Û;n\aWa:\12í§6g´ÿ[2\0\8eIZÆi\98«ZjI\19\98ÖÑ%>~ËUò\8f¯\92ãòÏ\10ÀËée«â»8Ó\93\8bþ\90\f{\93úÍÖµGe8ïQTëÌ_î\91\92Ä\91n\r ÷l\99\98'"´MË\9fø¾Òt¦\fSßüÃ\9dn\95«cgÝ\9dµI\vJ\90Ýz}\92Ab!\94õ\aB¿w­&*ú\88@ά\80'`ýûú\9cí^ù$ª_¥u\96\90\97=f­@¨²ýá5´z&RÝïã\19<£k\95íôL\ fJtòQg\88%\ 1㸯²Â>´\84\16ÛF>ïtã(¯=«nXù\1f¶ûsü\8dvé÷\8f$5!õ*\fØg¬þH_{Ï.\80^I\9a¥O\8eA\14\10_W\89ê\91X\ 6!*¿{D\18%}gR/\bë\b1\9aOj\búØyûPun©cÖ]夼VϬWÓP\1dü\8b\b6\18\90Úi\11fzºÛIJ÷\9a¶\
+\ƶÃù¨àT;\93§¦\92\16rtã,¶hÙJ[ð,û£÷\88²³àY¡\14ÖYÉoR\81¹\14\bß;Ú*o\1a\92\9a\95\9dð\10ÐØ~ýìBwA;ÔÁ³ªÙR\87\94<~VJ3\9e¡¾ÞY\80\16\ f¸\9b\83^­c\9b¾gÙº)\11:SÚÔ\91ñ¤\13°£f\89!P´KEò\ 5¶mõh#ÄÌ\83\18\rè0Ǩø~¶Ä>}{R´9£¡Mµ§Ûä¸OQð],Ü®þ\96Öµ²\16NgSÖf\ 1¾Ù«\83C
+ã쪲g®£qwX·O\8b\88\ 2Vg\87\15\95|ÚÀî)Z\ 4¨½»Î3\98\1c\1aòEJ\7fâ0<e\ 5Uå뾺\84Àµ\91\ 36\11\ 17ëöuU\15\9d\1c\b¶~K¹ü        R\91\85ÞwÏáгÉèC\ er\9a`Xz>\ 5\9c\9cAÕK\80Ùý\ÙÖÑ\f\93\8fgs_ŨmDi¯\91\12\ 4õÛóÓë>Ëè\8b\ 2ú\99\16ü\f\19\86RÎH\7f\1fQDfn3\84©\9fy+\11ÇÌ9\83Ç{\ f\1dEù é!\ 3®Á¸Ôý\88êy\81lß3ã   \9e\ 6ím±Èï¡\91R+,\84\14ýÞ[%\9e7Mdýlwe¤ \9c\8eÒ²9Õ¯`ê   b{ªvé\88%FÍ¡\8f\12ß\803©T&ðP\aÊ`¬\15\14ÙÞ#W2\1d(Õ¥£ù\1e\\89¼î"OØw\10IIKÂ2yãeS±¹Ï\ fÔÙGtbåtË\94µ¿Fû.å\17{]ƶ]ºïñ\ 1 P]F©\83Ù\91nü2\8dä>Õ\11°¹r\ 1¶[#ðÍÝ\95\93¹\83\13já0ÊpO[W»rK:\8c*Oíy¾.\8c\91\1fá\88¬VòÃcUÿð¦\85FÈ_\9a\13Y#\88zPê=r§WtÒ\9e\10YìîXô¥~³ëW«ðRtú4Ûb\95ú\84T|Ó{\9a&\90\b+\87®\9dÕÁæ^JØ\ 1¦q\7fºG\98DhÃ¥\84Å\8bB\82Ã\9aÑÞéØ@84\9e\95cû=Ò\12\91?«öh7\1e\10âÊ\92ß\15\9e\81Ã\88\18\82§^¶\96\87k\ f{ÒD²r?÷VW<3=¾}\1f³è\90,hY¨\8c\90#¯'j¥¹î\89W\v/á²3\85É¡\ 4ím&ÌM)£²è;í\e¥GúHÛ>¢\87q÷Ô\11©¶=¾\ eç°ùÌ}\7f\1ak#\18L\92\1c6\15\9frk\95\bµl¶àf\919PÁáüì­ï\94Ã\e\1dʵ0"¿\92y\93)¨Âï{oÝ\ 5%\ 5\18\99kWJ\9d~½@K5êý¹¬\ fj\8atÉ?\85\0=«¦Jë"\8aý½\ 2gùXª\99÷Q²Ù#\f¸Ïk\0-Ä7\ eqGäÚÃ×w¹\9a&R÷O      ×µz*\14ÒaÏñJÓºc\97Ǽ\9a¬:\19þTaÞ\9fûÌ\8d\8f\83ªE\11\91J`ÄKZIÕÓF06\9b-g\v]óµ\9bê³\ 5îC\8b\7fì\8f\1d()P\9a²\rÛ°Ãæ7<åÂh\99\ 6æ\r+ì ²÷\8bÿvÚ3Ë\\ f³Ls\1eZ7s|®²çbªoâGq\1a§DN5\8f\f-Ú/\af\7fö·UCÐA÷i\1dÙoçùL°\8cê\88Ò\8b¥;¾/\14+ásyÇ´¿×Ãz'I¹\8bî¦\fÃ\89\16\ fõÖ\91åvÅ¢\92Í|\9c5\8f\80+Rà\82L\86Ì\81/Ìú#õV=Æ\9bYnDðÏcWÝga¹ÕÛ÷Äc\82(a@Slïæ\ f\13Ú£|ov·,Q\a¥ÇeJR²~lÑ×òzçÁgì\0Ú×I9\89\14Ý%=ìî;\11\9cp&+\93·lIÅBÏ}J¢\96\8dßýX\8e¸\9fð_\1e¨ônË\8c¸T\8e´[÷\85b     ×ª:     #ú®\83\ 2Q{\82/4Á^3¦"{w\15%)gè©ÍÕV\9cê'Î.7×iIßúÝÞ\\85©S¾\11   ËÓ\1a)à×a{\1fæÎBN>/1¨ª%"0oâ¦)Na7 Ô\15Ö\r¶âÏ.bÀÌDu\7fGEÍbxê\9b:yä\95\12Ñ=ý»¦\ 2\9b4\\áhû=ËYÃà¡ö¹#à\89÷        0\8e½!ß\95\85© mî\87\12Ó\91£C_\rç\82.*\96㯯 5û\91]\96lȶ'\95Ý\eµ×Ù§áôÚ!\ e\13\ 6¸\ 6¹\9e\88Q'\8cö2Ç\91\8d;çãå\80 ¡ýâ\9fµò1¡¥\9eµ\86¯\8a\95¦\8bµZyV<ßU¢\88:W\ eî±\ f\1a8öƨ £ß\99\8f_«Bãö\95\ 5|\8c
+\93;\ 6\82\15\8e\82\7f\99}_ø\84³²\8aÿX\1f\9b#g\8cåíõä\1cöDkãó\8d\83ô\8cb[_+·êÓaÞs^økÌ\16oè¸\9f[=Cè\81¹´\8e\10\8e\9cE\84q\0\12ï34齡[ÖwТ\ 1\19Wµ É  \1cí\17¡¸ñQÀ\03E\0°¶K/q©Ú8<ÜDêZ|e¦~@½:\1c\10Ö\11«\9cùØJsQ{PA\81ã¬\ 4/ÝÀúÆ-\8d\87²W\89Q=éYR¼Z{?\15\92}\9a\9c\8e¯¨\ 3ÛBª^×sïµ\ f¤\81þm HÎ&\9e\14\11¾\8dÆ<Øíê¢L}á\81è"Ä©h\15ô0\8a¸¤\9f;Knϳå\7fï\82ò\8a  \18Fý-®'\ e¡úK?lnðk\8fê\10\93ì¬Ë\12\10\89\82¼\92+)¼L        ¶í¥¬Ðò2\96\12\8aÊìTvXï\82j*\8f\80tgJv¦Çúµd \\ e²\v\8d\95\8c\0\ß7ÐÐØ\81¥\ 4-öv/^Er\92<k\ 3í^\89\¯Âií@Év\17nÎ=§Æv÷~ÂauÓ\19GTe\9f-EÄîx~\ f\89\1aB\8eé\99ów\10®¢³6wçíZ\ 1
+´òÓzA÷1\1f¦@!ö§µ\12\85\8560w\ 3\1c¤UÓ¶ëÓè\18)\1aRn~ª\11!.(\v´º®¤\ 6DÁ4½Uº8ïê¯\11·\87x\81\Y\8b²¤túÔxëö©m4\15àú\1d\b7_"Å\95÷V­#\8f\1aÈ©ñR1\8c\81\8e\84\12Ë4\92\89i×RÖ£8\f\8eçÞ\rbÚØHï\82Ý3\9d~\9e\94\11\84\89Oô$\85Ps\19M\90\13\ 6ÒJZñÒâ\15\18Ë\99s\87:\95ç\9b\0Ï\82ÇBÍxB7\8ch\rº*4Ô-\rY\ 4\d$
+®Ë°Ê|Iâ\89\9a\9c &Ø|\10\10\10ÃÄ\0u\1ch\8c×(Äó\9dÐ\87\80\8aF\9a7-ÆÄa¸¥àßgT\11¾ý \90÷SJÃ>Ã\90Ó®ö\94ÇÀK\1cé\14\ f®êá\8bEyÉïûÕpR§6¥¬W\ eÎ*µ\82\8a!&Ç×ó¶&\ 3ÿ\93Æ\ eu¦l\7f\ 4CÐà{\14¬ªÒÊTFï\0áÇB\90*\14Eìf\86lYèH-ã
+\15£.5\ 4:#\0Üó&\81XwMÇhQy(qFÀ¶Ø9T],]ð*\199\ fÚQ2\16\ 2\vÜ\81lH>\9eTãCð
+\9e\92ÂÀm˵\8eò\aµ*²3c\7fNÚ9ÒQ?>\10®Ua#\85Ñ06zúU.\88a\95ÏÐo\18À¨Å½¿\13\16\95\11Óh\15þé<D¨åBãfEp=Fò\9fç»û§Ï\99\ 5å\8e6`\ 3\93ý\ 6\86Åï;\12\ fo.Ñ\15Áæê!KúË\ 57\10¬æ\81ßOÂ\7f*(ý\83\ecSnh\82?å)¸\98ä'\82\1d\ 5o_÷w¿ôRw~¦ÿe>ùþz/\95Ác&gäy\ 67ô÷UÞ\7fäóÐJÇÁù´ìªp|\13¥ú2âõ¤å4³\90\16\91
\17\8fá7\84> ´ÃêOUJ]\8dl\89\16³x]E¿ú\bkݲe\85gi\19\rNUúzÛD½\ 6Bûr\8b\14Héáþ$\1a\a$6´AÅ\1aë\94\8ai¹I\11KBK-rê¤5;¿<¾Â\f$ ay Ìº4\8a¾\94ÐÀ×ꨪ\82&Eã\8a]\9a\1d\81E¿ü,\89\13~³ºþ       \aAÁñHFý¶WÜÆßQªªIMV\1dº®âÆ\87B¦9|zñ\9e8ËNûçZ>\8d u5Ù{éµ\90ZaáR¼v\1eQõ@jJLÂ)\fIÂ\éì\88\8e\ 4Îó¸Æ§s\e;k
\ 5½X\91\ eRÒõ\11RóF\a\1c©\䠪ʿÊ\8b\1eY\ 5Cí«6\ eZ.Á@\e`\ 2 W/wíðe"\9cH¸IoFWf³=0-/\99Ò£òå+j¼T§ûù      }\9et%\8b.D\11ßZ4\84\ 3k?\84ÔìÒè!|\109¬r\ 3     Øç\97È\9a\ 5\8aM±®\8däofÅj±¡|ÿŽhÆT\9aÍ\84,v§ì ´ñÕ\8aîqÚ\83éßá"\88E-\89ªYÆÔ\b©Kb\13:c÷\86°Z¿Bßõ½R6}\ f;±`\80Jm\96¡q\88\92\84Ë\92ï\9dÙ\8b\98:[ß*\\17H]\0\96Ã\94\ 59\9b\88hȦ¾\82ê·IÚ¥^îKÏHC\ 1ì?"Þv\94\9d4ÚÂ\87\12tr3(<Ð0\1a\1fv\vm\1a¨+
+\12\19/÷Ì0\9bÓÎ\12!Q\10°\84\9d|%|\91ùÁÁLÀ\19\99\1c\91\ e¸\95\0\87Ö\1d%ïþk\ 4ä>õpX¥Mñ\84\96ô.~±²\ 5{boÃòÃÐøØ\13¢G\9f楠      Ü¬\13¬\18¤°\9d\92×öBÐÌ\92àÝ×
+&\82ü*\1e\80ïð¬~ÙlÍm,\13I\b\16c\97aÙä%15ª4çSÉ\89\7fK
+%C\ 6\97*Ãc\939EÏZ\9eéñ»}uÔ¨¯à\9e¢\eð\1eº£_\fÔÜççµòY[¸\0Á\84¼\1f ¯ª\8b@?W´\18¯(j¼ÎÒ_ñZ#K!\15h «îù\1e|ªÝ¡\17í\1a\19\85Agï\82î£-t\86în{½\85NéPx    C\va\91Á'´\ eÙd¿;zÆ\9d\93Ñ\88Ò3t«©Èq$\87¤Ëçrã;"¡ñÍk{ \81/¡~Îr\16«¥\1c\e\9fR\85\14ð\92ó\80õÛÙ>×Ê8ô\87À9õK\f+øÅA\9dp+EÏî\91wÿV÷\1cB"£B\ 4\19²QìPôø\19:g]{äØ÷)Lß\ 5|\bz?y¦Ê\82o\aµ<ü\95¿¶]8ò\9aî\96÷¤þ|Þ\13{h\vçû\88¬\87¯>`äó\8e\13¬\13\ 3\7fÙk­Tt\98H>ÔL¤\9e2ÙûPø\10\88V\9cT_*ªo\ e³¢
+ÊU÷v\7fmg.\91V"0ÎýlIÈb;õØYîìá\96í¶©¡%_Ûz/ºî¡\ 6&ì¨vl¢ï)#£ Ü\9f"\94Ô\9c³\8cÝR\93¸®=Ñï"·\8ds\86@$Æf\1f\1aÑ\84eV.!W\14È\84\89Q:Qq\91!\170\ 4Ù{×wèÇ饮ÜÀY{Iz/§>/U\16ðð\82öõ\8c/æÝIo\e\è<ꤲ\88Ò#ÿ\9a\ 2\1cA\88\86\17ó®S_\82M\9a\89\99\8d­¨ÍÅÒÅöR\96©}η[\92çg×£\85\8cÌÀµU!Û³«\ 2¿F#õ·j.+ù\86ÒÄ}ï\17j\9fæP\ 2ç*6^\9a\81ïÏùTÖ
\r÷!ha\8bÈð|z\9dmj½°\86÷\96ß\ 5ĺ)\8c@2Âå;ì)\1fùÅζ;M\83\11\88\9d©ý¾t¢\1cu,¶SxÉ\b<Âf;t\ÔM\8f±1\9chº)\ f*Ñ`\14\a\84l\8fèé9wQò#\88?ÏþU\aí\14m\89=ZÔâ\17ÎÅÆJgj@¾veX_ö¶7º\9eÂ\11÷BìÕG\9d\12VÀ32\ 3{Ð[= §]ñ]Ã@ó\8a\99\9ay+é(QVÄ2,\1cÑ!"\16ÓZ`\17ü2ßÁ8)þJÐv9;\86Ò\18wEwìíãNgüS*²!%±ÒÅÝW©VÀ\14\8f2\85\ 1/ZX;FÓ\bÉ\9f:g      e¤wB\90\ f(;Ðþ\98\18R\18\ 2Ó\92ïG4z5\96µ8¤ä5oZ\90%ªxù%í;\90~?\8bSy\16²Vh_ÈKª»[0\82Uh¤Ho¦Õî@\9e[w\85\11xß©\90\17§\95ð>Ö)pqà\85u\92Ó]é\8a]Ö7Î"³\82þqNZ\96½M\9fÖª\9eãõDê\86\98 \9a\13t\82AAî(\96t      M\a@\8a\9fø¨Gø\87Ú\9cqø¦/¶\19a6Ã\13\90?­äR­M\ 1î@ÑèW5\8dñÉë\1að\96>hr\19nÏþÏoÈwßâpß?Á\82=\80V\80P\ 2ͺµ·Ôr{Ü\87É\19ﵫ\964LÅ\b)ÔCPõ§¬×)9\1fÛ\10E¦É\99è«\95N\90"\93ãÉýùïn\ 4ø-> $\9cÔ\ 4\80hx/ºjüòçô÷·\9fP®â¶)bHØßÖóØÓð\8c§´\87î\83\e)cÆå®e-CÎ#}K}a\96QÂÖWbR(ÓÙ\9eªTÍb\r\10o\1e»^\ 4Æ¢ÅH'ÔWêÜ·¡5PÉ33^éW\92\85ãþÐïHA×a8Þ~\r5\98¬S
+A`C(Q\8d¡\ 2\81¬b+­rHs\9dÆJH!z÷\10[=¯\88é]Ù\bu=Ö\9aåØ%\91JºÜ\81o\15"Üä-\91¾äØ?¥\19s
+Ü:býø­¸\7f+5\9c\97éúQ\94f\ 3¹«²0\ eGªP\12\a=¹ìÞ8z\1ao@RA0ïÅîÿ\18\f­òØzñcVÿÔ«Ö\8c\8e
\8b.ìa÷\1f\96Þa\11ÝÅt,äÆ\15@tݳ\91yúªµ\e\eÈß        ÚÍÄ\r$\9b~?!³þ\9dõ£\1f\99\Qß7ö&\9dà\1cû§~\0ÚuìøE~Gê©J>ÞúÐé\95~T\ 5dx¤Å¨ãq"*þ­õ\13j\91¨Ã¬Ø\13oh\e\95\eqîg)Å 4¯AãyWð\8c\ f\ 3YϦäAé¡\8aÕ\8e\9c\84\14ùÉ'(U\85\1a\84ºyì\94û\16¥ :\r\88ÓTN\91ì\95\81Ó\b­\8f2W:~ýÄqè{<\8fì{ij
+_Ð\87Xi\1e\10#(Å\82ºS)/¾Ô\9f\1aþ¨`îX)q3®Æ$ÈI*%\1c\1fg\11\8b(\81\18\98á\95Åtö\98»§vÄé}¤\ fÓg\ 1÷ïr_g\8f6øF\7f\13À9{\ e»ækU¿ã\15o\84¢zö´1_K\ 1\8aîö1Ï'iZ\977\7f\94Ë<ÙÈö\85·\18¦\ f¸¡¸"4tTNùè-\9a\84î<Ö\8aY\rB\vwwÆ,ä\15tvñDÕÖS!~\b\89¦-\12û¡\16¯N¯EKI u¢#AL\94øOk0³oj6@7\80 8)µÝ¦\95D"s\ eï$3)àߦÐ÷\ 6"¨ÅÅ\9e\83\99̹1Bm\96X\13aÿcÐ×K_ø\ 5\9aÊP\ 4*2\9b(\9dɶ;¼@\ f\1fJEB-ì\ 2\1a\9cñb        \aÃ"\11Ù\13¤ò=Ö\170I%Ñ\17iÊí\ 6{\97\99\ 1o÷¼>\188\bW/Å\14>P¯\15æ\12\fà+%rºpÂ}\0+ÔÖ\9c´\ flÚü\80\vïj\99é]qW[?A:\80Ø\91rÛªªàHOd\87Æú\16¦¶(N\8c\98éHUNýl¿Uý¿\17\15Æ1¾\92³$é\1c2áÑ\10\a\v\19ý\12\99YG\ 1dÐ!Úâÿ\81Ô\18â÷h\\aX±b\900Ó¨VÅTç\87ö\9dTÕ->¯\97ëÙQ\18\13Å\11\19Z\ 52\99Å/R||k>pÆu\rÎî8-yþM%¼\10âËÉ\8a\ 6&\13ßà»ífñ°\ 5{\19\1d\8e¾ão9*,÷4¶\99\15:?ñ*>z\1e¢·Äìlcû Ê\0<ð&S\13\17Ç#Tîú\ eQ\83ï\1as =»µl¤      SÅÚ·\89E\8eq}x¾K\82#\97§\rÑ*¸ê©¹\ 2\0Á;§îmÙ`U\8e\9dlë*â¤:ÁÉ]g¶.güôÜ}Jò\95\95òÙ\9fºÐ\18\17Á¬\19\141\ 1?\b^WÇ\92£§6ñâØ\7f>     "Ô\6.
+\97\96\9e\1c\12\ 1\fÕ®ÍJiÅh¿\104ßQsª©\9c\ 6`W\9bá\18è\84å¶v\9c;f\ 1ég\7fùh9¸rq\v\ 1ñ¥açU\80î*W\1d»YÄ\98\81ô\v\9ff7\87]³µnì°\80úßkX\91     Ò^\8b}þM\95\ e@U¨\98\1d¡"ÓWƬi|«ÇØ\974bøÜçS2\r\83¤æ\86\9c\8c\99c8\86ÿZéW\91³µúh\11Tx0\16\ 5Σ¼$S[¾ö\98\8bö[ÝzðÌ¢ZæS¨\8d;Z\8a\1erGËÛóq~\ 4a,DØT"\99\1f\9f0KtF\19EûÂD¦ù\1aûù\9dj\9eÕ!Þ·\94G\87\94$\12Ã[\90\92        Þ\90ÙÓ·Nd\9e·Ût¹«¦-À\95Ìû\90ÚIa-U³­m­\1e\9aZ\12o\96\82Z/~´¦d\ 6µÐsܹaî¬/6B\f³\10.èsëæXâC\1d;]\11R\7fÓj{×\e/DZ¦p\ e\94þæýáÊä\19r\8f`Ár\86 ÍÄ)ø\99ïì\f\87q\16½Õ\1e´]ÕP\03¤ÂÅ\ 1ëZ@aû\83\9b\9e\15Ù{\8e<³Î³®æâ\9c\8f\1c\1e\8e\83\96\88\ePdYÁ-Oò³T\92\885²1>\e\83\95â6ê\84%°ì¨|uk.î´Xr¬ªà\9cÙeÀ\85*Si\99gÃÃæª3\\9eÜS(ëÚôÏ*³\b#?b\ 2ä\13Ì\13\1e\11|\88¡Î]íã\88\94i\9e\9e\93ö(üÆ.=ï>\83|z\ f¯öA¯]©\7f\94j\ 2»ÜãÐ\8aaù>X\87¬©QQ¶gr\15uZU\85\91\f\13öf\98y\7fd\1cõÈ<ãh9£á\ 5nØΩs¬`\ 1÷YÁæºvØÃÌ\a%\10Òâ\95\1d_<ÐKÒr\8eøY%\16À´Ç®\1c­ÂÒ1ËÚô\94ZGÅ=w¬\f\82\b§¢Àdÿ`p\ 4ç{\10-\8d\ 1r\0kCa¬u\ 4£M`gUf\84d\9fY1w|4ãOù\8a\16®±Õ½_Ù5+xrh\v1\81\9f±ÈËh \ f\94\eá¤eu¯\84\87Æ36\8d>¬`\ eb\9e,/\9e¶²\9cæÒaº\vÙ÷ÎS\92¸ðD¶§ï\vc\84 |aG  /;G\9d.t^ÝEð\ 2¹ñ<|U¯\17Ð\93BÃB\86¼!\8d\89ì1â\90¯\16ß\ÊJÏæ¿Ê\14²mÕ\v(ª%üìI´»\112\8c\8a­iô¹Y\81û\9e-=k\8eã>ÍJÙ\9c/½8|éUË°\0Õæz©\1aÄ)\0\91¼¶#ÒôØÉUÆn£Cr 0Ôí\94\fg\9cLëYNy\84ûj¬H\1aªÅM \r¼àQ\9c½Y¸\9c@\8fi']gÊ\96*\84\90\9d\9euÂÐ\80\16ר¤bÚÊS3\9f*\ 5\80ÉiúâD\9fÏ\94\90è\9d\ f\8db§R¯¡×Ê#ËyQ\9a\92\0\8fH!­\ 6Á      \99Q#xn¤¾Z: \1dX\17õÃ\r\13=G4DN-hÓ\1c&\9e:WU\1dfZ\9dg
+Nù\9eò\17D$N!=\ e\9bö\88è\93\a.\8d|h\11þÞ«swMýC3Mí°®_ã*Æ\17R\854åi<ñµ­\83\9eð.\ 1ßQÞ ´EWVÀÞcUª¨T\1fM\14       \8f\86\8fÊ\99êtú,cQU5\9bù²\93:êýÖ«\0\98^>0!ï&ÕÅ"Q1XhÇ\1f«\17ÿ¦þ÷üÿÁëü¿QÂù/Ú¢\1f\1cx\7fµEÿþ\8aöÇ+à°üë\vú\1f/hlcÿú\8aë\8fW\fB£ÿ\9c\ fÝ,j\97QÞý=\9bâfqÆ     öÒ¶øü\85®!\8dÿGf\8a\8b`)n³Ý\90we´\10\86Ô\9cÉliÄ·l"!ïöï+¸¤â4ävÕ\9bc£LîXbÌ^ÃU\9bÑ#\18\9aúBÁ\9b:\1a\8fâî\9fªúÜé(t\8fAêÅFù«tgª2©\7fÏ\93\12\8fª\ fá&\81÷â \\85ß\9b\89PÉß´\9eøªkÆ\vönº×§\17\16Q5\9b\rÎ\12\1e\0\93Û®O\1d\17ðÕ]XÕø\977;óJ\1d\1c»m\a^Ñn)bBk}î<.£Í\10¸0\ 1\80\8b½Zòà½s\1aÓ\13²\8a?ø\þ\9f\95ý¿ÙÊþ*PÿÈepZ\bd\81½C¦[e\ 1:\9eZÀâqÿK\\9dÑ:}\ 4Æ\ 1Ì`Å\90\98\94Ó\ 6\9e\87ˬZÕ#\ 3\ 4\9c§GI\ f\914b¢G\8c0w<"Ì ]¯\99\94?5\1cëØ\ 4  ç\15r,Uèc\17¶ZÄqÏO?\9aª³xKm}^
+v®ç\ fµÜÍk_vóNã\11U)/á2iÇ\1aô\7fö/c\1f"\1as|z8wJxˬ¿§D\89\ f\92ºÁ3ú:\15g\89wy-U\93³FcèÊîI\9d\99|R`îK\98hE\18\94xJo¢\88\e¢Ã3cSû\92h,Ø­}¡\9fÔ¡vpE\9eù\ 5\18\85h\8cÕ¦\ 5\ 4KsÀä\8f
\bie\7fØá>£o\8a/\e\97ÌCÏÂÈ\10ºÿòû\9f\89\99\99\81\84¿wÝ£à.sË\14«O\98fÛó¥(q¢\fM\84BÞÛ\f\80ït\11,0O\95s  Å\87\ 3«\90´¶©£\9ap·ª\18Ðt;p{3­ÎH\8b|7#\ 6ü¹\14\rú\96ô[4ô?j4ø6ÑØ\16oH'5      %c\15}ÁPåé\14÷ÚfS@BäGÞ\11þýÅ¡éL¹[¨ÁñÑ°4É7<åB«s£ò5ô\19\84ðÅp£j\89ÏY\97Zì"Á)Gï|)©Ë}¥7\93»Ë´º"PáP\80\8e      O]Ël»óËú\12¿¤áÍ\93\ fæt`Hù#oøÞ@Úí\83ë/ë½\9e^)23\18\14¬o¨\9eIð'z\8bܾÚöÅÕç\85÷<\96³DÂ\99\14\11\87µ\8a\ 1É\91\99¢ë\87lÉ,S\1a\81Y&\ 4 ùÛiä~ïVfë©\ 5èe]©\13s[î%k;\17°\ 2Â\86\eû<\17»àÓ3×­¥òìzòµyÔ\9cê\16H4]à6!âMå²{\14Ù\×W\9c5éT¦%J)Ê"úYj\95wyn~2\137\92Í\13>+Ög     %²\80­È&g9HÑæÈdÖ¾Õ£Ðÿ\12UëS\ 1\9bÊÆGxeaä\1d\88\f\1d\97\9fOÚ=
+{ªÖõQM\ 1²oR\7f\rNp_ \8fÐ\14ú\838\8a\98\ 4 ¼óûÞ÷Yή:¥tpî=záy\11¿*mÍæ¯\16\9e   nÓQ½\9aã2\13M\95,5»ù«\93        \19êV\12\ 3\8fkÈýj\ 2\17\8dLl%õÊ\9e­(\95jͧ)Ø(Õæ\11K­XA\9ci³N%jù\ f·,k>\8b\r:X\14HL\949¦íîK\98å´ò\v\12l*þü\8d\13\15]"úæ\8fFlV2¢¢,ÓòÏ'î¿É©æÿ®\91×ê\7f\ 2v\11FAIaÙðCáÏ(þú¥\95\9a7¼d©¶ï¹cyÀ^ñ³\13\90á1}Fù'"F9à\b7l\88Ka
+\\89
+L\81\13\bØu!,EMÌb\1f\11\83Êg²l³ÄfA\e+ß¹«\94\r\9c\18\a{\87\ 6\b/eÒmª´J¡ð5\ 5ET    \ f²rfë`ÆÜäÕ\97\81æÝZé\0/f4{»\92?ÿ:ðÿ?Óï¿\17cÿȧ\11@1"8½L~Þó\11Á>qI¢âñX\7fG\9c`Π±û\112hW\90ÊP\ 3D\ 5à\88~F¦§=¥\81w¦ó\80:3\8d§~fþ°ý­\9c\1a\v­06\94Ë8\12\95\84\97%Íß\ 4\90\89álO\905L\1fbM\8cå@[\0\1c\ 6D\rN)®\9bW9Î\95\ 6\19ñ?A@\93Û¯¤=\85%¿¢JUïe@\1eÐÏ­\99H\bÙ"-ÖB$ !\83\91Þù\85IQ$µo\9añYÅE\1a Gù\v\9cÑà{\8aY\ 2\0û\89£pO\9d}\86%C\17\ 4\8fê\89ÑÒ9*&é#\b#í"Y¦\80Tèdê\938Ò¯F\9c\a\ 6²àùK³Æ"óe\11Õ\8a\b¨L{÷\84\8c4 4O/ÁL\9d\e\9aÆÍ©1?§ô\1cm\99-ä":\0\ 3\16úzùûFAM_\9a\a|ȸb±ÚÒM¤ö\88(\ 2H\99v~)ªµ>4¹\f\84\990Há45(-¦ó\f§\16V×¹\8fèGY\14\9dCüãHä3\93áÞÚB\16xBÉ\96êÈf\ 4¹í(Ù]\8aæ\8e¨\eAèXNqOZu÷ýÕÐá\1e\14â|ò5RPå\ 1(<æö\8b^ÿ\19©l¡\93¹î\8aq¶Ú<^×R\ 5Y³üu$\89òÀ\ 5·ï§¹B\17Zwa\16l\ f\13©"vx§>R\98\ 5Ù±[)\93îë
+\11Òò;"\15\0EÔ~\12ð#¼\13¹¬-iô\94Î\19ß\8fvÌë)uqpÍ\a5hD9z´\84ÆQ\19\ 6²\86M±Ã ZUuXùõm<Ų{?j \ 4GIÔûs\1e\1f\9aN`\fXl^g\81¤è¶â \0\9f
+Rg 3\90d{5|¬§Ñdº\ 54Í8N£\88R´ðU\90\1dú¨¦\ 1\aå\82U¾]öy\9e¨Y\13í\93\86(Óv)Ý¥ø°H\1e´\11\90\8e\¥Jýý\84äVWI¸\ 4\19ÑGPA¦Î4?®kUqpm\11ÈtÊ\15iéþ
+½Ö\19\988\95®\9a\10\bâqgä_ë\11Z®PÜ\7f¥?­    êö`æÁ+\91°
+WèUOúD«\17lÉhÝ·\95Jªº\1e½EÚ¥0>\8a\ 1Må¨Þ\13ò1©Ð0Z\15\11³\8c\19\89¤U8úÊEZ¬ÙuÝÊ\94Da\ 3\ 4ÇcÞ-0#R6sm@7\e\bMi\ 6{\90\173f6vD\ 5O\1eA Ftó>¿Ö
+à5VÆ\bìá\89»,-ªaòO)\ 1\9c,Oï\{M·@¡\94VsÓ"\1d8#\91\15|\81Z\17,$8Ò\eÀÈf N\80ªç{Ï\80\19¢,\85b2ÊpÐ\8a¥{?>­¼³\ 4ÔÛ®|è\v¹T\81.C\1a°\8a-Ú½¢$÷\85¼ÒyVºê~§¥õÚÎ8hñ\91\98\ 2Õß*EÙ¥\10¸¸¶\12\82J\90#z¾Ùo{\80·CÌúî\e>A\99k\88}V5VÖøUº\87\1e\ 3 s\82\14®Má\8c\ esdÁ\94zu÷\9abq_w   z`ª½µ¹qJàñ_\1f\15¤ TNO\80]#£3·ß\1eN%ºÕ?Ñ\ 6à\84\14\8c \8dA>U/>9w|~ðc1=Ä\16&\94¢\96)Héâz
+gOâ|\15½+\ 5\86p\râ*\9d¦\9c        4]\18ÕØ!QMíã£1ÚÝ7F\fÃÀ¶\8afQßVw.7\84¡7\94\86\8e¿IÆV8\92\98\85ª\911Lügg\vFߥ\8fjBÑÇÚ\19[úV"â@/\8f\84=¶'[\ 5+íù@´°Ù-ß\ eñ}qßV=W$=74+ÒóóOdx{¥ÅT51\ 5ê\85\14\85\90£T2·\12\ 6,O\9e\13\90X\92i®oÍaTiï\82\ 2!\90½Þ>?\84ǤMqé\98ö"\11tÄ5â\9e¦ëc\8b\fó7¯°fÆ\95
+WôèÞ¨\ 3}hVb\8cÊ¿g°MºÖô\9e?Þzþxþ\ 4t\98?GÃÿ&ÿý\8fp
+0$n±ö1u*\8fáls:"§~q\97k\18ä\92\88\9e\8f/>\81²0(\8e̲{5ø\91éh«¹¤Û)\10Í\8f\16ÄUØ¥Q\ 6{Tq4ï¦\ 4háûiåe>5\8fúdtw)\80ß\ 5kb\a\9clM£EK\i\@!\88\85\1e\9f\1e\92$\1dÕ,z*/n\J¼\89¹?j\9bÏÁ³\12´çRÔ»øÅ\9c]Èt±ÛÌ\1cO
+ìpÈÚÀº¿l\1cÿ&@ýý\83\JsÌ;]}\85\ e\9eª>ë\19ö>\9bØ ¢×Õ²p»MË\94¦ÞÁÈ]+´Íâj*&D¹PEýVIÕYü@Mîìmç¦äë9¬/Ü9ÎÔñ\9bZ;\9eC¯m©ñ¾\84\92|ó`\7fÏ/µ¶\b<T\AΩQU\8aÜÐ\84v\9b\ 4\86\80\81+S\v¸¥\aý®Í\89\10{\8a]UJT\a{\8c\83\88\a\89¸\97¾\8d«\0äO\91\91ú\1a°ß   \90ÊÖ\vb\82\93#x*\8a\ 3\81ß\10û\1a\9a\8aG\92¦Þ6Z½o+³Vg1\18ÖA]ë\ftÅM\9f£â{\aä\ 2¯u%¶B\15\95\8d;V}"ñå\9d\8f\ f¾\9d\96\8eÕêP¬\86\89\99\91ëûNÏHýPÝ¿\85¹\1fQ\7f¯¾Ïó¤î\11ê½(°@t\8a\95'\12å.Òù³*¥\18¥ï%Ì~S\16ï\19(\1eEìp\13ã\11ÇQ±¡¹ã¬C\99<[p\14Ð\17O\Óý\1e\8d\85Ľ\98?õÒØ£B¤::\96¾f\15ü)aË\14¡\9f\99?U$ClôJ\9e\95ÁqÍJ<\9fºð6\99Þ\89\r\7f|¬ªÀ\1fóó\8d¡\8fÞü"9\89WÑ.\81\85;0#È\fäÈj¹×­\82ç|4Ugy^\10ñjëA}+Øü§\84\82\8dAV\
+±<\94¯|\97ã
+\eàµC\97Ü
+\1a\96g\ 1GïMf\86Õlò¤ÅÃ\19\1cò9\9fÂZ\ faÈýc\10\8cW\97/ñé\ 1\eQ_S\10\97\91ô? \ef\9fkQHñÂ\15i´Ø ßâ«®=2üCÏæ9\17\8dÝ\ãHnÊà¸g®\v\82\11\8b\97\14=\8eéÈ\98åfKúd3ÿ)?\ 6î@Þ¥ÊHG âM¥\0®£Nþ-÷\99´ÿ¹B§\ 6ÖLFÍ\1e'\13ÅýKϲ\1a v\97§ÕïÜ©\1a\87þê+Ñ\81\ f'xV~\\9erp\f¼\1em\ f\1eáá\15Z>\85\f$\95  àþ.R¹V:\12l\88\e\83\ fÞ\v[D±\996i\13Ó\85õ\88Ôsµz2Ǭ\19øq\9c\1f½
+?z\91Éej\91¢ã·f\19±,\94\0¹ÕàØ«:\0\90UÎçC\99È\14m\ 2\83\1c\87~\9dYbÛÏvT\9aáJ¬O\rb-\ 1¯«v\11\81\818Xo\1c/;\8b¸pz\0<Çkn§\9a\15ý|Q¯·à\94\96Î\8aÛÝ,\f<\8dC±ÆD\96R<P@\b"\99Ý\8am\82\80±W\ e\7f®°\a\9a.@-\952\84X\80CëÛ}V\e\rXö³3\7fW\0\ 2 Ï!ãé\ 57\aÆ
+`Öô\9b Þ©ïp\88óÙ\14w &+°ÃÈF\9dZPY×\9bz\b\1d&í*»Ø£Ì)jú{©ñã)Ò÷ö?«÷r)  Ú<#7\ 2o8\ 1N\ fR©ÁÌ\91ä¢T\13     Z\0®¦\1d\98X\8eïj¿F\93E9;´ÞG$}}Zä\9fz\82\9e!YIßIȯ®1\8f9O°'\ 1c`]È×\8dªU\90\\96þ\12^z\11{(\7fzê²\11ÏêÑ?%\12        \15¿§\85\99¨\sæ\8c\17\86\f\97Ö\ 2\98ï÷fy´\ f8\1d\81¡¨"ÖÔïÆ\17þ[06yÔ\88±\15àP\1f\86üÔ#c\82<ô:¬_ÅÆC  µp¹øºù,\10Z\8b\99\ 2\ 4íæpbΨ!1 *\\91¿ÐJu\9f\88ONÐ\ 6[Z\89\ 1\r­°\9e\96°Ê\0»Ê7ã»õ´ð\f­Ê\\1f\9dP®Zºª\8c«0\12s_óÇ\98ðg¨êÅ\ 4·~ò\a\1d×?\9dÞ\1ev\bF\15yàÕ*få\9f+*\1c\1a\8a\e?Ëä¼3IS´¡×>Â\19´Ê2\82±I\12|l\97Ñ\933Ë©CÉÏ\18ø½Q\ 4Çrß\86÷/*W¦\9c\15ä}+ X^\ fç\8c\e×µ")ù\92dª.ÂQ·ÚC0Ý-±^\8c¨1C\va\13\vÖ\9f\83]Z\e\aÓ¼rΪ(ñ÷e      ë\87~\9f»fDÊ\ 5Ù\16Ç\941\8a\ e\85L\81ç´¤±\1eb²u\ 2P\ 1Ús+1ÓJ7\17~E+A\94A~\97®û\91ÎCÔ \94J\7f²\1cåãx¢\1eÁ@z\ 2xÀÝ[P\81B\80O\91#ÕN\9fN ¥ó\8f$r/@OV9PÂU\ 4<\ fÒÛ\8a¯gʽÖ\a0\10\1f\90\8fd\97ñ\14q\18MA\9aLv#ÔX\92ïQÒT4\ 3G!~\ 2\83\8f5Ïcl\97¢ñ=Êí\10\ f¦<êo\10+uì¹ï\82%N\b=l\8fÄ6JÿN2Ð\ 2VÑþ8Z\80\1eaU®Q\12\90wEX«Ì\80IaG\1d\8cqï;s/Â÷¡æ«ÝÁ\8dT\rí¬\9d\1aÊâ¹Y\ 1¶<G5\83Àw|x«%\buÌ0\9eAÆì~\ 4ÒºRVx°+\1c°ò\19õÝ\16\87j\85àá\1cø \8d\8e\95"\8aà(±!\16VG\82¡°\10©÷¥UË3½\8f]\17,n\rÏþ¹?ä-ÿ\9dÍ\90² f³\b\18\12\1e\9fD [9.\94\88\95IÖã\88\91\16w¥¹sõ&â\e2˩°ڷ\aÌT?%\ 3ß+h¬¾-5Õëb\13ÔbæJ\b\18¹5\9e5ñ»\81¼\13êNë¢ÞcÌs\99\1cG\ 5¾÷ó\84¤\151O­\86-½·D\80õ\13\ 3lG´l\ 4ÕÖ
+ÕfS#µðAZ\95\ 2ü\87ü+KÃ=áÙ\9c7\8bÚõÛâ$ªgç\b²Çpû·\82Èe\1aD\9bÞrÊYz]0 «3ÕRõ\14\91¼\85za\98gz\9dµþ´÷6\17³B/\84@æDT»Æ§Uêp\0GNÄ(\94©\v,I\eû9i8ü/Å ¼B\93\83=\ 3[¦;RXRZx\ 6\96R\95Y\8cLÖñÁG[\86ßnJ\a\88¤§\9apUï:®O!\8a\9aìYL\97§Î\r\18Ò»z\ f\ 51ößO  !ú¦ÔBµ®\1e?¹£\ 2\9aTäw¿·mfç\ e]\1c+÷uâ­¹\9fiü)\1d\e%1\16.ég´z©Û=\99\1c_Á5ƪ«y\86Q\91\8bíôÖðÙò\84Î\82\92ÛîT\890\14þ¸S\1d1\9büV·~_ù=Ç\87ÈÊá\96YS{\9a]Å6\8bdtoá<\9eï5\85\11ª\e½jF¨p\10\9a\ e£Ð\ÂÙîsïq3\0ËW©çÞ\99âûrÖôªù\92Ý÷\14#Û¿\90 \9b\94x\1cc\11\18)eÞIöìvÅêãùLõÒ\17;
+rø\8abyÛó\7f\1c{²ã£ã:YçúÌu\85_YP\91(ѬN®\1c&\11cVÏé:\98l\b\8d\9fßÍs\7f¬-Õ£\9aZ!\ 5<g\ 5àª+H>}ÊøuOµv°\ 6éY©°\87©èu¦Ð\99\90
+ýu\17ñ6;ª=3
+0Ñ$¿²g\9e\95ôwÍ*0U¸\8aSª¿óÞ3}Çè\b\848}ÖBfÏ4\9bÕmä\ e±íÃÊ×jôºj³}¾J³\86\ 2ý
+ÛÖ\r\ 5\bm\95ÎtNIÉY\r\ 2¶^ëS8¹è\0§¹\8bçúHfãeÔ$gN\8e 4åå*õØ÷J\84¼kÍe¶\145ö#=\rYt\92\e\9b m]r\16Ä%Ç­ÿqö/\0ô\87a­ðD¦â];þ¼ÊaIO+\8f\889~ýpâ² rRq²\95ÇúSb©\10ÝÚ¨¡Ü\13øäkOÝ£\90É/½¨rÎ?rà<çïÏ\86{X\ 2\87Hw}~îÚj\11\1cÎÑA¿#®#´7ª\88l¼*ú\10W­ùÕ\8d\rg\1fÚfßÛi×»\85é¡p\1f\1d#dè\9e%\96\0Æ`\15\1dò²ûý\142Yl¹ñ\8edÓ9+t+l(ÓZÚö]\ 5\15\1dìÏL£ÂQS\98ö\ 1?\ 1ÅW¤\17]\85¹âBÀ_\r\94tβ1»ë@ÓÔíüx\a\86.7·\15\82Ö_+\10\½\^w\0PÔ\>Ú\÷±u`®ê\9eC)6\93'ºM\95\8c\1dBA\8b\19?èº0\12BDÊ"r\18\11\ 5B4-Å\17ÆöHµæÞþÙ\94±T\ fê;x\9e\e\9f@ÙZT/Qí\8cæ9b\82ù\85Ø\1d=n¶O\9d\ eÌiÕÕ4q°å³s)\b\90gQ\19à\ 2õ\84\90åi\82\14\9d¯\1a³ÍQz¼ç½¬Éôg+É\8e#\b\ fX\aÙçy$V|¨³Ùßá3\96d\86ê¸eMzÖN:â´É@i\r\13åû\97Î\0óùDå\99\7fM§~\8e¥é\19¥`~\93!g\84ëIH\1eO\92òoqªDd½\aÛ\11\ eÁ\13Âh¿>:Ww+\aÄq¦Çí\v\15ô?U¨\8dÀ@øõºf}䦴\8d\12\13?\8aÇûl\86Ã}\97H\80Òî6\ 2ï\11û\87ÝÈ[©õºu·\10AÎÒ¾ÂZgô:a§\9ca\9aywÿj\ 3î\1f£\83ðJ\ 4[©Ø]+U\9fñ\95ÊøhÏþæg«ç®\96Æ¡\e\8cË\1f\92Ú¹÷&{¸/\8dh>7}VÀî\8e\ 2ñümÁSµÒv:\15Dn\ 5ªÐ}üïKö\9fL\8eÿàÄ{ö\84û#d³§
+̲mN<\1aßÔ\1a¡C#àBû\9aw4m¬ùOp5\90è+\9c³e\ e\8fêL\7f©\97\9cÆ<c\8a@?\1c\ 5f\8eÉ'¢\89tÛá\aÐOÑJ¢g\83à|E+\vc\12v\1dÔiJ+´\8f(h£2@|\ 5p\12`%\1f¡¸\86¯+å)ÍC½à\8e\19\84\ 4F%\84\92ó\b]Eã\12 \7f\10\18 y@MG\ f\8c¢^¿'#'\16\8c\0Â*´\10J\8c\a7R(:È\97ó\ 3w\97\va#±\f-Û÷(\e±ßÄ2¨\9d\bmÜæä\93\fx°[.½¬mZ\8e\1eA\86ß\ 4«\8aÓF\18\88Ò\19Ú\8aDö0»ä@ÏÐ\88è\f\94­é¼\ f\ 4\ 4\1eP\ 6¥\8fEb3Ê\8fv³%Æ\95v±g´Áý)àçöØ|\9fýÀ-æv\9b6¹jZÓ«SéU*çþ2\9f\12ï9K®\9bâF¼\85ΠqÙMÚÖP\ 5¥)¼Nc¬\7f¤_*¹\r\19\ 4µ\94±\ 3Ð\1c\füº\mΨ`ÌÖF嵧\0\80#<tO´'\1e\88Ö.ú\19Ï\12¡a\15\8c\0Ó`?`£S®«ë\1a¨\9b\9ca- 
\1f¬þ®-Â^É7Î\82g¡jí\8b=wh,ª¸\136\12Vßãs\7fúÔIRS\ 3\9a\9fu\94ÕVÉÏ\93j\9fq«¼\8f­ >â
+Ãà´8@Y\95ÐC¸l¯Ê«Ápü0\8f\92
+!@\8d-Xì¡\15|\1cÚ\8b]*\ 5&ÛÓvcí\88\9b)U~fVa\9e$\9eÏ(Å\1dðh\80\ 1\9eRô«k\8cï° IÍðɳVKäIe[{p\1eþµå«(;òÆî`\88\83M\11\13\98.ô(´!\88\91\ fÆ
+\8dnÅ¿â>\v
+²{M\8b\94Ò¯t0¶¥i½®w¶ç×D\98\83n;A\ 2HÕQ\9c\ 2eÔu
+ÛÒÔ4?\8f8'êÑpµ\0äTþWê±\a×\88\7fû±¡c#V¬É\12\98»ÀÓà\80[2\90½\93°íÖÃJ¬\92\17ÞyG\86àê9_¥\9cÉ¡9l\ 4c[ËQu\1aNUÝ\f\98\f\vǤ\98\bá\1f5\88\85\ 5Ç\99\8cD¿\ 2HLDeîí\0ý¤g¿oCeÁ³\fFó1|¾\98\17gý);ôÚûö¸Æ0(V\p¢\81òU\ 6Ü~¬\15å;\84%BÆ+Þé\f"õá\17ê       Ê§\90\8eb$k2^fu§\9fëðÇBä\81\1fd@Ä\bí]\7fôå³Ç­¨çÑl÷\85ë\8e·\9c\ f\11Ǿz^\ 2»|Öwý±0^\8e§\8a¼À\94¨AûÚ6)OÅaWâ.\b\81\82"ÄqÕå\a]NoÜÈ®\ 23Â5dRQ\0\13mBpѤÓJ\1f
+õx¿V²Ým¹\86¿5Í7¼\eÕ \ 1#HÇ]\b®\14÷\19\ e'è¦{ë\80\91BÞZ9\9eÑ\vM\15\ 6\97\84\1eÅõ õÅ8][ð*\0\10\17ZüØ\88ÂtР  6X$ááU>ºZ\9eÆ\95`\W ÆX\1d` Åã;\9a<äcWûè\11scüå^\r7\13lmý¬\97=iÏ\89ÂÝÄÌ\95j/\88­3mMW¥Í\98Û\7f{T<ý˳\90±\19ãصVÐ;q}\ 6\15£Ü+º\88Mk`å´½½#\0\19«Ïã\9cÕ\fÕ,\eúT\9a¡\ 63\fÈ\15©\9f\15u^
+vkfÛ^z×U\97\91§¡æ\90Ñäù\9d1W\97VÎfzä\ 5\9d\1cg\14\9f\92\ak\87·O¥®\9aÿS\ f\89\7fÇ}v\8b\88õ+¥ZeôÆ\9e\e\9d\94õ)¡\16/:â\9f\19\b\1d\7f\15\15v÷>3©ü\ 3ªkêÍF\YÏÏ'Zx!뮲|¨ãÏr;r\f=\86I\91\85Þ\1e¥a{¿?M\emËÐ\13À\83\88ïQ\ 4ûGÞ\87ÖÉÈ;\r\88\9f\82rîi8\j6R&Y[ø\86Çû\18\1e®Éê~ð\96Jüg·\82\8a\1e}\ 1sÓª$äää\1f#BfºSò{Áa\0ï ç ¤\1d\14\86ß´\\98§L\19êÌ\1aH\0\89>RÍ?˲\1eÇ¿\99\ri·ß/ö\99÷SUáô\90|#¼ª\15
\948\10\8b\9d Ïx \9fa\e\10\14òä\b¨A|\10á=YÐ\ 4Ì\9c9\84\9a\82^ïÌ­1\12\95ãJm´h A<z߬Ï\84æ}\7f¢¨ ,\9cÎ*¬{Ãô#I@.Y<F°äG0ÌÊ\91Ïò\15!l6®\7f?¶«nëb®\8bÓN\8c\f¡\94\ ePý»ã08\8fϹ\f\90\96ø\f\8bbT÷~Ï\10\18&d.ßk\88è\f\8a\1f\9eO\80s\89è \89\f\vÞkY\8a\91\96\1cÅ\13\84øß_Úã²Ìì áÌ%\9c\9eS¤c>ðÞe¸/vÉ?%N¿ýO\15\fúï©\8a\1cPKþ[²"æ¢ÿ-Y\91\8b"忾büY\88äùw¿cþñ\8aI¬ñ·²z»°@ç\97\9f5hUB2Ç5ãéùÞ̦v\ f\8dŧ\9f\rsöÚHg\17-\eÒ\9dN"âÈøk\8c\11¬\rû?ÅLLJ\9f2»#Ù¢R\ 2\80\93ºm¼\12øçAM\ fl\am\13Jo´E«\90B_9£«T ³[ \90.vcÆ\9c[öÓ\97\13Õà\85³\ 5M\rt4\1cX_\ 3½üo}\16¹®\17|\94D&VT¿\8aѲ\8acíÏäâH\öÀ½¯û\9ci\1fãF¨\f\182 dؤ\96\96³¥DL#\1fé\1cß6¼}^\89´¢\10\8d´\8d-þð*\ 1d£Öý\þ\aj\rý\9fMá?ɵ^Ç\8f\90?6Dßg\1f\10OJü\0\7f\a¶C=¿[9^\8a\8aÐíI\eõ\89\7f/m\81\8fËö\91P\9bàªÍ`ïÎö>Ý\91£y\82à3ÌB¥ã,Dk+ó:õZZV\f5¡{\14ª\9dr\b±\8c"â[\19¹\87èG'g\19ÓR=\ 2ߨ\1aáLßâ
+aR\94\84\89ÓaÄ-¼\86V\ 3HRº\81úÕ\9f\11y·ûe=éþRX|¼ÈÊù?*O\87b       TYò\1at\95;,»h¿³ e-\16\19zgÇ\0   \80kÌR\19\7fÇ/ÒG-1\98q\12Å\ 1Ñ-Y6u½ïp/OU½5V\fÏS£&3êwö\18\8aßýÉo\ 5OÝE?7#%½eÀ¾\11     )ý=ÁÕ£®¢v\92rZ\144¡Ë\11ë\10eÃÊ})\85Ð\1c\18s?Õ2%\96\82<ë   \9dZêù¨\ 5\16ñèQl\ 6&®tN/\8a¥¨í­v<ÂVCK]Õ\7fc«;\EÅjû\91v\1eÐ¥±\vU$øÝ      sV\96H]è.ã"&ÝõÎ\ 3\98tîý\95\1aØm\ 2[&¬\8d´ñ=!ÁVÅ\ 2Ýݧý¢\91ìø@\85¥\1cm+Y\16     Q=\8b¤z¥3\15äÉ+Ù\94é\19\9f+Æ"_5ól\18\b­bZ\16\9e\14Y¶bÑ\fFkV\91Ç\ 1æµ0ñü\11ë\94¬Ù\ f\10cj\80\98u¬_\1c\v»ÖµX\8c?-ô\7f\13jþgZRü~°\ 3ó\ eÅ4\1d\1a¤çì/wøBÑU}\8a$©{\ 3b\89Gä{ê\84¿"TzË©\8b<\90Rát\8f\14$2¹\851Ä«8?Î'h\87\9dN¶{ë)S'ûZù3ñ>+x\9cÿNâãÿE?f\9d?\ 4_ö_­å\1f¡\16\14ôRûdR9EYÉ®ÀÆ\7f!ëW\1càU2¨\9c|V)\1aLþ´iߢO+ü>P\ 4ë\8d\ 4\91\11\92h«$£ÂQ`æF1\15\ 5@*}\80ËD\11\ 3\90Ò\82\172Fya°a_·ip\94­o\99î\8b\9coc4ï\94\17È\95\94\8b¾ï@uið\88\f\a\fÉ\93 \1d|\160\8aMþNô÷¬"߸\83j\89ð\ 49§Ø£j\95\9b\90r¥Ù\80\8eË,x¦¨JÄ\8eKåËÿ0+ª­Î»ZT³D\ 3\14Úâ+\18Ь\87ù\b@\ 5àâV3¾\8f\ 5H<õ\0é\92ð¡^íVË\99L÷'a ÍsJº~×ÈUÇÈw\15\rã\b \90\15TËÆmóC¡7ÜÊ\1fÚ79ë¢÷q\99\ f¬gì\8bT\15q¬¤üï­8ñ\14@\97ß^\1d\98L\9d»Þ\ 1íÖµá¹\90Â\ eu*\82Âä1?\11®\b4G\Æå~·Úü°\8a°d\ 3ô°\82k\142BÓV%Ó\9búïÑ}ë[H\90\161ÂÛL\8dà^\v}3\9e¢Ø      ÚhÖ\14ìMy\15Ñ\ 43¬Üâ¹?AÃä(ZmßZk^¶Òz\85\13·«f2á\87v­³Ô\1e ¯\b\91%/ê®\1aswWM\91\84¡±\88õ§ª@+\92b\8cø\ 3\16è\13vøÝ?ø\850\r\9erñÕºd]!´¯_\8a§ã_\95·ö[v\aù#\8e½oï÷\8cEfë)ÿ^û|§\1f*|CÏý\8dr°û\96«¤]KÙ¡:\b2\9d?9\8eÀìØ\88@¶¸\13­}\r\95kGògõÍñß\96¿þ¸wý\94C\85§\84];Ï\1e\bZ\ e\15\89OMq\0\eú¼\0A³×n*¢ÎxE\8cF\ 1\9c\ e ¸È3I7\95Z!\80\ 1ß@A}x\1a\9eÕ\9fýd©÷î°>é+\ 1\ 2\12ë
+ÂXÕ\1dBV¨àȪ\7f¼ÒÀ\0¹Å\95\ 1f¬p\86Ë\ù\1a\97+\8d?v\ 6~åßw\18µ\1f\1dFèË+ü#$ræ8j¶ò ø\8e-ïKt\7fÅH*Æ\0­]\8a0"áµýO\9aVc^æ>ñ\ eÇÈ¡Þû\9e\1eõÒÜ)\ 6 æ¸½&\11#nñ§³^©é£°2¾/D#X\14WÄ»\853z!
+|Òw¯2±hDÞ\ 4@
+\8eI@¹J0xs\\93\88\8che\9c\13\a    5*\15\14w`fc?Å\90o?\9b'\14ö³*§\9a\aÜDkHX\f\13!P\89ØþzS;\b½Ë¹\rz\95 &ä\91\97<êY4?L6ìÑ\9f\85\85µ#£¢\91D\v­\96\15E÷عVÇÔ¾Ûî\r\90O,Å|ì«\ 4\12è[\b\1abD²\9d\9d\8c\ 221ø\8e\91õ7+§ÜEÇú\f~ þ»« \11tn)u~.¼3\18ä\94FwLùs\1f1\8c¤¯M\e1Âl\19$1rðÌq¥q\ 3\15äs/\9bvGÐ\85\8a[ÆJ}\9a*ÌÖyÕÞ\1dü+ÓMÓ\b\1fû\88,¼U¦¼\1d$\ 1Îï@x¾DÚkжU\ eðE\ 3ê9{áb\9d\ f\0sµaÞÞnÎ\9aËú}NVfÖùØô\f1à       8\81\8aÓGÜ\9eJJ\19dlåé ©M°¦,¤\9e+$V¨P\9f\89,\95\157wÖëH/|¤ÌÎt;\\ 3¬±¦ðþG\10Ç\95H\10î +úv\82ð\18â\7fÇ\82Æþ\8d¶ÈÕ·\9apËäßråî\rZ§~(ãl!zV£÷p\17f\94Á¨\ö\12ËÕÉ\ 22\16\vE\9ewÛ²ûüä#)0cöôùÂ{Ô§4\ 3ã\17ËæuÏ\ 2æâ\9eUùì_6²\9f\82Áó·[»»<,r6iã\81\17\16\9bcswéö\80\þJ6+Z¾h\12*Î56\9a­)\97æ¼hå\9eÓãì\85\8aSY\9c\9dÊ\ 3¸\0ÿÖ\13£ÿ°\82$×=h+,/RB²\ 5K\87d\96ûüI«y]#Õf%\8cõêBâäIÁ4x\90+ä9²´\95\1eî\1dÏ5\99\8cröÄÁ¼s\13$xÖvòÁ\90\89n0Ù\\8f\aàPß\ e\9c\80>y\rÌ3À\ 5åàú\86\92\10Ô'\98*Ç4H(ÔÅõÜx\9c`W\18Hjýì¥à«;\12\999íïp\18ùëÊ\94´³0`×\17Ã¥E\92Ä +èè¦EdBE¡r\8e\8c\84\85\8d\9dÎ8\90\ 2\9aAI¨¹Ì4yíJ\14\9dÅl%;¼~Ñ@ºïeð¤NoQyÕ\82\15ù-ðB\bÐYX\18Ä\1e¶á\16½Q¢%\83U'\1e\871;ë\ 5\ 2Sd\8eK\9e7cÆT'¢;ßíǬ~ç   ß\89Ä\82ñáEt\8a\8a
+r^à¬\87|\17´\ 1ãWEXp'º¤Ý\ 2[\82ê\e\a£êÑÂ)"t»Z\99ù¼gcdF.s\1fç\1a&EÈ9Vî\92\9a\12tðÊWYäÈuÂ8E°ÚêÉDloor\1c\15þ'2J.ÞßkÐMHóØ\95\8dçSrö\18\13ßü·ºÊ\ 4\90~ºÈ\13?\ 4¦\19ô\85 Ò?¯¯\7f\13d÷ÿ=û\ 1äÀ\7fk«Ì\aíÞÝ¿ß»\9d\12ìÔ*°KD>\94\r\ 3Bã¤<Áu\1d\83L·6n\rèO\93¹ô\87\98õ
+÷ë¡å\b\1e;ìÜW\95!þõÖý\7fÞì\7f«ßñ#\83\94"GÝ\ 6Eæ72 U\aº\8b¸ª[|t\10¢\80é6\96Ò\fgüÜX\8fS»å\14\KÏ[g\95\95\8e`T\88ØM\r\85Ô+_\9fôè(ÏQ\82\1a\9aJTQ·ß6¤\8d\13±GÖ\3\97\;HÉ#\9d\14v\a\1e±%¶txÞ8¢°Öë\11\8cÕ?YÙqè?¸u/\18
+\ fuEúÒ\11qV/4qZI_0j~õBK"R\emûtÏ\8f§5x\1c«\80³\ 4\92rí,r\eç\88û´CÚg\93\16\86¨Ö¾.!yu\88µí\89{\89K©û\v\8fèR\8fÖ\f\94\$\ 5¡îÇ%\æ\19Å*¹ç-\82¼/;9ùÒU\86ö¢hÏþ¹òÔl\81Ö\ 4\8fø÷z\ 49SÌë\9f
+\9d\83ýÓÙ2÷r×K»Ëøg?¾r\18E\16Dq\a\9e³Ú\1e$4JùðkCº\8c\15æø<¾q\84\9aGÍÉÉòá5¶í¨\86é÷\\19\7fGíQ\#¸<\12ÝSô¹#È]\1eÀ\90TMuOU\85?QNüØ    o¼\12b¤¯\9eI=je\94cs\ 2\88\1cçK!«\0ì\9e»\ 2²,½\95\92[V£,)>T\ eËDrQâ`0~@4ã¯-CuÇX»mrí\8d\86C½m\9d:³º\83Qô¯I\95fÁ+  ô\97=à§\94­üVÁì<·¶\9b!<¼äMü´3\9dÓU
+"ö\8f´lVuOjzÊ\\7f_\90ÿ#Û\9bW\83\9b©ð\ e¨^Þ¦û&q\96ý     ±«ÎI\10\91*¢(\83²Í\93ô\11¹zÊ\95¶û\14
+\16­ÜJÎ¥Ãǽ\b\9c\95\a¨ú¤(\893\85#¯Í\fì\8e\1a\80¾\87f`\e\ eÅi7øó|êz6\ 2ñ(iRò\8b'2c\8dÞò\15ÿÌ0ÚTöV@­Å¨2×^,·hJD¯ª»\v\1fÁxGl»³§-Ê©Wÿ,\86Î*\17ÚÑ\93Rü£\ 6­Óø`\Ñ\9d-ÌrâÕÓ\ evh\bú\aúûTòá(U#½GFÊÂ\1d¤d/3éó\94É°\11\7f~P\85¼Þ\85Ý\ 5\85þT\9aÀ`·×\7f\15ÄÝ¡Ó½\824Ë*<\7fm\f\8dKGrðoõµÉñ0sÉë@MÝ\8a1íòóÜ?í¾ó\r\86ëßêw¤Ø\95îrÿ<\83\f©\8f\9b!j\f\ eõtö|~ZB\88\93^bN\9b.\1d¨òh½Â¿-æúc·â-¯(¡ÛUU»¼\8e\11Ì`\¼sùUÂ\v
+¯Î\95©!\87;Þ­çþ\8b-±>£Ñ)a¦¥\90\ 2ü_\8fh&¤@S&Z/bª37¬\80³ö8ç·úE\fµVëài\99ËOûXDß\11@r\9a\9e\ 1ü^eås\95\ 2©6§â\17
+\bm|ì³R}ñíê\10Äj¾\82;\9fa\ 6¸ì\97ä`\92̹]E\10.³c`j-ÔIîö\11ÁÀ\96ú\ eD\18\14/_Ñ\90¯\r\1aÀ°´ìë\8e\93Z>(U\1aä\82yXûPÁ¯\88V}®í\ 5\9eè10n\ 1 8\922\8a\eÕ9kh\1få\7fÙ¾~N5èÙ\8e4×÷[>{_ÏÞ\aþÙÕ\ 10Àú1&N¢À\98ô!ÔóÞþÞ=ÿG6\f\9eà±IºVà¬é\ 5\9c¥\97§ÈqJ\80eÞ£;°ÀsËvb¬\85ñí\89C\f\81D±\Um5\9aÒn«t\1f«\1cñ\14Ø\1aXò½Ý\8bAi(b7Dìõ\ 4ËÁ\91Ó\12º\r\14@\19¹êÐk^»´Ð\90@Öí~\94+®­\89æ\aï
+\84\1aªqÀÎàUïâBS\v÷ ûZ\10£Hr4È\14y\877\18/Ñ~¥L%\17¿ê®£\9c\ 4ç\95Èt77\14Vs4q0 jI­H'=ê_õ\92Y§AÕZ-\80\9ef½M«ðÛоë[ f¤´8BÄuè,|\b£ÑÖ¦l\rTÇ;\8e\0&\7f.þÚ\f\1d\19±?\9eK¯p\1a\14Åö\7fXQ\96c\vàZ\8b¦&¸¿D\v\8emvÔDøK\ e\19\16\9e\93tÐ2\95øÂ\83\ f-eTc{\a˧r%xtGÓ¬iÕrª¥õÄ\11ªm\8aà\18\1aÎ~&Ë{¢eô<ª¦\16ýZØ\8aé\ 5\9cÛ×rôhôî9\1a\8b:\85»ÆØ\ 5mÛªí#÷F\1fê\88Tè8>×V5'¬ðd~Ôò\9e\b¢NéM¬«¬\ 2J\ 3\eIå¨.b\8e\1eÕù8V%fÔý¼È¡³´Y\8d\ 1\18iwyvëzþ­.ÍQt©A_߬~ÂUbÞ?Xã?)\16^E Ãä\83Ãi\aí´\ 5\9bÕ\92\7f{ô²AÄÊ>G«ohõ\8f£\8f\19Ò²õ[\86\12\12*#èiY\1d\11è\98W¾ùïÛU\7f$Èü\ eéiQ*ðEGîýì\97#ø©¯×TNî\17ÝWUÃ\84zr[g¢\ 5¥\92.;̳ÍÝÀ|\f÷\9d\ 1ÿÃD\ 2\9cu\9be\9b¤ôÌMm«´FÍ-ríL8\15¯A\99·Àý\94\8a\ 5§\19w7\8c1Z        \82=[ýô\î^Cý\96\87\88¥X«n#O\r)¿¦öíØlªýc×ÊáàÐ"\8eÕó!¾ß\ZB³sÛ*\0¥VéE±V\8b1¸X\18¬<WEô§D^mßÆ\17g\94Ñô0\1f]ª½»«Ì\f\9e«n$3óY\91\17ø|¯\ f\99Ñ»âm\9a\1cï\13é.³òY7]\92WðiÝ«üâ\91\11Ý­¾Õã\13\85\1e¹¤'Ùs/CË\82\9aW5¸Ä¤\8a\1a\95«¡â\8d|s¹=¬â¦¨È\13a\15þÞ]¿¥\81àÝ%çiÀçè\98õ[\90ÒU\15\bh¢n\8a\ e\11¹B@\8cÜÊÚÊ\958±¯õõd\8fç\8a®n0Oþf\85\82P4´\16ÆÈ*©â]ÇÎ\94q\93}¶"\87C$NÌ\8e­\1a8ªä ùÈ\a\92yéfÇlÓ®'Ï`\96P\9a\bÓ÷ÐQ
+SÌõö\99øX\13ô(±9?O K¾Ëû\8c\16\85ËHÕh\85\16¹\ 3\1fbn5·\17\11\v3×¾×[8\8e'ª/&O\9c¤÷ÖTSùå,M@3H\16~\10}¬ó+pÏ^´¿yFN:×v*J\97£5ÙæÖð.U\85\ê=MÁ¬5[\00E6\8f\96\91Å\9cyí¯Eþ%\7fíÏ\eÓÿÔFÃú\11\8fà?Úip\ 37j#7;>ÀØù©òl\13X¶wá      \ 6iJ½º\97÷³D4\81\80|«Nŵ!LwìBl^\94\9eÞ®\1a÷õg%Ûú\1fÚtø\8f¾å¯Cÿ\87úª«\ eõV¨\18\8eüuų   \8cz\8a*¸C=\85b/ã©\95\9c\82«0ïh´\ 5ܾöö\8e@\0\87!%\e\1dÄ8âª0ö>\92·\ 6Ö\93|@©\8a\15\81\9aV\9aÂ}\830Ôú´8K\ f\94v­»\ fúc\8a´é&Sª]²#ÁWGr\¡<eÒûL\eÁKÏ­Ç\ 5\89ó*¥\ eF#U\88\91±7\8fF\8e§µþ\ 5b\ 6H,S¤\83\1f¾ö\1f¼Ð\aÏ7Gd\13\ 3¡HÎBK³È\vu?õ¦~gSv+\14*r\84\83P\aë\96q$õî-\943@lV\ 2\9fTÑ¿Õ÷æ\19asgqù\14®cÐ~|4%EÎz©b\a¹´DOü\8eqÔçÎs%ã?Ë\86­omÛç«bÂcYÊÜuò\86V\9a\98ª4|xü%\93é-ßA³ïgÿ¨ä\8f$¶ú´
+\15¨iÙïRÑò\r\19/ú.ú\97Ê[Töy¦è¼øÞ°úUMÏ@ºT\10¤¡+AI\1f[D8´¸ç*Ú\9dä÷÷\9c\14¿ÿÒq§jX\bêg\1a\9cÕïz\8eH¶Èè\93³.{\7fD³C91.dC\13o\8dS¡ëH\937mLè\81¨\93\7f~0\16¿êGû[Öâ±Êþ¤ón        \7fP%<\93[\94\17Ù\11H\84\94}o\7f\9d;\8bb\11×Ë\ 14g\9dj\ediJ\9e.XÉdþeñÿ\94\fKl\9d÷ß"ß\98\13\ 61ÇÔ1\8fÒ VAOù6rÿ3j\9a½\8e!¦×ß[yz~´]B\19³Z\87o\ fïê\9f\19ÌÊ6[\9fAê>ªk\8d\11>\9aºÃÖ`Fõ\84xáâúù]c\v\85`«hB³µ¦\1cyzT÷ÔÕ¬\vcÔ0K\15Í\9cȹÉA}Íp\ 4\8c\ 5\9fH\9eþ\96\eM|FRÕË\9e[ßOÿG«\91\12\ 5T\816\98ò\aù¼üÍÕzþjBñû£\11¹=µQFÚB.\84§\12\97t\1aW\86x\95\90¢\\99'!l¶,¨Q«vR\a{\84\17ÅNý\9eÁ\12°\16=\1f\94±nåÚ#\86YjÜWÌZX\v0I\14M¾¯Òö\9e³\84\82á\8b´\99\88f"ùèÓö\85éuè\1fßJ7ð(òI\9e      Á¶5bßTñ!\18\14Nçà\93\vçUÙkê\1aFéu¡XÐoõ\eÛ\86_\v_\86\18rµÌ\84ÛZ\94¯ÔW\8c
+^¥®Ð3ZýµC\95\e¸\17£fc\84\925p"ìæ\91\9a\8aOþëÜo>bE¾÷\96¿Pu¶\95&gMB¡R\1aµgîì\16ì\1dXAS%\92\99½×sï\vÃZ!\8b¸Gép\9eª\18>Aìz\87úU\8c;Ò.5\7f\15bcYE©NMÏ,¼ÈW\1f%CÂúì\9b³áà\93AÌ6\7f¯A\83V\8a7y$a\87R ³uÁ\ 2ðE\8dÂs\7fË-\14\8bâÜJ\80gE%ü¡ÇÉ~~w\13÷ù¹°L\9dÛ~{\7fØKÚøóÈüIí_'þ3öÔlÈ÷\11-\13Þ\89\8e¹·zT®\94(\1aCسÀ     ðs\e\19ü\1d{ñóC\820Q\f\93\92Ê'\11¥Õª3-IE\12=1ª[©W\9dáHu\ 2\ 3\1f¯¸-^⿨\8aÓ\9f(\84\19\8aÐÜ\8aT\16:oñ,¶\ 6Z¥ÿ^MÑV\99y£Ì`¯ÐêÞe\10 Ò\19\ e)Ûñ\83AuHDuÄlà\ e\r\14ìFoW\ 4âÞß'tc\18äx!\1eÂêØ\e£\86\98Ì\7f\ 6¸q©D¥\90\9c\90
+5\ ev\11÷©\96×ce%AL\13i³ªûZ¢-¯ç;X\r,g#Àg«\91\12\rÙï\13tÔ£Awô\ 4\98\91\12ÿ\96\v\9fu\ 4\ 44\13L\1eÁ9
+       \11Y\81º]\99q\86«\94\86دõ
+ÎâJ¡\87VbØ\b\96D§©þxAO¿åÑ\94I(aZÚw¥\0¤\91Ø\95߬â\93:­4í÷7N¥¨AB\85JðÑÔ¹Ê\9ae\ 5ò(b®v£V\8e½BftY¢\19ì©\92\96¤\98èÂ\94óÿw¶cëW\95~\8e¥\92¥­
+
+ïÀ¶e訹\1a\a\95íþ\95¢\89½¢,Mp\ 2a\19\9f\eÚ\82\0u¥etwMË42ë3\88\93\8b¾B\1c], \8d\ 4\1c¼Ãí½\ru\ 4ijlèÅ'1Çs&Ò©\14Än\ß\9e\8f5í£Úzc,ð/øG\88¹²Hºñ0$o\9dë®\ fï\10\9c\ 2uN-\ 2è\aÆ@lRø.£%Ö;)Ð7¿Ë\f­Õ×óoEßmÄÅð.~F\f\8c¾/úãÆño;®\9cÏï_yÿ¿Ùe%´ã6ô¾ãÙ¿0\9cÉÒ\90  \97A\1d\94\94¯4nçO±\8aô{\1aÿ~\93ýïÞë×&ûC
+0\0\ 6\9e\eºA°Ëÿ\991-äæQfF×\10O2·8?Ð\8a'\1fXÛ±K\8bLx¥»}r¡¨|*\0s\8fMv¾ý·\9e\ 1^\ 4_òQ\94¨Ç\9c\8bb}SÆ(©\ 1\ 3õÝ
+V}ËUÖÎ\19»Ê­Kûf\ 6,ÇúUJ\1fµö¹Æ»\19O´]¼Ýp\82mä(:\0}\9d\81³*\9f`MΨ2)ÀËsP^멪&Ð\91;Üв`b\88>ÝP¨¼\aÕÂOd`Í\f\9cw\94\9a\94\95«\8b´¨\9a\1f¹\ 5ló¢"%\9b2\9fèùIÇ\96\13¼´Op(°'%\86}\95öäþôn\7fJ´Á\97ÎÈ\94½OÌ\1dlðäpo)1*\1f?\99Ô,\ 6\98¯T*îß\17\90{Hh\8cl\87\1dêÖ\92õ\1d\12L-¬Ï\90©¥n\90
+²Oe\17æ\976+1%\82\93P/Ÿh#ÄÛ¦\92QQgôÂfdâvÀÜÂT\1e«²Iíµùòä?-½³Y\10¯º
+\\fý»x4¶ø"Ï\12ý1S\ 3\1d\85ìùø\£N<\ 1|\f\bZ\0\91ó#pß"óÈEGm¨\8e]wÆ®^\1fêõ¡±\aÎ|\15\10¯}U\r\81Ã*ö·\aÂÜÐN\12\83\91[\8cÔÇ-\14i1p÷ª\añPÁÄ1&º\98\88\96õ'z Bm3\9aYtÏ\9dL@\8e\9bµÒÍ\bô\16\a\83U|ù9¯3\ fuÛ$\1d   ð\98      ¶²îr\9fgà*q{¥Ë%á\8d\ f\ fóç§`|î\8azøR2á\7fîh_\ 42Sç<\92DÚ$åcçê\95Å\1dyy}üôµö\1cÙ\89ñ2\ 5\9döÏ\8cQ}¼·\89)Æ?sù\99\15O\vJZ'ÿ\16!QÅè\a\11\9e{\ 3í0\aâ\ fÞ[ú\1f\9f\ 5¬uù+s~\f\8dì\ f3&êP[Ðw*F\93Na\e\r3\8f\92òØa\b\ 5¾Ë\ fU\1c\82¿é­:\90\ e\1c%\0r\17Lб\9e«f0Üt \9fË\1f&D\15\98\16\98QD+Ò7.áû[Êw\ 5\¼ÁåßvK})Y\9c{>KSþ½.|~*ØÔã\91£Eç|\95å\88%\17\ 6¬]©M\8f\82\ eNveÄú\1c©\8dߪ|öª\89\9e~hÙ\fâõ©k3"\1e[WÙÓd¬\1f©¤:ÅîÍ~u`æ»Ê\83Õ¡;7­y®\ 3O&\86r\b\7f\9e)?åüâK)_zëÛ-Ðg\85^#ïÉ@ÅWн·\82
+<yûwu»\7fæ\92ÒÑ\87\14\r­\12\7fÖ`ä@®\84Pñ¸B-cîJºåü3\17\8e\9a\9d¥?\80ÓÂ\19¢G\8bSó¼"¬\#Ó?~|\9c]\18¤YN××eëߧK@wøÜÝ\ 2\r¥çw~¶\fª´¤\84ÁQßx¡\9d]\97ê´
+\9e\81"¯w\97auT\ 6{\ 4BÊ´(×YÇq\80\85­\ 1[\ 1Ë2x*â©Æèï{\10´\97ýîQ\ 6JV\83¸ý6ë.T&Ö¹mC    \18¼\1c[kßÄ;×ñ÷<±\96räÉóúzÐUÏ\9f\ 2øêfõj·#\1e\132\8a\v?:d\ e>ykר/\94§Ï\9bmÛ©Ì\12\1ao¿¯/\9f²g\94¦Í}V\ 3æ½àgTnÄ\1e0\97àçû\99\8dÜøó\ 4û)\a\9c7\87CÀ¼"hP9\15\13;³¸¯=¯õOã¥\9c×ÚÏã\88&Æqü\8d\1f/H\bµ¨\vëÍ6c\88¢É0ÓJ3!ÁÄO`õ\f(\90ãG\bºN       ÄÅÝa\10\8a\1e\9dÐ\10vP\1a¹UÉ\9fÚâ]%lÄ¿ç\97\83òqµ\åÉ¢¢\13©(\ 3Û{ò\1cÞÐ\94ºò-\97é\16âØ]\fSõgV\ 6\13\ 4!»r\8eüõC\97W>£»\ 3VcÛ=\92Á\1a»¯\15\85àüÉ×
+ÜÎZ\87^\80WûÜ|ÔÓ\8f\91²²÷Õ\90@çá%ÝyäXû\88ïçããl>éà\18ù\94²=\191!ûó»ù9iQÕÂr»×>W®'ÆE>\8f\vØ\92\a\eMìQ\94sßÛùw²ì\7f<\97ÁòÒpB\9b\15îè?«á\82ÇF/xRú!·êÉO»ãÚÕ\btøÄUY.Í\ 5@z\bGèÈ«¬ã;\9bé°\8eú,-ª\19]Øs\8bcQ£}?"»Ë«º\1cdIú£\94ñ×\16\88ÖD²"rºÞ\f]ÕÐzhÅ3`\89@/ô|\95\89Æ·ôX\1aÝ2ZÖ²:èÍ´èÔÞw\95Äá\15æf
\8b¢\1e
+_Üô¬æ\93ËÑ\1eæ,84½$~çnñ    \91¾óÛã\105³å3\10\v«\99$\8b\81çü4¬t!áe\1c\85½¦ãç¿×úå/oë§Lîü¾ûsëeÿt§åȨ\86}>ÍáÍ\87\84§ÌaÞ\81\98Â\9f<³AHw\185¨ÂS1ùg\r\92dâÎ1£\9c_²LkTS\95\11õ¸V)\10[¼=·UËÈËvÄ`_èâU\7fÊ\8c\13ÕùùÜ_\17¾§Ô{¬GªHC\a\ 49/4ê\9f\1a!Ffä\9eUH×ÝñÉ\85÷]\17*fïÈú\8cðk\18y®¯\vWîë\ 3C`°\8dÜX4%ì\ 3x\13C¬#\ fF\85s`\wûNÃ\ 2\1eκªÑÌ\88QÔR\ 4¦T\18Ô¥\ 4¬Ù\9fós¡±(\8f+L`*  3×>\1a\1c\81&À»Ø<:\a        kµ\¹ëÆ,®ú\1a·îCÏ;lçfã:Ö?cûíÿeàk:ü\94µ\93»¿\9fü\9ev~GΤ\9b²va$/(\9aÎÇ:æ\9e'\97Oújóotóú_-\9f\16A=ìbèEüs\ f\ 2\ 4Ã1¦\85Ü[\86W\88Á\9eG±vN/¼c\0\99÷Úãù¬9L\b:=R¥\bÔÚbjJø<\ eÌ\8f\18J϶\vÑéÈ|¸\12=\wa©\181\84âo\7f\b"\8a\19)ú1$ý9\0\92\95§.[ùÓJs}«Ë®\95»2z«\91¹2rÌ=\92ßbàô¹\10u$\ 6\ 1*ý^\83¶çx8\99ºW$E£\1evg\84ì\97JøGS\v\8e\f=ÅCý/¹\10\9fQOYß\8u\1f©\13û¥hCÌÔ\ 6ó\94\ 1 S!/ÒI\ f\9fæ\9a¹·}¡bR×ü¨²$çE¾÷ :©\ 5\87ÀÈüÒdQ\ 3Ò±VÓAç\87kÛFgÄß"ùñÛ_æÖ/¯¿Ìµÿëç¬Ír
+õ7®/®HOa\9d§\7f\1fõÈî\9a¼{7»\942d.Ýÿ\85¶Î\7fzmβ\ f\a²Ùëd³êú^\17ÏG·a\16MLjd\14îy¾çÅ\88æ\éfÏ\bÒÃeÌ\11E\88\83SM+uá\ 6,     \v®öeVÎ\98\87        \83\917V\8døÌ\1f\ f\82\8eÇ3ÏX\97=Å5spÔ {\9f#}fÄ5çHk\199Ú×\85ïôÙAbýßkP~¶æ½îóó\8eQ\10EÅS>Ú¬E#Àu\9b¼Í\19üó³i\87\8c\18¯0â:\9f\81¤>å\11÷[=e\9f   \83Ñxà]P©d$\9a\82Û\88Ô·sÖÆò\87ÁöË\9fÞaÿóÀÏ:\9f¶w/wOã¢ÖÀ\8cÂ\86fOÄð\8ehêlaö¬×­\10%ïûú·v\ 2ÿùEpGD]\1d»\92\akzá\9eªºyØ;¢ê5+ö8kÄ.\8eRs×\16æ\eiÎ(ç¸ò)á\ 4\1e\eQ\ 2\1cÁ¼\9e×wVLwm\98\f\ 6ýy+\1awGoí)¹E\11\ 3µiäº;E¡}v9b{\93[\9fÂ
+\18aNó\v\9f\rwp°]\19¬\ fq0*\fçªs$¿Ø"ó·ºO¥\99\ 1\16\9fÁ6D\10å´v×2à\99t\965õ~.÷\13\12IãIñóU\19¼êÁ¸-J×Ý\a÷=BT9\8b\bÃë\92EÀQfäÍûS§ïúNåËÁü¼³ªê\8eéÒ¶\99°ß\7f*-aGVä8ÛþÉ\85*\8cÐáþÌÚ\ 3¥ ùý\14ú9K\8e/\85 ®\1aáø,95\8e\90\8cµ¦3ùão\92ø\9aY\93©¥mØÏ^qè\87\88\90\ 5\92³\v_\8cö#¶ð±¾È\a{\10\1dwÈY\fé\85÷\ 2¨>vÜ!Vç\b¨$îç\90\e OÎ\85\0\81ú)y\9bÑ>rCO\f×Ô\16Z\9a¥µ§x¼\80\ 3g(®ñ\1c\8fU
+Èh¯Ñç\û\83Ôº`?DÑîû!MȾ®m"\8eÎXÈ\7fÝà#ú°eÈÜ\f\88Ö\aË##ù®G\95à\15P\93\12\14"²î\95G\15\ f\84ss\80\19\83²5}Ê3vê\ 5HsH1PÞÐúhü­Tå\1d\r«Ü¡»^åÝöµ\7fx»?g9´*\80øµptÿù\19\8fa\84åϳæAÜæ\1e\97ý\95¡Âä§\ 5ñ³\97\ 4ö\88D(\82Tz/ù\9a^¦j4ø\9b\1eUrCÍ\88\14ëÁJT=UU\fÄúP½ùHX \9e\8a\0\8aHf\ 6ôX\ 2¼Òçõ¹ÎÞ\1a\83\9ajXä\93íóÇ\1a\803Ff<\89Z°¿Ba®­\86\84Ê\97ê\95î\bn\82ܽ}\18Õ6\96\87×á\1fK^\11Å\9a¨T\=É\8e\8b\91Ç tæ\8cÄöo\9f§\95
+)y¨>¿§\1d×/\7f}Ì?gjê}y?¹\8f¯\99éïÊë\1dmÖË\14(ÍËT Æ§ïÓà\95ü\7fPüê³\b$ò0WmÕ\1d\9eè±Ù\99\12Ù§' \ 3\ 2ÜÕ\82\90áÁÐÆ°4\89R#\ 4Ðû<J\"Ì \86²ÉwuÈ®ÐD·Ë0õÖ»\85`z4c\8f¾\91ÿSïÅ_\94\e>\ fªaHóß[n\81Q%f`¯÷¸ýðÁ\11\12kp[\f\ 5ÂÊе%¦\1dí¹Ö
+E\86>\9a\e%\13¾ÒlÏÐÖ´¸¿T8\ e\85ðý±\11í?·^B\9f\85        çæ\8e/\85ñÛh\ 3\13«\98-¶%+¤mu\8dù\84\9dÅo\9fw62\1a\83Ì\16\eñè\fØû¨¡Uïg}÷½\ 1\95ú"{]\e\eZ\86B\1dúˬø9ë\88¯\15ï7\vIóÏÏxl\ 5´g\1c5\81¬Âò¬Vt=¨³ß\99>\9a\ 4üìöûJÛMÚ8¬èè\10Ã$a%1*Ð\99!­n_(\12÷»h²\93\r\84![k¿Õµö\ 3×S\ 4Á\133SN^\84cï¨\1aßÕÃ}¾3bqtd0ÒÃþ­§\90\eá\129äÂpè,¶\1f£Ç¾\16E¥ßk4BTÏ\86ê1t\81\8bô\9b\9d{²}ÝÒ\19B{tßÌ©\ fñS\9dÆ\92¹í¹V\ 5\12\9f\9e6åü¶ç\9eû\11T6\99_Üò¹a;e=\11\90LK\1eè5®Ï¥YNëùH@³­ÝO½"1ã\7f~i?e¢û­®4ïí\83/ñ¹È\9bZ\8f\86âyð\ 1\9b\7fÿÊE°ù\94×Ï\ fïû¡fBØ»\ 3\7f\9f\7fîQ\eÚ\ e+\8aï\98°#ÇâÓK\87w8ë\19+\112\1a\9f\92(3(áÀfèµ?X#ñ\99É7W°Ìð{ʶ\f+7êÐ|êÚiÉ\91±'\fã\16)ê\<k*2\1c\9dä®\12\92Çȹ«¦ëlCFñ©Â&Ã]\ 2\884Ʊ¯\8e®\10\13al&\8cî±jÝ\97ï\98ö\8aýÙ\1e»3¦^oýÉóÊØÝ?\1a\86|ûtxè\v\7j¯Ó\1eù\11\ 5\11\b\9cc>ÝýÜr\82;,\85Ú\awG?d$½ÏX|ø\18ãk¾íÇÞÎ}9\86ä\19\86®õìWáñâØ=ϯ«\8fV÷I¹ã÷¯yÐóCCvvÂÈ­ñ\81ø¸\9cXw«\87ä/ß¿(MF\1es\ 4o\1d«_Ù?Ó(21¾´cÜ_\17÷=|ÈXó»Û¬\19·À$çsѪqnÝ_³0J\83\ eÃ#ß¿Hêo\86\85\fg¬èï\91Ûúë\9aú)\eQ¾víßr~\84\90\9c\eÑ>á\86Ü\93\\16³\9ey\9a,¾ÅGp\18\7féùù\18\9b\13¬Áó\14]òLbuJiïéïÇ\95\9e¡&Á\92¡h«Ë\85\97`ú||Å\194Zr\10\7fÔèú|\8d}©ó:dÀdÈÙÏPð\9b`\1c\9e\8d\87»\8c¡Ç\9f®M\ÉP\13»¥nhÑ1ßË¥(k
+ôÍÜ´
+w\8c$T\0¦  \18C\ 4Ñ\92Cw4Í`^ $Þ8ò9t^\85¸\88îó¹¡\eO:BßêZñ(\8eºy:ÔëGظÉ\90\8a\99ó      ±üsmÑW}\8e¿ï\9f¡ *x\8bÌ7\1fÁîþk\10ÈÓëEi\95ç¹\9f\9eÌæ@5\\9e¼\f\vI!8gDûI¹¬`\ e÷«¼öïM\ 5ÈY ñÆ{V\17\88¹redÌõu©ð7\9f©ØU&Úg
+´[\89\87\8c¾\9eM\18Ëè¬Éw\96l³£\98\84f²¹!04ë\15Ew!³yϾ¹½\15\1dím\8f®ýÁY3H!¸¿¬\84\9f\13ÊäGÔ38vîëÚê5Mß󠦩}\13\9f©alfUf\10\ 6\81?{ï@\ 3X\19Ã~~Àóîn=q\0,9WÎ{Häk\86ƽOÜ\19á\bUü|÷\ 1õ\8dú\8b\11%\19{³<\7fíû\1cL\r³\9fÑ\9cÚ\97æ%3ºî:­\13Üw\98\1e:¢¬\8b\92BM\10G¯^£«ÎäìÌ}ksgÈ#µÅ\0`_\9bÓPY\8c\9c½¨·*C¹åÇÛ\16Å\96òÉò@>#v\Ý\1eÏã^?#Ù¾\8f¹FzÛë\9aÁÓ\90ã\fn#C-²Ë%I\9b7t\õ<??\97ѳ×èXû\83óó*÷\9fûÃÛý9\v\82¯\95'Ê×ò\0jE\1cW\85\12¸\84\8e\1d\8dÙ^e(uaߤ4X\9eè¹þFé\8bÿ\ 5\aJàFÈúÚ\89ü3\83\12ø#Z\80\7fºD\1eÕLï\1e+te   6÷\05\85\ 3\9ce\7fØ=D6ùÄ\11µe¤1ÝϾÐJ¼â\b£®³¾Î\7f9\8a\9fôÿ°÷®íq\14W×ðû9×Å\7f\98Ü\ 4°c,wUwõ\ 1\fX\a\e\f&vlcÎ1#il\ f\1eÍ(3#À÷\87ç·¿½ÖÞU]Õ3:Ø\11ÄæVH\88´U]]]\87]û¸vS3\8d%\17xµm\19fãá$X#Là\ej\85\15A£"¨-A¬ÔÌObá\89¦Ðfú\9c\ e       \96'ESïXµÒ\7f\ 6×\1c\14.\1fÆÎ\8a\ eÈ\7fbêm\15ÁÎ\81X)\8a\ 6uT©\ f\i\a>\ 3\8b\81%\95\95r9ú\a3\ 5\1a±F_Ø\81\91èÐY\ fK@\f\9að £ ÁÊ\9b\9aòÅ \18R¬&\8e13\9c+¯ñR+Ûá\8fÉi²RáYòæ\82PJ\ 4\rÍ3\13Ó\16(òõHͱ21¢\1cW
+ÐøG\9f\9f\Ó.©\9cËé\97ÝW\8a\81¢\914B\ 4Ý\19±½p\ 3¡
+\9aüJ@{®\99èEì)ç·á:°\9aXC÷PU*\1c\bÐ\v\11¥ÀçJ       +d\1a\8f\11H\87¢Ò\84\9c\86µÐù\1cÑ.5«\7fO\9f3\ 4J2\8a\9e\89<\17ê.ÌÄ"®a©Q\86¤hÍ<ø~é±\ 3Ûæ²9±Ö2fÂ)pK¦\19]>ï¡¢Æ[ʨ\9cBÃH«ÌgøåjL\85Õ) \99 §£\94o\16ñ\9d\14Í\1dbU&R\1a¥Ð"µ§\ f6\95N(óKØ\7f0¤è\v\93ÕûC®\f\ eCípHWÐÝ^H]IÉE*eZEÝÇ\ 4Y£ëO!\1fsXþñ\12TNì¸Z2©\19õFS\90-\14¹\v)âܨ  ü\b]T"À@¨2\9a\ 6ì¼\1a\r\88eJ?\88ñ"¢\19\80ñ\19û\ e\12\95 Rx3 `Î\1a\13\1e\15|\18Pµ¶B!H÷Ä]/\88ó\85\17¸Z\9e\r"\85Ps§T§Ï
+öOáK¤\90
+\92\14\\8dßæ{4Y¥\r³F¿B`:\bÜ_e\8a\99ï 
+\84^Qª¥\16$*Ò\92\9c^)æ¿\98Ñ
+\17"C\84\987:ÉÄ\8fÃj°°\93_\r] ¬ö$5¾\90\8eª¤²\y6^Ü?Æ&\81×\12u\8a\1f\16\92$8§\142è=\13ѶPô6ÌiîK&\88N\86ÅP\98´?6\vÏ   \8b$¬F­ðÊ,¼h\8c\10\ 5\1eÐIù\ 6P\14ËÏI\11.Pl\0Ð+E[\ 41\93¤&FZ2\8a\7f@É¥oº\12ýstõ\ 2ø¯¦mÔ\94"\7f²|¬ÕçJ\94\7fb n^\86\a   M\ 1,@\ 1ì4\0_°Rg\94Ù\ 5\ 6\90ب4Æ\98^?ÐJjM\81V\94>\97®¢!Õøâ$$ %\ e\14ÅzS¨-¦\12\16\1e\14\rÉ\b\8eÆ@\87\85\1a³\90\9c\ 4¿PÃ\11\8d\v£'\b\8a±R½U¦\vÒ\f\9bÉ\83N*Ç2\ fÒ×ðc\15¢\9c\ f*\82.\11Ö-\1f\94ÒEÀNÑAÕ\99é\9ecÎ"Ã`\ví\9e\ 1V\98U\82\93°\rJxqa³¢{\10F\f\10µ\8e\16R\ 6²\öH¥oL¶Ò\1f£ÀÈ8j\19Yáã\8e¸a\11Ûb¼\14ÆÉ®u\86JZf°        \0\86\80åuyó\87'\95\17¨ÙÉzÅ\ 4\veR¹Óº¹ \11+ÛÉ1a±×\ ¤KØ\byÔ´RD£\báF\11*\0\1eɬk\16¡ÄõÐ\94\12'\88mR(R\b\81½\eÖ\92\96J.\8d\e'&\19\10\1a  ekÕ\119ªM%ðÛ\fDgêy¥\a¼ÐØ\9f¦\12xLD|y\18èÆ\aïå\82 Ôø\83åËÛ6þ<æâ0ØÓW±úµÒH(\84'TÄP\ 1ÁJ\18_åÁ¾\9bR0ö\18\90ç\ 4\8d\9b\95tqÇåy\a¬É@B\8dºjJ1¡3\96\91R\9e\13Ü?Vó%ä9\vuçRð·lü´3ê\1fó\95\13\8cÓ\1f/§às¨ø\84$\109\8c:\17\85`\0\80Éâ\ eh
+Ö-ãâÑ:AXp\9c\86äþ¡\12\1a\14h\14\fØ\b»YË*\93\0\8c"\10\1aÁ)\16\9aì\15©ÂÌ-g¬l¯Ì\13¢=ø\87\9cY\ e+\97¡:¹s@u\12(e|T\10VÎJåq¢íq×\18aBô ýÑw¥«\ 5Å\10\89ÅpXK)\ 2\9ar\84\87çLF¦½:#ë\91\8aZ@K§\e\9a·\86·FUµ\0Ù\82A\e)xj\ 4Å\ 1<KÌS(\9dZI¸)\81\96\82\97ÙfÊ\8béÈ&0\1c       \8c\16eýVj F1zø\\83Ð\11Ë=-Ð騱\ 6 \95l\83!Q\99¸\16\80ÄU\85\92v¾ö2<\f¾à\f\ e6p½
+­3¸U\16{òÑ[\b\1eÄÖ\aà¬Í´Z
+A\ 6sBûhøI¨Õj|ÀU\ 1µ\ f\15D\e\9f}QäRÊ\82åê¥ú3v\90\96
+\86Ò(\ f:\89ÈqÎç\83¡\19Ü\94¥\16ko)V\128\804â|\15\11¢Lé\83\16m®ÅÐ\0L"uñ0T×2Ë*ï\9ch\f<Bh¨\84é2\8c\ 5æSÁ\8c\90\b\11S\12\ 6\84Ø\8eò`.\9e\8aªòõËs+ðnUãó\a\ 5\12\bÂ\ 3}V\ 3ÊÁ U\12DZ\88\18·\89û½jÔ\94@
+SÂ2\ 11ßÓå <_kh\8e\964o·QmTqÀ\e©«\82\96d®U§\ 1Ë[[\1d©E½A\ 1óõµl0ö:\93Â/ò V\96\ 2\11\91\98\13%ÒbUÁ\fïtz(&WµÚU-\81´\81KQI9C?Ó\19\84ûÊ\97\8b\9fB@>¨SIø\15\12.ªB¬Êò`#õªY¢^*Å\eñõ\96\8d\8fHgm²\92(I¡v\86\15x+\82\f\18ê<Ø_Ì\1eÀn"\9e\86ì8T§®E\f\93\aÁ¶\ 1\9eå$õY(\b\vq
+vÄ\ak\ 4Õ´û·ÊBQ{'7\14\8a¯\11X\e\ 3c(\r\92O\v   ujÄ\ 2Â\8aJ¥¯\1a¤ÈD¶\96\84\1eYI\18f ´J\1a\bêì\ 1îÎ\bt\9b\1cQ#B³A:/\83º(ø[^3äpLé£=\1eÁÙNQ\8a,\fé\99\88\91\12f\fÞ"×\11\0\82cÔ'\98\92\86à   ëB\19ö
+X\ 1\8c1$¸;\ 5i\8c\ 1#H\1dC\92\ 6Î\94÷RÕ(3Ñ\92J\89\110\95¦jÃ\93VH9H'\96Køf\8c\a\19\84§Æ±ú{)E\vÁ®%êÞ\97ë#Wç-®0\85|ÐURÔ\ 1\ 5}]®\12;8¾0c¼\ 4(x\80\88\18\95\84\19\80\r\9bÉÌ\0\90û!ce£\95\94;÷µ()pÆ:\ 1%Rð~çj\10N\ 1-\8d\91\14A\1f\8c¤ÆpxJ\v©É\v4]ÇyÖ\14Ǽ\12Ó>ØP\99\12\12ª'ÁÚ\83ÛÄ\92©"4\16±,¥\ få#\1fÄ£u\16\9cQ¯{\19\88ÿÎ\9auBT¾¶¶\ 3nlB,0\1cà@\84o\16;\ 2`\81\8fÖN\7f1`     \ 4AqÍÄX\96kUZQJ5Ê\95Dªç´½å
+}@dz\91@9ðÍB\1d\8d\16Á\81\ 5\a¨\vIþi\bÊÌ\88õpõbßQ&@}0\86I\89è×ÊMΪ\82\82:6,-æ\0¶ê\ 3\95À»\ 1È#õ\87     \ e\ 5\14«L¼¢-\ 5\86\10Z\8d·\ e@8\0'«3\89ª \ 1V·:×\82P\86ØbH?¯$[Q\9e+E\95\87ÝUæ³½\11éOAå\vá]tÓ4\83\ e=³¤¹¿i¼?\13Àâ\ 2¬b|D\17±\80Àú3J×Ê.Kú\9eAõ%¢È\1d\11ùH?.}\9dí\0\81t+H1Ä\13\94yÍT¾dÄ\e\98;#ësÅ\1d\91\ 2<E.\18ÜÜ\1aE©æ\8c\18\r'álV\83Z
\86\8b\81\ 4Ȳ\vðãÉ&¨\bÈ\ 3¢\91j̹OUÊ2E\167¨Ï\0·t{½5\85\ 6\8d\83ÈÈþ¦Ö¢v&×l3Ô\88\11è¤\ÍV¨.U¨ÇÂ\88\8cg0Á\1aYÃÒ"­4\86ºT¶Ò®\88\0{%Ó\b\97<\97lN\8c\8cø\9b$ÑÌÎBWr\95b\14(\a(µ¯2-á\ 1á â\87fZÊ\r\9fΨt|»øu0G\15\8e\10¦Í\97\ 5\94\10\17ÂñXÙè\12\94\83\93Éè4)¥\81Ú»(J/A\81¾d\14Ó\1e\9c\14\99\80\g¢U\b"\8f\14Ó.\ 4\9d\99¤Pn
+w(\ 2Å\ 5<\88\a\e¡ÔÔSá\84®d\1f²Ü'\a\92\85\8aQ\958\85ðe-\ 3â\11ɤØk;¡¥a\9c\ 2Ë\12ঠL«>\89EFæZ­Ç\8aE¾é§à¶¯\88\9d\8fsÆ,_¯ÀQ?Åq\14\90çª\96úy8±ÄË\ 6\85âMU\8a\93È\1f\983ªGºÏ%@´e\114Uò0\12\v\fõ6C%¸RKP:£\17U«ÝʼàÈÐ\è\88zF!²ñõ\94±\18,      Y\0\99^øb\ 3#\bùpE³\12¶"ÝLíæÈCõ.ë$\ fTйjÁ\14ÉYoG\ 1Â2\18\81Xܤô\85P ³\ 2nÆÉ.¤E¦\15\rs§Þ\88Zk\0à\ 4VZżÖ`0¼]RÝ\1a       ógÙ\15\8d=&"6Ql¬X\88ð\14°i\90=a¬tM\e\97ÚH v|Ý\9c"j\15oеM°\94ßWÔÂäY@\0U0²\axh@£ ¹:/$P\ 6\8c§\91}Q\15¼¨Pø\13
+\ 5 \86]å+Nâ\1ab±qç4;ÅÀ\a\94Z°çäNÅ.Ṷ6Tër¸\0\ 6¬²#åöX¡\eÆ\12\b¼8uIGÞIÉðd\19íÿðbw2Z±FFC\94TAy\99\14Ò\f}\9eÔyÕÆÔn\82B\8a\96£\0«NXÂTI}\81Ú©´U0j\eÄZ#\17\11\85C\x(\83,SHà`      }bФHwZÞ\8b\ 5³h\1fCn¡\95\82RRi\ 6\ 6/«^À:÷·Ö\ 6KÌ»Lca\98\10\ fï:\14òJ$\ 2\84\1e\ e?P®u\14 \92\ 4¿¾JdH"õj-I\8c©m\92K\0\847\1f      vP%a\ 3­\14(õº´\9a\11Á\83\85¿ªm     ñ\98\fÚ¡\19NË Ö>\\0N.)O
+<sV&¨E\13EÖVÎ\9c\18\8b©×¤(V\ e\103\1d2_k\96ÿ­YR
\9e\19<J\95T,C\ 2\9a\8azÀtñ\88õ\0\véXéW\1c¸6×ÐÕöÌɺXØ@°R¬Æ¡Q§ÖC8¡T/+\ fÓ³,hu\92õ\86ç\18}[è\10ô9   W'L:1"´ 0(\12\bms\8d© \v9\v#\95\k\94µ·,1\0o$ËýJÝ\81
+)E,Sï|y\ 2_ͨÈÕp\ e
+!c`õ¡«ÌZ1z\80â\9aÒ\eÌ´Ès¡\ e;¼LâÂ
+$\9c\8aR(\0×,c¯Ñä\1c%\ 3E
+\153ø1Ì(l)\8d\11ã\95o\93K\8e\91>ȼx\16\84B\rÅæ\a×Nç\85èñ®+]\83écv4§\8f\89¹\85 ÍÉ\14\e¡\18\16ÉäJxÃ\91\87Üâ\82É\ 2JLM¼¤b«e\85\98nË´wµã\89Êdæ\8b\82e\88¡w\11U"#:ÎUbÃûBtµ\16·)­\16ÿ2¥\ ¨-Ì\18\19ãmy@;       !î°¶i\1c®\9c\83\16\12\14f\8cÖê\88Î¥ÏÆJÏ¥ó\a³¦í\8e\b}\8d\10¤\b\94\1eå\8bè2¬%\9d°(½h©"8¹\b+ÞòD;Ùÿ5k\ e±\1c³\13`ø¬     >W Ç;V¯\17Üq)Ô\96K¥8Vܨ     G\86Úoô­á1îûR"+­d y\8c$\94#¢£\ 11®NJ|\14\9a\83\96\11F#\93R-\ 4\1dÂö\15v[
+\92\v\1cG¬b\ 4¾m\ 5\98\1a°gFK|\14y»EY<\81ÉÔ
+JÉ\89e2c!˸\87§tà03\12\r©ý?¿mÈL\vb,\e½J¤\fËÊõ\12\82ôÖÈ \8cBÍe°,é¨2\b\81¦\98Äíkí:-ê\r\89\98)¿¬kU\88,º-OA\rÖ\94UYa\96KÉ¥\9c\10C=qÈ3\1e°\Ò\91¼\fÑ]\99å\9a+\93Éè\8dâÆÓ\a\8dàN§\88ëHïd)3b\b\97Z\13\18û\ 29f¬}«^\93\9c\ 1ÊÅ\80Ù\12dÁ­Z\ 4ý\118ðN6KÅ7A\89iT/hPÂÐÒ8^(h2ª\9b\940Ñkî\bb[\81Âƪ]º\9fé\17¯\9d¤¦òpXzgQª:\17 ]hý­:c5Á¢\91ºg5ºW[p\8d\90®\9c*\ f\8blc\80d{Ð\81¸9`Õ\86\ 2¦\81\b-\80\ f\ 1n\f+[\99;¿ª%Ú     v\11¦\9cC£Rø=Æ\f"䳪Õ\91\ fq£=×°\ 5C\9dDD(&\14\8e5\89\Å7ÂX×jo´0ÝÁîËy\1caK\81Q\10¨%¸%ù{»\85\1dS#,½\ f\95\1c\ eT\19@zcÅ\8a\1dÕ\0ö\8cB@À\196\0/¦ú&\1a)\ 3\81H\15Ä4\12³¦\1e\80\96\ 6è T¸\8fª\96ãÎ\arâä¡Ð2.\12G\8b\85ÁïLÂÂ"Á¥\83Oo\ 4KÑi1\9dJÍR\8e\16 ö\9a£\94\10\90æ\82Ù)\e9xU\99Y~:\17\ 2S\ 1\ 1\ 4\9f\8eïÊ\95    `¶ôε̧Ç\84b\7fÝ\81\1cXÑ \82\18bQè\17ÇÈ\11-\ 2ó(½\83¢\v«LF/\ 4?GÎ\1djs!D¬j47Ü©3\a)2VÁF\81/\9cÑ\81ä\8c!\ «rÃ\15@07¤jÐÏ%¶,e¶\ 6\9f\88\1a×ı\82í\17¡Î\80\edíg"ö\19\9e\ 5ÚbüY(å,8\ 4\ 2J\ e\95ä
+Ô¹&­\13V\rà\86Àó\108qÁ\aÆ\84\a\859ã ¢}\8f\ 1
+¨ßWÒkH¯ÃUqÁÒ\1dU6\1a^\8d:K0.Á\1c@9\8d¼\12\ 5/*Ñ¿®JQ;ñZújô\0\94%p&Kbר&ä\18o       Ë\b6\ 6vr¦ Ü¶Ô\9dlÈúIj7ù\ 4¤\82á\e\84ê\86½\ 1.\96\9an/Ö\92u\b³Îë\0¢Í\9dçÄ]Úv\87`\ 2\U°\83±îc;×=f¸}\ 2{w¬ó*ØÞ\1d\14\85\18\f\82H\84\VÈ\85\98WFj\12Þ©&:'=_Âß\e:&\r]¡b~a`670v\8e\7f\e\ e@\95\17gäíÄ"/¤\b(ÕÖ\ 32\16q¡£\16\19\9cUD\0±\92\18gH\990\9d"\ 3\85ù9Û<<ô\ 3⢧]\19\0ýÔ_ò\82 #pX\b\8c(,*Z\96\16UÁ¤T\16ð\15\0\8b\ e\14R:\97`\1c)*\1c\aµN/¥\13>\97\ 34̲>.Ëéf\8c\ 2\ 1¿Í\e       \98¡\ 5¼ È\92I\80\97È\10\8døJ\91õ\ 6Þ\92\91+AVFj\\83\17\1a\ 30\b\82Qó¹ö\fóú\87\97½ä\vÛÓ\989\91¢\99Ü\86@e\9a°(l\eA\b\86]P,ñ\90\99!\0\9cÆô¡\19òzQ¡I\ 2Ô \90\8bMA\8a\ 1f"Y\13N #'S!\9d\ 6\7f¸¤%\95\e\12²Ç\82>\1c\ 4JßØ\92\1f¨z\ 2ª·U¸¯á\1cg\g&¡XÛ2P©ÆÆ  l¯\87®V\19&\19êAÆÜd\ 4J`-\14p\b\98\16R?\19\81bSé¢\12Ê\92xy\8e+Ïße¿ä9U`\88A\ 3\ 6     B}\80ó\17\ 6\17\ 4ñI)f8°s¹ñ*­BlE:\85È\93i\96R\8eK\bÁ\11\8eµ\87É»\9dð\85Jª    ·4¢a:\86$9)\90\97ãwÅ\93BA¾F\14\16§uO Æ\ 3P\10¢
\e\b5(aýÙÐm\84\83£µ\9d\89á¯\15uéú\80Ò);>\13£8\ 4Mb7\90P¨ Ù;\82'\89\8cþ\94sìÐ\ 3\ fÄ\86\82\1a!FRÑ\1a\88¸\19\9dßVÖ¤ \88ÆÂz²Ë©Q­2\b·Ö§U\vx\1d¬Ë<T\87a\ 26\10^\rCòr)!\ 6\ 2®zÆ\9c!ô·¨$?\94\92\-iÍ\85biÀ\8eÝnp¢Î²ä\81¦\8a\e\bS#·N-Ùs-Q\90U\rM\1c\0`¥lX\89õ¶\ 4\92­ÃQñim\96÷dËå\vµW´×\8e¨C°;\vä\16\8c2Xß2ë"\0Ä\aÒr\92Òh.\92\81\99¦P\1f\97æ\86"\ 2\81\97\84\1aJrM\v\ 6\82gU«·ÆÂ\14\f?«@%àD\16ð¼*\ 2fðó@Ü\a\14'-\1f pÛ\94\1eä\1cö@æ@ üná'\ 6Vp$ðBÆv\8cGF\9d\92³N(\13ï\10Ö\ 1\fc }\97^:\ 6±A½\86Zp,&Jd8\ 6sb©b\14,(ÃX\12cèH! lÅÞ\18U³§öwj)(4,\85ó@AÁªÚk°E)\ 6yÜùZ®\124\ 2û\10\81\94«\83\82opª\11I´V×%-Û\98\88¢ÐÊ\17ô[\96|°¢      \9e\14|\8e¢Í+ÁPÆ 0(Ï\ 17Ûqº|Ê«z\f1]\95XÓr1­s\9e\83§Èjí\10ôÆmJþk8t[k:w\ 1ë]©>]ïa"\18\vË\91e>¿¹ÉX\10\8c%@d#±
+\89\8bj¨ä¥\98\92K\98¨Ä\b]H0!\90\96X3ÁøÜÏR\81\dÇW¢¾:\84\ fÑ\e&I\r-c\84\15\9e4\ 2·é\8cÔb\17ɲ\90àîö\8c1L\91\15ßy¹ñØS£\83s\12\97!V×9\9f)kh\15#F\1aó\85jÁtÅêf\952\ 2\ 4Í\17N"¸È\b´Ò\f1ÓèDÉD¦)\9c\1a\eÈt\8c`\e\97\8aÛ     \1dTÇ*\88L4Àï\ÿ\82u1\94Ð4\1cL{+\8a[\12\0-\88h\85\v\89\88D\80íÉ\ 4,\9a\15þv\92D§ã"ºX¥Ì\10¢Y%y\ e \8aë\ f<«Î9\r"ä"\1c»bà\94\91¸WµüÃ\12\aA4\97\e\97KȲ\14®òNß\A\1f\85QG\9fÌ\ 5\vT\8a\94\97Ân<\1fat\13O\ 1\ 6[Öòeg\93\béàp\98+88ZAT"A].Õ«
+çÝó®Ð0¯Òû\1e\1d*dØZ¦RÍi\ 6v\àÐa?\95ª\8aÃHÖrî\ 1\9d¦\10\11M)ijΨ\85\18ÎN®6\~ÞJÅRpí\9e§»\84aïLBÅö.6h¿\81÷Qô\ 3\17åQÀ¿Éç´âjKi¤.7ì]\84H0u&Ø\8f¾~ü¶\ fÌ­¢{\97\84\ 6Éz(\87\9dÓò]\83W[º}\1ao³D¸\ ea(\9cÓt:Prh\9bNó«$¤\a\95\9bH±>ú\15¶M¡\89«\9dHò9\87 ²\19(\14\v\11"\14j'8\15N\ 3áI¡¦ã<NHK`L\19¾¥ÑÃA"®\15Fóq\9b¢'À69-6È÷A     &Åh\9e:F\ 5s\ fz§k\92\ 3\87\ 5\15#\17\87xü}\85ÏL\89§A\80`8UÒ*\97\92\15ë4ûÚ/\ 4q\1c8z]\b2\b\10
+AÕʤø\ 2gJ\ 3$¹Îà\r\ e\8d÷uWò ¥±\99[\ 6ѦNÕ4y0\97 \12§¢\07\9f\18Hr\7f·²r|{Ü\9dF_ÊvwRp\8c\81\1f\94\1d|    -Ú¡\19\91Sf\82·C8|_A
+<\e\86\96Bs]xP\1c\ 1{\8c\1cE§a&Ì++
+)!Ê\93\19·\99Âfñ\fÓ±\ 2¢\0 9ÍßAè§l     P ?\14\85$ßìé\83ÌBÃmIG\ 6\9b9     P\96Ä\84\15\ 6q"ËäPh\9a-¤â\9c\1a9K+a\ 4Eã/\18dn#z×\95\ 1\90\17LéÎÊÁ\10ÏÆx`Ôø®\ 2\90"\8c\8aíTØÚ\17ÆÈ\ 1\ fÐ\1e\e\86\ f\13h\1fṦ½ªQL;óu\10p\1dÃð\ 1Y1ÄKC\9dÉ­Ö\97\ 1à\1d\ 1·è¤Us\rÂYi
+Ë]ð\18\83        x\80\88×e\f+z¬|-\81ÂJJ
+z­¥\19\9d\12\bô*µ§BPs\19ô\10\82ËKDK3<Â\b
+(¹p°YÝU\%\8dØ?\8b\19y\10\ 1
+fÀ\8a\94VuÑ~¿3êTC\18!Ý/.\97/åsð¤ \81\ 4g®å\86w\94VÃsæ`P4y ¢ª;n5\851uFðV\19\ eC\v>=\r­4Ï\bRåÀ|CÖþ\19ñiô\ 6\80\80\10u\aÏ¡Ñç\1a\8cÈÕâ\97§»É©j\ 1\839\9dF\8e±Á$\88\ e  J\ 5S\ezòyÉ ò\10¹Zu\ 6R\f®¦ZJ\f\90\ 2\84\18'÷¬\7f\8cÞ;Ò\88\88\rD\ 2ÝÀ$ º  \14h\9fþ9FàF³`\ 4ù\ 33%\88Æ\9c)K\86ß% à£á£¥Û·ìf¹\15\12¹F\98,OË\ 1\18\86¨\1aÃL\ 5\94¯\ 2@\ fJzñàaµ¥\ 4\85\86\9eP\90D\84\ fÖ²) ÿB\89µzá3ÒÛ\82\19Asõ\18ÏØ\9ap5IÔU¡»\17\11\88¨4ö\9b\81\10@\99´!(ÝHH`N3µ\95óBÜ\12Ä`°T³Í\15Â\86F\ 1ç\ f\9aZc\ 1Ý\81K_0)\11@\96g\8a^\10\905\81ñ\\87øy'.\[\8b\18!\11ûÐæ­GE\ 5Û`¼\1cR=\8aÚ¿\11æ\8a¶_[ú\82\ 5D]iåp4\13löÜH\1a\ 5ª8ã\0\9a\9f\rÅD\98\83\80® \90Zÿ \v³\83'dex0ai'\19  d|\10ýð\1a\13äT|\1d3J¬F\8es¢Xh\9e`5\85ò(T¿bÖJååT¦\96 ü\ e^=bEa\99ÉÃ\0:dÈ\15)\1aâ¢0\92\1fÕt\13¨\ 4²úä%%µõÜ\9f(\ e\97Ñêk%ÕJ¾í\1c\1a?_Çö\19b`6o\9büÞp¹\1cͧ7§ÃÝÉèÓ£ñþÈ\87\9d\18\rµ\89[ýv8\9b/\1f¾8\1cõÃiÚFîÞø·ÑäÞhþd´·|ðâ`w6\91^\9f\8f^ø.\ 5l\ 3§\166%¸\83ê\|E\88\15D\9c\a\96\9d13_\ eÛ¯ý\rO%Ch\1eLÆ{£\a{ÃI;\15\9fÎÇû_\84ÞÝê\80ï\8f\9e\8e\17Ë9§)\1av\7fªÞi\1fÉ\1eß\9cîË°\85P<Þj\9f\9ezÒ¥öe\a£Ëoe\83MlÎo~åíü÷#¬æN|Mg\ 3ïhÛ¼Ào\9f·?ýÜÒ~\1d\14\83/\aßÿ\98\röß2\83oî¿ÅT?\89\90\87*\816 9IÊzµ\92\93Ç\1c\18³åéÓë?¸½®79K­Ö¦x\ 3NA\8f\ 5\82ª\94P,2ôL\15a"h#\82Dbw\0R\88`IǪ`!R\90\88Ó\bÕa¤
+z¢\97\ 1W°Dàö_(\82\14¾\83y\àãF w¯BT/EJ\15\8e\86\f%h¶N\8b¡]­­ÀÜà\186j\83 JlÀQ\ 5\83\16\ 2EN½\8bß´ò¦=\19\0D6
+\97\10F3+¨¢A\16\80¹\8eè\8a\ eV       \88ÂÐã(\19Qmh4@ÉW«A³\8cænx¯!\85;M±!$\ 3\a²òF\9d\8a<\84÷  \87\8cëä-\vË\14!©j5±ð
+\10\1f\80dý@Æ3\1e¤³Ñâí¹F~â9\89ýå\9dC\ep-\19é\8c_0ªÐ\15\9eÑÀ-È\f\89{½ð\81\12°å3c\11×X&N\ 3\ 6s\89ç\ 4Ù\9d¹X_åE\88t`åÎ\95O\94O\87I3Ï¥!Q\ 6\11¨F¸b±B\17p;\9bBõ([\8bO\10\ 4\ 6°Z,\e\96vM\12Æ\vhe@j\ 17       v°ò*\1dA.¹ÄW-kYð< \90\8cF>\ 4VÁ^Ïdû\86n="Ä"S\94\99\94\8e#¤ \b\1a#g\90E\rmD\8a\ 4³gD´2u:}\95\8cÀÑÞZÐÈ\ 5Ãë\ 1\9cÉ\16µM\10\b\86\8c*ì7Ü\18HRC\94\95\ f©\90¼§JÂ?,í'\90ü`\1f)\ 4F»ý\95)5ýwè·gµ\88ê\N'Ì\80øqÌ\85@\0\85ÕØ|\86¥c¥éb\84E¬¤\9c\b\9fI%°<°o    ò\bÐLkú\8a%\87\9a>     \9a<\99ÍÃè£Z\92h\81F^H±A\18\9f]¡9\8a¦\91ê\ f0\923\17ÈC@À\97à\13×\91ë\ 6\13\eU\ 1B ¨¢Q\vT\85ØÜÚ§ph¤l9#±ZÉÃé\86\80G\1e,\v!Od~N*s´\ f\ 1\83\80è\ f0ýCR-érh\ 5\ 2¸ÕÛ1@ bh$\f?\92³\ 6£ 9f\rO\ etb5Ý\99Z
+\9b±\10b.QW¹&º5Dá\92à6\9aÅ\89+ÉíjX¢\8dµç¤\96\bBt¬8}2\ 1µ@\9e\14*\7f (\8da\1e\bB\ 4Ú$3÷èÄ\ 4\8e@®Ò+ðó¥\8e\ 3Ò\84)s"9\9dÐD\ 6¡\ 4x\ f\91_x\15@q¬ôAc\ 5Û\8fX:Ð\ 5|\89\93\9c\85\81$J\16â\98s\12h\ f¦!¾(Ø \91zB³\84\9cè\8ce\1e\93Ï+\ 4Æ\9e\8c\ 5æ-\12\9d®xA½\8cµ¹P¤\12\\16µß¥\9a\96 \86«\13\9a\8b\80\80\18kt1$ñQ"ë·5À­jdB¥J\9c©ääco4\99Ì\98ð\ 6æaz/\frD\8c\95\15Íe©©~á¼Ð\86×(ßdF\9bªÀÆ£pZÕs¹Ö\8dÔå\90ìOR\18j\95çbÞÛ\93HQB-p>9J_!¥È}Q(ÈÆVâ\a©½R¢/UÝBÂ\açÌ*,\ f\ e\fñ÷m@\95\86\ 3Øù°FÇ2\19Èg\16\10d\12\9claz\b*&ö\9e\15]T\14?Ýø\96ÅE$\86\87­ñ\85D\90c\94K¼!/U^aô,Ö²~¼wpÁÉ\9dàU\96\9cõ+$â\98\9b\ 4oD\82\ 2Ìýhß\1e\9aF.A§·¡\823Âæ\9cÉÝÇz\8dÛò Ä#ÃãÈ\ e\b\f!\eÝ\10>"ÏE\8e7\91\93     ·\9aTPϼؠ¥"q\0¹~(ó(\91ÕZ\9f\14Ã\84ldk\89[\95¢»\90$¸?áÊ c\85\94%×W!\81\9c{"²\b:¥õÕC\1dBZy\8eh\7f\84ÐÁ\1a±ä¹Nô1\18Låøå@\94\95\b\bp\ eèíÁEÁ\1dL5S\15\16\ 4\eUM]£¡\930é0ù\16\96oJ¡\90\11
+-\ 6\ 6+>W¾(Ä\0\83\88Ñ\92û\18Â\10=âH\13 [\9b\92¢Ö0¢¯\11Óî´d-(\9c\fÄQ,+½×])\9c\92Ïi \16\89¾ÃèPÊ\b°|0ô»2Z¿\89Þ$\13 ä(Ô"\82\95\16à«Líq\12øM[%\84PÓ(è_íëôÕÖCSJ8o­ç\93X\825\93d
+EsEþR£õÑÛÇ
+Aåu\9a?\8f[\92ñ\8aí\14Éê \0\1a\8d¯°\aUZ\9e\90EÐЬýl\81mE3\1a\ 6`\98\v¸w\14E\82Ï\ 1@\81q\88F%°Ê\ fÁ©\96\85\ 1\88\15Þ!\97ê\94:\ fyVÔ\9c¢J*¦!º\998ÔNÐd%.¶\10\97g;\8f\ 2³Î=\83#^*~=e\ 5F\13\94ÈPã)«Å¤¢»4/5ª\81\f\16Þ<"º[)\8d|\15~;^\89L\10\b\95Äü
+\84\vë¡J\8d¯<\139¶Ñµ-5Üb[$}k1P\b\7f8\7fj´Â\87\17Ü:\80z\17\97½¤\9aoË8i        \0ü8C7\9c\a·ÎU\8eÀ\1cÐñr5'>M¨×-\99\ e\88\80*\14\94\ 3Fñæ\18^( N\12¯\87\a+/åW\f£v\12\13Ë\9d\9f\82KÉÚ~W¹\15\14À\ 1'\85\88\9b\86R\80$K`yÉ£ \14\94\88Ìn÷\ 4¿@K\9fµ\8bS!\f\97Õ¼\18\ ejDli¤à\1e#mE,Dô\9cÌI\1d\10{\8c\9cZ\8d;\ 5\8aV&\87\9d\1c\8fù¾\9a×È\rÖ\8e\ 6L\90\98ju&9
+@èBÜ#µ?\84Pá~4\9aS\8b3\b!\12fi\81Âv\84\13Å5\ e\9f\18×\a\1e\b+\ 1Ð^9£ \85\ 4\16Þ¯Ho\82o\9a·ª\15.Á4¦\1cJ\9bZ\8c\9db¥ç*Yà Qè@\14\97Ó³\98Qõ¬åÌó)'à't\8c\83ó»Jpú\91ÀÌ´\96Jv/\93\97\81Ù\13_\ 5Û9\16\82_\ 1\v\e\8c\83\f¿\82¿\0\88N8k\8dªßp\9f²\96S¥I\1aô¥·\ 3\832JðX|\16غ+E\8cÖ\ 1ÖN\f¨rRaØ6Ro8Ó¼\e^=E#\97¢\1e3J;`Ã\94\13\9dB.âë\18+åÔÍ\86Èl\ f¦îè+¦ÿ¶ÒúAt/\85Ð\rj8\byÍdF·å\92+`\8bF¨$÷[&«ïr\95\89\90\84\ 1\19\0ºz­èJÀú\86=\1d£ÈKQAaáã½SJ\\1a}ãH\88ÎÄ\b\0\1aýø\95\8aÏä0\f\1a-ðj \17Õ®»2\88Ãßþ\11é\8c\8cQDl\17nSøï¤Z\84ò_\84\aÃfCÑÄÊ\ 4*¤14)ØóÁC¥fF#¶I\18øa_Ü\13\13\80¸]+/ÍTj\ eÉÅ\9c\ 5è½Î\8aQ\88O©ñ\ 4ö\ f\91\95\eñ×\14Zd\97&!$\18Ñwîse\b$      OZ#B±ì¬\Óy<\1e\16ðx\1aõ\1f6\14­hh©¤ä,\ f2\1d\91\fdFÖ\eã½Kõ\8eA£b-_Ƽ\12A\1fL\ 4\9b\8cÐú\fi\16y\1e\97f%qÄ,àݲSúü\11\e\81âk\r£I\98)Êÿã&cJ\ e\r  Qt\r\ 3\r3N_A\17\8eø;PI¡¡'\9e\11e\94ÆQ¡Ç      \84\ 4±&`
+C'p/A\82\84Ë\87\ 6\1dΣÓxÐ\8c\b6\82ß\83¡Æ\19\1d\97\1c\9b\1a\85\10\8a\1e¸\12Ëqg\8a<\0\18À\969{Ûs\85[P~Ï­Ä\94ÕtM:ôBé\8fæ\1c4É$\82\86\15ìÛ[\14¿kö6ø.v m:\16\981\88\91ÄÅ\rã\19l0ð>\17\fø\82nl        \87Ï\985ôPF-â$Öbý¦y        f9$GC\a\aãlÅ>0.\16\12w\82!èj\89\8a\ 6¿\0ÃÇ
+ä¢\95\19\93£8ApM\89{]ÌâFíå\85\88\800j\80¥\88ËN¸c!M\böà\98è̺'Ø\94Ø ø\12ÜÎF\80¦ î\83\9f\8d[\1d\96\ 1«\13#\ 5VÛ' \81Ôt'Â\ 4\90\8bu
+\f\1d.\ fSIì*8¾\11¿\bHàK\88\0F
+\e\84\11þn\ 4K\80ñê-\8f\83û!\93 mä\19¡7«1*\bí+\ 4íÇ#d\96x+\9c(¥D\81ò&m¿\ 3G\15ÞJ\9f\83d\9d\80fãwl\1f$\80\11^\f\18)XW`\ 4\80@\84±[-\83\0Ì5\98!qÖ\ 5ñ\19¨\80\ 6f\ f\86ù ÷    &\17«\ 1(&\17É\11*³B=\b\GAt1\\9f6\17$X&\vµK\8b\8d\ 5ÖHÝXbc`¢SP;^¦°¨\10Ò\ 5f\18\ 1<\84Zeº2CF«2\ 2ù\fÛ\1cïǶ7Nl9H\9edq\\84YXÿ\bó9\905C¼ÁBRÿ\0y\84û\ 6\81þ\88Á\82\11%\1aÒ©\13\6Vò«e\9f`^a9*½}'\93¥ÙÃÉmÏ\ 21\17¤Ø80\83\10±LA©B\9a\96á#ÈÞPä\10Æ=!w¡\9d.05$»æ\84|\90˳Pó!¢\11µÚ^®¶¾Z\rN\86ws> å\ 4°\924ŵ,UY\1c\1fatg¡U_!þâ\10Ó@[\84áAQ¬Ä\8e\ 3\89\8b\ 5\
+Qös\17JÂ:\9a®p\ f\96R5EL\808\8c\8d\ 6\97\11&²aLCÆ\,ÂDæ\8cý`ü36\8eÖg¤1\9cÐ\ 3¹\84\98@\\17{\9e\15Ë0\1e¢:\8eí«Á©N"\92\98\9f\ 1N\81^*æËå"\1aÀ\95ÏBU\80\84,eÛ8&³6b{\810\86\12\8e\92ó[\8b\fUV¾¢l&ðrí¢V\0ôU»\e¯Vb©\15b6æ\89«=$\17\80Û\8c¤³7¹fè\82q"8\16\11\81´\83\10\12t\rò¦«\1e\ faOL«Rñ1Wq\13\11\88Ä~»J\1få`Õ"«.\ 2\80ù34\eI9`7\a¢ÛIã\1aa;VqÏ\e¯|Ö,ePª5·.%ñh[\94IIê\83ÃM\121\vµÃT\rÁ¢W_¨\ 3)=$"\82\89k\81ʧ\1eÁè\7fè
+\ 4½å\8dÏ\ì\T<(EbÖÇ=íT\84@ÎJEÍ\8c\0t^\v¶¢¬´§Ý\ eVߨ#\81Y\ 3»ØªXs \8a\b\rL¶ÔÚp¥Âó[_¹\96Cuô}\a¬°Ríi¶Tÿ\f¬\bØp\b¥\86\95så]:\ 4ãÁ\87\ 1¨\80\ 3-ØËÆ\83ßxP¡v\95\19Ù\85\9b:óhHÔVkµ²në\83´/\0ú\82f,ö\8fù¬\19Ùb\ 6«oô\96|-ËÈJÄbƯE}F¼?\81\86y\v¸\97\01\83\8c[+Ox\1c:\ e\0»\17\17\15\99\r\ 1\97kÎVNðhÿzëB`­!\14\λ¨@ü\v\ 6Ã\88\16ĬÞèdÈ\7f?É%í]·Ù`ovp8;\9aî\ f\16Ï\86\87£ÁÁl¿ç·ý#<Û\8ee\ f\0º
+k\ 3`|0k\råeT´|}ýÔ÷g\aÃéàá||0ør8\7f¾\18üp©¹ÊÑüp¹ï¾6\83ÍCüºs\92Ûº]\12ï·Îè·nEPB\1d5\8dº\92ïwôWþë\8e´\8c\7fî\9aMÕeÞn\15þséûx\ e\8cq,h
+Á      \10æÇ |#eü\ 4O)ãÏl\13ÿljõ}\1fßû\86\91þ˪ëß?Ûï\93\9fÏÒ¿\95þ\99\10¢ýûgû}²MüóYúÏ¥\7f1&IÿþÙ~\9f\12X\1fý|\96þ\vé?7]ÿþÙ~\9f¹éý|\96þ\9dôo¢õÍ£õ\8dû4Mïç³ô_êþéº7ÑòÆ]Vé\8fgé¼bçÑÒF+Ûuç\92\9fÎÒoÍ~M7ènE»ÎL\95þx\96\8e\evl»É6Ý\88£þl\93þ\18ºÎÈ(<\87x\8e\19l\9bá\14ÊýWóç\89ÿ¹j´"]\96þÜ\98Ðßý\93Ïþ\ 3æP\ e~}ë?yÑB\ 2tÎÂh\f_\ 5¨\ eZc\91£
\b_j½3\1cT\ 69\90\ 4M\85¤\82\ 1Þ \ 1 \9b$\bT{þY¦Ê\81ZúG­\12è\9c\0Å5DÂR\92\7fRJc¤\r\89 P+\f¹      \85,ü8£ÌRá\80­¾UZ)ìR÷»÷àt$\96\ 42,\12Ò\90\90û\ f¤u\8e!÷e7J\91¦Aeð\8a\90J!Ñ:Ñ#5ÑÜtTIÿáÈ\vy+Mô¤\18\9d\ 6Z\96ÂXéÎb\8a\e\94\ 3h«ÿh\16>÷¤°$\14ñ\92\86L\88çKè\7fæV ¿\r\1ff\8aîY\1aNIU­Æã\191\94)«<©\96É$\}x\96h6\98ѯ
+#¢I¢}ß\10§Ew\16C?ü³Lå¬CµcPüÄK\18\8c!\82LÞQäÉB1t\92v\Q¾\81¾L[h\ 6       Æ\91k     \17P¥ö|­\197$1Ú\97s'U
+;R!ú\8b\7f6P%uUº\83S\19i\16\8d\ eDÊHÕEçö\92áYyÔ\96Vß!\9a\ 1H\19ï\ 6:úõ\ 5$ùgÅ}\1c5Dþ\80\95\97ø¯ \16§P¬ú!9ñT:@\15pF\90XW¸ö\85\92¸bT1AR\ 3§PigÅ\87dþd2P\89$ÛèHJW*ÉÕÝÒ\964r\83ªX6¹º\1f0SY8\18ÔÖ<©;\ 6\85í7ÌT\1fÔªÀ<g:{> \80ÄJ'Aâ*H¢\8e]\13e¢Oɪn¦\ 2ÕÒ\19%½ùIv¶ño-t\81l\1d±&F\16s\81
\ fn!Ï\9aÀè¤F3H¹ë\86,Y|AÕåÄ\97Ú]Vø³,\111µB2\85\ 3Ä
+F5#¡u/ËOÄ\824ºE3F+xRØ\90\86\9b*nèt\81¤ê\ 67<Ý\ eéçj¦\87,n­{YÂ\12j\1f\1a\91\90è*÷Ï*Õ\89÷UzË\85;\8a·G^[øÃÜt#V\a\9bÓÍÅ\8fÈ\94=\12_!á\17¤t'(/\92v\80Ú°òÚ20tÆìÈå\94uÇ@âßx\ 5V\9e;V¾;ºéW/Ù½ \1dz%$\b\18Zù=¹ëñ³¯þ\836ñÏUó\8a\ 2Æ«½èå\ 5\8c\17\1a[
+\13\ 4\f\997¤gÁ\80;ñTÆ»\80\1aî)\ 1oªü\ 11\ 1]\f$ÛD\f\89\f\vÔÂs\ 1\90\8d\94\88Ô\1dï¼é¨~4b_I\1e§mN^\92\92{¬R\80Yߣ@ÖrØ\9eaHì\ 4¾­jz\14×t¬&\10­¿÷\ 4     \v¤Lù\87äôU¹8/ÂWH¹FÏ\9aHr2\8a¢¬¼\80À;Ñ\93\ 2\8f\12 @¥\86    \17\ 5\f³Í»ERT³\94Æ\88%O\95QK!ADiyùJ\82\95Aê.0D`fâß7\12~\ 6\95?\8d¿[:J¼æ\81\17$±L     H\95_4òöÊJPMx\94Y¹,®Z\e¿\1cÚ\99¢\fä\8a\85æIa§5\1d-ì\\80ã¤\ fK\9c\ 6)\1fÌ¡\98:\92t$fEacȺ5Î\86°6))\99\80\8eZ:\7fÑë<1ÐC^juÅ2Ûͺ\ 4}&Ë£§/^DÆ\81\ 5R\98\0²³þ\1eÐ2¯\ 2\9b¤ÔB°½Xó4\9c¬¢\83ÆÓ°Që+\1c\83T\94þ¶rº](ú\ 6nÍu­Ô,-,&Óz·\12ÐFR¡\1fM\92\7fV\83\81â\86Öô:³¾Z-sö;\99²é\8dNbrø\r¥~\ 3£\ 3ÂÇ\ 6\99Ò)cJæ%\14©\8dæ°Ð<Á\15j\9e\97ÉÂ\14\96å+\82\8c«ç-\8b/r\17ö\83\dEw
+5l6!ÙX*õT¿\v\vudD{\15¯5¦¿§ýå\1fmþÂWñí\8e\88·\8c§ç«\90\88ðÞ     +ºmÜ=\1e\ eNx\87Äü§g\1d±õ\8dU\9eàe\17©¡ªÅ-\12J2\ 5\81Xê¼K\r¢\88Y\15Z\99>åj\b
+,óä|yé&YF½Ý\92óUh^k\7f\17\b8WÊ£       \97V­R\99\80\173~\9f+\13Ý\ e>\179½F
+ïg     ×M\98úîN\8aIÝÝ\15\8e+$\1a\b\vÁ4ëÝ\98\85¢uFW«"7G÷o!\99¥½ë;\9c¥äú.$ø"}\tíHFÀ\89³þú\8eÖ½Ð\1aÙ^è(D7\8dE\93Bc\fûs\90Ê;w"YO¤½ ë\95U'\82\85ê\8ep͸Nì\8a\7fnÛ¼\9a¬÷j/z\15c\92DCfâZñ¢\9e\bf\9e*$Æh\83\88,QÆ Å·\94d\ 3!\9c5\g¥Ä\81\95×Qb        ,P%\90<éMb\17\93×R\9bêl\1e:>      H\15-¸T\12ã\9aùµÆ\ 3\1cÛèø\14eÜ0lF\e·\15\12#ã£\970ö¤?\18\8d\8d\8eG]¨\8e\13}[D2ñ¡ê¨¥\7fÔ÷æg´\10oh:ó\85@ýÇKD¬ç2YH\9c\8a*ïHÉeé\89\93\1e\91\85\1e\ 2÷Ê|,%üû\81JD\97\15ªàð*UØ\ 1EG\90<Çà\95\ 5BUFl\89¢h©q\85\11\ fBn\8e\84¿&¤ø"먪\81ûû©ôÙ6\1ds-\19PÕ=jõQ\86¸)ÿÒñ\89\91T\188\ 3jM\17ê\9dL\f©~
+¤DÐ
+5'èjÜi\9ei\kÇL-³\8e8Äh\83Hl<¿Å3I\ 1¥ä\17{&Þ\91â©é¨a\ e       ~\99δ(îý%a\9cA¼r"¨$«[\98,Zð\8e5\97\8cQ\87:\97:H¤µß\1e]S¯z®P\99M\15½ß\e\18\92ê}
+l\ 5¾Yã­h\82Q\1eÍLLJDÿ@\rL\8a5\9ddE¼EA\80ÇË(\rD\86W§k\1c}\84ß      \10êMÞß^^\85N7\92O\83íSifJú$êSúf\8dE0©N\ e¸Tù\94<Ѩ¢Í\15\93â\99é¨a
+}oÝ<\87·&\v\12\86ç×MB\7f\92µ\95\¥toE\13\90ì-Aq\ 6ër\82G\9aR#.×»\ 1»Ëßô\r=Îuw²¿{\ró\96º{8þÙ¹W¼ü_íE¯bè)\19ÀT4±' `Û\95\10Õ\91T(ò\19H\85WI\18hIRçH*\ 4e\93ToÆ×À¡&8\88
+M\10ñ¤p{\11o;m\98ùáyY^̵~ \81¿0\13\84#¶^УÄ\8c\80ÏÆk\89\1d©ó'EÔÂ\85G\8dPrÿ­\82\ f\8f(±Î©äý\ 2 ªS©\10Xw&[\aÕ­#5Ñ<uTu*\15\1eò¿ñN%|¬ÑÔíΩä\ 5bĹ©S©ÐD8\90\82 +n\f\96§iz\rK\9dbïS*ÔÞ\86ïê|J\85\ 4Ð^\8d
+Å+f®\8b\99MFRçS*|~y\13|J^\a\ 2I}J\85bëb%\8aÈÒ+aÏ\84Éñ\8aLã'Þ;\8b¼£Ç\93äY§0MICA¼åKÄã\ 3\9b´nîÈ­ä4Ù©h\82CÆiMJf\86\89\ 6\1aHuìV\8a¨Þ­ÄîHQ\a\80ÓÚ!E\1d{\95\9cä´\80ê½JêÙ#I\9dENÔö@
+êk\93¶+4û®¨#×\18\83fI²±´\95ËX¼SÉ'<\17up*y\11¯¨c§\92\97\1d\99?¤"Æ\83d\83\ 3\80\10; ¹Hb¢ì\f¢ú\94\14C\93ó\94ùsÁÜ\91@êNAY÷\1a\8aZ\88î\9a )\96:w\9dO©ðë]\a\9f\12ÔÂBf%ÏW(\9dO)¢z\9fR¡©´\84Mõ.\eQ'8Çṳ\1am\98yiIj³!\94¿cy\14Y\8b:ö)\15\9auXÔÁ§Tølø:ø\94
+-÷\Ô±O \a(\971w>¥\86å\1d\88ýjt\7f\8a¢âIá\0Ñó\9b4,*ß\9d\1af\9czQÓï\ 5\16[¥3¨N%_§«¨\83S)"EN¥@m¼SI\91Ýx\1cÕ©äTØâQnº!\8bõ\ 4w\81\9a\ 1D\92:\8b"~\91x\95\bÞ\117,\ 4ß\8a¤ÀÑ )$\17U\16ÙBh×æ}Xù3Tøîr¯\8f¥\17nçUÂÍ-r\8fÕ\1d\9b¸^\849\83\91Å®\17\ajp½H¾)¿Þ\8bo\82¯
+R,æ1³N.RïzÉh)â\17ÈÌùrá\9e$ÏZÅËôÔ\89§Ú²ì=î¯M/sZMWç`ÂrÛ\r\16\14\90Q\e}Ô_K^æ\8c(\9då&"ª\95Ë\12D@y¾ñï¬r½Aêè#\8còwo[³\92ÒË(n1ÀYÕý<É?ªØàMl¿³¾°P\1d[\0­BGö©â#öT!1Á\9a¼ÚéÛEþJÙ<\fÕʾ¼9ÓjÒ3S\82Ê>¥[ô\88ê}/Vò6ä8ûU#\ e I\9dAV\91!IUË­U9±\ eÖ]ë%\82:u¾d\81-EÞ\17I\88\8e\9eÎ5­;zE®\19ú\1cK¤h0C\9eÔà~Q\b\81:r¿\ 4Râ~é¨Þ\16ÅÌA\10\82½ÊÔú­\89aËx&ܹ_LÇù¼V%ià\9eäg¯¡«;Ý\ 6\ 1¾¦\89Ý\f¹\¯\92õ\17y6¥è    x§ú_rMô\ 3I=\1cy'?Dþ\17\94ÚÐøÈ*¹#Iòñ@\82#äI]\ 4\86ÎE×\10\10ý½î\ 4ß\81ïÍ»÷z¡§\e\9f\84\8bñ+Jý
+æä\84Ï\r¾./§%S#p\výi\94¬Ã\15j\10WÂÚ¨d[Ç6L\7fUw\1e\98\ò¸dK\84¸9¿]½\a&&Åû+P»\8d(,6Ù®¬C±²¯\ 5í/9\0UØ×á\98H°BzÈ
+U$ÒS\16\8a\91\a¦;<Á\ 5Ã\94±Þ\89/TÐ\8fnz5\bòÛ¼\vÆS\12\17L z\89P"£"\9e\85wê±KdXE«ª#\17\f3Îâu,\ 4-¨wÆ|\94\r
+\85\94H\99uÑ]\7f       U@b£\e \10hðø\9aÀL\97\89æ\0F÷N\98û&rÁt¤Äý\10¨Ázgü-Ö¹`\f#7Ó«\13NS-´ÖY\riW\8bîáB\97+½ÆÃajÒ\b
+V\17\88\1fϵ¶k"+TUéïñ8\9e\83"p"}\10\8a,\95Q$\81?\9d\84¾às'\89·I|0í6\ fÖ\11o\ 5\92é,"ñÏEþ\8af\98W{ÑË\9ba\9c\ 1{Ö      }^¢Ì«XèCtUÕh¹\ f/÷k¡\90*r}  \1a?Hñ¹¬\98\84Î\ 4U¯!UT\16A
+»¥\94ú2Uê°\93ÛÁS\83\9b;«mïqÁ¸âK\82ç»R ¶dëJù:\ eÛïqæ%ÊÇù\93Ð\91â#ÓQÃÙ\92à\15\90ü\ 1dp\bðHãs\9a\13ì\vÔp \8b<\93\11wÇ^¼Ü\9eÔ)\9d¶#\86\8e    Ì\9aÔÿ\8fSا"!:\10\85\92+àMàw¹ÑÍ\902F-ì\171ÐZ±r:.\e(   3öT/ôIM Rª.î®\94á&7\80b\19\95ÑU\91Ky¢2ºP$ÁÑ\93Â^£\ 1ÃS;'7øFòxͨ\9eä%\8anV¦ñ       bºÈË(\90¡\11Ô¥2
+w\b¤4( P½SM`åA  N5ñ­sæ#¯\9a\800$K¤g0^GÍÆ,Ó+IÔ½þ.\10\93  R0ãè\92\86\82V^¦a7M­[Æ\8b}­îJ\0\1c\90T¬r\1a\ e   R'ö9)ø\1e
+\ 1      \89b\17I\99*åƸ\88ä\9fev^¯a­[ºëNL\19|o\1eY\rh\ fM\ 6(\86%~F©\9f\12ÿ½ÁtF§k:7-\95aEé<jÑ\94U*£8¢Åq\9aÄ\99\97Aîs
+,\96\97±àç<tF\19\ 4\1dG/øÅ$\e\9bî<ÕïE'YÊñ\8eÅ{󺿵\9d¦\92FgÀ)ZPtR\9c`Á÷\ e\1al%.:~~\16Â^î\1eïÎOx\89À`¥ÇÞ    ø´ð\aoâi\84E\96\8bHÉ,tÔR'_\r\11ër\8a\13\94²8 \7fhYf\7fм\1d(YK½ì\92\83\86º\ 3«\e¡¢ \9b²k'\90@«T*ïÑ\15à$ç4¾(0\1c½{£\e\ 5ÉÓz£èÅ\13&¿»\9dbRw\8dÅT½ï\9c:¾£[Qq\1f{קSp¾è\9eu\1aj\13ÝÆNã\92ÒË<\9c§ä2w\1a\94\9f<.N\89Hbp\82\9fØ\13-\9c\ 6ÖD2\88SȺNPqj«íOB*ýÜYµ\89\19\e­®7\89\89\ 4\1fm\8d\\11³¢\r\ 4½Û\ 3ÊÅ&\14¦ýÆ[ÒªG¸Û·1%6¡\ 4ª÷ D½  nbòZÆC\ 6;\88\1f\9f@%ËW(c\8b¬ &\8b®ÈN´®¢\86\9d°\9eå½Çk\ 1J\8c_\12\ eV2\1aA=\8d\86\9dk\0\ôq\11)\8da\rT\1fì\ezë"\82ýÍ\95D\ e+\12b\19Ç°fMÙ[IEýK\ e¹\9a\13ÒSÞ\11iCôÄF72÷jÐù¤z[\9f\83§\92d\8cnS¹`D\rÔ#È\ 3Ñéܹ6\f)\17¢¥\11\8be\1dÉE\ 17\1dµöá©¢Â'\ 2±¨\9f}ÉÙ\10\106\11±Å\19\98\bâ\82\13\98\1eýnj\12¥OÀøV¨Vá\9d:UÐñn\8bøA®7zÊ\ frÅj\8eøA®Ò\0¿Ø\aNt¤njbjØ^\926\17Í´O?J\97$W\13g´vÞ\9a\13­pÞI`$ug¬¿=r\16ÞÁö"ØK°Û%{¦³húû&¡2~9y»H!É\18-ÕäþÇX½\1dº\8fî\8a=\86©éHñ\1cFU!ýQV\81«\1241}­¿\1dòؼjmÕ[äð\15ÝV\10سþö\12oCº\93¬\87`îQ\ 1´\14÷i\ 5\97-~³w+p\88\86«Ì\7f\8a8[¼é9Ú]1©\9b\99\98\1aX½ïÍÏsôÖh=¢áù\85Sܦxy­\17Z\92Í\15MA²;rZ[À¾à)^¡&\9c\ 6ã8\95^\90j\1e%"çQ"²\89\92\8fã\9fóWÍx~µ\17½z\9c\8aukâT¬[\89S±n%Nźuq*ÖõãT¬[\89S±n]\9cJÚ0óÃKãT¬[\17§bÝJ\9c\8au+q*Ö­\8bS±®\1f§b]?N\ 5ºU\13\ 5}H\9c\8aí\92\9f\89u+q*Ö­\8bS±n%Nź~\9c
+UÉ8Â[\8a\9a¸\958\15ëVâT¬[\17§\924,u\8aûq*\8c\90pý8\15ëVâT¬[\89S±n]\9c\8au+q*Ö­Ä©X·.Nź\958\15ëVâT¬[\17§\924\948\15ëVâT¬[\17§bÝJ\9c\8au+q*¶X\17§b\8b~\9c\8a-úq*¶X\17§b\8b\958\15[¬Ä©xR\12§\12µóq*¶X\89S±Iö³Æ©Øb%NÅ\16+q*¶X\17§\12L]²¥¸Ë\8a\958\15\89S±ÅJ\9c\8a-VâT<)\8dSI\1aJ\9cJ0Ev6D[¬\89S±ÅJ\9c\8a-úq*¶X\17§b\8b\958\15[¬Ä©Ø^2°Ä©Øb%N\ 5\82g\15\ 2Ë\19\88b\8buq*¶X\89S±ÅJ\9c\8a-ÖÅ©Øb%NÅæ+q*6_\17§\924\14¿¥-VâTÒïõq*¶X\89S±ÅJ\9c\8a-ÖÅ©X×\8fS±n%Nźuq*Ö­Ä©X·\12§bݺ8\15ëVâT¬[\89S±n]\9c\8au+q*Ö­Ä©Ø\95ìçT'çT®èä\9ezµÓyy´S\9d
+^\8bÆ\86êéäÔ\95Ê>eU'·>1>é­¯\93Ûb\9dN\ ejO'çöLurOJurOMuòäqÑÉ\93\97\88\1f\8dV")Vtòèã"Ò\1a\9d¼\9b­¨·\9eN\9eN½×É£5ò:y²\92ZK¢X£\93{â¤Gä.Jtro?Juò\15jåoØ\9eNnÝ\8a\8dT©N\ ejO'ÇåÖÓÉi    [ÑÉAíéä<¦©N\ eÒªNN\89/ÕÉyÔR\9dÜ\93özS³F'_¡j­Â\15\9d\9coNur\ eqE'ç·¤:9¿8ÕÉÓ©\89©=\9d<\9a\93§Kâuòhí¼N\1e­°×É=)ÖÉÓí¡:9XÙªNÞoj|¥\965:yòv\95\8aNÞÿ\18êäÉG\8bª\9dLMGZÕÉ9Ù©NÎ%Iur¯Ö¤:y²Èá+ú:y\7f{\89N\9eî$¯\90ö©\95\8aÊ}\9d<z³×\8e9ľN\1eî»NÕ\8evWLZÕÉ£)ìzëëäézDÃëëäÑòÚî¢^£\93÷w\87hß^*^¡®êä\9e\98æ\8e$:¹\89°;L\84Ý\11Ãu$Jó«iä¯ò\9aW   X\10\10Y@êvú¸\93¢{W=n´\90¨\1däA\1fwR\ 1\8c¤N\1fwÊÃLîõq§¥ö\88Úë}vÎ\ 3û\92\14\1ee4ZÒP¼÷&÷ú¸SQ×\ f$È`.×\ eU\1fw¾2R\1eôñ\98Ôéã\11µpáQA\1côú¸*\88,óÔéã^£\ 2Uõq\90\8c\90:¿cGj¢yꨪ\8fã#¨\vå^\1fw
+\8dbòX\1f÷®\1c ~«>®åþH
+.\1a§ß\10©ãR¦­×Nêæ\98<èãNãFð]\9d>\ eª<êÕñ`7É\83:î|\ 5\95<VÇ\9d¯m\95\auÜ{ïL\1eÔq§\ 5\10\9d:î4á\13T\8a<tDúy÷Zvé3{óX\1d\ f.\8c¸¡\0\9eð%§K¹\850\92N\e÷%i9\a¢É\96\9a3\8cÉSm<\90\8dGT¯\8d\97!\91Ϋã¥$Ô\ 1\95ºÓÆK\ 1w\ 6Õkã\9d\ 3;hÙ¥Æw\e\9bz]¥ÂTÔР    \8c\9b±\91EA\18%H\9d6î¤Ö"©\85w\8d\vð\18G\92ëÚV\99ü1VÇ\9d*\18D\87÷gÔ§Ü\ 6uÜiæ3A¸ëÈlá´´\8e×Ç\11\ eö fûb\8c\9eÔ\9d\ 2\89ö\88\1aú["èãðfV~\9a;·¸,¸\rê¸\93¢,$å+\94N\1d\8f¨^\1dGg:Ǫ\8d\86Å9\8e´SE\14·A\ew\eÒÊtlÑ  §\8aUq§\95w\0·¯ª8\1câÚW\16¬;\95Ìt¬\89cµ%F#hâN14\8c     
+¶/üäI~+ê\99\8e\eJ\118ÓAy\94jxJ¿\15UYt§xM¼Ü¨yÁ¶$¯\89G¤H\13\ fÔÜkâ\1e`\9c\1a=\ 1*wåÂ3ý£E¡ÇÝkâ¥_\95<(Ø\11«\884q'ÀþqCÄThÑÇ2ðrA\1aâ\15\95uG@kJæA\13w\1aíkò \89÷¯Ú\15M¼Ð@\11cÓàAqª\9b<\r\1eÌdÞó\bÕMcÀrÍ+0\9d¥¦\87¯!\80é&\ 6ë\12tG\13£m5\92®Û\ 3ë\12T/O\rº\f¥¾äñ\92\89Áº\ 4±ÔôÀº4³9\ 6ë
+WR\97§Ü\91âPÓ\8e\1aðº¤~\9c\89ðºÄ8hzx]e­×\99\98\97ømV/\82\ e°KËXö\0»*Ý\8f        ^\97Ô¨1}\&ë9kL\15ë\9a\89Á\9eJe\99\9dæ^fEÄø\83ú¦
+md
\91X\9d½ £$Z£§v\80]z?Ex]¬xJR\fØ%åØM\f§¥2b\fºåý(iü \14I3=D!Ö\ 3\8a\1f/|)\87\18RÈø\89\a%«ÃÄ@H\92^bb¸¤@Jâ\a\8f\1f\14íËØ(~P\ 2Ã\8d\a\8dgÄ]ü`Ö±¿`+`Ü\9b±©u¥Ñ-\95î\83F\8fg\12>\18êÍ%á\83þÂ\89P»l£[Á\ 5\83l\90\1f\12Ô.VÛ!5\0m±z\8d\90¼'E\8aN\9b\1ejWàùQÃJ\17´ëN\0 M\ f·+\b\0Åçfbà.\1f[\98\ 2wÕ^NKæF >L\1f\9cÉÙ5Ä ­\84¥Q¹6ÆíR\ eÒ\ 3îò:|äU+ý~\95,\86\94\14o°@ív¢×££ýê¯\85tcK\99Ää\ 4\94ac\87s"VÞô\98\ 5'^\1a<h\9c®i\17\1d\9e\10<h\1aÏ\ 6âàA¿Ë#»»×s¢àÁ@J\82\a\97  ý\94\83FoÚT\8ce\91 ø\94ÁS\98§§\fá¯ñ\9aûg¥ê[º\13\9c\14>ëñk×Ý\82)µÒ\8b°\v\1f4r/u7\85\13\98\9fÞ\95â´.{wõ\84éÏ£ðÁ\8e\94\ 5j\b\1f4.KïE§5êÓ\v\14\831z­\86ðÁLTÞî>\86»%hëñ)\93óÔ\ 3ï\92dÉèq_}7\92\19
+-DÛ\93-*& %B\88¨%±¤"ð×é\1côÅ\9f\95èAÛIÚ\9d§Âª{5Ú\eVñw¢\1ddµ0hºÕ Ú\14e²'!Åë\ e
+æ«\8e\12{*\ 2µóT\84Þ:OExmä\e\88Æç\9d\bV\83\89£sj\15f4=åÞ¥\91\1esïÕHîb£\801\91§B\8aü¥£É}!j\ey*Lã¹FðT\ 4R"QtT/y\84Þ:ñÄx     (\16cLá\85\9b ïHÆs"\14eþ¶HR0%N:=å\115ñU\88?\91\8aBl\18\9bSªÜ\89ydLVÝÒ\83Ô\92Äô&²\83È\98¬×d\1eY\93\83Mª³&w¤Ø\9aÜQk\9f])Ð^\89P\\10q¨/=\v&n"fK\81æD\18\17|§¾,\1fæ&±\e7Þº\94\9az:s²\80\vF,Áz}3á      ¨èÓ¤<Á[qùÉÞ\9eÜ\91b{rG\r\aRJ\ESmÅ\19\96.\89\95BèñÚYõ­F+\fgb\11m\90\8aþö\90zÌÆƾ
+ÛÛ2\9eÊ¢u«ÔJM¨ÝË¥pB2D½)zßâ
+\7f\85\85o\16\18ódf:R<\85\1d5°*\ 1\8aÔ¾» \14
+Hx¶¿Æá3º\9d pQéö\82Å%[³½$\1d¥O\r\9avèÓ_~á½\99ñ¦àÎUaXáG>DD,£ÞáhkŤn^bªN`×[7Ëá­Érøí\11\13\eÂÚ\1a±Dç©£"|~²5\82¼\199*"jÂç\92[ðN\82p\89ðÁ\ eÍ<Â\18\ fþ\ 3D\1c\0ÀË{\ eú¿_}U\98Ëÿàm¯\12F(l/ã$äy°\95\88q7\90;\8d
+âP \v\8d\82°èüxl\ 1Åh°\9b:m\13|$\8bt\ 1)\1f\9dQ\15ðý\ 5\9amÒdb!·Ê@xºvì/+C$\9eXlQê\9eíýÃr\11\ 2£R jICUFÐlc\eUȤ8^ \ 5Y\8cf©@î2÷\8cë÷Pç®ÿ"Éæ˨\13\98(\89\8e\1c/c¹Hï\83¯+\19f\13b0\95Ò\9b\fO\8d¦Íw×M®à\ 5¬¬BÍ\82\82ézI      Àt]%_6ÐÂ\PýXÙ\19¥|ã:*pè 'M\92\1eV¨ôPzª\8cT\8cÞà\ e¡\ 6\ 3kD\10)ÏE1pr[\12R/\8fæM`÷z\14g«ÞD\ 2Ưðal2\8f\ 6( ^ë\94\ 54D\ 1\89\1eÍ\85(è}Ý~0ä½~bÅ ©¤  s\9byj8\Ü\90Éã*À\91y';\9c\b\85ulÈqÒ£         \9dr`\88Éèg/\90\929\bÔ.\14\10¹·ÇC\10C9¹w÷!RÂ;Y![çýuT¡IIÁ\1e"\ 2Wo\ex~T7TÎC\ 4\91¨WIã\\13ÃV¨Z\15:¥6y^&ã\82)©¬\93Ñç\9a[\8aÏ\84Â\11\fo"]\0\81Ñxã\94Xd6\9cÎ^LJf7P%¼IºÓ\856ÁDÜè6\89\16\ 2d·ú°%ëêû=¢\15\86Ò\1d\16nâd\87å>\ e7~ZC\ 4ºm\9c{7n²Ý!5Ëd\95\1d\88\87\ Ýáé(Ñ\ftÄNx\17\ 1\1c\85\19\98Â\19Ûß^\ 1ã;^ §s\17-£Ä¤§Û+÷@·½í%\99½\19\1c\9fy\84\12\9f [µSsª+©%^\85\98µ:'ë«\9a\f\ evÿ&A)ÏP»6óænQÌ3~´\a\e ÇOýJõ8g.ÐÝ1CÆ´\19¡\19ç\ 3c\8aLïÞ,)v%e;\b\8e\1cv\8e\0Ü\13B9ó\1aX Å·KG\ e×\10z\94\e½»¬Ô\9eØ¿×òp\82»+ÐãèÄ7e®qô½»\16²uS®Üµ¹DM¤\1d\88¿\ 3/*Bu7bÈ\80Äп`t¯äÎÊ\8a®\10\8eü\ 4áAB4écÈd\89²\9aß\16¼\14ýÙ¨t4ñüJÊkÆR×Y§ÎJ:qÆs\96Gܨ\94\11¹RððÅÞ-whYx»$\r
+endstream\rendobj\r25 0 obj\r<</Length 65536>>stream\r
+\82\863#{\8bòsg@\97«\1dPZ\99gÚ´=f\ 4Å\r²\19ë2Ö\1f*\\8fõ\ 2   \96\96ø>ïÕM\17\8bÄg\91aóÁ¯\83bðå[ZKÔWÙå/R\92ð\ 1~çam\89]T\8eT\1aõ\7f\8ck\94\7fî\8a\8f>ÐÞ\8cË\93*¦­t\135\89_Þ{wüêÞ\9bÓ\17¯¼·÷Ú5o=nr\f'\a\15®µ&+Än.®\87\96÷^ Ú¹ô'mÅ\9föDÐ÷\92\ 3ÿæù\82\97_õ I¤Gh\1fý\94û^óØ\85\17õ`\ 6+o²¬åÌÂ\9fb\e\89\94\14#\bÁ\\1cé×\9b\14«tÝ\19i\12¾:äþû0\96\90_\12¾Ú\1fÀº\8bË\1e\88\13µ\97_ýWó\97®}øÉ·âOÞÜ\9bôP\f\14¾úÔ\9doE}û¿¸®/£l¾\91ë\7fë4ögÒMà_u\10ïùt"³h"Û\16ÊA¤\83°\90`3ÉNH\17/ÞAéæJw^Xh¶\8b÷@ºAâ½\93n«tÏ\85ñéÑð[\85Ã-ã¯\8dwMoÓÄ\93\94.hº\ 6ñFH÷Hº\81Â<³]¼\94é:Ç[ Ý\1déÖ       ã{\99óÿ\7fbåÎzÜߤ\15\13\1eó±ÐK2oY7oýÓ­Ë\vò\v~\8f¶GØ1VM¨m7þ\97ä®èZp¡\93e×þý\85\11o\97°\83²¨\7fý%¹5¢\16fÐߦÒ\7ftu$\9fdêð{Ä÷¼¼äY\9fÉ]Ú¤èML\91l\95°\ f\9axàM4ð°\1f|\vn\87d\v$\13\93éÖ\11m6<\9dÇýçQÿa\ 4¡E\91ôPô&æ%¤\86\8b\1d±º#^J°ø\13í\9cW\907V¿~u®m\9eεMÔ\9bî\ 6\8búJöÑÊ6ëíÃ\95\8d\9aìãx\93èu\16í«Þ\ 6ëíÀ\95-\9aìàxÌÝÅ\96|EÙ\9b\90ÞÞ[Ýz½9M¶ÃÊném§\95ý\96lÇxuô&\v\eae\9fô6ÒÊNK6b<æ\97\95Z.Öüå\ 4\9b7|o¼¼¼³òÁ+SÛ±\97UîòÕ[\7fyçñµÍùrg¼\877\fç/\ 6\1f\80f\ 6׶f³ÉàÒæm\93ß\e.\97£ùôæt¸;\19}z4Þ\1f-.\ fÞ×f·§Ë´Õo\87³ùòá\8bÃ\91oÓTb\81³yûI&\13?\7f\97{íþh8ùr¸\9c\8f\7fCÛ¤§æÁd¼7z°7\9c\8c§O?\9d\8f÷¿\18½Ð>Ýê{ã\89\8aÞþ!þõÖ_\9aÁ¥Ë\83o¾n\7fi\1fÉ\1eß\9cî?xq°;\9b\90àðûã\7f̦÷æãé²}ÙÕ«Jßj;\9dÆ\7fyë/ÿ8äßjùÛ½ÉQûï»»?\8fö\96oýåÒæþlw4Ø\9a\1f-\9e\r¾\1cN\87OGóÁÝùþh~ù´?\ eä¯ÛÃÉdüt><|6ÞÓ¦\ fÛu¸6°\83ÃåÆàî/ÃöçÕ¦\97\aWÑGü\80\815M¥\8f[\93áòÔ\ar>p\7fv4ÝOÛJ\1fk\9e¨\8e{bµ­~\8b\8f´\eõî´]ïgIßÛÏ\86\93ç\83«\83\a{óñn»CÛÖÒÇ        ÏÜ\9aÌæÃÉàÁrtà;ß\97¿\87\aÚ\8e'»£y\98\15Ýok:Ý\19íÍ°\ 1\7fiWy\86\85m¿eCwK»ÃÒ½ò;ì»þ\17L°±tôø1\e\14\ 3Ä3Èÿò\ 1\8cÔ\ 3Óþ\92\ f6o?Þ\9a·çg2âÓwÆ»-+x¼ý mX?Æ\9ex¼-óq4ÿeôÇ~Õ1û\ 4\1f\14ï\11þ\8e]\83ÿÂ\bL»0þ+Q#ÙÉ£~Å\11tÇRÞoñO9¨\8aðnó»½;ï\7f|Þþã?=úçwy¹Ì<v\86¼Û\r\eþ÷÷\7fs7åx³á[¯\96íV\9697¿ÓË«þ\9cWí?/=çç}DÖñ8\f¯Ï\19eÇ^\e|5\9d\ e\ f\83üÚÀÿã\8fɵÁÀ§\83\9b\81\8f·2áÃ\84      \98W\9fÛã\86\1a1äþ(¥aû̠Ⱥ\ 1c\Ç\rÖ_!\ 3ST(\9d\ 3ú\1f»"Ç]\12ø¶\95\7fð?F¿ú\a\aæZ\8f`£uÚ\80\93Û\1a\1fuYZÂ)ë÷;lÌFþÖ.ì\83å\8bɨ\15Ư}1\9dý:åo\90&/mNgÓVàk\97àÚ?Ú\15\85`vms\ f\13\10Ú\Û\9e\1d\1câTµ×Uû¹|¬Ý½ãé@\9a\bù²lQmó>ääk\8fÆ\8bq»µÙé\9aN\1e,\87{Ï_ª\93­áb¼\97ô0\9f=\1f½L\17\96\7f\9aÜ\9dë£è5\16°Ûi\98-ïc\17ì·Û\e\7f\95\86:\e\ 3ª\0ÙàS)'!\v÷Í\v¼åóö§\9f\a\12\83ìħ;øþÇl°ÿVÛâ¾ +~³\8f×\8d\9e\f>\1c¼õ\97Á¥¨ë˧\8fÄ\vô[\ f\7f\91G»ö\8fFóEû\93t³9\9f\ f©,¨\10\ f\97\94M\11ÿÞ4eô»é~ü\10ïx4\9c\8f¡S|=Þ_>{øh89\1a-Øoÿ\15\0òoÖö\83È\81ª\89\7fÏ\9bºÿ\9eíÑ´]¨Ñ>ß\13½Á\86¯å_\1eÌ\8eæ{2KícÏ7oo\8d\86GËñ\93£\89ÌÄâÞp><X`B¼*òá\80ó9hÕ\8cÁµöÏ˵[h{6Ý?\1a/϶{Nî
+\e륶ó\89Ë\9dy5ï«Åèæ/£éÝý}\99z¼¦Û\8eñ&Ìt\13\1au\9a'û/[Ý\7f¡§ãçëä/Þ\9a\8c¦ûç÷É×Øß+|[ôM]\17'~TûÌÍßF{G\18\8cü\91]\1cË í\ 5\83</\ 6Ù²Çʼ\8e\f\12\18\ 51¿DN\Â/\9d=\17~Yguܯ3ͱü³L\87älÞ\ðÏ\vþùæñÏü\82\7f\9e\17ÿt9°?^Cþ\99£hHÂ0«õ\8cíe\19fS¬g¼\b9íñÒò\82A^0È7\91A\16\17\fò¼\18¤­\þZòÇÆÖ=þx.
+8ñ¾\8eá\8f.ËãßKgÜ\ 5\7f¼à\8fo\1e\7ft\17üñ|ø#Ò\8aP1ùud\90Îõ5îü<\18¤\ 5\86Ñq\ 2d\9eðä\ 2)<\17\fò\82A¾q\f²¼`\90çà\rJ]¾\96\1e\9c¢)Ë\94?\9e\8büè\80ý¸\9e=\9a¬v©~\1d7½`\8f\17ìñMa\8fÕ\ 5{</öè\å^Kù1ËÊÄ]R 5<á\97ùzF÷\92\f³,\1215k\8eu\80\9b¬L|îÉ\93\17ìó\82}¾)ì³¾`\9fç¥~geU\17¯%ûÌMâ¿É³<1\1e\869\ fy³Ê{QBö\ 4ûeêß©/Øç\ 5û|óØgsÁ>ÏM9'Ø×kÈ>mVö¬\97æ\¤MWÅA\93½ø 2a\8fUî.Ôó\v\ 6ùæ1È:»`\90çåþÎëüõ\f@ÏL*O\9aªèÉ\97õz9ðeýá¦)S.yl|e^$¿§O^ðÏ\vþù¦ðÏ\8b\ 4\9eó\120_GÎÙ¸cBÄ_V\94,òÄ j\8b\93\1cì\17¬ï\82õ½\ 1¬ï"5çOÍúPmã?f}©S¦È×+Ô\17\82ë½)\ï"¡æÜ,\8aYáª×Ò\9fmê:ñg7I:à«\8b\81\8d+\8fM¨©ê4Ä(izÁ /\18ä\9b /\12jÎÏå\ 2Tº×\90?\16&5ß5¹=\97xqç\Â\ 4Ë¢N\ 5Hw¡6_ðÇ7\9c?^$Ô\9c_@dåª×2ã°ÈêÔÃ\82\82\11\0\99\17   \83¬j\9bòÇâ\84×\ðÇ\vþø\ 6ðÇ\8b|\9a\8f(Nýz\1a\17«c2_^\96\1f&  \86\0á>)Ðü\82\ 1^0À7\80\ 1^dÌ\9c\9f\ 2\8dºß¯!ÿ+²,EìÉ\8bs\89ÀqU\96&ÞÔ½È\9f\96A^ðÇ\vþøFóÇ\8b\94\98s\vYÌLýZê϶ï\809§8\9c¢q  \7f¬\91P\99\84\92ç'dv_ðÇ\vþø\ 6ðÇ\8b\9c\97s\93\1f\9b\ 61̯!\834eÞs\17×ç\93ó\92ÙD`¬P        =~¯9&åú\82A^0È7\84A6\179/çÆ ­«Êòud\90EíR\17õI\9e\91³óǪI»u65@\1aS\9d È_ðÇ\vþø\ 6ðÇ\8b\9c\96óã\8f\85}=!{\9a²<\97\90\9d:+\92Lhk\8b\v\ 1ñ\82\ 1¾Ù\fð"³åÏ\9cÙr.\9e\96ã\90!.\82¶/8Þ\eÈñ.²ZÎ\r\15Õë\89òm]
+¹ÝÔÅz.ö²(ßµ9\16\86ÑôªÄT\17ìñ\82=¾yìñ"§åü\*Åk\8a\92c²:\8dÉ©×ç꽬GÅ\14Ç\83|\9bĹR\95±÷ù\82?^ðÇ7\85?^ä´ü\99\15æ\15Î\98\9f\83
+\9dzgL\1a\ fiz\0âe^^à\83]pÆ7\903^d³\H\8eç.9&:uÒê\825^°Æ7\855^ä¹\°ÆßA©¶&\89`,.
+g]°Ç7\8a\9eL\8e\ eÆÓár4øv4\99Ì~\1d¼\99\8cò?ØççòQýñlîÏvG\83íád2~:\1f\1e>\eï\r¶æG\8bg\83\87í¦¿Ì¥?¶³KÇ<¶1\1c\1f¶«sorôt<m\1f\1eùuZó@Ûîáxù\8aWBãÙj{{>õ¬ûÓ»»?ßo7Ñ\a\83Knp¸Ü\18Ü\9a\f\97\97\a§}©\ e·}x\84}Úî`\19Þq7ÏFV4®lçg#k\\96å\ 3\84ýÔyQ\81\92Ù¦\1c|Ñ¿\9aüÙ\81×    Ççåï¥ð½÷±\11¦£Å\82×ÃÒ_8\99\9dq;ãí\9aí\8c\ eÛc¸¸\9bþ5<¼ògéÜ?\9dö\9dÌ浯¦ã½Ù~;´ùxú\14\8f,\ e\17òë1CMÆÀ\ 5Kßïúï_}àþ¨}{{Ò\1fÎÒwð\8fépÏvíüÎ\9c\935\82~7æyÂwý·ä±\8dÌÙV
+\81ÿ³)\r~(\e\82\87¢*ªê÷8\15ë\97úwd\97w\9f<Y\8c\96\83{Ãå³ÓX$î­År>\Îæ\e£ßFëÙbÒ_Ç\ fO\9eÿ«Hxɼ\98wiöd±L$¶\9f§ËC\12¼ûäÒÁd|ð\12gãâjxå«¡ýOc\aòCnÖüpq7¼ÜÝ`ÿlw\ 3vGÑü!wÃïÂ\bÿ+JÖÝãNÍ1\9a\96á\99ÙÚÅþ¹ôÕtÚn\9dýA{Â÷Ç­¶;°¥\8cùj\83\96Ò­ÿ÷ÖS<¿µõ²zÚ\1f¿\89ª\8b\aí¡L\1fÚz¶~?åÙem\91î&\ 4×¾9ûÉý\8eÚþëf´9_~\92\e\19óïÉNþkÓÔª»Uc å\1a\93Õ\ 5vJ]\9bºt\94iòÂÔ\83ç¯4\9b\17\97²\83Ýi%\9cA+ÃN \8a~ófÚÀþ\eÊé\7fb\9f=\9b¾yaÑ>Ç\93,\1aÙÃùpºx2\9b\1f\9c\8b\96\1dõvV\1d;LÕÒ?Ûêèí\10¦Aa\91?/ö\86\93Ñ\9dq«É¤ºÇÁì\97Ñg\8fï-\85ìýFÓ£\83íÙáxÔë¤}Åþì`ü¿£Õ>\1e\85>\ 2y>[\ e\97£Ç÷ÛËg8\rýËß8\9cÏ\1eß\1aîµ\13Ò{\89°\8eoIÍu@\87ãé½Ùxº\û\86\9dÑÓùHÇj²¬÷\8e{£ùÞH\9f\97|³ö\99Gýg\92¿Ec~\r\ 4¢×\83çSK\1elÏæÓÑ|\817\1f.\7fwÆ¿þ@&#9\97CÙëñ¬\aÓt»´=\0G\8b\97³\ 3^\a\17\85Sö?gL\ f\9e\r÷g¿^\b¡\7fÊ\13ü'3ùÈ?\7f\84\8ezÌݹ3\9f\1d\ eü\899ùæ\8c\9a\1eï0Iú;³@»\11 x.Í\ e\87{^\f\14Ê/£yO\92;\1c\8eçi\9bg³ùÿ\8a»6\ÁûÃùs\92|PÑ¥ÝÉÑ<\11yw'Ó\93\97ÆüçK³Ø\9b¤/Ý[Ì÷ÎȽÿϳò\87ãÅâh4¸7<ÄÇ]0ô\v\86þ\9a\8df\90\1eÙ8þð_áì÷\1e\ f\ fÛß\1e\1f\92A?¾7]\9eê\1a?\93^D}¼\1dÑø\7fG\e\e\eggð׶Æþ/\9b\ f¶oß®ÝÎ\bÎXüí\9d¿¶ÿù\9fòÛÙ\ f·ÿw{üQ~   ¿Þ¬\1e=_îÈïÍÕ¿þÏÆÿû\98±\9dûÃå0½\v\9e\8ac\15\18\9bd¯hñÀ\9b+òÌ;cïÍG¿ìÌG'©d\7f(\7f­.\9cd¯(1AV0ÿ-¡éOp´.ýÙ\8fVsq´þX\9fã§óÑhú¾F@¿?¸;\1fN\9f\8eÖ{\9dÏÑéø'8\8a»ÿ\17\8ebñG\1cÅÿr<m{%ý÷\95¥ï[úðh²ü1Ö\94\1e\8c\ f\ e'\9d¦´jv¸ßéºÇ\86ÿ­ý\12ãoÔ{-Ç[&#{góvóøæt\7fs¾ä\9b\17$9\90\1eÿc6½7Çù\9a>½zUé[£ö\bÞ\eNFËåH\86soW^\80\7f.}\7f¿ý;Om;\ 5?bé¾Yà{Sò[\7f¹·\97|Û¥¯\9f\8d\97£\84N}¾\9døV«\vtã¥\89KÛ_~ûÅàþh?z$ù\9308ý«éÿ\95\0úc\16ÿqûÅ°û\9bIÿ¶59\1aE£IþöåðéhÚ2\ 3ýó\86¡ìC-C¾eû£\96ôåGpg}ûQ\93\r¾h\7fìÆÏ\86µó=~Ô®!\1a}ûQKû⣸a­:KÔ°f\97ý\86®ûj¶rh\85קÍr·úæ\96Ö\7fóFÆ\93\83qjC|Mø\96®\9d\8d§û#\9bi«Þ\8b7\ÒÌ\1d׬JÛUî\98\80\r.X\98îZ¦;4î¦{\8dî׶oøåa*óÞ ôÿzã¨ÒIªùþ\96\95vMëÌ\ f£HÛB±0®ÛE\1fUl\89©_ómqC~\19\973nhü\aeÝËñå_â{¾ýÈ%M\8dD
+ó_qSÙ\9e\16\8d­\8b'ÀÄ\ 3í6r\7fQãf.;¦Y.g#wÑjå]\9f¹KWKF\e\7fThêú»\99\13`Óc\84¯·½Mêü÷\17ÝVÅ\b,\1a\17iãB\17tC'W\9a\17è»p~\10.ÞÙü_\19Ï®\v'°ÌÒ¹u¾m)ÃÑö\18LÉö\98\8d¢7ôBÛÇC/Bëh¦u,U2Õa,Uo¦s?\96:\1e{\1eÆR÷Æî\87!\a*\99\99ÒyÖ\90§í+]ͨmÕ\1dR\97p\b\9e\91\9aÿ\1fMc\15\86RùÖ*ßÞ\1a¶2Ür6\90{ãT¹¶×¾ëÊßM\1aªùàè°\95=\1eÌ\9e,¥åàÑøé\14\19^qü³ÉÈ_Q2?æ¹c¿äÞѼ\152\ 6\8cú\98\9c¡û´½t{éÎðéÑtx9yVþù>êèÇÁa×Ö³\9dv¼Ã\17ôüß{\9a^õrV=¯h7C*&lÔMû\9fbMӦ߲j\eÖõ\9a\96u¿e\89>«5-«~K\87\96ë\ 6Z®´\ÓÈõ\eåÇ}LÑoi\8fû\98¼ßÒ\1c÷1¶ß2;îcÌJËâ\98·»nE·æã§Ï\96Ñ\9aFbÚG\1d§^\15<ª¾\80R¹µíü½\96t¹"ðD\12À1÷\7frOF×\94Þ\91«×T©\8c­\9f|#\8f\95k\9fº·ÕIÐANîDçX¨~ë/ÿ8T       \9c\7fó2ø\9dVTN\94\84ÎS~L0Ïj\ç[k3\9eû~\9aUù_Þ}º
+°ö;L&\7f|ðâ`w6AWÿ\1ffêh\17\f©=ùã\ 3þpk2\9b\8f¡ä1á\1f\94-ù´­£ÝV«\93\8f<\18N\a\ fÛ'Z¹zþ|1ø¡Õº\1fLÆ{£\1f._öïj\a\98¼é\84\fïÌö\8e\ eZ)}§ÕÉ[úãk\9e\0\85\v¿Fº$    ß|yç\1f0\v¬ÿs«ÿÿv0\99\r®\ e\97Ëùx÷h©
+}Û8\0+üQÝ\9cÓ[¢v{ÏÆ\93ýùhª­|b ÿ3þµ|q8Ò?_zwºxüËp¾ø°Õj}îVÜö\17`OøÆøÃâ\98\86\88\8b×v:\9aEúë\e?UÓÙtt\96Y\9aÌö\9e·ZîY¦É7}ÿµøÀÝñt¿\1d°9ËG¶{æÁhù\ f\19>4n~\9e\9bâ?\9f\14sò¤\9cm*\bÖr¦\93q\96\95þ¯o\84\97g
+\1fürv¶\80¶¯Ç\86Çwî\1d-\96³\83×\80ýý®[ô\83Å\10\86JÜ¡í9<ûNý#ÎM; ×m<\7f®£¼xòëk°¿ß\0\80°ú§YûÜÚ\8dº(\ 3\12ı\9fýl\ 4eðL\vï\9b¾\16ü»È\9a\rgì©ß÷+@ÌÎôyÚòµøºÚnT¥=ýë~;Û\89}M¾êªsvÃ6\959õ»^\9cé»^¼&ß\15\ÉÇ~ÏîlÙ
+\1awFO\96wçãV¯=Óç­>ôÚÈ\14d\96\ 2\r¸\ 5óÆë!T´wÝk1\8e\83Ñr(q\ 6ÿñ`\9aÿx0oï«ÉäL{.jMR\88qÙ¼Ý\f\ ea\83\1a\aG\93\ e\9b04\19Î\97»³á|\7f°7\9bhVß\9a\13\19ªv_:\1cîï÷_u0\<ï\9f¬ÅáleHÃÉØïû.Lcÿp¼¡Dç£Âg\93\85\9b·\a\9bGËÙàþp±\1cÍ}\9cGûª2¯óð%Þδ=\9cþ2\<è\9a]úþËÑþøè`p\7f´\98M\8eÔmÞGÀÙ¼m̠تZ¡òè\90X9ËÑ´\9dÁ{ó\11Ð\9f"\8d¸t.wÇNãÀ\f\15u¶°õñmmÜöÔ~ç£\95éçØý6\18\8cÛ¯\84Er\17\11\15\1eΧ\9d­.\19\0ý~9Z<\v3ʽ\11ÍÏÉ/x>\9dí=\9f\1d-\aOç³£Ãx=»îï\1e-\ fÛ\16§¼àÔ\89é>ÖFÍ\98é{8lÏÜÞ\8bv\10ãýv\87ÿï\99'û)C\13Î8Ûqc\93L\a·Äü\97Ñàáè·åàæþx9Ü\1dOÆK\7fÅ¡¾²ö»º³î\f§O\8f\86OG\83{³Ã0\85a\ 2·&£Ñ>n\91G\11[ðÇe{>;Ü\9c\8f\86\12õ¿Nrï\9fÝK\9bþ«Ìê¾\8f¶tø¾Û\vÿ\84ÚÇÓF2È{\9b÷\95TÕM>¨ªJÇÏ\801²ºK÷\8f&£yr\15v\bW\ 4\9cúÒ§¥´ëÖ¸\r[gùàj]\98\8dºnʨ»û£ÉÃÙ}éIº¾7[\8cñ\95ü³\r½gg\7fȬptÿÕ\1d´nûqÝö0ÙàIà\bsîì«¿\8c\90\v\1dN\86Ó½Qo¯>ß¼M¬]\80a-¾~6Þ{vo>{2\9e\8c<înÇ\89\93¦7\ fvGû+MãÓ\18\8f¤=\89\93ñt4X¶ûÐ÷Ú\1dƤã\aG»-\e»5\9b.\17÷q$\93qHçI{\84t¶Û|\91Ü\1ckÚÝÛ¹\85¦m\97é\118eÄ\vuO¨~\10\9dCå¼Ø¡ÿ<\1a¢ËÁ\9dÑ/£\89gé¦ØÈ6²è~l\87sëh2ñÇL\11\9eÛ¿\9e2\94½Éø°=ì°¶üÖr\9b§íC\8bS\1e\a\7föËh~\b'\88\7fÂv,ö^;\80Ã\11\8fè§-\83züÙ¬å\82³ég±B\16\8a(­´Þ\1eM&Û­\94\fÌõ¤\96Ñ]çê¦ö[ªß\14\fe+á'뻼5\99Íæ\ 2w\18
+\ 5ðÖöÊÖ÷\ 3\9b>~\ 6(\15\1f\ e÷ºíaK\e\98äºÖ\9fF¼÷Ô!D_V¸º:®_¶\8d;>~À2\ fÉ\88]}lëûXØ\9b¿-;Aì\84Æøº¤mUµwDm\1a³ÂB×=úh8\1d/\9eµû¾C\84è8ëÊÀ:\1e|{º?úíÖx¾ðÏð\8duQ\9cíµ÷Z\1e×*\ fPq^åÅ\ fF{³é~üæªy\997?\9c\1dƯ=ûØ\1f,\87\81éûùn\ûpnʳ¿\1e'-Y³º¬Î¸fÜ\ek\17­8\96\ 5ཷ\86\ e\1aóe>\99o<f½Î>õ]/½¹?~Ø|¤?îâø\93ðh<úµ\9d\93V\1cXF\17èñ\87\92ý§\87òØý\87¦\11\8bü\8ckÞ}÷Ê¢\9fÄ\87øاÇH\97k\eß\8feùcù GÂxl^®ØÎ}¡p-ï:ñ¹«.[\95×V\ 6©x\9dìîå¸N\98Âõ\ 3°Ç<÷°Ó\94W-´©©äÁhòÙpÙÞøwf{à       DÔE,¸\1d×ú6\8a(ÜÞIÚÆ\7f\7f\b§\ 2^½V*\97ã\14ËåXä\13\16ïô%n\ 5ò \11\fÎÀÍ\0³vlÊf"½ÓÿùÓɬ\95\8f\ e\8f&\8b\8b\9en\8fxüì\87øc\17åß[\8e\95,\80ئÐ^e7ï=\18Üí\8bG±@e\a­V\7fWåÀ\a\89\1c\98\1d×ìa$àv/\93&ýw\9d6Z¿\18×:\83ܵ\9f\e­Þ7év©9¦\15_5\9cxq´\13CW\1a¶:\9e\86\19\9eØáâùøp·=-Ï/\9f<¼y+\ 4Ï\17#|Èü\8ccô*­\9f\99K«:`ÿQÿH<ò\ f\83Ú\8bü\86Ïg»·§Of\83ô\9cDÚ17ÀÚuë\8cSÓY'B\ fÆS\8aáPÐVôQ¿ÊÛ\10Ö·UX¿\9f\bëÇ\18y"ë\ e{8É¢\13kzl,Æ\8bk\8fDÅÛJT¼Ä\9a"Í?õ \93Ãé¾\9aWúö\8eÄH"O\ 1\91lÐ*\9e|\8a¦\84\95§ÌÊÌ\9e0\11«\8d×\9f²øk¥ÝI\9f{úôJ\1f'Ío:eÒþ¥çL\1e;ä½
+\ 38<\9coH\80Á       g\v\8döÅ,\12[.ü\18ûMc\1f\15\f\eM}\ËÄYwigô¤ýÈýÁî\8bÁμåýó\93\8f-:\88ìÂÙº\97ìõÇs|«d,ë¦\8a­h\87;;[IÇ·Úåd¾qÐ>~âàæû\e³ùÓ\8d\93¿@\eùÀ\95È\1aÒoFD»ÐÛ©\r\7f9iølu8Ùë\9bvV\eíM\17'ÎmÛhÙJLÁt»v¯>=x¾±\bùr'4ÚÅí~Z£½ùìð\84q?\99.7ö'éê¬m´8Ú\rß\96¯{Ùbc\12\19\8eg±±ËÔÑ\93ÛLGO\87\91\ 5ô\98V­Ê¹d àI\8d&f\8fÖ«U\8eÓk¸x6l/ÞQÄk×6\83­( æG¬6nöÛáFj4\7ím#\18¨N\18}Ûbv¸7;­Åâ¤\19`\8bý£\93Yý g»}þ\94£Ý\8a\12í¬\1cM÷ÎÆ,Ø|8\9d\ 6\aÒz\ 1\8bÍNå×{\a1W¹ôÕÆ\83\8dÁ×£Ýöúlå¼ýÁ\ f\97\1e|}÷Þ\ f\97\a¿Ø\93\aÕös(&Ù\9e
+ÓkÔ
+3£N?JòPOê½\95;G¼°R[ûÊ\e\16Ë\89¿~(8\ 5\949Åsú@´Xgyèp\1fó7\99\9e}\\87ûgï^Ö¯{dýÑk/\9bñA+K·ÌãI`\9d\eæØ[W\1a/\ 3\15\9d\9dÒz\1e]y'ßÔÒ^\9cý§_¸³Ø\94\95Ûo·Vªß\1f-ÆO§±/wÝ6\fòÿ®ºúOì\93\9d}bÃábw¼<\18\9eÄ\94ÐV\1aÍ׸\14×^ü-\9f\ 6²\19\9cÆ'\r\17M\83ΰ+\19hÂcíq7él\ e\ 1sxÚ\18Ú\96OZV\e Ó:gt¿Ù¡:\91N\15AÚqN\86\87g\90U´áIÒ\ 5/éÑ\14\893\1e.¹Öyº¢¥=ËCíò-\81ñ\10ÎY¨i¾Ú¶=òP.zRåúáC\19\1e·ZãiíæQ&û©r\vü´»ÃùâDö\11Ä ö\8c%,äôÖ\1d\ f9Cãy*5\9fÖ<á å±í\ f\90\9eÓ\eù\19Zw#?Cãxägh\9e\8c\96\94|èÑb´3Û£\99é¤Ó-RæáüÉlz"\17 \×÷L\1eÓ°e©=q¬\8b<é      1ó\15nE\95u]Ó§gbl\10ß\84¯-WMWë\e\8aKô4Q*e\ 4kÅP\11¹T\1d_,Nx9\ 5\eqiî\1d¼8É\ 2\15µ\9c-\9f\8d\92\10\9d`\1aÚôí\8f3\ e¹.\18âÞø·ÑäÞhþd\14Z¾|ØDU¥\96\9bÏg»\83»\87X\9aÅ r\8d¾\8aA`<}>Y,Ûµé\±þcoO\9f\ f\90\14\17\7fe°½¬Øl§á¾<m\18\97¾\8fPy\ 6ç,<b~îíÜz¬±\ 5·§{í«è\1a\9b\8c\83ÞzÊ\15áû\90\b\1f`\1dò6¼½ß.ÓøÉø¬òhÚ\r\8còÓ¥\ eë\8c\1f±\rÖ¿Íc³ò\rÇ<wz\10ÂI/<f¨/ûâ\13B\ eÖj\8a/\11xrÌÛ\rF\8f¬ð(\9eCÃ*¼\10i\8fysxtgöëT²RnCúÝÜ\9dý2:\91\7fxÕ¸éÖ^\94g\rQ;é\8bu\83\1cóÉåK<ùÅ88®\8f1\ e\9c=æíä©æ\9b_y®{O¯¼»8ñé/gÓÙ ¯.NytïÙ|v0:aÖÎðô        c_+\95ø\1e$\åVÛÅæ|ùëlþüÎ)¢Ò±\ fÞ\8f\ 3tN\18³\ fÿÛÜ\9bÏv\87Ë;Ã\17£ \84¾Ü\e\1f\9e\1dûÜV,\83½¼ÕÆ÷Û\85Z\89Éþtî{ì\9aE\v~\96©\8b.:\84O¶#Ø\1e\1eJ\10åxt\92üç\19òÃùðð°Ó\87\1e>kû\1d\fç£A+\9c\fÔ\181h?   ]/\ 6¿>\eM\a\8bá/\98\89át\10_³`å\83á\ 2d\ 1\ 2o{\ fñ®\e\83¯\16ì²ýwÚÙ\8bÙÑà°å¿\83ö\9c\8fä\vøjéî)°\ fÇÉ\8bÞ\1f´/\v\8fN[q\18È(m\17{£Á\98>°á`2|\81ØÚöËÚkExÈâhï\19\86w{ºCõ¿ëFÞ6m÷L+b\ ffOº×\8f\17\83£és`¢m\9cí"n»Þ\9b\8f\ f£\13\e\\81Ç^\9cñÚnß³\1cO5"'º9­;\89\16yØ~W$Ð\1d³3N     \8d|5éæ\f\9b±Ý$\14\80\1fÆ\96û\93&âÁr8Ý\1fÎϨί\99¾8\1aýì\17\7ftHO\9er^&½9?MÀxi^л±¢§Nº0nµWì×£]\ 4\ f\9de`Ø\vÃåèá³£\83Ýép<9ÑXà\9f
+AØ'x3º¯X\eüzl{é{\1c»ûO\19HwI\1cg\8eñÍ\1fÎÇ\a\b«þztÆ\9bÌï\8dÍùYZ\87H\8b3\ fýþ)®ÄþÀOáüFyN¯é)\83H.Ks¢4Ò\ 5I3Fú\f£á&ÞJ\8cPÇo]aN\ f£\14\863<u¯\95Ån\9fl:ënW\1aù1=\ f\93\84·uO\14d)j\9aé4Ü\96*ÂÀvÐ,W\15ù\aÃ_F_¶7ì¸=·\9b½ \93\13Á_\8bOî¾ûý\95ë_\7fôÞ\87ÃoÞÿ<\7f÷îÕ­\eóO\ f\9e}ðtú×ÏoýõýKïm\8f\87\e\8b¿\95_}v³|û\83\e_}úñ\97Å'\1fÜùá½/oÌ\8föª[7í\97õ;¦(ÞβÅÎÏ;OßÏþvãÃ\7fmüýÆõ÷\ f\177\16_Økíkn|xç¯sßêóåÖÓÏþyçÆõbô`{üÑÇ{;\e\eï=]y×\9dýoÛ\17V;·Þù úîÓåÎÏ?n\15ß]}\7fó`vgÑ~ñòÙ\95\8fË·\8f\14\7fûzëçÉ{_·¯Ùy\92}¾»¶·¿UÍ\93êÑ?¿ÿaóáöÆ£ãß\1a·ûàÇ\e×\9fßúñÆ\a\8b\8d\83+;ï¿stëÒ§ûOÚ×p¾nýÔ^L;O~üºÚ\9aÜ\98|óÁ\93­gËígÕw&\99\91\9fÞÝÙ3wþ}ãú'ï}-\1dµ\83^lÿëé¿fíOïþ{çöþí¿n]­\7fþÛæ\83«oOe\10ß\f÷\8fÚ×4?_º²wsÏýóÒö³âñ\87×7ßÉß½²õ\8f÷\7fºrcû½¯nm\8f\8eþþñ£Ïß~öáÞÞð9~\1a_¹ùäÎ3yµÉ®\r«ùøo?}0þ×çû[\93w>yïêüÊ\ fG\9bw\1e¼ûo|Àå\e\1f~þ,o_S~øèÇ\e\9bÓ½÷\ e®|ôå\87ת\83\1f>\1aWÕµÅ\93|s¾wÛ\yþ\81     ]îí|¾xÔÎ\õÞ¨ú:Ïö?\18o_\e\8bl¾üèÒÕ÷G[\93êÞ\81|÷wÞ¹±}ûúÛ_ß|¿q\80Yݹý}ùöÇÕöì_W®?Úÿþ\ 3»ûö\8fì÷ãé;í'}\þým,Ë÷å×å?§\98ª\8f·\9e_.¯ê\ 6\7f'3?¾ýåεáõwoýõÊws¼¦Ä\1fþÅ^ؤ}M¶û?·\vþråã[×õ§ë_ßüBÚo¿\7fó'éÍ~ko·;ø\9bìÊÇ\1fß|ßî|òô#íèë\8f®\7f¸ÿó?þÅÕ\f#nû»»åükÚV[\9f\87!üØ\rÁ\úè>Z\8d
+ÒÜ_·v\1esº[aá\93¢ü®üyoóáÎÏWv\9e\ûâß7\87Ã÷þ¶Uî~õÏæÞ;ß|µyw{ëÞÎ\93\aã\7fßø÷\8f\1f<m_³U|ûð±Lèwåþw7\1f\9b+\8f\8ao6ïÞÚùùëÇÛã\9fËk\1f>9xçé­í'\7f\1c~üSUÝß\9fu/¬\1füûà\8bÍ»wþþÅ­\9dËû_Èìø¹\96#\80-°<Üøç\95O\1e\rÿ-\9fôqY\ fo|øpù?\9b\ f?_\1e­~\or£\99ð\8bñÍü¯¾«\aí   º»\8d\bÊ\9bßí¿óÔþtý\93\9dìÖ\ f7rî\83ë?]¿µÓî\91¿¿\7fekÖü«¿^éäÆ\8bë\17C¶Ï'Ï\16G\9c'|M<U\9fßùtóñç\86ûæú\95Ã\ f\7fºuéÉ\17\e\9bÙõ\87ßÙË\7fû×u\19I:#åÑýftëÒ»\87\97·\9f\95÷\9fß¼rgãV·_Ûsðí\8cÌæÁÍ}lÔ\eíé:x·ý¸·/o?}vsQ}¸÷ÕýÍê;ûu\7f\1dî}6y\94tþ?\9fÞ¼úþn³nY\9aç£/¶Û×l>ürÿJËl>nv¶î|û|ÝxÙ4j÷é·Õ\93öðÜ´\99ý´øruû,ïݺ|oòá­\1d÷\9d½òñ§?\ 14¬û´ö»ö\9eܺ¹ãª­òêÝGä=\eæ³Gïó­;×~:üûÖÏËý\83­ÉôÑlóá³oþÖöñÅ\95ÐÁáÍ÷gÿ°·Þ½Z}¿yÿɳ÷ÚÇ~|w«¼rç\99²ÎË;OÞû¬lÇ;{&,ñæ£o>ó\1c½}Ã\17?>ÌoÝxúÑ7à÷?íì\16ϾÞüê\9d½EÚîÝÍû\ f¿\9fÔ?O®^'wëî\ 5¼¦k0û<»¾õüÒáøÖõOÍ¥\88Õ\7fwÿïÃxZÚ»%bÝ&Û=ºyé£\7f\7fÝÝ<½¿bC_ZVOÛ\ 1\8e\1e¬4¨\7fºòáíÅ\93\96\7fï½í¶ÌÑäûÍ\a?}¾­\7fm6\7fºqý³í\8d¶ÉO\8fZ~pçÝ-óÝÑãÍ\aG\ f\8bî¯l\f\9eÖR\ enÌ÷>xW\96,>¨×¾½þÉÝíiU}1|;û|ùý\8dì\8bK\a\7fíoe_\98ýMùés`\93~qé\9b\8f[ÚðFL3O·ø\ 4^\137\1dê\93_\zºí\9fü¹ýérsO\1eÒÇý\e¤#éíðVÛî\93ûíO?ïH\13m|¨¯     \ 3D«¸#¾æ`§ßG4üðÄçÏ÷wt82&\8c\8e½´\83àkäKÙ%\86uyë\81д7~\17_\83Çû³\14\ 6Ý\7fë\9dë:;m\7fò5ß\7f\12=þùòÿçî½»\16U¶õѯr\153\ 6PQ1\ 2\92s\ e¢ \98s\1ew\8cóé/øvx{íÞçì_øëö\18«[\17XsÖ¬\19\9egV¡J?¾Ë\1aÅ\7fùøwk~ä\17\ 2ì§!ûÚ7#|\99t\92\97\7f\8e\12à¿\8d\9b\88ùsµþ¾¾ÿ«\8bñ\8f\95ø-¦\9eb~Ú+VõÇýþð§©þ°È×}¿ß~9ÍÇ}\12ÑÿªÄ¿\9bÍ\7f²,\9f9|½ú9ä\8f«\7f¼M|ã³6ÿÆ=þ\eß\98¤Äïóúí/ÿj¯Ï\85\8f\98¿Ùëkº\1fcü´È·Y'7ÿÕ®\1f\aù6ë\1f6üm´\7fN<þÐ\ f\81¿ÆøS\9doÑú5a\7fø\87Ôd¼/©îð+n~/Ù\9fKûe¾dȯûccü-d~Dfò±$\ e¾»êGÖáÇÚ$7ü¯\9aû\7ft\9a\8fÕݯÉ}ó´_«ÿûC_ñ¸\1dÿo9ãgY~LøËh\9f\98\17[ÊÏW\9f)%\13ù\9ak~ú'&,á¦-\h,¿6c\1e°©\7f¯\1f(~\89«çV¤ç\92×¥S¥jRÖ uÔíüD\0\95L\8cgÈ#æ\0Öv¼\ fB\8cZ\1e﹯Úö\rc /õßÓ\9dïX\ 4t>t'ak\7f2\9e\8fªä¶R\1c}aB\95+N\7f\17½?ø\18\ 4`v¾\80\8ewo}B
\9dø>%"\ãú\85T0#xD        ¸=agøO1à\87Zteè\14ö+súúÏ«µtÑ\8f\89ª}£\96e³F´ÊõÊ7j \13Ñ\96\\97(ö7äú\0\8dþ¶Í\ ft6í(ßØÝwd\11ó×\84\0£'úºù\82mÿ2\80Û\8c?V¹Ö$}\8a'\8a%\0*ÆòÈäÿ\84¼ü\aÌå\ 3 þ\ fÉË\7fÀ\~ÂÁ_\8eZI&÷E¬ÿ`ÈÁñ7\83é\9cª\ föÇ:XÙã\ fØäòÄ\aáþ6Õï¡þ\7fG<>|û'ãb§¤@´ò±\84bDh\98_"´ììõ\81Ê\10ÏÀí¿\98ê;Uùxÿ°%TIîÐ^ü¶\B<\12ãýX\ 2ü¶í\93\8a%Än\1f\87é\97\8fþÖäßq\8e/\93\ e[­Ò¯8`\88Skë\7f¸A,æ7=øWU×
\1c³ë8δ~ÒþXƯÊ/æ\96\8eP\14ì5å?Ç\15ÿ\r\87éç\7f$\e\ 67N\18\18\7f|{\87\97úH©cV
+ýAgÍÒ:¶×±ù?4\aê\93#0ÞMSÝXã0üé\ 2³j<áj\92\ 5\88£\ 4ÆDEÝ4\7f\ 5J7á\r\ 1\ fR¿/üòy¨»:\9f d©ø?\98t\8b ûÔ´úk\946\1dÌJ\0M]ÞIxÖ³è¹óå_åLÍï´\97"Oh*¦Ö\8bÞYþ¡êÛËâ\9alØ %ÿyÁ94~\98ù\9a\83ÚÇw¤Bâ­zb\9eÊúñ\ fÑ?Ãó\1fÒÿo\8b\8eÅüòL\1a{<vV³+9£\8f\84\1e4êÍ\13\ 28\86\98û6¸r#X¢ù& ¸l=S\7f¬\83\1fàhO¨üº`6ïÕ=þÅÖ¨2öHó,]*\96\9bqêrb\ 2T^]âr¥ÓtXLí\92¹6°~\14\0G\ 3\1dhìãj\88\1e>îþ-WÿK«\83­\90ü£4ÿáiÿê7)jøuë¯Hþc´ÿ,\8cë-<÷)\89\9f\9eÍÿ\14É\8dß}Êÿ>\8c¿i\92\84\16¯\9bñþ¹o}Ú\ f\15?\ 6\15Ô}ü\8f!ÿ\83nÀ·qµT\Ì\7f\86q\ 3fÆÂésK\17î¤ä$\v\14\85\v\1e¼úZË\81 ¯ÈÕ\19-ÿtÁB:¦ó#\88\1c³ÀWqª\SÃêWÃà«Ûæ\f\90îz\9e[ÿ0\15«Ö\88SU\87ãA\8dË\a\8bÄb¾dÊVgF\85\8fÕߦ°;\11\14~\95°Ý/ï\8bsp+\93\8d\8d\81rI\rÚRQm²ÿ\13Ù|ò·ÿ¡ø?J¸¸M\0\91\9fõüëÖv¿A­©@\89Â\18±ô\92ܳ)RK\10\9aâÍ\ 2ªÅ©Ðé|á\83\1fò\e\0Ö\1fY9\92;ï}\ 2±Ý*®\95Ô-®\9b \9dÄM\96\99µ\89#¼z|\a0_\ 5fP#9_,%\bDÿÜ\12çê¾ñ7õ;f.cÐ!\90óÈMl2âÔÉ\94I¾P,| Ïï,ð\81\17Ûì1ö\f4ÝÛd\8cÝ_¤6㲪?)°ÔÚ|¯wÉzÝB"ÀìÌëõK´\18/ó6Õz\89tB
+       Ä¬Vþ¸\96OA\9cÏô\7f\8cñ«ä~úºÒa³éîó\9a\14c½2N\93\1e[úÛäþ¸\ f\ 1c1½ÙÕ\9fþwwÙ¥¶¼ì)ÿ¸¥·\ e\8aÇOß­+o{{ª|\9dÀq\9aD`Ü@è\19s~\95òÉ}\87_Éæ_|  xƵEÚ}Á\9bQËeÆòØ\1eýÃA~ì}<R~\f©ïz¼ÒØý\elü1\14T\8d-ì$?\ fðÙ?ùË:Tã@\15\ 1}gûäID~\ 3ä\1f\v\19\0)rc̯ã}:\83ÄþÝTðË\90»þÍ\91>k\93ø\9er]ÞPiS\83q¥K       X\8f¸}\87å?të\17°G\ 5}'\19\1aÃÛ³\95LnÐy\8d\9a¬_¹\7f\98\14=<òf\8c\ 5\ 2\ f¿î\94Rb´?]æ\17\8aú¼\9dþV?VkÄ}s\95á Õø\9b\97 G\9c2ñ6ª\7fðdHn´gR¤¿²Æ\ f}Y\80\1eã³-=ƶ:\9b\19À\1c\8eÖ\8eøßoÁK\aÌ6¹\ 5Ý'_ßÔ\89ó2\90ƺÎz\8bun\8fðÓÊü\8b\18ª^,}Ö+ö%u÷\9fÎõ\vÿý9J\9f9IgpØfؤÞÜ'=ï×j5â¬I=\93\16¿\16ûÈ!\87Ù\eóýmða\8b\7f\93U}UÁºòáø\r¹Ç\7f\99­4}\19ÿغù\15·w¼\9elE\10ç¸\1eþ±\ 4ùSm·\ eæ?ͽn~·\b«¼I6x>ÉrDSýb&kÅ\1eéÝ\89³2DþÕi´t\Î\8e\93\ f\80êÁ\858é5³1\863käÆ|Ä|\10Ú\9c¿\85\9cÍ\99,\9d\12°\a\10¼ÈÍõQý\8bߢq\1dÝ\16\93Í!\97\1eoF\8dßaô\93ß$\88¡\9d´o¿ \17\9dq\ f\8e\1cw$3Ì®cÜ\81¶¾:·K{òü5n\8f.p+'! Ó$[¸äº\1f$Dâ\rþæ\88¿¶\89\1a¥B±\83<zN\f\96\98\ 3®ÀD#fã£#Ö\1fÞ\80ïAù\13\1důVµo\86\84\9eåIkh5)\1c©\bZ\922à¿\88ùÜõQ5 ëæ_\8bT\9a\16\12¹Ä¢+Õâ_ì\95ÇÛ\86DÇëà©ø\15ß\14þ\8d\98ØúBçß\8dQ\88A\15´íJ`#®­f.õ\1f\85ì\1fÞÿcmþ]\0üêÛC¯8\9cÍ\v\ eÕG´\16»Ö\1c¢\96Þ\ 3!1övÿysù\9a\0½Ö\9771\1evúl?þ\84\1cà\80\9fðß\f\14\97¡\19qjc\99\ fÓø±!ÚJv&Ú¥w\92:ôneÓ\7fü\9aë÷^\85Ä\16!âtºÍÿÁó¿yÚ·R\1eQ\11ÔÏ\7fÇ÷?\86l}]ÀO\8bu²§\ 1$\9b=\10®_Å\17YVî«\9f\0êøþ¥ö\1fõæ#&G-Ó­YÌtR\ f\9aêèì?\11È\9dÕÅ\ f\9dîmι\Ìî\ f­ß\10é/¨@\8aó7Uý,x"æ¿\ 1\1a=\87\ 2\95<\18Û0¨üw÷\r¥8\1e\85L,\9a®þMt,æ\97t\aë\9fèâw\80þÏÑ\8c\7f\1f\80I,ßÇ2\85Î?\ 5\ 6\1c>'èïD\99¤ÎdV\83\82\12\ 6#×ö@·ÿ\ 3ëþ¼\8b\ eOµV\9c0['¬ín)¼Ã<_ÉFz\85\15{\f[çgoÝÍ\9dãYëÅï¢\87÷ó\a^~2ôh¹þ3u¾ñNtÛ~«\10\9fô;Ñ\16l\f\ 2¯Poó^?þ\99\88¯%²öí\13¿ö\98?\9e\93t9î0jÄ`Ü il\e;»ñ6Wÿ³\e·>Ìøc\89\84%H±\ f\18¤ô%Ü(cñÚlK\97?Ä||\94Z¾Ó!Þ©TÓ  TlýÃÉâútY\13ÍãjÕ²­\99Ýi\8fÆìxç¯Ò      \ 5Kc}­\11\90\82ÐOÿÚwþçÇ\12\9cF/r\14Ö\9bY1"mk T/ß\97\9f\1cã2¼¹áú    qþHÉ\v\17{\16Ý4)ð\8dØû\ 1âö·ìúó\10\80:i\9bá;ù\8aÈøÖñ\80Ü"­t¿ü\9eî[Ã{\89\8aiRéN÷éå\ f§ü\95«~¥©\9fééGN{þà\1cj\ e\1c`í4ù9\8c\10k2\e·\8dÕµ\9f@õ[&¨üî\88vW«¥Ù­/J*qªÀ&ãNÜK¼6/âwÿïë\169\88Þô|öÞ%'8ò\1fòT¹\94Íæg1¾/8ôùí¥¯\15ÙÔ*N¼úV\ 1¿DÛç¯<÷Ç\90Aýü©\8aßÎmü1®\1dãÚà\1dÛÐËÆ)N{ÿ¾úÃÓ\1cÜ´Úæoó¡Gì Æ\93?;\7f´9\13\9d¸fÝ '\ eõåÛ·FêÇ^D¾o\92¥}mÙ/{\ 2\81wÊ\2^n\9fÌæ\13µ¿pÒ¿³þÏ\ 5ú\ 1ý¨\18c\11K\\11Ødßuë%\96¨ÿ¡\93\96\8ekÅÚï-\9cë!¡¸5ê\90¥)ôº§\ 2wgŹ§âýåþyËRüÃ\8fd#ÒÓ\7f;8]|õ®Ô²UD\b©XÜ·/\9c\ 6~\bû?ÛØZ\8c\ 5$:\1f{ufBU¼Î\96h:\8dÊ7\17Ø\aå-n\92ÏRë.,F\83\98A\17böÕ\87ÿ\14øk\94Ò \89\9b¨{\1c\90³½\a|s·_\ 3\7f\\83Îÿn\8c\866Þa«
\9dÆÎ?`\0Tצ\0]\10\88N²6ê¤|ýf\82?:è­_9b\9fpT\84\8aL
\9d&ÿ\10=IÀ\ 4»útº\7f6S&è§ýòaÒ\rhõg\7f¦K-æ\872~\19¥Tz^\98Õ\93 \98\92|j\ 3ýVðçàaÐã\14Vou]+\8ag³¦\7f`ÇØá~ä\r\1eJ\1aÄ        þ+Æ\12¦ßûü­.0û\8fN-!h\bR\12\88ÆÑ\a\96ãX2\9fÔrÈÆCY¹[\ 6µ(?\83n\9d\84IǺ±IO¿\1aàænùJ´L~ñüç#f\7f>ÈFþü\11ôäë|\7f\1dQÿ:¤\97<°{ýºï\9f_yô}\88\85\11¤\r·~\7fIr|ãïGò¾\1e\7fþrè7yÆå\1f\ fäÝ\16\97\7fù.\8f\7f>üöõEÅ\9fï\82ûç!Â\7fyNnwý\7fÙý¯/kø\1f~BþRº"¯t¶\9aò\86Ã\ 6U¾å°O\81A\15\9bÐ\0\91\14\10í°T\16»\94°®\82½\90w\97Pþëó\91ÿ\8aÿ¤RÅ9\99J\95òéTªÀ§ã!\7f]úñ'ù\95z0¦­ÛSü\ 2x&?R\8fa\ f\8d\83ãWÙArUd\blÍ|´Ie÷ÉÿA\90G!\9aÆ/r\85ø¿ð\95¼\rþ|;\8b_­¿Þ¶:Iÿ8UVâ·He\9d¼\8d¯bþé×Ûø³æÎÿ¼ý¤\rÄ\8b\aÛ½ùøãàø£ÛGÍ¿\9eÔ«<Üú¸»8Ë0\9c»w\8d\1f³\8a\87ù6Çÿ\8a\13ÿlð_qðÞvqdBé\18\89\ eÎ\10\9d\ f*\ 1\89\92\96\98;¾­\ f× NÎbGn>\e\10ÆF\8a%ç©Ø\18ù     \15«\ 3¡dÕ?Ñÿ\95F\8d\aü±ëÇ\84ßþMìÔï\972±¾y&ÝÇü4\80ÓÜ3Óy L¶\94Û9ÙSÚÉæ\9c\9e' y»P\1eM+\85\83\9eZ\15uKi\96ºôí\ 6æ\89\10\a·r\9f)kD®]é\12ÍK\15ÈÃBuî\16ò5®ñt>§WüU\1dº¶'!l¿S¥úpÖ\17\e9yvi,+ÏN\93\8f\1a.Rç\95\14rÑèfË¢a¦Ý\97
\ e0Ë>;á\19@P\ 6ÎÉÝjvãw÷DcÙS¶þ±ßêT_ýûÌ)\ eÜj©\1e\8b\19\ e§no\94\11¦È(8²%\8cl5\9exQ¼lðåÒt      öÞäÆ\95Ó¬5Þ\8aÏ#)@&FUçÕ\1dµ\85Ý\ eÍSo\8f©h\1d\80Yóã\11ËvY\97+éµ\88[¤z\11OôñP\0d<¡Á\82'#\9aØí=(ñú6[\92ªAY\19º\9akyíX¸BÞ\ 6g5\93ºâª[\10öZë~GµÃ\ 6\ ftn²­\18\85\ 1(\eÓ\ 2\7f7»áªk\9e\1d\84AË·\8bàëhû\e7ç \16\9e\14rçÔËÐ._\8c\1c/\7f\16vÞd\8ad&\1d\9e\1c\89\88õ¹\ 2eOsËÂzê±ó׬]%«³ý>?\f\18g-\87Ù\ 1\e\84n\19¾Î\91Í¡8ßYFwA÷Z\\ 4¼/Vdg+β~BìXÌrµ\1dÛ+\¥\8cÕ\13e\94µ²\1e°\9br£2ÚÌÄSc\8b\9a<°=\18©Í\8efYc\9f\a{ý\Ë\1eªÃ\81w\98\8d\ràØnM\aÇõDROÃeyz:1lp&yÌ=?.uà"\11aÒ      ¹æ\91Ýâj©ÆýV\1d¦Ò7\7f\r§ï\8dñ:º\a\12]}ÔQáýp;aó\99\a¸\\12 ótmÙÓ\81b
+y\0\87ºüʨ\87Ê!Û\18%\91Í\o9^Ýïò "8ùy'è\15F\1a½\8cÅ\14\9eÔI(ÚoúTêÜo÷Òå\1eW=E¬r-
+Gåu¹V®PÓðQÍñ̦:å{óÚ`\8dÏjO£¨Æþ°!a¤möà#&·êâjÒiT\15\0k¬óȨI\13½!R\0\8cäD^\f¿
+J\vo¯æm`á¼Û¾6kw\ 6r\1dï¼\8cHAí\97²è¢:\a\84\99d8ë·Õ4пXzm ®\1a\83aý±\97\86\87¡\1d\8cÄp|Çj \Å6V\ 6ÇÙ\11A\10\9f S"\9côÛclÙ\82ÉÔ     \ 2\94\ 1¨N´¹P\17Ï\ÒòåÉ0Ur\a0Ñuj²D_¨p)«1á¬ó\1dæ\91\821å÷5\b\12زï\889mw\15=έHm\9c\19I\a´¥Ëlþ\95Ày%ûZ¥\15÷íµÕvJ\96Ô\ 3È­4v(\14õÜ\bCuw{¢\8c\16É\19ƾQ_\9b\90³²j\8d°¼"\11Ùí}T·O\192p\ 4º\81º`µqsç\ 5Ìô0Ðè{o\1e(Nìv\98lÁúí¶qñÏ~x\9b*J-3\83Í°>Û\17u&\10.N\14VoûJ¸%\ 6æ\9c·'ÏEEÙô\16ëU5\88\85\96åuÝ[®µ\v´â\98I°®\f\18\91©ó\86ßñʶֲêÛ\9d\17\1ec1;  º©{¸¶\ 4öûÂex\10VgëXEç»ãZc\81\137¬ÎÎUa)\9ew\bؼ\88.r¸Bó*}Ý\aï÷M\82xì^\e\81Lì7vé1Î8ýÇë\18v\92\1cYH#©å\ 1\802W-\16\ 3<êûeÆCçëlÿ\81ײÏõ\1aÉYÃt#ßJ{©ü!ôô\ 27\83ÒÅÂ\88\9b\16\17e\b,\11/\13\ 4\ 1¦x\ 4Ý\ e$\94ÛËl®|ÊEFE\18      `µ¤Tìj°=VkôäÖ\1eÅRr¦\0Ò:\v\a\86\ 2¯ä·S\1fo\ 3¨\ 14Å áHH»Ù.×\ eÍã\1e\12\11a9\80[àÕº¶\16\ 48kãs\95ïļ©Ûq\8bû\1a\8a\16g\ 5ôÚ\9båºj¸Ï÷ê|½ÜÛ§ÉZ\9fw§Éfÿ \1c\93µÁ\92µ\98!%CÆ(?Ý,â$Ê\1ì\ edñô\8a©âÞüÞ!z3\1a'\1eê\81\e\9b½\86B¶²\9aI\9eü½MÉ©«A×J{\89^\97f$C\9d©\ e\9bÓóEvZqÎ\_Ì»±\18î¾ q^[y9\ 1\16½\89°\ 1Í\8eHÙì^Ê\ 2í±äQÙ\87ÜÙìEùÜps\8a\18\88\8eZnâMu¾ëm5Lí³Ú\9b窺\15n/F«7\ e\8dS\1dvLIj;V­m\85Ö\86n%çrm®ÒB\9c2nL\9cuµÛp9\8d¼xUñ<óvïÐ\99(¥÷ÌG"óäß\1f:4õ´­>Ã\ 3º\10\94à\96\17ì
+£^¨\15äÔ¼ÛÝ\ 5\vÀnr\8b(ë7#\ 1Ï=\96M¾ç,\1f\8eŬ&ûæjM,§õM     =
+\9bMVu·bç4ÙÁÏ\83±;\ 1ä`¯\82ýÓ¡1\9a4\ f\a¹×?
+r­z\ 2[µÙ)Ð[\8fsO"oç[y´ºhå\86q\85\8aÁý\1aU\1eÇÛ\0\7f\13Rôb1÷\18vôîçL¾þ\18\98éö#ì\8fåg\91/&\90'§¥+)ö\0\0Ç\9d\ 3,ÔÕ!CNóÙlFª¨Y\87¼/sHcrËmÛ\97[~\1c\87Mþåµô\82Ú׬"ܧèâZÌïKcø\13\9e¥÷(\9b\ 6\92\80æ»<?ôß\95ÁZHU®û0W\95ÀRµV\9aN{µ\19\8a²P÷p´¡³*¯aaÔI×\8bí|«>ÅÓR£k\ 2ÛÆ%\ 3×\9a"7\14\11\9d\90 ºw[\ 3¹\17|ø©°\85Ú*7p:5z_ê,%Ê@\89Y¡ØM-=£k=û\85\1e\929k\89{¦úL´$\a9*¿\1eLò84ìX¦2<e\17§\11Ï_\eXa\9b\920\7f{\àh8yá'\99\84\b~PIznãBz­\8c'&1%;ùË\86<0£+Å\98Þ\83Î(ÛG\f§öW¦\91:\9e\98UxÞ±xk¹`\1f\91\14\88ÓxÐ@\19~z\ 6zBç¨\16\85ý"u\10)\89°¥\14±\1fKz\r©ÊÕ\8c\9fìñÈÁµ\12(ÝóDR\8eïÎPeóGHËàVN³VäC¯\93ØE_U\88\93\81ÃöÍx²é\8c©U&M«VU\ 4+âí\9d\8d·RmûÝ×\97\8ey\93Ænó9\aÝ\ 3\8d\=¡tZNÊ\8dM\18\8b\99D\v\93\eã>Í÷\98Æ4¤\ 3k6N¡`\90/Âa0\ fX.¤\96éî\1cdßíù\86\87z\v©¼â¢fÃ_D·{\J]/®;Øô\98]\17;\v\15òã\8d\86Ì;Û\9e\14µw¹a%á:»\r\17\8a{í&/\ fxzQ86
+÷Õ);\15¬ÓùÎéçÅí\1e^\9cþ\10¾Jå´w#ºíÛ\1dYàËGÎ]ç\1fÇ\\13~<0MäË\97Y\9fÏS\1c\119[Sçæ9NâSÃñCOç­\ 4\ e\10\96ø\Å 1\1d\91ÆÜdUªð]*«\82\ 5ó\99åk\17áÉ9\96p9tG3LjE]\8f3¼¨å=K6.vS]\80óJè\98Ë ÀEp_ºÅíªõBK&í¬Ð2¨:OÕ±Q\127j\8d\8d4¥hà\ýÂ\83\8b\99üì)\8bAÓæÚ×\98\93TÇx_\1e\8c\11\88£\ fÄp´P;\98T\1f(8\17\ 6\8bc)5^öÄ\10¥\9eì)\ 6ªûêhp6\81kÆc/°\ fx©sHh¡ùi\86q¹½Xc\9b̨¡\9c\ e×·æ<²:\81\98\8c\15n^­­nÄ\12îzù\9c\96²\9fÌ'ù\ el=P,d\83î «¶\9d\12h´ÆÐ\91}öÞÒ(×8\eêk!è\g\82¬\8a%j\98p\rùö\ eî,\ 5ªÁ®\ 2ä\1e\93\82°t~ÙtK\9b\10ì8ÏÚc\ 4fØ·Q7\a\ 6ºdo¥§\8fÀ\83ËIOå{!\a>çÆ\95ßU¥ù\92Ø\93,r°¦áÊ¿\r§hzB±\ 3·\9f¸\80¢F\ 4è\92\ fº\11«\1a\8d\87¬3ØZà:\1a²×ó£^ °ME©.\v\11[yåg[\feïQf_õX°\eÊ\ eáù¯Y3³\9c³}Î\ 1è[\1f\15¼\9a;\91X·?-7ÃÜ~i=·Å¤ÁÏ:À¥{ÙNoän\87NglZµ¬°ìEÛè Q0\9bg;eù5Ùög׳Tgñι5Ì>ú§IõÎÝY¿çõòws~\96we£(e£Áv}\9b\93&GlåºH8¥\8a­÷ªIYã\90Ñ9+\\94#M+H0à\86»\11-X>©7\97^}ÃM\80\Fl¬1ù´¤o\91\94±\9d\86Ø\81duvÅæ¶Xê\8f     !´Zy¹uF¶\ 2gg\8fÂø°V\av¦:\17J\8a\94\12\ 6¬\9c@\8e\ 2îLª\ 2%
+¨X\9fcÊê
+?)e¾îñ\82µ.bVÈs\86<Ì"e¡Õ/jÔ<ö      ©ËÌ*BV=\97\9bi-%\8aÚ^\81\ 4½#hGo\ 5Zfá\16\f\ 4£\1cÑÓÛ\15ëk×]69b*\80\83ZE¢2\8d©
+.\8f\14\7fÊ*\8fþ}\aGò¤[ìò;*Íç\85ñ<+\99*\90\15\9c^f·¼\ 4­¥Ýª¢M¡\80(+s\vVj\86g\17!~NÁ\r*uGN\9a ¡\12oú°Ý 
+BrHF¹íS\ 3þy÷f\87Ày¨~·Í4\85ò½ö\9ef\82ÍÒ¹µ\90)ïß]Xt·\ fÙ|Çf\88kòÙï\8fØHÑUíæóô¦²Ém\8bÓ\9e\9c\9fH®ÐñÕÔ²¸\94ÖÓ{\e×ù\0v\92\9d^³Àé'¯>x¿øñXÌ\92äÈ/Ù)»¼âÛ\1e Ö\1fP\1a4NK£À³ânxHm,0ZdH\8bßw\rÈ\1f½%;¨¬¹+O0\18%æç\ 45©å;\18_\1f «ÞÕ\1d\\9cb´Wb1|å\91³s£@MK\8b÷2+dæµ \92²
+´¼\aÏ\15Ï·@Ä\90¢û0Ì\86Æ\9b¯n\98áøÕÌ\9cýROnðYò`Ö-\1dXÛÙ\ 1¼\89ë\82³Ú\15o\87\1a\97Ù=ö
+õîâÞ{rN\1a\95ì1F«òp\ 5Ù\ 2z\97\1d\aiI¼!Ó\9eàïT\ ei\ 4\98\94?ϵ\9c´Aï|±s\13\15¯8¨Ï\9d\90Ü\v\17mâËÜû\92Ó\89]$\b(<íI\9a$fÆÈ:]ã\1f)\14\8e\9ad\81:ôÊKüyV>K
+\9a\917ÏQ4RÜê      \95'OIö\10¥·\93;bZ\93Ü¥©ðZ[C¤V°\87Åkùmu׬´\12eO|\89JÚõ²\9b:\10\8aÝe±*?%¤\1f\86\95[AOy\8f$§I;_\9ck\1a\99\88yá¤\14ôh\13r~&ÈG¼z\12ɲËÂF\1eíÉÀ\9c ÄÅ\14D6ùZ}\1d\17³ûM®HyÒíϧ\9aq\r`Zªî±%·\2¸¶­5l\91\r^f·Ù>&\8dJ\15\1aÎÚbq\19\97ô\8eä\17%`\ 2äeù\1aV\83ó¶\83»\9d+z\95(ÿ\1e¨+¶ý²Øç`#\1a\96Êá§ç:v\8cÀ¤D W9Áà´ÒÕ¶/m.VWÃùº\ fx̬×GKÒ\9aಠ     \93¶¢KèEgû-n+7\8b\83^ó¹íW\8e%±¬®vèâ\14\86f\9fx\8f\84\85Ë \99s\ 1Ü\89\91\8fër\8b@f\ 1:\ fÓÁº bRe\15UÔFÛ>Oî\88Û\10ûÚ®\803ð¼é,ï\95ä¨\9c°HãKh%Ѭ¹\91õ\850?Ã\97Ut+\14Wæ 2\91´cûâ\94Td\17>Z\11"\1a\922cCàÒó\9fv\b\b×~ÛAéÉdëe\ 5æ%ȯú0ãØÇ\91hÖ¤\9b\ 1v¯ð´O\r>©SÛ@®FK\1d^¾fÒUV\1f¤55õ\f       Ì\16o\1dv·E\rùb\9c(¨i\ 1inÐ\93U¥ßym¢Þ»¤\bó\1a~ÒÎí6k\11\15\97\17\8ac§¨\ e+n\96±.\17\92\ f\9bcO)U\80äY\83\8eµ\9c\xëʤdª;=fªi7#\94f&¯3n¶ìË\ 5Û\97\11²+©\v\ eËË\9dÙ½ ÕGtZ\19§æ\ 4\96v\85º(\96ä\81\8c       ¾U\9b\95Øæ\9dª<6f«\ 5\1f        ;\1d\98jI\97CCcØoÚ\97ÔZíñ\rH\99³\9aLßRk_~È\1c*ëÔzÑÉ\18éHz\97ó\81\82\ 5`\85Â5\11@ooíÒ|­&ËNgn\16Ë\ 5Pm\97\8e3Iª\16\87zÎëÜä\8b\8f\88n!y~J¥_$"]ÇÛg­\81G=e'\15çÒì¼îÎ\17ÃBÖåe¤ª\1eÇ/׸<õ\81µnñO\ 5;Á%\1a­\92\80!ìhI\86ÙqÔÖ{÷\9d\93\ 1D\92\ fÌ\ e\90¼2$ì\81\ 5 é(\94°µIù\81L'µz¶ªÜx(-^5yåÀÙåY6Ùçsx\99×d3"NiIï¼\vÕÓC\ 5\8c\´;KM´Þ\9bC\15¦\10BTc¯\9a\1c\8b\18Dërô%Ú[)Å\1d\7f¦6\93FËÅ\1fRr\1cKº{à«Ý\9a\98-\9b:Í"   \99<GÀ\10ÚN\85@\8bzÚн\9e¼)\ 4\11sý6­)3\ 1\91E\9e:\9bS¿Ò3e|]#\87ÚìBz\17A±$|¯\85U×/¬\r̸cây~\1fζ¹\ f\80bG1\94°àõ\81Ó¸z\9fb»}\160*.=#\953l²\9cV\104êxà[½gyÌ\1eìöYU\ eu -p\93\ e\ f û\85õæ\80£\83Ñ&Í¿j1\1d[\89Ù;\7f\8er\f\1e%í:[&õf0ö\1d\84'¶lSåÞ\fP1³é\eoÚ¥\9ar½õ\8bÓû¹ÂÅ\9e&A¦
+!\võF^:R\8d;ùºd-kdº±\7f\89t«6U\ f\8bÑ\0YË(/f #©Äª\ 3éáðH
+Ùê0¡Q\16y\15\8eö$U   TâÁ\9c\8dV÷ÕæÛé`¨\0\ 5\83ÒÆnúÕßßͱ\9c=ë)å]+8\95:åsÒ\9d\95
+\ 2\ 2Óþü°3\9bÇbÍÌ÷¢\8c\8a\ 4\ fYoipVϵàÊ\980ofâivùµSÇ5ÙE\86gû¬è ZW¤ÑÕK7eôÍ?å3f¾\17õ¶]\1cì);{­2ú®7\82bH{O\19\9b"\9a\vìÝ\1f­¬\93\9eÛ\v;E¯õÞåÓ³hjÍÔú-k£ éÜúó\bc&L*'\eóJpVÂ-ï8Z\1e¯ia·\9e#njZ´jôÓV\v(ä @»c\e§Ñ»«TÃÓ"]áµ\19\1f§Ä\829¯[MË©\1dlÿ\16\11\98®ù\8f\19×´\ 2ÑÝ¿ød³_\9d\93\8bL\1fèÎDÛ÷6®Ò½àåò´\ f\1côlº\9e\97ksêä÷vÇñ"Ýxó\86x÷®ÊèÚOÏ\1a\9b\89Ò\80#\8cðÜ\9f4\83\12¡\9c\1a\14Ò\g¥©#íò\vù\8eÏÌtaE%\9býüÑéo=õ±«\1a0,ÝY0gàöý\1d\14\19r\ e7Y¨æVL«\9bÍv§[-Ç
+\\eÖ×dq\ 3\ e\9c\88eßfy¥U\v­\92+_R/þ.¨ s5æ)        ®\ f-\9e\8clÞ"sµä©}\1cÐ\80\1d\ f]r\a£;ʵb\88;½ðÍ{ÎÓGûñ(fÓm\92/\9f¼\8a\97ÊúwÝ»\94H©¾\1a\16íþ3ïЯk@\8b¸ÊbfZX\ 3Ýö\ 5Ð\84«Q\1dëM%\e\81éý}&VëÕ¤;¨â§\8cê¼$ETe\ 3k9øæY\15\9d\93!(`èªæQ`R\98\84´!¹Ø\1f úòêí\1aùý\8d\95Ô\1eÔÖÖÕZ6Ö\ 4\9a\98\1dWæò#\1d\\8b N*\81d\9d«õ\80¦\94N²ÿ¦®\83 k¨å\8a\84n½nCqe(¯-öåsiUZÏ\95q\a|*Ë#\92v\84A½i£LÏ·ß\8d\ e)VùRÇÌ)»\96ÉÏ\91
+\96Û,r:êÐ;}T\9aJõhc3\9a\80ÖPm\0\1c\93¸I\ 1÷L\9f¯®·#\17\1e\92¨\16\8acÐ9\9c\97iKn´D:£á)\8b«Q}£®gPTDò+c?=\164,\9e|ÉF´\9eê\ 2\8d§Òs´\8d\93÷\95Ë\14\ 5s¦=«?wÂÖ¶(¯\ 1í\93\ 6±   ³©ñ(êm<ûÔ\1fòzQ½\ 6u=Ç\9f¬Ñ|Oªï\94}Lå\ 4ÿÉCâ5ë¼ö\82«\91\96ò\9a9­°ku«\8aL-\8enk"q·¾þZ\97]´kã'×\11X^«ÕÚë\92\®%§%U]·L%\95{f̾zñÙ\fPxúDZoq4Ò}2÷g\9du\99\10ë\ eÞsöÈV\91\81j]¯\80\ag"åÎÊ/ܶêGë\16/P\ 5\8a\17\bîO}.\1fÉÁ\18Üóx\ 6\1fyÚLI\0Ôx
+\9aK>Ml4{õB_mûrÈq/\81;\99Ó\bn\17,ȸñ\98\17L\15\vF$x=©Ë\99Æd½\15!®4}·E¬¶s\9c\9d×í\f\1c\97Y ëw˱z»\13\fͳtU\98¤ý¤\9ff²9\7f\17+SÌÇÊTô)8\\å\1e\14ì\95V÷\ó\80\1e£é\8e'\83È«o#W        l£qy\90Ø\9eð4ÁU\11)\88\r]\95´U~ªd:ù«1V\8b}ÝÆ\82ýd\0\15\9f¬O\9e\12d£>JMß\19­&Ô ]ÜjJ\0\13­\98\ fHx\17@e@æ`c_·\a±&ÙW¬I)ã\87ñ
+Jw\15\ fMt ?]k{\ f\89+~\93u\1e=Ԭͳ\8c¶Ó\85ð¨\r×\92j¸ïOÜ\14h5Z)59ãÉ\v\fA\8dÜ\1ex¸U\ fß{ÏH\±cxµ´B\8c¹;©Üê5H-\9c£ñ\94ö%\93º\17}hø\1cK\ 6t-m\8ca(öcM\80U¬I¾îÓá\8a\92\ 2`lzR\13OÎI¹("\17\88 H\8f\9cìn\ 4[|\96Ù´ö}\1d·.P\v2z%ÿX \1dÆVª\15P\94µ\fÉëÑ°\94\ f\18\1eÏôq\85mr)q²PT!vã}º\7f๭»îä\ 6fm~\10 T\8a>kÃ\8dý\94\91¹\10j¬LzÀ\97\8fóü\9c¦!\98ßì"\8bÙ¼ÀñôfD\b\86\8f\11\8a9t@Ú\8bÞ\11ݼ§Y\84­Ý(Å\11î\a:{\ f\8f\10\e]\1e×\1a\ fe\ 27»<ERÇ\0Ó\ eÉ\89<JÝtxîBWðÉ»\80*Ýài§¹98VÜ|0ìU»¹Ó\82\94­£.ZF*\95};±&S+Üov\ 6¯¬(_¤Û\ 5~:0(\b\0X\bs)Ä\ 3E\jÎ:ݹÀ,\eI\91¶£ºÝËe¤[E\bøíHFº\0¥Ð\11Ê+$1\86\9cJQ¨{ dH_­&8ØYtYÆ\9eKÄk¼t\986ªWkq¹\90
+`OÂ\9d\ekòêÆ\9aL\82°\8fµ\ 3¾ïÏ\12\95\8eúÕ_Í\84Üèph)ʪ6+¹Ê\9có\9br\1a\9c*\85-pµ«\88  æ*Æ~+Y¶\rÊ¥\10h+õk\ 11\15\99îÏ\ 6ixK\15SKPwÈ}à\9dÙ\95ÐEÅ ­\r¯\19Õ¾\89AÒ¹­\16¥\15£\81ºçYo\1d\ 3be\9e½X\19\97\b^\0ÁóeöZµ\9eJîáã×\9b5
+ÝåØÌ5zi·\82\16&MZ\ 1·Æ\b¬\b\96w7¼\1c"\0%iò¬Îd\0«0J*ô\86Þ±/&\87d¦/­±#_\81>uZ\1dµâÉE¾Ñm8sÚ\9a\17±\96mä&ùjþêsúË&÷\16×MObM\1eÉ\ 2Ù\93À7Ö\16\9f©`m?óNgül\1aUFÓh\e¸\86:\1d8K$M6éC7¡¸ö\8bä.V?·}æF÷Ë@\8aR[^z2§\8bà\12¥7sl\15 \bx¼p"\ 5å\ f\8c\9f\8e\80S\9cv ¸;f§¦}\1f²³>hÈ¥\88-UÉþ\84\97X\93\93\12kÒn,C`\9e\9c\0§W71ËÝe¼\19î¡\1cÛ?ó$Äé¬GOÑ\12$À¯MsÂ\19!4õNh\89\ 4¦Ö¸Ì\97\86\84\8f\ 3B\90ò
+):àØXй°\8a\1f\16ôN\b×óÞÌ«½ð¶\ eb¦Ðuo   #\98\10èò\0Z\910\10HdÞöºå\.Væ\1cçÛcë´ÌxÚ\86\ ed¸$\ f'\ 39¬Å\0 \9f4É$|ý\80|eôÎ÷§        H\0¯
+^z Ô3©\83\9f\13\86.ÑTæ.\bíNòô±\86çÙù|\95
+4|3õAå|\1a¯¦O^\94Úòµf()V\a¼I+ÄÀ\0~\1f\94RXwÜÑ}ÒN4ñ\12\91H\81ezzËiú\1e\ 3\r\9c\8eûkî±ÒÆp#;¹pÓä 9ü>.iõE5B·ÇAëLg½Î\89£\ e\87J|U\1a     ä3KÛè\ 2µçÝ<5Å÷\1cË\9bP¦ÈM)S  ÚV\ 3í\19Y\98Xy¥×>\0\ f\n¬ñõ¨æLô\14\11krIÅ\9a IK5*]Y\88ö\17\bï°Ò\89   J×ý¤\7fªc\90¥U7Ï    #\8f z\89/vÍÙÙ­8ë\8a\b\17b!\8a00\93\92Í$aXæ1\9f\u\9cðÚ9Òø¥c\ e\}F\85ÓôæÙiÏ\8bL"Æé\10\9b\91\88VÎúQU³\8a)Ñi\909)Q¦É\97¯Õ\ekÍ»ý-v},Øbgl³;iÑtVfûÉ"\8fÜ\8a+\8e;\e\86{t"V5O>G\ 6T\ 3\11_Ý*ûÄ,\90Ïï'        \86¾´Æm@\88#Àd\e³â*¬¹+E(uª[VÎ\89\9f\9b\99\9cöÙSvD\r¹kcÃsM³Âu/E¿\b\89ã\ eO¢b\99±péºiÎ(X\9e§ô1ó\10ý\89½?\rEI\ 5\1e\ 1;¬5\ 2zÒt'¢»Ñ\ fl\ 4>\9eÍE±±\15®\19gÈU\8b\11xÎH¯£\11\13\10\94!ë4\12\94²Þ@«\9cX\88Y\13MQ&£ìHáýÒ\89m\83áv0¿æh¹p¢dvÊ\8dj\85¶`&\87Ëĸ\9a¯é[s=\88aÉIJ$Ý\ 4\98î\86)YG%C\19Ù&Ç0ó5\16RÇÉ6§Þ[\19\89EÈy±Y\1a\1e=¥9xYl¿\95\1d\9e²Í¬<±¯È\90>\96\9cÁ¬\9a½\ e\1d¬)§\98\8eßHÂS2\9aÈÆd§Ä\98YVsô Ø¯¾´\17>¦Ù\ 6\84·ó²)\9cdUY\18´¸©\96W½Az7¥W£:}Àzg«\10Î\1enpî¦\98A­çS\8dêhñ\83\83Êìp[o\189ncÀ\b|NNK.3,w\1c¾£TÔzû\ 4-ÛÒjÊú°1\9b\ fæ$}yp;ñ   g§Þ´ý\1a0ôqwé\9bk«gãwSeöªHçÓ2r\96ëÞ9C£ã2¹\L\vÄRÁú\14\17\90)Ò©\ 4ª\a\ 13\19ISÈ\90í]'\82Úu\19mpz7êÖ\9d²\99ª/2ä\8eä÷&`\90\8cÌe\8bB¯1Ñ|Îxä\98\85
+\99u,M\98u7l\ 1?\101\83öï}zL\1a¬ÌÖ\rþ¹}'\85 \8f\16\a¬Êeþ¥Çɤ¹\15º|¤©\15\80ÛFxM\91<áÌϼ2xBdë²"ø\86\9f7y©gÞëÏwKäaià
+\15d\86ïÄ\e£Êr·öàÉ\13=\9eØËvU"\v\87æ\11©2\12üH®\88Z&Wàá¥Qéùk\18\8f\19DÁà{×\16\9e\93\8f\8e$hÌ£Á㻶¨¥\9b\ 5­Ú¯\ e¹g\15èê«2~R\14ã
+s§GT\1d\v\91;\18ÓçîM6¬\ fím!q\81Þ,õàÑ\91\8aeñji\8eMpQ·ëz¶8Ù\19\9d¦Br6S¿ó;I\9f\0}r®Ï_{9P5\15ý8иå\88\9cÆ        Î¶$ÆI£\9cG?ÊóöÆ\v\1d\1f\8cÚ\1cíÁI\97C»KǦyu\17C\8e\98¡8±>\82¾.\ 3ù\90ã\85F\ fÞzöJKy\0Ϲgôµ    \ eJ8]d\8b:7*øK÷ÈÃk¯WÄA®Î¿Ê<drs»&f,®å\92ZWá\8c¼á\0x²6\1cÖÒ»Y¦Ub¥\8aáSÜ°ì\8eCçm\9d\821\87¡\ñ±\13µ\1eù|N\84\f\9dã²¾é\11]\97¾8\90XipÕ'³\87\99Ôýbʤ\97å\9aÐMß4ÑîzU\87¼\80+mSow\bd>\aüÌìáÌ^k|ÌÁûŪO9\ 3\97}\11\8aЭ\9dì\8aË\1e\1d\8d+\94wd¶â\141ñÞKI2é\1e\83ÙÓY-\98\96\a\b\92\bê\18Ç\ 4Fï¬4ñ,c'|UzÕØ\8cS·E\1aã\92f
+\~e;¬Á<|)¯s×åuÕ²y¢Ü\97$\ 5\7f{ö]{÷ø¼Ò8\88\eþ®³§KyÆ]·°+¢# \8fZ\85\8eÆÝ\ 6³¥XTµZf;÷Ê|Kl»\92V\14µY¥\ 1ô¥æøó\0º\18¥Ñ\91âõxR\1có\ 6 B\10DâÅy\ 3\17\97à!¬$~\0\89\96Õ\17Ä\11¼\13K6¹]f\8e\12¬eò.!®\e+ÖÎ\aORQ\91åH\ 4§R\93-Éù¡<\80\9a¨0¹\8e^\9dWWK\b»\84·W\81 Z\9bLfè\rfbw\88ëâ­!\97¦­4\9b5F9\1a\16k`­*¯\8bç½Æèç´`ao\1a#}?¯\1c´\b\15Ð\18\17@)âbË÷\14S\10ð\9d6\8d\9a\81}t"üp\13»O.9\9douö·\81\85\84àÜóYf|äQýÑ\9bÍ\85FSä:Ì\1a(hµ\ 5\1f\aû,:\ 1o­o\8aÕk\18\89\1aùêãv÷<ñü\14¢\ 2\15hõ°gù¹-4\83£::\81ôØ\84{tò\15!üé¢,k\96\¨éúyÍñ\87\17÷Z¸ûº\18Ìà\99'¼E\a5§Gêæ\97+a[è\9dr=ú\94\9d\ f\9cã\ 3´øËølur·:oM5\9eâ§Yú\ 4Ì\ fêPxßÉ·\88â³Ð/\rz   Å\9d·­\10\15ÄÇ¥ ¹Àv=moÓ\ 4ÿðk½\11·p\1a^e\e\9d\f\ 1\1a[:ìðÒ¾*\87£ÉxDGì#£\86OûdTa·Å\94Ö)]\11äÕ\92º\1f§\0£\\8b\94,¬§É1¸öx\8d½Øb¿p\95\8bé©\vTRú\8cËvR\91\96¹T\10\ f\18ËSn~©ß\94Y%pE¢Á\9e8³Ð¾ÈV\ f:\fM|æqöNxK\9bf¾YU¬
+έ\ fí´´>_ü\18ã(¾øâ·Él\94\11é¼S\889d§Y\97W\95N\9bê½Î\810i7)iÿ\98³­]%\eã8'&\13LgÞJï®\87\8cP¹ôeµ\7fÄ!\17¹\12G\85ë ¬\ 2Èų0\11*'¹s9\10Ò\8b¼\r\a¯ã>I\9d\12\91~g¤¦©¢ÕÜ£Ü\91Ré» ¾0T\9bm/ÈÛè¥Þ;\ 5ï5E-\90\8f\84&K§\92\83\ fÒFo\ f5%#¨Ô߶3­Þ#ÈÈ'YÑÅ\8b°\92Óv¦Ý\12\90Zv¦ìü%\9f \eõy{Y8\9cEeµp\1eðO\9bÊ\18MßÛH\12g>\aäüìkô\86\99\8aËímRñ\83` :\ 2°\13± ãÏ\1aã±ë-ÓÌBIY§¶VZÊU'Û\97:ÒvÇzdAT9Óêl\93>´x7±\ 6reXÇH\rG5Q\80B+Í\1aÝ´P.¼.\8aR\90\87N\8eðE_(j\e¹Õ\19£<k\9d0\97¸\ 6[©¡ÜÏ\83\ 4Z¯ö)'²wsW¡z[E\97\1f\0)< î>ÝT&   ÷\9c\8b\96£·ÖR'Ïâqz\ 2s+I\17.áxÒ\85!Ïã\91§8½À+ÄnÏ\1d\a\11\ 1]lªK5=²{\a!W\9aK¦^\b^æ®0\87é©ÿöõ9¡Ãìkz\86\99¢\ 5\ e5\88\12\92}ÏÞ\13eR\8c\96\9azºÅ2Þ\80êlµ~X+D\9cA'%ôPåX®.\e\9d\86:\92WzûÁu9§ é\99·M\8c\v§\ e×]\92y\15N/cñê{Î1'bªx!³Láù\8eÉ\17«#,\16c\1c.<m¶&׺\98\15±¥\9eÍ­\8a,M\80\81Àë-J\95Äã¬ÇÌ¥¶P\ 3ø\9a\82o\97)ðYÜå\ 5(_ddæ0r=îF\15\95ac8Òíuþ,\97é÷Nn\82\0¦Þ§ \8a¯-ìS=\87ãÂ[1·z³\19O² .Y\87T²*ÒNõBwÈ\ f¯AÖè,κa\ 6T¤ÉNs­       éj\99YQ\ e£æ\8eðNy\bb»{{³¸|\9b>ey_=\9d@'\13'\96iw|\93æ's\9a´\1f.µ,h\11gâ¨Wnæ5Ná\97\8c\81ç\9b%\95O\rh¼-.$Íaß¡R&êËÆL.¿U£\föeE-ÖRís¦Ç÷G\8f\9d~\99½\1d£4\91¦\ eÒ\1c\1a\1aXÒ·\fú`Zæy+&GF\14\13¾,ºÒ»    \18`M²dfp[\80Ä`ÜÕªo|*µzøÂe;\97®o\93ݪv¸\r¦\12H]jî|ºÁTÈÊV°Cæø´Ñ\9eó\90÷5\97jPá\07\ f9\87\97¡ü \94B\9aÍäk(ø®\12tt\7f\a\85o÷f\88,\rÕ\93ѺÐ\970GN
+Q\90VFyfÓmÜoW7Ï\ 5¡Ü@3;°Þð_Z¦Tk\8bWÀá­`\90\9bÓ£²êØn\8dê    )²ð¦§Ë÷4\86\83@&\163\1aõ&\10\v+}V`\8aõJ\v\9a0Óik®÷ÚùVÒ`\91¸\1dÎ@\8ep¿\9fÔ6\88H\¶\1c VÝ\133T<\15\98\ 4\8f¯yg\8búg®Ü\9aÝ´¹7Ù\14-åPã°B*\81\1c\99¦¬Fªs\10.¯³m½ýzÈ\e!p\12z}úhì¼ýcx\ 3\947ÿH¥H={mgàhðxó»ìÂÖÔãø\16ó [Ä\97O]Î>4:w%8B¾\\9dx5S\ fï)Ò\16\ 3)ñ´V\80¯tÓc¹\ eác\ 3qRÈ\86\887\8a8N\9aâr\88·%a¡Ëæ¬wKi\ 2\8dÞ-fÚ-ò\80\99wÔBu$\e½>\9a\1aÒaì\16w-uÓ¤ÓÆ\85i\1cÛÊØ\e:¨wì\19|NÁg\8f\93X\99VÞ&lo§´\1e\93·A\87Í\8aY.\1d\92ªúÚÂ*\9eupµõ;ée­ªÊ\ 3½¡Æ2\96Å:\88\98\8avÚ0R\86WëfWÚªN\97M\ 5V¾M\80\9cs'0+?d\12¶¦\9f\9fil\98\13\82\9cÑâ\ 5D+i\a\ 2\86cZ®\8bÛ\11¢2MÈ\8f5ÙåbMê\8e]Ú)´|=gënÌttc\v·¤ñ\1a\ 6\ 4[x\93}m\ 3ºùvèUfV¡v;¨Ý=/\16\v\ 5Åû8ô\90\ eÄÀ\b\11ãmXÁ\fǵ\87¹Ç\85\18\18¦¡þ\ 4w$I÷ªÑn°\¿\8b.(\9f\10\19}8å=Ûæc\ 6\96ÔÊ\8d\84cMÖ      \7f?\15}ÈÚ\9fÄf¥\87ÒÃ\vQtyh\9bì­á\8b¥Ñ¥Ã#°·\v­\80lÅâ'L\v%\97&Ùp\1a¹«BÍ\19¶»¤$\18z\9aêÛ\83;ì~ú$=þx¸ÓïVûÈÎìmÊ>w'\9dÞ»\8fåØ¥!4ÍÙmGÔú£1ž\16\8d\84F\99Ö\96o%f¹ÄÊì\16\13uMqÂ\95\82\86\85¦³yd\18\9cÙ\ f
+|ظ\f-b\89¥\91µ³áyí0ñ\f¿ÿ\98æ\ erJãW$é\88ó;*¨\9e!\81rQ%\1fî¡wÆic\9fC\12O«<\ fO»¥î°\9e\9dÕ&¢T»£q±w¶µ\ 2ôL\89½\81 \19«üý\94\98¥\1fk²¦½÷è,  r9g«95f\ 1\9d\12\7fÀ3öõ&_Kó²¹m\9a\aD\10¨¾\fï"Í(ì/IYËm|¼&9 \85\8add\11j\97Ú0\ 6\83m¦îxu¹ÒM¬Âk««\91²V]\94ï¡Ç}J\95\87\0fhvùR=\9b±Ïµ/ÚÈ\0{b\1cXÙÈ\8f5\89XϪTÒB³\10ÁVu¦%\85À>ÞÒ.6g`Ú\18\9aHÖ¤`\11GÐL¥¢÷·ØM×\1d¿\96[E\19TξpD\846\ 4¬\ 2¼\9e÷Rçgà\16Áõ\94N­Ö¨íÔ+°E\8d:Z/÷F\19óJ¶gF£¯ØÕ(è'F3\98þ*§[\85c9Vf~L:·5\8f8O®B¦P\86'ʽUµ­º\88\1a\»¥U\942K¡ÐGÀiûb\9b[+¯w¥½\98[ÑË\95\9c\8d\90F\^­P<dÔ\e\9dÃ\10|V\10+        \80\1a\ f3\99\90\1eXÚx\92|¿RçA,\b:
+\1f#Ç#l¦<éjG¦ZÝL\1d7\15.\12M\82X\13\82\r\bþÙeÁ±pb9mÖô[µewØÜäÒ,=¢q\97t0µ\ 1æ\9cd\8b?\97\1c²°Íf¶\9d!\9bm\91}¥ò\96ð<\89\rÑÛÌ;B\1eS÷S&LÉcèÒ¾òR¡|ò(°\89w"³îñhc±³O\1e\19\95\r\1d(ñ}\8b|Ûâ\93fcM\82m¬   v\9cÍ<hÈ\9c"\92K<-gA§\89\16ÁÆàÅî*â`\96\9e9A\1d;ÖoSì$¦«ñL·9í\90Ñ\0\87\12öÙ­$¬v²*²ó\91«föJÝßEqj¹8KWÞ\ 3Ï\9b».HÕ\8e\92\87E\19pW=»\ 5\98\89\v\94¥Úô(çÛ6nYËZÒÐ\9e\11±2ÃÙ¬YmV\18ï¸\9bikàX\9däÒ~g0¿íò*\9f\97C§¦\9d\87õ\95ܪ*{Ü\99[õòÅÌL\1eå\8ahS\9b\9dàí[C\11i`O\vÚW\92\96ªÏd[s"Ä­·1\1a¥Lw$\17\1d\1euð úV\94½ e>o \1aÙܹæ\r\1e.cM¦X¬Iÿ==ï¦EF\\94\8avr`Æ\9bZ\99ÊÀÎêCóXYÎíÕ(íÔ§óLòL¨YZnÇføª½2Ë\1cM\88þ\91¢\ 5½Ó\14Å\ 2\1c\80\13sn
+~õ¶\8d\b7ªw]PQ875ÐñNO©Úö|ä\8b\16\1e\1cßeþV\9ai\97N\80\9alm\97¤}\7fÊ\97\ f÷VÔKç\92\83cd³\86+4 ³Õà°¥®Ýý¡\rÐ\ 3hHûÑ©.A0U?ÐÁ\9bºOà\aë¤\8bG²Ï\90Z/-T¼'ÇzcuÍâ,=\98#­msä\8e\85\90­.\ 1dz¬Ö3Èb\93é°Í\9e\9ct &Eò%\16£6¸f\a\99Uè¾ÔZ\92X\9c{¢Lwaç!\97l<j\r~|i¦\82Jåít×\17µÆ§Í\9c9¹:S\1dª\e§1÷¬ï}¯\ 4v;i\8e­Ïx´»;      \95á\82f'íLòÔ¾\94=lÌP\80ÅÂHÝ\12\e\11^\fjÓB\ 6\"¾\18½\84¹sM{­ü¸]<W\9a¡p\11,ÂÙ®\1d/Ñä\92h\ 2ÌoøêMV-5'¯^\gFÑu§;[\17        éøðÛ\93Z\97I¾c-Vf\rJ\1a¶4ÜÆ2òÒ\11å¼\85\81ø\f\84
\8cY\93(\9cb\88\9e
+\83s H#\89Ìé*\95cq\9f\16)\ 4ñ.\8eªè Ss\95~³Q\ 2\10AVºÅ\96f?úÝR¢É)Öä\96ð\9b9÷<\82$Hâ 1:©\8féÙz>»\81k\ e´\17nn<«ìàPëé¤4?¯\91\8e\0 Õ     *\ 2ÿ8Õ\85ò\95#X      é\ 5vH>Õ@ð\85ÆHºc\92¹Î§­És£cÈ\94C\93½5ãt\ eA7\17EÃReM\8fÔþlX±ûóµ\98(\13§¸ÃU\9eÃ\83Â\9d,1Ó³[i\9d\9eS9&LÝ(·¹Ûä\98?z°Àß Áº´6EâPv²\aA\0 ¾\ 3\vVÑì\våÍ8i©\1e\1eÓhI½ûí13L\ 1ÜÔ\9a^YZÞr5æ\80Ò¦D\9cy\8d\ 1÷\97%\8b\89ÕÖ \̽\98¨\9d\93ÙËæÚ,´7\87'\vÑý4Í0}o9¬j\13N./ÏLþ2O\9b\93P9p\14G$'º\18¯ÏCTvB\9e8¶I#,\ 2\9f
+\r·\9bJsR ï³\ eBCûéP\18K]ÈîÒh»Só­fu!\92\99¦@ßæϬ¨(´&D\9dæ\95Ñ\1eÛM\9f\88ü\8cÐ\9a±*[VûZ~\ 4ÀI\86æW\81(SÂÒã"hð\82ÔZ\1a¿ÒõÆI7üTw!\87L\1c\8b\v\92­õÈ\93\8cù\80`\94­Ñª¿§ù\8a\97)3¯v\89\9d\89\86\13Ó:À>%L\8eÌD\1eB¼Î\8a\85\ 3]_°÷äà\983£=UÅ\9f8}£«d/hñWùþòE\86\90\9c\13V,©$l\9bäÁ·:\8b¦G\ fìËÿGÕy®+
+lÝúZD\f\88\8a\ 1\ 3
+\92sÎÉ\9csæþ\8ftïÞû;?W?káÛe1kÌY£fµ\9a=Þ^×ëÎZ¿J^\7fÓè\v£è¢°ª5\1fÙ÷Wp\13\v\ 1\bcO´~a2/t\89ÕõF:ìôµ\9d\84å\v\88\97\ 5\15\8b\1fñSSp\95GüÄ}G|á\82¸\99®Æ\r\ 5®;ïçO\85\7fB«\®?ç[Ý\1fÕÞ\9c²ÅÐ¥7.\1egkg)òÈè\v\96\9a\1fr\8e\9fèÁá¯\17zɼ\8bG5p\18\ 2\12|b{ì\0ñ\93÷
+3\88\13ÂD\r\ f8JÙ\eñv¸póÓr\1fw}P_\0ÝÇ\8d§\86\84¯Pûã79\ 1zY\80ç!7\9a\a8\14.\8a`(x¥O\9eß\94væe¨3¿8)\1fA¥¾ÀÁfÄ_¿ª/\9fB?°mm6\10ÌI0\93\1fó¹ÂÌ}\1a\16Ñûr§TBRhß˯¯x#Îse\rTÕÝØÝÛ2\80¼Ç2ÞÚΣ®ÝHåÂ\11ÍU§Ì±½\8bü`·;¹\8aß Ù\86\12\v_^îñ+Z>Ê-½ä\88\ 1&\13\8fL\95¶i*Î\99Y}¯5\8ewXz\802o-\0´¤ZÙ\18\97«\16ÈÓßóô 6Î\13PÆ5´Õî§Í\u*\aö\ 2È«p\alÇÂpm¾ÛWN\12\8bD\18¶wV×\98J1,ù5³*\97\17æN\ f\82ÓA:_Î\16¶²;gmy×<¹\8e\85\90vRuYií¥â^\9cÌØ6(8\1aY\14¤Öó\95¯7æn;Ú[+iß\928{ÃÓý\88\85Ì>Öv¥ÙGRZÓ#H\1aÍNÏ\92\v#z¼á\8fëuð\"\vñð6:\ 1¡Ü$ÏnTú\12ð¾v¥\9f6ï;ä(K¥ñ¡¾ÀZN*Z\86`åÞAÉÒg/ÐyþôºõáSÑ\dûirÀ\9b1pÙEâ´v9\9aP«b\ 6õ_Ü\12_\93H¤bµÖv½æÐ\93úÊBo\r\ 1Ç·³ÐêKRP-­Oü÷8/\95\7f³ZBZ¢¿(­ÿ¬7îv\ 3\8a¾\1a&â¢
+#!~\ 3Lñ¹ç>Ã康÷.\9bQ,Õû%  \1ca¥³FñÜNÄÐói\8aú\1ff1û>\97"3\9fG\86\9d\98NºØ\ e~\ fn\992Õe\ e\85H(\18øïQvÞ\v\17y\95\81\8e׳Ê5©6þ¢Ëm8\9fò\88\ e\0\9ah¼V\9e\17\97\9eH\17­°ÊZb³\8b¼\ 4_wçêÔ_6\87\14Z¦E\12ì÷ÕEKÛ\15OU¤-\15îÞTC\ 5/MÔmÓ\97ÔW\9dûc\1f]\8ee=\85\1f\91\14ZäIå\98Ë\95\8cÊ\88-\9d\rü\97Cüþ\1dáêÞT\86@\80RCLb\97\80¼þ=wq3UãÓZ»7§\1e¨½ìXR\9bzXþ\ 5Q9Q®RÙQî\8f72XúµÜv­Ä°|R^Óõ½(h\8dª"3\93\8fJVÀr\1c°kÑP+²®<\97\9a¡\9d\14@Ò5Lé*  Ì-'oª­j\v\1c©+VuÚi^¤þû7\7f)ZYG7iQ·AÀ\19u\87\86²½\97ò:´óþ\8c\9aÖºàÄ\8a´èöù\ 4³z&±\9a=\95Ñû5\1f´JgÓ@çáú÷ãy_¬\93\8b\8eêháIY©=):\9c\9e²çC ¢\90õ\9e©U\1fͯãè]L©u\91Òd2»ÅÖîqÈO¯*À²\846ÅJÅ1_.¸Wêqm5\97»!\1fe¼TS\88Óiä\8c´\83\19\b\99¿\91³ù ÁW\86\ 3J\9f\9d|\82\93z\7fY\9fÀNW¨\86ònÖ\7f\ 3÷\9bÐV\85âØQ\98K\1aG#ï\9e»\86\92û®8\92¿1ÐSu¹\90\85G´kÈóM[#.Jûà\ fçêá\97\12KÕfÝSRç;:Xò4°\8cyuSc\16÷\13[SªP\9d\ fLG\9eÒø~&'/èÅy\83ú9\ 6Æëõ/\ eÇ\7fîaa6çJ°`\f^\96äb\rX\a\ 3C%¦ÆÇ\9cÙ
+\1cp\91\0ó£òµg$øOÖ
+÷=#\0ÁÈÒÏ®·!\1a\8aQ\17ÖaK×Ç¡m7¨W      \13ÙÙIÌ\17Ýiê)¾&f\9a\95\1f\1e7æwzkaõ)*µÔ£«\1f7>ËÆy§$îó\16ôf\0¥=Ç <i.Ák½\b)ç£l¬äq\ 3\9a\1a{Dÿeß!ºRn\82Aë§wLþVGÉW\úÊê\90\97Up\v.çç¤\15¾|¶4çSjÔ¯Ý1­ä~E\8d\13ùArov:FËoìôg©È\98\1a\vÎt\¥3½\8a\12\aæ;ÃyÍ\13\94¢&Íå^¯Ü»\93ZµÎAÚ¨³Ï
+«v¿­DÝ@4ª39¯@y\194k[!ºxè\88k!r\91ßÑæäp\ e5\918@ã7Nà\ 6VC\vê7ä\94º\8c×\18ý^¾\rÕdzÞ%]©Gy\12s¢tªx\f\8c\83\15U\9d\84ÛÇ\9a\93\f)~T»0hå\86Kõ9-Ǩ7\ 2\9bæ~ÿHÕ9qà\vÁ\8bi)6\ 3öôðU7<æ8q\ 2³\80\86Ú\ 2ì\9f~ñ»°ñFª\97i@gF\8e\15í¶t\ 4\81¤U½ä¿ê\b}ÞØÕÁ\aV\e\19Ú\8b\97«k\1e¡\93[ tô¢é§\ 6þeà¨}ºÎ4ä\8b\12ô\15\1dÄ~R¬\9eT·þ>¡\ 3ù¦xÝÓÖP±`¶+X\85%¥hÎ^Ôéswç\ 1ê5\99þ\16pV\93¸ëB*Ø\8d[lö2T\9daå¼Ü=\86\e\15\1a­\8b\8a\1eüض\b[\9fo\ 2\aVØn\rH.\1d/Îv¶EQÍ\9d\8f\v¼\889\80\15\86\99\ 3\1a\15Úè£a\9a?uÙ\1d\98EX¸\93\14\a¯nn\90øH~tþS\1a¢\G··Aw)οVѺ\97ËOÁ¦\83§øíà\88\998çƨ°û\94¥±ä\10Æ\ 1}\rjÑ Yüñ;i_§O\ 5\91zs\14Cm\v\ 4­4\90ØûÊ Ü\1fÍë¢Ö£Zú2OØ\15¸ßëÿ¾<Âéì\9aÇL©NÂ\95\11ÂbÞ\ 6bûTêW\91°ÝÏ|k×\87[C¯\94¸³\85\9c¨=ÿ\8aý\89Ʀ\9b®ñM\a}L¥¡L}\12N×h6d 6¾lLõ2\1a¯µFå\9e\1f.\ fÀ\93K[tvB-\13\16ê*©rU³·nÙf¯¾2IÿPº\18ÝM\v6:cqÚaW!§ÛÎ+Õ\9f\ eEçYsnédJv\91ï \96\13\1eZ\8e»\9bò¦¿]\ exòé.íÒÉÏó\e\83\ f\8c\ 4\ 3»UÍÜ\1f\1cD÷ªé·\ 6Ω®Ù¨p\8cª;µÌ7wÉ2`ï\95\ 5+üV¹p¿ÙÇñ:iìj\8b\8cl eÖq³ÃH_\9d+Y§r\87_öì-\8dtvõ\1aýHâQ>hõë¤oMåIÏjn\8b½hTñR\13\1dî\91^(ÿÑTu£ò¡>äÄ\<\94Ùnôîç¼\83NªÝ´`}îª\90Ö\ 5ü\9eØ2¦\91\92Zæµ\e\9a\8aúìÅñ\ 5ÚÜ\f½+æí[&\ec1\b¹d,é2>±Û{\ 6\84?aõò\98=ü`\82ê\8f\ 4ÄüïlKêËí\8cçn°vöÊ\0Ýg»\99Üæ\83\1a\959Üg´\e\8cwÒK \172`\13q{W-\7f¢\97\109hnµÒjíWâ0'\1f\10G÷Mê\ 5öv#\89\9bñI4N§²sÄn&1\9c\8a\9exz©\86M­Øf\8b\ 5ö\96Ôº\92\9c-kÝa^I°\7fù{&ø= Õ×ñù|&?\1d¡éâ»è\17\98O\9bv.\a70ö±S´Þè?ÁD\94×$½´ì,\ 5+§¹ÄÊ\a²èª¼½¯Ù/¡¼Ôv¸Ösï\ 5\93\13\1f]°¦!ÁzêÀi[Âw\r5Tg\13ai¥\ fqÞ*s\9b\8b\eÆ
+Ïkãoå6\ 2~0ϵç\8c\7f\91lë,¦&8­Î\9cédá2}L\e\18µJ­a\97\88S·o\14À\87ΥŲù¼u\9e\95$óc½¦\97(åQ|\8fmù¸î9\f\ 4·\ÊÌPQ\80\97\9e\95\1dÝ<#°]Ô\ 2qºå\89æf<u-¸ifÈ®p>\99#î»7_Ë\9bð#q\7fùûå\ 6\95»Õ¸Älyäqöv\ 65×£OIkà\84º\ 1X®j\9býn\ 1\12li´Ø\98\9c?\1eWÌ-\9c{\a\r{\f\ 1\8aÕÖîvÃÊà¨1uºn)^½ÄÚð÷\8a\ 3w¯m£L@â`©\7fð:Ô½e®[\b\86Ø»jæBDF\99b9÷Ü\96ìÆ\8fä\1cº·GõýÓ.W2~\9eO¤S\98,s?4mv¼Yø\8b\15ukÄËdïµ#{\ 1thã&\ðÙ
+\1fQ\90¡Pj_\19O\9f\91ѦªM\8e¬×wQmº\ 6¹-3âøÒÚáü×áË\8ez\97[̯e\aô\10ÿ8lli4\10ðãøϹµhV\99çó¶ø\831\92è7Ú\17Y½î3\11:(¿\805´¿¤]\9fA"­\15!ÏýM\19´\1f\ e\1aâ\12-V\\ 2\ e\17¥>[#Å\83­^\94Y·1Ñïý" ûM\9a\ryÂS9\8d\1eåDZeötàüö£¤coÁ_Éô¾g»\fXþ6ÜWï.\8b\16÷uõË3/kØy\rY\9dE}K°äÚti©·&kú\ f¯Å\92­];V9\1auܳÛ\98\97u¨"VuàXûyn\1f\9f\93\93
+»Õ¥\82[ê/\86û\11mìÆs,X\e\8d\94«\14å\83~³×¾g\1a»\16æ>ð¾Þ!0ÛY¬\ eR\83ù<l½è<TÇû\ 6\9d\1f\89ñS`\17  \ fç\9d÷QZ\9eû]ë\0\83¹²ñ\19û(Ov}\e4\13\12¢Ýq\ 14»Ó[=1^DR¶\9fý\b+\rúr[\aæWí÷\8c\1a ÷RNð\1a\88"\ 6\93\863cWÖuç8¾i{\90X¼cãæ¹kã\89ÔvÐÕ:i\f_\9d¼\87´uLæ¤}\99 V\ e\93?H(\84´f\18\92q\18\97æÔýââq\9bXæ®à5ä\ 2è\\1d\10è*\9fÎÕ%áRÓ\96¬é¨4\84>²^\1côì¿$`eNÆ\8b\1f@õ^Þ°\9e\9e\10Zܲç®é×\ 3\83.T!(\16 É¾\9e*T£Ña4'\7fOmöSiþ#©N¦\9b¾¾à=\98 8\ 5÷7      \1cW^x·ÖÜðM\96äÃ\95z\84Û\8cÀ\8dù-\12çÞÁÀÇÄ"p<ì3\ 1\1aÝÂ?0ò\15\bBaz«f)t\93\0\17v­sYDÊ\93\ 6\85\89\89\89è\0³\ 3\16Ô[µ«yCDÞhÚA¥]+ÿ#)?¦0|\11xñÝöó\99V"ÖXL\9dzG¼<r\ eÒÛP\97Á£pø´G\ 2\80È u\ùþDe\8b\95\86ü\91éþ\86ùK2cN\17Õ\9bãq2¹\18 µ\14í¾Zílçá¬ç1ý͵{QvÞwê»\86\92\87ÎÚ©nL\94ÝÎ)x·Wäþ\83\ 1¯)×\8c\83­\92_ÖRT£äè\89ã\8d·óµÇ\19Ü\ 6íÏæÙ®÷ô\9dæ<lÕÛ½l¿\88N's5üjÿ\19\13Ù\fY˾By\14\887QÅ¡´VÙ3åòU\ eáê~Ðwh«iÄ($z¯fÛ¨í\98/b¸\17pí~\ fßÝ?\12à\94|\93â\95/¼¯\v\87í[\Ô\ 5gﱫVP».\15U\7f\8a½ªm\0\ 5bk\8e²\80×LÆPqâ\1f\aê|\ fþgXÆ}Øö\13I\90b¾8¶)\922l\ f\1c!û`ÖAj}^zí\9c7[³<í\9b¢µµ^¸XËÞãîb\8cûþGRð\93ù\14ÌÏ\11pÏ8ÅC¾&NÃËÅÆÇò5\ eü´:húX»Õh=\95ñÅc#Xvg\ e¼*\8a\94SS·É\13üCÂ\9fk¢ÍfÈ
+\98?\ 26%ð^iÀY\15]\9bÖ\0ënK»6ßT¥\\vÄoP´*¾T<ðèäªD\85wsü\1f\98s°Z6ú8CÏ l/\88çþ|V«õááºÒç\84\14)8       É2µ&Ù6¦Â§é\ eceí¼
+@R¹\8b§G¹þ\97äx0r\9d&­nÑnÞÙÙG\82h»[I\7f
+Û´ëWoÝ}\15\9f\ e)Dwp\9fU®Ú/M6¢       \17<\ feé¿$Þ\ 2¿\9e\9b´ÿ\92(e\1d\12­é\10tfÃd\98q
\97·±\84Oò=\82&µU>
+ÞÖµhRl«\ 5ò\8e\ f\14zÁïÿÂl\8b\ 3I§ÐByƯ\86}¢3\1eõ5_Ý|\12nit»Ën\19Ô\10\86½D¥æ\1d«\96Ê ¤õ¡_ú¸ç>Á?\12??\8b;\9f\9a@\8d¶Zv`vGA;u¹Ó|èNðºAú\9c\16-\96ïr\93©ôOFóT|\86ü¤Ú)\ 4ÐCS¬\84\90þ\92\ 1äÀÅ 3½\1d²%Ñ¢ßSëæC·ø0ÔoÝ96ÏÝv\162L\82\90~V¥j\9b¨ÜÌ\ 2l?½\8fÇ4ÿ\vS\99\13ÈrA\e[Oq÷íé0\85ÛI\7fè\16K\94cãÊ9B\vü/Â$\83ªS`dð\17ØÑ^a¿¼$Jú=Ìþ\90äç\bÂnú
+Ët×\9dZ^ýC´×Ǻ/\fgZÌØ©ß\9d\99§§È:x\ô¬\8a\ 1µ\8bY&Kg\8fMÃí\7fHîX\9b\97\8foxI\90/\92ã\81M_\18?\90ÆOý\12g\9eºþ¹\90K,Cõ;K>!P\18ßk3qÍt:\1d\r\8bi\11\81çW\89<O±=QO\ 1Q\9f÷\ 2\9b6c\0\8f\ 1q{.÷\84ú׫(\9e\rüòÒ;Ð\13^Èá5.\84ø\\92\9dè\1d¹o\99­\9b\94xq\19\9b1_ôªÙA¹ë­\eß\86°\87-E\94¦\98_º+TVì\9cñn\16§\10*\7f\10®»\86Ø>5IE\81\v\8f¥\88?çå\1d\82\97w?ùZ\1dq\9d\8f3
+\9fÑ\96Õ£äzå[W>·\8cÈ󩬭C\93\13j8N\8fðô°Ó\8aæ\9d\10\96\ 6r*­'Û\87Úü.\ 1\1f7 yýÙxÛRB4¸QôÂ,I9¶Í\vp\89øáõÅÒ\a\1aªô\9e
+\bº¸µ\87^u¡Óö!\7fo\ 43)sÛîÒYû÷zkÅJ\b\80\ 6Ùa7s\93ÁiÆIï°!]\9dêÁv\12ËáŶ\vb3­U2w\9fËE\0Åe§4ú\ 4\94^\1a\e&ú\12ï\19=@\aQ\1dß\91ìtu\89Íi\85Ë¿\e\9f$/$7+BMº\95\r÷Îå¶ðyï´\8eZûó$¶ÑÏzÊgÞk²ñ\83è<\83_Ï#[è>7\ 1\13ñ.³\11ö;\89]iðA\8cÀ«Á2÷}\969¬w¿â^qéox­\8bä5\eð{öaípOH\86Èz×é\vÐ*ósXÚ³\93Æ\01\9b£â4ùL\9177\86\10\82\9aÁ\8d(ôy\19â»deÐ\92àÇÛckµ7\1f\88Ãá\1a¬@&k\17\13]"üË\8f\88\9eäû7RLѤ\98ÍÐ\84\ fVMK.\1c
+k¬T®\97\ 5\87=P²PkÄ \17Îd!sôºh¬ºhêQsLì\16\99»ø\12z7Ão¿\91ß\8aÁ\14$ü²Å)&\ 6B  \f+Cia\1d VõìåâVb\86\8a&3»ÚgUÅxNáQ\88\14»(Ñö64F+m;.\8a\91\94ñ"ªÞ\r¥4üPR\rr\96C\16ò6ò{\8bÊ\92Ê\844\bOб¼\86Ô\9d Dw:1G÷\8bÎiWMø\9cà<BëÉ´¹ÔB`Ò\12%{:$#¥\Ö
+!IþPç8¢ë2©*afKêì\ 3-k\83ÑÁF\9fÆI ~/¦»9· ó"º\91p¸       \81ÀîCËð\80Î@ü½\94\9bÁ6\16\97\0ä\ 6\18q¦DYq\85Y\91úlq\0¿ªw\9d8\r\12È]TØP\18XÛ@;jwÞ>ö&\17a«PÚä;#\17V£9¸\8bc\8b\9b ¥g\931kAÅ\17\8f÷juÁªÁ.\82\15¿Z_On\85\ 4þø:§^\1a\v\83ú4äWø®ç\92õ/'\1c\ 6d4\18S\85Ô\96\9bݾ\bA\93UQm\9f\ 1\97¯ü¸\7fÁâ:X\89\92fì1ü®=\91µÞ\93`ÃÖø§Í\89Ú.\9a(½æÅs³ÑJ8\1d:yRØ\9c\17\9e\ 3Ç8\95ç"ã&Ú¢pÅ\e\v\88\16Q^h`©ãÞ\114\8dgó#\7f\99î\0\16¿\11!«oAl8YÿY4ì 4\81a!ªñÍ"îÔËêL]-\94ϨH\86S\15Z³ç1þÇݽ^µ{ªSn¼¹û¡wPÒÇú9)ÏÊeþn\1cÚÊbÍãÍ\96Õw\84\19"Á*±\19\17\v\15)ãû¬cóYÍ\16\8bçÞEA/P\99\vmv(ê6G)=VÝÿ\92ÏW^R\95
+\1d_UÄÕ¬\ f\18I«"ÉÌ\84\93\8fàËú\89µG,Ï×^KÞ\14}^9Lö_9Öç\ey=c!B(Òg9éÇ\90|\9eÍ\9a\8d\ 4å\1frÄa\r\ 5\9f\8c¹iIn8Ú\17¡\eò¤kæ7\97\12>jôu!ÈD
+ïÙë¹:V\8f\96\1dÈ|Jw{\a4       T\ e\8cβ£\1ch`\84Ùª2?Ö\ 5é\ 3\85\97\0<&²\99\f\rBzׯ\8eü\r;\9eaOn\89\f\f\90\ 6¾¶¯OÝ\e|r\e\9cÜ\f\87a£[fÚ:HTÞ²Õ\1f#éðh/\\99\e­¥\bG0sß\rzöu>/HI\11ÆÙî\1a¹Xøø\\96¶ÔþÕ#übݬA«¹té\fq\0\16ã\95r\9b¤5\89=\82°Ïrfn»öW\\a\93Ø\91\18È\93\90TÝ (Ø\92ì²0Þß\1f+öÚZl$ï¶\18ÔϳKÃòü
\17\9e^=ÙÜ\16\95¤ê\1cî\12Ú\7f¾Ì!\,\86\86?ÛJ]¶\8a2Óô~ð\81\95Èk-oU\8d¾\95\94vùê[\90\83\0\14:\aAÙëpI\82\94Ñ×/ìÐÕ´\10¢¡T\9eÕ9é2?ÇÑ­¢%\12äÌ\91ñI\ 2N\ 1\7f£»RoiÃugzgì\8f÷¼IÑxT\8f̷ijÀ¾\967\9dÓµ\99êê\19­Î8dµÅ´\878Êèû¶tæ[\1fý¨i\16¦¡ý@d\ 4ø²e´io\95ûFv5\11;÷§:98·Ý\86y\15\ 4\ 6F·Ú|ÊÍÄ]Ù}\bO=)h½\ 3\83\8dÁà\90\9fú\16\15° ©ß×+\82\82Ľº]©Oª\0\84ÏË!\91á/Lj&*ðú/+1ävupÒ\80ù+£±Â8\95\a\148W£\8dhw\97\90©N7R\17­i.ø\93¾\1c\7fë\96F\83\7fãÐ\13[Q?Ù\15P\ fÕöY\84t°©ê\19\ 3«¿¯\a\19ie㫶]¨¨";\85\85»åwQ\ 5ªÛ©ò \91IØéu7f\ f,\1dÕYéªhVµÿ6ÈPsUô\0\eTظhº<\93óLZyd\ f¦;|H¼ö\8b¥'åÎ\1c\86\93\eÒ4E\9dB!eÏ»£¢\9dF)©6ßöKà®ë\995&#XYÝÏ\ 1ö^n
+f\8d\ fmÅ´ÜOíü´AÃ5\9d\81ÒÂ(&\bk\83¼.à\8bt3PÛ\1dñ¨¾\1foÝM¤{Q\99Þ.\19\ 59¾gß,£¡0+Zï<\ eâÕÚ\95\1e=eÈ2ú\7f´ÓU"T¬V'í~Px\85æv\13)ËÓ-ä\1f\9cýö{¡|Sðì\96oE`FC.¹ìã\98*\10¹ªÔ\82u}nE¢jþ\11rÁøÖNÓSÛl(·õ\83\16\1aÆ]¿vV&\ f\9b&S\87\1e\ 6\91Ün)`/~tüÆÂñn\83D\97\ f¯@þGÒÎ[OZ\8fU40Q\8c"Yþ>ù\98«öæÆy÷v¾Â   \98q®I¯¡üÜ\9b¼$\0{\83\9870¨#ô%þå)=µ\8elEw5¶!~\ 5è\13ó\14x¸|L¿Wa"ïÚÆ)¥Æ\13%ÓóLZ¸ß\9d¦Q-=Ù¶à¶\96"\97\ e0\ 3\aZ^^wâdê}ÍWØ\1e\eqi4\93R\7f²5®\92ÀqŽõ\95vc#5\80\1cd'µ)}¦Q¤Ë\ 1ø®^\9aÌYÊÊ\9b\85Ò\97åüc\D濪¼,¦ÆçàIród©*"K¦\ 1°\9eA<`°®\/Ú^\1f\rJ\8b6\b÷Ee^,r:õUïÿ\86¥¼1á¥ÊéÙôüùý\19Õ1j\v\ efÙâá¢\ fkí<tê\832"\f\fª\97i±éï´ÅåÈV}d1ÔTÁ\bþ|A\8eûh\11öØ°!\ 3\8fÃ\81ä5.]\vÑ¡\9bNwZ4Á6\ e\ 4ÙÞ/\7f \9cVZì\15\r®Ý\9dj\9e\7fHþVn\81\9eá\eêå·ì7\1e®Þ£\87º÷ò¾ÌÍ
+\18û     \18¶öK>.\ 3X.£Vò8*Z«âuª\fV\7f\9aõ¨>ùKÒ9v\81°ÏÂ\17ý%\Ï\12\ 2c\82\8f;L]{_±üjkü;\1fñ®<\85\1d­\17\18·\16ãd%ÇT\8b[­¨@à¿\õ«\eøõpÖÛ\87]?Fû[\\1f÷\1aWF7©Yp\8a޴Ƭl¢¿kÜ\1f>õì?Õ½8\15ª\1dÅ\7f\9a\85söÇA\9cÃ\98\16\88,\99$«¦.zKC¡gp{vS\8cIû0ݵǺo\89ܺÛN­\85Ù\9c7ïIñÈ\9b\8dîÍVl\7fð\87D\16à
\86Í° \:\14Ã/Á\eé@x\ 6SçTÏ\ 5\94\80G\9eimã\19Û£\9e`S¸µYȪT_\8fr·þ\94\85{]Gÿ\924®ÂTjnW\17\87M\7fúd»Â.Ò¸y\ e¬\8c/<Æ5\16\8e$u\e\8eÌë(²\9aÞëêH  æ\81Öè5DþVnÿ\fKà;Ë'%)¸4\1a+\v«õµ\aiÒ£Hr¶S4´K\9a\99ü\fÐï8)*´±¾\9a½õôX®ö\7fùÍäíþ­\80\19áä\17ì­\fäípÖòùî÷jhïð\91\17S¬~r\ 3Fq5R4\96\9c\fÍæ¢ç4ñÃþ 5È\86n\8eqóó\8fÄA\1c(&Rù\ 4p/óô\9aòV\18ÿ\ 6ç¼,\13Æ\ 5\ 1\18sÂ]«h$Õ§\ 6üÙn\f\9a¥,\91sq«w\9b\eü/LïØ+¹ð\91\8døzç\8eD»eo÷ôÁ\9c\9bÒz4ØêGËô7]ÃkÔÅfív\81,Äy\8b\86¶~3ÿH̦=7ã\95l\J\9eß8\9d
+Vÿ'Asw·\8e©5WP'Oã~\80l\94è\97\96\8e\88ua£\9c¶ÙÒýxYè\12ö\v\89\7fÊqÙ~Ø\8cNõ¸f]Æ\85\ egø5#¸v\9f\8eÉ ­      öÙ?×>B\0Ù\8fØ\6n0m8§÷(÷Cëßwïø\ f\ 6\8dCâý®\8a\ 5(x²E>\9eø<Úy\11v/˸¢ý]ºÛG\14w\9cá©ÍÝ\9e\8f\8f\vM¥K1-Ä \ fÖëÓ?$*¼®Ù<¼"tÿÛ2|\ 6§®y+0~Z%8¯qO_ÃNÃ\19\bÃ]µí,>ý3üUk\96\10j\aÂy\9f\8d\7f$í]`d2)¤P\14\8ak÷ðô¼U8'\ 6ãySüÀiÉy\b)Ü!±f$u¦\99íÔ°s~ø¢¸¦è·ÄÍ\97ì\1f\18\87ý\9f^$5¿~ÛCômѪ)à\9bwÜñâ­\rNég ¿æ\9b̾Ýô+¼[÷\ 5ùqÍ\12{\ 6\92á?\92fÇ_\8d\ e;a0¹¨\9aqcó\85À=\1d×-ü(^êZ©\19f\ eÒùEªòñrS\97!\ fÚØ\13\9b\14w\89\98ªT%)ü%a\9fÁÉdk\15ÆÓYsCë-cnØ19vR¦ô\1cè\³¤\1fÏhÇî\86ø\18\8e\91C\1e¡õíæ\8b\8a\8eþÁÀ#¿_]}ùצóËÚÏ¿\15\98º¸ö°»Öä'\11ìàtÇÚçIW6gï/gyâK/\9e\16\95_\13ï/    \ 2̯^ê¼\v^=br©N\8fXpí\ e¹aÅAÍív0ôÆC§Ü\99\ 6Ö\92«O`\83ñ\97\ 2\87\8fRÿH ÉûÊTë\17
+ÌC\105\8f¢[ìd#|¬g+ïõm%6\8a©D;\96³\93û\f\92\\vXí¤Ò(\9e\8e\7f0bãî]\99\81\10\1dâ°1)O\16åç\98í­ïPh\15\aõ\8bO®áÆ~Pà\1eýêKR[\9câ\91m\7fxBúÿJ=«w"\17ô=[¨\ 5\7f.\1c.\9eÚë\bÁ.ÝQ¹½Øñn¸ÿ\ 6\8diÇC\f\84jf[¾{j\95\v¡²4\84y<Ðÿ\90\bÏoT\11»|¤D\97Áq4±ýÇK¤Ð&\1eDe\89C¿µÎM\fªjìe\ 1\97\1f(\83\0¸6\17\13ti¸ëÔý/Ìâ\1e{ÃVÆÌ!_\92u»Ù\rG\96xÇöȬ#sSôà\ f@QCØQ\19\92\ 5äþô\8cd\13\14Î¥Û^\9e\9d\16\7få\8a\90\86\1c¤\15¥YÞK5*\7f+ÍIß\7f\19ªk\fÚþñ»öÑeÚ¯«XÉ\11<\ 4*\rªß\8bî©\93¦ê9¶\ 4}ÿ\91̬èeï,FVo\15£~\82kAØuG\98)ؤ.ñÀ³Zm\ 3\19 ß|\17WÿÅv×MM¦\ 1\14V\1dZÙ¯>·¿0ÒéNX\9fò\96  -sGMÊZgn\15\16÷ÔÇZf\1f5\ f\85«9\0,Û5¸\a^ý~5ÁXn¤µ\1dë0ñ\8f$ýDæ¹\90gk\f¾ã÷ÎuµC\82ö\97%0ºøaí\85\9d6¼J°1\90Úi~´I\ 1\ eݲo\17\81zH0Ê\1d>ý-Ç Ä'æ\82rmk\86è£È\13ß$T½´OÒÞ\99\18vQ\ 1\8fUw\rй¸uKkÚ¯~\81=k\1a\ 3³f\975ü_¼=\13\9393\84<²1/Ë\8c\90^\vÓ\ 2»\94û\ eò¦Ùñ»\9aƧÇõYÇ~\7fÅÞ\17ì"þ"ɹP(\a\ f¡%\86ü\1f\12\16<\ 5ùÇp\9c¨sÓ\93\90LÇÀb°ä.\95Ö2!µ\9fî9PM\8c§\87Ó$\9aÖ¼Ji~R*<6h\14Ý©§\14þ\91àÍÙ,â\15²ªh\89°.àDZ3nPßQË\90ðÆëýhãÌs\e\\9d\9f\81\v±Ñ\99¼"£gw\7f0¦(Ý\10óü\a\86y+ÑJÊ
+À;}\8d\0dtÉè\85t¨]÷1c\91z{-nYép\1ar¡¿æ;¥×ñY\92vÃqæ¼\9c±ð\8fdÜú}Ìôè\1ew\937S\1eª¥U©\94ôJ\9fU_Ào¢²\80æ·ð¼µ\94ºPlL\95¸À\9a!]¾Ã?\12¹ªÔ÷öߥ\999^» î\16\9aô³.        £íÑ:hß\vq\88|¿òmÏÐ^^LÑìðf\aKÕWË5f{ÖFTwé\90\9d×\7f\87e\84NGXLNîç\183\8dQ\7f\11»KÁî3wël¬\ f\ 6\1d\91]­.\95Ø\871\8f´J )û_P*sÜÿHò\99¶zÙ¬\83áûn²(\18â\ fF=Ùãçp\10\95v§u;\89e×Ú\ 6\87\98Ñ­r÷VxèñMtíWgùo\r:cI\9a¥]eò\94\92£×ÖÏAÜ8\1f\94\9f8\8c(·5Ëòm¢ U²n]\86Ë\88}«A\8c\7f!\9cüà\15\1fÌúûFïôùܹq\o%\ 5£\16=dû¨5ä\85ð Iæ\1ar8\ 3\ 5ZºT1kw\96ùÅ]½\89õ\99Ý/ñü,w¦\bíÖàÃ\82\8f/9í׬\16¿æÚkn\80ê-³é\93\15A\9c\8fÏm\8bº¡¯\82X\1f\9cHaÈÖôVÔ[zb2i\ fÄJé}Z­\7fjOú\9cY\81-\ 2\10åOf÷\8eôYܦ\1cZßæ\83&.7\ fA.ÏÃ\ 3\12ÌðÖhÛrk\8c²\ 20\8eiðÆ,§2à)&½¤\15:\85\1aÊRC\b{ÁV\8bË\8aÑ\86-[uÍ5Èaé|NÕ\8b~¬6÷»\17\8fûo§UqhNYu§ù\1e\81Ð\1cÌNËxÙóͬ¥>èç~:ñ\ 6óÃÈØn®\1f\16=*¡p\19\89²>ݯ`NÀ\86ÞpЧmm\8bG\ 3¾DN7 j÷,U\7f¬\eÔ>,³   RþúN\b\9f"¦ó\1dÃ:\86\99y\84¶nAØfå\95E\93\ ÎÍ   ÃÆ\9cu\12XÄõàµÑK\1ac^iAÎâ\16\ 1V\b\9aînÞ¡«¹=Ó[¬\94\801Ú&. Ë»åèH¦°ë\17\e\ e\96\1emXI«;ç0\ 5Î[³\80\1djãùçMõÙK9v,è\1a#Ò  ¡C|¶ÔbIz\ 5c°Ôcîaû4¹ºnàn^.Â\15de\8fô´ÚÐþ`\1f\90\aî¥_jÖUÎó²Ø=Rû\82ÿuAÉ\ 3\92Ù¡\99\v(¦<û\1cøøij¡ÔÁuvlï;?Iò¥üƨ&³3­P\ 5\8bfðÐZ¯$˽­dä\85\9b\8c\99´\ e\86X^ô×Ú¸t\19²3d¸\12#\12ã'IÆU¹Ï¡t\93P«Øh\1eªpnNâ³     Ú\93\9b5;lÁ\1a÷­\1c®BÕã\1c\a\13f\1e¿!\97\94°|\1dï<á =Aoßî"ó\ 3\1f\14ðýTì|ë¨xC8§Ø«\11²èÊÛ\1a_J$+\9c]xV\12\98Ö\91?\1c\89ü°\9fª\9eÍ­ä\8fã\9d`ÖñÂ\ 4\ fé À\94ØÖÁw\13Ó¶Gé98̤¦L%ÓÃÂ(«É¼?çn"hÙÃ\1a%¨Ø±Nñ       \16¶8õ\89fÊ«\91\99\ 2\7fbä>\8dÙ\80\12Ãd^\1a\12\ e×\87\v¼¬\ fªt`gÄ~v£[0\97¨±a\1d\v\90j¤âÎÆC=8\rI>\10q\96\18_ûcmß0Ç\ 2q\1a\1a{äÝÓºá§%RÉ\84I?\9d©ëPXÆsÅÙ\89°ø\96\97G\ 1ë9ÚKÜé\89\8eصw\9c\99\18ðñjÊ÷Nö13\88\9b_æßíÝ\eX\84Å¡:N\90\16\80^Pì\81\ 3oÛÛ­¸ú\16jËwÂ\94\9cÍ\94ñ¹\8f±Þà«Ù\ 3°²y³Ï's5ïÑÕ\10QÒ3?£z$\127m\98òü\88\8ekñKa\95Ñúb\9eÆÍB\10\8bþ\92Ãî\9f\19Û5]ÒC«Ë'_×ÛPO<        °#/V\1f\1e[®UÀ%\1f]µ;ñ\16Ì\ 5ð3ß\8f+Ó´\92!¹Q\99\9d\8dLTæA8\8cÀö\80ã4¤càĪ¸óµl×ä»\93+×hT>\13g\12tÏ¢\11yt<«\17N49\16\93½)ã+í&Ìi?Udʪn\98%þ['\9bv:\90=\96Þ ¯p\90ßGÀ\13Ñø©\14·Þ¨\10,\9a\91\80!\ e'Éý°â!í\ 3Í\ 3»ÞAJ±T\90\92ÕtÃ\9fø9+=6$2ÞÐUY\b¤o&£\9e\13ä\1d\14awÏ) \fbÑ;Ø\8cÅåÎöÄïÉÎOE\18èÇ\15¥J\8d\13¥Aá\853å;Ö\94\9dI¶ã\82(_\8fq)\98\84\8etÚE\8f\82<ãdé}ã\12q0£\b\17+ßiå \11\8d/\81\12Cñ&\13H|î\9a§qC\19D
+?¼ä\8b´\845\\13¾ÁÐLéeSN\16º\96\1fU%\8d2*ÆÙ\13¾\b7Ôqä±×Ù\82b\8aøü±¢  çòÒÒæF\15çñ\84ë^7\1a­Á\ 4O\88çÊ¥V 7ǦBO\99\85À\rÀ·£Á\7f.K³æåbWØ\1cO¶Xo\8d`SÉ\96K\11Áº§\91½\7fv\rútÃD}7qa=¬ïõÛ2\ÉÞèY\bÅë³â)Ð,\11Æ\9a6×Òr\168ÇCs!$EóK­Ê\99j#±}\17«\93mîîî*o@4?GQ\17Ëïõ±0<õ§
+Q@Cþ
+¬1;Û\12Q0\8dK¸ÐWÙ¢àõ¥\8a§6¤\8b\10<ãÅ\bÖ\94\86\13>\ fgáË\807x L2ë\82~Þò\1c Ã°&P\9dä}Js_'ÿ0ñ©Ö\aÙ4bIÌ\13Ð\94Ô)¼oöý\v4\18    QÁXv\9bõ\vè\r\ 1±+(_éQ@\ahYÁ¶WBÍd\87´Ä\82/Ðï\ eRWýÍâÆÏë¨Ì\12\r6S\85q@`l\9aä%UÎ\16W²*Y=¨\ 6¯\8eè\1f%¦ ßÆ×{ú
+õw\80¦¶[ÓµòBä\11_g\KùÊ¥\ f)\1eé6ÿ©×-åV\eD\9d¡°¿
+Éh2S{ñ\8dÿ#\12$a6«+\8b       \9aûlÌE«U\14¹c1R\f¥Vç\81t^\15wÛ ¨p\96m\ eO\ 1eKÈó°U\84]u\ 1-\8dÉH\1axà;·{$\1e\1az\17¥u\18õ\14¨\1e\16\14\ 4\9f÷\94Fk^\91?\92U\9c\1cW+B)£Û<¿\91_B\am\9f\ 5½ \14F\97\87\ 2Y×ø_9®Uþ\rr\12\9a\ 5µ]Ö>\9aåËîú\bpx£ñÖø\96¯Ë\86ÐÃ\86¸B\ 6êsµ*ËÎpñ\85x~ ©«ôõWf»&uË{\rY(0ñåÑÔ\82em¤®Ì\91Ýú½Ýnù8Ao#Ç\18×\1fO¹ã|\946?Ú\1fôÀCÎ2BïzÿHj{¹¼\9ci\ 6¯EK' Ú=é}M÷ìÊ4¶6r\85kÒ]\vó\986¸ö<Û|\86_Jº·     \18jU\8b\9cq\17Ø¿u'\17z\0\8f\80ðbWÚ­é·\\Ú¦g)ÄNJ;­2±)©\82³tÁT\9a\ eæ\95vmtNíãB£%ñòäþ\91TrÉ!¥§ÞÅ(oz\8f\88\vÙ\85dïI\8a\9d\98Ø7¨\95®\89$ÓFs`\80\13÷ÖA\92 ]©¾\88ËÜÔÄÎé\ f\89u°Ì"]èxcC[Å\86húö\88\91üwª\1f³Ö\eOÈW^¶c\173¼¨³\86ZB\9e8\fr«¯27Úè\12ø;[°í\f6¨Ýç¦Át'à&÷ÅQ\ f\95õ\89\ 1ûå
+ßëÉ\81^I[z\9fqª{\ 1ä\86}í¼¢¶\15Ô>ÉB«HÒ?\92bÞ<Ë\1a7³²\90¾\1a5]\1c\ eªÂ»_©\8b\88ó¥µcu®âÍ\96ù\10½ò\rÐ8øÉ"V{¶\16\1f·iI;\7f\12ü_þ¾\ê\83ßÿG\15p\9f\96ÍJ     Ö\82)ÿ¡ùû\13\91mMÍg\9a\ 6§O¡÷J/gÙ\e¼\19õVzð\15ÀX\9ddu¿±þ\16\ 6cÎ]k¸5\9cjÊû\85\bC\7fÓT³\ 1\7fW\9f¥F{\1cOæoÕ¹²q~\16\83@úÛ\8d®N\90\12«Îîeö\7f\95ÛK\8aj\12ët\94«,\7f\8c3>¿«çÙmE\9dûnj\80GMUI¯ÇôÌ\8fðÔÉbËS!Íü\96\ fÐ\8aÐ6\96\8eý%A\9c\1dãT\8eZ_½\r_E~çµ+Ö;\1coÕñ¥\9cÛ\12Æ\88öôÍuFW\94û\bl7ß>\80\998ðz*ûÙùðoXB[ý\9að]\91\9b¿\f\19[©3\95>Q$ů&/'þ\ 27åÄT\8a½¦Ý×mí\9a¼\15\83\81¶åTú\0ú7í\98ÿ*·ÆÅïbá+(µUó\ 5-y!
\ 1\fìCåö\15¿£ý{4ô°×\9eUäA\966Óïç7HÕíWA{ìä\1f    e9¥Á"ïÇ6Ei{y\1c['\89\ 3''ö\9a7\9dc®É\8d0_\9dI¹;Ãk,\axpÃL\ 6h\ 2z\9f\10çZõU^\18,ì4B÷\ f¬uã\96Öãü\13\8f\8eÆ\149¥ÖeÍK´?b\13\90êñøT\1c\9b0G\14\1a`¬<øë4 Ìà\ 47þOå\16\97¬o/3Äó|c
+J¸*\9a\17á²\9f°\1d     \11Þglm¼dWèÒ\r|/2\93:e8ak\ 5ÚVG\11YL¼ü-\f\1e\7fÚAº<ß5óÑò\8ala\9cðRvRr?tÞ\9b]\1e^b¤,C¥EÕh)\v³¾ní_r£º\e\eèÊþ·\11s\19P\16h,9q¤Ì\12\95¿v6FÖÕYâ· \9eT¤ø~\e\95°2î\16Dt¬¼.~GO\90.  jÆ2/©*+Cû[¹U\89´=4ú`ka"n¡Æ¨/m¯ÇUð` 8\17\ e¥/TÓ\8b\fVÖY ²¨\9b£nI;n)Co.¬ÿ\16\ 6»ªÉ\93+_¸W5Å2\rôk0øøϽQ"·BMý³\86u\11k
+\9dé¢64\ ezy¡=ùò\14\94¨+£ÉGYüKR`\99½;\87\983ý      Ó\82
+¸#\13½©\1eãìtø\93wO»\17$\8cv¥üA}¼î\90\96+Xy⡱û\1eôßz)dV\7f\ 3/\ 4³ïÜ?\94$×("\9d\18Ò¶×\Îö:°\95ð\ e\9fl\ 2w8\9b\92\9aÔ\9eÝ@¶A\ e5\ 1o\94ÿ\90H\fñK'Â~'ód¸; Ê\8fs¿!È»5Xfú¸\9a|Y¤¡0\ eâß\88Zse<Ø-\ 2&NiJ¶ÿ\92T\96\1dp\81äÐ\9bʳÉð\97¾\8f&\f=\1e\84\r\903\vÆÑ\ 1ZõJ+X}ëü/\7f\99Ø[,Ê\r0\0¾*м#\1cv\7fa\8a\95\92Ä/·\88è\9aM\86"\17µ8\12ú}\82uj\87bØ/Åü]XðÒÇ®\89j§V^A[á\ 1\8d'\96òZ\92ÿò÷\13êî\1a\9d\ 3»>ªW\89\18ý¹\ fÜÁ£\922:ïü®¤°[Ë.\11X¹EÙME
+bß³¦=â\vð³--½"\9dü[¢ôº­½²J\99\13âß\13ÙïÉ\17Å[\9dÚ6z?\80½©Í\10\8a8Ú6-´ö
+ Û÷\92«N\85½\14Öæ0ò\81\7f0;Å-\11r\9f¥Mr¢CÓ\1dd»D\ f\1fIÂJÖ<c_´0k½kÕg÷\85\86ý´\95¹+\rX@\1d\90Uµq°³¿$\83Ã\180/è$sJ\f\97·4\9aÜßIÃ\84\9f<eùÇõºGolÕàÆ0o\1a\86éBÇ\8f¸1:\rïcP\8cJÿ#Ù\14\1cÇ\88ÛlóüÈ\1c@I\0»Ö\10Þ£n'hX·ý%3\17\95U\ 3¹cß\89¥\8dØ<t\9au¯³\ 2¬²\98ûÈ×ÿ\19\96rMÿø0öɯù\8b×\93%z~º·^±mµ\18aÕk÷¬\8e\1d\14?ÚPÊq\8a\ 5\14½º¾©·þíÂ\9c¥K\94`\a\87RÃ0?\91O\17ZG;¸\1dz§Áë¾\9b1Ýfyçóp\89ix\83é\90\85ÒíÐ?ßjA^í\19r²áþ}\83~\ 2î\ 12\87~i\1cNö^\ f\1f\9fÒ%\9bütµïB\92Ó-oM\82\13_\ fÙSF\7fZ\1aýæuøåô\1d÷°ÝÂðö\ fF(\87»býEõ«}\8d\97&5É\7fZ\b8ØTÎ4ÿÞõv\1e¡\82n棯@Ü;GO\84ؼÔ3
\80©}ÿ\16\ 6ïéþ&:ÍYîå\bÈq\85\1eg\86Ì\88«W\1f÷\9cêÅì\9cPx.~\8c]Ïå\86,\þ<Ú\82xáJ#+ \94ç?\12\1f\9c\12\96'\1fÑg#?*\95§\ fü\16ô\814*ìäýkºv\99l\196Øg\98o¯Ê; >pÇ\90fÿ`:âÿêNl@úE\8dú\85\16ß\rgÇñ\©\85Zq\9d\ 6îÖï«\9d\80Ð\ 1ufZ\ 5ÇäÏ\93ò\87\9eoÕhQ\98\9b'înþ#¡^Á £än;rv\84:\86\91\fÆ\1eõ\88A¿ÿ\9dê÷Ñ­ä,PóÛÀä\80Ö×h\10;ôú\8býHêÃÿC"\14\17;\eu¸²_ÛÔ¿cóL\r-á2\1c¸ý\97\bµYÙ<\90T¾½j\7f®õSù\95h¶Ñ\fjm\93¨[ÿÄí\99tü»IMÈи¼ÝÉlâ¸\9f\ 6ð®Pq\86\19Zr:ãÁ¨ÑYÕx[UnS{Ù{\r\v\0z\16\94FRÿ»Ý@±59ß&¢\8a\83»\9fâ\990\eæZ\8eFda\1c+Ñë\88\ 6Ç4væ4J¥C·\98
+¿èÓ\e(²E\8e/Ñ?\12 \9bf\17"ÂmNf\98åür\8cï\v \87ò%ºÍêÅV\1a5Ín\9e­ÕF~\ 1c_Ø\83\89°Óì·p\94\91L¤SæïN\19Õ\88[M.\1aÑr"¶   jè\f\r\92¯B× ¢\8d\ f\83\ f\89×ÏûK\88Ë£%XXÉ0¯m«-ÓúZÿö\83NY®\ 5\92/Ltq
\1d\847~Ö¢3×\aP,H×bSÅj!\bb×Úd\1d bߥ­à\80[R~×ïS>\9e\80Õ\1f\12ò»¹\10r-+ıԭo\87ô¸Õ\91+E\95
+iµpCB{vÿc\89?\86\85 ³\7f]ÀÖ\9d\8e\ 1¬\8d˳'þ\83ù¶\92æê\ÄûPó¦b\8fF5*ð¸\8c6y\ 4W\8b\150\f`²s®Q\ 3õ¦|\r1óÃ\1d®ç=É\89ÿ¯rK\9e¨^]\9fª\8d\f»Û!Ñç
+ú`ýl\ 6a\81\1a\ 4©kÏ\1dîú\13\81\93⻪õz\87\96AKÕõ?\92O+N¤,Ä»'_5W³Ó!dCø\81Ö+fݬ÷Ä<Åõ¥ÏÛªM.ÚȸLæ\92·\99\95à¼ÿ¶ò?\18rý~\97\1cêf\"Â[Yà    _\17íôÕs\ 2\bU/\88\8dà©=\88à\9e·ÔH\vd\8eeX\13j\ 5PϦtó\7fâöÆ\15\98:¼£âv   \12¨¹\1e^Yi\83\8fµ\15\98Î\18\16;z\ì|¦$\8cn\97ìg\9d'±«[\84°\b½â\87£sUø6\15qÎSå\1e\9a\ 1ý\1eý~?\19\1c{°`\96\18\94r\97*??_/¼\80\97\ 1úÊ\80W5R Ïs\87\1f)\95\0,\9a\9b¯°Ø%s\8a¼d½\b¾4\eb\11\10Ûôó~~¨×ù«/\8a\1eæü\9eFv'ì!\18\8bw^Úqjå\ 65\8f¤iHÝÏ;/\rñ÷Ëç6ëS¾§ô÷Í\15¥Ô\e\9f\8c\ 1¥|ÃÚL\11ù\ 6ù1BB~-«+\96[\98¯þVu\17òùzî³Ù¡\82\16çíîC\8e-.\9cd\9bí&\ 4\8bòJ\1f£L\89\9a\ 1\9f£r\9fnóEZs:·\80AIß'\92ÊÃSß\ 3¬ÈJ\83Ê­9Y\1c"U¼Àm~yËâép½<ص\94\1a\93\8c¯¯¬Y»´0\ fÞòI\ 3\ fðÆU=²d8AùƨÕ˹ß;;\99nALÂܾ\8f\8aÊEbÔ\ 3ô5&\95dc\ 4\18\8f\8an\94\81\13\f\ 5¥SÕ-{w5i\9a\v]\98\80 jk!\15ºÂÄ-ºÕø\82sÈì6g\9ePA;Í4A52üV?­Izöc\vî]"?\18£¹ç\96ÂÝ\91Æê·Xp\89\1a\9fÒG\8cêô\8e\98\1d¢%3åY\15(\12FĪózf\13æj\95úç\8déÇ\1f\94qÈÑèz\91\17åç5\ 4ëÏ\12uZ\902\9e¬oSÏQ\9bE¦Úaú\8d¤ûÇËá`Ï6&`T\97LÜl{ ýç)æ¡Öókú\e\ 6¡ù\9d\15ð¯¨qbGåªÌ\82»çZXÃT¥§tZCNÝò\88Hº¯\ 50\89ñ6?)\9awvÝ\1a\83ÞM\8bˬ\rO<ný\1då-\8dä1¾\1fr      !\1cødOÜq"ª>ùéìä\bJmÆ5
+u\14\10øíC\92\8a»²\16\aÌ\ 5\10\ 6\9b\9aÆ\9a>³0¶¢¿\11\ eÙîÊÙ.D1\ e\1a\98"\85Ò#^\1f\ 4-ô÷MsâqåüqÞ?^á\ 3h\12RQ\1a\89\95"3X;®{P\90¥ü\93ÿ(ËO\e\89Ä\9cð\9dlº÷#§\10\963\ eÈB Ûê\14å'fe[×|ë$kWo#\8d÷C6ò\1f\15\152\9a\19Á2ªïnµ¼5\8b6
\ 5Ë»\93\13½ó\80¦ºN\95\11§D\19\81Ò-ßWÉbçÌ¥Õã\r\0Ê\93·\12\ e\8dhJä|ëÐÍtÏÙO\879ÉUtvRù·8Þ>¬Ù~Fc`·¤u{\ 6Ã\1c\8f\87¹3¥\ e¿·±^Îö/I7\1aÏð¾¨\12.\ 5ï\19Z¨¯k:¼\90«öiÜ6\18\1f>\8fèÖåû²Æ6òdg\98Èvß«Rˬ_\14\9cM\eïaáÎ\85\81²jõSJn]c\87÷Ú¤\9fÜÜ?W¹,ø¥'\16O\ 3ÅulhÄ\Î\9002oݧ½\95Ï]vU\84RøüË8,¾wö¤Ø­/B\83q¿ñcÏT¨\87ç\f´ä4º\87\Ó \99r\ 55©%^ô¼×EJÙæ\1a\82»þHÊ«ê®(°\10ó\18¢íÂ1:V\94\19*ÏÄ!*\95lò¶\8e)öØÖÅ\14Þ\82\82rf2\ 6"AXj6\14rT±Á>ë'ØL\8a\9b\8dVí6|Þ8ßu6ùq\8d¯\7fn\16ê\8c7ĦÂ\f\87ÿÜì·´I\96\1fUD\1f{\90j\96ûsîÕ´aq=\e<;\ fæaóW\ fÕ¤æ/\97û\13ož¹\ 2øø´ºY¶xW\ 4H
+/ÂÈà\ 6üZuN¢\aÈÂu Ð\98¶ê\8aâxAç÷x\88\{جé%n,:@WÍ[\10õ¼ltc¤c8]üæR!S®·ÒP.\1a¥\ 5\9f=\16\93ÿÇÕun+\8eõÊg1`p"\19\9cs¶É9ç\1cÞÿâ>ßé¹3?{­\86#lm©T*i\8bÆ\0.Ùe\83^\e½èéàÚ­_¶\9b=\981\16E\92þQ^\8d\ 37ÔÔ:\94\15å­l5\8b»]ìOz\99<¨Ú£¸\1aº\96áaú\ eop­óä »\18©^\f\99\92ö\bFG®scºû?9¨\8dÓR9,î\85¥Æsî×:àþ\bX°Ié uç\84M\84\99¾\85\90e}æsY§°þ\ 1J²·{¨\17=^Tñ¿Ä`_\r÷ÛuX\0©\ÜY\ 5\82Æ7\86\89ÆkV\181¥vQ\aG­o\18øþ\96\10ú\ f=F\9e\98Ïë\81.V\7fàJ:ÉÓÕ\ eß,gbXu¨\95öv»c\1cÓ^²´4¥Y\1f\bìN]ÇWh2Ñaÿ#Ôû\9dÚ)ºí\9e¨6G\86¥_KÊ\82
+¶èSЯió\9e\85\18%uk·@õÒ\ 6Ì\ e\8e\9aç\94Ã\16ø\ 5æ\99§YêÐÕ>C6\84Û¤?\ f\9f\ 4\99ûcLü,2\80Èõ\88¾ýtv++Ú\93=\19+ma'§R\ f>ªbmet\8bNN}Ù±j\93õ\ 1P?سå\1c\81×O{×,x2aã«Ý\9f\9býPü\9a\ 2ر\99\ 4s\95;°'5,\87\ 2\855uªê\e\80\8c\9böLY¨\10\eºzøÁ\83¯«\+qëE«z\13ĪV<\12jæaAO\fàÔ7­\ 5Ø\ e¸g¥î\19CÿO¾±>!Ù¯1\15H2ë£Èµ©4üñ[Û>LËæ\96¸\1c=f¿\9eX_0ð´À]
+(äæû϶\80r\16ÛÚÙäÐ6¶ÖfJ\8d­¸"\b¥SwÓ´f÷Õ\8fØ)ò\8ciVx¸(×áL5jÒ&´\84a\17h\1d&æ°\84\9d8ÑrPgùXçÌ7ç]«\17\80\9f8íÙâl¾\ f\87¿\fØrjl\8e¯½Û«a²¿_\99\15\13ÙÀ®\1c÷Ëc¿>^îLÕ\94²õ\86duø\1e{í^Ó5»Æ\15.¥uÇñZÆ#ø¡ãî"<\8e\8bõ\8actúîÐðbU\8aJ»mѸ,¥2»;ì\910\aHc\13ßøb5\ 1\84G í\82Ð\84\17Å\9d¦Ö\9f\16sÝêè\82¦\8ap\9f\18öõaÊ\bõ\16ãS xÆrX\8f\9bË\9eX\88Æ°\9b\ 6Y/i¤{\ elõXþ±$}\11\9f^¾£ç\8d2Pm\e\fvH\ 5Ú\18òxxb-pÜû\13Ó\96\93ª14\1fhµÕ6\97\890Û²\86\7fǸNîÀ;\1e\ 6\80í\83\12\97\ 6åéµ³ >\9a¯\89<ëä\8a\1e¾;§Ä\0n\ 1j\199t=©¸Ú\80^e±Sí±\ 4\7f\9c¹\80oN\90¥\ 2\14\1cÅ}<Õ\83ÖçJU\95jy\81;BU\95aV(­IããÑM¤)ðM\14¶ªWßöÈ«ÄüÏ\9c\9d\ 2áêgýf\9d\96\8eW\18Ö­\1dSB\14\8bþ,úY"ps\16J\10Ä­r0Ò\91|r¡£¦\82r\91h\19\89\8b×þ<\16osè0f°\90=g\82\9fóê\ 3\ 3\81 ±ãû¾GÏÛ³Ä"±òűî^TNk;ÈÒ+îÆ\99:kïÿ1·âË!A|`á=\8ap\ 4òúr`a­\bs\ 2©:­\14¼Ú¯á\84m\1cì°ëÔ{XÉþL
+G°õ\98´\1d\84\90ü^ý\\94}¬ª¶í%í ª"¿RoQ.Kv\87ÚdÙ\93¦sÊÐ#\8f\ fÀ\ eï\8dQ\99Ý\12¬\97\8b¯ºÝ'G\7f\85\94lå{\8c:¤9%f\93°}\8b\8e¶ðb_\ 2e\ 1\9d`v\90J6Á\94×\r\13\19µ\ 3Pd\1c\eÛU-°| \9fÞEÎK¿Ì­»\86î«dqî\19vUásÊ\8býÜâ>w\97­\8fI\ f['CËEÖ¥ö²n\95Ü©\fN=4ÊYUÔº,æ\7f\16aç*·§©È\84Ø~Î\9e\13ëÔÃ\1aüuÔÈ:ì©8\182Öx\<5Ên\7f\91\98\13\99³Â¸¹\ 2óm\95÷\8e
+ø3©j'
+u\15sé·
+¶ôÛ^þ&)]\9a\0U&Ø0\17\87Òø\15 T\1fëc`Ug\11J\885_\85\vvýîó\97¹µ\11ò±\f\9aèR\ 2Ä
+ó\\8a\81Ç{uNØ-NªÍ\ 4®ÿ8TêõN¯¼×\fsP\ e
+\87 \90/ÒÐ×7G=4\13úuìRÕ\1ek\fÂÎ\83æd2\92V=k¤£ø:\ 3P~\87\94JT>¾7ôýRWýæ2\ eÐü\ 4(\18\rã@øÄøü\97\8e{rþk0\fµÅÄ\rLl\v\94}\81\15ïì~Z\94Íp\\8c¼\9d@Eõ\96Òû\98\87{\ 5òÖç~7\ fáx¶þÃB_üð\87\18twìÐv\17]Ò/c\8d»\84÷Ï\8cÝ9\8bc/&w\1f²WlOìînÿñêË×\10ÙË nwæ©ä~Òô¯Þé"øyøpÓ¨Èâ¼b\93ZxF\9aËX\ eV\92      Ó\9d%\17ý\8c£k\1dôrg×òùÄ\9dMéY\1e1\92\82\vîZÈ\8f%`çª\a[jG{Ú¹ú\16·ñi\17\90Í\9cìnRcF6\97æÑOr/Ý\95}GBF\9f9ãûÝðÏn;È\184þ²\94ïï_ï\9aê£ÉäbÄ\18\83îáÕÛ²¹\89+G¥m¼p©-#ÕFï©\17\ 6-+rÞà>ÊÃÉíâF^ô3½k.Û\8fN»þ*çÜ÷\ 2+\88\1eÐÈzÒi1¥».k\ 2õæ3\14\1añÅ0%g\17ï/\88S\\e\ 50ÇáV¿~{L/)ä}ByñÁgbGºôâ×BªÑ8³\rdL\96\1eqe»kWVñì\8b¡'§S<V Ë\1fO+âgå}ì}KçS餳Ø\ 6\97Ù\13\ fh\89ñ\1e¯ì\14/\8f»Ñ\9dÉsD\9d\9185BQ1\92\a\r\16Âpà ^\88[\1cúÍô\18.âSÈ\14e¡©À\1aþ\98f½µh{yíZGÙ'µ\ fÞ\89Ã\876\12+íîh®Çm°\11áP\11\aÊÙþNA¿¼~\88Áo\ 6\90\8dæ}Õ\8f\16¤~ý\9ef;[\ f]\81ÂU8ø4vg\884±ï\1f
+q2oAy³\985\8bÍ2´ä\ 3\f\99`¿Æ¸|´Xç'Ò\ 1âYk+Cf¸¬¼
+-µaÂÖ}ò(\a\17\1d^U¸Î\0±\81Õ\b\bÞåð\ 34\8fã\9b\9f\1fÅ ¦ÙÚÈmhóFxÂ*\99\18\96K{#Ì\85[p>8\9f_vÃá\14Ë9÷¹4 ^\97bé"$¶s\8dª\8a_ºìÿ\9e s\eå\v\9fù·ì\9e\13~D\14¼\10ÌÝÖ­Â\ 6?øà3ß\ eÊL>_A.ßç½Í]3Q\9fÿl·\9f\07Æ(Gt\1e\e4ä(«\11ù^\94BÖ(±\9cðý]a[z­\ 3ªq¸4\88\14\¶êÃ\ fo§Fi¥]½ >­\1f<þûÜ~-ÑÓ05\99¶Ä`P\96Ö\12\87^\9c\83¤/\14©½Ú\ 5c}®\1düøiÞÊ·K¥\14ÝG\8cæÓõU\ 3\90\82\ eä(\95É\8fvQNf\ 1'X{ZëÌ{×>\ 3\12gP|k\1d¨\1d,ÏËïé{\88r\v@Ý6º\g\fTá ök²ó\ eÝÀÝ°\7fg½±uç\85pO~[¹'²ÑSúíhÌ\1aÍo\10â\95@<Ñ©\ 5p\1c\9aâX¢6\ 3ýÑ\86\91zFË?Sý\82\1fKê¡Æ©\rn\90eÏv\7f¼¶é\15\1dn´\m±Ly\82gj×æ\10Ö&µ¥\91Ìæ÷2\98#úSmT¨Ë¾W\8bÿRë°ß^`)Çk¡¿ÕתvI\95æ\9ej*=C1¨=\95K(ß\18¢V÷\93\86¿        ìÄß5²\ 3x8XÛAó\a±H{\fsÍãusM£×\96¦åa%g!%ú\98\90Ñg^ë'uÓ¢JûZ\9c\ 2>\a\16
\8e\97»×W;\7f-)\8aé\1eS³ãÉÃǹéP8|M\1c\96-5¡âô[GwP9fñ'\8aò\rÖvÐ\97ÉÆ$\14e p9þ\87\ 1\93B©÷öºÖµ\92\1c
+w\94.o¯7On<Ʊ#\11XM\9b\1eÔäþè\ 5Æç\8a
+\96\9aã\96»Øä¦\1e`âî¯1\85JJî)\8c»P98Ø\1d\ 6\87øì£9â\14\83\9f UÈí¢¾g'(¶\12\1aÁ÷\15X\11}.d\95Ëäùÿ,\11/Bv<ckn\e\89¢\1d
+t~TnFÇéê\e\87w\8dc\98j$\9d>JTà!\16\84©ÇÉ»ò\ 3Ûí¬£_\92ÿ0}\rá\a.2ð\94#\85¹V\1a÷»'ËÀ\89Îd!\81ÎìÕkW̬\85\9bcLê
+G¢\17\8alv\0\ f\9cÞË\9fØ?Æð:äö$\9e9Múgn_#ÉChÊR?±{Ò~­\95Ûã\1a¯\10°#ôÈ      òÈ\11Fi¢ø\9bEÍK«»ßu\16\87Q\86:\a\bb7è½ïÜ\95Û©_î9\91üÂá\87{Uû(£wÉ\9c\aBPù>R\8fCÉì\8c\9eBæ*\8bµå8ñ\ fHàkr¿¨Í;©×\e±Ã\19      \94Þ3\9d°w».6ó£²óngJH½C\98Ng3¸×s¦n'ú³yeÝ\9dZûM\88\87\81Û{Rð\98nç×y\13\96ã]W8Í¡úY.!&«¦½\ e\18t-\b*L%\93á¾0\ 6QâL¯;¢ÿÅÜrÏIµ`7ºú´;]#\9bæ\1e\1f\15ì\16ÞE:Xâ.Ëʲ ÙM¶×owê%%×\8ercÛ÷¯s·qü»\10æÐ\9bôêãÍ\83\87ûÐ5­ý¼\13øD­¾N¶\8cÛdÏY§°]ekG\b©å\ 1·UëÜ\92# Ô²ÕCñ?Æp\9b\91\9dó\17^5ìÂÀ\13k®:1î;¹e¡­\1dÇ×2\8fàk\9f&Ófº!¿\99v|ÒV.½rYgs81ÿ\80ÛCwØ\9d\1dã\15ý=ójøjT÷í7)­ëËH5BÇ èÔ/C\17\bÅ\12#h3T?þØã¬;\9cæÿ±dÔØrc~gìA¹t\8d\17áG¼!â-H\ eJL\ 5\99vP\1d\1c\1fù\94?øê\1d´?Í\a¹\9c¨}B¹i]ù5ÏWÆ\87@kW\1f\r±<|ï;ø"­É\9f\a¢Ig9?³S\82j«ê\89<+FºÅ¸á\10\90´\19Ï\10ê¤Xí\96ãÂ\80Ð\17ò3+Ø\8d\89\ eÞ\e·¬\rã\0\17\91\8d«\84à1Oén\9eyJÇ!)+gÊ\9b\e\8cFX\8a\ e\14¤&7ß\Íüö±Q¾nÿÈ=5ý`¶_B\93'\89é ]\ 4Úë/ðU9±ñ¾sVo±Ì\98[K-2Cé]Ý£ì\ 3S5k0Ø\8a
+»«=Ê¥'\99³vÌqe¼|\eêïíÍÈU\aI\91\ fáH\ e\0D6\háZ¢\ 5ú²R\1c\91}g-´\1ere¡<\89\ 5¤\r\9d8Äw2\9b÷̬Y¼Qv{§åË+v\87Ö\9b)º};\81\90D/þq¾ÖÍõ#¿ó\1d\88Û\11xf9_+{S«5\90k\17ÀÅFï&âQ\8e»2ë8,õs\12~OPjpäô(~øôMÚD3\ 2ÏÖæ\b\ 6\93teC?´Cù\ 6\15%\1c\9dw\b>\x\ 1O\95
+\12\92c\v¹12\ e]\9a«Õ\99Ó \r&\81 Ûm\8f\88T¾¤U\12\93¢\ 6«$6A^ø\8cª\12s\14%6ºÍó=I\98R\1e¦\8bX\96\bÂ\8bÞü\98\ 2Ò§{\91/¿ûó)xgç\90cyGüÅt)uyçç*\\93\vJCO_sµ/úÓj\9dÈ¡î:qû·\91ȨÕB®\9b\1fåÜfE((ãx8\89ߥK]X\17\1fUu\7fѲ©oãÕÍ;ÒúræµÛg`1áZ:)=àÒÒ\8f\82\89V_ø-±õÏ®Øõæ\1c%½xê©°.\9e÷\98\a{P\1c£7Q\83\85U\94úOvª\1e·¥¥Ößwn\r«M@:\ 4]2Ô©}Þù\18\90[;ÐÀßHS\1a\93\18D\84·6zØ#\ 5\16óQ\17ns=\19k]U\12\eGúÞî"\86Ö\98®4aÓ\81ÑÊ\88*\18×3\18ÙQ~Óé\98±X35ßnJé\9e-¹ô®\98Ehs\e\1e\1a\81ÎÅ\831\9f[U\18\8eÔÖ'=àçݼkÙÀð[X\7f#1À}ëZëíB\81\bRz\12\15öÃ\96\93 ß\80Ú\ ff\89Î\1eÕ¾£½n\80ò\ 5Ë4Í\94\ 4Ù¡\83{K-U?Ù¾Nd\957q§zí·íÞ´òu\84.¾õw^Â\88L)l}«ÈÙÍo°[YÚ%/M¬5's/|VD¥\1a\19<nh\95\91\a\9eÇ]ù³ë\v@\vßÍ\1d.þºÐ-'À¡À@Iä\8eÿT\ 4bûÕõ´Q©/\84Ü\ 6É.'ó7­Í`}
+\98ô.+¥Ü«\86¸árë\1f¨ÁÈ\9eTÖiú®~\1em\ 2Ù\80\82\96î4û^\806Iû8\ 4Å\ f\85á»cÅÀ\85|ËÒèÊáð\16Éîô
+?Æ·¼.K\9f\bhö±\87Ã,¤&O\1cÝzp§·zW¢î'ánÁ²F®ýG\e/vYI»\8e¸\96Yvk\89{\1a\88Ü\8e\11²»/DÊ\bfíù\bÝ&çfóħö\1aÖãý0û56si\1fÅÉ\ 4a\fö:v\ 4|Ñ>ËÉ\95³Mpà\80uiÛ/ªuð¶2Ýãí\afëC/Å4\1cOGþiYïËö±ªê¥1\16¨it©(\8fñø¤_Æ#\86Z]×o\8dê:Ùè¢\91Öâ\11ôF\ 2G{\9c¸K&m \93Ü\84qÕùµ\93S×ì±oE\10VÑV^\84jS×TùÄ+\8fõQ_¹éq@kµ\aP\1a\18\ 6qoé#órþ\11é¹\10uSôyhyO`\9bAu\13B§{Õ¯\1cÆÊv
+½Ì(âSÍéÇ\17
+Wv\ 3ó\15V`½*\9f<¨w\1fͬ¢?+}#?ÈÅPwZ±÷ i)l§*\99ÝEQ´¯9ØTe]\14¸sújاÆÇÑxx\97ÝæS³ÐCÞ>L4H\13\97Éð\97\8de$=7½Ê¹N{SG\88¿ßf.\15è\9eã¼æ¤<W¥ò\1c GÏ\9bínr;B\ 3ÊÎ\1a\12\8e;Hâ\9fò0Òkµiø\bì,\11ÈÔîÑ1se\b\f!ÿcg÷\14s\1c\1f\f\91 \92\ 35UºèË\1aÖj±~,¥\vU¿\8e\7f÷;\9d\96{\89¸\82¨ÛÇ`/\91s˹l/\8b\9e\9c~Ðwô\9c\9d\ 3%:<\9ed\v)e¿&Ü\91\9d\92\8a.»w¨Ö¬.\83¶ZþÑ\8d\ 3?»9\9a<K\9dæTúæ­ôݦvË\8a<C\14\99}Dójâ§4ª\8cåeXÝ      \80\15÷Õø ìû1ñkI§g\1e\9e\81r<a& \89`\8e¬j\ f\19H[õ\vÛ|¶'Z©[\1a7\8dKõ 4.p`Ãí-TÔö'B9NoR65\b\ 4ÚâÖ\97ÔÝ;o"\9f3ª{³f ¿\11²l&W\97aKõbU\15¯P¶\13Ò*\ 5\8d{e¬å{\9a~]î­±%üè\9d\ 5­õOz\ 6í\99²¯©Gåc\191E\ e¥2\1cªÚiZ\9c\9bð½Û!\9ei/Ð\17L¥h\86´%\16\e\ 3Æ×/9c\96I:\11¿³\1a\9aQ\9b\125=\0>wmº\9då\8dí¶@\19ØRü0Î\10\1a\98ü\en\18ãusP\11[ÑÂ\1cÛ\93\93Ù8\9a\7f\190ã 9a¿h=Ñ\85gã䤢ã\ej#\1a\ 3 ´¹kÿ¦ï©?ÓD\84ymTluz\98\19ø¡o\16ó9ôlKS\9dÿ¡ãÎù§æ¾ÎüGã
+üS\ 3\19{î.f­²\ eÌp\8f¾VÊ[WÏ\15®zjadùåMN.\11Å/£rmL\7f-\913ÚN5N^Ï\12\rÐ\vÒ±Ã~qER\14Î×\9bî\1fv\93X»4Q\93\0C^ð\9bÚð¥cÓoh8Í.\88\17\0ÄõÇ\12\ 1ñâ¡®U7>\1fÕ¤8\9dG3\024Ü0Ú´\9d3³«\ÂÎÑ\8bµu\95y\96Çet\16\92k¹§kÝàwüðÄ\1f\95µ"õÍO±\ e·\81^KTS\10¼
+\1e\85\8f\12ÓkS\1a\91\14äÆôr¿Æº\96ú\9a\ 4§\ 28áé\8aÏ\19\17Ü:3ÌÆyµP\f\9d8.«\8a\98÷PQ«»[§ã½\82\96Ü>mäêÚª9»AÕÇêx~®hìòáv{­\1fÍ­\95¿úC{Ú\eh\86V.\9bÒ}~xÛko\9aòllU\94o\85ðGdq_\ 3\13Ü%ª;µsʤj\8fÅ8\7fP\eoõr\12 LÒ   : \9ac\94£¹\16­ç2ß\90§Xg¯¾ý-fcÅNH\9dó®®=¬ÇÄ\16¯Ç5zA\89£\1eZ\95³ýÞ¿\88ÿÇÜ\82+\v\16Ú\90Þ¿¨°þX uK\0U\88\eËÓº\91ÊTÖΰGxQíÜM¸Âέõ¥¹Ê¯ÓÓÛ¤På\87ä·ù8øX̳\19\9b\89s\88¿ieзº`cgî\13?KÒ\94J     °µ%·\82\ 5\ fku´×L$ëü\9cÜ­\99¹\8f\7fËÃwß8±$¨\83ߧç\16\19pjâc°Í!¯\ 3ï\\98\19bZ¢R®\8f±åÙ\99\8a\19\10-8?K\fÃ\89\9fµö/sk­î~àoF5Åè\96Ì\8dä%*íKóé̸B,CÞèÒÞÛ}3µ\89.z\1a*\97·¼7}­\1aæ^\9aþî\e\ 3£è\10\83\bù\bw\97\a\92\e;\ eél\1c;¤¥\87i\fM\17­sýí:\18\9d  Ì\88\9eÕ]~\\85!÷9¨'?\96\98\84®§L¾Ñ1\80\8bÑ\96*©UMêAkdPÑ L¶\8b¯^\f2\13Â0Jø\12\9e\1cÕ\95ËÁ¤Jàà\1fÍíqºñ\93x$)W¼Ä
+\84°)úµggÅ´ôo\0\ 3k2ëç½K©ºä·'ÙK=Ë\1ft\ em ës\v\ 5S;Y\1fó\r\19\8a!pâö\83V½DëøB°Ûße~\15d\ 3e\1e\7f¯÷\9bØ\91a\95þmÚö\84óS\821«¨¨Ì"øxß\98ô³\eÓþºVϽÝ\v¸Â\91\9b@yus¡;\ 5Z\vz-ðK-_ ÷nüP\8cª]~\15µÝÜ-¹÷Õ)\ 2æßè\96Õ\9eòzýCÇé+±ÿÐ\9eÍZÞE\86\16Å_GÖV\9f\88ó¥ó4\96\141\ 4\975\83\9b\v\89óì?\1fÐU$\18Ã}¿\12\179oþn;LY'$R^\1e\ 3\12aÎW\18ïè{-\13õÑ\8d\vÔ³J»éÔá"º[E|\7ffÑOKp¬Ò½
+¬ô¸g-'\9d\9f\19\a\1dw0ËA¥
+o¿á÷\95\97\8f=ש\ 3¯\97},ñ\ 1Aßź\83¢ïû\17ÒH\1a´*÷       \a!\9fÙñtÀ©ô\97\18\f&vÌág\99¢ï\8e×kè²íu\8b\8fÖ¾)\10\1e\19®D[2_@å\84]î^®ðhÚ\84ò:\ 3»13pÆ]rõÃÅmú]ë\vù\84­MÜ\a \ fV\82lS_°d\1es»t}<\e\8fÑÙ  \90k\19·\9eÍý\12\8a¿yË_\17¨¶Í\12Âß\13䮬§¥!Òã®\ 2_|¹\0­+\13½[A\97ñ£ö¡Ú¶&<\ 1V:\15ò\145WüÃ\12M&Ë7À\ eÜ\16\9dqý5û\19à\9d\1fÛ\1e÷:\90£/Â9\ 6,i\95¦ÂVA*áºFÏðÚ\89«KÊ,÷\ e7±°\ 2o-Ã\95\8e3²ëM¥õâÇU\16\87B\18¾x¶!ÜóuUªö\1eÙú\8f\90s\90+¹®·wr\14!@p\81±>Ö¯´ªJp\ 6&áìºÌz²ó·fÏgö\8f%x8ûÈ\aý5úþç*Ål\91*¥<_s%\10Îýgý<²ºêE¤à ©\18\1ex?ÑYZÓ\0æ\9esÃêìï\b<^\ f¬âÎ\11$¤5Ò\86\9c\97]}~Û\92ü¹8Ð\15«¨ùÞdzÀ\94¢\8dé{d\96óï\96\96dLÂÜ\\8c;?Í)yøÈ\8bÆØüÀ~\8a"YµÆP6Z7«bÄøP\1fpë>nµL\97\ 5pï:AÏà\1ee®¦>\87ÊNäu~\17º\1eË©Ï\1eî\11\7fÙcy\9bºp-o¯\95gÍË\9cçíï³â=%(\1\1c\9cÞm\99b³.®÷=Y\7fF$vÿ\90     2\19n\f7}~poØo\91ôiÂÂß\83Þ&½ê|\eÕkm\95v[Þ©ä\1e\ eï\ 5xn]gn]¸Ê\7f>ûk       B{á\92\8føÎ\ eKÿ\10ÄëÁÚC`þ[\10Ô\9e\89ÿ\8dw\96\e\95+&ú\19À\ 3_D   ×e®¹ãÿ>þ\97\8e{\1d\vt\94\88\87°Ë
+=|b\8b(ot ×O¦T=\7f¹\96CmHjniÓÿ³QyyN%_ª©\8bÿoÌáH´!lϱ\ 6yïñN±ôIË=~ÛènË\92\88²\9a\9cô\9d¨\a\9beC\95 R»¥Ä\bϨ¼\81¥¡áô\87,\15\92Â,\15n«Í\1f\1eúö\82?TL.Ë\12w<}\12\18hD\95\9b6tdÛu\92¤Þϳy|¹\83ä¹¾8:\eüù+æ?lÆÉ@ \ 567%\1eò
+ýìã¥\ 4¢\rn9\ 3\95uÄßc,qyXUW\19 ©2(=\8b\93%\8e\886[Pþgé®P©m檻\b\e@\1d
+\ 5éµF/ÑN4JíC¥»¬ Ú\85Áé¨;¢Jyö[¨é\ 5S\98e\17pýN\9d\1f\16\93\98ùü\19\92eâÝÛ4JZa\1dÙf/Áo³|Åð\82Y!Ü\ 6\9d.ÜØ1\90ÑÛ}ô\907µÚÏ\ 1<©Óÿ\11\83óÉ\9e±°çr\15©ÔB'\17ì\ 6³\94\9d¾\ eã=\­H"\9e³\9cI;«\bB~¹)æ¹ä!Zk\7f{ý×\v\9aJ\91,Lg\fù(bN`\11\97ð\eêe¼\1fÇgÇÈMÙ`ÿ C¸d¼¾\81øb2A~¤ ÿq\15Þìa\99PÙÛõÞx8t\98\11é.ô³×ý D°éqv\ 5£·¸§\8c;p`Ñ'#Ï\9cÆ\98;&\ 5ä_\96\8cëáÊô\16\92/\86Õ<8\fÞ\97I\1e\94  Rá,\ 5ð'\97ñip\9eF\9eA}ç¼|lRkýÇ\18æÆP\ 5\ eÎïO½Ú®G\12E¸3å\87W\rê²ïÃ\1d5ã¹)\9cƳ{\ f\az\10\0\14\ao       Ø?Òï\vJ~©õ\83\92\89úz5Õ£)í\ 3ÙÂ3Ü\r»ÅÃ\a¨>î\10#UÞk§ã÷­#8_ê¡ä~ÎÍ4í\1e\7f\96o\e×å\83ù±ÄZ&\89d[=¦s\11ü 1u}TvÖ\85Fû²ë\0\18\19\99¢4òþ¡#Lfßâ´èèjáô*d\rÌ_)òA\v¦Þ\89¤\8aeg¨æë'³ÝwºLu\90n*êÄ\8c/íÜ\16\81Àù \8aª\8bIk\9e\0Y·á\8f«¸%Úþ\ 5·LåÁîµ­S}´#Ç\93\eò¨eêüq\15§\11\ 1\ 2(v\9e­õ.}駳VN\ 5\8aÓ¢btZ\ 5ç_/\88û~Vî÷ÉÕ'ç\99\ 4åF©'\8f§U£º~\99ºþ΢@²\84\97    ¸LZ¾)¾[ûȯóÓÿ¼ ú|¾\8bvëÙ_¤]X\6\1aÕðn+\ 3º\91ÄùÁ\1aÍ\ 1êÄ\166ÃybµNßÓ½ï\ìEåöÿ\9cö\87¹eöéjÑwÉ.w:¸qõSL¦É\19®òÚµáÊÉ¢\1f\9fÌ"\ 1N\ 6WÑ%/\1d\99\9eù_Kf¹añûð\89$\ 5ZûU\ 3M-È\1fÕO»øÔ¬d\85\aò~½\e~<
+Ô8V\9f\ 1ÐêM\\87ÛÕZÿÿ±\9c\93\9bÐ\98\80«D¡W-\1eÍï\1fRîqVMÁ_çEkõ\1cÈcXà\98O\f\15å>&ÞÔ<b½±o\9d¨ªâàðg\97j®óbº×\8f[\13I³ãñgn²ñ"·R\94\8bóQAÜÈï\96ôn\15ÆÊ\92\80N²{ºy\8d+8\854úåpò\8c¹³¹\86°ìë&\.±íç\8e\8c\19ãÝQ\e\18\8aò[\12ª\19Ö\1dÍnWÐ\14\ 4\95Ä%C\91\fÃw9ÝÕ\e\8a\uå"º3½\89Á\ eê3«\g\85Î8\19/ôëç\8d²\93{µåº\ 1[5Â\81\94ð×r¿#a\ 3\ 51+\1d\87\11×aîÑà¸\98\90Ì\8bGh\9eÅ´\ùZ+Z>
+li\ fÍY_\90]-ÛTu\`?Z±§\aóoY+à¨-\94\ fý\1eÝÅBÓÎ\86þÄøx\ 2P\83\12ZvÐ
+d«     íWíÞ>7÷ÜöâÍäëqÅéõv¢W\1c¢\19êä4\87TEs{ÑÝ^¥û\12´q.Å\8fëÓÈåΣ\82\10\94\83\9f±èì\11\9b¡\9e\8b¡\eê\vÃ\ e\19qÞ`úB±«Ý\84\14
+øâ{Å=pÄ¡+Èùî»\9dÛKà® \8aVu(û3~cLÆ\16Óë\rÓ\87\e\91\83\8a­}\1c \ el\94Ö_GÚâ¬\b\9f'Âç]èDh$a¼Ö\87»x¸>\8eÂ\9a2EùQ+÷Î\95j³Ø9Æ\85-ù:¯\8dàMl\82NÅ=Pô"1²»\89´°ï8i\15\93\1f\1c<i ­\ 3=¢âÎ1\9fã5¾¤!ÏI«\165\97Ý\81%ÈÈ=ízÃ\ 2»¯]!\99\1aïu{c+¼@\8eߨÒ\9fq\900\9a)kÉòÊ\ 3õ潧õû¬\ 4)jy\90m\86ÕêCçôÇo5Þ\0\9b"1U\17\81QȽÅ7?\11¤ãr©iÈ~;\93çë\86¯ðZôiqÉø¡\8a\15|«*\8e\96Â\9bÞu¤)Îmø\8dQ=>ñ8¶¨4ÔÊBø\96r\9cõÌa\7fö\v¸ï! õçÕ®\0\94Ŷ6\92ï}\ 5\16£Qݸ`G}Ü¢e\85\96\9aã\1f\9d\9eúi\8d¹§\9d[ú<\1a\9eôEX~\b\97|µ¤6úÈÍ°W\91(%\ 3\83¥z\arbbå\v(wM!\eÄ\84Õ\9b<6mÉ       ³ô:\8d\r÷üþþn«Î\97¦Õ\91ùÖꩵ40Jxq=\95§ÙãÝzÎGO)\8c{¹Ú\v}À6ö!}ér\9aýTÍöÞÉ÷Øú©z\96\13³n¸å²\11,^\10lX1\8dÙÛ¥FÕ¦X½G>\85\9aã\9bk´S©2)\820:Æ çÝ«þ\88\ 1¢Á\898\ 4«öC`GUbgò\98\86\ 5`+Døia\9apS\ f\94}\86¿k¢°L'µ\9e¬f\85\87·Åà­ø8\9b¿MÕÓzA¿É¸ê^âÑ÷Lc×\88k\9e «ü*Ô¼(/°\81P¡Û=r"0V\98ÓAF,øJ\ fz\18\0\19Ð÷¶ñc  Ñ5Îí»gå\98\95       d¡Ó¸\8ew\9f\94(<oÜaÖïr\12´\81âÎ+|\b.þØÖDÛ"¢Ó\87Í\8bü\8dùË;MIåy"\15\97\19\1e#>·\19\1cÔ\8bd\17\v\±uÚÝõ\82³¡I\ 4+]e&¦2Ô©\1f\0µ]\92Ô\8b¤\88¥Oô}Am?là`(l\ 6\9b\9d"Hç¹QÇ6]ipí¼Õ\0X©ì¤fä\14A\/µx4½T\15vtV'\83Ö@§5ð\7fê_$\85ÆR¸|\13\8ef,²N¡â\ 3$"?½o©·\ 6Ý®ºîÂ\9eZË7vÍtS-h7\83Úª7\18]\97°|}§ó½B\ 6\90o`@4Ê=m[/\96$¶ô­ëØ£äè#¡²\95'òúÊæ\a¨aè»Ü^9ÁL&T®<·ÌÞÌ\ 1 ¦n\8aý\1fHi'[v)$\83Óƶ§ÓÈÊí\e\80ÔP\8eWñuqlKÔ\v\ f9]\8dÛÍ\9cB\82V÷L\v
+ñéÏ\8a\a^ô¬añü\83\93\b,\9cµ¸ÌÈ{a<><´Hu*Îìµ3%ÊÜI\8c¡ô\97N²»S²m\14\83JÚwrη¶x(³¤ôw\94X×ø
+úV¬í5\19ûáu\f     ßâ\r\17ÕÜÓñ\9es\ 1\94\94H\8d\89ô\10ý)<lÄJ¥ãº\80\17G1\96zåÓCú¡ãv\8dW\12ÍP\92á\13\8dÍi`\a\95>'Å\ 6\89Çôû]º\ 5ký|\91ô×1ª°Ï>\11¨\8b\19)\7f¦\7f\93Üç\88q/\eùµt¨8Js\86ï
\82\82D`º^Äa\81MÅ`\18W\89\9a\91§>7âîX?\17=æÙõ\8fF¶ä)\13ém\12¿Æ.\84TÑwÊò­¶, /dí\18#*]$ºñYµ¤2\1deS\11&å`÷2TýÄò¬Â\17,ó¨þ\8c\1f\1a\87â:Ô\18|\b\98ìѸ\89Á wÕ+û¡!`bs.Óu鮿DJk´®¯\92²æ?\84\11È\ 4R\98´\15Xm=(2\93t&ÎÍ´3®SÖ|µ«NÒêR       Ú\18¤l\ eû@ëûô¾Õ\ f­©\96\1fÚ\82n a\8aÍÔ\82«]\94ÅÔX\12áÏÞE\9b\8fO\ 3å\8b\86ö~\14µ9ËVU¦\ 5·y\e\18oõÎù[G\91Ò#c9ðÝ-Ý\1a\89µ\1e6\19\17º§¥gxÐó\aÈ9 RÃM\88ïÃòíPCåÙô93Û÷ÆKÍ£\ 5¿UZ¾Ró\13\8fßê\91!SLÞ\93=«YÞÜu¯Ûú\15ö\9cÀ?ãq\81ò,è\13Êß;Àë^\92·\16     r+mòqr7\ fQ\ enêáâåVr\80\99\99ª\0ôÈ\17ÜüFp\8a³àGµn«Ï'í-lÔ\91Ú׸&W\82\86î\99½<)¯_®GÅ'5\8bÐ^Áë´\94öµ\ 2b\98|²Ý[¹9Ö:\8dϯVü\ 4À¢â\89¸Þ8¼À\90º\94nÒ«Ø\1c¯ëÅÀTßmy»º\96ëo²bø§GÇ\97\ 3)\18|\87ò,3b~Á­\9d×¾ðQÔ|]\9cÓ\ 2%-\aü6f\96XMz0;\82"´u5ªk6%\8fCÎB\8f¹\16\14\8eÏvA³7~ý¯HïbÕsí\9aVhVoÜvÚ}[\ 1E(,³«\ 1£\88d.`½\87×Zm\1eG\e\9bÖíî<\14r¦Æ\1dd£&¾¾ßqdM\e¶ó\ 2?\8f\8b&C®\ 21ܳ\81T)\7f£úúA±d)\1e¨ò|9ÚY\8cßk"Uça(Ó3q·Ã6ðW\96`Ã¥[¢¿á\9e©ÒÝõS\9e\9eòs£ÃN#f\82Éyµ\90\16îf\15Ü\17kb±<×`\9dÑM·\7fLsökß×\92í<s\15xk\8c:µH\1d<\ f¶®PÏ¥°!\9eßz½¡«\ 6\b\81Y\19Õ\fÈ\15«{N\b\19Ñ\1e\83á³4Ûé7\9b¸Y\88\ 6\96ã\bÖÊÐ\8e\ 6i\eÃ`QÐ\9eX¿Ï\94ÌnÎÄ\ 5ÓÔ¿è÷R}\17\16\98\99Ö\9fo½ã\14\1f9wu][ÈÈ  ~\99\8d¿\8b6h¼÷êyþé\v8p\10\15óZ\8f\84®Í"\96\9fØ\92\7f=è°\8f~\7f¸Ð9ÚÚ72\99½©ù\97\8bë\ 4Êæmrò{þNÜ\89ÅFê4:ôé\ 4Ò2­ºkÍ\93£&í-¾ÚÆ,×¥/\9e¦áÜ¡\90³\17ñýû\9cÁÒ\8f%nÿý\8dZ¶7Rv£Ã\82_\10cÛ¿\13·\8eÚ~Nd¢¿,×}qÐÛ¨\1f\ 6\1e\7f\ 1FçåÓ\16r4{\9eõú\7fÌm\ 2É·>ü\90»ü¬\15Í峨\9c¿à\80&fÇc¸AÇ®êÆ#·Ên\88\16/\91Ê\94\9cö\85H.l\ eÿ73ûôsCÖc\ f\90[\90¸\ 1§îç$?@ l\Á­^ê¹\ 65\9fuÄ@\8bÊn|¿uKÐî~\94ÄÝöâÖ\80ô\87\ eתo¿»@^*äÏ©poÔ\86N¹mU¨½\8a\aR\e#\93ïùlDåáñÖ\96\8fkzîÂt%»ú'β§Z§ªÙdA©§\12÷wS
+óÍ\8f\8d\90E\8cÝ!\89.ß×¥¼-¶°\11~ÐÑ¡\8a¼¥«=xÜ\92â+¹\14Uk¿\ 1¾OÂÿ»\18\93Í[9o½\12Yaã©)ß/Yr\19Ï\84cT\v|\17´\90\13^Ö@\12Õ2ÛZKzýrý\1e\95CóçÂ\1d£\rS?ÝC%\5i=Iñ\8b©\8b'\8e-o´\8bAíï\1fsÙæʸ
+8mcõ=\7f\16pZ¿\8bË\8e©\e\9bjòç:Äo¸þKÇ5K\86\83Ü>Â\84ß×-^\99bÆóô\1e\91ÓC}o%õ\b0\9bç[®\fÖÞCk²ù\L{þ?\85\92ía\9fôÇ\12 \{8£V
+\19õKeÈ\8c\9dK¦Lq&µ÷Â\88©\a\8e\ 3nYu\92É'g\fd¶[\1cºwÌé.$ì_t\í¦«ç\G`;ÒÝÇÖÂX\7fî\91:)½è¼7¹u\1d£>j¬°Éè5ó\92ôì\1a\9a\18[ÿxÚ_b°oëQ¸L\8a\89.\89\ f\92\11?·~H|>\94>ÓL >Ý\bqÐóì¡>¼[\85¢CC®ßï´Í\7fÕï\9f4ÀüdÌõ\89ØçZ\f\9cU\ 4þYÙt\89MÅx\b\r\90\ f\964\91¾=OE¿ÿ\1e\ 4Ëîí§u¢\9cFQ\16X@V\9ct@\99oãlà\83Á\ej\ríNIäJØØ{r\13²ú¾"{i®\98u_`\86Ý\ 2¬[\99\fNÆb¥ü}\186ýkÌÍñÊ\93F\8f\ 3{û¡4r§\9c\a\13*D\b¸~\96_\11\18{HÇ\98 ÆbõTæU\8að\9cÙ"øq\15H ~\9aS"â<ï\8aÈCe\97ô\vYLkA:ÙPÕ@âÜ&F¸ÕØ6F\1a¡uP×z\eQ¡H ¦&\89Þ\17\e\1fw\9f_K¾¦è\9d\eÅ\9aþª£c\eYpÜêpÞØÊ\11¤¯\1a¾îx\82wDÐ×~f@M?£\86\9c¹º«þxKñÂþ\90\8aSY\9aÕ\84"í]GM¨øÜTÍvk\91³\ f\80x¨Ö¶½\81yPÆ{û¸M\1a\ 5À߯¬ÒµOüë\ 5mh»\82§\ eóöÐ,IÛÃuyk³\8bTn¨\9boZ\9cN÷/»%ð%øþ*\rí9\1cE¶Áu
+ÿq\15¡\8c\94\9e\1e\80°\94µ?(\12\ 3ͽ4ÛSk÷Yo+ÏöZu\a×ÅÎê\9dѬZË\7f\86\95\8e\83ê¿\8cYR\16s¬5\99)\{\ 5R¢ûVP}H\r|\ 6Ûþá\96r\96h\96\19x\83"¦?\e´      +Y,åÿXÂáæ\8dfÖ \91µ"â:µ\8e\9bÚrPàfBå\1e\9d\97Ð\ 2Ûu\179¡%\9dÄøI}ã\92\84X\1cï\16Ù¶\86ü¯%\81\10E×Øn\8dU²Í\9fYw\16aZt¬7}x"ªA#\8e\93KàÁÊ®Ü\93
+\8f¢\11v\84øG~¯w]\9füc\fÛ>Õq\91\9e\ 1\9f\9a\16q¿È¬Ô½\1c£\10\ 3)\14\vÂÛ^îv®Ûp³\8a] Ï\ fÊ
+±ÇõLs\92üZbÛÁTb³\87Ö*\ fJw\ 5\89@\ 3\9etm3ö|5ï1tÀ!\e©x\1a×\1d\95\8a4Çï\ fÌ\1f*ÏjwéÊ\8f%ð+î¨Ûà}õ7IáFhí\83«%ZMô\ 3vlc\r4æô\12±ËÚ«þµ\8f\9d\81±KÄúüiþ\89Õ¿Øé ½ýæ{âP£ b\1aÊîÖñó\9a\85ÔÔ\9c\14\19«d6ööÞcV\9c§½½±ÜÁ[¯z°ÿKò3C©úgøB{I\8a×\99\8dfD\89j±Öpú9{¼×gÑ;×_X³\87\9axbc%\ 2«ÞN·é²êþËUäØ«\v\9b\98\12âÑÓY,g±\aNa¯\86rQâ\f^ñ»l]²\b\9d\19?·\8bö\86½ÿ\1a#+AÎ\87+)äîî×EãD?ZÞ#2c×EW z9Þ(o^>¯]ì6½\0×^®î,8\89ù\97%\7fè\87\ e>\7f´\9ax\ f|²È\ 5\11Øx\95_\1c~âf\8bÐo\9fû¬\9f_å*$¯îm"\\97\9a?)L/ÏÜ\9f¢\8cºÒ\r\92coÅN»Ô\ e\8bõ\10sküA[zépժèZÎÚ«Â^áGm2ÇdËi\8b\94ÌðÞ kêþîZ?\94*©ílnÄ°8\1c\8bH~ûI\9eìàVv"`)5V\93r
+ö¨G~1\ 3Q)]\83pPÚ³?R\1c\v_pKy\98¬K±Õ\83\13vØ>ÖÁ\a`˱ZV³á\v\vÚÐï±\828½süèV²çp&4\8fÕ³\1f\92s~-É»ñb7»\10M«ÙPÑúY\8b9ê¶-Ãk¤§N} \v\9d1óA¶ù)¬ªê\1dÙñ^\8fÐ÷ÿyA\14¼4ÚÚuÌ"Ñ¥ëVj\93±]Ô\8dzn\1598¸\82ºùqMO\88O\1a¾ÞzÆúÎ\97V.Azÿan÷\1f rº^³qé\ 3W\93\ 3¥jT®åî_7\ f\93\9b#ás³oåg\ e¶2\17\9bQÓí\97\vî\7f,!W'·g\8b¤\87\85×\90\9cñrm;\ 2\8c\84¦#d{9 Û `[ÇGç ÓU³¸Ô\17ÿùøÿ¾mÿÜ\84í©Øk\8c¾áÑ\9d\95\1fÛP`Ý\a¶8N\9enxz\9e\83W\1d?çg\eBt\eUä[
+Ƭô\8f%¿à¶\rã6Ãä\ 4Îä^ݱî\94i0ÇÍ\81© <\94ê^\84\99»%²}¡&MÛ\83\1eîr-V5\19è¬s\80í\92\86ª\1d\ 6\a¦      ¯;ÁÀ\945A¾¾5.Ä\9e_(ð\92³ì)Ùë¡,ô\83\12Ö\1aÆxIÑÐFS*\9c&\ 5$\98\7fßØ1\7f`m&¡\95\8a\94\14ßæ\ 4ý\81Xß®\94\1eE¥ìW=N\85\ 4S mÐR»º\b\bÚ\9a\99Ô¯àXÒ\1eÃ\86,¼Ûp¦¶\ 3¼\8dQ3âê8¤HSyù\8e¹9|­ H&G ¬ª[úBç-\bæt¾|£ÞhÜ2(\16ÀøeçÓF*~Õ4îÔG·\9b\1a\87d\9e1KÎ~My\86\bXèùò4#l\94ÑÝ\fY\eäø¨ìw- ÷®s&9:Ôµ\ 5\fYF.ùða·c\ 1!\ 5~lÁ¨\16\88mðú\86V\97D\9d\96âä¨\8f\7f-*CÀý8ÄáC0=éæR\8e2e\9cÆ\aNÙS:Páó¥\90Å4G\98{#\e\a\89k\94Ð6뻨¬6Óâ´lZÇDònÄuÓê>\9b\11_(\95EOãÈ\19sÏ;@\1d\13\ f¡<\97\8b§Å!\10\97È£ó\85\ 6\10u\1aî©¡Ï¢\12^ÐIO9g£òJ³ÓÄÂ<ýviþ\8eS\14V\8f6\ 1\ 1Ù\ 3\16jðìÄ=üÛ§¢ØÕoM\1f\0\96\8eøÒ\82 ÆGÓ,N¶T\92Û6»\94'È  ·|Ë\97h´Fûô\11\19\bµ[«\8bGy\ 4Ê°\0\ 47 !óK'¨\1e
\ 1w×.§¬Ò)oÄ\ 3\9f[É÷kÙäßó\v&\9bnX!Û·âG\12\e%Vñ
+h\13¢qè$\9f\9dE=[ËD\85\8bÚóÎWÐÉ\89÷Á\15m\fÊûlï È\×\ 3Q)*\f\877N]\99\9e\1a'éq뻵\9cé}\94\18Ë\97­òÓÊÔ\8fõÎ\95ù\9cÁ®³\1a_w2\14­\ f|Ý¿\vr\19{\8e\95ÞIl\890Ëad\8e§Ï\1aè°\96\ 4j\7f\86ýJ¯.\8di\aÔ¿g{³\8aA\1c>\ 6ªxWEæ°³\ 2½Û \e\9aÅ4\13¾\18|ʬ\1a­#Ý:Îçº\88ãUGS_\ 6\eÍ#Iíè? Á\1a\9e\84mKL\8a{{Þ̵\8c\85\ 3e\11\9a¹ç®\81Ä4ÀÕ·n\9c\rùRû=lê7nfî®ô\82ß·.Hi\N\12\vþ\96\17ß³\<øñ­-Ù\ 12ÙµF/BÓvfùi÷ä}\85­Ù\9aÍlN\0lO\9aa\89û\9c\97B\15=?39\8f½³vºÈ\8fÃí_\9dÞ\94ä¶MÆÎåâ\83§:å-]'üP\9cÕ¿Ñ\1cà´>ëõ¹M³Pß\90îøÊz\1côxÏK\81c~£Ðrø\93[½kR*\86íÚ¨I!L\92\8dùhì\15\93\82Y£?¤×\83ý\91QBcàßÃ^\9dí\8ejHå\14ö÷~»,\8cÄÚZü{\9d\84\ 2\13\8f~\13¶â¦2\89OÇPø\9eÐ6,Ê,JGáÌ\91\19\95£\12b)\86¹°'<ê\7f\1eZþp-É\17¬\1e(kû'\rys÷~d ÜZËåï\91PïR
+p\83[\11W\º9¥\ f+`"\96*\84®\ eôú²¼gaIη_ NïÁ\9f\1c¤\87\8cå\b§\87)\9ao\96Í
+v¡d,Î\92[\8a%aê\ 1\ 3  ­l"ù6Ó\80Æ\85¥Öò=oo\95´ÓZ\81É\05\95¹\üBåã\12u£ãµ >0É\16ÄerSÑÞ¢!'\9b\87'\15A9¡\9b\95\96Ê\1e,\vÈ\1fioÙ¸\f}\8d\80\1aÅ«\9f\ e %¯\95\r\a>\v\896\11ÕƧ9¡\84¶÷üãD>µäiÂâL\93ê\r\82ú7\14m%\ 4P@PÝ¡/ýbL3aOAu|¯Èê\9bë>\93ó°ï¨\82+µmÛ1¼ePâ\1fÂrÒJ0ÿb¢j{-²ywZÎí|ÚL\88}EÙ,\ e¿÷+\9dà%½FO\13\ 3\95\10Ó:\17\94\98\834>å\9b     4²KgïÌ_G\14\8f_âÁ\1fj\88Ê3\89Póµ\10lݯÛ\7fjU{Õ¸\ݾ°\1a1e\1eOåøYH]s}¨p,\8bø­bµQt\e\f\16ð}géc+b\8cºõB\15W\1eÓÊïäÔ©Ðh¡ûSvù\89\9eØþ6hº8Êt\86õ\r·®Ø\8c\1f\8ej\v.`®+Ü\17ʼ\ fÑ\87:w®M\8a \81Ík\9e¹Å\88ÿ)\ 6\17w<æOx¥uö>\86\#¢AÄ\ eM\82-·kUj\86GXÈ*ÛÚ\9f\16^:\8c1ÿã¾C¨5ê«e\8a\eýU\fN\95ó:?Ó\ 1\15Ú°ÂâJ©\ f@¿phmhñK\ 5\9bjÏÜèQ\8fã\0\15Oý~Cÿ\ 6\8dZ\9e\9d¦\84´ouÅì\9a\ eË2ÀJF?pÛ\a}PrÐý#ñOò"\\8eiS%j\ eLný\e\9b³\97VIè3
+Ö^²\82\O+#\ 1ü\1fÌo!°H\88\8f\9c\1ekEr8\90tíêÊZ=Þ³z\91\90\15\80\88NJ'\88²{<êи¦¨ÜúÒPös\95ÍS\83åA½\81h#£9\1f¦\1eãsERûKÑ¡±²è
+Áì[%^FÒs¥ïÈfØ@µ~-\7f\93¯ÂÝG\16@®®se&5Øâð/\17·È<\8d7½£¨ÖNèL\8f\9a\83\95Øx\ f\ 5f²,@\ 6\8d\ e\87RÒÄ\98Zgå6\8dS%U¥-Ä7ò\8d\ e\1µüãùç\ 5\19ÉÓÃÍ{ù¼ã5®T\10Ö\15}f±\14é\88¥ÉÖk\ eµ?\1a(+>\95\ 5®*\886\85rÖ²æ5\r\1d_Ý~\8d\19îÙ`\18Jß tX;\13æ\1eó\1e`¤LÕ¬øNÛ(ºÂ}\89~j¤\97ðNT\ 1΢d[\93<\9e+ÐN*À\8b_pk\14\1aÂÆ×1>fO7|$°Û ñsÇÉ×QoD»I\9eÔ\8a\17I&'¨,~FêSñáõJ\8e\a§ökI÷Éàgy©TF\80\13nâÂ\9cc>\82IoÚi.¸édÆrðÓ5ÇU\9fúæ\19Xg¯*\18÷í9ÿÍ}K7\ 1Â\9fÍ~:U\1cZL~2Ýé»\92ôäõë­Áéø\907Úï7L4f\8f¼Ð^\ 6C\93Ç&\a\88Ú\8e!ñô\\88öj\89üÝskî\93\92¥\ 1\11Ò\95Á¸{å»ÆIÓ\1e×Ôo-êD,Æ{WÔ\97\13°Vi×ù\93\n´)\83þx5\80*\80{¥,\91íÌñ}­±95E\1cÜ¢j£_v¹   ±ä¥½ÖZhDDfm¢Æ(]æ\95\96\9c\93:/\96>oZV\9e\ fåj\ füÁÿ¶|\80í´-KØc)UQ1RL\94\85\94Îa\8b·`éë]vöV¿_\ 6T*Za©yÏNU«\86ä\11\83
+)ü\vnU±8³5#\ 5Téá\ eÚìÕê\84:S(³
+&¤P\ 3gª°\ 1pyO\19æniiÕ¹Õ\fâÞ¯Ø\11¶û;JÌ\15Å\86 \17DKôߦà7òÒ\88%9Ê\81Ðl\94Ä\9c÷ÏUyÐ÷gåMï\9bb
+*\88*\9d~c\b\bô¡eí)æg¡«2\1en\97öÄZÉbõ®¡¬R\ 2Vön³\84${séà\13\8bìÙû\10ÏIËOº-Åöüe?ä)fûTóÿí¹=RU¾½ÐnÂëq«zd\1eï\89\ 4îB\14¸¾Ùî\r\9cêRm\1fÓeã[\17»kÛåä\98\90B@v^\ 5GÙ`÷\1fK\98\e\9cMAåo\8b\84gsW¢\10È\8bZ\96\96dÍqe(\9eüM?\rE^^º%î\9cÃ|¾3\1fØÑyð÷±\94E\8bhø!\7fº
+M6\ f¬\8eÖxÙ\8f\9b\17Ø3ø¦ÐKì\16p\0еd¢ß4D¬\1dþ^¿üz\9aÜ\7fn3\99г$]Þa\8fku¶]³Jµ¦ô\9c®[\ 2\99´ds¹ù¢k ×;\8bO§±³øû\18\0!H\9bKñb|ÊîÉiÿPX\e
+âuÿR¼ñ¥É\89\12£\95R2\98g>SÛ5ÙJù C\81\81\eçKk\8a\9a¹ÉX)\83NÕ|Å¥É\8f\90`\15\1f~^\90T2¼\8f\8cSuX[Ah\89\ 6tº Xtëñ\rÎ\97\8a¨¹êv\975ýè&Váú9bêü0éÿ0·\93_1ÿáYSk\83\98ã8\e\14µòí\תÀ5O\fênU{\v=L[\9eD\a\ 5ïþEw¢<h4®·ÿ­jG\12íç¦'Ql¿\ 2£6^xÊ
+ÏïZrë\90©T\8dùd>V{j[©\156bÇ,ëàQ\1d\84 ^ا&fÒäf\99\rküJ\91\ fgEæºÒ\92]z³­µ¯­lÅ\19ü\1fYßÕ®ª¶lû[Ì\91$*IE@É9\83 \98sÀð²\7fýÕ9Ϻçîu_ÆøÆ\83ÃN§z«ÖªªW\95^Ý.vÐÄw1]reâYmn|},U¯\v`r\aîëÿ?r;:\95¬½\ 2\ 1t\89Á­ç
+{\17ßW¥iÈM¶S¸gP\1cè'ù\89¸8[3>A9Å\ fmùaKïÿ
+k\1c2úCnw\14×;[\9a\19ì~Q\ e\ 6\9fa¯/Y\82KZ]¥LfAí\17M\1dÕ\9fZ\1dº\12\93æ4uþµ\92¡S\814ÂPý§Bì\ 6\87~¢6sjÙlK\8a\1aX?cË¡ër´j¦\9dQqÊv\7f\8e`$P\8d÷ohÏ_å+i\1f²+Ý\8e\8f#qKJâ`\aw\ f2ÖÐ\8b\1dîÅ)#·Woȳ/¡¯\8f\1eíñ/O\99¾ßµÿ©9\91ÜÖßÀà\ 2´Ç#`\7f«\88\97Kð»\85×/ß\8ae:\13Þ\92D\96y\f\bFbÎ\14*\ 6
+\11T\14+Ù÷(2\9bÎw%áÿ\8d!;EAÀ\8d!\ 1!3\87i;ÑMø$\ 2\89ìK\957K\92pM\1c+þ©^ÄÔ:»U¼\1f¹\95\ 4ÆöþÖ\12¸ñ{ów1%÷4d\ fõõ\94O\e\9fâ\17zÏ3nÝ­G\ 2|n°\0ôj\ 3\13Q
+&¤v¢\8bì\ 3ÜL\9eÞî·'oê\9f\95¨\8féx]\87qCÒ\7f9é©Y\9cìø:;Ø#8´¹óõx\13ò´1ïÔ\96x\8añ]\ 4/\v¯u\86þë\ 5QÂaè 6ýYL^\rfÚ=N\86=áÎðÈT­_ÖíUÚ\95ĺ¹å§3±ö\13ìEqö5×ø7(öÿµ\16qÂ-ù\83·\90ÁP®\80ád\12Éá\1a~º%Iú\98óÕdÝ©35U\\15å2QM\84\95;'þ½\92ÚîŨcûø\93¸\ê\92\f7#\155ùÞ\84Ø\9cÛmgx­«Å\riMLÿó,2¯©¡Ôtî¿Ãq$ªkÕ[Þ\ f£ë\9elG\8d¹.½\e,Ä`UnP¯l\0£¶z\1c*ECþõ³\19ä±zÓ:\82ñ·M.w¿Îþ^Æ'\88¨ëQhȵµ\ 1¶Î;×\9b\16\ f«ät£©Î\86kªþÁ\1a\1cÔG½Ù/R´TÆm.ÿÅ\90\1dõ\9f\95trµÚºýFRôî+ß\1c¡ö3Tûæ»\ 5®X^¤]\17[¨a:_\95w×6>®\7ff\8cÒYOÿ²t¡\ 1´þögÆ\ 3fX¦½+ýVJ\87ñ³ÓïÐÎø\f\97`\ 5³m¹Yfo\a&\16;?:¨\84\91ñ£(¦Ê\8däÇéWv\92þ³\18\0\966y©Û#É'ÃÒGZ\97Û!8\ 6Ña\11çàÆx$3b!/»Ç»Ä1Û\1f¯>\99\7fC\94ÒBØÌÿ®¤bÔþ\14\8eµ®í\9dT\e«\0\92N¶Éd«\9aCiدF\8d¸õ\9cMÛ½kþe\ 5»¿\15\11B)ÑØÿzAõ¾\90\9f&bwÃ\ry>\98â\9c(z"\ 4ìKË\98¿?£\9a¨¸Â/ãQ\96NB*TAà\17á|lþe-\98³E\1d1Z\1d\10Á
+\ 6#\84\ 2s^<$¯»prÏQc\94¸\1dñX\ 4·âhÛù;?Bz\91ù\7f×!\97ÿÌ\8d2'\93YWp\1a²Re&U\81\98¨0àÆ"*\9f¥" T\8fÈ°,¡·º¼itÜÿ÷ãÿ¬¤·Ü\96!\9cî&®]}\959(Ú&or¨
+[\e\17÷\õ1/ün}Sb!ÎíI#ü¥ü\92\90N\8bûìwÛã\9f"\96ÃöjµÜKÞ\11
+E\15\14ê\9dݤÅàÅõ`Eå©]\999Xáõî\ 1ÃYã²\91ãLWþ'\8f9\91Ø\7fÈm¯°\1aI\ 3ñÁÌ\8d'FÏÀãëD\rï÷MÛDôG§:ê\11Í\91\e\96sèôþ²\ 2v\83ºáw%ç\7fôû!ÓõM\ 4\17g\e4rÏVú­¢\12ÍÕ\97\85\8d\ 1\ 6üs\11Ó¸ÞN\85ã¡»\1c_\96Îñ\97\e\88\90\88¾ôw[º\92\ f³ãYÚxh[+U@\8cm<\19×y&z\99:·«¥\88ý07\ré}\89*\98ý}\10bbOþ\1d¹\9d9êì\ e®\10<=/¸®½y¨\9fãd×\1cäô\96\9b\1d\1eE­×Í\a\85#·p'\93Någó'ÿ_/\bý4\85Ï´Ò4újÕªÎ\80Ã\93§§âÓÈT
+Ì~5·\95\rä¨Syh$J\fUþ"¤4®\17°ÿ\8aÜ\ 6¡R\14»}øäò¡À!ëT1î\fÒ¬\î\1d\14EE}°za=õ/"&¿ò\7f\99Ê?ä\16\r\1fþH2ècW^ñÆ\1e0"\ 3\90ÌÉ®¢\94ñxZ\89?´,\99õ$\92ýdãþëAþ÷Ï\17®×
+ÿûc\ 2Î.ü\7f~èL8O¤PhÖ\8aÿùÏ\7fþëwa0h\96\v\85BM(\ eƳb\89á¥W\19\7f\12B¥Y=\ 4\95K1¨T\ 3\8cìÔX8Ãêm:ù\11ØúÉ.l\1a¶gt\9b$ÿx´jì\82iíõ\81жØ*\ 6\90\ 6\96j\88\ 2fa½\ 6Iè+\80\91Ù¦\ 3ß±x\81ø\9fB³3J\a*ZÕÓ\eº\ 6^ø÷\99Ñ°×\91\8dBïfñݾÇ#¿ô66Ðê     ^J+/|q-õ\b\ 1©ê$XÙÍÈ#\8b®)c?;\ fú8ø\1eäiÐ\18\86à÷ß\8e\92\90¢ËJÒ£çg±9\9eôÑ\17ÓPo;f½vCVÌ»\12\a\Ò>·W_ç\89\ 2»¿VlS0\ 3\ fÓ=\12â¼<ýD\ 2`á%a+s´(\92b(5mh%-\vÔJf\aÌB)éL¬DzÏRIê9Uï\1f·¯\99\16\Ñá»»Õ·\81Ç\18\93Çðj\96\v\fëÊÑêçù¯pÏ:í\98¹-Å{À©\ f\93ÔåÜ%\17\eÒ½\ 6\8eê)ÃþÌo´Þg\7f\v«\ 1á1ýàB\95ùPn¬\82¨vU\ eQ\9côÊ1î\96±øÌ®Ä\99T\9fúIu]ß&\91\98½S\f\9cü:W¥Çcm4\17\82­¾¨\fÅù"l\7f\8fjowjd\aÏ!\97\97V¥ÏÍ[ù\15 Xw.=\7f½Ùsþ\861§ÎæE\bÆÖØ\ eÅ]\e\ 5è]ª^Ð=áÊ¥ýÉ)ì\ e¼(:Çb÷øËj\1cí+T9\81£atJ9§tÆúÉð¼\8d5ó2Z·\93ËE\10ç×\89<\ e¯Ï[§tÓØ\85x¯õ\ eË»g:ù\ 3\1c\15\8a\8fÙ\16)æ(·]ås\8d\a\9f\1dBù<C|Ñ}ÕJRõk\91Õ_\80¾\b­)»Ô(ô\9e¥SG\7f\97Í\13pª \7f\b÷GU6\8f\87Z«§\ 4µ\f\9fSuÚâ×õ×ô¢4ü\ f\7fiâù#oÞòÍ®ehc¯\r­\16t{Û\86ÚÀ4Y<Áª,ìÀD¦~_\ 3\r·L
\9c\86ù5\89Ý\ 4éa.\85\9cÇz¿£nb\1c\ 5\8dÒ\18ÝÖzt\97g©Q¯^r¸ÞüS7ú\f¶É°Ò2ø`¿Á\ 4øPï0øÛY\19\84ÿ6\96$aK%2gõ\11åN\16¿6à\ 3Ì,\96\ 6\86\86æ\ 6\1d\8e:Ï£6:\8dü9­.¸ü+\8f\11p¼óÊ\f#Ò,Ë6ÄÁ\80\ 3\8c\e¯ûȤp\81[\93àR.MñÕî6½Eî\9a×o/A\0'\87\92°º'®È\ eþ\8cÒ\91
+\1e\1aKÞ5Gä^ÝIä#\ 4Ã\8aØ\9e\ 5_\9c;ÜÕH
+\ 1\rc\ 4Z;\11}[\17\8dQyo\8a\890\13\9ayjI\eK\1c)\r»J\8f   ;Ü_¦N\7f"9Î\11íl]¡[ÿ¹.¯bB¬\17\95\8f\1dW\1dÿR\9eÌ\ 3\85G\89°\ 5¢\8f\8fÝhÜr\ 6ÑG.5b\1f[¼g\18æÜf×Ùâ\91\18\ 6TN\11wÑI\8f\r[\98+·`µ\0\1fG`±g\87n&ûñk \18»_\94i¹Ý\80ó\95Ô\váu{Û\89Ö[ë\ 6o$!\9eo\81¡@lw_E·\93\ f²±\87ú^g\7f\88\16ç\83\ 6?Ì#\ 2­KÇcý6:)\9b«w\ 6\89ìpÞZbé"\8dÀô
+*kõz赺75ìý\ 2ôw8\ 3ùûqþù<4X\1eç\10Ý\12¾¦ã7\9f\9\18<ßç\ 5þ\83Éz±÷\95Ç%¸|·JÏÎq]\8e\88l[\19<\19¨òÚn{UoTDkýbT¨\9d\16\91]\97R¸Ø¨ÓRÒX¶á_V£É¾ÝV«$4έ\10\87\956¶®TÛ\97êÊ\ 1\14Zi\81M\ 3ðÁùþ\fB£¢\16BÏF\13\80-|\19 °8\ 1\90\8dþ   :Ü~\ e£¥®:G\ 3­\87u±6tê\9e\8f°ÚSÖC¤ßº{¿ywý%ÛJ1&3e¼8h\93xØ8B\ 4ÑHëÄ\9dJ«¤¹8Ö¨\8eÜiSÇâ\ 4\1aÈaÒ\1d¶ÕÖ`¸\16=a4Õa\87®%»å\17D\85ûx\9c\97*Lq#\80L\94å8K¥<Ã>ÍÓO\91q.\85\1a\93~År'\97ÙÑ\9fê\85»ÃCÍ£Æo\9béD\98^§¸Xµk\r1\ 1\82«4Pk¡\94/yF¶6QUAÔ(Vv-\17W§¾xÔ*%\8cÓ¢iå©ã»£ª_Ñ°j¨sõ\97t4Û]¦kf\ajo\8dÍ\81h}d      ´½Åþæô)ná\:Hàj\1a\16x\10æ-¼\1dß¿û\12Ðï\ 5\89\83-H¢¡dMn\11¨^ÓèðY\ 4±Ñü¤³ÞʽÌò§\r'\91µÿÝ\7fJ\999_\9f7\91~4?ÔijaÕõBF\92\87ù²äw¥åª2ë®\14¦ú\we*X?\99      ¶\89\8fÝÍ\96]'\9d]\938+»]Å\f÷*~\89\ fÈëä\1c.¥Éðh¶\ 6\97\13JÇÝÓI§~!í³¢Cà¥Õ\87ÒËÜî?¯\946y\\1fmzs³Ú¨s\87\eóü¾\ 2\9eçÇ\90ùL\1f\97^#ʹÃ\9cʯåZç9t\8bØs1àôWCn\f\7f0i\15\81\82x*\95Î\87 ´47§ò$©ý¦ÂTÊ\1a`V\82I¾®öÐøQÝc·G\8dû\1e\9bÚ;êÛus`y\rd0å\e[µvlrÈâÝüÐ\95bËF\80B\e*u?íì4ø\0íR\0îÇE\15ÔZM\10j&       \ 5¥\ 4!Âäéü+Ü\83¯¦¾E\14\1a/v\1aX­ßI\98¢\86\92ni\8fÞÊ\bÔU¥\91Úk\15­Ko¾ÊÉþP§æý\ÙÃ\98)\r\ 3\1câ\8fM|­M\1d\82\r²°\8e\1cÒ{\rêT¯|µ~¶Y\18\b«õ/ü3¬NkÛa\cà\11î¹ÆèRY^hY¾£ãú¾ \8dgûó\92!\16ñ\9b¹è\13\98\95\87\0ÃÕ\8b[\83\8b]6\99àµÛnr\12èûTp£'_6öOÞÇ\8fw\ 1-\9c/Âfq=\88L\7fýSdâs\15Å\92\ 1K\96Ür\bAN®%JÁÏfC9.\v'uª±¾V`\8f\9cfC=P\a˳\87>¿\ 3s\83¼Æ\9aqþà#S¬\9da«ÌxUËû\8as»3\19ßì\rÀ^\1c\ 6ñ\1fÎK,þx²k\ 1\83@CñV²\7fð\99~\ 1ó?\ 3{\1d¸\ f\8d\v»¯¬\15\9eøÞ=R\9a\97uÜFw\8bxµ,­g\93\9d\93'5J@\93\ 5?÷R®@´æµ\ 6²\98gsQZL×E2k\89\1f,ÛÉð\1fèÔÚ\eiÕEgËÕ#ÿºÒ0úú\9dqr®l\eø2Úî\95\1a·³z\19¾§´\15\8e\80Ña'-Ô£õÐ×'¦¸¬\9fÑz¾¹T\12Å»|Å\9b}]>òÅí'«îZ»\18=X\12ûé˼·dÖÏj¸­=ÏÕ.ò|\8e\7fÄô¶\0ä\9an\bëÚ²6\93\96\96\vçUÇ\ 1\1f\92,ùE°)WãüÌõ*0)-\92}.c|í\82\ eº\1e'\83\9aý\92\8a\9cÔ\9a j\10Éý6MòÀÌ\8açÖ(Q\91øÖ\96fÂÞ\97wÕ×QÑ,j-\9d-~K>Ú\94!¿#p \13¢ÖÊíC\ f³FïG*õÊgy\ 5·;/è£7\89jÍe\9bÖk%½Âj²¤¼3\87Õ\8cRáW(¾\98:%i\7f¨¢\9d¥ö\f\94\f\8a7­]9²\8b£ä$:Q\15ó}ù\13\eÆ\1aÀ\ 2+µ¹vK®¡\18a`va%ñÝbJ\8e§a¬µî×LÊ\r\89~\b3\ 1
+][
\bîüzÙ.¡Pa<®Õé\8aëÅéfi£ChËT\9f\94jø~ÊÜ\a¥¥1ë,¾\9buo\19\9d\ 1KÅêx¸\93EQÏÞ\aîÔÉãî\9b\12D\85\ 2\99ðÙ±)_\1a­xqî\99\89ÄLú\84}\7fýé\94(5rÇ nÒÖ3Z,t\95â\94¿Ý-Ó\8b\17\97\89\16\89¤`V³Áþø\9cÁ§RG\9c\80yjê¤\7f:Ö·â2õ:\f÷!([྾¬gÃËN\81e\r­ç>]±Sò×ûð±û\95ºeó\8a8\10\119\86Cìñ(ÏÄW+\16y¯U\13¯\855íO·ñB<Sg\84°ÚÃßXd7\90d<\18Üîioµ\87ÑîS¬­/½ÅìP^e¿ó,B\17Ç2\aÝF9~/\9f¨hÌþtMfª\ 3\97t\1fÌ8úîÒù\8al\0¢¬]\8f\15S}o\18r\87Ýë\ 5i\12l.*åðQ _Ì\9b\84\7f\ 4PÙäêM4JÝH\9a\966¸Â\19\9cL¸Æ^\97\85¥\80\8d¾v¹ïÛ¦újÑ?:¨v\16÷Þ\c\fO-¥-F\89\1a\b\14èñ}cïºBø\ 5z<{VÏòS\9fn\94Ò\0ö\90÷lÂÈÉÞ\7f«àX\18n\89274Ll"(æçrñg2\90ëÍ\ 6\ 4*Ðmß\13vçàÏå\97Üî7å[úa¿OñÄ\94\831\88åMÿ!\9e\ fÜv묱Z®\18$|Lí\12z²L\9ax)5\88\93ÁE\86'²¼¼]R踥ÜTm[\9a¾ä\90BZ\88ã
+\91\92\89â|¶?G°¡ºbëë\17\15\0|ÝÛWyØ)à·Å\17ÝVC\ 1Ôûª)\9dQPÖñÍ\vwwNUÛ¶fGYQüÛéÎUë±\ f\85\89\ fvIz\9fo\83fi§É\91ó¾èÀ¾ÕwvGøW\8f.óø~Dû½ÓÂÔðð ÓÆû\8e\90\8bÜø\12¬*ªô[Ëò\17é\ 1yv÷J¢\9cà=Ñk-jÓà\88\1ce\99ÙbcÞ\87Aß¹(Í\87Ü;\\168\8eº\96a6Ø\97L\94eîÔÅ\ f¿Ò\83¥,AkyÏ\80礪\7fJ\89yGî2\833kÍë_æÁ\19\1dïedãUh\8cã¾\8fIk\82\føD\11i\bâC\e]t\)¦Awõ$»\8d¯\ eBTY|\95f®ã´\89\1dy\19LK\7fZ\18v?@-(ôMR®&\8d\b/åÀÆü¤ÁCn\8fÚîa¼z#R\8dKg\ 6\80xYÒ\ 1ñ¾9&zkãBêE¢\14©t\1cl50gøÑM;\1f%f\17-T¬©:\b\14dk¹EQ?·f¨ð
+Z\ 2\94_R\8e½îH'\17ëµ£]8@A\8dÖY\eÔð×ÔVâ\82|*Ð\aU0´>¶hõ)9⯬âóåý\1e\ f\86\vº\96\9f\87q)ZGzm°\145q4sTÔ1~!\ 6õm-ïª7¹é£áR¹ªÕ!7Qö\8fl\a\1f\83ÝD\81&\98¬ï/J=ürfEÙ¥£ÍÚòÜÎÔ\11el7     ¤®U\8d\9cäîUÕ;\165\1cƨëé¤ZCÐSÈëí\87Ð;®\18\ 6Þ\15Z\9bz!\86À\bd\95\873\1cå\80úié3E\19^eóý¡¶j§\93W\86§Éü¦''h§(Qç\ 5»û\ f¯Ö>\ e­OÊüt!fE.PçP¬\11Tص\8b\ûâ
+zïw¡Oe_ÌgÂÜz;Kþ\94ßʬ\9d\95±B±\bèÔÙ))\95ÕGÞF[ÆJFÀ\85×bâ³  åº,\87&\úrÎä\14Êù®¤º÷fÚQ®J\1f\1fÊ$\17XÀâþµÒfã\bO¯Õ\1ftª» Ìêír¯=?Û\19\95\ e\12\8aà¹bI\88\8c\85¹8è¨\0%\f¹Ï\1cý¸ö\83¨+\82òÖûë"W56·\86)\9f\ fà~\vÔç\93Õ\1ab\0M Êóàs\ 5¯©ïÝ\19\95¿_\7f\1cZÖ«\94\15\9aöº¥¤ÕØ\1fv'\17ÏÁ¹` ÔM,\81©\137Öh\9f,ÛGzÞHÞ\91õ\10ýÇ\f²\1a÷aå«ÖÔ²\18\eqÑÐ\eQ\99Ã7\10.\15p_ÒË\83\19Òç\9a2/9\8b\8fU  PµÕò\8cô\94\99=\99[®{Ç|: \f¥Ò/\8d\8dW\89®H\1a¶9Ëq\10ѺÚ#Ú\ 3\8bx\16e\8d\95öZÅ$ßp½k\d¯§~\19b$V\13ô\13\18zÅË+&?s0#ê¬Ü?\96\ 6Ü\9eú³¨Çl¶ÄÆ*\18   \9efÆE¥_\ 6\1f\15\85\87iPmDËñòUh߬\94Ñ/_þZ=xAr`\8dû<Ì\f\16S+â%é\15ôI8Fõâ\ 1)\f\9a½¢¥\15__\8d\12I\7f&ö@7e  )FgU´¾à¼\9c)ÇjÁ1XÔ3\9eÊ¡þýþ½f\8dê³½.\aG\97í\18\ ei\90+¾©A\fúìeȨª\81ÕâAÙ\15Õ`ÙOÛÓ`©w{¦{yyîó¥\8fÝ\v]ú}\8d\96k\91ªQ\r\e.\7f¶Z¤ó)\95\11\98\ e2F\1d\93U\15Z{ª¯RÜ­m\rí\11\19_Î6\1e\95\16\b<³¥³OWðÂá8Ò\91ËqÌlÂil\93,\88©gò¨õôÍú\97<ÑÃ\99sUÜzòÉ\92¦\19§ë"¸3G¸ÝpEwÚ\8dæ\13L5\15.Óðì-@ø¡ñÃ\92HÉ~]´Lm·V\81ù\r\82\92ò÷\1d_v.l5ñ\8e\14\8b\89\8dÌ'ÏKÕ\98\82\87ßuxí#/\82(=\8f\86Ú\a\96+\8c\12\9f ÷5¶05mF@\8fm\8c\ eÆá\99²\8apOºó);\ 2Ä)O\9cÜEö¾Ûáüòu9¯qÙÖÅ3Ègú®!\ 6¼·0\ 5=ÄÉUÅêHÀt÷ËÑèd\ 3  \9c+Õäz£Ùôìøå\85½tÍÊ\8fe\ 1u\88\1avPµ¯Þ\93Õï¾[H\r3Æ*C\ eez\924\8cöm¿ïf}\94\90'T"©W=ÎSûó\fõª\94\9eÝ&\a\9fl`Nýr4êKÝcßàj<\16
+Q\94\1f\13\8c\1c\9f´\82¢ï\1dQ;f6\ f!k'QJ\ 2ayÅ÷»\18Ø`¯a\96\87dËÎ\1eǽò`
+¶n¦\99fÎîé÷ñ®5O\e`\16¯'\17ã\87\ 2]\15>3j]¸ªª\89\f®ÉûÓ\18:I>99\ 1\ 1j\96b$3ËY2\aK\ 6-m\9aîÌ\951+tqC)b\1eYòëOm?K\9f\9a|£îP{Õ\e(»Ï'vÝÑ{\18\94\ e
+à!÷û/\9ef\8f6\v^aü÷Æ\ eÓaÏ$µW\95ö-¿e"ÇÀÖG\98Òï\ evaªÙf»¬\92Ô­\95ð¥\1c\8d\88:\941T¬Ò \0úТÍ[`þF§TÛè;McÒ5:\95â\93Xï°_í¦ñX2c­KH#¨ÑÞ^TÞÝ^]º(Ⱦã¬\9d¸ÿ¾î캫UåO+Ký_ý«Y-g\ 6=\8a\96¬½Ï
+¬ÞìLÈ.ÚDt}×S1µU9rIQ\19\ fç\ få]uêÑø\97Þ6c\1eÚÄ\86o\13f\9e\92è´à\7f\ fI\aW_F\11È^\84ç\1dæ¿Ùv'­ºpÏPuÓÃÔKuÜ\ e_[\97sqÅ¿\8aèÝ»øHs\ 1KC§8\17G\18¶w\94\8cúÞ$\13WYïç¤ÍÕ`
\82\11ì$¥¾â´tÜ[EtÒ\ 1ä\eç×\ 3l\9dÙzð¡º2WM9Wó \96ó-æ!Ã2Ì[çVºÃ\ 3&÷å\8e\18\95¨¸\ 5År£ ëÄ%\b'\83tí¬£Ã\ f:µâúÚöì\r¼\15sx§© ]¼Ú\ fn1\1c^)\9cQ,v^3±fI@\89~ó ´\94¯w$ö\e\vÀÇ\84¿\1cÁ_\9c\14Mo¿¿ËI¢\17è\16\86=\94\83gݪ&\7fÒ·ÅJµ_Ë\\9cÞb+\95û8\9a\1e´\ 2\15\94·\97³B\93ÝyðĹØÁ[\8f­µÙç7\ fT½®ÈÃXj¼É¡aË\93Ûsh\14\80\8aNµsÎ8\ e:\11
+n\0Xub©¦¾æ·~8\86koO¸ýq\ 4þhVZj3«·p
+[{ìøè\98`7D94\17Ó.m~ÐHÂ\81î\1dÐ\ 5N\rt\92J\0P=t\fµØ\84\1e\81'^î_\19جùæ\9díºÛÎÇ\13ë\9cÒrâõ¢g\83e\81\1dâ[ö\17¼7\8fÑôK>\1e®\82Öt2Ð\ eÙê©f\13H\b^=ó\18\1dïW?\87\9bÆd\r8h\ 3\19Æò\9bÕ\91ñÂYH=Í\\82~\86\17زj¢+ð\v\0´3\ 6õVé®*u²\15Lj\ fìwn\qÐ\9e\ 1èØv-{r\16\ eÕA\14ÔÌFÅÊ\v[\7fØt_U§¼ZÕ\8dáç좥±æé[(«¨\8e\12®¼QæÆbûÒTcÑv\ f
+Ü'\b±\85=\ 6\ 1ìg\fSx5iqJV\7f\96æ\9c[hÒÏQ»,\15Oªnâ÷R\1fH*MP.\7fjèì\8cB'³6D\1e2\1d\86~¨¾ª\97éÛ\1còrI<\ 1^/t\ 2j}w\9er\91-¿­Ã\ 5]têá-\92\ f¬\97ÆðÆÝ·ß?ï©57t\1c]ÅÎQ>?Å¢
+~RÆw¾¸>Nû\85\9a¢çüØ¡\1a³B?+·\v\ 1
\96Àa\80`òõÍÍgTÎ\9c\8d\995ý5K\1a´\82·ÊøS\8f\9aó|\89\0\7fú\86R¿è£º/Ô±FyHwÊJã¡$ãý[ó³\ fãJ\eéd\17\1f\9bn4\15`\\96ÏrÅD\96\87Øo­ßâ\98I\13[wOõ}\94h¯o;ÐTkê÷«1n­3 WzuÅíx¿6\12ñC\9d¢ÆèD\v\ e\91\86³ÀÞHÃ)    \e=«åé7\97ÂÂ6Eú­¥QM\fÖ|\1as²Sx\8c\87jþVlmÔ\983.8\93RÿÚè÷¢\9au\ 2ån¼è»ÍZµê­\8b\85âôÇ¡-\15ó'¶ÂÄí¾\94s\15ýÈço£Ò.\ eÁRAÓÕÖ\ e\ 4âà53\8cö\9cÔ\ 3k÷¬\ 5XEQ¦ÍÝ`êÒÞ:q>\95\9bIAÏâÕêÆâÓ\8cÑ\95Ò)ÔVk-w\1dE\ 3zNüÇ\ 4bý3óëa\16î¶\97\95\ënРaXÚS\86Xe\\19ìVnÁ\1f\17lL_ôû<õÚ\9b\18ÁôõÓò>\ 3køPQå%][\8c\9c\bR\ 5
+\1fh)Ïä^Éçª\ 2\82\89íÁú7\94\8aç  1\97\rYôããÙ\91¼²\ fßη\97ijÊR_ÃSÑ|~.°ÌÝýzÚîWnB\98\16\1déA§§\b\13\9b»\11>l\81Ò®q%=\\97/=¨ \15¥7\8cSæív¹\0ÐPùs\17\8aûùÊK}µÓ\1dûjÏ#\98øV>\ØÃ*s\14µºuüO>k\12Ær\ e*\rpV´ÏDO\81\9fd«(\9f%^Ñ\89ÞÜ0³l\1e\18E\v*'Öol0w\ 5_ZZFó0ö\85_ävT9ífjêõ\9fnª>\88^\1d\7f\ 2ÊeW\8dÍIÑÝ\ 1\f6T\94\ e\18¾çýáÉV>^°6ÙÃ\18\8c\19c\ 5±\9eùüÊ\92BpõEf³'&\ 2ôåÐ\9fµk³\1d´\8d\14\91ÚFþhOí^\aú¦Nð\9ec\97ógÒ*íÇB÷\b\14,nb\15Ãn¡ó\18Þ\92´hȦ_v±Æ\1cï\95_éVó\8c\ 1a\96fÔW:à\8f²²Jw`z\e´<e\17'¾ËÇÝeô\ 1KUVy\1a¿scåª\8bùõ¤\ e\10£«P4ìH#í¢ÊhHù\     5P®¬µ¨\93\b\9a\9f\83·\a¿fkc|\13Ú\9a}p÷ÇT\fÎQ}8<^eÁzö\9d½ó¼÷¶½Òõµ3Êç¬`d4þ£\83@Ð^\97T\98]\8fS\9f\9a\r\95ùǺ\85Èó EÑ\ 1GX\89ÝÑn¸íªÞªZÈ \1aõIk\0`;kU%ÏHÃ\ 2\0í.µ\17\9a¼\85\9f\1a\1a\93\88Xr\80ZÆø\9fãD.{O!\ fìß,ÂÙÇÌ\1eÔñÖ\ 3Eb\18w\82Áõ^G\9d\15ó\18xÙ-Àjµ\859\17ËÅ\ e½]\91\16W3\15\94^ít\91Þ%ë2®]\99®\14Í\1fí\88Ù>\15Ì\81uCZª\bä\8a\906\85NçÏ\9fKÊ-óK\e\9e]þ¢5PâªN\17\rt±5®\9fɸpû\1aãÄ"gtÌdTV\ f×J\19ð\19?x®Æ¨\e\9fUyË&\eK\9a\a«öf@nå­þ¾/\83\8aÉÝ3µ\vÂ{)Q¹üijþ)Ô\1aê¦{IÂyÙ\ f0SM@µÈбsh[}¸(})\193Þ_u¥jAZMm\80\9eG\v\ 4\8bÉÉ\80á+FÑØKñÜ:¹Tê?\1d-¾Ø\1d¿âø\18\1a\8dï'UN\93ߦ}ý#V\ 2Ê#\84W¦À\11_¶Ü{_\9cM-Ò\8a¯\ 3"I\1fcu\\80Ö/c\ 3\1d?!Tß\f1ç~uõºXÍ\1cZÚh0@ó\au*Ýb\1d¼<ëZ!\0iwË­\88ù\9cöÕÉèPøY\9a\8dol'î1ç\84Z\19àÙ¬·\9fCÏ£A\ 4Í\1aÃ¥v\9f\99S3\18\9a<\80Vï²r^óû,\83N]1¦wS\ f%'YBz¤8®î¿"~Ê\88\93`ÝíÓX\1c\ e\1aÆ~öSɾô\83N¸?\9d6µî\ 53´Çf¨«\8fa.\84\91Ùçæc¦åO¸Æfï\ 1\9d{7:/\ fgê\[{vå
+ì=*\e-Ñcµ?0JòbmNFå\14\18¬\87g\15\81ã\82\18\1eèæ>\92º\a\11¬\85¿êzñb\vT\18BcI\1c|ξ\ 4æ/NbÇ\ f^LÚ\87\8f¤I½;   ÂÖRêMÏM¹9\99"7Ú\1e\f\1f×E\Å_\8b\19*5\ 2OE×Úc¦¿YöåxØ´¥\ 2R\ 3\98I\9eÿ¹f5­\8dë\92\9aW*\1d\9a!÷2^d\1eB¼oÁ;³\17_u\87ê\8eŲ\80åÁ\92ø\1c´ñêE\88"÷>\8ba.§*ëw\14ñµpæ\84í\ foÊä\9aU¤Ùêa_alu²Ï\99ò\12\14\1aøõç\9e'ÓÊÖ<PùU¸S+Üب¼eT½éYäï\80=Þ¶.\13\8dÙ\ 1o©>*U\91G\ 3Å\95ɹ¥    E|
+oåc²÷jÕ¶&L:ÞÔß\17\18Ã\96Ê%X¸}\92\8dðøúp³º*þb\9d¢~W\9fD\13\96/\9a|\1e¼¤Ñói\ÐFÿ\16\97\98V\8b\7f\9dƵt­\8d\19ßË\93º0ÅÅ\89Q\8c²Ü\99\8eª\ 3±x\f&ã~5LM4ZHâ\12\ fdÄý \8a:q\11\90wï|c3[é¿ã9SÝ\å?\96Oø5µ\9f\ 6J6m  úH\8f\84Qàk\8eË G\11uÓ)>\7f6fÆ\88\99\ 6\99Xg\9d~\ 6Ë\86«uøÐx^Ò\16Û®$Ĺ\84\buë­ê|ÿ¥\ 5>\17µ\84\ 5\95ý¸\0}\80\14ÖÞ\95²LÔP½\8f0\17\9dÑ:s\8fçY`én@ßÁ\96\9bô\8có\8bdqñ´U¿\94\90¬Ñ\15ð
+\92ó7ö\ eù\87\10\vô¥\84\v¶C\9aç+$\8bwúÜ;î\ 5\11\15ÜîíWµ¥àEó\91@óvG8\8e\18_þ,a@/D\8d±Øí>!y·\e\è¤0\7f\89ëêÔ\953ª>A\fc\1dHÁÒ\ 5äg$ÌWñ=#äl9uä\19q»¸\9bH®É\8c\ 4\0²ºÆ6¼Ü\82\7f2Jî<ò@\16Þ5\12'\14é#Ã\80Õ\90­\8d\9d\1fVÛü¤³ïEM\9e\94\8e\9f\19½\1e=4\8cE^r¯~È´þ"\ªc\16Wd¤ßÙÐÕ\97zS\9c\911\83Ä\10\18ÊiyC¶E\19\ 1Ö¿\1eÐË°!\ 4æ\99\1adÒk3\11\9ck\7fÅ\18\bWÛK7s=\9cnw\80ª-\1cY\90ÞM\12Ã\ esö¬¢m¸%w&·Ù~#\ 6\91\aÄÇ\96´¦\9fBÌõû¸½´3T
+¯«@\95ÊìØÔÔÞ¯ÎIJ\19å62ìJA§¹\94\92.Á¸
+_+w_Ùúý@\8a½\88ÏÖV´\f
+5\ 6\97¤Á¹ë4\92\pK"/IÂ\^N\11_ÝZ@¶È%wb\1f0¹Q\15ôêsÙ\93îÈ3Ù\97\vç_'\91Ùyõ\18J\fß~EñÇ]\84\9dýì(aµ³«\9c\14¤ãº\ 6ìJ´Z=\8eZ\1e\6o\9f\v-y\95{\ 2ÏLrªúùÆ\91Æ\95\r\95Áæ¾\9bV\95;'\ 17·\95\f\13^îH\0Æüâ\ 2\93Lï¾Ýñ¬¿\92FC\14ÀP»¹6Âc[\95Ò\9b\8c\9dY_\19(IH`ñQ\8a sã¥rÜäÅ\8fÈ|Iä\ 2è\85,ÁPRkT.\rw\9b\ 1o,-M1\ f\87\8d»eký^÷\97ôÒ\89ULÏ-C«
+4y\8c4îT\ 5­pdËÂÜl±j\1c\9cÕ    Ùj>D\^1j        \84\ 4¬pò\ 2©\92õÞÊ\178ÜÍ\0aP\99\91_\886Iïbp\888V®\9d¬µ\1a\1d\9fö¿ôª\94\ fÄ\99Z\9a\90έ\81ô
+­¶"\1dü%Ìñ\12"#Ìíª\89%y\92®b\ 1Ô\1a\13\ 6æðn>[}DíK` \16"£ÅÍ®\r[qÝ\91õýìJë\7f\95_O)\1e_\1f¥Òf~\81®µ¸À{æêR,¨\89]:\aÅá\1c2zkf§\16ÚÒ\z\ 1Ú@»Úý\\91\1d¹28zÛ¢ê_DU©\
+\v\18\81\82®3K=\ 4b?¹\89'ξT\8aKµºù\1eTÀ]\væ\81S\7fïF\91\19\1fã\1a\1dáËÿm\r\1d¾Þïs[O=\91\ 1'ÏSò²\8awg2h\1d·\84\8aîBÛï\9fóÐåË˹bxÂ@\1aì%ÄÚ~~\1dE\19e:àë\1dÏ\0q\8d\91\17½ó\v.ì[\7fº¿Ö>\b©
+V¯\9eô\97×Y\18²\8f\952\ 3ÔÜЧ ä\8dÔq]i\93Í2ëÏûe»bóè×\8biV¿PõC]\9aª\88,\eÅýªe¨pÊû
+£ÜQjä¥t-\8cTgN)=\90ý)\ 2ñ\bɹ§Ï\99\86«Î ]¾\ f­\89xve\85½hÐåªÉjÖ\9dp*JʳÙn1\14ç\14 \8a
+\7föÇF\r\91×
+\9bò\ 5\92\9f,\9eË¡{\968XÖïv»·\93\89®±Zù¿ö+ò`õ4\16·\ e
\97\1a'\98â}lº=÷d\vX:\7f\e@+\ 2Å\82H\83ÂZ \1díQæ<Ê==\16¢rÍzê|\9bI\90ãæ+ÉSË´¹=\1c\9e1×Ò\8aìóÆÄ\15\11íº\r\7fÌF
+ØÙVGÞk\91Ñîã\8f\94ì\1e¾V\19Õ>½\ 1\1f\9c¤GWq\95Ëá`/\80Æû©\9e>~ÕÈ\80"íxýiY­§¬¤\8bóZ.ðE謨,=×FA!£À÷ÊU*S´ªöí?\8d³!¡åKrørx³I\95\93¨¶\1eJ\ 6¢\1e\1d}ÕB5­gQ\89\8a]ÍÝç[¦Ðp_êþÔy«¦êïz%ú]Qæ\8f¤÷Ue94çÛPh\9fL,6\80\vy°/\97ÙëËÏè\1f\1dÔngµËïH\180ºöi¦\9eë\12K.sp£)>¤)çö»\ 4\r\17ã±bø\11g\ 4H\93
+§JXp\83¡&ë\14\94·U\87ðM»§4\a\1alR\93±Ö\95\9c-a\15éCVw³ÿü(\876ÚU\r¥×GÊéá«y¾ÊpQÖ7 Þµ\a­!â}\19~G3­\8bÅ\ f©÷Ô>°`¦êÌ*#Å!p3\16\e8Q\9c\12HCýë\8eUû,Ê\18£nç\15äùâ\10}6CD/N+ï\9f\1c\82óé\ 5üQ¯|J\8d¡óçcÇ\ f§¢<°ý¼\e°Õ¦\9e\86RV\80S*Ä\9bÝ<\19.\15ýËt3ëÆ\ fº±\8c4
\0Ù¹Ó硾ðÛêz­R÷}\9bìuÅ\8f\15ôá_\ 5·Â­ \14êLö¬ºt\1dÚ\85±\81éíïw\8e?ÑÈÌî¥\14./ï\15J\18ÒRÅ\14\ 6ã\8c&Õʯ!\1e\82ë\11à\12ÝRP\90ÅÇNܨ\99_\9cÆ'\146$ywÆí\83GÎL\0\81ÿôH£«gÑ*àñ}²¿\9ey\89½\82\81IY\89àé\15&ùêã¦Iä\9d\ 1\93\ eÝ\92\9b¯ sd»|ó\bøtSrÃö,Ë{9_\9f\95qËa\8dC¹q\e\9d\87\85»ü\16\92\95Þº\9e\7f\97_ÐÍå´\94\93&wU)\86÷c¬C^\8dzk·°ÑÍ\91\19¥j7ÞØ\98\1cÃÖ&\147ÀÔ[e>Ô\17o+#\1aáÌRÞ\8aXÖÊ\90R\a£©\84(¥sçdß\94ÖÉ\8d\9bDn\95\9e\8d_äÖ*C#M\8a\95¸npÓ*gPÍÔ\18      À\9bÖίJQ\8b\93m\8ez\13\12\19é(¯XÅ£Ô\1aanBW8kY(]ôÏRîÙ²F\aÆ\93°cnÿ\14=s\14¹\17\9dr¾²k§G¿\f»\ e\ 3@C\9dyÕ#\18p\8d¾²®\94\9a¶Y·Wn\87Ë»~ã\14èf<äd        =\97D\87^\7f\81éå#ÏQ\93¿WL\ fÿ\8cµQ¦\92¨Ü,\8f´ÈÉ\beþ:Õ"\82\1dÆqç+,,I/ý\92ź\1dÂ\vÿf\9b¬\11Wó#'\9däÔ±ªkJ¯xr\15÷èÞѬ\7fª\15\95OF\15Ð/\82¨:Dû\r{èçWçt/WfÅ.J\98Â\88Èijf\96\83\92k×õÅE\0\87§F\16Û\1f¯ú\8brh`#òQ\86F#}Q\9f·\15«\91\9eýxº\ 4x-¤®Þ{ßx©Þ²\à\1fOgé¸n\e\ f×\14tí9µzÆs\87%æ§/Ò\8bqK\9f\14¸í\ 5\1fó\7fG?'KÝ_\7fÂCjÎìÖW\8dN\ f\ 2¾þ\¥f¹\0ÚÍýà8XàV]\1a$]Ú\98\ fdªcu<SÊô\a¢5æÅ®\8fô\98@Ù½\17¡G\97ß{µwØ\89
+\8aR¨ýJ÷\af;w/òþµ!ÍpOýRx\18?F=Ù\83{\ 5½\93k5à-\ 3gYWf\92\80¦U\14³\9d\85\80\96P~§^?êŪÄ\96\91\ 1[n\1dÕº¸¹\19èÑÆ:\ 2[\85\94\81\98¨êìQѽt£µ¬âåO³LwßZàÊÜäV\86l×æ¶X\eH\fKÖ ½n×f&ôÔX\f\ 5y\]<K\1fm[1Û`éT,+\83ú*ø\1eã×\17Ï
+gÅö¸íÔ\99(n\91g\98ÞÆ\f\ 68i5\88YuPϨ\1f¹ÕSBðõí OuÆíÎMMÐÚZeÑ:ì\rvÞÓGgê+\18Ô[\19\8b\93\8b3\eHK»ÖÉkLu¹\ e-d|\19\e[lÃaåã\1d×\ 3òÕÔäÊæ\ 2V\ fÏ\8fro\18\ 5Ï´Ê?\130±%ÿ\fz­òÙi\rh\89¯EPÕ\ 5\87\93ÈÜ6©'uÊ\92\9eU½q\8c®\1d\ e5ø<µ]í©©°Â\15¼2\84\113L\942·W·GJ}\95\0A\0\96úÖ¡\9c\13ã½Ãv\9c|ßÿé\eÃfT½\7f\87÷°\89h\ e¬\11\a°\ 6ÖÏ\84¯\ eóÏ3\1e\rý\97\96mÛsÞ\99³^À¶\91ú\ 4oìM¡á®PW8\96yÒ1\86\eá8)ì,Z²5d$\17fâyv+i×\eð¶;ÁèO\87ÑG\81\92C\93Aêb®\8eêâ\81\82\ e\9e{G2z\80~\17úÉ\8a\9b/ÙÞöè`\12\83Û¼ÁÎà+@Ø\88 \97ßÙ Zl\8boM*\90¬R_Z#\7f9z¯&\ 5Ì/Éá£ÙtvGçç=Éñéò\96Å-s6W¨²F\ 6=±'Oe¼©q|cg]¡¬¨íÕA5È)¨*:\1d¤ îÏHÍýø\ f\80.ÂôA­Õ;}»\92¢X/ª\94wÊt\89\8aú53+Àô\88Ïås\ 3ú\91Û\bÖ»=­  nÎ\86º[\81>ºéB\0mY:<Ë\b\87 æw\12h-«ê\87s»&!$\e\84\fF/eËoA­¤\97;\96ñ \ 2;\12Ãn \ 43Dì§ý\99¹\11º-×8ááh±ÝýLÀ(Ç\ eb9§Å²g´&3\8d\:G]=ßH@O\9b©¢\81\ 1\1an\ fY¢îË«¹sÚä\8cw\88é\17ÇðªcYÄà\8bÆ̵K¼ûêÅ [äÛ¸\1c<
+!ÖY¨æÝg .o\8dßÓX¤\\15\ 3\7fý|úBÄʳ¹uu«L¹\9dIS\1e\99]±bÍUëe\11uôÐ\13ÙGA?_\15\86¯*ànZCå\ 3·¥ÐÙQ\1d5¤Þ÷°ð\1c\ 4\9e\9d \b×¹\9f\ 6_O9ûù\eÛË_kâ\84\1e\86V÷céFt\84i\84\88ù¶=­HÕ>A7}xÜ\97ùAiÛ\98­)¹:\8dV\8f\1e\9f|f³\90¢+ÃÁ\ 1¨\90Â(\a¾4$0è.\92\97T\11ãì\8aé¾Í m\ 5\97\1f\87\96Lz\91§}yæH¯Û²%zTÆD\19ú93h9)\8aqãYñ!D#p\16$®Rq\19-ìÑ\97 Â\9dÍ'\92\iÛÕ[c\1eÖÁíz¦\14\94s4\83¢ô=Õ\ 1à!KbÕ
+\ 2\8br\ff\86oÊýÕ\1cqÞõa³\v6&%¹·EÆfa({íý\ 4\eÈÓ¬\18%\8eÝ&¥å{ÛR×5\98\8c\1aØ{7þl´£ò&Iâ«äW(\8e\81\8f\9b2íB{k¹pQ\18_]1ùÝjÿ2\85Z¸&\10íu\83Ç\86Ö\87óØö\vÕ)Á\8f!\1dYÆDPAWö@yõFZí}S\9di\89½t\9bb>Wkì iè\8dW\v(jWZi×\ 6\9d¤ÕÞ=$sKÏÌÓ1\\87îР ÇÛ¾ú»¡j u®å\95êk\1c\a5p¨Å½\95e\91âª\f\ fÅç]\ 5\80µ£\rj\83\85¶\5ïÎ\93i\1ebä´hO[\1fîb­Ä|âû×d?`È\16m¤Baê\14ÛÊ¡[\ f\93D\8b\98\ro@öñ×d\16\0\ eôK  éP\99miÃ\92&Oiè.?Ív\88Q\v{<;õ+6ÈS\a7~fu¼þâSÃ\vÙÀ|¾Ë\14Ìt¸\89VY  V7¦±æ¥\r4D²|\13ÝÓÍyZ-N¦^1xÿÜ\9aOU\fr0`ö¡õ\bÙ\97\9d\8cò\r
+endstream\rendobj\r26 0 obj\r<</Length 65536>>stream\r
+v·\81\94 ýö\11"ý1±< G\91\15µ°\12\92ly\82\96¼°9\9dx.­dÉú\8a.G\fÉóü\rg²Ð}Uöýñ§Æ
+óCpp\vÁÖ\86jCäÏ º\ 3c\eúiÉ.dñ\ 5MDM\8bõ¹ÌÂ6;\8dN\9aÈmGvÌ\12Ò\8e\1c~\82ª\18\12å××q\8f\ 6\9d@¥¿¢ã¼#- (7ÚÈa\7f\94ÞO{\935·P\89\17$û"3Âu\974\1dÿWÎ3\1a~ J.OV\9bà4\9b\fûÌB6äR»^u\b\18G!l8ßÊhëãéDôìÊÒ.ܨkbúH×YmÌ~I\14¨\öº\1cEóÂ\83$Hþ \f\vï\82\96ÇN\92_;ò³ógæ\80i\18\90Ö\96Óþ]^|\8aîBXË\1f\9e]s\80Þ©\97\8f3~NÍGØ8%´º&çAgD'ß\95L\12\15ÑÉï\ eG\81\ 3q\8fâPa\87|A;¹-I\9e\8c?Mó~n\8eSô±ÕÙA\95þciĽ]\8aê\94£\92xQ'´\93uÈÝÅ+*tV\8aVRu\13¶Í\86ÙdÚIÐ0\14ê%á\8bâI\82xúÊ+Öµ\8fMâç {\eá-`iä$»óç×ݺ?ñðPo\rÏ\91Ýÿì\7f\8a\0Ò\8eÆI\1d\rÛ\96fMdB\1e\9e\82\96{1ûxrØÝ\bvàD\91Í­c.\8c.\9cC\92åýÒ¬\8f^Mw\9c\8b\9dý¡\88kûþÕ7Ö\11\ 3µ\ fÛ¶§ÌCA\9c/^\15\91§Ë\aÑ#¶ê/@\1c{\1cÛ\1a\91\97|ns¥¬ã3=\86ìK\1d\ 26âUx±Þ\8dæ\ 1òPn¬\95M\ eÒÆgÓ>\ 3w}È×\8f¯²0\9dµ\99\14{[*\1fÝ\1f\9eð\1e4Aý ®¦Â v%Dã<î\8eñ       ö»\18#6\96ÊBêO\1eMäA1´\ 4\1d      \9c7ÞïÅz  ®-É8|h¡cïxo6 f\92\90p\98ÅC\ 1ÉûmIû¸WÑX)/|5óFÒ¬³}Hr¢\9c\8fw³çi\1dÅ\96ùIÿO\19\BÞk®J¥{LhÚë\99^!Z\91\12ì\8c\9e\99\ 2\1d\15%X©ºt$ÎaØEtlEÈÓ^LMýO5Yù\ 6µ2\1e²&ðcm¸s³ZÑÒ\ 5\9e¯\v@Ù#y¹y25¸Pø¡\80ð¹\7fq\86\8c˼²;\0\81TÃAàp|6'n\7f\e\ 5Ó\88\7fögØÊnÛ¥
+s㧧\1a¥u>Û·ñ¬"o\81\94Ã\84®\7f\9c\81\96×G¦H6\95\1cé\16\a7Å@µò´¸ë\eË4ð~\À'\83\9a7]\83\9c\97¿¹oËë\81\riºÝîçæüË:\ 5ëÕ\17±\e¸!µµæèb\96\15ç\87zs\92Ì:R%\9c"\85c3V©­\16ijãgú|B¤j\84\93ÀE\ 6·\1e\7f¹ÿéÉ9ò\8cL4=hG\v\81"\85Öº«\8a<q\98DõÀY6\e\93qb\12cfÊÎ\13Òé{\8d¯3³V{¾\97½¼é\80£«n½ßt\ 4ÜJ$ÌCк!.dGT/ÏÆÞ}oîËW÷ñË°Oîn\\8c\v\a\1fH\e7é2\rïSJ-O³JØ*\15sÞãoÌ\bo 7û\ 5\ eraùz\92ðq\80\974°]\88¤ÃúÃ.NqõÊ\97ö¼#\9dv\93¾\9dy\95)¿\10\15HÊÑÅaÚê\ e~C4\ 4}Z^Éu·Ì`º]ÿbZ­ÈÈ\1331·ÑØlHåüx\91F\99ÂD\95 \7f\94ª\85ÖH\12KáIñ\vA_\82Æ\87§ä\9fThTb\97O\89½\90¶ô\90Ô9\9cÅ\vIZ»\85\9ax@\8b?%=\7f£Ï¯\93êz¼ø:\84°õÄ\87\1dE\9aHK       .¾\89\89\98{\90RBbD\92ü[\v«\8fÓ\9eì6\aMéU&\95Íì¼>\19YB·DU¼CamO º°ª¹b\8a^\18ù0\99\1a\1aI³¿w#\95Ш9\94ë\85\9d\8a\ 4ûû÷d\10\f,\8fo\88|Ó¥LlØ]s^¼~
+vs\12À"ñ\95êVýèäfO9c¢Åt\8aܾ\83Wt\91ÁBñsFÐ~º\9e\1fUãÐîJ.U~¬\ fþá'qýñÃä\84{æ÷\ 2¬ô\ 2\9d\93\1cßE0±\ e2P¯\0Ö\18\að3F\86Egcê\aÈ5¤F\8e\900á­8åt$\9b\82ÿ\99\17ÒÁ÷4\87ÍÇí-ì¬\846§µ;ï>\90²#\ 2ÔâWýÀQBWµ\16\9bL\13\ 3\91\12ûÓ\91\82ëØî´\96\863\80_ãûf\9aÜäd"X£\96îÏ@\9d\8a\80æ³$l\8a5\òlõáõ\8eï\96ØýìÖ\83¸\fY\16Jè¦xxnL\18l4˪Wjý®Ç        Ì¨VM®°\98¤ÏJÜ\17ôµR4\1e"U\8ehq¼\12\8e=M`ï`{èήí¡Èqýe¿ó¡\b#\82\88\8d\ 46.þ\92Ø\84Út\10lP\95Ö#ÉóÌw\91o\ e½r¡ê\1d©\81(?L㯯FEQxv1\187ɪpÂ\1cM\81_¯7ô8¢\82\ 4![J\ 5\98õ\ 6ÎF´\9cÏL\89\1d{j4Ë\95º¸¸|%>9îåìt\90AR\89{u\94B\9a+½Ó©GH\ 2-TåcÂüºôgú»ï+ñ<ª(R~\8cÜ|\ 6\9f\14øìV\94z¸Ø\8aÂ[Nå\1d\8e\8fåí«0¢Îr\90ÉÆd\85Êa>²¡¬Q\1dÊäy3Q(ÞÝÇ\1c0$u¢ü\85\97k±ð\85q\92½i=3ø\93ñð2¹Ïì3à \ e²Ô\97EÕû*\84}\1e)ãÃZ\94\85\96M,f\vân=ÆwC^     \fçVGpǤ\12ú\8b¿É®%,Ñ\9d®§u\91\91ñ\87ú¤¦Ê¤¥µ¿P.÷\16\9d\1cr\býW;¨\10KR\90\17Öõ\1c\ 5\12wv^\1fª \8f -Òüi4°\16Éñÿpt\95kªC1ðY\80EKK©\0-uoOÝqw·÷¿p\7fî~»PÉIf"\13Ôj¨mCìës×\ 3\8e1²Ê59%»õýÒ©_\bÓj.±Ù¬ìô§9\ 2Ó\ f\8bmt\94H«íÑDx\19_ê6\üRª:Îòihæ'Û<Ï\8fP¿¶æ"\ fÈÓļG\95Zëû\15u»º\1c@\96\18\83fgú\18\84a#2?2WrêàPHÿR¦d.e\9e\11®Xá\1cjKJ3\17¹>&+Ë/ö÷GÝßȯyk¿kÓQÇ¿N»û±kÕú\95gøÁÆ_ø\19y\899¹m\86ÚZ°îɽØuÌT\17\15\93^\813¿\97ÍY{\88·\94\92°°óÃcè\ 1×;gì©\13ª`8\9a»
+$qvýCý\ 615ú\10\8b\8eÕÅ]\81\8aÀE',Õ°£IgIÄ;­gHh\14\82\ 5^|\8di\144\8dªÏ\f]{@\ f\ 3wÎL¿\ 1\1cÿ´®ª\8f¥23âRïe\8f?NLcúpo\96\vh\ 4Î\8fÝ/m\87¼q\84\1d½å¦QÛN\87³çÎ:\92ÞÛɪÍ;0÷ï\8eå·\8b'{5Efü\9aà[\96\b-Ë?E½\16ÁP\8dÜêÁ1\ 3({·\1c¥í\8cu>\93\99\eÃ\95¿­\b\85ïsýü\94\83\88|\8fþ1~Øt[»Úu\7fÕ¤¶\88_\ 5\17\ 3å\vØ\90ó\93έ\19Ò¯;wD'\937m\9d|âÔðìwx\81¬\8dz,ºÛ\bnÛ_â\99òT^5\1dݸ³À¹$\ 6\97¿è  >Ëåƺ­\82ÊðU\11\89\9cö\1cL\98<ýÖS/\a·xjÛ\1cò&\95õ\98\86½Ûø\18\80,¡®\94Ùì\15\9d³¸
+@yð¤\91Ýt\ 3\ 3\7fS\198`py'J´\9b$¾^Àí |üuÛY=t\87\84¯   4\ 4ë\83På.C\94ôY\11\1f\81\9aã×øïéX\90MZ\ 3\r\9d*\92\r¾VIا'\ 4{\93n=LÃ\19\v\9dÎV\11»«VÄt«MÀ1»5\85_\90·w_°¿\8a\87µ\16\18\11\85/^í\1aªÓa%"©TÃúpÖà\9evß®\15Ì㽶M\ fþ8\ 6\8eE$\4{\95ÂSh\89Ö\83BëøòÕ_º¹É\1d-\vß\8cójûÑT®\8a³\bÂuyæÖKéO\1dé\e\8e1ܯ    c ó÷\17ÐRdÝq3O®ö@ÃyèãÖ£æ ò=DÐ¥\8f\9aðúô
+\8bU\ 1\ f\9fÞì®\1fÞ\ 5Ý×çcÄ\b*¥Üh1ÔË+\ ev\ 4;\12\91v®7'ZÌ\7f¥\b¼\16\1d\afç&lí¦¦Y\99¿¬\1c,ûÒåü=í\96\9c°"¿¬ÎÅ\9by¢,iÒyBÌ,ÈX·Ý       ~õ\90û\9a³ê\99º¶\93g\ 1CÐw\96Yír_\ fºæ®\10²¶ÍÛ§Ýþ×dá-úë\9bQà¹\92ÝÂÀØ\15\95í!i\ 5ø^Ýv*µÙ\19»¾!Çz¦½5\18?x5}\a\12ä\17Ó6î£[úi?¢+殤þÊ]\12\9dª$ËëØñ\17ÆÌ1üåª{æ\e?ñ2[\b©¡\8dN\0\82´Ûs\ 4T
+ÝÐ\9f¨¤\13ls\11\ 4×\85\88x@é¦\eR~3«¥ÎiÅß\98ËpÒpù\9aݵÓ\96ÝÆV$=°\8d¿é\ 1\883y\92ÚÞv÷õÓvß[\ 5ð/Ëa\83É¢\1d\11á­ëòZ2\14\97g\1cÓ0rjPð\rð;Èq\95Ùx\ e\8e )"mz\95\83\99Ãõ}\899\95\ 3õ¯rM7{\bq¯S¦ ×J¬\13\9d¥¾êø«­ÉÄq9ðÏPá\17ol\16kAØ\bº\90Ψ½à\0²\7fþ¥xHî\87\9b}¡íy÷ÁÚFBe\9cé\9d(të\7fÈQ\1cÞßÃh\17ºo{w\9e_ºfs<ô\eWr\ 6òKåw%\8b§\8d\ 3\9cLd¬ z­\9eõ«{ª\18ò\1aFýT\8eU\7fÓ\jåøò        ú³«ÞwGÈV¯Ä[Á#Æc¡½\9fí·\ 6[)^í\8fº\90\82ut]Æ\8dè\13\964«·/@ú\9c\9f4\82ײ½\11ä:±2ÐVÁð\9eÑæ\17Ö:vü<\1aë"C8ûa¶\80\8d\9aùå\99ÆCgRv\97\83¦f>\16J\10&r²W[÷ÞÀܺ\97»\9fiÔµO¢èÇ<Ð\ 3ÖM»\87S{>3\87V¡Þ²lsu?Gõ¤ªÛ\19ɪ¿ÞAºC\94Í5Î5À»^õ\ 2\1cò\9f\87[\ 1Zr,{\ 24¨t¨©\98Xï7Qtسþ\82ýÚ«a\ 5­Æ,þs­ºÛ\9bvß_·[\8aÂb»¹VÆ\91\99;¾æS~¥tÉèÛvðKÞÛî¹\99¹ÐµXi\ f\89Æ\1c\80\82Úµ¸t\v\a\ 2Ë\ 6\8b: Â\15\15\97\15\93_"ú¼ùëÕ<ä³L|¸_ìQv\8fï¸\ 3Õ³©Sø\8b(û>{#pÂH\ 1 \9e¥Z\94ü\1d~¹Î¯ÓM\8f\9d\1f\83È{å
+_Úó\ 1\82ÂO/\ 3#\86\1e5Îg¯X\10%gV]?Û\89óüØ\v\88ÒÁæ*c!·\1e\81t\11èFhò×¥Y\ efJ\8cQÒÌ×óí\86çûD3\0íÃÿR\84?=\ 6äk*\9bîôt-Úù¬]\80óÇr\vvýò*\12gÑÂ\19R\r:\9b\f\ 6û\80ËÜ\85R\1d0T¬Ï*\91\13\9c¶à$\ e\9aÃÆ\9f\ 3 9Ú\ e\90?àL\8eÆ
+¤D9õB  ÿép)Ã÷º\92!\95±¯=/\ 6«\ 2bâÅ    ¸]ÙÓD®jZðt\83çF?\11ÇÊg¡Ç\95ÞΫ©\19Ñ\9cÑ\aÁ\84^\v:G z\r\90t\16v\1e\89¯Ui\89ç×E}Ú\10Aøt§¿á\v
\1a\96Ñ\1f^_>ÑX0è\97³ÕÌÆ\97Þ:\9dÔ\91½þ      ×Ì\1cöá\14 Í®6Ñ[\9ei!}+º>\ f\ 6\9b-êü7\86\81a@mßUb\ es¹9m\ fV®åVùæ­ÞùXµªù+EdZ[·­s\85vÀìvºÇG׸J%»\ 3\0aÕ'!\9d|\9eT¡HgÖi,\1d¼L*UѸ¶¯Y1ö!í\15º­ºï^\9bpUy      \92c÷Biýû¥â¨Ë     \1c}=\86Är\9f´øßÒ\9a÷½?#&4\91\16\82\14\8cf\13Ò-¶­;\~TtëX\82£ô\ 6-QË[\81̯\85{/æUf/\8eµ(w\87\bÖ5cØÛ\162Ø¡¬\ 6ðZÂ\ 4FcúÞ\ 6§g\95±Õ\94Æ~&0F\90(jvç\8fDoÕ3í\8fÇÝ k¸nxÚ¡3\16úãÎ\1eß|ï}z¶L ¿\99¾\1cÅx\9aN6Yta¤ëå@{á\8f4jÍ%\8bç\82uL\11íB\¬Q\8chM·h°\7f\1dä_\82X~\19ߣ]ÿÓ=¹Ö\fÝ\1d\19äh<C9û\12Û©Ýæ®\89\v¦ä(\e ûW\82]\1acõ4nZñ®Q'Ã`\84>\99g\v\12\82Í[\8cü     |a(VعÛ\92k;
+õîÃø¤ù+E\80ÃüÉ\8dB¿ÕÕG£\13ª<&\ 5#wI    áÁUJÕ\9d\14í\12ή\98]\14 \9avóôBpÜàxKoÖ\97\ 6¥\9a\86ûw,ý\81ðî\ 1íYbî\83\ 5\18\ eåXs\1c½³÷\8ai|ä~\v\83ût½$ëë;Ú\8dz¸ZÅñ\9e\8e\e\ 1ô\r\97¹î}á\8b\ 1\1d͸v½\ e\1f\83W[÷ÇöÉDèÏ*Û\8dÙ1/\92¤o¬v\8ec-\8c»\8d\87Z5\85¹ú\b\ e×ògÒÜ\\ 6õ_\90v\f\81jù-`\95-fðÇÇ¡,j\87Üzzµ]rFwå>´6I+\17\8fÅ0f?\1d¼m uË|Y¾W\15Z\8d¦]¯Ñ\96ê\ 4\9ba÷Ñ\ 6\ 2ºCD¦\9fµ\86I\85\87Aí·vÂ\96¦ñ$zn\86ûn\81ýð`¼\19;~<H±VÆM' "\\ eN)«T\ 1Î\99eïbö¾q\rQU¹5+\a\19¥\84å \vý"ÕÀ\11+R\1aVüK\13o©«\96\8dECÎM­öO\ 3º9¤t\15T»»÷à\90v\15\1dñ\16Ç\0;\r\98tzyÁܧ\f\99\9eE\86LdÇy¹s³\15ÑÙèõ\86\8f|v¯Ö¸sOlh±kØÓmA\ 2\15|¦ÇÍ'ÚÍá­Ü\93ÿÒü\16\16æ诵7~Bµ\ 5}èo\9eÞVÞL\82IH¼pø>\8f\9c,ph\97Ƽ¬¹ú\1c[ÀÍnè FÁI¯\9dß_Vg4óTÉo\ 3îò·âBÌÚW#x©ë\9dSI\1ey.ð{ÞQüÜZsgö\93\ 1·ouC²\9dÙ¬ªß4ÓWÌË\88\9cü\95J\92 ~z\81J¾?ë\81lçiïD\1eWZ\87\1c>\13nÚ¥ÛÙ\99¨évTãý£»ò èQ\e\99\8d¿\\99:Ⱦ¥à\8fíMÛ?\1c{x=\9f+ÿk\ 4Ð\98Ö)T\98\85U#1l]2\8aѳ\e.±'\8aØõFh|\12fﶰ»¡_\85qh\9c×p2\16\8c7!hûÅÂX\ 4çY\9e \ 2Û;Ï\96\82ñdZÇØ\17ÏB{q]\17M±×ûßs\8büt)\1e¨\7?ãu:\99g'K\81óàÏ\1aÝðÙ°ùðaæËtº\16×Ì?iÇ÷·$ÞSºV\87È^aµßP\90ÑPP-º7Þ:éáùE¢\9f\14&ee\94       Ä^`\aÑÿ­\97m¨þÊÎ\93ç¹·7\8e=à»ëNt¾Oäöî<<\83ªvèx±Ýl4Û³\f³Æ\81aOàyÔTjYkîj\9f\918°¯«?Æ\13\17\e§ÿÀü$«ü\rI¢¸_Ù}ÿp\v\9c³ó\8b7È®_"\80\15§SgÊúª\87ÃA©FÏF0³\1c\bý§|ð\8cçÕÍøK0êíªgÆy®\91{$ñãUûÂ\92\85öE¯½ë¨MaøEsø|6\1d¯\97p_©\1aÜ%xï*¿t÷ Ö?v\19¯\ 2bïÃÝü\ 43J\80\1aìV%ä\1eÀÅÓ
+¹=&o\9b\14\10Þþ\14¦#}j\16\90x­¥µá\ ej(\ 2Kâi¨ô÷Xú^ùBogCGï\1dÿU£2\ 4zíûÁý}\8d3\103ƽ׻qÓú¢\17\10Ö¿G:\19mïóýe\e)qe\8fi\96{Ê"àÖx5~vWz\1fªßÕ\91ñ·ÔF\12/\18í\80¸w\9fLÒ×ï\Ý0¹Lêmsn\16èqÑüí\93ÛþV\82\f¶ôLÑ/èø£\89f[³;Áþnô@²Ò\19\9bb8°çEc~»        \86¼u@»ñ`\a¦¨\e3E\1c\17ÐÙêQ¹YçÖ\94SÕ²}\ e\8e\ 1\9eiÊy2Q\8b#\16±ú¡÷_\0ئ\1fµ.øú6\vòÍ·q¨ôç\eÇiTÝ°©ã\8a\ 6À5_­Ó½cfåH\ 5A\r\ 1Z}²±ÝÐÁµD=Êì\83Û
+ ÷\98@?­®.º»\v++!7\9cl.\96ütÖ¶~\1aÐA3ÞáJÔ'\83`Ò¼Ô<½Õ\87ÕÉ\84Z*l]Ý9§Â½«=ÏVÔ­/dÙFaäfèß÷µ\8eåN\92(Éì$Ï\1aÈ$;Ç\95BTÙ]îÊþµjXCuõöç¨îj\95«ü«\14²ÚÒ#\9\90þt\93¡\8ahZÐ]0XU\béÊÈÁäóþ\1a\1dDåïÏéùïU«\17Ó¶c¨ØM¼ËKjL\ 6=Ì{k~ÿ¨vÖàÕu\vµ=kÀ3|¿.\9e¥Ú¸\91¬\7f\1eZ¦iõ\9c\1e\99ÛyØSä>ËX\rùº\8e\17ËõT\1d\17R\8c­\1cùÀ¿Hó\87\8e\ e¡;j:ðζ>ÞG\8a\93\1aùu\82ÆeB\81ÎR\1eûxä\9b§q'?è7W9\8eTCæÜ×o<.æ -Öz3\8bíøE~îY\84ÚÔ\1fìÒYZã\89*/ø ÿ¾ý\82\9aF\b[WÎâ\17ù,F·«yD{\1dõõÙ\ 1\13é³\14síO\8a:z\88ø/X_D(mÊEcê<çzÊ\92\9fÿ5\82J:Ò\19eV3*ð¸å½\96\ 1ª/«4n\80*>\96«àoaPï\2K8Öèô\95çÃxpoÏ\\9daùK\96·\ 5K1\87\ f\9d]³T²R\87u«Í\ fÿô]mT1\91ý78\96\1f\802Ä5å0\12g­ÍÏù]6kùs\82V\1e2f>\ f\ 3AK\16\1dzÔKɦÓÝ\86s\1d6Ö¢W\8f\99ß²óÚM\9f\ eú¹¤f  \ 5f¢¸1\94\8f¯\93÷Ý+²Þ\84;1¹B«5OµøÇÖüûü\ ek`÷,Ä{ÉÝy¶Ü:êUñu7\94Á\95tëP­¤/w¸×¿\8e¬\9e=Öª¤\91\ 2<i]\1aÎ\19ü=â\99z½PæÐ(\97ÿ"4_D\9aEÖÏ.£I» ñ~SzÓ¶\7f2àâa\89\9c½¿Õ~¦?i×&³\9c¬Ø[£â\9a\85Z\ 3\9f\9c\97\89ô¢­>ç\7fï¸Õ\ eÌx\11\9aßhÖô]2j\85Ÿ\fëLÚÑú._xzhûûü©\90T[KMù\80\9bûþ\15½TkVl\fná©\9a¿¶çL+Ï­æ÷õ\13Y\12~V\92\12]Q\15\vV\b-5_O}\99&U¹!¹\82á5\8c\85åÕg\81yF&izø¨ùDA£É\ao\ f\16»XÕ°\13\ 1ëâ>þI\81%q\ 4\93zq£;}²E\8d\82þ´\88\19å}¿Þ\1aQ\ 3Þ\ e\0\96\94Ârß2m¥á}½ÅlÐò\1cx¹¤ÔN\83¨[\19\94uÄÊ\8bÐ5-D\8aVÌýd\9c\88        Ð÷Ç{fÍHö\97U\9fØë|ªe]¹jõ{´\15&ÓS¬·\1f\vÍ"ØÅIÛñîP_F£\9eE@£1½ë\19\89¡;+ËbéîE}Ö®ÉF÷Ô<\14ÂM¶ÅTÜ\9c\vëÜ\?Î'[?¦\8e9N\8b?\9ffn\8bÑ]p©\13oÎÉÆÁ¼#Ì\9cX\9dPÈÜçzÕ"\ 6ät<õ?-û°M"St¦A°\9dOÏ6iO\86¦\fM\8e\1ab.\18\90\8cé¡Ù\93\96\9a«\ 3¨9\98jn®ùÏÖ\9e¿þ4K\9b\12¤YDè4}ûöÖã+\19l\96´â\ 5\f¯{Å\85·1g6ïhÌ¿Æ]ç·\b¸dÊÄnMØñ¤\v\86§wßÜ\vT2zO:×ðÝ5«ÆtÊm\82\ 6\aÝ2K\1akóõ³4Õ\1f\95\18O%Ö5³ØÅ9º\98\9fþ\1c/\98uLùÍi­Zë\82\ 3¡\m\eV©<I\85+AÅ\97'\ 3\f{\9dy N]:¡Õ\1eÿ\19ÃRóÀ»ï3ç½·#É,È\83\vÑW)ÔéÉkÿ\7f\93Å_Ç\1fÙ\82\19ç\1f·{0\98\90éùQ\85ðÓÆíV1D\8b\84ÔzZ\17Ã7ûZ\19\83ñ£NÍÜ\83àMmªü%\85Q¿Uܳ\92]¹N\12\ 3=\14Åä{ÈKÃn¿²0069Z\83QüS\83K\9d\9bÑ68©ÍðXo§\84\83|P5æ*S$`¿â¸î7\12\98|¬ö\aÂ|\1cÉÔÑ\86\1dv\99Î<é{·\8a\1dÖ¶ö\b@\9e\9c®\8e ýÔ\86\10|Oá\9d\9dª\17µÙ\bÄ_KøA\ eëº\\18ÓGçéàý§\16\93Õ6®\ 5×ÃÙöÑ]Ã\1c\95¢¡Þ¦Å:øl¬\17çÒJ_¿\84\8d\10ØÕ[\8aGR91\96íù\ 1@\87¡\93¯®_«om×-[iÖÆî¢L.Ì\8e[\13ÿó\9b,Åä\ 3û9\99\ 2A\1f\81$$Jo¯\ fçf\0\ 2\11\14Ï«6¢½êÀ<¼÷ªÝ\93R"²%¼
+\8e\93ó\1eL\9087ÿ¶!\ 2\8f\ 2äÙŹÚÞ\9eZ\1f\873¬ó%éàâYú\15\88\ f\ 3k\bAµ¼\ 6\1fI÷©ûE\90\84\97¥[\9eì\11·pü\9c@\13å\162ÅÔ;öû\8cXÖj·Fzveã\837P`ëKH?\88|*hÖÖÞt@rµ\8aá9hÒA³Ò\97@mÀv~\1eZMo[Ï÷ò®5ª\91}6¯(cç~"«\96\868¦ÔÉ/\83p\15\8b­½\9e\99'\18j<ü\12WЬ¾Ê\8e\8d>ôpp\96\a\9f\bÒ6\99E¾Þï\98\16\82^Ç6%\17É\eÈÿQ\92\830DÄ\99\ f@p\94E@Ø/<Ôqv\90\12nM\8amV\7f3Ö%\ 2u¶gÑGrÏÒÒ\94ð\13P¹Z\rµ\ 4ðê¡"9^s5·j·á.#½þeHöî\9c\7fù\0TÿüFI²ú¸\ e,¶Q[K\862êD¡?*Xå=Õè\95\92ÛÍû4aÌ|»c\13\11¸Äµ¡Ö>÷#á\ 4û\9e6 ä5\9e6<vÉm´MÑê)¯´RvIÊY0ú:/}éÃ-s Cí÷Ð0\81l5ôåç\88Û\7fÌ3\8c·\95bY}îÍoä¡P
+xwì\8b\93\Æv%\8c,\89ê­Nè̤:v\18ªBwq\81\ 5\ 6\8a\14êvw¾\13á/;\9e\9a\94J\f½|\90Ó~Q\9e\8aN\7f\8cÀuäSQ£\10¶hÜ\1fÁÍ1g\10ÊTÉÏÆÄtÑ·M>\18cØ¥[7\83¸ \ 2ð.\8eãÎ*\f\80ÌÞ¯î°`\1e¬Ûù¹\aÕ˸á$fý$<hõb-\9f\92d\ f\10TéÜÏ\93_ýÆr&ä\ 6Ìì\92     Ï>RfQå\8eá\1e½\85éIë¥êL\e\eÌY;ìC\9d\92\0¶O1£Û\9bçqÙ\9f´¹\91]\16F\17p{\94\17X-W,\80>JGPoW¸hZhYþ&£r·\9cп*®¥4/\82ç4ó­S\9a\aO\ 1ì=Ím\80\9edCWÐí\8c\13<²G\7f³;`ÐÕ\0^²×äk£Ã¹+þý¤N\88í%\8cOôÍalÚP{\86ü}µã*oóï¿g_|w3wt1\7fã
\11ø{ûSÈIÛ\1fÉ\ fk\83GhÄíM7­\f\1cÆ\19×££Uìkh´\84Ï\ 5;W¼\95\0?Çã =.z`]\1f²\1d\9b⧮'\8frPjÐ\12¼Ú\9dl0\1aê\e·\1eìÏn\9el\7fí<\19µ-\f\9c\97\94\a\9aFqû\90+vÙÞaýæ\1c\89ý7˨à\v±ÛíËáL9É\11ýÆGÃ+ù\a«?\92+î^\f\93êô`t\97 ®ôÐ3ã¿&Ö\84»7\19Jµ«BÑ£\87à\97³!½ã¬¯Ý\16ÜÕñÄé ùÐ\96\17c*½^Q½Ò\10l\0\9e\1fí\8fØÒ\81ì\96ϲ%ÿAÚ\9c\8e'Þ²»\1fÓe¨\89ê\11ÞaÜZ«\9e´K\9brj¤ÜìfsHSóM³\80\e½ûà\97¹\rv½××\89N\ f\7f\86ide\1f«É:\175
+\7fÆÒ%ÊnÔ\1a/H~þî\99\18Ù÷zg\ 1WñÃÎ\h½8ì\94î\14øHôÈ\1a\81\19î§e})ÿ%×½eTö\17¯ì=\19j~\17Úÿg<\98JÃ1\95?\80¾>\9b»E<¨"8¨áÔûl^\13§\9fWoA\9d\12O:·HS;Ë\99é\17\19\87Û\1f\19<\11\1fsÞÏr\95\ f\ 3Ðùöjk²\a·\88ÆÔJ\1a\92\11$\97î¯L\ 4|Ø{z\145Âü¿Æ¶,%ÚIsëøxë\9a«w\85²\89pa\9f!ia¿Ëh\88ÞC`\81TZï\80\15\11\8a\97zí$¤å\8b䧢\86ë\ 5\ 5ºû\93$\1c\83Úa/ôåã>ûÙïn\1c碦dy;Â\9c\96߬Ú\95`\97ÁÄûâ\80îí·\9c³ÂoA¯\19\17£Ù5"¼ÁÁ\89$æïóþ\ 2+¬àÖõ#Nõ*hÇké­£\9d\95\9a*z\89¬®½øM\96\90<N{Ò\15þM}gUîºõùw\85Ófüv\1e;\95ÛÆ\9dNô1\9bßøm\90¼ö\8c\e\80¸ÑEÕ\1d×ß\ f°£\81\ 6÷¦ü\1f\98µknj\81·j<;9){wµ\10÷y¹-d×\1e©,\v\e,lT\95ßCë\15bn§Aç!ðf­Å£u,U$}\9eÃW§-=i{Æ{+UO\8aÅä\ fv\19eù'»Zs\91\85á~\aÍ\19â\1aLµg^\1cúþ$¸ã\9b,\9aê/ü\90ºM¯<kÊÍúÇ$aç\97 N¦\8aØ7\ 6\13:Ò_\9fô\1ey²&\88·Ä1z=ã/`\97Ƴ{@xÍ\98¹AË+¥n¿uñ\98±ÉQ\95\8d\1d\97FU[1²\8aE,\11"&©R®H¾>ýÒ\r¥\eV\1d\ 2î?óêo\1f\84ùù\8b\89k©øD­î­â5\83\1d¿iJÍPB~\r\1dæ0~\ 1\976(á\eã)ÝðÃ}\9b~        ¥D\1f\80)\16LýÁ¥\1ewóêk\ eð]ä¸F5\90\8e\±æcB¶\91Îì¿âX\95í¶ÜKÿ¾\89r\92í)\95\8aÝpn­;\17\0üæõÇ:mØçemïõ_¥\bO#@\81sE\9f;õ)B5'¢l[\87Íh\1c\9bgýd\14\8cK÷\8bU#ä³ý\91_\18åÔ+B\95\1f)ôÛË-Õ\ 5×ÃÛ17;Òù\7dëÑJ\ 3p}\14y°7Ë\f8\14\15'\92ç\7fý\88jc@>:`\18\ 4q\9e\ 5ÕõêÕ·   °ðÀ\f=¹wÌ\vðo\\85\1c\9d\9cFöÒ\8b\ eÍõ\81ùÉé\ 2áý8Å\ 4d/õã¬FÇNµ\9e\87å;úàÃ\87´     ^ÏgêíÃʤ+P\8dÔ\13Ç\rÚ\99\8c.á÷Jⶽ>\f{ ]ð\92Y;o\1d\89Û9á@w1kXU¥@\96ìĻȿ\91_jO\9f\87j?+ÄaÔ]Ý0r5µµýDõ<\81à\8c/\14\ fÛÆ\84Q\ e\83NkÑU\85rÞWíÝ0J½ÙRa§×ÆY£ÛÛr4®\96\1eä#\ 2¸NÝ\9a\ 3?yÔ4d÷\90G\86Ý\7fý
++\ eßj\9aÆÅ¿¡ºÁ­ê\99ÝýtE\10.\}êæD<{UÇÔ|w \8d¶Öé\ 4\9báÍÅzº¼6ö[4v\87\r
+}\ 6½\87\ 4\9f\yN$µ±µx3Ò\ 4/\99\17¿dßÙM~û\87LïÚ®\867ïF\91G6\8eÌáyPñî\9fK\19yä˧y3Óà\e.cÛ\18vJ+°ï\10ót>É\ e"áÊ% 0\ f$.\1c{\ 5*d¾\fê5Þ±\ 1<(×°®5~YC[Ì\h4ùõ\v4±îŶ´\rÔÈÖ\93\v¦\\ 2Æw"&)&\90\82àlß4Gö\94_Ða\7f´?\93Ë\'Áe¹_zr!nµJ­?\f@1kØ\8an"\86Ù\1aÈ~#ùÃÓnzh\8a\95%¾sO_\1fó+á\ 1u{¡Ôéüîøª¶÷óD©|/&·ì\1e¯v\9c\89iYMÎýl@©¾jd\8axs\94¥q\e\ 5bܦâÉ>~°­ýT÷\12ïJ\ 6\17a< \87\8bÖÔÙ\85òØ+ÄÉ»U\9b\fÁÿsÓÛ\1a6<5p\83ç¡I\fo,7yn\9b\eás¡\va}Ní"¨¿\eSܺayËæ¡àSäf\89u+¬è¸@\v\1dõüÐ\9b\r\81
+\17åñ@=\ÅÏ\81\91ä\8e²å\a©ôú\15VèWsÇ( R>¥Èñ*ãïî\8eT_Çñ%¤\88¤\fÏÎǽ>¥Mà6\8fTI\95\ 5ö­<Ĥ<<     |\81³'û\MVçuæÖJÝ®¹n\rµ\80Ôõh'\ 6\13t˱\15}\11?\7fãØÞöX\ 2\90äY\15³M£ê¸8.oÄG\17Cu´ñ.æ»BQ¦_Ü©£G\8c\87\16ò\89
+ÆV\8c\1e\ 2/\ 2\93nVá׳ögÂýiÝ1\9d\9fêÚáÎ\99\8d¡ü\19\96¸Ò\82\93\vý\1fä0ÿ.;(\1d¦ì¢«\99gÏÄÛ\9e\11ý\99\13Ni\98>\ e\19\1e"/ÆÐèѱ­\92Ð\93Fík\a\16\1cX7í~Ê\8bqyJ\1f\9eþÎ\8a\10u\e;wy@T\14I¶Ôh6ó·bçW,Fà?\1e²\ 4~ü²?\8dáU%Ô\1eä4ÍGaÀQ/\82c\9b\9c\17þ\92|\84r©+\1dä3\98ΪÕP\16ö\ 1ú~\9eú\0éõ×nÞ&eèÚ¦\aÖ\17\89\86ÃQ9áÄõrUt\ 3î¿dk¦ík\ fzGÍ\9a\8eú\1a·£\97ß=\13UëÏ°ùD×ý~y|DºqÿËsÛ\8f·ý[1 "$´ò\9f*½È/{çý½\12úÏs´Ñ#±Ñ?§+þ!=ç±\93®Á\8bû\ 2¯?âÿ¼§mâ\ eäRÜ\ 5n\96\ 3S\ 1Í
+/\r¥Ý\8b\10·åð\10Ü\8b\ 3++³Ø\8eÞI\8b\9ewC\ 6rä¿Ã\1aQ\83Ô²sÿ\86\bﵪ\99\b\10»\8e\95¯¶Z{R+ùV;Ku
+©*y¿ö+¬dø=6d\97LjêBM\ 2K@-\¹«hQ;%G\9fe\9c}EÓ\82qÁh©Û+:ÜL4\83\8a\83\8dLW
+ÅñuXy«·\ 5\f)ATXú\16V¸i\ 3\8b\11Ô\15\!e;\95>ºY\13~\18Z¯A\13»3\G\ 5C6â·1ªÞÍ%Y\9a\ 1³X\89     \99í\82qÊ(\8bÔ,åôCÉ\86\lfhïe"N=W?hçȬ\ eæÎä/\84§;] ¡ZýÞ0Ó5´\95ÊÎÆ\1cm<?ù\7f<\8f3Z6ÕãÙ\vÿ\16/`mЦrª\eUi\7f\18\91 xb¦\9a¤A¯\ emÔÞ\96;\18>\8cög\7f\18 y\v\r$R?\99[       \r­ß®}Æ\ 6ò|ì\18Æ^éÝ\1dÆJ¿ðý³ø_Xé=Þ¢ÝJäH/ØÓ\ 5ÚÁ8ÞÚ*SZl=ê\87áuÕ\11C\14E~ËݸÔ\9dytɧ\1f]AAÛ'R"üçÈÕû*P\8frh\92ï\15\7f´Í#<ÐwJÉ\9e«Á¾\90
+wü§¥úu¢Á!\ ee\v\89nñv+CËWÑÀÒ        Ä/*W\16\93¥Ú?Y5Ö]¼U^K© \8d6Î[\18¬"¨(d_£\18òÒº\93\15HðQã\\84K×ñÕ\1c\9bò8W5q9mýÇÐyvî©Öäë~\17A´r\9b6ßÔ\83B÷9/1µÁx\ 1»\17±\8b­¤¸©tÉAiçw¤ÉG2ôùj\95%U½k(²S+÷\83¢m\a\ 5>d5þtÒÐ\126îÙ`\ 64-&\9f¿©\88\81Ú84¤ôÁOuòÌ:Î\ e5M¥vÇÏú\15ZvÄh\18«jØM0c`\86\1f\12\94_%½WÏss\18\9dÀT\83ª²
+_\17¬Ö»wÑH-Îiõóûß"\1c®u]\12kÚÞa\7f\9d)ú&\12½>õ=\95úêØ+\1a«6ɵ2¿;3^ÅÚJíV\vµ<8îBÃ^û\86Vÿ+o\9cZÁ²\8di\)kw¼ó\10KÅÎÕ,B\9f\8f~\19¿*$2¬îMÁ9oÌæmnNÌîø'l\ 6\12묨H6\17Cc<3\ 1~ä¶Ú\1fÙ<iãKûd\1d¾\17¥\97Üw\9dÞÖ%Õr\ 3hj`*\j\ 1\80\96~F\15buèe©,¹.£g\88Ú\8aó\92MîðÐa@Y×`Eù\892\bêüx²¹s\11ÒéH4\88\13´\10@\7fÊ\1f\8cÉ«ô\1egÉÊ\v\9eÒ\8bT¸É¸\18\fÿ6K_!Ö\8cÚ×Gg­L÷\14wyhÖ5µAÞiù1^:\r\rÑôe5ªµ$\97üÒÞáó7G ûãñ%}\95ßd\¾esÅ\9d\82\ 6Hà°\10lVã¦\1aÁ¶Ã?¿<Ú\ 3©*k\87\89×&r_Þ9ÅÆßÃ\90'3g\f-ò}\ eo7¢¼\aÃrÐDØg¢\16ï\94²­×Þªo\80_÷Cht7k­\88ë=ºÁ\8e¾Tµ\ 6£º\9eàI\8bá\1a\12x!ï/Â'l2\rkµÆÀCâ\9a\ 2çõ\1dh!|%yi\7f¨\8aI¨ÍÇs±\15Ò\95ůöq¿\13f\r\9a¹\ 2¯Ö\8döêök\1c\e\9a\9e`\88\83U]1»È¢è3Å\8a$\93¦;5µú6U\9bÓî@\99ÌûÀ\1c½-\96\9a^ÜXc²-dU3\86CvÉ\886\982¹3<o·J°Òß^í\1cGkce#¿æ;e­µÜÿ\ 6mVË.ÎÃÝp¬ÃE\914\8ds%%
+\0>\1aÝiÖ²j½;?Xlß\eýÀqºQ?\13\98\97\f\93¯\1d`¯³¡b\82 x¥\806|i¾7öÏF\99b·ÎÍø̨\95©®Ûud¾®ëÿq\1a\86nt¹xìÄüc{·Ö]¡­/oï\9b¹`hØòw\14cà½i\91K¼ch  Wç`¬GÚ\ e_\84DËj?ÍÄ\8cÛ;/¿=¯3ç\14Ì«:â\ 6'w\89\ 3Ù\81}«®GäÿõÇ_âØ\83l\16Ø]£\95\9b\91\1a³/Ïh²Æ½P\8a\90\91\1f^¬(\15æZä4\ eQ\9aª\e¿«\86\v½t\9c\15ͪ°m»_. ê¾ÙÌ8Øí%\8e¾.ÛFo\97-q\9f\9a"à&Ø¿só¥S|)g\9e\7fÕh»\0°æî\88\83ÛzBhð)Ã\88^xÄ\vY|ª\94÷x\10\9c>\94ÖioP\83O_$æõ\f¿ß~#Ù\1d\8e\81z\rH­¶7^\11¼ fI(\94\9f\9a\17\9cfF\14Ï\7féîð=\88Gzcl>ØU×Öý\1e<°ô[?×p\85\18Ý\1c¾\89ñÆ[,ÈÙç,\ 5\ 3/jH\1aÚ\ fKÎ2¢/©ß\93\9bZÚf\ eráÑêE¸\}é\±ûè)¢tú\82ºèÏèW»?F\80$&\90ì¿A~\ 3\97\91~\rF\8b1*ñäe\al)\80ôõ¼;\91\8fñþ\ 2º\9bê\8dm¿HIU¹\81\vj\8dã\18Û.\9c\9bN\8cÚoPn6¼ä^R\9b\8aþ9®\ 14\87Nvð·ß©\86¡þ<´uaø\83Ôå4[Ó½\ 2lÍÓ
+Þ]s\81 ûǯw\19\ fÃ&ü!ä·q'Xôû£ù       \8a\83ÙV\ f)(²ÀMõôV+¿\18%³¿±Ä\8e<g\16µ¿Äp\83¹kñ\85÷\0K³Õo*Âl\9eÇ'Ërǽ¤Û\19:\16\9aжUçV\ 5p`@Í\82ѧm¾\9f\1e\9cldUÛGÂ|\1f\8cÍ\97ßѬõ·Çp\vê\95\ eß+á9«\98\81¥9»ßQ\9f½\vG{©©\v3³©_ÚNs·\18g#Ãb`&W¤É°P³\ f\{xú\1atnc¦ü8Y§2Y·ÊwÏ\8b\93Z      ÷v2\9e\98¼\94è\80<3Swu³)³OÌ`\11/U7NpÿÒbYÿ\vº\98ÌÎl¶|ý¿fgxÓ\7f\17Ó?[W:\82Mhñ\{\eøÕ\ f\8e\9b(2+j'ÐþØ\8fêÃ\9635ëô«Ò\7f\ f|ÝeêúÚì³\13\vã+eÌæ\8eÉË\9c\9bµÇ\97\16\84©\18\7fÆEç\9eÖ&\8b~\84\1fìÉ8 Ý\83°}4jþ6X«f±ËÚ\9dOùË8úïÃÎ\14\9a\aþ{%\94        B\8a\89\8cåjxô\fíòLg\87×Ò\98°ß\ 3?Di'Ú¦BÉ\98\19Çn\7füÚ.ü¹\b\af©°úah\8c\\1e÷\ e¸'+Ó](\9d°Lu΢º-y.ÞÙ¢¦\ e¶w¹0]\r\1dõSiò_ê®(n¸òíñàNt0ã\e\9c\88\ 3\7f\0\9f«[\82ñÊ\0\18,\83ÖÜf\ 1\8f\9d\9aÊ\84øûi\r\9fî\14{d\9dÔé\82\9bØ)2yÑ»\8a\97jûê¶\ 1\9e\12¾o\9bë
+l4ÓÆO\8e§\89\ 5þÀ[kçV\ 588S¾\18×\9d\95i·k;\ e,òúÞ!õw-\ eÀŪ\90äÓ\93\7f\r0FÖ?J\80S\1eG\98Z\977¦nc¤S5\8d­Sür!3ÜÌq[\163V~ç^df½Q\13l\84}\8f¶`Z5§ûa\ 3PtfµÅÏni\1e\rM±N_@ç?        \9e·Ñ**ÙL³öË@\19´;î\83ÍßK\0\93ð\çÿ\1eý\ e\18\ 4ðBÒ$\97L\84Xç"9¶¶Û\0\86¹/Ѳ$üu´\19Ò¤m{X^¹j\92\96Àx\9f\87²ùB}Ç 
+\b@°tO£nçõ=\8dÖïn¬\ 5ò´Ûôì5\ 1\82B~¾Qµ+ú %G\81|¸  `q¤býdÌ`¿\9a\9cyðõ(O.ëv#\17\8cê/k*õÏdØ¿#öy!--­RÐaI\1d§\0j<;à\98h\15»   i?\83\8eêÑ\b\ 2ÝXeåF«|
+þ>OË\9an\ f\10\1cÏ=  ñÚ\92
+6×&§IÓ\8eëéÑ"NÞÜÇקcª¢Z\0´|Áè\9e\8d\ãÚêù°6^\9crܽ\ e\ 2Ö\9dt-©±ý\91BR\81¬½ëÑîÀB«~\ 1VÎô\15dèu\10¸öºôýÝ«,ÁýîÇo\13ØG\9cW\12R\1e\8aNѽËᢷebC¥?ÊÆ\89ïD\8eÒ£#¦c\9a·³é¾Å:\a¯jÊÏö\7f\9d[_\1côtõ\8O\95\8fÖq¼fyæ³°\18Ô´Ú¸6q\8eV0"\14Ôatn×\1aÙ\11U\98\92G\19\17Hþ¾\88v32ç\88ÄhËwÓñ¨øl\88<½éëÂ×~ݪ\93U{Á£ð\9b[3*o¸o\1f\17ñ\r¥jÓ\89q=¿\180\1a\b\13GêÞ§ÆËA\97\9e\86é¦*t¾ç\16ê/Jn\97éî\98åÈ,\9aÔÍB\1d\b»CDÇ\91,ÓëL?àÓê÷\9aSýËÉN«õÈK³ø7Sh\124a\82¾êU\\13¦   á\fØ\10\14D\8euØ \13õúØñdM¤cdw\99ù\13íÌ\eº¥\15ý\f\10q8µoç\85í\9c\9dÖ\97*\f,L¹­Ï7§]9¶\9cèÔi0z¹z³ùÚù÷n~FÙ& \fÂ\80;ýÓ\81#Ôþ\9aÛS´³\ 6æÓðʤ´2\8eçÂÛ[\11xîÜ\92\8b#xæ\1fê\9aËêÝÞ0Q·W{~¹:Tµ!°Æø7JL¦\ 6\98h*o]\16Ø\9f\9d\1côßÝ\84y\9cÄ.ÓT %\83m$(Ï\a¹\ 3¯\ 4\98iýA\98\87TµÝx<BüãNu\87ì\9f0\80\9e\18»yvûw@\ eÝ\81;ÝÎ:F2\7f\rã\82Ú\99;QSí\b\94¥*AÞ\bL[Ûä¿°Ö½Ìî-\ fµ\97\14°"\9fE±neb\8fþZ/kD\17\81\85ß®}±\93£väÖȧ´\96\90\82´þ[Ô\83åÅ}ÓKá¾UDΫz§üðÁö\9dGUkÝ÷7çس$è\94Æ;\83Mÿ¯Ø\8d\8b½\19¥\19ja¡\10Í\9a\e\92­±ÁM>ª¢ö\9fó¢/\9b\19Ò\19̦¼\164;%×\1câ£\16zo\1c\8cÒ©µ·mR\15Í3s\b´\1aEOÂAs2\96\80b\97´ñ\10¥üóªÙ§ý\13ùÓ\17ÐU½#{åãy\88­û¤fô;ÅØAèë­Yßw_¦à/óèo\1dâZÙY\91\86}Z×\ 3ö\9d²\9cTÚ´\8dE\90­¼p½J: p\8aÌF\91i}ÿª,µH§f\98~ÿý\ 4\8fWû×da\82acf\8dW\12\1el\e\9a+Õê\ 5Ëòpÿá×\aÅ\15Mÿ\95º\96°A:®\0L\1e\9b\bÁÖêÁ\19oÇÍm©Ùk\8e+\16ÞjÃ!K½-uüjøö\8ceT\7f\f¸ò±|²\eÕÖo\8d«{\7fÌ\95\ e{n|?F\.\1cüp\88Z=ê\84[G9u\81\a´¦ÙÞß\1d\ fO\17« +Ü0q½Ø\ eÝ\8eïB\9eÏ\8dÊtyá\96\1dHz.\9d\ 3£éØp³½\80Ï`~°Q
+\85\9bR\8bþµóX\87\888\aç\14äª\8d=§þª\85Z>\ 1\ 5\10x\81\87>&W×ä×íN\eÍÞ\8e×a"{\v:z\8b\9e\e-pm[8è^\8f±YØSÛÈ\16­¡ÿèI\7fbÞÒ\8aÁ¤Y}y-\11þÝ\ru\15{/Ï!þþ\1cKlN±¸Æ¢\8ehîîà²\99\\9bÆj\90\ 2:l:\99b6vr\8b\1e¯ÅcõKð±ãC`þ\90é@Vù¿,\ûå&1ç\a\9c\8aÖ\ f{\1f
\11\8f\1d½½þüÚG\1d\ e\93!Mõ\NV/a#¹¿;>\1f\97b\1d\94 \8aT\bïñ\95\12ªN\95;\16ü\99æ¾ÍEÕ\9d\8elYÔem\12\86,HQ\8cÃÕl¤Ñß}.=\1c䬾ëf+f+Ëqÿ¢ì\7fý\ 2Ú¤½\ f\82Kg\9d\12Ó\\83ôT¾±^\7f®\1c\90nëµ6¦«ÖÊ\1eâsLCëxIß%D\90\14\8b¼Ï3Ìôl@ü1ú2\16¨Ökï\90\99á®ü«ONvö c\90YK®¦3,¿\7fú\ 2Ð,\b\18s1\17ªÉ\98j/¥Á\94\86Í\87[M#Ë\98¸ý\1c\9c/æyÚØ\ 6\8d\ f\8a\10i^6Í»w}¹ùο _ÈC[åu½c·\ e\8bªzS\97\a»þ.é1½»\9cùzãÖ\ 6#Üÿ¥íÂ\82ÆÝ{\7f\ 6pY!¼\18½Km\ 1ý¤ÖöìØ\ e²7KÐõ>©ZFRL\93/ø>K\16ùÆ\9dí\81áÃ\e ÍûV_yÙ·ÆhåûIùAøÜvj\17£NèÂÔ¹\89hÞß/\9f\ 6\90\ 5¶ï¢®Îo_\9cÖJëXt84\87ܳ|ò½\82\99ä\81«Â\÷òôy'\81\94\85׺Öù6¯é±Ý½WWö\1a\ e¢æ\9f\14»Ök\97£ñÆ9-$å*KÁ\17yf¡Gt\7fÉû¾\84\15Ú^´OÚ~\93íX\84-#\9e3»à3g­à_\1atòÆàÝ\92c\10qå/±Øcoáq\93À\0§ô'\13£¯\9d¤\85)\9b\9bÞ)ëùP\81[ó0j\10ÛUëH:\92VoÔ\7f8Íó¡\1dÔØ\8fÕ§Á¶\8dhØîgw~Ó×\109ÛÎ[\99\ e\13\10Åî\1e5eG\84LÌ0í*vå¤\82ÖMK\8c\7fm\953¸«=ºúý¸¸8
+ª8Ò±»½«_¤¦ç2\\1e\výôÓÔë¢\13\bö;UaWÖö÷Ò(Ī÷3Z\14 \95þ!o¼»¸¨4Ô6k\99I\87åþ\80lôL>]OR]~^+)\b±
+EÊ\1dI?Ô¶íHÙ,yìnNú\ 6\80ó\8e\ f\85Ð\8f­ÁÆÃ\88L*Ü\89öFÅ^Ò\14\9bÞLò\9dG\99µB\8f\8cðþ{\9a½Ãá\19\87{·×)\1a_<®lj\87@\1dl\8fh=9|ÌIÑÿû¾îq\vÒõ¸mUëF'7\89\89Ë»Â\9f\vê\15ù7\\9eÌ"\80P0:U¬U÷\89\85ã&òÆ\1e\ 4ô²üî´ë\81\ 5\89:¼[ªX¨Ú\ 2\1a·¤XB(\aÖ\984=µ&W\86\1d¬rÛ\91\8c{ôì±gòõ¨\ eÀfà1þAà]´u}ý2P ]®ÃÎèK- t24¬ì¸\æßX\10ð¶·\1a»\81\8eb     \8e)\1d
+\12\8c®£IÛc\88\8eÓâ÷±\84¦Í<"ΫÔ\8c\1d<\9d¬\ 5ðu>k»r>\9f%w¯9þRѲÔÔg¿v\1e\86K\85\89§\e\1e\1fÙ\94ú _m×töÌ[öuæ5B1DqmÎ\13\a\8eØ\9eûÐ|N³àOA\a\92\91Á[\Bb¥\98\93òQÊ<\97\94¬\92´\9f\9f\8f*\19\80\86ø
+\81¢äÓè\87¡µ¹\ 3\11×{ÚpÖ\9f\19áKSf\85Áª"\7f¡%-ñÄ}\10­+÷¡2°\8b|\82\ 1Ð7Â#Rw»PRµ\ 5*ôÓNõ£WÏ~¬\13»Æ\12\ f/#\16÷\a\1d\9aù\vÑ\7f& #D¡)éË'êh
+eëYuÕTjwò\8bëvµ\9e\81Ù¾¯\9e\19úC\82+E\1a'á35\8a\8aR\99\9cìóÀê\88¯\9dð\8ei1\C@¶ªÌ¼.M´\18ÑK*\14\9b/Ýo*.à\7f\1a]ý&Ö¬\9b÷R¡¥E6·h\9d\12qi^G Ä[mü\9eÝÖ\vÜ\81;\9dµÈZÒ\9fí\8e\18É\16\89(·¨ %Ìxÿ\0\ 6µª£b"\96\93í÷\1f\98îH\ f\1a\b9~@ðÕÿz\89\9f¥ñoRX\a÷\81\10y
+\18øâ¾u©j¬|ËÝ"%\8cå}K^Ñ\13\8eNíDb¶ZCe¥Ö\92\80ª x=ò\\8aùj\86£Ö5ú«Ô}Á×Ú\108\9d:ªÿQ\16\15ÉF6u\81Ü¿\7f\18Ú½½°\952\8e \vñò¡¦=õ·\13\9d¸Gò\98\8f»PÖ\14½
+ÏJù.\10\13ûhq \92\15\9bSw÷É.Øî\97\8aÌÓ\ 3\8f\96Þ«½WT]G]Ò\98ß\1aM\96Kp\86Ø\84kö´ß@Yº%\1f\83<\91Õ\93Pí¨3 \97×Ç\84\´+R9\e\88ü¥\8aM\83]Wa\15\9eû´\89Õk1w[[0Õ\vÓ\a<bñò\8b\7fMÆuUh¶\eþõª`â1\85\8fZ?\9a\16Õ\940my "¿Â\8aήÆ'º\89\94 5jÈ?Q\8bù¼Õ>S{ýÖØ×\95òn\88&\97æJ\92\ fz\92ªpóý\0\95¶³TË+,ÐðÍIäãLii}Ä\10t}\9bp\84\ 4'G}vyEfñO-\rå¦ù+EhÊúàÊ7\8cÛøp%UôRþg«5èÍ+\1f6\83ô|UÄ5¾èÛÔD&1C°þ0ý\80?¶­ú`å\99ä\98c¥ì|\12ãÓÕòÍp¢[ß\8f\1aÄ\16Ájª\19\9d\8a¼\8a{\9b_\8d\80/ZUÑ\1cØn¦\8dCvC4\9a\19c.?Ã\93\ 1Àø4Ð$do\ f¡KOZl\97=\8f(o&6\8c>\96J\8dîô\95\18à\9fÊ\89\1a\ 2Õÿ\93\9a È\96F:]¾lZ%ÁÏ,\89}ýº»Åd²<ÅUéuóÈ \82É\85ý#7-!     ÝÊi£*Ú6ßsözÒ³\8fûOW\83¤"\89\9f\87Ü\ 6ÄB®\18\8dì¯\90/ÞÅå\97\89ø.5h7|\1cÇAsCßeQ+Oå%ªý\8e§×ï\97\87ÊÇ\9f\ 5T¡PM\1c\15ß\ 4Ú9"\8fÈëìWA\7f\b/mÓ\8d|wOÄ\93\19\1dKr\1dµ\8d÷¨+\87tu;\96¯aÅä Û\89ö6d\87P'7ÅÆgÇ\1dî4\87\ 5\9bË_3l.\97ôk>|ò\15ÑfÅØmÍL)ÙÖ\83­tuÿ>²Ø\8f\8dp¸»áJ,þñ½ùo\11»1[\93ZÒØ\1d\91ûÅ\e\80\ fuTu\ 5dXèWö¬p°Ù\92\92\86\ 1ªÄF\1aÙÁ\7feXe`%ì¼â\8c\15ï¥\8cÍÚÂëáøè h\83wò´Je\9eM7       ·\96®éù©Ý\fÔrú8Í(Ä°\8cëÎ\9a«JÇ âªà5 \f\92\8eà^§]Ó´K\8a\9cÍæÍ\9d#\fuù/Ð\149R¦^nÕg°    bOcþ µ\16\acSß\8f¤©^rk5\9dc\ 4\98¥ð¡¬¯\93ÊÍètu\1a/î¢\831úû\ 4¦Æ¸\93ä\1dohãZÓÛê\0\1fǶý\8eïf#x2¿Ñë_\ 3\8cÔéÑ¡Ùó*O]\b*¯îåçâ@_æ\f\9b'_\b-\ 4=s¹[M\95)úÂüWµ\8e\81Iw&¨A#Fõ:Ý\e\ 2Fܹ\9aYö6Ì*\13\96s\17=Òg#lûâ÷\96Ós\7fµ5ã½\81\92\84¸\98uwÉF=eÖy\96Á\16¿6\9d\e:FÔ\94ÄLq<\17eûVl\16¿6\9fÕ»\91ð8\82Ë`Ç\18¥\8d\9f"½wlZóù\10\95o¯2â\v=Îó?\19\0Ê>\17\a\9a÷¶\7f¥oO¿ÌÇê\81+@\8cì\14çÎ\1eb×z=í2ØH\e.íúcÍ\1aù~\14Å\8b÷c\17\e(\ e+ÍÎä\bX}\87\846\8b\9fÔ
+svÅÞ'M}ê\88      Z§"g]>Ý>ÜB\1f{ê£Oòs6H¯xß\ 2ëf\17e#òW~!û<ÒB¶^+R©»ÖZ\8d!\euªÄUU\9eÄ\9aixªæ\8b\ 5   h«:QÁü\81]t¸hs1´J_\8c\1a$\7fá×ùÕ3_~´°DØY\89ÓRë'c`\95B(\14Ò{êÉ^Ü&,tR\9aw¦.\e¨îCÀ,c×I`'kµõ§\83íÌ®ù^¹¡Û?Éü\94\9c\99Â\89÷Uzìô\95á+4Ì\0cv}µZýÓ*\ 3Û3O¥Xl\9fèúÏ\vè9>^Yâç¾
+MÝwTë\1fIW¡öª\12\ 3\9f¥^Z\1c
+\14wY\9cºýuwáýo{î\13ð±\9bMf\92\a¾;Ñ·goÎ\97S[ª¿ªîí~\18¨ÍÝ\13u\903ÌxÌ\11º1öÜcÜêi3ð\96\83ô\89¤Ù,÷0]\188/ýÓ
+÷5×w=O(»\8c7øM\833g\85ï?¯NPÝíæWQ(\9b\92åAÕZâ5Å¡A,³\ eá\81â[ò\8e'\84O\17ç~ɯB"åôØwê\95±Å\18Ü[®à|Äð¦ô[}\v\8c.lðõ\87ë\84ÁŸ\aìÄùÕo<RµÞH7\1dä\80`v\ 5§Tx3!\99¦z\18A\9f¹c|\16\17\13º\1cÎÁjÁß\9dó¦<á\87ÃïÛ\7f±ôÕMê\ f\81èßÜ/êSò\85ç¶ÞxJ®>×$øÌ8û*Ã\9e\e|©ûÏÒT17\1c±_f\14<?\ fÃ\±3ç)í^­÷îZ\rÒfcån<÷\8dô;/\bäI)¶­Æn\16¬kb1Ó~ó\8b\8fú¤fLÍG\9e\ 4'(t´\ 64àå^«\1f\85Ó\9cpÑJöë[#\92\0ï\ 5æ³'{ø9©&WR\ôfyïd»\ 31sQæ}ê\84Ò½f_À.\94Ï\ 3å\90¼Âèí¤KdÔZûe&\12û\84â\86"\83!\83Ï\11õÓ\81¢\aß\a\10øLT\9f«³÷?ÉH@|è\95>\81ص\9e\9a\7f$§ûv0\1cLM |¡_da'|¶y­íñßÓñ\15\10Ãѵ\80äº}ß\94ý­ÚlØ\87B³bì\83õÉ÷\ eÅ\9dt\1fÂk\8b¼d#\9f¢ð\13ý´¸\9fAÛóãjä\97·»5|P³\95\9bn\8d\96/\vN\r\8cc\1f²\92túõ´\19(ë8¿iØö&;\80ã\16¶ÛÄûÄ:úE\99\83?®;Á\87ë$rýï\81\83¹\13ÂQ;'WÎ\8c#\110ªü[â`\93¢UwÑñÜ\ 4^9ó$O\1a\8c\14ê@s»\az>sú^\95ëî\80á\17\8bð³ÈdÞÀÐ\fÐ2Ö\1e¨\ 4´\ fÄQ£\r q\81Ö\86è*\ 6ÌEú\80\82ìÙܽ]\8b\0®Öþ)\88+=^Â{\95â\ 64G\8d\ 1`\v»Eø7¬^\83ˤtô¶ÕöÖ\9auÆÛÀÚ+wo²®é\12$ÊÀßÊï\8d7ÛÊ\v:\9d7û>Þ\87)ï6r\12¤H
+.ð»Ç¢\17\15\85µ×=\10ÿö\14\16:[³c\96ÕZl:\ro/7ô\8c³Zçú\82Û\væGbè%n&àñ=\13|\7f¿\86½{}Þ     esXLÏg¸ä1ï\96lI\99Á$^\ 2\a\1eVÝóâ*½n£å*ýx\)û­F¦Í]¨\87\ 5e|÷\92õz\8d\86à#¥\vïAf\a÷\ 4[\90;&WϾ\84\9aܪ\8fÓä\9e\8e\ fÆÍÏ\1eÌ\19G\ 2\8a\1e³âÞ£ÿT\80û´\8d\aÉÆ°¼É¥ú\8d&ö¤¨\8c{î/HGï\99Ò4\ e`\89jñ_%\8c\1aí«)ô\f©hXcd\17Ò\98\18RzTîYþ±"\ 4
+\95h0\14\96\ 6Îg°êGÇõóå\80ê\9dÔo½¶\1eæ\9b¿\97Ò\9b\9dþL¡ÃTC\f­\ eY©×üõßX{,+\ 5r\ 6\97°\84_\94\9däµàýÞD\84ÀaAçætâ\ eÂ#\99´\r\93ì@ÖP©ia\8d\ 5aÓÊíAô~\ 6b3YRíqíæ¬Ê_ØÚ\9bð}\98Ë©\96Wÿ´\94p$п.<û\11½Æ_Ä\90o\83ç´É*Äân;\8fµ»\ f\98òà\8f\85\86ßà\e\fò\86ß­·},e\85\82Gd\83\9a_i\89m &\aÜKä\9b\16\1cBf¨ßBÂñ&1@\ 3,òkBáø&½\85}ªþ\93ö¦U\84"JÜÐ;!\1eðËÜ_\0\9b½Ó\r\14Î;#X\aøÙ\ 6ËýÔ?¤\84\14 \81
+ÉÛVß÷í`Uó\ 3B¸1Ï\ 5æø\85\ 3ù)Q±L|I +\16\9f\1eß_ëëÿ\12Ä\91\18\9b³\0ßí\1c=½cLر\8c©\1f\91\9fµî£ ?Vuð\99ÜïT#¸UüéM]\81.#\9ap0'#0[8÷ 5W¬ïëËÈ\ 4zË#¿¿\/å`Ê_¢é)©ø\85\9eþKB23&z\87t:    @F7E,½ö/þ"²·@fÿÎÞpSO³C÷Ñõ7ÐÝÖùÓá\96Ò\eÓò\e¨PàÁ8ý\8bI\9aø}zhS\ 5zv\bÉwk\v\ 4íy\81³êìé\93Wô'êËøÙ¶kr¤yU\ 3Ä\19'\8fÚ¬*\95òÈ×ÕÙß=\ eÏ·SËÝC\vSK\90aT\88­\18uóéÁ\1eïÏ^\10\12oܱ°rQûD\ f<\850¼¥v\ 6°ohÄz\1fÏoÏO\e\13\92\1f\8d2Ï:Û\8bxã!\13çº4±\93\f\ eýúöû´£\82\e\8f°k\8a¥]ɸî\83\9e¹¥Ô{|Uò\9e¸\9c\17dkwÌ\8d(nÌ\v-%:Öí÷\9dØ\85hpï£é\11\8c\a\95×ý\ 3ÒýÝ\8dS*r\96ÝéΩ¤\103]\15'££CÌöF´\b´\94»\15Æ=çHl\v¡SeKÄ\1e\1e\9eÎÍ\ 3ô\92\1f\9b\87È´¼\909\97\13Ø\9a \86W,°îûaÞ£ç­\8e\89º\8bÛ\1e\96\8e~éîp\1a\16>}\b\9e¹yC\81\97Î{h_Ò\7f\ 3´g\94/Îî¸Ýׯ\e\1fÒµ{L<è\8b²§2\ 2<z \1d\v\86\e\8e\1c\a\8cù;\1a¬lqL¬há\f\15ú\83ÙImæqþû\eÐN\9bPìp}Ö@\8be2,_'l$L\13UlÈÍ[ \98ð9\84\82z£UÙ\r\17þ\809\8dý§]Ø¢£×b       \9e­f\ f¼ëÓ¢­8\ 3*6ÁH\88&\7f%AéÕ|-r5X\r\1d\1fýÕÖ8\8f'Ï!ÅW:\ 1/¼\bö²ÛA\99¯Ç>Û\99,`È8\14À\11\1d(qÅ\19íõ\1cÞ\96\92«ñw\bopQ\16\9e¿f4:}ÆÁ\bí\10ô³\0\9dàsz~Çiûè$¯¢þ\11oþ²\83àoÖj\98\8dÓ\87S¬ÍcÙ\15Z7Gú«(®Æ\ 2ý\9d}aò\9cy\1eïªÑ¢÷ïD<ÕlÜ$\f`9ÌÚ\89êS~ÒxOúW'ïôÆÝùKgÕc¿öÖõB\15Êî\85£ÅóJô\eÐd\9c\1d\98\87L¤:m\0[Éð\e\99\97åÞ\e\8cá\80\16Ö\rú[]6VóÄ0.áíÒá?Dzä{\8f\8by\87Ù^jÞÎSæ\18ñ5\e\1a¢£X3\8a!\ e:ñÓq\8fQ=lïÁ/\ fÝäø¨ä\95\84?¯Ó\93}Z\ráÚÌV\1a\8e\99\9e%\8få«\ 1Wrj\8a8\8d_\1c\18Ra\98rÎC.ÖÂWu\9d"\7fz\b»\ f\aE¢Ï\e.º_º°]\9bf\82Jh\12În.®;küz<\12¿#\ 4̤\98)î~p3¢\ e·îã¾SV=\81@\8d\ 1~Ó竨wÂ\86a¶*\14þTÆÏcÐêºQZCF£öÞ¾x\0ý¨XL¦\89C9\92^\ 2°\91ÏCq7þ ;¼÷Sw\ 3l6Èý\14r\9e\ 6é\eµ\80ãZ~:ª\7fjbÎ6Ëþe_:ÆÇE\e0áx\óUá\10F\85â4Ä\83ÇÛ\0wòÃ\ 5$©v\9bÃpÓ\0À¼{\19\84Z\e7\8aá\1dëºI\1c»?\rT{l\91õ '\129\9a"¥+%{î0(\aV\1c\9c\ 3GC®E(÷Q­aøl\95-\1a\95\8a½H\90\ e¸¥LèÌÅ+2ÅãÒ£¢Æ\ 6]©2nó     \87±âuÂ4\9cöðð\9a¼\ 3b~û\89úü\8b0\0Í%\ 6\96àî\90¥!Õ\l¥å¦uT\9b\1d\9aéåÉ;g\97\93[A//¦Ý\8e¬¿EbÝ;\19&\1d\91«Dï\17U8¹:ª=\99HíÐ-\9eËj\98Ü!M\vÍJ\7fv_Rü_!ùµ.êÛAéØ¥R\9c£\17é37½ÄÁS½ô\1abð(\81m½ûªEN#&\eS\8bZº¡ñø\ep\82ÀIñ\12?\18Ï(\9dw?çäÄ\8e©\83\95XËÄh
+\13GÎ?Ûñüþ\8e½^ø+¯Â»dvsÑ%k\ 4³þÛV\85WsnY\fqìõëý=\1fº\1eocó\ 1ÒÁ#tN\8fw%ØiÐÓBâµ\ 69ƨWÙ¥Jbý{F½r³ H\99gÞûr\9fb*\9e¤4ʪÓÝ\9d\87Îç\ f\8cØÐdÊnÍpÅÔ\ 4·>qÄä\9a;\8dë\8fèï\ 6vpîÇ\96gYÃY\80n
+K\15fûKOñ¦rwy    n¼~ÕpÏÃÁ3\93/#\98î]'¸×\81\1c9\9eûm\ 5\13sòß\8e\95Ca=\rapè6éÒ¨\r\9aÈIí\ 5w\14\92\98µ}óñE»Òi·\1d\92uÞÉ\a\9c\17`0×1qjÞDÐ_=W\11\8aH.Òì\1c\9bÀÝ´P\7f]Ræj\81k\ea\9dì\8e»$Áý\18\ 1¯¨\1f3\88.\9c\94®\9bý\88Î:ÖÀß:Ü+¦»\15\16Ó\90ÛÓÇ\8d\9e\1cÌ[-¥©\ 6×\19èÍkD\ fâî\e\89\16WV\ 4\8cö>Ûi"ÄÚYG\ e\95Ò\86HÚÎB"N      ¢\ 6ô¼úC\9dáê\ eÝ\11²PYûtî:~è5ÉÉýJ\ 4\7f\8c´\8c\9bÚ)ëö5Õ\98×x£uÙ0ÖË¿ózB,2«\88ô\ 4Þ\9b\19¬¹\97²SÖËåï[©\9bNÄ@±2\1a¢q\9f\80.¿è©KCn¥Åß·é\8bØ\ 21\8eïåÃ0>ß\v¼¼9ѲÖÄÛr/Y\85þ³\bÓ!ã\97æÜ`$\1e/Prj\9eßX¦¬êè Ñ>µ?kI\93om)Y}\8båBÅ\1e/\8b\14´\7f28¾Xøì\9cé.lØl±-aþ]9¸¯\89KKW\9e\8e{\90Ê\b.\9b Uµr¸QÀ±þT7.\82\85Nù#MáÖéŽ
+
+lvÙºAÛõ\9cò¤e9rÔ\14j\8e\86\90röå¥ýk\8c\91%\e§¿?c"~    zaj"\8a¹\19Ýæ}0ë\13¹þ*\v§vÖ[O\80ó\1cùÖ\90%7\98eä3@.\87W1\e¿à.å¸ã¨®\17®òcåN¼ñ\rÏBdø¹hü,.Ê«\12ø-Þ\f¨Kgm<G\11A\93\17\92ô9²T±_9ÿ\1c\9eð«\96\8e ýC\92Új/Zà8\95 ð9V¦Ë9aäÕ®\18e!\8cém®<js,óåµÃ§i\91Ó\0`êîöñ©Äé\b\7f\95ý/yß\19.\96\87ΤÉ\982v-Â\1eÑ\ e¥\140´¨\8eþÐ¥¬MòwÌ^¨\9d\ 1f\9f"]ywÅàz\7f=ìñè\e\18,´M\ e\86\89Í\89³k\8b\8cä\92wì^F½ï)B\ fÒ\18à\8bFV\9e×\7fX@Û\ f\16\9bv\99¸mâæ}\ e\9b×\15\800éïàø¯\83\88\eõ&ïu`äYP¸ÉdeJaµéÞs\85ÓìSçh\röÕDn>*Uc°\13\87\ e\8cWr*\e\10±ÝÀ>\9cû&\96\8f\81\15=~M²\9a8\0¢¾«¹z¸¯¾<ýA]\81Iäfð7ß7\ 3Øû³V5¬È\rØMÕ&÷ôÝÉ´\ 1\8bNÍêÙå NÕðKó\9e1+çÏ|GÜQ_Þk\90K\17\9d¯áwO\8e©¬¨\9f       H}yzr
+·ëÐÆÛ\8b\17¥D\ eæRÎfê*ñ¤Ô7\ fÏ?'æ\97\15\8d±±(¸¸eÖùX\1c¦ßYª¦w\95[Ó5nBÉ\Áô\82£ÕTro×iÕ¾ÒÂ\v\1d\r°À\8bûÐOΣL\e_ª.Ì\99\17\88W`¢\81\8bW/û7ÐÃÎÛ\10\9fÖIj`â\b°õëز\9bXJ¡­û\0 6Üs."Òï%\vå\18öÔ©©ÖV\7fz\07¸RðT\8f%íÑ.íõâ«úcÒ\ 1îýAF\1eÔkì\ru\ 5ßz'E[c5\1a\1dt¿\¹GW»ò\88@OÉð\8e.âü¦æj\a\1a\89ö)\9e\91R$ô\ e\84·ÄÙ\87¹\87íNÔ5/\9aóG\15Þ\vÌ?\9c\bÆ\89kç_\9bO¯x<\95:Þ³\16)¼!\1cýþ l|ñhpÔZÓá^ë\8c\9eY<Vlßp½øÅ\8e\1a\ e\vèÀ.\92ï:Ú§öCßÊò\91\fg\¡ZÔk|&-µ05\9b6h õ,\ e·¿\862½¶Ú×D+.Öã\87ä
+fØx\15É\v? C\9cà{\8e`?âN^¶ï2tû;XWöNû\95³¶Tå\19bÙË\8a\9ei\ 498èþLj8ó¿zÀb\ 2\92\9b»l\81ºOÍ \90\vÚþ¹N§Û\80ÿÌäïô\8eÛÝQW{\96\8a\96µ\85u9j{#\85Ve;³K+á\86\16÷Vë£Þ\9cíVß\93leÐr\90ãHõ\94Î\87ê`)Ù6«UH3ÙÓZ\ 4ªî
+\16\ 6FcK\vÿõI«ÃWHÛÌe¯Ú\83óMeÎ\92ï8nÁ\r\,ú\1c\90\9b>µÝëJÛê÷\8dµ\8c\0\1c\86Lt[ß[¤\97$ξ½ð,ç¯P\15\1c\ 1\93\#S:öûù\87\92Ðý¤yõÿ«Qîö\ 4[\19\8f/FÞ16þôÇÉ5¼¨Pxy÷}j\9blótTkMMñn\8bmËZ»\1d\92I\8aBß{þ­T'}\8d\9eÏ\9a (¼KÚ\9fòe\95\93\93Y\r\82Ïkf4nSÈL\ e­ì\87lÞ#Ú3;ÄÈ\16*\93í\97¤ÉaÍ\96¾¡\90xÿÚ'¶³iÁÕOåW:.\9bQ\1c"\11¥\176ýÂ÷\89ÓA\14©\85?Ãy6Q¥;\80ÙP\8d<ÃB\98wÎHIÑ\v\bè¡;ð\17\90þ\8aÅOÌ)\80+\9dÌÕûô1\ e)3LÒèy1uC(R&\\±ñá¬U\8d\9co\ føyÅ\1aDµ{®Y\97wkF\.»F@\aKËmD\ 5-\15ÕI§{\81g\90fí¦e·\83=ÿ²m0ügiw\f\ f\956´Ï\12ûó77gÃ/`\81³9\1dU\94íÙ>DÝ"ò*~î~\14\9b\8a[x_é\0Íß¾BÏõ¦«úªgØÃñUÓ§ÂÒ=-{*\ fM£ÔèåË»\an\10B4'÷ßgl\84=ú@Kãe¼1\98\9e\94lG\95ë\1d§Wqnz÷Ë\r\9c\aò²äIJ×&\87í*n÷b\16\9dr6Ô\888\ fl¹)\82\9eËÕ\9d\86Ý\1eǪïh}Õl\97\8f\9aýÜ\9eÿ\ 5éãÌnZ\ e\96ÒÎ\18\Òö|phÙc2bܬ°h\12åÆ®íVOmÕ[\94c3®\14«OÛ"ó£õ\98\16Yûz2ÏNóØyÙ3k¸\94k#¡àl\8cúÒ\19üµ\v-\92\17Ï\17\9d\7f\96ÖÈ,\84v¤«gUÚkóÖKf`\9e`3\8f\ 3kå_.:ÃÑ-Ï\86\90\9a=-¿¶må9_x\1d«h9Gº"ãÏÁfçm\9bWÚc¬Ú8R\ 6ÌâË\9f\97\ 4\9f#\9b·¨\7fkD³
+Ñ°Ö×ÒVê\8aÞØÇ\94VѾ.O>ýnÕu°VÝ\8eÛFz\v¤Íx>P>¤h¼Ai\a\88\96ÆEð1WÌ\87D,´uÙ\8bÂVì\1e­\_ÿµ«ÃÛ\97\19eäËá·Á\8f\17¨Vö¹\ 3\15ºW\9b¯\87·7é¤et$\99\bô\84¬sªYñºð·µàgá*1´{\89\98U\93±õØ\17èm¹?\ff]\81vnÎr\80\88É\0ñk\95ÏÉÐb\0¼ã@¹eÓsã'\801u\8765û½K\92)]ó­\80ÜRÜ\1e\80SÔaâ¢ýÔã5¾\9dlÒÀ|f¡;úÒÆ@ÕW¤\?0\1d\10\96¹ùÚ\90ÚÞp'\10Û\95¾¨aw\w»û\13èO\e!uOFÿ\ 6iîOâ\ 1\1c\ e¦\ 5kóÏÐ\19²Õ±·4SÆ5sm uÜ\8aà\1dÊHQµìÂÊh\e1ê}ÌÈc\9f\19\aY5\86\1d\ 3zy\ 1ØãE±\ e´Ùù`âoûþ\82QaCbõ»W\9büÿ\19úÂ\8fÌLÜ\e^ûoñ'|\1c{dígæÌë\9c©\vµÌxÄ¡\8c/|®¦Ó\16\1cÙâÎ=D\8d\85Ë\9e\98\993\7f,m[À\92ÄM=±®ÜÒíÍ©7Ô¹{Gª#v°¬XÎuÜù×Shò\90\83ÝfÃÀ=h\83\ f\80.e˯KhÇu\9aÑÒ9R\8fØè\ô¢»\15¦\r\97\8bÐ\8d        È«\9bë©»8¬GT/¤^\9eE\97#Ïñ\95%<x¤MïP©Ú\ eº°r\87\98\17ÿI{_ï½ïtò\ 6¥XUâ\f¾\1e\7fçÖÛNÊêõ^\1dÄýqÑ]×\r\1c»0o\ eÈïKÅ\esç      È¢©\17:\9a¤9\85Þ'4p¸\9b\ 4W\92ê;ÞÀ2\ 4:¼6\ 3\ 4½\9eÝæíó+áQ\9e\8bù¾¾ªM¼B½âÁ\7fÃ\ f\0ÝÔ¾ÚÖ»¸´·Ô<\8eõ±ãÚÏ\9a÷Vj~´\8cð«{s\82~Øfá\88}\aWü¶rÅ5¹ÃNÃSìgò\97vk\10[\ 3\9c.´3´\84ý\ eÍö0±£\9frj\97\8c\89\87d¿\a\7fü\9b\12\1d´mÛ\99U\9d\11%=À1,\94\9dfl\ 2¯KÇ?\1f%ÑkÈ\89\1anµ¡£  éë\10¬^ÑAºÎ\v\90&X\9f\8fç\ e\ 3éÂ\8fß\18]\9c\ f&DÐ}°RmÂr!\7f8&+®áO\1e\ 35\10TËÑ<       ³uæ:;úO«Ñj\9f«Û\9dYrG¸ß­\9dTRRà\96õéæÀ\97Ãí¸yX\84'\97\95\90¡¿ì÷\7fóÌåÝì\e}\9a\88}p\9dþI\818/\9b÷Q\8aúÔÂ\1f·nU-´Å×nã\17Çò\f½\98\ f˹w\8a\1cx­Ú¬s\948ÃÒú©\0òSa¢>NקÍFV\elE¤Ô\ e\8dÒÚAõ\8bø3\81Ѧ\9b\91´\ e¥.*Y(\188\98\ 1\97\1a\83³'Ð\ 5
+ø;\ 57É7f¸E^Ï\80\ e½c©\82\8e\ 3åÐ÷ô³ 5\8eäȽeÊ\a´Ç@Eo­êÖs.:\ 4löJ8\92WÿinA3ËZ^¾k\96\8ao\0W?\88w[9¥v«\8bé \99ä\7fÞ½>\\90\18\9aÜ@s$^\0\ 4÷\13\18%\9fO\80à\9f«×\97ü©±?l\98 ýÑ}¯û\8caqQd\10\7fSC\8f^\86\r~Ä£\15öþ\9a>3\93\80÷\17o\18ô¡Z#°@÷(¨n\1a\81ý©\1c'Ñhí?<yY{ªdlIáyØj{¼Vù\9cy\r\83Ýx÷ñ\8c\15î\92µ
+<õ·ÍÅÌ\9bUö}¸µ~ÜÁR\8d\7fm¥^½Ô\9e\eÉD;&üãKë\e\11ý°ÇE;e$y\rÖݵ\94\ f\99;¬xJ­>G¿ðwæÿ\ 5µ¢·;ó\1f\va¥Pz=ùA\9cPù÷\ 2K±¡6H%\8d\ 6\8bKÄÎ\9bàg\ 2º¼¾\ eÃ\ 1çÃøu:\89Ì=5\9a\a\83åjØDÙsÍ\19ßË«X\ e¾¨oû×^h¨°®G Ïm\85f~¿ë\8fú\v    ÓÞÚ¤ñå j\9e\15\fìð\80\9c\9ffש\98\9bª¿¯í~PÝ\1céõ\83\9e\9d\88íï\11YÆ߶qß{qèLÛ&\e\ 6\93\81¥¨Ü1è®ÖCüæÔ.ö+<¼üÝ2\91\9af\9a.ݵþ\\85ïÏ\88×Äþ½e\89\10¶ñÍ\8e_ÛTù\e\7f£õçÄÒåjcï¨\ 3Ûõ·lF \1fö8q;\97çÄ'\ 2³g\92\85cîT{ïnØ`ª\aéò     sgØ\82?\81el\96,{¤\r\97\82¿ª\86\0\9aïÞÆï·\8fK\83c³×ðþ5þ\8f§\1e\12<¹"¦>\9a]×ÓÓÍ6P\86H\97w*üØ\8b\8c»éÏPmB= úÊ\9b\82´â#p¦ å{\ó\1eÍÂ\14Ì\9dÞ\9f±\87zÀ7\ 6A9\10@g$eüòæSü{îOÍʯXÌ\96\0.çºâ7£Þ\v¿\98\1d\1aôa­\ f¦J¯Ó\\fj\ 4P\ 6\87\16Nª:Y\94\84\90\eD\84¿È\8a8Ïü\99µÀG\16+¿áUMjÇ\85S\7f¶ªÍÁ¨\12ê(Ôë®AþWý\81[`®\v\84\91é\a6\ eeæ{æ        \15Kæâï\18}Qàø{h÷\13ó\18[XH=d\15\8cn4\84\1f\90?((ªËÒ×\ f±\8dæ\81ª\ eÁ\81OOÙyZ\93åS%\98ÊÇí-Iýp¨qËþê×·¦U¾d4~ÓqB\ 2¬\ 4\e\80\11gQ[nnà+^nÚä]\82\83in45ÿ\1aÓj!o?Óîí\83        s[Ê´åKÙ'¸Ú»µ\12¾©\18\93Â×\84;X«\84õýòÂÚ\83z?,ìì_¼iì\92ãÚeÊñ4Í\14ó-\aÓGU?ôm&\11Ô\ 2ÄEG\824ùÞs\14\1d\ 2sIºÎ\1a²\1e\87b\17["\90"~\9cU\9eÌýç©XÐ\10\rû\1a§8Ç\12é¾?   Z¢\7f,\ 1ºÿª¸q\19\8dÎ-u·ø\12\f\8ceÃÞúÚÀÆñ ê,g/&`\98\1dÛ¬û9î\91ë\89\90(äñOFbdaOa·\10\93ðÃå\18ã<qô\1c\14³#\15Hõ<\82]
+\9e\16\83$ ·\bug~3ï=xÌ\f|\1dý"²Í=²]3Þ¢±ú~Ì\ 4h\19\ eÝå¥\eF\88>*¶È§+y59@\83cv7°      þÙyþ¼êúcÐ\1f4¹Ç>ö^³b\18\87) ¤Kâ\17\81\8bÅdä\14¶¿º'Wy_s 'Q=Ä%3'\85/m\ 4\8eüw*x\b\7fÜÖ\ 1W\86\8fÛ\88\1ao\9cU jJ3Z\10\935\7fkXß?-·\910n×ýV5%º¾Õ¸Â\81\14ÜellÛ\ 4xWÜ\7fSFXL\82\9b&B-@P\9c¬£\9c:BÒ¢Í\7fÂϾ\99\87¯î\14|ÁR\9f    Þ\95¼\1a\8cm:$Ûuuçç£ÍÁOÆâ\fÑÔZßov[Ëï\v\9aÜekuÚI\9dÑåÒ}`[¾]\83F?]§2Û\8c\9dì9VÇTpqî:T\84Ф÷è\fQ\9eÃ\13s\15\88>       ³\ 6Ùñsgjðl¯]ùS\85ÞA!Õ\b Ç\8eS\ e\8e\f\15ý\rô¯mE)Ó~·ð=1ýr³lö\8e®ÇÒO¥
+ã9.Øù~\88\ 4óâÖ\93«ø¶¡M\12Kï¬\eÔ\82ÛãcÑ\80·á!Ý\96ò-e³Ï©¹«|QUrF3Ô©%s{*¾ÈP&%¹\91\16Ò\8fûwcÝÎÛÆuAÚóS\93ìýÛÀ\9cµªý%SZÀ5ËÜnã\ 4\13Ú\13|_\ fa{\1fõ\9eQÁî\b°ÑÂo®¶8\94\83J{°\91v\95\11eu÷Ü*ë\16¹\ e\97©KÓ¶ðÑ%ùÛ\1cK\94\9c-"G~ðÃhÄôZh$µË?âaiv=\18\ 6é­±7Õ¢\17ßúçìn÷ëBó*¸Î6]<Sî\84   ­\v2)¹í/ú\8fùtÒÅ¿\80oå^\8aì-ä7­2\1c?¢¹\97¼8ô{_ðSêh\ 4âÙõC-ÝðÍß48ιÍo^ç¨-â7ܾSÜlÝðf­Ê>Ì+÷"Úcw\90÷XFN\80\18Íz³\90\ fn\0#ÙGF\9fHI(Ð\18âSÁ­\96\fèö¼µ\ 3'\1fÜ\98Ç>\9a¦Í!¾Ý\866\18\15å_WD°µ\84&<²Ö[\0î}Ö§ug,9¯d\15\16ãî!eÙ~Îé^Í
+ÀÃóc\a³`\8a]Ö9\7fQHnaÔà¶è`ïv|¸4Òü-º§\9b0,\85 cR\9c|ììÙNhg¿áÀÒÐ\87ÿÔ\83\99\7féY\91\81UÌ^ÓúåzóeðQ\rýoÚé}Ï\9dÛS\9f4¬XIa\ 5;ç¼g\ f\82«\fg\ e*Ïèú8ª6\ fù\97À²°z¿Ê\82\91íJ\98á=ÿn\86ðA\7fÉ\14î\95\8dY+\94\83\93\8a/\fnr#çÍ\11\8aè ¥W\ 6ö\bÄ\aa*_:££ë1\88h\1eÌm )½\82\85÷Â&y\172¡qߥþÔÙÐY¶/¶Ã,\80Ø\1fnúÀn\14þþé¡We¦\16ÖÖ&ooP¼¢Èñv­\1f5_t\ 2½\8fêðºÙà¢`D»â1¹Z\9cóz`\90ã \9elÿmøèIg©\eÑ+O\18\1eÆ\92¸ÀgNÿ8n{ænWSa\84lHêµþ\ 3·^º\17k\ 6s\920* {¡·ma²½\92ñYo8(L\ 35\88·\ 2שFAÛ\1e\bþ­(à22X^u\96\86¯¾ÙYøZ+û\0\8eüH\ 6xWá\9b9;õ·XMø|qîþ°k£òûW\8dJæGª\15ÝÚ\ 5R$´ÓÛ©Mø~¸;\ eû
+C¿51O²v0§0F\1fL\8aGJ9*s¿\13Ö\9f¶É(¥nÞ\8e\ e\99Þ¿^x¦>Úøë·vHæͪ ñû¾¯\9dvw1.\ 5ÿ\94÷jÿûjØÏ*NÂö\16\1f\98¢Ò\95°Ê£\fùú¬6á¸\8fÐI\8455ïÖ7wRp(\7fi/x³\91®©¤ \ f¦8..\8e["ö¦W\§\95Ã\94b\h\14\96ªCÚÆÞù¹û¥­¿¿\11µÝë ÝV\ 6æ\a÷³"?N+Ú\88ÞìEë
+]I³E÷bIëý\98\13eBC£îXW¢\80\ fhÙak¯«r[=üx;6Þ_t<q´\ 5
+\97mÅf\ 2Ý2ç±ñ\85¾¿Æ\18\86¼iJ\9d\8fµÂ\19\9d\1c\91\90m\ f·\87Ðå_Q·ÓßO>z\ 6O\14å8|\89`\1e\8f3ãõ×Yj§@úhE\94¸Y2$\94ͪgä,\95\ e\9bö±\EíN\0½PÁFhwT\9dý\ eM:Ê\92\16­1ró5h3UË«ÏÌJRhn\1f\84¦¯ó\8d\v\106CqàLõ\80\97üDº£Ê\9f;\8d>»/Å=¦Y¿µÒÜÎc}û%<\8aÞ!·ëî\85¹ÎUÿ\80BªÑ½ÕþEOõX1ª\85Æ\88¹ì1Ås\94yÙz\ eß\rTô7sï\14\ 4¤È\rT3|\ f\a+ß^\84¶¼ \99\9ayÞÏ\\1f®l\87\1a»·{\82vÂú`W>oÌfWè\91Ò\97P\80pº/;Â\aþ%SÒk² #ç½\19\88\9f\9f¾\88é=èp\80Å\9c\12ê|®<¸Z'øcÎ\86.ºù\84\19#\7f}\7f\9b\18\90å-¦\0\95\14\11\80=Ó;\vd]8\85\ eÛè&Ýs Hûw\1c\9a\8ed-âfo÷K\r©IÁ?
+Õaõ\13öâ\aeôåØ [+k\15\94÷\86ì\14¯_Ç\ 6\1c-鼦\8bH$ÇôÔ=ûÉ#Í7ðí\8bÉ´\8aÒ_5\98øÚZ\1fµ}\83¤\18À µpµ¦ú\16ºx>Qé2\14~A:¼ÕeÃÙ5®_¾½\18K³îùm\ eëÁÉ,Ó\aU%EüÏz\97>!ßå\0¡/\99ß:\8c\9b|$¢\eT·z_\ 3õ4âÑN"7L\15Yf!£ènº.µ\15o\9a,¾"Ó¡g¿I\16J½4æ\r±Í\fìJÀ$­ã¤T¶\1cO-:Ï!¿CÂþ\a8y{ÑÓØvó\19|që@ÏGæ[?\9dwsÃìm<ÓF{\ 33ÂzW\9e2\92§õX\93¾í$µ\19aW`Ö\19Läßݸ_î=\8a{%\91·\9aMë¢Q+ôáXë9e×
+P¬¿\17\85\82\1cÆ\95\9b\9d\8bÅ\9aùx=ìVfú{·XM\1e\ ey}Ô\91ìí\8c<zß\99+þe¾ó©p\13¸øl°Ö\8cqa§Ï¬å¯âáfä¥ehTýÔ^³\87\99\9bCeÃ\1aª¨J\b[\ eñ\80\8cgß#ÈûÑ.sV`\11\9a\80mªö²"UÀ8
+ÏÚa{
+är+ý:±Í¦gÖ\r¬Ü\92\ 1ÔÌAíáüôÃiHÿ^ª\ 1f\8b1rëdÜ@\8f\9f}Bêe\1cU¹Ý-é\14\ 5á\1fÙÐcDY¶Ý-]ò7»Vɪ0a@´þ\88\8a_í \vçTû\eG\ 2Ó\17\13øM.äK-}Úüü\90ÅÅQó'\1fÕÊOÞ\94F§i\1eÎÎ\8b»á3\14ÙÂÙù90É`m³ô¶\8b\8c&ûÌ/\rV\ 5ÉV²*`\94f\92~¡Ö\97\90\1cG\82vvãiR¿Bkí\8dÑV\9bîo©\88\1a\r!s(ÒO\ 2ͧ¿ÌmÀc^èô\0â\87Ê\96 Do\17\96Q\95­îܽÉ9\\1c:Ð.ïI\15ÖÒ5¯~\81\è3ûÐ6©¼M\14n\ 4\9e\fM3xλ\ fGÊ@Ñ\\9d&\86×Jò·JçÝ\99µºs?F 5\97\8fL§¥;b\9fèñ\88\vªÎÞäÿ.\1f\17áÉ\ 6./ \85=x5\94/\9dw+Al}\9eÚcz½\9bjOUÌ\17l\1d\f÷"0V¢ð}±cF¨\99[ô˾.ù
+Mß6¡=ÜU\7f\8cÀ\ràó\11>Õ¢\95Ûk\88¦~úä\8a\89\96\85mW¢I\8aÔDM\8eÅ\87M|\86\r«s¾é\1cþR»\ eëþÕ\1cZ?´p!º\9a.ÀG=\ f®Á±¿\80£\9e#к¤ï³ÊÉdØîϧ9\97\90l\98Üãl\88ðz+¹\ 6Û\9eYÏ¢]£KO\17qs¾{úÞoV\81_øqïM\92ãJ³n£\81³>OÖ T¾CzÞÒ0å#ÕiP\8e\8a'³ß\8etö8\8e\86 Rñi;ê6~à\16oåh\17@ÏOâNz¦å£\ 4¿\ f\93k³Ýêe,\90Û4\80\17ÉÀP\88zO\98¿Úw¿\13\16Í\ 3\98º\\fܯÑç\92£\85'\e)>\a\ 5\10U       NµÿÌ\83#÷oõ¨¿ù·~WG\1aÅ®Ò\rïNØyY\15ã    \8b\1c\9b\1d¤q\10¼º\15»\9c8W\9cZô¿\84\82Ò\1dW\9b\b\12Ø
+&\99\1aV-Ss%\\18\86´À\93J§©ë\7fó\12#¸×W=2.#Ë\Pþ\91\9a\9fæÿ¶ù¬Õ
+pª\11\84 ÕI½áÃzmíªØ|e·ÝÇYZ.?©»,oRy1ü¢eê6¿zl%\1d0\vÙYé\9b¼æz\17¨xÀ\18Uµ¬éí£\83Å¡µô´>5UênùkÃWBÿ\97Láþ\10­¡¢©KKþ\8bÿ\12PÓ@\8dÁÒ}\98   \ fã\9e`é­áÄ;(;\e\86õUÕ-\94ÜÔÖÖSÒêÝتn\1dëo\aÖ\8b¹ÌÜÝ\8a\87\vçNx<ã=¼¶52ô_\87¤{6À\0c\87Í\91\13í%\16Tj«\9e;¦ò\92\89n\ e\8aõ^\1f4mj\11o\8bßH5û\88±\r\1e\83\9f5ÛfÌ£s.½\96ä4p"g"<)¯~º/áö<ZyÍh\12\98«\84'ÍDZ·ü§¶\e\14¿0`¶kJó\17\9e:\13©y¶wí,gè\9b]vÕ\e¢¹5*\1ac\wÒõ0\19ÙzÁþ\8a¹¥É´î¡õÏÊ\9c^\ f\9c\86\8fk¸g,â\97µ\1eOJí]ù²ö\12\e99å¶ò\vkd\86\ 6{oµN\16n8h\ eaþw@Éë½\8dÞô#\99_V¤ú\81¯ç榲u%©#h>±½iv\11úë·rr\80\82\93ÐÊ\1c7ߪ\18\eÝ_ a\85\89\a\ 5§[\97\90ð:±~\e1\8d=4ïª[»÷\ eÙ²u²J§¥Ô\ e¬Ã8Ðõ=i»dmúÅ\18XÓO¬ªç6^\9c\ 2\83*g\80é:Åõ\93\9bh\ 59\7f\ 1O\191aWÙK\95k\\8e\14㺶Üò\1emmCüß\92ºOQb\9c\1a\96øX«Î\8eü^a\8bº\176ºÙ\94ßz\88A6\1c\83{ül*£³¤Ê¯Vø\ 6¯¥\14p>Åu5w\84\9b~ñRÌ\bsÔ¥Mêûä}\92  ·Mc_Í\1c\9dÝI Ð¬ÿ\92\90úr\170ʳ   \9a?ïY\11\9eãÉ^˱j\1dðÏ\11Aox?6q4UAü>ÖÐÖ¸ÿÅÒ¤g\80\ f\8b\1f­t014\91÷\ 4\8f\11\90¡\82+CA\7frxè\85\97\11w55{Áä7íÚ;a×:¡¶;\9cíªO\0¤'\n\ e\9cüâ&ûyä²\8bgI\87ÓrbòámáNº\aMð'jÓ
\93\8b×`:o:5N}{\97ñ¼7Tø;Ê«Ã\89ÛnPS WÔ\9bù&­\7fólJ\93ÕÇÙ\13ò\î\9dK\vû°?O]q\94mØó®í8\ 3õ\9a¸wWæ\bn\17¿ÝHÎÚÞXÛÑÍ]­/yáµ*Ú\8fc_Ðz\9d\15í¦ë\9eâ$\8a»\17j\8fÄroìªäb\85yôOÝ­#ºÇ^ä¥ûä¦\ 3T¦à±7ÝÒªwfê\91        \8a\ 5\ eôúXÁÞÚB$3\®\83®Ôy9ö\92\17Ù®40\81\9d\97,÷ËY5¢Å#\a \ 4æÂÃ\9bÏQó!ª[À¾vÝ\7f\7fSML\8d[gd0\88æ}{]\7f\9aüöB\96\82r\9f\83\1c\7fµ$hêE\10¾eå¬kkN\88ªNV\ 4Gûõ\eËß´Mì=\8a¢ëܱíæ½w\90Þ7ë\16U¶µª}ô\ 5\9f\93\7f\ 3hoé\1dsæó\8a\88Êøû\8dÓq\8fUg\ 5\17ËÛ&Ø(µV8P׺rzÞ\ 5i`\80JHT\87·v¯÷·P\ea)\bæÅJHէע¾¾WÂ\80YO\1d\84\86ͦµ¦\8a\1fÿþèü º\ e`h!Ï
+\a/èÒ\7f\81Ø+q{u\99\9d\8e\ 1+¬_LËáûú}\84\v¿\9báU¨f[¼9ô;§ë¶Y`0Â-\14g\eÿüaYEÍF+m}©\14ü\193QÚÜÖ\8b\rßÚÿ&'ùN\15\vÈO8!,Žîü/h9!êcË8Ö\89\83|\f]÷µweÆ\1aØÔÒüê~\11\8a\bµh\98\9eÒ Às\8aíZoýò²\ e«N\ 1ìÏ{\12/\83ÛÄQ\î\ 4v~½ÚlÍÇ¿\ 4±W\82Ô\ eСáT>7TÈ:¸*\0æ*\1cq\97G²¶\97\8aD\0\r¡\11rw
+¯Î
+I\8aÀ2±\14q\89hä^èJ\1ftf«\9b\ 6ÚñÚ\89w\85\96w!ýÊ7üÝ\v.Tx/½û³ôËܶþ²üév\e\97\19(ÈR\15/2òÚ#\9b\8d\1d é{µiº\9aäíï_÷ËgÛ®\fJ\12ì-ûHÑó¥û\83ë¼î_B#=Î^g\15\ 2òïô5ÚÇðÐõ¶\1cü\87D·G\ fÔsü\aÕ\ 1á"\13\r6\86\15\7fú(ø^m\9b\11_\ 3iÌ|¯\9b\f<òzÙ´2a#úU0¸z&¯\89xáQ;\81e³Wð6óc­\19\81\\ 6\16Ïãn¶|\fdv\fÕBÇk\9eÜ«äm8'\eþ
+\92\9a?¼²ooÈá\ 5\86üÕZp¾Áoô\87d\12ºö\vùeãÝ\ fäZñY¦!²\1fÑ\8c\9f\ahÎ×\vÐ\\9e\1d\17:\84N·{ë&V\9dIx\9fuQtÙ\98®L*Oôàôv\7fඡ*ṉ̃\14\98\8f;\v\96\15ûazWìh\98FëÛ\99aký¿\9eÖÅ\17I¸o\17\rÂÐ\v\130dp¨\83ôë\91\83\8fÝëò÷ Ð\jJ¡\ 1\17Õ0¼R\91\bí?uXú\82\9cîÏ\ 4ÂaÂ\1fè&ù¶MÔ±ÎÁJ\1cQèÁs÷6#mUÿÕFÈÆd\9còn°\92\9c0G\89H$´ÍÞàÝ\17\14êL¯È¬WÐÔ\à\13$\18Ø\0\95¯ÛÒ½¶ô¯Þã\ 6÷\87×_\ 6Ê­ç¶â\vK\1c\93³ub\9aãÅK        k\e²Ý\96ü?Çú[ÈûÀ+\17cêÑ\ f\87ö¡; ü\9dÍwÐSw#¸õ±uö\99pâ6î\87sÁÓÝÍ;øë(\8c°\1fò¾S»<Ó\80ïw~s9\98 ;è:KBÚú³
+²$Ø7]pCìdúØ\147à/Ë\97\15\97ÁNÇç2\9dY5wÆ¿ZA£¾9µkO)óÊ\e¶è÷&Ú\9eZ·;;OÌÜ\92\ fõ(\b½ÉÄÚ\9b\15ÿu¬\80yËe\9bõ\a:\ 2\95;®ûûÇ\80\16\92\ 6½\87Ýñ\93Ö£Í\88wL\0 ^,ùÕúG"°(\9d\ 1]×a08\ fªðázi\0¥\aÿ\ 1Ï«m¤\9c8T\ 3o%Þ}O\88\14î\91V\7fÃ\1a\83Ú\1f\91ùå.¬S«ÂDðíî\9a\0éfZBßù\15\ 2ymy\ 6Êiyn\92\rª  B¢0ì\bµ|×¾;®)ѳ\9b\98^î}\9e~#Õ«²Ú¦nÒ\9aæ\bv}¯r}X}d\913\88~\9aÛf¶¢(kWß/\83Ó)åÅ\ 27Läjy¹K_*¿gÛð°¦\12\96x#úI\8aû\16£'í\12\1c-\19O@¦\13°±~sÿÃ\86Ûì7à\9e\9b\9a\1dÒUú¸¶Cc\11¨\ f\92ÿÉy\92ä\ eõéqgTÕ\8fÌþ\18\17\80]%ºbæÄý\1cêÊíÖ<¶KGGdv\P~+®0Ñ\86\eíó*©\89Û\19o\98WõòÅz\e:\88±ô\11\90xs\92ZX*\9báhn\94\91íÉý±5§\18=\8f_\ 4Ñz5ì÷qç>+ÅSÂó\92Õ&ù~Ïô\ 1\87Ålù½¦\1dl\18Z\7fóã4¼za\e;\a·¡Ó|h£ Ú\161¸då\7fnoV~ø6\85\8c\ 4µ³ÜY\87\89y\ 4ýmùeþ¬¥nOéÕ)j^=\9a¬¿\ f\e§ÛIä`K^\eÈE\9dzîð&uü¡\82ò\8dÑ[\87¼ñ&«Ä\149;r/,Ä\9c\9c\91|Å»´\88sm×+:ý\10òÿ¦Ø\85\15¯^eþ
+ÿ©»ç\13\19F©ÚÝ\9b²\8b¥_,·ºBs}®{áyiF~Õh1é\9c-zSí\ ÍÙéN\96ÈçËÛ¶\98$ Ø\9cEîëë\19\94\86\7f¾OªµOc·:´\0ùð¤ÈK;!·-/\92\7f¥\b\ 4\1a\85\8bËäJ3\82È\82Û\95Ö\82xxM±\8b*s`LTÞ¾[\ 2}¸u\85Uà§%\vÌa§Ú\83å\å»ú@\96>\róéïýúDò$6QÅuu­=ß/R\95Õ[M\7f¼\ 6?îÉ>Ó\81chµ\ 1ù%aÞ\12]\8c×\84ýhº\e¡ý%åIqû&äçþ~\94®Ý\ 4±3J\8c4ºöè«Ãð \8a½&¥\19\89Ì\\8c¿ó\17«\97Æ\eÉÆ\82\90q¨¡¸ï\9cûÏ\82\9a»Î¯{U\90í]\ 2îÍ\84ÖÇÅÛPf[tOc^\83\9b©vGÑ\97\0"\e6r[\94M1ÎÜÌWõ#ºÒ\ e¢k\1dó%×çÏ\93ènífæø3Ñ\85õ­\18Z\v\ 5¥¬u2\9a*å^\14\8b\95ÃüWa·_\8dnS\1f
+\8f\9c<´¶OWPÊ\9e=ÈéQö'Gs§åqp\9b&?kïc\ 4[gy\9c\9cÅn\15\95Õþ]\9a¹ü\93X©Ì¬QfÉ\9a\8fv24yñ\ eÐõ¨¿öæ&Z`\ 2_û¥\86¢\92\8c\1f\ 1;$:<²\94\86Ö#@]§\86´c6°0®ÝL@ê\93\9avt\98*9Ýã\rÐ\9a¼f6ÕmMÓ\1dÏÕCö¶ë³½yóèizR
+\ 6±÷\16ôº&ªDê>\82â=ûÝ\8d¢?(\8c-4
+MßDù§±\19ì\13tÓ§}°æ?Wú\r¿î¡Õ¬Gq\ 4M]î=
+\9eæ´4±#QÌæâ\v\9dC\82î\93tØÜ\v{\8do·t²/ì<ÿä²\1fë\ eÙZÊ6Ï?õCv*\f&Ldù\9cW\94Nã´x¦t>I*¢ò)ÔÙ¸Íi\89¼ëïÏÌ   -Å!pà?ÃùÛÍÐ-Ûoûq@\r\95¢{ Ã/ï&D¸<\7f«¯óºhZ¦\87˯\14\9e\1aõxÿS¦ð9\9c¿µÓ½bX\81Ñ\19\13\8f\839µ \9b¦¸ÒÓè¦å4M¥ùbÝ\92G\18Ur\aïsE-Ý1L}\95º/Å\87»c]"RÜ\0`4gXd`\99ëí±cëVo\8e<o·?ço´ùåÓD\82å¿°w\88ôµ~«ý\92ÿz\94\9d6%CÙ5|M-#)\1f\19XÝÂÜ\97nJf\1f'¶Pôt¨}\7fï\8c»Ô>~Ø7Ú\98\93B(jÀ\1e:³¬D\99÷õôë5
\9d¼ßü\9b;hÃÖ¢¤\13W½ÑºÝ\90Äq©\84²ºý4E\v\ flãUÅ\82ß¾Ö;\82ï6.¦S0\bX¼:·¾\9e7K%gèüiÊg¹\9fðõ'ź²s\ 2\86¥\1e\1eÄø8V<\f&"\aã\ 6é¯\8a[P¹\81\97\ eZÝ/W\8fB;\1f¸\997\19¾\19iy>´déÕ½õ\90¿jä½:nM´fÝ{|èÄ*z\11\8aVFÝ\ 6ÀbuÈaÈ~\v6Íç8 Î\7f®\10¥=Q÷}Añç\ô\v\ 4ò§\9d\92íÍP\19øÜ\11Ö¾ä­\97\11Ýó¨\0\8eÍ÷ÀÞ6!>Òk.\1fàýk·G\9agG\93°\13\9a.®<Q\97\v¥\ f\14\95§\86v7o\85\ fÄ\r ¨Ã\99\9d'b£õ&ñ{\9e~ÑÍÛlaE®\81f\1fÑäÃ\14.|Ï\15H\9d\18C¯XãÞ\96Üî\16¦íNúqÂm\8b\1cèby\93\10q\ç\ 2L×ZvB
\88~\1d\0\97\1ez¹X\9aÙDZ[I½{åj̲ý\8fßHÉæ\ 5T{Zx[ÝC1¦/\86+\18î).:\aæ¶B`é®9åÚp¯\1c6«±wÈ;=y÷÷\ 2Ú¼×}iýá{®5\v\ ea,ÅQ\8f{>¹\9eá\1f_¶]u\1f#|±ö\e6Ñ0Vÿ2·;N\fáÉ_ \ 6\93åB\19\10ÁÎòLá©ó¯ÍGÛjë³T¥\12Ìl\ 4ý½I\N\ez(\97E»ú©Í¾|Ðo#\fªT\£\9d6$mq\18¹·Î\2ÞY\95QVû¬¡¾ûÃ\1f\1c´\98¾uÖ\99\8eárIaXµ;S¸iUJ÷\a>®<?.Lìons\1ae\ 1\8eÚw»\ 1-\ eÒ\88^\16ÍÁ\8aïÙ\97ôé¨\fֵĨÝ\9f;#"â\rHÀæ´\ 1\9dæn¸ó\9e6[Tÿ\rh\92Bìí%ù\15\17ÜÊKqÑ´Qpó7Sûb²ÚMU\8døéµèÍ[«_\94;G_³\92çÏ\ f©Éõö#¼WN.Þ±{\9e;ã]\8cûà2,ù¡òw\14±5 Ì\ 6ñ"ü¶ÿ÷#ì
+DA[±é»\13ðiY;\9d3\91\aÍ"g\12ü¥\ff-\9b\r\ eÑ\aQ\11xWwÌ×ÒQß\19³\9du¸<D=©©@\98\92×\8aíàN\93\82Ê®[=ö]U± î:þ÷ɶ]<»AÓ\7fÑs\15:\8eê¢C¿\1e.öIü®G\ 2^ÙgÆrÀ¦± ÐeY¨ç\17ád,.áU>2Úìþ¸Ð\8dód\1eDÅgÇ2çV\1f±+«\9f2f²4R\81Á\1c\14b!Qx\8cJæN;þr6\8aÅÕa¥\ 6è·MMé\eËï\87Mí=
+\15çØàcl|Ò\81E\19AËÛN¡\16`E¬(u­ÎRÿ \16i\94Ĺ£\»Íº\19m;¶\80\87ÞêÁ¹ÝfZ\80âÍÊË\sÌ?u·èH\10\f¦\8bØY\8a{OÍíÕÆ\168c®á£\r£/; \96\8f5\ e\18Å<\9e\98ÝËSgÞ\9frË|\rö\1dû¯ËqØpÿ<;HÄ\1f=Èàö\9elr\8a~G.\9ez6ÁCçEë§~0Û¥ËY?Îp\81\9f\15?uk4¯´¬\8aR\16)\ 4Ç+\ en&\88\13n&\a¸¿\1cWÜתß\93/\×µ¢\86<²r­ÓÕª\r\92\96Y\199Ûg\\9e\18\82\\1e2£:Ôp¶ëöÔ:Ü\8a?8\88õo]òËUIÎMúÕª\9b\99_*Úì\94?
+9«ïµIòfÜxIûZ\1c\EþëA<÷þ^~Ì\ 6E·ÈwbÈ\9e\9e´\12û\11%\11<7ä©÷ll\9e\12ß½éæëL]Á ¶\7f\82Ke]Ñ\10içÜq\10¼û¼.ëÕ\acjm
+\18\97}ÙÂGï\vÖ¯|\ 4 \96;O÷?ÚÞtmQdiÛÞ\82o#\9cçy\9e\15\19\11\ 4\ 1\ 1A\11QDÿ¼[ÿ\81=¬îµºê©êªúsq\8b\1ew\9e\19\11@f\10$\8d\88À\91bý|"ãñ[a\9eân\87ÕðõX\10\12\96|è§FOѸã~³»\ 473[m_ÎÁ'/0ª+½\r\91%®ÕÓj\b`{©=\9bvsÆ~½\rÃ\1dõ\9cb§yоè3rÕi\90¶0دöÄ\1eêwÎ\836!Ê÷ÝÚ\98\82L\83\ e\8ekJ\15¾·k\1e¼"g¥I\16<U6À\ 4I\9e)\R#z0Ó\8b\9c\ 1/r!7j¥n·%µTg\bt.\86­Çd|O\9e\f`Q£Ö1*z¿6\81+)¢¼VßÂ\ 5\94ú/r.c¬\f\9dûÒkº_ÔsË\97M\ep®Z¢{\8biF\ 2á\81ðy)*L\93a]\8c¨ì¦37\16XÑ©O7ðF¢\97iª&­ãáÞzqo;Å\95¯\a/\88[aÁðT\rEйÜ\ ep1zÜ[N\1eX@\ fføFÎ¥E<z\7f\9e\16Ȳ U\ 1\ 4<£À\95l}\16£ïLýô:\93\v\84i=¿}¬å[z\ 5\89\91
+!èn:\vÀ\80\11\92©KoË\86\9f\
+@áB*\víUoµ~Êd\ 3\0fÕxº¹IAÐóPï­Ë\97E~\b\ fRëÍ+³-m2¹(\99ⶴܻ\8f\94W\96\82T\99B£Z*n8\14Ü´çK%\94,`p<\1c`Eò#\803ÇöD¾61¤³°6kÒP\9f]ï4Ê!¶¤g6ê²:¨ïO÷  \8aªü\ 5\89Î\9b\ 1TÚÖ\15ô(^\92áà*=ÌØsg\8b\9cP¿U\1d\82\99\rV\19\96°Æ\14½\9fl\19ê\16[hK¬+M,§ÌÓð\96/.ªí%}ÃÚg\8c^\80\vª±º\94\9f\1e~Çç\85\15ÝNO'3l ã\18[\ 5A}2a»Rú\98¬>\8a\17*!±©\89s¥®\92)\10;¬Þ]Dj·¤µ\11ÏR¨¶\8b6\97\9e\9e\13·Y\86D\1dy\13\9f]WïÁ\95ç
+\ 41\1d\8cÖ{\988µÈ±YÀÅ\82ÁÃCø\96­\ e\8cY\0;@\10g\92\97\ 1Y.LW9è\8aÄç\10{¼Ù\1eÔEy!û(\93I\v\1du\9f\e\ 2¹!?ĺÇíµ& 
+\fÍèâ\12/÷W\ 5\90\1cÜû3 á¼áÝ¡ãÏÐtcºP'\95*²tvÇ~`\ 4\ 1Pv\85d&\8d6gÓg\93ì\9f\ 6ëã»éÆ£ì\90¯\f*l\0\9b|8Ý4(`ºìZÛõR\ 1\9b\84\87©Ñ[_\13À®2~ \19\8e%;\84<®Ågiû\8d\96­û¼vè¬\f¸`Ægãyn\\ 2l;LÎÐ@~ñ\1eC\87 ò\9c^!x\ 1r\83cisê \\9féR[¨±à§ðû\9e_57Æj²¹§°=:\7f\12H\ 5åô=âItwÝ\9bäv\vÞÚ¥×wÆ\99ÆcWç="\8e%m\93½\8c.\e{PLzÓ\19\9f\97sx\80LÒHï\EkæLU\90í}<BÍf*\ 4\9aM_ÞHà&·nlâSøòYÛÁó°\aAlªÜê\ f\8dË\ 5É\86û\bÎ\9fïó&è­\8e\88×za\88>?¥*»\fÏ¡º³ûÜ\8d:\8eÒ¯E\95@zhÖ¾õ×Sdº\1aµ «\8d\ e|\9f\86<m\9eîÔß\10\872åÉ\0f/l«æVÝ.\1a\84Ý\1dºÀ˱\89\84§{\r\14Ì>x~\9aK.\e·qXZï{]©\9f]\ e>õÐÒIU7ëŪÓ\9c\93Ö\e#ós\10\19í\9f»\8aQb7Ø
+v&ñåòNÎ]®¡\10×\95D\80\ 4\86ÏÜH%\1aÛÕ\vê\8e\93YÈ]\1c\a/6\\1d¹fíÜÆ\vØMPöhqã'kt-e`á\8eß\fGàÅöy0ɧ¥òLòC\ fo9D¾\97¥äÝ\92\90\9b\11>^àÅFolÑ Ü\fV812Æe>s>À\8d #£á%\7f\9f        Çfs>Ç
+V\1c\96\8dÍÀ\87o¯¥Ñ\82\93\80ÆÐÌõÙz-\eEp¾å\10Ì:xdÕÚ£ÙMo\19%ï9­w\17\ fg¢-\80Õà\85Vy²<ffuiµ\94\9b\1eÊTÇé®ÙH×At\14Âè\e\e\9d\1a}\85k@ÖSw0f\v¿Ê×[÷õ¹HKÆ\16\ e* ?K­\9fU`\95Í\89\bŧ/\ 3\9bëLm\9cFËì~Ôrø\80\86\9cs\80¡v)5ª\ 6½\15\ 4\9fz¹ F¿ºôbþ*\18 a©,¼é\f\98qÆÅ\aë×\ 2<!\8d2\94d9º\98\r46£t­\8f\84Á\ 5lt+\96\ 2ë¹ú\ 3=/Ó~¥´\0!t\80òóM?·2§Äà\ 2m¦ÉãBM9\1e\80\946M\1fnôÇU$WxÛ-õ½¹ å\86zBÓ\8b]¿ú>\f\96hmm$ch,WðÙù\15ÊJpt\8dG\9dÕ\97È\8e$§vC {Ø\87«÷èÖí\9fó\18rU\ 1\ 3©+T5\9e©nE\14\82¼\ 3:Î!ÕJ¿~¾¡¯\96=Z¿_\146mÌÙ4\967{á¦\9bÁw}\1f¬&ë\ ebY²!ÂÃw\ 5j        \19ÈÀJ%\19@`¦\ 2×
+eØÆ:r×AU\9d\99'\90Á\1f×È\86zõrf´\81o\18¾}±»\rt\81­níUañ\1aÕ\1aÀ[µ_ntøI\ 1;\15\1a\11òØ\81É2\ 6\959\ fv1Ô¼.H\83\8eÇ%\99Ì£;­sÛ=¹È\9a·Þ%7*ÌÃÁ\8d\8fÇ\95\89©\e\1aÈTo6\81VO\93ÊU¤%\b*¿m¢\ 1ÕÐYÉËܧ\ 1\89­FÍ\86½Ê    X\8c\97\95¤\19bîË\8fNzë"«kWp\894Xl×K-\14[\1fÜÞ\ 1·æå[y<Ü\10°U\11\9a¸â-Óc\84îkËTåÝÄ%\93\90B_\ 6*·^\rGA¡Ü\ 4Ómn\8d`³ >cÓjµ(\ 3ä'\9fVÆM|^\92ËS\8eEøUv(Q\98Ã#¹\81yáyàØ÷Pì\92\e\86m«Zâ×Ûæ\9bÂέG½^=¨«\8d4ìÃØ}_>\959|\8d \16^y£Þ½²\1a½Û3\ 5<\92b\a«J³äðì\95\1f6\ fÕ·é-6èà»æ\98Ã\9d\8d\86°*¶      
+\µ»íú\b\0ô_\98æ\94\8eÓò+{\85ÊHv\87Îw¹æ\0\bÇÒ¦¬er¨\84\fÙ6OK!Ü$\95'\1a\98M«^×\9fcduL%Ë´a£~S-[¾\8f£,\81£È&g/FÛBÐ\87Á]\ 5GSZYé^å\9e\8fdæÔ       ]f\86Ýf\ fIûȱW¬ fþ>¨ÎÐì\ 1¥\ eÖ\18\e½­Üä\bï¯HT¨ÊÈ ÚG\83
+²K\16ÏB»Êv\8c8ÍY±½)É8\8a\1e²\f:\94©Y½     g\9aè9uX¡Î&0ÊwQD±ZC«Á@¾³\1d-t\99ÇN\8f3\86ô\a\1aÛ5\18g\88±´ÛBô}­ÕìU\r\15\83Çì\12\1d£Nò¤Wuýx¦0Àé\ 1XÊ4\9dñìe7Æü\16a\99âÞÒú\99K&5\9b67\16]q/\83Ö"Ý\83\97SºÙ£²ëð]\8d£{\0î\11>G¦åsµt\98m¦pg"¬i^|9\83;\f\rgG\83\ 2Ôå­\87\1d\94õéå4\9d\9f\91¾ËU\e)+ß\ 3\eý\9aO\ 4+Þ©\8c\ 6ÍǦ_YâD}\81Û#Ó\10´9~À\1fñ¨\11\12{Äõ\10\9fá\16F\85Ü\9d$¿UtVi0£igÂÜY¥Z¡ã'Ï\11@"È+D&{/\97\vÃ\8b\8a\8c\98\fJªM\10\1a \19SZÍ×\e\88ì\83,Û©gQ\1d\1cØý<Á\1cn\95zH#\1c\14\ f\ 6$üjê\9b
\8c\14\9b\a|=:\ 5£U¯]\a\16\97\10"ôÊ$Y%¾W\ 3ö\ ex}å4bxH?\9ba\ 4\8c\16JøaPn×jaO\85\97ëÃ\ 1\1f\9dò<\15\9fRkGÜ'²Ï[jPò\9eÔÚ\9b\124þ°\1eïö\9d\0ÁMAã\ 1\1cï6ïõpÖqa\18a\92\f\14^ìÖ\16\15ItÒ\88G¸9ìê\1e£Qúà\1465 eá\b\ 3ø]ÿ<xm¢¡\9fÆ\87Ò3Ó<Ûm\1f¾\96\97.v¯ºV­W\f\8a\88\9fz¶0u\7f(\96ÉÓà\8cÚ\87[\1e³\88\ 2Ñw\vù$ \91Ö¦bà©&~k[&5Fv»\14\8f\1dëâ´\1eT3(Ú\19y\ 2F\92ûKÅ\94Á#z23S\8cð'ÒЪd-TuÖo\8cyDt÷À\15\8a¨epk\8c?8í¦MNTôº\ 3\18\f\80\96IÙum°Y·°\82³©c3}Ô*KõR\17ëY\ 4\1e\r©Bê?²®+>ôÿR\11`¢©T¹\90þ\7fÿïÿým\eÿ«x[\8bgÕ§÷ Ã\11g8{í(»|ýN¹\ 5X\ 4ÒEcÖk\97³Ù"P\99ê\ f®ºÝXf-¨\89ÏFë\82Õ\9a\183\9bµ¬A\93ìä£Ì¡»\90¯·\9e´Ô\8bý°À\r\87]\vBF$6L\96Æ\19;­ÊyZò_\99\19À»\9d¹2Þ\83\8bW\8aäW\83ÃÒ\ 2\98u'\ 2/\95B\1dª:÷y\1cY&\ 5kÝ­\86¦\1eH\80\8d\12ÎÏ\e#ÂÏ¥Qªax2\8dÀ\87\vs¬³Y.ë­»ü\8c\1d$\83$A\1c\96\85m\10=í]{\7fzIøJnÈv\91X(\ 5{A«K¼­\1fävî®\85· lô\84ãøHM\ 4ÌtÓðÞ.kcï\ 4\9c£VS=÷å^ Ë\90\1eÛ£O×K\b¼o5©\9f¼\e*Ø,JË»\9e\v\990}´\8dç\ 4Ù=bC\96s©Ý\93ª%Öìgây×"ssC$KÛ\e6×ÚÝöùº\ 3\93y¿%ÆM\15×ö½RÊ\1f×ÝræþZ\94÷>\81V¤FY¨ng{ýãæqÛ«wÙKªA6øzbîi\vv#´mP\8eÜÍöäKo\1a2ùÄÜ£!ÓÞScì\18Æ\ 3Uh\\89§à\ eº\1a8ÄeÝ\90 \11\àÑ#&6\ e}òBÝ4¶ Üë¼\Ú&¥\añ aèǦR[{è\11¡j®YÒb+\15C}8«Ô\r6\13Í\8f\17Ý¡¬Ú\8cQ\12+]N\85w\98rrC®æ¦\99Î06\95\ 3\9e\9f©\15\9f\81\14Û\8b°®\9dbäûÍ\ 1\91òÝnª\1c7s³\ 1\elzïÙ½ØÆ6\89ùè\87ÚE¥p^¸\1dÃw\16ð\9e¢ï<\7fÄ\90É\9dÚ\7f°åÏ6dréú\a[þlCÆÍü\93-¿Õ\90Q#wêDuñ%<ãÿq\vä\95\97ºV[AÅ\1d¢\97¾¥\1f=àØ(Ï\92ì¬\11OJ5½·¦/\87gm\13©¯W;§¨Ø.»×;å\8c¼Ù\12\19©\9e~åÅ\8e\8d5ÿ¥$\91ö¥ï¾\15õ\e8ãf~\18õ\e8ãf~\18õ\e8¿f´oEý\ 6θ\99_ìý¯õæ'zÿÃùï\8dö]&M.\ 4¿Öûÿ>\ 4¾ß¤q3¿Øû_èÍÏöþ\ f\1e7ßeÒ¸\99_ìý\7fÕ\9b\7fiÒ¸\99_ìýÿíÍ/ñþ/\b\81/rÆÍübï\7foo~Ĥq3¿Øû\7fëͯóþÏ\r\81¯sÆÍübï\7fGo~ؤq3¿Øû\7fôæ\17{ÿ§\85À\1f\9c!ÿ$üà\16¼\9cTÌ ¾ÊîPñ»\96Q\88\92'T\8f\98\ 6\95Ò\ e:;¸]µ¡¯Dê\9b\94Cú]ܯ)¨(Õ¯`f\et6oN\11&Ïï\97¤dç«?\88QÍvT7Ò±Ißñ$÷\15¼ß×*ñ*ºÂ¬Ô±óZmqt0\9b6.^ö ß*\9d«¶ÍwSê\ 2ÄrûõóP\90°í1õ\99\14æí\90\97\8b²Çl\94\9dû³%jÔÏIéÁ\1f¨Á5xg2¯+\92«\17Ý»×kÛ\a\v_\98µy\96<\12=V3è\83\1f\1cR\88\14î¡\95ù\92\9ce3-úÕþC\10¹Á\85Ë\1dz\16]\17ûÚ?IRKó¥ï¾A>¨Q]\8f£ô\fåüû\84i¿®\167+\9eû\ 2Ö:eugnÚ[$){7ëáÐ8DáÍÙ\1f+ç«äؽÇ\8e*\1eÂípwôøLñd1æî~ Z~Vþ\97\92d\0¿ô]\8czjÿ\8eº«\ï\13¹ýôË\1dºx¾\99×\96\93Þ¬ç\96yYQ:ß\1cÉ\8a¶-\1ar\rê9;\8ap|±w\9fúü\e\ 5O\~Î'é\aút3ö$\ 3?¶?[¢Æà\1a\9bô\92KÞ<ò<\eõë}7\86#\1fº\1c\v\17:\9cµÝÉ~°4\eì\eSÕR\8b\95ÑáDÙQ®a\8aý\1et\16\9eÆÃå3båÈ\96\84µJ7Ðý\8eì!Yá\8b\92\94V\7fõ\a_\94?PÓñ_ñw\7fºüóV¸\97ó\1eI=:çqº\ fêCì\ 1î+³a\12\ 2;º¿\13·\8f^ÿ°\1d\ 1Í\13¿ç8\8bË__:S=¶e\8aÊíDâ¾(p?"Éí\86\7fØ\1d5\96A\8cúÌŨØòò\18!æã¦\17©üÕ\91­®]>ê}uE¼¦;ïMÁÛ\87Üä\85\bȪBªã\99ÜA\9fél9£+4>«îH_dùOu}¿Ìþl\899¯íß9ÕeR¸÷xìZ\8f\e¹sX\80*\ 6\97ÅkòÉk\f\8fè±\16fy\8dá\95\8e&óÙåVc\r¿¨0µ&¶£.§\8c@²k\96#\ 4dÄ~]>½ù?\7fõ_\125Р\1d5ò9>jV\b+\1cð\84\7fÅe9°«ýVJÕÊݬ\18¼\17m!=¤W\9c\86v\93Ì9W\10»\ 2{l\ fö\8c]\re\1a?Â"E©y\9eìO\ 4\86\18-¦ô\ f\9b¿ï\89\1a\\18£bu&j\1e\95C°²Ó\9a£r\96¡\8b\93¼fî)Ìi­Æ\81·î\8cݬÓ\bcÃW\86A3Á\96vGê\96òfk\81¼\r3,ñhïã\7fÊâ¿5\13o\7f¢D\8d\1d[s\8c=B~Æ\9c\1fQ&¹Y\7fìw%u\7f²³Ú6\85d<Ö\9a\8a\f\ 6\86\ 3\9aÌè+º\ 5¨(Ýj\9a4Õ­¬)\92[5(â!ÞIbäï       \êãß"É}\80oüéG¢fºØ\8eZ\ 5\ e¼:¯^ß¼\b\1e \96͵(N¦æ\96µù©ESÛk\8aê\1dø\ 6y/\88c\92ß0É\9bã     q5\ 4p¹}Yà3ßYaj\8d]b9pº@õâhõs$¹±õç\87¨9«4\ 3õÍ\94\8c/íÚ­\bîFï\14ÁUñ;C\ 5\8bH'"as#¦4\9cÇ÷ü¼\81\1d L\v5úû\16Z"\90\16\806R\85\9bmØÉ\14:0vHu?\92ÜtüóÃ\ fKȧ\1e/'ç:ª\9eºäò\12ïµWüfUIª¶è~\9e¥\889¬H\98Þ\9d9X±1\b\11´¯>a¢¸zm¼yû½é\b©\14t\eF\19\88½x\19¨\ f\1d³ëGYÉ}«$¥nßøS7µío\8cÑ)kÈ~u^\10Ö\8fæ\98\ eÆ$@(u\bÇJ\91$ Î\10ÔávÿlB\81\89\9dÖ¡P=­Ç\97gr{\e\94;\97\v8Sö\17\8c\ 3G    q\ fX\8a\88ÿ\13%)\vI¶ñ%\9f/Fõ\89     GõÒË\ eiW~\ 6éÝ1ïa=½á\ eÎÎÄÎm"ø\88rcޠȱ®Óìà¬q`:8\bÁÚW\9fº\7fQ'{ÜSämÙÛ«]åº_òÒS:ÚŤ>ð³ýaù:g2\93þQÔo\90oëÍ\ f\9b4I¦ü(ê·õæ\17{ÿ§\85À7pÆÍübï\7f[o~\8eI\93\10øµÞÿp~Bà\97zÿg\84À·\9a4\19\vüZïÿ\9f½ù\89\aT\92OûµÞÿp~Bà\97zÿ\aCà»L\9aÜ\90üµÞÿZo~öé4ɧýZï\7f8ãf~±÷ÿ}\bü\15µ\93¶Bú!?\82´qÌy'3h¸Ãú}l/_åÍñTÞp\ 6q^~nHÒÖØÕ8­õ8lgâ]Ý]27e¿\80®{Õó¼}îÄÝå"µN\89ç"ãÿKI\12]\7fßó;êú\8cDõöË\f\99¬ú\bæ\8d[\8cúzÕ]^Í\8flu;\85ÌÊEa\r²\8e\1e\ 4º\1a\9f\1d?\ eã\8d\19ªÓgõ®,\10*Øç%/\90K\r4ú4C¨¡\10\b\rïçÈ_9§i3¼"çäYè`¾\8ar×êºRwï³ÉÈ>d\91µ       c7Æ8Û\92ª_ÏÊYã\114F}\15ßê\f[G{m!\84²ñj¾¥Zã\\10xgøàÞeëòEI¦¸_ýÁ\7fI\8cÊ\14bÔSì}(\17£²×G ;å\98SlÕϽ\88\1c\9dæokmZ½\1a}lì"Õh«©¤ÎI»¯½çA|\90\19uÞõ³{}ÚÉJ(3Îl¹\ýÍí¥jÈ\ 29öü#\12\9f\ fQý,\16ÿ@M\eáu\1fĨ÷ræ\8aÔ\97µ3+è£ÓÞȯ-\88رGç\8eh\86×Üûú­«¤\ fQ9WP\ ep)/W\97©´Ø½Ø\11?\83õ\90-\ 4\8d¤J\98¶K\88÷sä¯\9cT.æ´\82 xÃÓ$y\7fµ\14ºv¾õ¡\93âWk»`W9ÓÖ{¦Y\17O/}0{dÕ,Ȥåêmò\12\99{çÎËbÎcÌYþL\9d\9djõ!ÿëòIBþ\9f¿úÈï¨ä5\ eÔ]Ñx¶;¹\18U\ 62~yj×/\9dwwè¼Ziø\94S_¢]\ 2\bÏ`\16ðã\90Ne\935kd»qzì(Ð\7f\b»\14í²º³>Rgrz ø¦k\10ü¸ïý°$\13öd\e£òq \92çتFE\7f¶¡Jp\9f\16ñ´\ fE©ÚåZWFnè+¨³G\9b\a³Á\ 5öAntNûM/íî¼zÉÛÞ\9dÅ\95Ï\90E\93\81¥\8cB2p$â\93
+¸Ã^'.9§}¶?,Q=\94\13\93&Çþ¥¢=ÉË ¸ï4#ã\1f\85~²¢µGÎ\9a\93ó=`\89S\ 1|Èú\10·\94½Y,ªRóÖ>\8a}\86=       Ó©wâòf ÓØí"\11÷ê\83ÇÞé%\8fÍWËÝ7HÒ\9bÿûW\7fE}Ö\ fÏËj\13Ü£Å3}\ 3å]í\8aÝ/³Ë`¼b\8f^J¥ÕÕZâ$Â\18\8abÿŪÂ.Ê&\ f\8dñÙÜÆ`KwY¡.¨µ%\84LÄbï\19Íb\99á\98û9ò\19@\85bì}1\ eÔF£«F\8d\80ó\1fÛé0\15¬\ 6ÃúµÉΧ§"\12\81Út\ 4@26ã1q\0â\8c \ 1\ 5\89_ØÚ\81+´[j\92\98\94¨NÎà\89Ø\17\fö¦%\1aËð(û\91Äh\7f\97\125rjlR1\8eÒÆj°\8f\9a\v\a¼\99º\95ÂUÙ}IVrcåØ\9dÂ\83½ÅV¦b`9\90\1e\ 4§¡(Ï\15ȱ\94$&÷ts6Ü\92~èpĨߧ±·çQXæÄ}³|zóµ\1fD\8dº\1e£êAlRu¶\8b\9aÞ͹g: \7fá\84 ²\1a[ºrÈ^n\95\1d;Ìw\85y/»à@e\83°\9bI\9dfìùkËÔ\84S\12i\14\15ôx²OZ,1B \1aO\15S$¶Øx?I¢ÆÀ,þvCò\ 5EÍ.!\84\838\1c¯¸y:Ø°uð´wÿ\15I\9eÀ¤\85=Ø©s¥òfÄ\9c&E\90©÷\ 2\9c&\0\93¡<\9a\eÖ`\88ÇÚ¡ñh\81SøT\9b\92ØþUþ\8b$Fûû\9eï\92¨±4\vQ\83¯\0Q3Ò¨\9bÑ?cN>gÑz´rÝ}c0r¶)k\95\14\96A\14éK1hS×\83\98\82¼&\83.\86\10\81à¯\92\ 3ã³\85\0cÊv±Á²×Ú\ 6Õ\982ò]\92$!¿ô]ÔàÎ\85Ø\9aÝñcÒ¨ÏÜ\17\18\8f®GíÝQCÙÊv¨²(F¹t\87x¥ÈûA­\91C\89é\13\13l2Áç\93ç\ 4SYc\8aå\*ya0º.\8e¦\889/L\91M\10Í\90
+\7fûI\125ì ðô"4YOÈë\9cί£ï)Må´N\93âÔqY\16ó\9e[j =\8e\84\84Ó\ 1®¤çYì`\94*¨ÁZ5Ä"ð:R5GuØ\997\ep\83\8f\1a\9bKÃknÈ\8bÝÚ´!¥ý_òÿ%oÀþßÝß Q\93ξn%·èZ\rG¸¨fÿÕ\11\ 1q5ÿ\8cQ£2Âáª#)Ø:\r&#\e´2ÍÝáxt\1an<føÜt\9cÒ\vâòþ\vêï¬÷ú1=¦×ÂMʬGÜ6\aFuâ_H\92ëü\87Ý÷\97¾Tm\18^\10\aÍ·¯»ç¦Úâ\9c´6§Âêd\83\ e\85"3n\87\96¾a4Ó\82\86Õ\89½\9e\14ò\ e(O}\17\9cݬ3\98\17@ͱÞ'שS>\90\9b@þJ{/n?Gìã
+mhû}\ 5\95îÀçm±¼5z\14h¡^\19\119û¹BíÇ\b\87é\ 6ÇB£í\99\ 3÷Î\9c\a\ eRI\ 4ò·»´2Ð\8b²*é{eiMX5\16A[ÂoV_VYÄX8}Èü'\89\9bùâw_\94xÀ·\f£Ú\9b\19G5ë\14_[Ë9ïÁ\99Pê¶Tè²W\aø\8e;h;K[\99\170óXÞ&\8be\1aλ®\eÍ~ÅÑ©¦yÖüÊÊÕz¹·{\b&\a÷ÀYìå0¨AWõ±\ 5\1eJ\ 4×BezzÜ¿K\92,Çß÷|?ê7p&%\8a?\8aú\r\9cÉ\rÉ\1f\ 6Îÿ5Ú÷£~\ 3g\12\ 2¿ÖûÿÛ\9b_âý\ fg\92RýµÞÿp&\8f+üZï\7fo\bü\88I\93dʯõþßzóë¼ÿáL\9aùµÞÿp&c\81_ëýï\b\81\1f6i\92LùµÞÿ£7¿¡ÖKâ$F5ŨÞ)ƨ×õ붴¹²\87ÞÍ\8eËéÏ\85­05Ô<N%ÁpK\15Õh"-Gï\14b\932ÁÐ9\ 4gß9ð¥ÝY\rk\8b\8bº%:¾:zuÂýâ¹M\ 6·²6\ 5¯?"1çìÃ9\8djþ)æ\9c\16/\8f\0äß7uª\95¼\13óJ¦Qn\80µ\17§tk\8aX\85§Ë\1fkúX1\9aûîIï\0ÁEc»ëó\81×ý\98r\8f\9fÕñ¶é)Ñ«pWRª\1dJ\9bzú²³·×ó×%©\1aúê\ fþ@åc\93¾Ï1*T9?\ 2B|\ 5éË-Fµrís¯²\9e\9ff\ f\16\8a«\88;¢(\17\9bô=¶õ\8e[¹jý.ü¹z\ e?éÞþâ¢ÈÅ\94¯¤+ÞSÚôëHÀðiëÝçö\8fH<Ï\a\9f¿Ý\8a\88Që¥ë6ªS\157ìeO¯ \93\8f\8a×êzÜ93Gq~\92÷\ eléð\94;\9e:®b\10:wÒ»ý±¯õ\8fúM}ê÷«"?¦1â«ùܯª­¼HÈØEà¼\8c%\f¨{ò\bÖgû/å\83\1aÕÛò4\96 æÜÕ\9d°W;¿\82¹Ð,]á\10í\9c\9cL<\9c\89ÑFìüxÏ\9b00:\18gîáèô\9b»i\83qú¡Jùö]Yôw¡¼\ e\1eáÎI\11o\81o\96ÎÜ\8bÛ\1f9y \18ß IJõKßý\rõ*Du£å\84\fû\8aQ\9d~ñj¡RûÒ©UæÎóÄ£ö\ 1­
+VIvô#\16Q\17ÝÏ\17\1eÚÀí\86Êr\9aù\1c7e¸àï\9aååuÛ»\9e\ 3N¶-\87]M¦:\9b{÷µ\1f\91\9839ðÛâä·\e\92A\8c\9eBfÿz\ 6û\1ePôËå[çBùàÜ\1dI/ì´0dÑ:ÖIËD|ø®û|ÿ¡ÎgæUÞh¸»k>·\8eð\18\9f\1c>U\18^ؼ.¸´Õ¯\19´U+k\1fIRª\7f~ø.ù\ fj|h\85|T\7f\ eN¡ßi½\82·É\16}H*w.\1e)ÍÝ\87»I*º\9ctu,\9frøözt-ì®\8dÖ\ f\7fo4àóîÌ4íí\0m\99\ e\9bÉ£\80'\1añÙ\v\85\83)\83j\16\1eú·J\92åø\87Ýÿ\8dÚÈ\8fíÐ\9fv£ûtl\95üãhÑõ\b¾¼<ó\9d\ 2íN\96SÃÖ\1f©\9bA»í«ªÔè³\KUOb\ f{\1cy\19\f\93HcA¯mÐõ    u$¯YÊ#n3[';´÷C\12ÕÅM\1c¥\135\8eRòÅ\7f\92)\8d\99ýl\e³ç}ç>\8b·Â]è^ëG\ 1¸°i\9fw£Âĵ\90\82{ÕBÉ?+\85×à´£Ü\8b)LË[\9d52¼JcèE%\99\ 5`\10Ã"pÁ·ªkâ\8fÀ;þG\92\8a®¿ïù\ 6\89QÁؤ\13y\92Ô\9e³Qc83\9fÔ\90xÞ#´]¼iïLϯö{\90×!TÉMy|r\86>RØÒ9dò\90%×WçãvÛ\834îp\1e+L5Zɤ¿\16$\|¥öØ\9c÷\fl>\8cNØ<ïYß%\9f\94êßöü\15ÕHǨ\18x|^\82ãó1.¯\v\81\8a\8a\ 3\1fY\aÈe w÷\96m-\ eZ\94%µ½ùp51\18ôT!u,(ì±ÔR>Å\92\84°ès\9f\fTWâÐ<µ\14\11££\18\88\9d~D¢º\8e>\7fç|\16\99¨¡¢I¤EM:
\81\90\8c\81Ùõºý\10<éÔ\9b6\ 6¹+­@\9d,»c(^\10ä\f¾åÀ\81´cì~Z¦:Ë7O\8cú#\ 6[T$
\eK\ 6\81:\9c\8c\94n\9cò_\127óO»¿(1ê&6éZ\9dÄÇR\91\8a\9aiN{zrö\96¼±-}mî\99ª\9bÉ4¦Gf\ 4®Ô\ 2ßYí|LMêÓ\ 4\99¡0\ eT\14\8a±÷\15\8ev\ 1sû©\97Ä£>@aûã\83D\81Õ\96\88æb\91¶ß/Ioþü\10ÕÏh\8cJê1êª\8e\8d¦\84\ 3Õvb\9f\8f}WÞ<3&Õ\8aº\87¥ct¤\ e\vû\16;ãJ)\rdP¿\8eÒ\84p¥©nzN\11\ fòBâ\11ÂR\98\11\9f´]úF"Çü16­¡±?"¿sêæ(j\9cÆhÔ\8cnb°R\ 6I­ú9\1c\ 5G«á^\9eÚ<\å¥k­\92\17ö\ f¡ÊZS¥Ï4Ú­9uÅOkªKó(\11æK\b.í÷0\9er!\ 4Ë\9ae\ 4-¨.\82lòG<\16\97ü'I\8cö¥ïþK¢F\8e\ ec9÷£æl³~\88C\10óèª\8aZÎâ k
+\14ÝeòÌú\82âë\ f\16¹hy\9a\9aÔ\9bT\ f×\87I\11ù°\8bÍ\89I¾±ÄÓì~\81-ÝäUàfs\89\98éh\89T\86ö
+F)     \8cE\81þ¥$\ 5\97É6jÔ¹\18UM'%¨ÒÔG@¾g\9boj¦Ïò\ fYö6½ã6³ª\1fÙ:f\9c\9dz\91#@-\13Óôº\85Ï\8dR\ fË/\ e}´ÔZô\11\18®õ\91j&;\80±¡;Ü\9cwÚ8IB¶nô$\16nú#\125\96Û{\1c\9b­ò=Ó>\15\9d\¸zë\11¦Ìöä"\9dd ¶\vÏ\16Ù\86\\95ÉP,\98Dº@øxV\9d§Qãíç\11Ëe\8b°cNËp3S«n¨á£ºi_Ü\1aÄ\96·5¨§Ð\8dµ\10£®ù\10ü²$u\9d_ýÁG¢\86¢ÜBî\16=Ü×t²7\84\0z+\8dRz¾UY
+g\9b\ f\93&w($à+A; &6;#¨\15ÜàV\v\ e6Ýj;¹Ã\ eqÃ÷sý ¬h=²\85\17\18¡\
+\94rh\1a\9cê\9b,\98\9a,óÀþ=þ!ù\9c:\8dÈò¨`E\1eYi´W°±\99\11çg\7fÈ\9e\9a|\15ª(^@j\fZKs2L¥\8a\1at/2ÆZ\14Ú\16øòò\ e8O9\ e .÷g`\19
+\17 GâÞJ/\ 1×\15h-n«âb\94ÌÖ\96\19ü\88øUº·2[J·¯V4B\15ߨùâ\1aªR§&æu\8e¯s~rêDë­\1a¹¹Q\ev½{É,¸À'\ 2\0Ì2âÊà|yU:\1föKk-(K¤Ä\1e\96Õ=¢-\9c\ 5¤'YÏã\ 2{@ö¢A\8c¬¯K\92Rýê\ fâÁ\ 3ý:ä7¥önb32ç̨\vµké9Ü\98Múh\ 31V\e>nl=;W \0<\90ЪÒm KtùÄ\16®è\10\8bæ{\9fÜô\9a{¬@Ïé>ËÎ;.ÂÅ\82ó³\e\b\b\b\88\89ì~DâI^.y*"\9e\eQ\ráñø¯«öt÷¯Çýátr·ìyY÷Ð\82<roí'xÚÉ\vÒ:@îÖ\\87´v\84Ù¢a`#ÕÔϳµ­\13jû¤·\1ayGo>ó\17Í[?¯\9a×~ß5ÊÎ'e \87\ fÿ¥|P¿\813\99Iÿ(ê7à|­7ß\8aú\r\9cI>íGQ¿\81ó\13\ 2¿Ôûÿ§Ñ~\8e÷?\9cq3¿Øû_ëÍOôþ\873    \81_ëý\ fçog\81_éý\7f\1f\ 2ßoÒ¸\99_ìý/ô&ª\97*N\f¸JP\19,ªù×CT/W\1e÷03ÊÞr¹MÍCGêÀ½­ßÀiw\ 5\b\8c¶&\94#Ôc\95­\9b\ 6\86\9flý¼\81O:qê9       gò\8c\87æ\89OO£KþM£ügÒ\96ðP¤Lóö/å¯\9c,\8f&u\9d\87O2eÚº?\ 6\f\94¹-\15©æ\9d2áàÜmô\80SDP\98\9d\1de\ 5\13ZrʱjuM£\81\9fO:9[ÇÖä\e\8eF\93\8e«uÞ\86w¸-v·\ 3û8DJjuóe­C\9fÿ#\9f\94êßö|]b¶bì}\1fnFµ½\88\92jT§\ 6Á\83/
+\99\9b:õj×ʾÞ?Ó§õÒ\19÷-Ì^Ü;I^À\84\14E9ÖJã£Ñ8\ 41*\8d9\1a\93{;\87Û{\7f>p\vÖ?ô]ö©¤0ï&\1d\97]wg\83¡õ]òI©þñ!f«ÇVõ\93@µd4©\97\8cg\81»ÁíÁ\8f÷é íe«Wx²ì\9f¯´¼pÄT\ 6µ\15\19áÌ#ôØ\1f\11\9d8\1aÍZÅÕÛ4éjÝð\99\ 5O}¸\9f×\86+\91Ü\8f\8a\8chn½ÃÚø\97òWN_E\93\98ó²LÒv\8fÀ½¤\839>ª]Í\90ë]Ú£`á\ eókì\94&,Î\ 2ñÑþh£¶iàÖ,Fõäó!xf<5d\ f\81"½¦¡¬]\8e\ fÑ\95y{Ûm¶ua0Ë\1cþK>)ÕÿÝýOòWÔ·\8e$E\88r<ó_^ÃÞ2\9f        ö\19¤æ\97\7f¹,ÆK\97\ fLü$+=ÁÒáC²D»YÙt,\83\8eÆJâY\9dX\aw¿\82S®\¼H×Ýi¹\f\84 P5ù1g\1d¸×à |¿$)Õd\e£Vâ@}cq ¾U8)B\94ã\99?\18£¢ùT°ïQ\15\1fê\96\a^³´]\9dûÅ.qz\eºh¯ÎsÃ\84\81\9d£w\17]K\95ò%s\ f\8cû¦\ 4_PS<?^Ö\96\81õÏKÐ_è^çÒ$¢°Ë7°ÿ\97ò\a\88\ f-ýS\81(E\8dÆÆ\vÙÔ0Y©/x\9bFÕ7¼ÅÀÃÏ\8fÕù¶°i'\9aoö6À\9d-ãRé\9b\a±pÖ÷\1a»×$DÕ\ e"µÌi\82P\85u~"µmv5\814f½è(L)[\93þIâf¾øÝ\7f$ªOZÎï¨í¤¦Û(î¢Æ\10½\84>\ 5§ïÓñ½z+àÂàZO#Ð\856 Þ\1d\93eÝ*\8b\8c¡÷Î^\12ij: U¹2îË"Ý\19ì\ 4áÊËÜ~÷Þ³@ÝÐi«ß×é*\10É\94SxHÿR~ËCÿ\aU\87\92zI1j`ôùÙ~òéû.l×n\1a\9b\1f_OÍ7|aV\17ÁI[eíH,\1aÊáésûýzW\95vdå±\15Âl(p
+ÐØ2ÇÁnG#\16 RÍq-It\91ÔÌÞ\93\96þ¥ü\95sbBI±dÌÉsî³Ó\90S\8fÑ\8dI^P\1f,ErzÅÀ\1e|¾ã=Ñ^ã\9alt\81»¬.´\81(9\88#lù\1dÁòi\99g\193å°\94ë\8fx\92\ 6³\121¨¦\f¢Ïk
+Ñ_mw_\94¤\18ö«?\88\ 1ë§8F±FR\80¼\8ect\10£\9e$çéUÓéÇvw­\a¹³>ñ.\ 4\ 3»Q\13\16M§»\14µq\80\vûM÷Ê\89·"\92¼æ\88\7f+3\9a-\8dz$uÖ)\8a\b¶)\ 6\17+\9a\80Í.G\r\93v[\ 5\8b\8c­ü/%¦ë:¿Ý\8dJPÉs\8c:\1c\bQ3­\9d¢¦9H?ÄB¥~+\91ç\91×9ç\10'{ÊsÇN>Ç©ªÑa%âÉÓBä4I®°.\92\92Á\88;;%°÷ƦÐ\95AðÈÚÞ\1e\10\9dû\94ö¢K\9bVþ¥|P\7fç\14Ï@\1c 3>jÎ\ëI3ýè>\9f¾\8a\9cî\7fòiâ\12µN¥\1d¥E\v\91Ü#5\97\14yeBð9ê\81ÑîÝDÉAî\8eâ)¢\89¢\80z$`붤áZ\1d\956\8e®\1caX'\ e_\97$\ 3õ¥ïbÔVìý6\19£\9e\83\ 4?\13\87ñ\10\e7ÿV
+Oé\v\9f+¶OëMun\ 4\9b\82ÝûFê0\eD\98_}\84­æ¶0u\1d\99ÉòùÄV¼#\98\ 2v`´Àk0R¦8\ 2®¡(»ÁÏÒ\1eòÚ\8aþ/%vx÷ÃùÛB3\8dô2jVhúIÓ\91\1a¬\14Úòº5.\1e}<ߥ#s÷º\87Üc8\94è-=\12\16Ä}Ì"©Û\9cn×ÒK\92¯Àk\ò\r\10[\82Ó5ZLG\e¤|Q`\18íh$\»Eâ\86¨»ÉÉæ³ý~\89}>\8e½¿fê±ã\8bÓ¨IKØcü¤¹+nÕwÎj¥\9e\8e¾\19e\ e@\89\12$fÁ\95\84eÿ]ekÓ[\9bò\91â\80ä\8fò\f\7f]JslùÀçINr\81lÔÇ
+Fw
+¸qoÜfÓ\1alñX\ö\eä\93\1düßÝQ]\9fŨºX\89\1aAkøô<ws\83ê\15È\9dWHÜì\14\8dãA«Û¡ä\8bϧ°*W\9e\8ckÜ2\14k\15ËÄó(¶ð}¾ÑÃV¬1@KÅi\92RE*÷Ô\bÆ\1aîxC\96é      t]næPW\a\81u0\ 1¡\7f)qlÎN¿U\1f7éMò*\9d»¼«÷Î[oÞ2/[
+Ñr\95ìQºñÃ\93\0äÁ\13C\ e\9f\17òñ.<\88©'æðl£÷{q'R\Ôaì\9eý\94tþVÍ   1
+Ñ]\aᲿ\1eNfc0ô\a\93\8f$\95\90\7f~øV\89êá2Fµ¯©gw\ 3\96=¯W\7fZx¶_Õ\96Ó#"w£\93,h³Û\9e¡z=\85\14Åþç}\10Ë#ía\85\89Ø\v#\ 5ã×EfC\1d²YÈ\7fzy¨ßQ\8ak\ 1%JëQnS\ 1w\93A\15xï[\r`߯´¾U\92\82Ë¿ï\89\r
+ÚñÁ^{ÜJZݲ«ðÝÖ\14jS\95\19ç\ 5\v:\ 1P\f=ÖYr: DÌ(H*
\96\ e|^\9c.\9b.<ô Áð鯷\94s\a#{÷\0g9$©\17\0S"ð\ 2\94    \98\ 6²l7³Òj­ü
+pë\85\7f)Qã¶Õï/}#\9fÖ \81ê)£\9cLØe¿zjlóìaÎ\í%LÎ6%\ 2;ö;\1c\82c\84´akç=4d`m=\ 1\1aGp>½Ç\17xÎr\80ÜYpWú\1a?¯À7ä-ÍÅÔ_nÜ\9a¿¬\10ÍÇâT,üE\92$äß÷|]\9e\9eas'0­5tip#öí9zÞ®|*Ïø\10Ñ%ç\82¸Â̵\83"\ 4\93¥6ýÛ\80Y§æX².\apðª\1cPH=Å\154p¤¥EîöK¤½;,«\16\95¤O\11}\81g¡ã¢±]XóËxz\9a\93×¾ó]\92ä:ÿüpZ\85\8f·1\80çÙ=É´¨í¡=9²m£\7f'÷=¹\8aÅ\93Ö1Bº{\b
+\r\r\ 2ÕV¸\ 6\8a\0\ 6/í \84,ë9\1f[\10\13\83\98\1d5§û\14=ï<(nv# dR8ãZ\7f¤Oû& O\1fóÑ¿\15£¿b\¥òz\87b\86ÌÃìeUÛ\91o\ 6ü,8o-ý\14Òvñ:´\e>z`^\1f\ fWUA\1d..\95ùd~}f¦ó^Û_Ìxä°\9c\rk\ap\1aj»õT\ 4\85ÍtüB6\93\97\fÁ\93\17\83`\13¹\aá\93Ù\1d ÿKâfþi÷?IT\9bÃBTë\85¯¨úèM£\1a"³ñt:<=\89ìõu\7f\0ÍÒmA.[\9e\93ó\ 5jlÜ\1eaÐ'\11($gh{¦Ð¼¥ècÉÊZ9Å\ 4îç\83Y\0Týhx|<}\9daö±\14`çcéÄß\f\vÓ#½Y^\85ß%I¢+Ùþ\bê7p&wØ\7f\14õ\e8\93\vÁ\8f¢~\ 3ç\1f\11ÔoàLòi¿Öû\7fôæ\17{ÿÃù    \81_êý\ fgRÚûk½ÿm!ð\17ÔZv2û\ 35°þ@­\15o\v\11\8c9\8fjÌIµcέ\15sâå\98ÓÞn?\9cI2E\83\ 39F=\1d\8eÇ\ 2¯\1f!\1a;\1e¡\rï&¨\97\18U\f\8cê\93\7fj\14Z\r¾_>\9c\9f\10X¤ßQ­¿\9eÇ\94:\13Õü\97õt\95b\8c\17n\8b\90h^ËÀyt¾\z Ûs-ò4\11:¼=/\1fwVnÝ\95M\10~©Ç#®jGÈcLÃNÏ-Ã
\8b\81¬Ö7\ 3\19\8a\9f»Q·ìû®\8e`Äû~\89j0¹ý\9d\8eMjétR*k>Ý[åù\18Ì\91üMá\94d&}ÝÔrÃK\13[\ 3n¿æ`§\89ÓaíLù(Z9}©\98Åyx8nF¢nس\95i §¹kÔ\86\93«î\V¡ÖYæC%ê-®û\85qs¿(q3_ü.ª1¼\18û¼\94\8a\ 5\8eQ}\9d\8cêÓÊ1ªCãç\83»îòAºs«_\8fÖ`p!º2ಷ<vÚÁ\0cg¨H2u\1dT\8ef/Læ\9eÇJS<\1ahw}ÒÝaï¢ãFï®y©v¤\8e\18ÈßÇ£\0G\82±ùýò;'ÛH\7fB\80Åâcêm\92I  j<ÅÚ-ÃG@\òÁÌ«5üx\92<¼¸Q°ro»       v\8aZ;Æ^4k\92\88\185I÷\9f
+¢©»êÐÑñgãª7¡^¤
+W$\88\11\15G*\8bõäÁ\18Ñ\85Ïú÷KT\93åÝ\a5\ ePòS,I&õ§ñ\94õ²y\84½\&\17Èø¢î¯ëÇÁ§º[«/ÏÝ\15\8f\87OÛû;°³ò\8a¦\1eM¿\e[3\8eQ\9dÀÚÎáÆ\1a\17õ\ 1
+÷ýââzRY¯["ÑÓõ-\r\90ê×%©~ø\87Ý\7f¢fbTl\92\14KƨFW\8b\1a\1e2Ê0\1f¼«BÝ×\83ÂÐ;ùÜê|eÒ\98\13vÖÜ)e\1a\92U(ßT\ 3»_U\8dYå?ù41\véÊl\16\1d÷Ù\8bæH\9búØ\11\9bwF\17nÞüÀ?\82¼üýò;ç¾\97\8d\8f%rü[uw\80'u\9dj<§¦o!s[åï\13óR¿­"||­ê\11pio     Â\1d\ eí¥g\84­áNf¢ÖO÷DuÂâÒ~U9J\92Ù\19+;TOëbk~²\84Á¬¤òcô.sRè$\19¨Ïö»$ª\99ºô;ªÏ\8cãé\7f\88'u\9dJÔXmýÐ\87\98Üýy\1e6o\87\833¾Z\ 1\92¼.äì?lò´\9f^y³â\8d8íæ\ 4\9c:%-v\9f?>8©:mñ"     êâ¶{\87÷ÂÀ[\1f¹\99ÈJ¬Z¢vl\8e\85¶ß IÁåß÷ü\15õÍ\8f\93"D,¶æ2Få5ÿI­\82üc\84\9b\8f=\97g×ç~X ,C_Q\ 6ÉݨÃ\98Æ\88=\98]\90Rm\88\92bÛ5\93\19\810\14\1a\f÷.û[.\93»¨ÌºÖÙ1ÅG_¤ÍmGø~ù\83³\9dI\9e<\18&\15\88Ø'\992\ÊQãd_\9f\97{1\7f\8fP±é\1fµüÐkñ\16è¼Ú)ÂD¬\12®Ý'\ 4¦¨«\ 6\93[DìØ9\94\8fªC\8c[\94\r\821&\v\86¶ú#\91Â\8e·-\85I\ f!\96\88ÿHR\fûç\87o\90¨v=ÅÑj\r³Iíù0YZ\14\8d\1a\18*GÍ´wyv\84\9e
+\99\9a_Ù¶\a\17FȯO9\81N\9e^5<ü°9Lk­\8d\ 6$^WÜZ\18\8fy\90Ëî.\e\ 6:Ch<]\8d\b\92\92n<á\9fl\91ðyM |Lã¾U\92\9f\1fþ\8aÚ\16\aÉ:\98pìxt\175»Ñ%äFéT°Ôùòµ1\9eôΨ·¶àY\1dÔ\a3\bT\ eÑ\15\90\1a\1a´Ú\ e§³\15·¼÷\96LeI\ 1\1a%\85c\ 47\8bg³Û!Ac\11µÝá#\8a\16paÇñß/\7fpö2ñéIì'\8b`B±×iñS\9cÄ\94ÝÇÖxD·õZ.z\14¡÷ÝTù¾<^ê×åAn\94\17²\8das±?/Ìøùã5càÝsFµÞÍ91ð¤\15&çÇ\10º´[\ 4¢×7;t9\98        X\8a\ 3ùÿH2[ûû\9e/JT{]÷¿£®å^\1c u(jV\94mÔ¼\8eÜ»<½Ý}¤tÊ]nçnß>N\80±Ñ{3SEßkIÎfwí´'Â,o\8fYHVÇ\14µÜ\8f\88¡\13M°Ìj6CÖJ\1a\80áí\vÝ`VK\80áöXD@}¹ý.I\12]É6ª\17ã¡CÍ\9fÄÞ\17õn\1c£- jn\>\f2Y#X)\9ewmÚ¹´û\92_\1dÓuS}mJ4\ 6²\ 3n\86Ûðq\1fpàm;¤[#x@\8cÞP\1fËÒö\b)C\83ä\91ÚW²&$DÉ!²fÝ
+\ fQý¥´Áö3ñûå\ fÎalÒ³ÙNê:\97Qóø`î/ã\98\8c:ýÚD1Ï"x{Úf\90¯\18|Wj«\85ÀêìX'×á\81*Þ¦/íA\87\b\83v\aËi£.|\1aJýM\8b\e\8f×A)·\ 4ÃÌk\ 3\8eÁ:\ 3D/TY÷\89¥ô_\92\14õýÃîÿ\92¨Þz)ña?OG\8dúµ\19\1fFè<\f*.v\83r }\19h\9cb[eÓ;ö\ 47­êÚ¤ 1Y·,,\97ó
+ãnÊÉ\82\19düU\1dÏ\18¥&Z\ 2¡\ eÜhØ]èªl\ 6ë\80ìNÖ\ 3\7f°\ 2ÅÚ\18\ 1Çî\96\ 3f&-\7f¿üv7*§Æ1
\93\85e«QSÚ\8eïóélîu³9àT\9a®9ã~7Nª\81,}\89y?\1fÂ\8aÚ¾\18²ÐO\91ãZ.\83/ÔU\11\85\16\872ìÀÍÚ\86|ºñ\18
+Mª#õe\1f\fßãä"\r\83\ 5ðz\10\b o5æû%FLn='5ÝÍt¥\14[\93h_\9d«\=é\97êðØ\9f³ÉõF=¶\89\83Ä\1a\r[(ä\8f\8d\ fÏäØïøx®\82>Ѳå§`·\bd7\94\90-@ý²TZ\v\ 6îÚÝ:ðF\92¤b­;\02`w¶:\14\97à?IÜÌ\17¿ûH|¡/Æ\17Î\ 1w\8b­9Ë\ 4«½\169*j>\8e¬<ê\1f\8au\8d\948~-
+ÅLùÀtæ¼F¼×\v\ 3Óé­\8b\9c:iÿSÜ\99\1c7·C)©ët^`´$RàT\ 4³ÀÞ\1f\14\80l­RZ\1d´JmU(VÚKC®\ f¾_bkÖ\95ÏÕóf\9f\1f!ú¸\9c·;rwô½xþT\\12}\89\9f\89\88P4\17\fÓ\9d¤·dj`ì°ÒQ\91\11Ì\18\98\e\86\90mhpï¹ëñο\803nï\ 3\8a\8e\ 4@ö=}¬À~3Z\15\1e­ÔrÓ*&\8b\0-Ëf±¸@«¹ê÷K|\18\r¤¨é\15ôksÆ`&5¢\84\ 3¨ô\9f\12\1fé}¡´Ý\ 1Lo\0&c\ 12Ým\90XYkrHsÅí »fJë]u¥\80óÝû\0¨7ß\é:k®\8aoè´4Y༬<FÞâDtüEÝ,\ 4óó¼ð\9c\13÷ìû\8b\92$!¿ô]Ô,ÓÌm}\10WVÝØv\ e {ÜJBaó\8c)\17\15¦g£CâP\10A¬bí\11ø\9a~\90ÐvY!ÁÅ}M\ 2\80TbV\10ç\vKK?$£ÎeõÍÊ\v\87Å\95\ 1\1cæ\17bªÏ©bÿ8o\9b£ÓÌ\9f÷Ï36Ó¿~¿Üg2?2Ý\1a\97¤»µÌAnÇ\94E)¦Ì\9fcÊæ\9b8\8cÈ\ 6V5JSØoQ\104él×`\8e1ÁÕæ8\81\96(\9f\81\17\ 4i¡sÏÚ\11sz!|Ò§ì\8c\eCü¬\7f\9dòÓ\a3\15§Ûj_\9a\8e\9cQ2ñ\98D@Gû~1\9dfàj©Ûä"\ 5ÓÆ@Xß\1d\9aaË)\8dÌ\bc\1fuÖF\ ef[@s½\9f\13\92\0\f\96N\93\19,ÈÓp2gÄçt\16øÎ|6¬íWÓÐÝÿ\99\93ô)\8e\1e\80%ùOb\92ƧÔXmNÙ¯KÜÌ?í>¼\1f\82"·¼\9a\11S"}\86-Ik2Ã\87lL¹Òá\9e÷¼®\17©þceÁÛhq¡Û©9;xçgÂäR\9eî\16ûÚä­    ÍÉ\1e\14:\93\8c\89\89Æ\a\18\19\8c\81*2\1aç\1dh\12\v>\e\19\00\1fA\ 5`5*ISàû%ª®\84ET\1dUµ¨ZÀ?ÕÝÕÇ\ 4\88j5>\9e\fôÏî\13\aÕ÷ý.¥J·÷dÙösÑiâm\9eÃÕ¥^36®\a÷Q·\83g)\87¥lö$\f@ö4Ôg[ûÙîJ¶huU[ÜÏ\8eö¤¿tìI\8d¾Yé×2)N:®\85´ÿ]ò_¨ßÀ\99̤\7f\14õ\eÀþ·7ß\8fú\r\9cIVýGQ¿\81ó\93Lù¥Þÿ\82Ñ~¶÷?\9cq3¿ØûÿÛ\9bßQ\81\1eóî\8a1%¼\8e)ÅxÖº¸Æ¨['õè\17Ê1*¹iùùæuâÁ\8d\15x>g\13Ny\819·aD\9d\1e©-s\12\96¨`?ÉñÎ\16ß­äõÇö\ 4©\1c¬w¶nZ¯Çø\1c\v÷0ó½z`T!þò]\12U±ý2ªâC#\16£\14#±IYsû[>-8=ÝA&F\ 5\9a\85ÛûL4ý<\1e\8e<\18ÃbÔÅ\ 5vif\8a;\ãA\9d\84Û\96³\9fárkOÞ\15Éz#Å\83%?Ò\865'\8a\8e5\a\a·\18±x×\9d\ eæ\1d|ð~úH\92RýóÃ×%ªòÆ*A=FÕÃ%FEH ÉõÆSÖ[.æDs±\1d2@!\98¢JÃ\ajÅ¡\a\a"p>Û\9f\15ü]ú
+áΠ\11\91ÍñöN\1f\8bÖÛ*î­ù=Ô¬\f\10ÚVf\\8fG\ 4r÷©;SÒ?°-ÇQ\9e\87\85ù­\92\14\&ÛßQ\85yü×ý]\89\rI.\93ÇøÙ¨^.Z±\f¢ÇM\16
+\81Ô\89bT¶Û÷\90®¼<_ÊUÄeÆ;ê\14æ\1f´\1d)4o§&­\9dµè\ 5{+#\\8fæ¡\10$\99Û\98²ø0\90¼~?øÛçEÙá}s\9fMÙúwITU\9døô\7fX[Q-\9b\899÷Ì2\9eª\ 41çô\93ë\8c·³gØ\1d_
+Aä5\e¾Ö\ 6{\9eå\9dç\97\861\81]fk\90§\10È2¶ÄÑ\82¥\94bÇg3WÕ\ 4
+ºiæéóÕ°\86úCëäòWe'\8clù`kº\ 4\89Kõ?\92\94\8cü}Ï?É_Qû\8djlMq\91<\eOGuª{\8cê;ô\19Òa¾p\1f\v\96Ë\1dû×ò¶8¿4\eðÆe³~òLá)<ÔbT\9b\8bQ'-Ù,\8cdõXNæîPmW£\ 6y_yÞ\17\8e|¸iÆÎ.Õ\15Ñí\85ûï\92ÏÕóä\83QÕÁìø`oǨoq\16OY^TT7ÆzT¿Ð\8fðª¬\8awqn5oj¥6¸\1e}nqqg×\8dëÛUÂ~\8f
+\94©¯[\8ca{kNo\9e/Ûí\8f˪ 7\ fJ\94Y$! \ 3\1c\17S¶[\a±yÐåmÇ#wß%\7fåd'µØñò,y:\9aHJeµ¨ÑP\92\8bô³=\15\8b÷g©Ôº­6ÀÀ;±Ûù\99>]¡Óôº\87Mh\80"FcDbZW?àê\18Ì\92JJÝ2²ÖY\8aÒ±>;ìjûôaëáò^à6«\1d¿ÅJÛÿ\92¤Úî\1fvÿG¢jð\ÇÇ\12s\8aQ\87\95ØñÉ\83ÜF\91LJP\ fQ\ 3sï!\9bb²Á\9by×ü\92:ê^.µíÄ  /&`\15\vå¥\81[éd¶v¸£wPy=j\9b}\8eG\11\86Ø®^\94\95\11Eáv\84÷ü\96/\89\9c¤û\ 27#¿S>\9c\9f\10ø î'\95ä\99óqìó"\1e5V´\1a5ÔÛíqWÈt\90ÍÜË×ÚpÔ:³[mb\1fr½é\11½Ù3\8dkb3åýFæ²Q¡\17»\93\15\0Û+3\87\ 4îùFùííÉpÒÙO\12]¬òÞñlîÿ§íÏÛUÕ±poø³Ø7`ß\v\ 2\8a
+\82\82\b\88""bC/Hôû?0÷>U§êڵϬ·®÷\9f\1f\8b¬µ&÷\1cIH2\18\19¡\85ÝöR£·ÿ\15@-\97[$:7Iíß°jÒ@/cÐ(¶\18Ð\10ådÉ\1a\10ÔÉ49pP\92Â\92»\1eÒMkdî\86·\8aé\f/Û91Ò\ eZq¨\96Öù±ò4Z¨¼ý`¨\18\17}b\87\rع0­ÌØí¼F\8b¼Iv\ 4\9eju¶        ú\7f\89ä1ÿñïþ\90\89iDÿ´\9a\ 6!\8eÓ`É\15h<t5î\f]'Ìl\ 6¡\ f5üÃÇJóA\8cê\9d+ËÒ\9ds\f\7fº§ÂÆè\1dêÙ]:\87\96\83þe *b<\14ÎÄ\fÙV(\80óð,Xr\8d%à7N6ÚnìWÀ%\88þ;üSçÏèù\9dV\92eµ=L*~L\83fÖRßB|\7f¼\889ñò\98r1g\8b\9cZ¿\99\99\12L\9a-\r\ 3ÇÖ\11ΣÍ}\97«7EàamAïH=>\19ë\87\³y@×¾¶\9c±¡±fÙPù9\1d{Ýst~-\14¯Ü\7f\ 5P\83\8b\89\98ÆuÎË nÛý¤â       
+4»\81\12E\86u\vH\7fâ¹Nk\9a\9eYl!'\1a2\99Â\ 6ÖÇ\85\1a\ f¬¦l>¥º´§_õ]\81ù6ø»ÝinøÙ¡ÇFLkÈ\1cª\ 5\9cɬZÔêT\98p\8crZn\988Xÿg¤.Õ¿(þ¿¥¶©\12h\14Þ\89ÔÇj     \9aÛ\92\12\1e\82\83î\9bþÚv\82ò1ó(zQÁðü^E;ù«ò±fTª²$êÕݹµ¯náÎ\19\ 2Û\9e\ 5³{hÒb²È»GëÑ\ 3¥®ÞcN-\85ò\86&+õõ*¿\19üw\0µ\1e¼Lp±\92¾´)þñ)"Û\ 3MH^Ä<V\12_ÚJ>zOU\7fÚ2¶\ 27ZÚeôxöÌ\9dÊÖ ¨tñ[Q<¡Ëâö\16\8d¿GK¬R\92+«éþ\ 3S¦µo-\19\8a\19.6ìvºh7ßܲ.½Óa\8d\82ú\ 5ö¿\ 2¨am
+Ô(ÛNúÒ6\9fÆuv@sy%ß\ 3\ 4Æà*»Ý\1a0\9f\84\v½®|·\93ú\ 5Îù,õ98]/#}<:'\98\85z\96ã\97¹\1c\97\99F\14)Z°+\vÇÛ6æ\ 2\93\12Ïà3\90µ×d¸üpsÏ}¯ÿ\1e©Kõ_K\12\95C:yCe\9d4ýq6©øV\13\88\b1T\9e{Maµ¶>\1fý|{Ø{7\99Ò¹/õ¾¨D{IY½wÆ\f\ 6|\e»Çk¤n\7fV$ð¿T\9d\e¤\rzÑ%Í\12)\9f\99ÚìpÝô§§\87\88O   æÍNO³²0S´\ f÷_\ 1Ô¶Xº#ªî\80FýôMº\11\91~ÈO\fÊ÷|\1a\81\86ÖǬ\93wx'î\r\11H¦6'»öa\9bw|)ÿ®\aÛæé\16¬Aé\10®\fõø¦\1a/\1f,zw2G"æ§4ËÍ\1e\80.}¢Âx8~k\ eÖÉ,S>\10¤ûs\1eÁÏõ·\0µã\9cù#¦»±ºÇ yå+¯©ð)Ùïæ¥\92Hl`ÆhÄ      Ú¢6>\1ezÂS\93\8aÕ\9f\84\19Û\16èÝÖÇZõ¹ºÆ-\87j\8d7Á<2\9c\88<ÔéÏ\fW[ùél\9d­\10\86\99m\12U\18\1aâ·'1MàrØój)¿@êOûÇ\r¨yÛu\1a-{\ 3Í\f\b¢÷´\1a¹|nìÞ©\9b\913F\12\8ejUºK+Q%æ¥Rñ¾ßvr¢ºÆ¾3mE=Ö\17ª]{Ü\17\83gÃ"\ f\81ê¦>Épª\výtX#®d!KT\8fÙ2¾Ê\15êxMª÷0kDb\18\v\ eÔ\7f\ 5P/k\1ch\f\96zÒ6û\96\7f[·ÔG¥=L'·ÆH\8cr\1aT\19\ f\94È\81gâU\ 4\f\1f\1c\93_\8c(ør2\a   \ eK_x\1f\17ÃãæB\1e¯93Ñ~~LçIO"Ìþ(À\1få|\88¯\8e¥/f½>9¬5ÊV&®\v5'<?\1eü \rQüÇÍß\ 3Ô×ïmbÍÃ!<nHáY°ü\99\ 4]\83ö\83¼²\1f¶Û¢\89%?ûµ\1fPëi\16ãV«õhKu\8cUÚÒæ\8a¹Ý\91x³±\9f\15O\8e:\9dÛªNP7ÖÄ\9fùÙ\13o\8cG\ e¶Ù6}¬\r7£ÉvV\ 2\93.¨çÑ×aPý-\92Çü\\13\83ÖÙ\98_\9cØg\9ewkF\ 4UÉÓ\83´\feÿ\1a|EÊÃ\e¼T_#ë©«ÍW\f®RTWt\99ùá\92ef:;e§\8b æ\bÚ¾íðçW\92ñf2\87Ƹ5~\9aøæÏÁ\9b\13\ 1ë\98\93~®ÿDC©ï¢C·ùBb¾\1fÿW\0ÍÎ\98xLm76\82\ f\93I$\92K\ 5¹¿u\11>|Óíq\89Êna]<Ì\e\12\10\e\18A\10³9|\99M!\1e\99ãvý»ÄÜï\99ƺ}\81\9dìÖ\8bÍdP\9e      ¨\8cõEt\9c\e)\b\90ú*r\18\8dÎ\bê\8e®HfÙ¿ÿ\13©Kõ_Kþ
+Ïì\86°\r\81Ù<´ò¥\1d¤\99\ 6\16\89JUæ¥ZtK$ÖÃUã&\15\96R¯Z\9fçN«öôF½{Dã@\rð6ÓN¿ß`½ùw2\19â\ 6\8eîei\8a"-a\8e\1c©Ù\ 2ÁàÅ
\9eqv¬\8dPnL\0t;.ð¨4ºtñÃ\7f\85´ßôÚçãé\8a¡'eäÆ Q9B\13\952».*\9e\92¨DnËáëì\91³<xMáç
+à\·\91Åzï°\88ƪZAѼRGTRh!9\93Óþx\ 6³ã\91ÁÎÐÑ¢9Ã\92Ç\8c*W\94\18Þ\96(9¤³£å\10ÖÐÕ\7f\85\93Á\1c¶Êà2\16EX\ 1%~hA­Dâ\ 6£\1dÊ_-\94a-\9dÜÎ\fr)\11lã}Ä\84Áæ\9c\bl\eÈW¯<\91Ü5´Ç3ÈñG\ 6s\vG\15G}\ fo\9cú\19Ò\9dSf\b\a§üà¹;\14\aìàP\1e\a¨ïìOõ>\87\9cZÿ\86ä1\7fUüO\0¨}¨\ 2¨Ó§\ 1T=?\0\\92`\0¯ád\15(Ï÷É\9fD+~\98\14\88<TÏ¿"¿P\r\ eÍcÛÇ\99ÞÐ\9b\89\84ô\0AÇüÌæ\ eE¡+\a
\eû1kní\15hÊv\9dï¨v}\89_,;K?\13\18¯Ç`WõnÇÖÕù-~t¦\13¨ÿUê/t¦\93ÛÿUê/t&\8fù\9f¥þBg\1asû¿Jý\85δ üÿ·ö\ 1\84¢«\9f&\80>\9f\0\1e\9dk\0Ö{s\0[\9bDª~|Æϲø\89<Å-¼Þí\16\14LJÇ\8e\9f\9föF^ñëcî"¯\92έLS\ eÜ\e1öCªmìº\9b\17ìú¡º·ìnM³Ö\8fÎ5ÁÏ)XO¯!½\93§\9fls\9a\9b<\7f\v\0!:\94Je\0¤|-\0³Ï\1a¨åçÉz¥¶\97\ 1\1ci\89\99õÇ'òK¥tEðzoÆ\89Ô\99\99HÕ°\91k|CܹÉÜÌ\81\8f(e3ç*k7J\19Þ²\ f\19ÉÚ@\99£ÕÒJÆÓ\ev¬D"û¾}ä»w\9d\ f\ 3Îì¯\7f\85ôÕù\17Å\0\9aßa\0-f,\80Ü\8a\ràç·\91º{IPõ\1f\ fz²ºÎ¿À»}\1e\15Ãá`W\v&ÏWÇ/d©±{mÇ\89NK\9aÛOªOÛ\r6\9fNÕ­\rgm­vÆÚ?½\95uzn\vàöäãÑë>\8e¬àz\91 ë¬(óì}âóo\ 1 \8d[\ 3\10\93\ 6Úv~VÒùJãOw¯`JÉ\9f<\13Ô\88\ 2xwr³B8<]kÁQhuýÂd;v\97í/îк0·Y¬C[Î\10l¬6zß=·+ýð쾯\97Çk\1eØ÷÷.\13\99\85°å\\98\1d\95nZ:÷¨\9b®\r%Nû-þ\94ªp\9b¤\81bnbÃv\9an@\9c¥Yp\85\ 4\9f\9dêñ\9b3Õb(-3i,GpüN\12«^/\89\82;5=±j³×YY\\ 3ðÏíý >^6\7f|\88ÈÁ|\füèeN±±wy\ 4\9bÇyëùÆ       ¹vT\15\vÀá?"\ríý×\12\0í\83ÿ#\95¥¼Ä\86H"õ&\12 öõ¶i²\89+¨g\ 6ÑÛ]\87\850j\8ejÁ÷·ý)û\1e»æ\10#\9czþ¼°\9bÔ\88yúÊ\9d{\f÷\83ô»çí[Ë*·,ðÎæ´\97µ.ÏÌæyîm\8dD¥Û9\1dg\85Ãþ°h\93Òo\ 1Ò¸]\0\19\12\aàóÖO\1d\93õ?\9c)G\1cÔ\91\ f\ fê\8bnòO\16Ëðí¾áB(Ï\16p\80ïwMoQò\ 6\ eÃ5&\16ÿYLïà¾\9cÝ𭹸\1a|\8f6n\83ïæÂøOIwjáY\v1ÅPÕI^;\16íÝA¡q(\9dÜîYÖ\13~\8b?¥:J"õ)zi^\8c\8b{\92¦\eHãeÉKl/VA40\1f\9fWvR+zW\95\80ÒW'û\10ÛV/2\ 6÷d\11;2ËØ~l¬º9LwÛìì,ȵ¥6ÊÞ\99\13\12ßw*\9eqO\87\ 5B(ûgø\91dîz\14¤ »Ùþ=Ò\80Ë\7fÜ$*ó\8d?¤Ör\97 Í\8cPKwG§>Ôz"5^\9dß^@º!ÒÓÞþEÌdݺÞ-[A¼iÞq)ß¼ÞZ¯Öe3ÉuÏ;\7f48\81ëi¬âN\17ûñC\v\1fòPmÙ+\85\16ʲì\964Q
+&\eA\94\em~\a6ßõoñ§ÎøÌ\83ZÏNó\8d00¨ï_èϧ\88\ 6\8d¡¬Eá û|åØ­ïQïøã´I¢ü\98XNÙ\Veè±sø<Ü,ê'¬¤·\8e¤Qè*w}3دá6*ó¥Æ\ÚeÛ\9bD\1dÌï\ eó\98Ûe|g#\10}%\r\19ù¹þ\ 2\89ÊjóO©\98\17¤[y¡ô(\99q\9aW\94\89\9dáé\14Æ\97ú-(\95¶®Ë*¹Ø\92°zþv9ré\91\14Æz_/\9eåL\:áµ|õX\19Öa¥\1e1u\99\7fÅmñ]\15ú;ð¦'»ÌW \ 4\ 2W6[ÝbÙ-)³Ì¶<^ü\ 6é\82=½þ!\15.Þ¶Iwʾ\92n´©$ÖÌ&R\995\e·cY 3å\8fîW\ f[ËáÑÆû¡:'`Â3ø«¿(;«el%\7f\\1cä¢ÒðͲܣr\15\11éÐ5ACòé¬s{\81\83\ 1o¶2S\1eÚÖVÜ\ 3KÀäJt
+ê·H$6[\0n8éF\93B¢s³¯¤q\9dCÐÐvé\àÝGWÒ\v÷³'oÅ\1fïöî^yÝK»Idp\1d'>#Í%PËxû£¬\eµ¯Ü'\91ìîk\b\ 5ajW«¼\19\1ej\1c³\v7\ef=Y{Î\95NpO`è\8b\ 4×?\90ºTÿqó\1fñ§Ô¡\9fHõë\89Ôý±\9cÆu&R_':\923K! éìÁÝt\1f·çG¾¹æjüñõðM¿Nç,ôsN!Ót"9øZ±8ɾ?B\89hfø\1a,\176\·UY÷\9cl\93\1dÞ³CF\19\10\v&^­\96ìp·\9a'X/~\8b\9fO\11\8d~;yéçÄä%ÚJ¤^\8eŤâ»}ÐìZËð°\9a¬}*\9f\95\1c\1f+\\1fÅÜè~ma\9a}Fo5÷xÛ\9bÞÞ\87¤@üÈ«\97@*Û\90¯\97}°é¸\93,+½½"\93éïS\97ê*ßÚwéÙÖ#èó\rZ¬ðvw¾Rç\ 3ò·H¬\89v\0,\15wI·où þ6\13\9d\ f¢\17wÄÃôuzwÓcD=F\87\ 4[b\1eç\eåf®\17±9\7f\9côsd\1d\9a4cK±1rwE¬åñ\f1ô7ݧ\102\9fA\10¯\bz\9b£®Çviy\97Ú\8de½´A\97«\91\16Ï7I]óÙÿ\v©Kõ_Kþ\r\7fJ}6Ĥ/\r<ШÛyÐÌ.ÛïA\91G\83Ë~LºN´â\9e§ê\¹:;Y;\1f\1fEãøè®Íý Õ~\88ùU&Ýï¹­\15_ÖF(\7fmæÛmº«bå\14RЧ\ 5\16¶T,Ì=¾X\9fw_È(Áe¾hM.³\85u}ü\1a\0\9eâ\9d\9fÑ\13Ƥ¤;M\1cÐX}r ¹\94\9bág±ìûte\8c:\83ñ\8a¹/ɯx\89ÚãÃÉ\98\9f\8b\a\17
+¯Û»'_7ÁN¼±èÙx¬J\8d¼½|ꤻèä 7)u\9e\99\992ðÓamúUàþôk\98ËY\Ôæ¤8ÕÈß\ 2ÀÌ¢ûÇ\ 6©ú\85´\93\8a/}c÷ C¯énPs;Q·ûÔ¤Bºð0[O\85×3Ï·x´jôQVè÷iWY(gnË\12\88Ì/«òR¸.­oô\98\aÞÒ!ÇÍz8=­Â\f¡ÏÃ
+Av\90>QÎxKBÏ<¨ÄF\97Å¿!ýmþ¢ø\a\0Ö\84>¨y\17\194
+ëGÒ\8d\9aQ´/v>\1e\7f­ìë\ 2ß\1aû6~Ù?jÌ\89\82ö[e\80åEqöÙïyî2RÖh·«®\16ù\1fïàÒ\19²ú\\8c"sö\85yk:]\ e\ 2¢Òèeq¸\83@\18³Ûô°Æ´°À\98\ 6ÄâÐà³ú-\0üP\ 6 >~ÿ\84Ä7V\a\13\99\17Ì#ùaaYèa:¤Z¼ Pfxº\8d^3%¬)\94TÌ,7Û\96Û\16Ö\9f~I\]\1dH¡ZeL\9d˨t\9e\9d\90¦9-I®\8dß'×\bcã}vâ¢\ fxÒy@i¶\ 44\10\ f4\1a4\qÒvÖÜo\ 1jÙÛ(©xH\ 2ͪ¥\85\9fýáhGÎ\91»5ôÞí\82*QñD\9f_mE\12Ω\aJ4¸5Áû,¶Xc>ºZÁ\f±^n-M ¿Í\9c4+\ eÔ\13A  ¸\817ZM\vkÃÕp²\1d\95\8b\87Êèà5n%8M\90·ÔÙ ï\19wø+¤þ´¿(\ 6µå\17\ 1\r\8d]%\12Ó\10ÔÙ\8d       Ïô%£p·S=gg\94Ñ×\80ÅeñÔã\ 3ê2Yãï'¹ª\1d"jÙ¿×\19\12\7fbìô\9a\89\ 5\82Þ¨iÝà,Îj\18×\1a\19\13\1fë<ÑpTòPÑm\ 2\ eòÈþA@\bÂ\9cú\bÂfðß"©xj\92XsIùð¤\92¦f¹C̽\9e¨Ì3ª\8dé·ýgn¾EHt˼XÉvÖ\ 5\11\1e¯êú"i\80ÎiNjå×rzu\11\9aX\rB\16oÞÒ\90N}!M\ 4\ f\11Ü?££YÓDbз\11´Û  Æß\17\9az9Æ*³*\8eñÆ\ eú-@£ÿ\9aøfF\81oµÚ*¼ Ô¥¢n¨åf\8fm4c÷\84¾!?ÜwKë"¿iÒ\ eýL[Ú"\96ª\13R{\8f'Sj¶Å\88ú«7ü¹¿\98¼ú\125\19¬¹5*\9bô\16ùäp \99\8cF\a$ã¢ç1\ 1u\8cq^ë?Fútæ\8ffñ,ú\8f\83ÿZ\12I\1eÒ0\1f®v×\ f\1dä¡6ã\ 6¼Ïm¦«\1d\9b=«\¼\8e\98\f@¢R*,\94á½BÎ
+\83ú\14~^Z8\aa=¬·ÿ\ e&Cá\89 {ë\8c#ß²\94\8e7\b\86Ñ\8b±&áôxÚÄף˲Ï\8fæ\10*\8dÊ\1a~\1c\9aÃ\99>\Æ\vó·¸A\13X=\7fר¢ÖÙ\91.\9f[~z¬Û®¡õg\9cÒâ·ì"ãi4W\e>\17H¼pf\ 6y\ f\b¶9~cþî\9b\99H\88\91G\15\© *ÉÖ\90\9c¹h\8dg0Þ\1d\19,:\1c-\9a8:¼ñ#|HC#r\b?Pjð\9c¢Ì a iäý ¡à»ßâü9\9c6G«Jð2&t\15Á!ô
+\87xåa"q» ÛOg3W\91`;«\98c    w¸Çq\12î§é\9eÂD`ÃDðRø\18\9f\97¾;2\98³?ª8J\98ºOÁ\10\ eäLê9-\fØÁ©Òwö2Ôç\90C2\eú\9e:=_½\ e{\ 2~Gþ\1eÉcþysd¢ý\\9e°SJØ´ôçæËó\1f¶rªÀ\94Ðì·ç9uÜ\9dÂ\ fq\98Ø\10\9e ñÑ\98\16Ëñ\fBÙÑ¢Ñä\87t'³\e<\85H\1e4"÷Ðwd÷Ôo\7f®é@Ðó\8fw£'`÷[¯\9f³\9eÝðìº]iæ\ 6\9døjE     ¢Ïo\ 1\9d\a*Ñ \rªyk\ 3 ÌÙ\ 6\10\8fÃ?þ´\83\8a'7\ e\ f È9\83ªhXq­ºxG\ù\93\v·g\rz\89Ëy3x\8bH?\18+\95±ÿ©æ0ÿpÊ\91þ¤\16\8cþe½\13\92Ûz§vïàáþÜðò´h;U\13q\9fݪ\94Îl\1e\83Áìñ\vüG©¿Ð\99úÓþW©¿\90ø\7f~\9bÿEê/t¦\93ÛÿUê\9f\83\9fH\9ct@µ\1fq\0ê<\1d\0]éD§{Ã\7f\9aÀ5Þ\ 2h\12j úpì·\95I^l\1cR.\84ÛÐL¤òT+ØO{}ÿ³È\8dý\83\1f\ 4\ fI?\13\85´wZÇ\e\8f¨äD\ fÿöN^^\98ßÜ\92<w-K\8c\9d»¼¯Þn\aóçä\8b\9fëß\ 3Tsz\0ª5²\vª»j¢\89ûz©[º\ 6àÑw
+àVC\0\90  ë\0ê\15Ý·\85²\89Î}«\10öÂ\aü\1aòLúN\v\90\ 6Ü÷\8fh\ eõ³ø\93ðN\91³ô\bòÉzyïÆ»:åï]\1d\87/  ¶\9e\15½û»Ð\7f\9a§\907®:è\9e\7f\81ÔhUøþúSê½\93Hu\e>\80g·:\80åF2Ó^#B¢\17»\0èØsãzñ\16GÜ{\90\ fû°\r\añ\92jûßb¥ïc\95\10õ´þsæ\11òyéê\9eºvIL\15\17¦ûoÜ\92\ 5ßíû\11ö\1e»Ó̾e{»«av>g\ 3Ú]Ô_\0T{V¢³¿ì&\r\14M4\95\86\ 1\80Ïqã\8fhiØb~\ e\13\86å­\ 1à2åÇu&\8e#~@ä_\11lCA|`Úþ1.\ eüì7ļiÞ ÝKY \r+lÜ2|Þ;Wé©;Wyè?yEño\93£~¿\96ù¬®Ûsä ·ü\86ò\83t+É?nþ
+\7fJÅ×=\90¼ ÅÄ\9aÔ\vÔòpóÏ(ä\9a\98È\8f\8e\97ĸǠ®\870\88øÓ:ÑI½¡@90-_\1d¶ÓÜÝ\9eæû\98W°Ô¹Kz\1cã\989zë,Yáè@¥çݲ\1eNp;|®\8f\90½èö\ 69j¯³!iæ$þ\ 2 \8a\ 5?G\87Ué]?i£I     ,m\13©ø0\91J3x\ 2\8dOD\9bçDïÃ\8b\e\eu\ 3\8a¾\10\14 ×mÛÇ\87í¡W¤\8d\89[)/H\azvVv\9d\ 3\9cÕZ\81ýãU  ôûX\ e\8c\94\95÷Eß =U\13YEV\8fZi«bLþ7\0U
+D *\1c\86\0rn2\80ÃK\ 4j\ 2\96¦\96Ý':ov¢SýÉÚ\e7צ\13õ\9b\95ð\85ìÑ\8f¯Í´¢W.æ \87\8eضåhVïÙ;MF÷½éMnGv?3µ        ³º^\86\8c\90H|$\12ç=M\e\8e8YÅV@8\18\95ÝæP¡Éõ?\91z9þµä\9fHTæß ªê#\0\17}9Y£>Â4]s=MÙ\8a¥¹\859P¯¶ÎQpÜÞ_\87êÓõÏj5r©\a\92±75¶ðÜ\89×Ê\1dÕ½t 0Ïg¬y­\9c\9e\1d\ 3\9e\v\8ePLo·\16ô¹\a³»Óþ\8aï\8fç\82%\1c*\ 2ÉíÙÒ{µo¸¯ßà\9f:\7fúÍð»O\96©\9fĪßM=Yþ{X\9albýöú\9fC(\87ÓKP(\b\ f÷>³<\9bã²ïÇþå\80\e\11½2×å\fÎ_Ø÷¢¤wú\19X\v\ f\87ÖIi\10}UÍ\8c15G¬é\83ÑæSÏ­\ 2\8dì\1c\1e\8c$0\f\eÓå/\90¨¬Æ ê[c\0³\95D§Z\8e@½-Âiº\81Ô×;`£\97îÉ/¬ÔH\ 3\95=sÎ^\9dõõn?GÖƽÍ:øËx\84ãH÷\88ÍG\8bÂ{æ\84¾\ 6\ 55߶+\aCßÖ\95Û\96êí\9fÒ\96Ø7\80½\96\ 4\91¢EÉèQ;%È-v¨\10\92ÿ\86tÖù\17Å z«%R¿nRûç¶\ 2j~÷çÔ\e8M\81\8aƶ1a½)òAqRÜ»Ìmq¶^\ fù~/ÀÅçµFÞ-]¨^\m\7fü¾T\rê¤ùl\ e×\e\ f\94\9d\93Ýá­,\ 5U¥.Fuc(\8e¸b¢Mõ\17Â)i`B^VÉ­>\16¦¿À\1f:¡N\ 6\12¢üñ)¢\e&\ 6Õªi´ìøíWë\8b\97ÚÛ°~å\95Û9\1cÍ\9d\1eÇ {6\97ñùzá{«»¦\°§:u\17ö\81\9aëþ~S.¼¤Wq\13\8bòª\99ÝM*ù\8a@äKí­Nâø¶ä-R£ñ×ãlÆC¹\ e\91 ÿ\e$\15ß\ 1\0ZTQPËaJRñ\93DçåQICe\87Q¸+L_ùÜ\86öjbek÷e4ýmîE]S\rû\84\9fÏòµp9å·ßë\81&Àm¿\89\ 6\96$\8a¢³;\12¹@ \92\97Û¶<Zåy¨»\82¹\95æ\8e¹ú,?ÝØE@lÖF\80ýG¤\ 1\97ÿZò§T®\86\80Z\8fI³Ë\12/P\7f{eÐ\10\97Ã0\8e<4(I\9b¹Û\1a¶7Ï\ 3\95\11M\9aÂö\97Þ&¯jÙÝE;.gª¾wÛ\87\8b\9e¹S;½\1f\7fÚ壺<\ê¼6¶\98ù®=.[Yw\83q\8f}\9d\ e8ûÚí&      ä\14\87ß i £\ f\80\8c~bRJLS¶\92Á\8f3¥þ)Å\ eCvCT¶G>ÔÜL\9dmcÈ<
+\8d\ 3\7fmJ°xV0}¯Îçó\83²~õ\8fRd\8dµÝ©±¹l\rË1¹§4znÚ'×cE\7f\1d1ûH,¬¾c¯µ:~»èêÛ\1e§_<\18dN      Èß\0@\15ü\v \18\9f\80Ú1\99\ 6Ô÷+\1f\85ÂÛwº\8d\17Ñzô¼úu\83ÚC4·¼-\83\ 1sÙ¡·\9f}ÒùæR<<û\15I~9\99½81\vÇíõ\ e«\9cE±ú:\98dn\f¨,\9f+Uî\ 6ô¬\a})C\9aÂÔböFé¢U@éiT\18Óç~\1dù\8fH\1eóÏ\9b?¤Â\r:\91êÙ\89T;\99W7´V>\8aÐr5 M³én\sôÄ,\81¸Úú\87:\7fê4«.³\10¯t\9a\8e !·«(Ì\19sÏÙkGYïÜÒ\919\þÈs\9b·ê7j        yβf\98ïÅ\1aÊ\95\17ÍÇf°°º\97ñ\92>ØãåÍõF¿\0\80ÚË\f\80§Â\ 4ÔË\9f\13h\14d\a4³ãôøÝð@ÛY\1f\86µ\8aÓ\9fhÝû\ 2k¢Fo«\91Ú´Ò§\ fÖÛcåÑKâv³õz˳\1d\ e{\82È\1c\9e¾\bÄiùXz\97EKÙ>æÝÝöE\ eöçüì½èuÉ\9d#"s~zL\1d]sWÔF¿\0\80\90U"U3ð¤\8dÖ\13©ÄÕ\8a¹G'z\11\96þv\9dó%gM\1aXÍd\9dk_GKCL¥Î\ 1¹\7f©ûto\94H((³­çZëMÿÒà\18ÕE·ô\ 2\91Å%Û\82\ es\7fzÑÈá\89¹Í\90=ãO1UÉNs«F{\8aí¶è\fÉlƳ}g;ú{¤1Pé\15@s>\vjY?\198÷­\ 3\83{\14]ܧ\7f+ïlgмGw³ï\94\8dÝjÙÖf÷ïøÀ-\ f\84¤\96\0×3\8bÍ\8bó(v¢æ\18úúh®\97k\9cßÎw½\824;t\8eê\8fçÖÞ\98Äì¶ñð\85¥fðê¾ÑL`\12\16QbúÞ"¿\0\80ö§|Òía"©øÉ\1e4;@\ f³êNs;ÒÏ.¼Ç|\91µ¯^8ÊêYµPWëȹ/\ 3¥;Þ-´/Æùæuʪ\ 3\8d¤oM\87Zn\94êj>\1cóÜìÈÖÅiáî\1dqs~¹bLMs'ö:ÎL6\bÕ\98´«­ÅÄò\1f8Vû\9aéjíçú÷\0\90m\15\93L\9a\e«å.îf\82½\ f»oöqÙÏù«¿m?tÌÆÁ     ^2Ue8\1eµÄyþÓ罪1^OF»ô\18ÑUõ¶Á\97|öFÎG§\ e=÷§5a\80å\ e§Å\81\9a´î\96\10ã\0\15.\9b,Úç²-$Bï4Ú»¯(t{'\96¿ÀÏ\ 4j\9a/\82ºü\98\83fuÇ\86Y¿LZYá\8b\ýÃ\99Óó\85ª¡²ËA°\8fõQN¬\9c 
+¿\ 5¹ú\1a\13J\9d\15<l\r\97[y3!?Î\8d\98\15Þ\v\8a úÕ\rfó÷ÝÄ\13-\r\15ÑëO$äû\91  \11¤1(\8e?±Þ\1d\7fKÜjüé.¶È8u\ 2ý¿\ 1j]6\198\89òì\1d\ 4äô1c\88|"±:<ë}k}t\97\85Ôg³G­¶³»wF\1f¾/!Åu\1eYÀ´\95å\9b\8b¨öè\928[\19L\17»ó\ 4\7f~é9Æé(;éSM\ 1\ 1ÍÒ\11Ét«×1®¡þH/®3£\99q\87G¥Iu8*Q\15q4Ãr»\1fü8!ÿÏÍ_\ 1ÔK!\94\16ò(VVþµcvÃ3Ióã#o¼\18ù\14U\8e»\95±°¸wo÷f/\85g\81¶[5xñF\89\ 6Y ÄÖ\14âÛ©\83\18oíoãÉ\v\97\bt_^,\90#<Û\8cµÒh7.t;\87\11Éô\8dQ¹±°\87WC\88\86Ë\85\95\1fBÙjsp×úý_\04jÓ4\0æQ\80Íä'\14ÛƹPo<\ f/G\eÊS¼H\v\83+ÜÞ¼>عV\ eéMÄå\17JñZ\9a\19­O\85`K\f\8cùL»=\19ú~\1fE,\ 3A°#\8b\8d§\12N\8e..J\8f\88\eRÓ~\1aË1LÆBuðPØë\80é\bÖ ~7¢¾½º\81\99éÍ\8fF÷¶\90µ\12\9cß\1f\93ê%\99åÞzBÛ¨-6ß-/²\95ÓOn;ºm!Öü«,\9cÙ¢|õq\87\87^Xïý\0¨\82³YD%g¥ñ\99êCãâ³ß\1c-\9aýþðÆ÷\91!üê\13\ 3v8Zö\1deÄö¹\ e.ôÛ÷Ù¾ç¯\ 4½ç\13Éãþ\81\1fïà¿\94ü\13\86{«ñ§K<f\95à\ 2ñR¹\83ú[\7f~¨oÔ^\19enÄvE  Í\e?ǾÑnz£\ 6\ eöÊdøm\9f\90ïùk\8cÏËÛ}d0\8aý\13\fëHÁ\90î\bïÁsÇ}\a\8d7\9f\86\94®+ýöWnô\ 4\îöúy}Ü\rõ;Þ\95ÈhÙ\95æùÕ/ \15æ\ fR\11¶X:¹\15ç\10Lm{·R´Á^b\81¡\v\95Ö2ä\9b\8c\13#âÉì\11L\18Tp\14Í    S$w\9dQ\89Àæzxãòüà)¸»A#²ö}n|=öÛ\1fKOݦi«×\1f]ivw»£R\90:ï;ÊÒýtPè\9dk\7f\9fåj[e\vÐ/ ø\90\8f\88d}\86ðý¾°XOßöcÕ0a{¡\fFþÌ\98í"ÜÙx\9fÉð3Jó\ e"xÑ-\8c\8cÕ®:¤ÛdcÀö\a\9dD\e4èùǸ×Ï~&]iú":±a\93\1deáQíïý±j«+\8fkãõ×®\9d³?ûÖ¬ýV[Å `$\80Ì\7f\98¿*\ 6ÉB\\ae>Y<\95\a*\91+\80ê\8a¶Au\97\f      U\ 2ôA%ÎÌAe\1e\92Ék |ê¸ñõ]\ 3ïûñ\95\9e\8fJd\8dÌFĺ\8ft{\Ô\9c\\86¡ó2'!Ç<È°S|­Â6\80\84\97\7f µ ÔÖ\ fï\e\94ïn©,^-«        _~\81\7fÓ\99\ e\ 4ÿ«Ô_èL\97¸ÿ¿HM\96:e¾\15\81J9;\0Õ|\90èÜq\89Î{T\ 2U±Ô\aÕa-Ñ©ä· Ò©¥o\ 1P¾w\9cxiWã÷ÝÏ\16޵ЮFë\92Ö\88\9aü±\eº\906
+9í\82\87\9dÆeþò\8d\aóò¯\90ô\12&KÃ\8f\9dñÃËçí\9bSÅ(óÉ\ 5gíÉgnç\7fC\1a¥ú¯% lØ\89U\ f\83\90õabü\0 \8cá\ 2\bª\96\ 1\94\1d%eâh\ 1ªÅ\8e\0*\8b\9a\ 6*UÔ\8d©B\13¼WÇW>²\9e\ f(jºûfèNöý°#nÓ©ú+(nð\97\1f\97ÀÙÜ«\ fe\95@b\88\87§ª\9f§³82·§\8b\eØ\82Ã/\0ÊÎ+±ëu\12\83\8a<\18\81êé礥dYí$R\97ý
+\80&t21̲\14¨2\8b\1d¨\18ýD*\8a;1\94Ö~}ë\15¢µt\81B÷ºo\85Éênð
\fú\12\1cfúê/ÄU\10eÌ]\10¾Ê\9a\8f¢eË1>ÌÝZ\97\8ai¿¹\8f¾Õ\93\99wIù\17\0åø\9dHuÉOÒ@\97É$03\93ÿpKC.]\ 5ÐUMÊ\96g\1aT_\8a\ 4ª\8dÅ9i\at\1aA\1cÃõĪuóU\88\ 6\87<¿m¿\ 2\8d\1a¾v\r
+\v"t:\ f¤\80a\ 3ét\91\83Ñ´~wÏQÒä¬Yå~\97\91\9af\12Í\95b@Éjè?"\r\1cûÇ\r¨\94²\ 6(\83Õ\17Tkë1\80P.\91
+z\ 1\80\9b
+\94ÀO¤ºá*1î3\91ª©zÒ¿8'\86w(\88\95\ f½Ù\11\ e»ËMçµc¦£ R\10<\90«X:O\vF;\8a÷AýròTÿeÛ«\ïy\97çÍ\8b\99\aÄ!yþCÒ[ô\90?{µ\ 6÷÷øCg¥´NtÒ§d¡ª\9c\15\0\8f¦?+iXr\12©r\ 5\ 50Ùf\0äUö\0Âr×w2#zD\1c\19½Â\9e´Í¼\86Ýa9\18Ûߺ?\11\8c®w\92¥±\977\85©Kæ$Ú¹\8e\8c\9dS=¶ï\8fA}f\9a\85\12q¼Üß\9atöú\8dÔ\9fvz/%ö\17\0\95f!\91Ú\143 zs'ÉrÚI¤\9e÷aê\96®'À&\0\8e6\e\0¯\99ã»\15+Z¸ÓÁ5\0,\99\8e\9e¾zúDÞÔç2î\9cl\96\1cèaÁv\9d\93ÛV\8bX\ e\1e\81ß\9dÜ#«»¼\8f[;Ù,4IíR\9f3Ò¹{\8eùÓø5c\8fÚ<¢þ\1eiÀez\ 5\95\11t\ 5\15ÖÌ\ 1¨\9aÁ\12\83æ\ e \96K}¨ôÏ9r"\ 6jøeý樶\18\ e\12\1c©\83æéÁÛt«*æØ,ÿ\f\9fþ¢\ 3îqYÌÜ>O¬dj\9d/t½\14\9cÖ\8f\1f\1a\89ÇÆòÔ£.õ\r#kbÓàÕã´É\1c\vß;¥Pë  ù\v\80ʬe\82ÊÙKt.\9axRáíc\9a\ 3ù\9d¦lý#´÷¦¡qÓ\12é0\9aÆ| ^\9a\927\a\13Åaæ{Ýâ¯Oó\ e\ 4÷yKjÀ¹\1aè10¨\v\ 2.\r\18\16¸\97ÏÝ×½¥\89£\fzz\1fXî¨í#æP©­\96ûÇ\a"åÍËK3Àü\ÿ\1e\89ÔzbÒð\9dHUF\ 4\80Ãù  ÔÔV\9cæA\85Ód\13H\14|¦äk\82ª´_2\ 1çXÙºhõ¬öá\8eU@\9aBÏ,÷ ÝXU77ÝùøÏs¿´pO1S
+Õ/òΨ¹\9a]>\16Ë^ë0§»\84\ 2\93Ý¥ìt_¤$\14·\84(u0ì\17ø\19=Ù®\99tûB\1e@\ e\8e\83\1a¼IÓ!\8eÓÃØ/P¼öía¸\87\e\93 °ãHwõ¼ÒVpñ¸»ªq\82Y!WÒÅæÄÃùUöµ\1384\rU}ë·c)?°\ f\15\ f
+÷ÏéO2ú}ã\90«Ê\\16\eHBc3\15GÕ!¾SvðDPe\1fù\ 5@E\1aß@\15¯ç\ 1Üà\b\8e\1a¨W\88Ô\81ú¨¼·ýc\1a\9fö:JÅ\91gÚ3ÌÙH\11õ8D\be.3¥õÅÑ>üY´+âé8B\95£þ>¨\87j\ 4é{ö%^åÎ\ 2±¤þ \1d\8a£v'»S\ 4®¹ËäÃ\89\90o\9d\91íì(\8c·%\8c\1dþ õ\ eþãæ¯ð§Ta\90®QÕ\19¨mÍD*²|\81ºý.G¢¾m\ 4S'ìºÏÍbl\85\93õô^0ssò®´Þç\8eìIÅ\94tGþq¾³\ 4\85©\95\83\aiЩ\9cw@6Lá\ 4sÎV/qïmiiUøE\88\8eùê\19\1ds÷Y\7fÈÕÜÚà\17HúÒäöó5êF\14\ 1Ì\9c§ æ}ôÄ |\0\1a\8dr)TÊÓª¿@\9f\rÇm³\83Ç×)£&%\9e§\97îq¹Ð\ e\ 4F«¥&Ê(Ïùj#o¯ÚV|\e\ri7±ÎÇ­\1eöÏür\99O\8f\90Ê\a?\9eÛE+·iu¬þÚ\r~àö×üîÞû\ 5\82êw\95èÔ\1c2=\931Ñy\91ý¸=·3/u;,xtpKwzÙ\81\8awî3A\e\\e
+\8d\9dßçúôThçæ\87Ú)XÊA\1ebÄX\9c®w9ü¶ÝVr5\91{p\81ºi]ø˺«ò6;Ðõ\ fó\9ew\e    V½\ 4ë\ 4ȪóO¤.Õ\7f-ù'@åIÞ\ 1ÔÞ\95Ò\14\1edzÞY"õ}rß½Û!\ eô\1côu­»S´ÆëLýV\95©îEXÕÆ\1aÆÙ\93#\95;\13{~\7f ¥\91k¦±\83»|ûKo+\9fÅ\86k\18®°ÞÚ¤Ì\ eñ\96¶ú|Ê÷\15\86M"Z;_ª«\¾Õ]e£zg\85Õºí_àO\9dóSù\8f¸ÎÊ<ÝÈ­\81ÆÀr¢QméûW6\e:Þ*Ì>´®\¹®©Fë\fZ÷¾j\10Û±b\ 3z"½\ 5\92Ø\11Ì|º­ZÊ\9ckJyzÝ'VkF\11 q\95»>\8etQ3¯TE±½4D\91\86\90âò¶ô:T\85÷ÚÔ\ 5|Z¿@ò&]Þ\0´¿\97Ó=ü\v\ fTÐØEÏ03n=¼GñíØ¢­½ïåxð\13\12ße|X;a»ö±\86 ý}ïÑ\1c\8bغ>Ù\9aÜ\90àÖ\1e=[\ fÐë\82\99TZ+Z\1fÙ<Ue\18yaU§ç¹\9b\1e ÆÙßì<éb­Esxl-\9e¢Öü7¤\81c\7fQ\fª¹ubÕwTI÷Æ/\93\8a'\8fqû}º¼ò^Yw7ÜëöüÞ¦¾ÉÜ¢¯¾G¥\8az\ 5\83\86Â÷+]     Ý\ 4É*±ë\8d8§ÿE×ÃY-}C3X\9d\9fÑdøY.W\ f\86\9d{\99\86@\ 6ï\86:\8b¾ÃûlLk`6^Q\9dYt§Zd\80n\9a¿\0¨Â»\a\80\87Õ*¨\97\8fÔϧ\88ÁJ\8e¢öòàSY[vú\9d·v_\1c\8c\87!\8cùHÓÞýü±þÊB²\f\9eÍ\1dÙ\97Û<\e\8b½µdªC\ 6ïD\b]Q»Ø²Ák³ùÖÀèY\¨ðÓãñ«Lsùö\8d\98\92ÛôÛ\1aQl÷\1aÓì\85êL\ fïyë\17\0Uìô\ 4°8\82@\9d|P qÚ      aæù^»Îp¿¶2ojg&¶2t%lyêí\18§\894÷!²/\88Ó颺­\9b\93úf°\9b\99Ó\99ëÑUûÔ_6õ:2ï\8bGb¦\ 4Ør\9aoW6¸ñüÊxµÕ»bôvûÂjx¯\86Ý\84M\ f¿|\99Î_!utýk     ¨\9a®\ 5j\90TO*¾@ÅÜnÅ\ 4eW\9cÙ\912\9dÝ¡g¸1\ 6§\8cª\91\vÏ:ð%)\92Tkü\15j\99fq\13ÎÊU6\87´ë4µÄ\9bËÖWï\92ïm9\1dof\13ÇÄ\88K\9d\9aãË\e²Æêd[\9a¬MÊ@½\9eýB·ùM\ru#o<a£}oÂZÛîß#éöM\aÔ\ eN\1d4Vu2\ 4Þ#õÜÚ\92J7î0L\8f\fÑ(Ñç)µÞ\1fíËÖ\94?\fêí ^áÍíÆn\86Å\ 3¯@ßóÅʲ3Åkd\1cé­Y.\1cô\89\8dâ°mÎ'\8e ­Q\7f­ÉHx|]\11    \9fDȨ\9eMçiÈÐ^\13Èk\ f!¿\0\80\v¬\aêc¸\ 1\9aÕ\16ú<jùøF\7f?\19cø>õ5\ 3+\93Ƕ=\17äïR:ï(}÷à{ÉÌ.Ý|\91\rÏ\80~lÌ̲ëUJägAC³Â<Ó$\96çC\1f³³\ 4\8dÁ\1cÝÝÇ\1c\842þ´åÛxrÊÄãìêÔ\1cg§4=F/\80ü\8fH£Tÿq\ 3à \8e@£F5\9e\87ýØ2\19÷ñ¼Èâç¥U'\97öA°\eS\19çY~Wëë*')\8f\e;ÃB\87f§Õ×B"Ço2ç\9c3ÓE\1d/áO¡ZÇÚÀí¢¡ö\93»\e\89\r}>þÞ¯\9bqîíîG3´d\8eJU6\1c\1awP\19.ÄçlT\94\8aì¨È|\99¿\a¨\81Í×\92ô÷Ŭ\8b¹\93®Ð·óiù\89Óï\9eJ¤?\e\92~ÀqaM_9n<*\1cÙrehÒ­®`/Æý«7ÓÏPH¬V"À[íEa²\93kUt<\ 1MdÂf\86c\82\ 3ø\88\143ôpi$s Gµ\7f\1aÔw\9cÕ·\aNÜß\14\17éqïýÖu¸J\800\7f\ f{+Ï%sU\17ÄóÇu·j²@\93÷ {öEsYml=õ:Ý$úÖ\8c\1e(\ fÄ×ù·Ú¼'o \9f\83\9e\89\ 6úq±­m¾Ñ¸O}\91ãgT\18\9fá>4\9a»¥æ\90\a\ 3¶X%ú΢C÷ÛÁLè  \ 3\86\97Û£\e*\95(y'KP\ 2\ 5þ\8fH\1eós½-Vøæü\81
\9fÕ~Ly¼\b/\82,\1fÒ|k\93\93
+\18C\17ö,Õsoü\1cÏäÅé\8d"\15\9cëx§\89\84P:òÕas|^\86Vº}ßKCOÃÁs'}ûÎ\9e/üxnÕ5Ü\rõU»+\91\87qwTvÉN|˳\1d\85î\88\1d´Æé¿\80>zegÇ\87\8cà2\18\15gÂÃö)~ø\fÞëi̤s\81\15[\ eÛËá«: gy\12!\9e\8c\89c 7C\15ì¹DrW\96I\ 4\8e¸!ÝÉ\v\ 3\1fÈ}n|?ö\ 4ìtî\86çÓ­;*\9dì\8e²Ô_\1d\14zeÚ*ó)·ñ&ÔhçÜA¯uæWé°ösý{¨Ð(\1eÉ
\18
++5?Ú|\bdÏο\9a\1f_oþÝwÂÙ¢tøâ\ eWÌO¤±PFÔY\r\1e\19+½1¤ÛëÎO\ 4q4è÷Û\1f\87ûtT´S÷ékÑA«Þ\9f\9eÓ\9cí\89­3\97ýÃiÚ4v­g³òîú\8dÛ\9eüü\ 2é¢0ÎT;\ 2\1dòíõ·Ñê2t>w\\86\I&g9H \9e+q\8fõ¢\9c\8a|5á2.Þ\9b·!Ýr­¾#ñnO\98L^]iÚzw\94E\16´¿·o¶\8d×ÂÄDk¿Ò*zO¸ilýt%ݬ\84~¯q\93¾H²hý\12õç±²¬7s\15¦æ\9c\87»_\0\94\fJ\85Æ\19\94\ f(\1fìd½ÒZó BF7PiWÁ\8f\13òV\87@\19ï\ eA9¿¤@I^'ÿs|8\83âG\7f\80¢é¾@Q-d@\91\86\88\ fj Ø'; XÛ\8dã\8b®ÏâJÙeߦÚ9D\ f½£\87ín \a¢#ë\9eZ(«îôc§KÜ\9fë\7fÄÿ-õþI¤ºïQ¢RÞ\82Ê\1a$Rç\9d¤ì;\80A\99\1e$:kË%(é¼\bJäI\a¥òÝ\ 2\8fh»¢\9a
+õr¢wÒHô®zñ%Ú¡ñ|}"\13©\11÷¦ð¦\1a5Z%ýµÕî\17_ÉL4÷<~©Î\ 2\16\ f\7f\8fÄ\90í\9f\8d1¥zO\a\91\ 1\95r!\91ª_\ 5P±kÉëù\82\7f@\ 5!k\89]\89D*¾NL\1aÉ\89TùzIìêÚ\89\b\14o\85l"¶[\8d\8dþ \19ÏõA/\9eË«I\\19ëÔ\9bÚ\ 6©Û.zXÕsØ\9e¸\97`¨¬/^N~\9f\9c\1c,\16ýÊ\7f\8fÄ\90C\ 5\94\ 6ÃDç¤\97è$»\b¨æ£\1d¨ÖG\ fP-°ßD¬Üøñ\vTÖ#PVe
+\94ûº\ 4J\96e\80Ò:r@©\9d\a ø­\17b\83®Cñ"ßmÇ\95uwð¾\95     üm~\ e«7\8cg\ e¡\r¢K\10\ eeÃS\a\90î,z[õéÜ\9fò=üö\85\1f¤.Õ\7fÜü\e\12©½=(\11Ø%i£ó\bM\ 2\ 5U¢$\82ê\8e}\82êJÏ$zõ:¨lNcPöåEÒ\ e®bÒ^ÝĤrä\82\12\92\a±q+§Ù\12âE¿\fÇ\15«Õ}ßÆÝñ\9bò\88Ù\e¦äMÄ\9c#íåwïW\1f     º\17Ç8jg«Ù        \95û\88.    ¦
+\ eÜß\ 3\94\ 2$1éjzùé7`\9bK\fºF\7f<Ói`·\ 5ªA\94\94\89ùd"[\0\93¤\1dÜ\97\89Þ@JÚA\94H}ç½xñ\89â¸\8a½\vo\9aõàèy0[\11\9b¬\ 3B\87yO\93·H\9d}     Yò\18\f\9dUº`w\8b\9f\8bn5Ñøx\ 3ýÌîªC\93\8d±x\7f\98¿\a(g°Dê\891@etI\83Pu\f\85\ 4 Eì¤îó\ 2\80 4\99Å\8aý\9fèîJ\]\81
+\9a\97Þ\ fùªGvoý\8cZÍI\10v^\10\8aÅ«ÏUà@:åÚ~ü.\8e}´Ý =UØîÜÙXK%úêí\90\8b¤ëìÕå.«Êq¥7£d¬û\aÒÐÞ\7f\ 1(Wç\87Dïþ
+*\92WL}¨\89TNÝ\ 3\b\fý\ 4\       @\a©\a ®@Ä5¥JE\8e.óá6ì\1e\8ew Æ¶øô'4â{§u#M:çå\8fÕ¼[b¢\8a³¸fZNuÒAlZãVO·c\1cnèÓ\92\8cë4Ëék|¾Ò\ 27\\9cdM\98ý=@¹Ã\1cA\195ͤÖË¥?>ET    \0Åá\ 1À³M\90\ 6v\97\ 1<\8aûqý%áQ\97\ e\16/\19®¯\82Læ(xçvïàÎYçâPP2\12×\175ÇjõAø\bLý{\8f$±x\ 3ü¶vC_öØÄÁ`cTß^ê\1a:»V{uzCê\\9d(\1dâHÜ\0ö÷HTn\12©Ê+\91\8aw\13ó)ø,Q×P\ 1ü¼$:£J%f[¹^ÔSPä\85´vi\13ð å1w¯\edãÔFêÎj;\99ýcHNÔÛçñ¹\98Zg\7f¿^
+\94{-·§\91\ 1ÕðÜeEruݺå¦Ú«\14¯ÔCÜ\9f\1d\93Å\ 2¦\98ä\1aU s\82ü\eÒYç¿\96ü)\15\94ï ª\12åÄ\9aÂ<Q\99úP{\9f\96®F\ 1ôl½\94S­ïÏr\93±K­DÂnI·E2±Ñé\9bê\156fÑ \ 4ãVÈí/\f¥¦!ñúfÄ^Ï[\bµ4±8
+OûÌ$§~\88S[ÍrUòPÖylÿ8\ ePyüG\92ç\\ 6\7f\ fP^l\8f Ò¬':¿|%YN\e\8b?\9c\ 6jÉ42^÷§¥P\9e*P\90\97ݦ{O\86\b\9bC¦è\ 3\19æ'æ¥\\9e]«Î|yi\92gæì\9fG¼6¼[Ò  Ùð\a5\97\1fëǧû<Ì{D¤\98쾬@\9f1&oÄwj4©·\10\87âp\87õvûw£û÷\0en\9fH\9d\r\1e\7fäÄ\81Åp       jÔã\fj_2|wÇ\85ïkÂÍ
+Þõ\93(ju\vÍ\ahªé\ 4êV\14ø\81ñÐ\8e¨Î[7B\93\0\9b!xúx¾µ¸Ã¢i\8b
+,2ʾÁÍ/r{5·¤íåø\11Ã\ eÒÝÅD¯/|7¹drøñ;Û3vný\15R\97ê?nþ\94z^>Ó¬(pRñ¹Dªù9\83:²öÃ÷Ò\8e\82½÷u\99\9e\9c·Ä\82\ 6Ýt¦S¿ÖZ­®¾\rà\81\86À£±J\9cvØáªfg
+\rDJv\8bp\1aD.      \82#\88\12i\1cw
+f\98\82:zú\ 2^¦«ÛYOéðÆ\99\8bÙ¢ÉWKxãï\91ô%M\ 5\95pýLówÀI­·©4mcú\157^\7f\97ÎëóØ»~eP  \9d¶Ä~\1e\983¡¶U¹t´K]\8b-§£N\15·\7f ÚÐho7·\13¹;¬\90¢\8c\ e5Gk!?*\89ÛR7\7fâ\17"js·XÏrôµßÚXP)\1d¤7ì«ÔHQÿ{$R\8fGP\85e+éK¥\1a¨a\18\9dX³«½·ýúí\95\en\9e\1el\17]+¼ö£Û\ 5\98_ÃÆ\ f¥sälÓõÍ)\8f-\1a\87ÛjÝÚ;°Ý\97^\8föx÷¡¹\89\9a³m¹hÑÜ}·ã6Ö|­¬]ú`®ùz-^wÞ÷\ 6\eìOµ\ 4z\8aë\7f\98\9f+(\eéÖ\13\ 1ÜèÔAmK%R7c5\12¥\8f\1e\14\8d©á6Éïã\89®,פ³\9bøÒkMrÚäÔ+\1f¯l\aV\9aóAC
+\ fóÖî\8b\18=aJ\8eƼÉX8Wßý\1c³³ö*\10Ãîôì\8e\91Íú\99\19S\87×êÓ'j«Om\ 2%  f\8c/ÿ\1f\0eçq\ 2Õm2Í\84§h#i ÛDç\858\84{pIã¡ýj§§ÚÁñy¹ëíÕóÚ,ö^ç¸Wúª\17ÒÉ\1dêhP\96w½7$¢b£!Ìúl\9b§³A\7fãT\97Ⱥ\87\94§Ì\9e½P«ãäÈÓÚô¡Ò\85kÝ¡.ü\a¢\vf¡J\13\1f(uwÓ\84W®ü=@9¶\13©f\90\98T\4Ò\f\93Tl_\bù\85CÌεV9Ñ\92Cîx[ö»æ%è\14}\r/^ßGêhd÷Ûú.=fGü4µ² oB\98§½Z}Ã)|\9b\ríú\90ABmB\9f¡)IÍ\8d\1e»¤N\88¼x\16\8e·Å³!\96\96ðÔ¬,)Æ,/MÍþ\7fàgÊÑxkÉË4ï\ 2ø%5A\9dôè÷ö\96å\82\998d\1c¯öå\1eÚ²$^íÒK×ÇyÃ:\95\97â°s Å\15\9bBT\81\7fÔ\84ò\86\17]\88\95\89A\83Élí.]\9a ÃåÍ)¦ÃÚ\82¥czÎm\8a;Ò÷çWR852óNu[\99;ܱ²h(Çòß#y\93f5\0!M\17ÔºF¢ó\92¥£a¨QÞ}ãOmQ~¦\9f¾ïÉË\803º/ñ¨\9d<ú~¬Ù]wß_6B1g\95À\96rÚÙ\8d÷Á\vìÛ¸VWZ;\vQW@5\96õF±7woá\84Ü\8d\8dÅLÆ\1c~
+ôÆyzX{ï)Øcå\99ô\9e\96È>ñ³`ÿ¹þG\80ʳ{NÞP\8b\0Ôø°\r\1a\85ò"Ì4§¸»þªã'\9eë fC\1d¯tdÑ\96U\93­^\14þ\96µ¤I=ô\85\85\e½9Ný¤K\6~Ö2«ó`Y n¹Gya¿\90Ú¼W Û³=©\8e¦XN\98\11\ 4\90ÖøeùUñ\v¥½ð\v\8eT\89\93\8f\19\7fXú{$¯'â'\0\ 6®«aÒF\e\9dx\13}\88 \148][ª\8d\1a·[À÷\8cþèEj³¼Ã\1f\9c\8e¥Ê{éqÛ\95UÉâ[SÙ_\8f\90É+aLÝÛãìÂ-\99E2\8c\19Ú\8f\99\92ú¸1\93Ò¼\83Ømi¬1øY<N\9e\92æOØÖ´\86Q2\ 6áå\b«ü=@õ(\e\0>\85oP_\ f\bC:ÏÏ#\1f߯ÅqþÊ·\935ëi\88¥\91÷j\8dZ¬öÒ~)\893\88Ñy§52×q\86°\98iOô©\aq\v\17|T\8dIùuÌβÕa\99 É¸\8eC¹g\7fb]o8êj\ e\83vK\r\ 5  Ü\87\8b\ 4\9eVG;Çm\1du<\ 6þAò\98\7fÞü\e\04\8eLP\9bô\0hô7Í'°    ûFÉYûÚñÆ\91~,1Õ\13Dû}ew-Íÿ?¾ÞtKU&kÛ=\82}\10*­}\87(b\ 3\82(`\ab\83-\8a\80\84\9eÿ\ e²j¼ÏW52ëÏÅ"ÇZɽ¢\9f3fÌ0û\8dÊlv\eæת\19fwcg_q¥ëº{\eÎÛ§äV\92ÁªR\8b8§tüöÉ\91\84u¯d³ØQwy\8a\9d¹Õ~Û¸¶ÇL\^®\99å\87~2Ëo¥Ä,å\1c´·ºïêÿ\ 6Ƚ[WPÄWI\18Ü­Uqw§\\87r\ eÔ\81Ü;öYzX\17ßBWa\86­\99Û½ÍÍÇb Lé(4&¨\96²äb\8fØ\ fu£{\1at\1a§;·\9b\rÃ~ö\81\7fº
+}Ç:5\7fShC\83\9bbÀfÓc:\99 Y\v´ìA}ÓêW\1e~ËV_\95\16b§:­^Ïnýo\80üëú¼Ï\14aq\1a¾N\8b½Ñh\99[Çe­ÍÝq®Ëx\e!&v×j3o\1d$-M]õIy|à{3iJ\8a¦\10\8b\17{\90\19v\8f\1c©Ä·ÞøºzuáØÿaÃf\ak¯Rõ\ 2c¡4Íd\ 4\91kqþNm\1eè\94Õ\1c¢ógs\88É¥&9½vh÷eõÿAâèúÏ\9füàÕ¯3Ö\99ÏNµ½>9*[¬ÔWÖ\8fÑÀX¦\f'4²û\ e:«=\9e5\95}5{c1³\92¥Úý6\15ÖLÅàñÕxÙ/ì1»«å¯n§ñø\89ël\ 3C\ eÚ©\95\98b\90³\92máw¥Ú\14«ë6=ê\9dÅÆm\8fè\rE\9d\1c\1a\15\86\b)êq!;ÿ\e\97n­ \1ej\93\91hïÉmriкúQEs\8b«êü^\89|\8d>º¸²­qõÑEòz¢ÑD\ 4\e\8c8w\1ch=µ/\19\9dà\94_³ËI¼kwë\87\13\83a+¯Efça3_ÔRt©½È6TëX§ü\ 2èR\94ZH\8e\8d/oÔ\9bÖáP\8bGíwmU\fKÿ\eÇRØá¶\88/tV~ÚgMD7{³)\19+ÓöZ\8f&\87Z\97\90=éZ\1dÆF\96\1e`;1\19\ 5ú×qÀu}]\15ÙØ"Çm\8b÷5\86ÏYf\8bôäu3ÿê9téÝ86ªßÚ\9d\9a÷ZaÝ\1c0éZì\ e²56¯ÕªÖÄf«½r$V3Ï\96^qfæî¿ðãRý\8f\9fl{\16\9e\1c_7\9cET×\9e­]SÍ\14\97»q~Ç]%Ê»ú\82Õn\ 1\9e\91\9e7¥È\8eÉ\1c
+í¯\93ähÈe©\16y\7f1ôunw\eÞBã(\7f#&Ó\1aÕÈ\fÆõ\16ÞÑj+±¿¬Zãζ\9añÄs\ 5{\8düòA_\7fÊäÛÅK§UºR\92ÙJó\7fc])\15Êff`\97\93+M8k_þñCã×Í0\9e¿\96ü\81Ï-û\93âvÛ\85æé\91eÓþ\8dá³\93gó¤\96Cz\ 2\a·F\15ì¾T#½Dë-LÂk«¡\94¯Z£v©\9a¹7k\15¾Ún\95\87\rª[:-ÚÃRþÃ)År\86Kb\a\v\9ecl\vSÞ=\17jøÓûß0»\151¯=²ÏÜ\84+À¥ÆS­t\84ï\82\1eqr¶)tý\99%@u¸Àð¤-5åJgÒðL49\eEÍÙ»Q7ûûu\8d%ÇVµW\80¦\8e£´\8fåìt.\93!y+É-ìY¼®±°XNc\9fÂ\94Ã\91ü|\88\8d\9a3G­f6¾÷zÙ\95*\v¿\ 1\9f\17\80)\13\15 \9f©      ÿôÝ\ 1|\14¦\0\91\9e5\0A¥Ç\80ÈÔ-\80;}\ fà¼\91\ 1\18Ø\96\ 1¶~²\0ë¢2À2Å9@¯Ì\ 6 Îè\bPs}\aèä\16\ 2t\90N\ e-\ 1\94©\93\0­(5\80\ 1@I~
+á¬b¢an¢Ñ\93Ý\ 43ìlúË~G÷ÛEæoü¿:÷ä\1eà\17,\r\88ξùãO\9bU\14@tû6ÀC\11J5\97i\80\97](õ\98H\95\12©T]\ahر ^Å\85\aÔûx\ 3T!\10¨·S\80b\174ÔY\90 ¦z¼ó­Í;§ÈvX¹"Iv\9eW3«/\9eéO0{l7\17íO\0l1W\ 1FÌ¡Ôwi\ f\94\ 1ÄúÙ\ 2ij£\ 2b£l¡Øõ\13À\86\v\17¨\13¼;\0Ûä~\12Ðb]Ú\0X~`C½Ú  ê=úPo\ 4\0º(âPï \ 4õ\1eÛ\0\14(Õ\¾ÝÂÔ
+ïÝìæe\f\17ËçfIè\9e\9a\84_\ 1?óó\ 4ØÎ\84R\19k\ 1pº{\84\ 5ÚF\0ñI3\80¬\8cT@\12»\1dÔ{ö\ 1\91¿d`;\bÊ\0gP(õY\1c\ 1lÆ@\9d]e\aÅ®¯Pìñ\ 5Å\82/@w\15\ 2\8a\15+?M`qëÄûjC}»\rv\11]\18Ö\ e(ì¼y~ÑúÂÛ\87p%1~}Õ«G\9f&\7f\ 2`7k
+Ëõº\ 4¸>vaiJÈ¿ÜÒäb7û±\b\14p\0d\15\ f\0a¡°E\14\88
+Àwõ\1eÔÛ\81ÿü3ZÀòÕ¡Tiw\83¢£(Þ_£o,\fP"&>\95ò[¢\98ft1m9¼¯ozðÜ>6~{ÔYy\823\9eßJv\98øÓÎÍ\b\91N«Ömø'þ-5\8aW\80HmÏ\80Ä\97PÝmÔ\ 5ÙbJ\aY´á&\9eþ\b\90í>\ eÅ2U@4Ä>Ào\9a\12\1f %¹\9bè}º2Ûw\1eÐçè*Ò\8f¨´¥ß¡Wj§Ãê°M\ 4~Ö¨\ 5TÿÒócò£<¿tqá   ×±q­ÞMõ´â\1fò\91ç\18á\88c\95Á\9føii\913\85\15\ 1Á^N\80\9c<áúºa÷@Vo\98I\fú\19dûV\fÈû\9a\84\85«ÕãÜ\8eî¼\8b]T\8a*ØS\vk¶±\bæ÷\99ó
+¿ãó«Uà<\7f5à"¿ý\99f\9e\16e&Gå\9f\19Ó§\1fØ\86\92î'\9e\9a]æíáÔµÖëÑáà\11Âî\86¨ý]Yáz\7f\ 2àÈI\83\15Om\0qL_@\16)ÂÅõ9Å\83\6 A®ù×\9fø´W\f@v\ 4×\88e\84)\87~îB\aÆp̽\98}^ö;]oúìã«ÅcW\9fo\1f87q½átx¿Ë£^x»îÅô­LîJ\97¹òê\9e[T$»HN\94÷òi?p¦\9f\8eÆVrBÒ^4WÌ\9f\0
+¥¾¸ÄáW¿\82¬<È'\19°\a ·\82\8d7w,Ý@Nk\7f£Çw\8d\ 5\91\16d_,Û®<\9dʵõ\10&2çIélâî¾\17\85óôú¸\89úE§\88åy\ 1-ÞÓ:uqO)úùp{+â{Ü¥\8cÚax¿ôw\93Hà·\8dàÔ±ÖC¶µé7@c\83"Ñß\0xÃÿé7DMµ`Å÷o {Ò\v w\98\ eA¾L&\ 1ÓÒí]mf¢à½c¿¯tÓ@\9fø-Î{\85V£z\9b\16\8b±K³§ÏVåÜm¶$\1dwÑW=\1cÝ\93¾?\9b«õ¾ð°\ e;%w}üø¡'\85Ìöµ¶h\9b)M;\9b~\ f4×DeA-/\19º²\1c]éê\9f\0x/\9c\ 1bº±\ 1\19.\92dÝç"È\97NbrßÝ:\9e\94Õkh¶¯IàØ«ëf£'\99í|î÷î
+¿Ò¨\ e\9bIy_tù\12E\1dN\ 5\87Ù\8f¥Vw§\96\11Á©ÛÇÑ\96VuÍ^\9c\16+k½[ì­4\11½6}Y+¬     8\e,Ga½¶P±OÅ\9cÕÜ\92Y\7fm\92È\94\9fço\0¸ü\9dÿÛ5E\9d\9f §\82\12È\8fÃä\8e¦Ù:zå\9aÇ Õ\98_\9eCãñðJï\xm²ßÏ©\7f}#G±Y%÷\93Û¤¸«åñ:üÌÖÌjM»­\16Y«Ûýð\e®|\1f­\85ôV[\89ñfµ¼°ïó²¸U3\8b\8a÷¬\1a\81=+ëï{» ·ÛÕüüó%s\7fâ_:Iìùs\ 3sVzù ç\15Ê\0Ú¹Pªä®ÂE\13Ûú;\85ß?
+ññ|kÌö\8f\93Óæ_GIÔ>ûÊÜÊ8t\ e\10ö:ÕÏ[\b\11\87É\8c^I\ 14åÆ\87\f¿Pç¾lÎ\14of\18óLrtÑh6f\81¾ÜSÅùÆÏägÛð\90\9d\8aL@ü      \80Û\18\94Úüla\ 3Å_°âÙ
+(Pmñý0gFÐ\11®\8b§èÖ6÷gíç8ö%u,¹n¶\80{{5&\ 2§IP\1f\ eR\9b\ 1óÄWçV7¿\9cØqyQ#MÊ\b\17l[_åqnnáøx\9e\11Ùå\8c»8\97\19fÎIM\029=\89=b*çZø4\7f)c?\80\9fùçå\1fÀn_Òa_B\13×T9\80\15/C©\127\8c^\80Ó^}ß\9a=Æݬqk¢\95õi ûûÃ\ 4\1c/Nxr\1fvwë\85\e\81.|V£«\90^<^aò\19³ñ\95s:\18da\89\a°\16ø¡ÎjCZ\19NåöBS¯vj¯NF\8f´Z.Â\ 5\92÷\86\98._h\ 2äO\0"Û4\0é\14\13×Tïgë;¿\9dC©®*\84Ë49öI\84\1fyU#R/]i«\1f\89µ{]Äã\96]H·Ía:}®Æ®\1d,fb:6ÞÂ$­w\94\14\19ZN\13³LuZX¢Mµ<O÷\95\9a\82\8e'óç ÙÈ\9f4¬V\f±@ÇQOC ôÌÿ\ 6\9c\97º\ 6Èf:;Ø\97\86!(¤\9dJ\12\89(\ 4\9b¾7xæ\95Úà\16\1eôáéPîN\ fªÌ&ë4g\11Ó{k'\95ÎëB¿v[ø\8eè\e\rõ\fB\82\99\90[g¦\97Z\85P\95]PTêÔ¦>\8e\1e³Î\b\\fqÔ)½\17£\148¾F©O=3êTè4\ 4\93 óÿ 1<þó'p\84\92 TJÜ\83Ü~\1a\81BýZ}?ó\ÿµ½[ÝG\99Èv¯¬^ï»r\1d\eï)\ 51·éÓÛÞ\88F|\>\96øÅli¹»Þ«JþL\0^4½b½Ä\9f¦V\v\ 121º³ì\98y´+£ô¸Ô\92Ñ!%H\83ól.\11ãú\15âö\95\ 6\97OJÚgÐ\94´\vSß?\ 1\87§\19\9cÛ%í\0ò¨ó\ 6\ 5-N²ZEÁ¤Äú·׼¿:7ú¼cîÐè ¯\92³ê\1cçÖ>Ú¯W÷©ã,héìêöèy\99\1d\vUoz\rÌ\97âÛ©÷¤ù\¦G\ePÂdÎÈ\94$\92¼Rb\1eñzñPR\85»ï&9º\86¥Ú&5\1c³\8bÏð2µ?bλ}ÿ\ 4 â%\94êî\8e ß÷bPxb\95p¹òég!\ fJ7\86\13\8b§\fLïur2ØöÆ\9aºÉ»\92\99ÄuRý¡elxm?'\84\8d;½=«òZ±\8f1\18ì\82QÏì|¤\83ígD¹íä\86¥Û´*TÝ9; ®§\11\1f.\84-\1f.;ßÁ\1c\15¿Bu¤}\84j\7f\ 4þ\vð3ÿ¼À\11Ê\85+\11âu\ 2\v\92/\aÝó¤ä=&\vì\82Ê.vT\8e\ 1Q¹k\1dÙúh5uªssÕ./uLìoµ±<>¨õàp\1a\7fúÈuÔ\9f-|Iì¤\93î9¼©\9b¯ \15&Ä ±aË\1càY\86c×Ó!\97\92Jk.%çbnåw¾|«Ú\ 1|\8b¤ã?\ 1H#\80Ë\105{\ 1\85\13W\8eß¼?\1c¼\12çýõ3zD§Ü§\9bÞ\eýCqÛ\7fD̦H§ÅE´úªú.óÒg\85Rn£Î\99¦3i\1f¦\87\11\9d¤<ÎÜ\87*ýô\a\81<\8eù%ÑC¹\8eÓ(öÑN\99î\r¶²Ð#øÌ\12â\93\1c\92í\r\94\8fìr ß\8b*\9f?\ 1»=\ 1¥¾Ù\e(¬åTØ\1e\16RWöù>\9d\ó};ø%7r6~\v·¤±N-\83Ͳo¦ûÎhv~ì\12ûF}Y\17s²Îc\9b\11N7¶R!o\1f\86µtñ<0Û\97\a÷U¤¨ïä[é\9ep,çà0W£:ãÃ\90ï\94´\8c        ñ       :¥.\95îæÜÊ·\9bÛÀRù\ 5\89\838y\82쬿\ 1ùÑê\11Ñm'¸®º\92}Ê¥1ûXå¨Ã\8e-æ={Øz¤×ÕW¥l~ù63w}^\98θÁxòYlf£ÁÁ[HÅvy=¬·lgÀ\94\8a\96ï÷>¾\91\92(U¸$m\7f;Jº\95e§1[k¿X³ßÖs\94ÑÖó\95 Ý0U¼í;Ý\f[\r¹¿\ 1r\95Ý\16\14²¡\7f3$Ò8\ruÓ8h§\9eé|\95\9f+\90ìa(»k\r+\87\8b5±'õ¡\1dSZ­\92ê(l¶>\1c\r3ÜD*é\87\99\10\16²\vþ\9b[l8nHï{îî}é\8e»î«S\ 1Æ\87¥Ò\16Ù¦c§Æ,;\19®õ¹¨zës\1dù­\rÿL¢\1fZ\9fò\85l}ð=ñ'`Åg\ f\9eÂ\7fÕ36j(\a-ÿP\9cnz4±ä¡¢¯ëúÃYl
+ǧî\96\9biM;M\8bÊz{n\8e\8eËt_*?\9a\89\aJ\88Ô\83ÊÛ\ 4>ãpn·ìÉçÑ®[\16ê'ö\85 \8f¶yü\0fuÅ\b&UnS­\9efð-¤[1\9b;\ 4y5\9dÛ\88hB»±Ôä\89QùO$Cç\9cÒ7\97Î+5<\96ó\vÉI£Á`sE¶â2\92öªÉí:\8e\9e\9fT\1e\1a¥n¿JwSÈ\8d$[¬\89~æÎ
+Ëm{Às½Ã¨ïn\86³^  /,;Oûµe\ráxn/å£Ït+v\12«ÞÚÎ\9e¹æ~\91n4\85ÁhØ$«È\92v}/¤]»\81Ó¹;[m\ÔVíOÜôf\96\92È;ì~ÖÙ\\98|gÙÂü¾Aо4óâK²\80\9a¶Ôåsâ<kiù\96ÒsbCNW\aV 4¹áÜëô&\eyÐyáå1k^\90y{u\akÆò£CË\89¢{óð\89¢fV®àtA¡Ë\8dÉGï4Ê\e\1e²¹£\1e#áK=h?Ù\93¦\1eÅ°ü'N\84Kw\9cøε6ç£ÓXÄ5\96Ö\87ßl[£\16CIí\bcw||æ}é\995¿CfN\10\ 3´³,õ/Ù<Õ}2'\86}ó|²\85×Þäj"³-\15\94Ö\9e-\98\8f[ôE@\8e\8d»\8cx\8d
\84¨ú§CÔ\ 3×®×\13\17\1dñZm¹\v÷µv{\95\82\7fbg¢Í$\93\85\95Õ\86\95ÅÛz\95õlF,Oé-MMö§ÒfTêxGÑ8ó7!Ó\ 5!wÊ©©Þ4\95':fåZl\7fÍI\8dqD\9eI²µv\9br-;¤'tjÔ\982¯)åoÀ²\1e:Ñ6I²\9ad\19©±ùlPµ&tº\9ay\88ù\8a£\1d\9b\15\9eÂ\85
+\16\9a\v\88«ý'¬¡Ø(.iy\9d×I3\97S£½\91\1d\93L» W/òJø.ì%?Ä\8b\9b\9fxè»»ïR\91peÙ\föd\9cáéÝ"ïò§\99÷ûHÃ[\14\89$Ó@\81jdÐj½\85\ 5\8dÚjøf\93(Y.I-0ª`þg^\1eÒE»tZ2ç\92ÜÖ\82Rþ{I\17¯v®X\9côsI¿ùyþ\86¥Þ\e\91:YºãjÔnc#Wó01ði~àt\ 2©\7f\1dUÅî\9c:È,\9bnM\18\9e\8c¦Í\93²Öé  5Z7ª\80q¨Fºx\80ÂÐËO¡\91Á½Ú+¸Ï\8a£¸\89ßÂý\96ÉÐBJrë\90+^××jÁÛ^[\85\1aö\1däý#¥æç¢`æ\e¹Í.\17^6\87?¡ï9\17UC?ó³\1ctsóô°\19\85_~\88\91toZ\91i6^\9d\11\98Fó4       \9a\rÏP\19jÎv»µx\9féW¿n(T\9c\895,\1f´©\&\83\89R\92\9b²V\9c°¬^ðìÖ¢PC[V~.´ \92S/ùßäZ\85¡\9f])Ó\ fù}Ú8Ù£\8eE2\13¥h\b\9cù\13\0\15_C\80¦#\ 5 ®¼\0\18\13î\ 1öÞ~\ 1^*Õ\0\16s<ÀV\86\ e0Ö=ü¸í^ï\0 F      \ 3h³[\ 1H<n\ 3ÄÛ
+\09\ 4
+@Ö\84    \10\8d\ 1"*'\88Û\vÀ¡\13\81ØÕ\0Òû\10=\11ÂT\ 1"\1f´wÖmLB\85{\8c^¯×`ø\83Ä`ÿ¿\97\7f\0P-\82 \10%q÷B©Kò\bð¢\v¥rÍ:À\9bpy\8cÅ{\ 3ê\r\8e\0«£PgÐÄ¡Øq\r\8a]v\0\8a¹C¨ø\ 3?ý(&þ4\80\1c;[(Z;C<\ 2\80Ì*\19\883\ 5\90\a\10\8e\16ã»ù,¼]\11å\15¤F²¿¸ç\86\7fâß:¥¬\ 2KÓù        íÅî¥ã¿<èøV \0nìE¨÷i\ 2X\8a'\80%)\1e°º@\0ô¢B©Æ¾\vP.\90\0Ú"4\80âõ%Äh\a\10`_¡ò\17Ôùd v÷\ 6u\9ej\<(°ÉnÔû¨ðÓhÔ-O\83úp=ñ\99%!=¶ù¥ð'\0ºI\89°â\eê¿}¨4ç\ 2<ÈCû*·i\ 2"\9f\1e\ 1ÜA\17\0o\15¡NÐ\7fÿüo4\95\84\14,ß{\ f \ eü[¨Y\9f\ 3\94ﬡhe\ f\ 1´\92\8a\0J0h<\90ìú[\9c\9c»Ñù\ 1¤ð\16D\93@;\1c§>³/\8e\1f¨9\1eÞ¥\\86ÿ\a\89£ë?\7f\ 2U""À\bþß>TÜ\9e\9d\0Ñá0@¬ß\f 6Ì\ 4\10ÝÁ\ 6à×Á\ 5à¼\ 6\0\8eïs\0\e\0ë|ú\0Ë\17Ç\0\r\19=ÞOú\9b\98\93\98Û·Û\11¯o1Ð^ï\9cqOGÅi\90\ f+F\85 ê+\9a\7fÑç\8eüü¨9Å\13Ê\82t+¡\aþ\1cDxçO\0ô\99\95\06\98j°4±\15´©Ý\9f\89G\12öQ©³\10\9a
+\88§m\ 3"ñ9ã!\nà\93g.\1ej÷Æûd¸½w~µ\11£ñÙPB\ f5\8cP]n¬àéo\ eÁLvo¯`w\ f_\86PBý¥¬RÏnEí<8j\96¬lîî\9a\92/3«Ç\9fÚ\9aÝ9:X½õ'`7*@©»\15\94j7×° \89; ùw\16\90\vq\9b\ 2RM9\80$\11/\16¯»÷»XW\93uZTöÚå°¦ç[A\83   {/SòD?6O\8aß>:úÓJ[ëg×8í\1fÛ8¼?°N    xÂvUºç\87\ esU÷rÿÜ\¤873îw\ eä)`v\13Fjü\17\92\80Ëÿ{\81\15_\93ÿåî%²Ò\ 6\90\0dTÏ\83lïÖ\ 3Ù~A\ 3Ù"»{_¥è\16U;ýW`´ãÔ\8bY\98¤\9f
+\e¥'²Æ\9b\ fÞ\8eºÞP=\ eî'Ë\1eßó\91\9d\ 4\91ßJO}y\9dæ×»Ë\1c·og3\8ffNm@\97Ý^ºÃ\1c\ eC´³\9b\f¤æÖ\ f¾\94m\1eVÕ?\ 1°J\ 3ê\94ãÙ¿Ã\10\aYY)þË\ f\9då@.5\99¿ojÍ\ eç@;¼Vêóêg\ 6\10¸(åål\9d¼Ý¾\95ÒUã\9fÔ%Y\9e\9d[«v÷ÄêUÁµöùñѱ°ù\11G\9aÛÃa·ñö²\9cÁwp~¨:µ.\99\¿k·¦ÓÚÆ.\16Êë]å\96ÿ\13\0SxØ»Ïä\1c\9aÓÏ-´ªÎ/\90õwÅäj>.\1e§ÌY\18tÁòµ¾0ös\80¨\aO6üÛÍ\eý¸\86.M~\14\9f>[\12qí¯\93=\ e\148[\89Ý\1aµ?O
+íÝ\8d\ 5Ü®l¤d§¶ÂõíüÕpì\88öb\v\f\vÙ\8dM\17ªkܵ\8b«l(æ\96E¼Bþ\86Ä`O\9e°\8dÊ#Xñ\94\ e\9bgn\ f\v4\15@\95©äÚ«\15\17=ßìøõÅ×Ús¯~LoôlZ×\97Ý;\9eÙÉàâòèþy8!Ô{?\16_é]ÅÓp§®\r
+endstream\rendobj\r27 0 obj\r<</Length 65536>>stream\r
+Óù--\10U\9bé~\92\9dBk=y÷6¶ø\967ȵb®\aeûº\12»¹ôòìtò\8b
+û&Íúh\8b\eú]Eÿ\ 4l &Ô9ä N\87\86:Oå\bä¼r)\1e\1fVɪ3lú\88àóéþÈ»ö¶ê\8djz\8bsº»X\1f\8fúó°¿!äyWK\9b\8f­\99-Dv[9\7f­.¥¢\e\ eïæ×\83 TY\89\87Ls9²¾ýÅ\1d¥\94EEXÚ¦v®GF@\e\84¾$©Ä`\9f\7fæù̼\9bù¦ÿ\ 4À\eÎ\18\10+I\87\15/\1eA®Ê¿\13\1fjé]}ñL\90Ê?zÏ,W\1fÜk\8c \9d­bYu     @\9b{Åç,G\17­dè´\ 1\8b\9f­\1e£y\eÌ©\84«Sö\ 2\96ãå\14Y¨r/kÎ\ 6­\8aaPå\96þ6yAgÀÉ\9c\827O_½Ì\8ck\1dÒÚþ¸Ji\82¨~þÄÏÁ\18ù\ 4¥ÆF\92ÿzq\ 29u\1a'>ÔR\18Á¥¦¿k-Z\9e"|Ø\v\18_{îÁ½É\87\92þÔ\9c`\97YØë¸fmv\v}¿Î\9aèyyKm¼ÅTh\87&u\8d\81\1ewldþm.\92\18¨y¦¦×gXqÑÕ\ 45\9ahdÍ9MOéög\9a\1fS\1fõZ*\ 1uìaï?\ 1\9f\0²´\81:g;¨óî\0\90¿Ì\8b\ 1PSÕ§¨\r\92xè{}¾©\9fûì¤},\98\8a°\9b\v³\89ýíXs\võÁj\9d\93êö²\925ö¦^%OFË<xz*'\873gUþh\87\11\8aMOBº¤^{hK-íú\922%S[¥ê¯\ 2¥úõâ\89o\9d\92Iz2ï9Ñ\9f\0¸\1f\9c\v¥>\1fg\90\87«\90¸\êå^öl\9d{\14·Dþº\1c4\8b®\8b\16èýc]ïoA£)[ÎXÖÖÒnm,«Ø3\89R5\r´më\9f¼w\9c÷ë½ó\f\1eÓsa\17©\93Í8¥LM);\99kãÚ8\f.ܸÕê\98ãÖ ö\1c\81
+\1fÁ\9eÒ\v\13\ 4\7f\ 2öyLùÙÅݾ\13/\1a¸\80|?ü¼kÓ\ 2îï3#üþ¼ïÑóör"\8eãJTßé\97tǶ\aØp\93e\v\93¥7ëÌLã53ôÏó»\9e£kÞÖÄýk?-6\16Wåáö_\13½\95\ 3ãÖë\9bxÕGëR¾"ÛµvGî½à\\8bl\8f\9f)\84r/Ä_\10Ù¿\ 1\b\02$V '\14n ¿Í|ÂÈzd\9eR9\97º\99ä\0\9c\ 4ï_WîU)»²ý¨\9b\965Ð<~u\93#iÑ\98\10ªÁ\16\85ù\9c»\1e\16\9ad\146êÝZ;JýI»ã7÷¹\8fÖ/7\92ûê*#\räU^<îü\96\98«
+\131Wë\9cEqzôEq¸{\8aÇÕù'[Bòü\rpj¢\14\90ÍWÖ ·oÝ@!]ú\ 4ë\9dü~\94Ø]p±&wßÍ¿\1aé]Ø\1a\14ì­%5Ö\17nÞ[Ö\99µ`\80Õs4w¾¤ªÉ"\9fÌ\9eª§¾\96
\eÙãå5}\18eRË\8b´_J¾(\15\9a\9fá\98h\11Â]\9a7\84Ê-#A|\8e\82ZT|áÞ×\9eâ¾ø\e\808´¡N©oýlE Ã;(t\9a\9fWÿYðïs\9a¾\9eñºt;L\17^ì°9\82°\84\eU]©Ó^Û\R\ 3Nïë\ei\96Ë\84\13õ1®iJc¾3ǬTYËÎt»\95\86¨t\1a^{%OP\1fq4\98]SI\13àÃr«Æ75gÀ7g\e\877|Æç\83\1cPÕÎãO\0\12\93T\90u\15\v6й\17éÕ¹\7f36Üæ\82àUÛ-,Ãã.\92¦\81í¼Ýd\84^_ÝLy\11\8e²´\91)Wº3©Í\r¦\95£%+ô\14\1dF\9cÉ»Iz!emÃ\1aNüê~ðÂý+on\ f\ 1·Z\9d3\*\8d\97û=nÒï÷xÉî÷\ 6è³ÿ½\15\9f\;*>~\0?óÏË?\80ÝÞ\98\82\åè\80üùð¸k.i\2CÇpÏEsq¨\17ä­\ 3í\94»\95õ\95ïòÅY93E\1c«óa=Ý\9ez½j_1.\93á¸Û»\8dd!_W\93\96va/ú°¢rË\81\1cî\93>\9c¸Tìø½\9d¾úöðwTì\8a,Ûé\8a\9dæ
+"ðºÇÎçÙã]ôo\0òrÑ@n\ 1ö¾ó¾$fÔeÃö\14÷¤\16¦\a­\91Ò\9cO'ZÙ\84n\9fÖ\15%\17\9a\9f,\8féx¨\155\ 5½ÐJTþ²ãÞ°ÁÉÃÊZ\14'81\12üþ~6hÎÛ&·y|­>Ç\9dÜ\1e\99ZyÝ<zøv\8aßG\12\96ÀÞí^\9bUÇÍ%«rÏ;{\9fä\82Nq\92öÿ\ 4\9c\97\b=\1e+`w£±\9ax\12\94\87|¨µDÉYo\8b¢-°\9dùZ\9d\13ÛÅ;Ø?ô½ò\93bB»\8buR¥çãÊؾ\1chYìg;b9\1cÁ©2\97\16ù59\9bp½]Wï\1d\82\95§§]g¢{\1e\9eâö\ÇsLø\96\19&\8c9\831§Á\951EúݦÖ\95ð\1f$\8e®ÿü   È~\ 6\voÒ©qçþnÁ\1f<\9e\1e8ëâ\85³Ü\86Ô_W]c¼\88\8fÆÊà³Ôi6É[¡j¢\1fd¼ýTó²4\9d×Ä*\115\85&>êò\9d÷\9bïï\eFb{öÄgwÚ-NJKöYÇví \84Ý\98\14·>t/ÛZ¿=¦Õ9l\8dVGc®­tN{·R\17åó'Þj>7»\0Yl\1f/\ eÑuâ·ú\13\ f}ÜeZ«\99qb\17©\9a\8fí«:+»¦­.råûxWÐb¹Àùèð\85ö
+\ 3\90\89(\1eI\8f\98þ\90Íõ»×\85+v¦\94:aç-uÑn\ 6Ü\96iÇÒ­ÕKÍâ¦Ó÷²M\1eë&±\1cMìQ1\9aØñq£\ f\14\12ÓÂ\95Hÿ\89»7º±®\9b~6w&Ú¦­cÙª¯fX\8f2»ïls>jàÝi0ËJÊçX^\8e\ 5òx\94î\12\9dÄC\ f\8dì55è\9cZ\ 478>J½\v¦P]Åf:\9dº\90\13ÚïL0f>x`´ìËÅj¡åô­IÔsoZÜ\8e³t\8eû´\e\97òÍ sÌäÚ\18Íæa£\98·Óÿ\ 5ø\99\7f^νGÐØ?Ï]Êæ[\93òJS£¢\99©,ʳ\e>¨«ËR\87\998ìK\1dÉÕÝJô7ÌAX±w\8fçIáÝ\97+8Òõ\8c[¾ÓHé5¶\85*\fóµè\1e\93ÙýÜ\88ÙÂ\9e̼9¤D\9b\96[£s㺶ÃF9\9fÆ)ï*6¨é\ 2\1fAÄ.5\15ºAÝ·ºß?q¸³\}\9b1'¥ÕC8æÌô¦\ 2»\ 3ûsÁ\86\ 2¾ËÒ8û:ËrÙ×´á¢\9b[\fúµû\9e\13Ûê­§\fJaG\1f_¿mðÒÐv\1aÕ\8a­Ý©_k\1eo\fÓÌUú<]ì\ eÆ\8d
+?Ð)í¨Ùõ ~¾Õi3\15×\96x'[c\8e礠       T?3^©~æÕSu\83\9fØn®ÃºÜÖ  ³³!ðYÉ\1e£
+\eÆ\88|¹xYÑèõGB7\9f\9eòp\99föî§æ¦K1y\97ms§\9fxèLÍ
+[û÷äÛ\94N\ 3\8c\1eß\98\C}Ö+\94ße\9aõ\90§»µXcÄZ;\10µªÕ\XÕÌáq©ð9<ª`\81B\96\ fÆ\8b.\ f[=±L\82\eþ¿äà?|®¯K\1d7;õKfV¢«)\855·_¹èQß!£5iþÀm\86ýI\91\92»TxUX6-k\8c\99\ 66ôuvÞ7<sw¡üõ«\87[%¨Å\87A\c³B¦Ú+v\89\9f\bb\95+\96\ fs\8e*\93\91Ú-ÉÌvT¼n\ 2³8éUvÅ22ò
+Þîø)L\85\îO\98@»¤gc\9aø(lk\1cKwÒ\8b\ 6ßÙ0âòò<YCwý\19K³+öÖd\1caÔn\9e\94\\97.\ 5O\9eòW\9baÝì\8f\95À©UK¦f\15\e\15ìI®ÊdðµKró»/^×\99\9c&ýB\r#A~>là¹ð<¬äÌ\91Ãfã»\9f8!³±W\9afWSnù'æ9\9d\0J\e4C¹H\1e\82\81\95)¿z
+½{±ñ\8aF\19gpÇ\9b§\89@4<#CRÔ÷\90¯­\ 6r©ÚË7*\15¾\ ~êæõj\94òïc«Xú.Ú\85iOïæý\9dÆç\e\84\99\922Ê®&â\94ü>F\ 6Ù«ë6á\18»\13\81Å/\1f\1fv\90/D\9fiji­ü'~|\9d\1cÓ\85\18      \0M¿Æ\0\95X\13 \ek\aP¿ú\860\8b\0µÂ.@ûp!\8b¢]\v ûÙ\15 Âþ\r\90ö\17\ 3H\16Ú@HV \ 1\922º ór\87 \13¤U\90¹Ð\v\býç\f{ÆÉ\86\10
+\ 6q+\81Ì.K\83Ì\8d\8eRcbì\833Q¡©Óá5\1e5~\ 3\1d¨ÓРÎ:\80:7<Ôù¹î\ 1\0ÀHç'¿\0\96Âz\0µ\9bS¨W² ÞÍ\rê½Ç\0\99b8@\86Í2@Øq\13 µM\ f\8a¾\8b\0É\11S\80¤\99%Äú\0\90\r\8eC¼à_FZLÌ\ f\1a\9d÷á\99mG§àg\14\b\1e5\86\ ej:Aý\ 6¨r\0\7fy`C©³ìäßQÈÌ÷\b°¥ñ\ 5\98\1aV\0Æ\96úP,\auÚÆ\16\8auïPì\e\0Ä+\11\09\bÕ\9fºY\19\fTîrPù[\ 6\88X\99\ 1¤3XC\1c]\80\bÂ&cÞ|TßÃõ\8d\8eäË­\1d\15Æp¦\85\12\9b~¤À\8eÙúlê¿\ 1 [ñçD>\9a;B©Ï\86\ 2°\81³\0ؽy\ 6xÑÏ\0\1c«Ö\ 1vèr\0\9b.g\0˺\ e@Ïï\a@ǹoâéÏ\ 1\14Sá/\8a·,Tþ\1c\0ä\88\8e!\18\1d kÅ\8aw\9dã)Æ· H\ªÙu\11\8d
+\97N),{\1d*Ðj\83öë¥W\18\7f1¸7\1fýV©ö@`mþ\ 6\80\\94þ¿<è\183T\ 1\934\ e°\1dâÛ\12
+¡6\0Îmþ\15¥\1a»Pêê\ 3[F§ø\ 4\9b\ 6èv\9c\8f÷¥\19\15\13ÃYûí¦\96ü[Ô·rt¾oÔh¤Þ\17Q\91ü8áíLß\82ÇÝH½ôù2ë/vûê\13|\æÙéÎZÞ`ú¥nE\95O\ 2\95¯\8a_.ý\ 6\1a\94úÄÅ\7fEKãýÒ\1a௻\a\88º\80C¸4 Ò\1f\11à&ª\ 3¼\9ÄÃzñù\96âô'º|c"*\15ÂR¨\ eÂÄ×\19<g×v0Ëûü+à=ée\10\19Í\7f\85¿ÌpÇç\87¿¼\1fÛz\8cyûR\º»µ\98¾]\8a&u©__e÷³­gÝn\89 \7f\ 3ìF6¬W¦ñ\93¦\r/\9c\92¤\13\92\r\b\91x\0âá\92\80x\12­Ä\83.ÇÇ\90\85ó~\13>ªãSàGÝ×+Ü\94¾~<Ap¿½N\15\9f\9b\17¨?3è\8byl\ f\b÷ÀR\88ä     4>õ\887¿¹Kí\93\97\14Ú}wý\¨ü\8e\8fzéÔÎ\rJGN\br{iÑÅw\97O\1eý\r°âÏ°·,z°Ðæ±\ 6\88áÞ\ 1$.¾\0©\109\88\ 1\13K\9b\81\14©Ãgbx\ 4A»k¾\98V¸õS[ëúØeù\97\97?\1eùÍa÷üõ\9d¿\8dÁ³zU\83=}\99yKöl\9cgü).î\95S{\9aÞ¸]]|\1e¹¥\91>\bÖ\ 6ªÛ      9g\9a\ eq;\9cÊ\19Û¬õ\92\ 5ÔÏó¿\0ÐGÄ\ 1\1c\99J\80H\95f\80\0InaÓ\ e\92\v\ fsñé¶`¢Z9Ý\ f\9aï±äw'\9eú\10JìÂËÉÀ¹)\92r¾¼4âq6ßûð´:Í\12\8bÀµ\16<êf\9e½Ü\91Ï÷ª\87\ 3Ï3\aò8\1dìå´3ÝMðÒÑ\99Ö¥p;oÎ\11;\Mq\8b¥\vÈ\ 6!Ω5/Í?¿\ 1`\15\ 4êìYò\8fcòÇ\99Â×\8fÐü\8f 10×rÑcF×\82ÖkÓò\91^¦ç\9d¶¼xóz7íÒl~\8cÓ\86\1e[n\7fN\1e\8e88\\ fÙËÜß\17V|¼\9b¼ú\19gº¯\90[ÿ[/o\e\r¦e\9b\vE°âO\94\84ZY©Âð¾A*óxÍÏÖ\99U\96o}\17·Z\14/n\9dÔ¯\0\98\ 1n\9d TÏ0\ 1y\15\93<¨Ù(\1eÉ:\19Ò&Z\82\ 6\1cWóÎ\8fUó¦ÕRɹµ3Ë=\ 5\97{SÊÁ\r\ fÆ~\g×»Ê\12ì¶AÁ>ÛÑGyXàÚ\89,\16Ô¿\9b^PÂ×»\12U^ãS©½\1a¾.ã¥\1c3»Åmhû\8bòùñ5kïElÐd?Ò£\13\1dþ\0\9f\97\1fÀ\1eß\80R¿¡\fÈæ}    ²Ô"É/ʾ£ç\80μº5\ 3{Hr&w{nùÚ¹3«Ð.~\96z\87B÷$îªAVÙ\1a¾>·ÛL}eAãs·A§Û$5Ë\9aè\8fï«\\9b\v\96Å\ 2õ](\ 3\964\1fî¤fÖóWÎÐ\95ñZ\8f>ÁUgz¹h¾¾¡Ñ<Ý
\99\r.¯ß\0°\88å\ 1Áb#@\1a\9f\15Ènn?»Q9aò\ e\9bõGü<\14éïÝ\9b\1c\90K{ng]¡t©\1e\8a\ 2Öv^ë\16g\83êB´z\15BÙ`Æv¾:¥º«åXŶ\vµë¹æ¬ìx\86\913C}\89ééù\87µóótÿÕ\9am13      µ\9a¡Zé¨íë*lê[é\ 5§·îs*\95Ú¿\ 2\8eL<\a\88i\1eJ\r\8b\e\82k<®ÊÑëËé¯\87,¤Ã[£Ó\8eO<A#\87kj\ÜÕÃU2tÚ\9fâ\83µ\90[\9d_\ f/[iy}U\95Å\94ñt\93rä¥ÑÔZÛù\17K¹óô7òfhô\8a\9a\86\r Q©MsÑMRÇÂd\vñõÔR\r{*êÜ»CøÞ?H\f\8fÿ{\81Ýi\ 2KÕkO`7ªo@®\9d½¾«\8dÂÓw¦ôÝ+oöÞ%¥\9e|7K¡©}õ^Ên\97G¶jq¤Þ\\8bë »T\86í\81ù\1a\1c$üòªÎvp}\9e¹\9f\93P+íÐS\9cé©Ò?«×|ç¥xx7¥TÅeq2»\12½  eF«     µ\90/ãp0¿C\98\7f\ 3\ e¢s\1e\90\98\90\ 6\16È-k×\88r@bx<\87ÖÛ½é\13êpÚÍ'÷Ã$^¿\1dsãavÆH\15×nD×\97wcÉ\98AãÛ3\98îD\98ÛbJ\9eñ÷\85ªe{\1dC½>ѵâm\83ýdκ·q¨?ߣx\85\91£\15k0#6§$£À\88Í#®ü½\16®     Î\10åËo\0øÉ\1a\0\92[j°\8d\8e Ô{ë\1aÄÇÅéQ¸\19ÛËúåXn\8eÉ\9e÷õ¬\18lÙë*³9ìϹÕ\84 \92\ 5Ô\82\1a\eF\9b°Úóm¹Ü\9f\11´-LG2=RËà£M^ãíb\1c±3g´z\vgÙò\85@F
++TâU\8c\92ø\151\97øÃî\0ÿô8C¼~pú/ÀÏü<a·?@©Æ\1eJý¬· _\1cÞ\82T®¿¿?>ÍÕ\19]²Ëýs;8ïbña#\8fîg-û:¾ð\ 3·h¬èLmîd\86Í\19\99\8dºÓqUä\95ç -MôËr2f\86Rr¦p\94zW7Òn\8e\1dÅ£\82=ŬÛJ\ fGy«2\1c\15\19ÑÌ\16B?\rÏ£õß\0D;\1c\ 2òr\9f\81\1csvB\ 3ô·7½ÄO.\9ds#\99=]¸|Ò÷3Ns¶\9dÏó¶qÓ¥xùØ1\88¹(-ózOñ+³a«Õ\98NP»­ø\85JoÒì¸Âh3íÊ2\87\92\9aDÀ)UÌM®{á\9esnB\85\v?\ 3íÈ\16\aÚ³=\82ø$\9eÛ\81æ3îàñe\8eB¥=p\7f\ 3ìö\19\11ö¥´\ erÊÃñ®ëùè²\96\1fâI léXâ\17S'®Õ76\96ß\9c×Å»÷Zè\9fbÚH§Úøì(­\92íÕé­\8eÔ\14ÿ+Òãø\11°#\8b3x\19ÓK¢x"|e86W\86P­O·\ 3ª4½ðͬ\19qËq*\v\11
+Ür²\qï[Îåé\bξ\10\87ßð³\91ï\95 T©h\ 4ïóf~\8dÈ#wÚ=\aüñrí\b\92\em»ÑÅÜH {XÎNæÃø\ 4/0\17Ð\12ª\15'rNy½\8f¥1¸Õ©Q/Ø·¤c¶Ý\15\v\8c?\10¼«9\1aÌÅarþ\86oa­5ǦØS¿ûæ_=§}&z\ ekõ{NGX@<\8fý®\9bvûÝõûø\e\0YjK ûì\98w¯¸cÏv¥Þqs\ eÑÛÏ^ûîöû5\92ó\9eÖp&ÍVÓ\91¿1ã]ïªcS-ЮÄ7­Rõ2>i\93ë¨ÿD+\92xP\eÃÛ\ec\ 4mæq|t\94En͵¦ýÞ\v_ôøwùÐ\1dú\8dg7;ßa\9d3=lwÎͦÑ9\976Iì`wh\ 4nw8¾\1f\7f\ 3ìKc9\fjÒøjöè\96{ÜÞ\99ýó¬2\ eKV[Ö±\82õÖe/\1c/\16ÕùÂ@$ä8+ô;\ fu>1Þ\13\16Z\9c#.\1a%ÉL$é\12\14\87ªÍÕ\ 6ÁçÛä\97\13§Ëus\93aoÏ\16Æ]\97Î\1a\9dÑ7»cï\8d\96ÇV\166Ò~¶ÙfûÉRóö³¶tØ
+{?±\95\9aëþ\ 6\90ÍíÇð3Þ¸¯Ñg¤³§\ ewvL;ËÏ\97²\ e\ f¹²®\94\86ÍÅ»È\ f\8cþ¢ ÍαmOëUâ2Y\8bÂk\84[\ e\90
+³::¬\r7äÀÜ·Ë|*\13S}G[1½aiÈuóçÆ\88õ\84B²±Òöå\86Ó¦vÃ;cV\1e\19häMh¦y\86öIÜßl[1ý<1ÍQð+ÞJs,^ÍÌ»v<¯ÚÕ]³âWmìÑ+­Ë÷¨`~v»\8a\81eÎIÖÞÙå²\1eM©bÝ\9cl&Ûý\888`7ñ>\98\86BÐB¾\ 3Fßâ\9cí·ó}¢\1cWºçË¡ÙQ\86Ó\1e«õe©M\93Ã9à²ÝZ\ f\9c{+uÂSM{~j4íÑfÖì½\9fv³çå\92\10Å\9fçoð.}\91:ñãvi?Câ²íà\8düº,¬IóS¡I\9dl\11\ 5mÊ¡\rÕ\94?ܤG¹ª|2à4:m\\8f\82I\r\1f¼UO½9LÝd\12?´tk\13Ý\92\84\15Y\1f»ÖÛaöÚa\96û\95ÐÚ\9c\1c­\95)\84v\13«bWzïOS´ \97(Z0r\1aMbýmÃ])ç\86;\15\7fÅ%nmÊ\87\9b\15'\83ͶÛ*g××ý\9aX0\ 4\8aê\84·Å¦óv\9b\98ô       ,?ÆCª)\17Ó¥áðuòg\ 3àÎm\1ey4Î}±\18=»7y\11\8a\84°\8dk5Ûn=JU&e`L\vYa\83æ EMi\11í&n»ÆYX^\e£,\99j\14^\17ªQ¸Ø\1auãÀ\96\9a<\903U\9e\82_áf\87\99\82³¤øÜFzëØb\81¿3:1\15RÓ9\89e&\88f¡Ò}(\93"Õ?$\v(ayr8~û\9cNú.h-z%.»ïø$¸³Æí\16¶Û³m\9aé\9aK²Åij©)l\8d\16}¶|ã\9au\95FiôYSªG_¨êêø©ûâ Z÷»-¥>»N×u\8awÜZ\88[?QªÉó¿°\v*fÞ"i\1d]Dø=¥\13\99ÎÜ}<Þ¥©XªÌAJXÝÍê\0iL\18.Ûmq½É£6éÌ߯9Û²Î\16cW\16ÇÖ\8eÒîÍcKIÎ\11Ðç\8e\94¢\v\17#Û({³
+¥Õ6L]§÷\83Z´ÿh5&[·«àe?ªk#\87T;ܹ   \17\83\93i5u¼Z\10¡ó\e¬½½F\97sþöÕ\al1I\b8\9dÍ\8c\8fÂ\97øD&¯AfÒ\889ñÆS=%,´;\81\88ð,s\7f\8c\98mÏÖZ\ 2¡-\9a¹P´é"è\1f\eÕ\ÿNÍÆ\83 nL;\9fZ\9c\92ðê\17\95\8aÕ®`4+[ÿ>¨`4\9a\9c,.\vû¾]&\85£W:ÕèLIz\1d를1\99@¬´ß°ª:·\8f¾cÑh:ëJÁ\98§OOQSj\1eÏM\17·\9eré£\9dp\92¢Ú_ûÈ0<©%®¡æIa\ 6ô\84\8djüQ¨F*\98×[èeQcÉ}\92n`¹«8ÊÒ­`Ïͽ<¤öa\12%\9b*^×a.É K\15¦|\97+Ôð\8d\9a÷Ý´\95\9fK\9d\91?\7fó\8dB\1aû\ 1üÌ?/?0z\87\4}v»þØé\1f\1eb\r\80\rµkÇ7Ç»öW\ e2\fænñ¦\\96²\rϨ\16©9\8bÕjñîDU¿®Õª8\13¹]>h½^\99\f\94\8fkâO\ 41[\e\17<»¦å¡µjä\edÍÊ\992{Ì®\14þA~\9fæ\87´f Oö\1a­$@vÚ'\9cÅu\f\11O\7f\83¦¸\82\8c\1cOÔ*)(\91\1d%fTgÞâ\1c\ 6-å÷ͼ·|4¦´\14ÖÍî7¨±ø5®f.«où0\15Ó%\99®CMm\ 2/Ô2w"?ç/¹\9c)n\8aÙø²¬dÙ\92Q'{µ1M8ºÚ!°·1ÀÉïr\8c\9d¬g²\86Æ
+(±C¯û\81\aq\ 4èd\98Æ!\8a¹ß\02¾\ 12ûO\e Í>\a\10Ã\96!^3\80\98-\a Î)\0\88\82\13\0az4È|L\ 1d\ïçÈofNÚ #sW\90é\19\ 1È4N)\88/\ e2ÅR\11B\80¿·¸é\80\fú\96@\ 6\e\98\10/\17\86\ f1ÿ\82LùEÄÛÇ\19\8f±º\8e&ÀÞ\82ÑGÿAâ\1dü¿\97\7fK\8d \16
+Tx\80\\8e2@3Y\1d\87\b#\80\1c@\16\93&@\ 6'\11 ÄW\a\19\1fÚ0\99Óø\ 62Ö6\82²ý4\\ 3`$D»\ 2\9fØAøÜ÷@\86Ce\88Ñ\ 2dxä\ 2Á\87±\83¯3ïC\ ej#\8d\11\16\9d\ fð(?%Ðß\0\85\86¥Y\81:/\1a\aÐz4\ 2¨Ô3\7f\ª³\93\vP\99|\ 3´'ç\ 1\8aX\f@n1,sµd\ 2¤-ì\ 1B\1a\1eÈ|/o\90ye\10\b
+ÖÒY¨Bl\18\90±ï\1cÈl\8bc\bm\11;<r}\1fÄl\10\9dÆ\85O\94\8f;IÀe8a\8bxXò?XàÍ\9fØË_Ì\90ß\0+þ       ¥\1aL\eªÜñ\0ÝdÇ\0ý\98K\80\91\993\84ô\ 5¨ï\14\ 1:\ fY\80ÒÐØFQn\99\8f?~hÕ}\ 2Dø|\0ÂVq\80Ôº\ 5\b\83\8a\9dó¦\1dó£\v\1fã¥ôø=\9c\16õHÖÅcx}Û~0µÖñë\85¸è«1Xb~ø\910ßÜt±';þfþ\v\89í\99<\ 1RB\9b\0M\8f \8eõk\00¢5\ 6\98âo\0¶l_!\9c\14À\84°\ 4°l¾\ 3Ð\174bQÝXCÑî)\1e\b®ÿ>Z.x\8b\r\1f\8dÎ\8a\97\8dFDX\ eoRH\85
+\92I6\8bÃò®:\b\1e\83ñ4¨¹\17Û\8f&ïÛ\13lrÑ3eb\99GÏó\91\a2=!\1eÿ\9agng\81üþ\ 6\80\8c\8bPgGg¡D\84Oâe§\0/Vm\80ÓKïÇ¥Êa\bÀ1ª\ 2°\ 3×\8d\ fÙñä-©\14\9c\1dz%'Tñï9xv3~P\1fÇñ+À\11äE\8b\7f§\ve\9fifëO\10³\9dg\87\9d\88ÏtÊÓ½\9dWrïÇ3õº\8dÔüçªH~â\1d¼h\9398ëZãí~\8a\8fà7ÀæIC©Çc\a\16dmðs\96\1fà¶ä\0ü\15<\0\91æ0\80_\8cÚ[>ç\99Ð{\9e\ 6Á¼5W^f\9a_øK¯\95Üì÷ÜØ\85ó3}Ï>\1f\1c\89¿½}\8fH{\83¨HÜ]¦R¼çfuê6
+\a½ë½¬\8f/³4Ø\9eÞÃÇÙýô\1f/7-Øѱ\7f\1a\ 5\87\13ìsÇçã7üô\9bºØ\ 2X9ê\ 2\1c\91\87\0?\97ô$\11î>¹\9bÑ\aÄz\83½\8bpU\1a¼>«ú«\ 5jí§\8d>\84\a//ToX\11\17w9ÃloãGνªöû~¡Ú[ÿlÌ·ñé}³2§6a%á£îFºVÝô\rë\1e¹Êlv 3în\9f\ 3\97û®\94Þ>\1d\95\e?¶O¯ëÙ\86õ½þ\ 6\80j\1aÔ© \1d\80Ë\96\b%J\v@<\12_o\19Zr%\8eIê&\b\11\ f÷7\93Zþ±§Ï\8dû9¢;·rp\11.\r\9d\1aAK<\9e¹ßðºr3Ç\95säÓæép(Mî\ar8    ÷ù\91üÝ\8d÷\1aéxä±î¨çÚ`;»¯\16vsî\1c­et½o¾\ 3ë\ 6?³éºòeÍ\85µÓo\0èÃ\86\1a,Òo<\82\86êv\99¤luc¹¬ûa\83\f\ 2ß\9a      ß\a\90\9b\87ä
+\97&ÆÕO\9d\85ÓrÑÌ\90;\1cE<Ù#ØËﳺ\9b\9c\16\86ãE\9aµõ\9f\83ý¶\91\1f\m\93\1f¼¬x=NYlz\93ÛXÍ\80^;âH]c\97\9b½"cp^\9eV¯ó²\90=\9e\16å¢xø\r°ÖÏ­\9f~Ó`»\80\18\96&\80l>WI*ÔS4½\14¯/ö¦Þ\1eÃ8ôo\8fjïs^\8d»\88ËíV¹\83ë\14jû¢½n9Ïê\80Ûê\v\17â]±ÖÍ\8d¾±³ãõ\ 6éK»5Þæ.«á\HNH.O\91\99^\16*^i1±Ô¡ù@\ 2Ó¬©õ\831÷sG=ê~öú"óÜý\ 6\80ñ\8f\16Àçrï_±h¤\83®@¶»>\ 5Ñþ~|\ e$ìpWìi²¸=\83Çâéò§;8\14òelWµµüÖ8\115ëóØ0VÚ\10úë}\96\1c®\8eQ8Y\9e]g¶,\84«Õ¢ü\98ïÌÚer1ô\92\15éÑð\85ë­\vß\9a¯[\99é¼\83\8fíyê8ÛÏúu!é\9e3$hÛ¿\ 1\8eK)\ 6àþ\8aKbÑ\14\90ÍTÖïÛ¤¿{uæ\82å]Æ\aëòÞ<lw\8f¡çÃh \ 5Îkh}íø\8bâV\ f7\8aë\ 3\86ÕVÒü\94ì{.Ç̤·¨\k\82Y_#c\83Ö£¹Î\bÇÕ|mÝ\ e3{÷ðfÈ\17ÿj\83\9e\88"+O\8foo5\15\97ßí4'Ķz!=ë7À\ 6\8a3\80¨^ù\9f­\bn9\85\ 5ʬ#mMXÏ=\1f\e÷*Û\98\9f3equÌ}/ÇÝ,C>¶\fÝ{[\88¹I¯\87F\9eX^-«¸\98\12lݤÌ\14£ÇY»7ÿ¼\95á<}êLfè\8e64b\96ÛLsf%qÛ©£G?PîõKVQ3¶ Tn5\1dbjM\9e°MLf\f¿þ\r\0/\94Û\80\10Â\ 1 ·\97\19ÈnÄMHÛûÅCÒLõ\12+\8b\91+\ 4¨¾WoR\92Ébûö\ e\17k[Í\ 6kQì\80åMõ1óUid\rÓøÿé:Ó%\ 5\95&L_\v\8aྠ 
+\88("\8bÈ*"¸â.®\94Þÿ@\9f\99èèùóT\13Ñ\ 6IQKæ[Yŵf1E\9d0³.Þ1\10\9b\84 \1cj\87ÇB\e\9f/sW\8döîJ%r\87\8bb\ f1X¡ð\12§PìÞ\90ã,ê¥\98ý U\aÿ½ø\ f\0åÈÄÔd@\ 1\85Gd¼OËÒôÆ\97\93\ eöÙgIØV\92)dED5/ð¡I8Oü\81묺h¼§8gfìN    fÐ\94\8bFßͧ+ìz±| &e`Óã\8b-\fÔÛ\90\90\95g\ f³ä\98Æ\ 2\99öG'iþÚARw=§¥ì¤¥&\bÜ\ 4«\1fLÿBÒ\97¸ÄÎ\18\13A\91Ȥ*ÇÝ\8bnòÉð{Ì\81É'\13À&>óëÉNP\17³ÅÅñ\91u}5;Ö­ÓÔТ»í6\b`\ 6±\971ò¹*:Ù\eç²6FµÆ8ñQ(\95\1c"]\19À7QúF»\89\94=îf#äúL\9b\80¸1øX,¼
+\848äÞ²8ì\r\9c\ 4òôÿ\v\80î$æGE\8b+J89k\ 5¼u\98¡\ fj·<¬ÛÛJ0bWä©<
\8dix»\b¤g¦¸\13¶·w(\7f~µ²¥ïË\10\9aêwr 39­¡ÚEõ\91¡jÊTû\122\v/i\89\8bÌÁ\bU\87ªX\14\87ÎP:ø[á\84Ä\ fA½î\1a\82\1a\19¢ Þ2V\82\92#\9c\1f¤\ 1û¿\17?HÆ{\93\ 5\ 5e$=Ú\1f\93?\11Ù\a¾Ï.\14<,Nxr­\v\85ÎÂÓ7\ 3\1f½s\93Ù8»õ\9cW-·±ü©p26Ôî>9VÉXÃ\880£Úb\17U:q6=QYZT\9cÆhõ\91Ú¢è´{CY¬KB\ 3\81>d\96ý{`^û\96Â\95û\96\8a\rú÷ãÁLðv\ 6xöcÿ\85¤Û;I\95\1elù"k¹Æ\81\16\95t\85=\1c\ eË\8dMýuk,ßå%\19ô\16\13Þ\93×°2½_EÛöèóÂì\87Ø^¯0ÎUk\16 §ê´­¯üå\v°Äû\9bâ¨Ð\18Ö\86\87e\85\10Î\1eÊ\ e\8cê}Ø·\vw\9d\97×û\bítöìÍ\v/¤7/^¸ÞG\1ci æ\16ßñ\16æ_\0ymþ\8f\17B8EÄ¢º[RXms"/µ\955\9fT\17\19½Ù\98\8f\9a(íFÆJt:\87\86aå¸y*wëûcv«é-î¨NË×»\ 2±\83Xêkß\8c¸[\99èP%Ȳ\80]áfÿÙÛwx÷ëõ{óW0æ\16ÑÊåx³~ì®_A\96CZ\9b.\87Ô05ÁÈäx^ù\7f\90
+]ÿ^\80üûÙ½q\17«ypE¬\18\16¾\97òºù\91J\8b9
+\17üBõT\99i«)9¥T±o-Ö\ fÕ(}è©\16M6KÕ-Tvr\0¼«\94¯5\9e¢Ì\85\1fájpðÀª\17\8b?:tpªó\10íµzpEçº\9bHWºÅòÊe¥1¼g+\r/ÃV\92·ÊV\8a\ 5\85­@´ÉJ\8cð'\92Á\1eé^ªùCe\97\8c\94ùM},\15\96\1d\15M\13Ç|¡%gg\13¸\94\9b¶³ùº\9dÝ¿\19c'¹£   v,\98\9bÌåÅóµ\1e\85\añ(V¿\9fH0:î{Ð:2\10?/\ 2´×[o+ÜÀ\9c\12ÝRCfÙjy<b\1auϦu\1dli\9c0Ó­$4^Q;4\ eÇ\12\8dçh\93n¾    ã/¼\9aÉÿ\1dm\94\18ÓDWÖ\88Ì\a¹@Ïz5        ú: 4\ 6Öª¨\15\8d=m´&\93\ fÁ«\80Ù¨òòÖL»çhwÝ/\86\97M'\14HøqîÏ\båÎw¯\ 4è!
+\ 4ww\85}\89UVS\8cÑæ\16M\13í±Ð±½­ÙNFòuÛ]úqÛ]ùí6Ýø\8amº@\9b\7f!M¸LËkqõH*ô¼C×\93¨\9e[d\18\1dnèwê\88ãØ\1a\143/}<¿ÀÚ£\1e7T/ÞÐòÀå\86#y
+éC]Ñg\83©\9c_ö¡p½ë­úÊ\85\133Ä«[q¿_æJîÓØ\93¾wN\8d\8eó\fÚí\19Ø\vm\b\a\ 6Å9í\15\ 5·oo
+îÜZ­å\8d\12[K_3Z}ndþ\85\13®òÅmùÅå\96\1dê
+ÏGtåë\12W+¶V\89c\9aö\9bq8º\8f\16+\8b\v\99\97Âw\1d\17/0Ä     ÏL ÷¿PÇäùÎÇãBÇ]u\15vt`\e1\161ø½\10Ó­7\9ak\7f\8c\9dq@\8bê}ê\83\96\90et2ìÏ\16ä(\8f=ÉPè¦ÛãHñ¶\10É\92\14\19Ä\ 1\ eÿÄ\8e×|de\95\1f¼É¯{k{±Íi\9f\87~\8aøhL7/Wig\ eoâdÞ\ 6CR\1d\97\a³Ã\80ìÃÍ\ eß\eºùt\8d {|\1e,vâÍ}\86ä\95-Ýfº§\ eÓ£\9fmNhg¨>G\16[ÃA\e'wá¤GVÊ;\8d\85\80¨wÖ\ f¢N\87\ 4Q/âCü\12\ft|ÒbÍ¿\90n%©7êp°\80ôÌLs¼·í»ï»QÍ\v\89\95ÅåIÚIÍÓ\90<lÏý^0¾ñ\83ó:Ó+ùïz÷<xwX£ü\10\98Öõ u>öÜédfî¢\9d³´\1d\95wG×\96ø5\0©ÀNÚ\ 4\88óøÒÄ##îâ\ 6Ù\1d7\1f«uд\85νi\ f;xÓn®úÍVpR±wëjü\85\857ó2^-»z;\f\92¹\er\83¿\8e]f\93\98ÈÁ»!¹ÐÓI\9a_çò{®v\e¼ºØËÈ1ϹQ¥gªÝêp¸Æµ\91\98\1fRÅâhÒ\92dÍ%Um´ .7mO4¹ù\1d'\aK¨é\84\97\12\ 6Èr\vc¦ü\0\83:\a«Áíð0Á\ejÀò*\r<\1a0U\14\ep\8dÑþ¼\14Þc'Vòwcßé^ÆïÉî\1f+\85\17Ï®ùü`¾`\8d-¶d:\8dÎ\87f»£|'\87
+ujûà[-yF±dC®¥Î-\81ke     ·¾\84Þ|sÔ\14û\f0\1fc£nØX\10£k#·\9c\7fë\ 2z)ÖÂQ\81¬\95\9e#¡zX>ìª2\18쪵üë[9߶Tå\1c@ü_\98Ú\8fj\1aß\98Ã$
+\1e¿\99ÙAÚ\11 ü±²\17\80y\16\8fn§§(§v¡]\80\12\82\92Ú9®\10Æ÷ÛÄ©Ó³\9d\17\16ã²Ç~£\8fnÄúF?\8eë\85ÇŪ\95ã\9d[U\99˲r     â4¾)ß6Ù{Ù\1crpé¹\9fÕK\8eüeKí\1a¯\14ãËÁ+ÎtüXdð3ü\17,\94\9a\1då\82\ 4%&R­U/ìÌ\17\8c½_N©\8dsÕ[5¹\9c\1eÖH\984öÀÛpöÝdÐø\8be\ f§\\ 3¹l\vµ\9d¥\97ªGwP­\üN£Ò\84;DÙ\1ctÚ%gÔ`\8bñ\11ï\17\99zG*p8kä\97öx\9eGâí\1eÝxÅ7:dÇi\82ì   GvËJ*w'¥*ÿ\85     N]\8e²`\80­ðª5\96ÿXI%\9e\12UDW\13\ 2W¦fsÖ/\ 6XvÿÚÔ7Z°­I¤¼«ª\9dÞ±2é¶.e\12ÍD¥v1JßM\91©®\9f\ 5_[Ä\85ìm å\91\97\99E\87\1d§\80ìæ³*"u\8fDNí_\98\=_\16áÉ\887áfy½ÊÞN¹KÖ\1c³ K6´Ü_\0\19\93¨\83lAùI\1fý\11(³î\87\ 1Ù\19.$°t\90\1d^\ 3\90eÉ+È\96ô\fÈ<N5\90Y\16i\90q\86#\90Q}3Ás\ e2\83Â:\ 1}\ 4\99\8erO°\0      âä\ e4\95ü\82vÛ Ãàé\98\96\94Ói\82×
+dØæ1Î)èñ½®\82ã{°Þ\1fR\1cÿ\ 2ÈìèÄTÁm\82ìùM\81l\b\ 1\8c\f\86        ö&È^Ñ%Èn\87\11Èê+øçiº0\ 6²åvòøYG\ 6\99çÅ\ 6\99\13\12$ w ³\1a\9d\13Ì\9f 3=\7fAÆ-ä\13ðõ\ 4ë\ eÈÌX5Áv\16óÐ}ý\16ª¯Ã+Ô®§×\bÛ\9e\9d\95\8cË\92\9c¶´\9fò\17@æÛ­\81ì:ÄÿQ'ÿI\99V¦#\90\8c\83\ e\80ûÌ\1aÀmÿ\ e`\14  \e\91É#Í'=\90\1dm\14\90å²Óä\85¥ÚtEØ'\98ß~\9e\ 6>Ä \9bËf\13\ 4Fò£Ü\83\8d\91bI~\vrz\1a\90&/\9f\8a\1eç\97xzhSöôÀ:øé\1eE¹ã_\0YZ©\ 38\17%v*¥Ö\8fr{HBÎ\)M\98.3.Èeg!\80\8f©\82>m\16\0<\90\b\076}\90ýÄ\1aÈîjn\82Ñ\ 6dýù9æ_ö-F¦ëø½iì2o!z\16Þ\ 5³P\7fíÈnûU\9eÚÂãÒ\r\7f¢µ[?òoOý\13Þ¨Ct\8cb%<E³Úü\14Ñ\17ã\98âô\vImÎ\e\89\95\19\1cä2,\ 5râ¶\ara[\ 3¹hé\83Üü¹\a9      \8bA\8eTK \ao~\ en\86WÏA\8c\1aÉè;<>§¯=ú\f^\15ö\19>\8f\8fïùY§¾÷Çå\9aDJ\13½ ?\9ax¿t7íIóNR\97î­Íb\93\bªÑÞ\15.R\9bK¿\87\1dÎ\9bÕ÷p\1e\ en\87Ó.ôw?HnóßÅ\ f\92
+]§Y½\8dÄTQn\81Ü\a\1e\0\18é     Ø\ 1@\ 4ê\b\10L\ 3ñÚ\9c\95Þ£¼J¼ª*É>\eleøÀkðøn\rQçö
+Ðà6mU¶\11Ð\8aiK\8b<\8c¼GPâß]\83Ê\0¾r'¯rYu^ÔyË1òIÎsöáÚ¯\ 4û»\88n÷äþºÙMsÖr×^Ë\7f\ 2Àò£\ erx«  rW\8fJóe\7f¾\e\85Â7\13 Uz        Ð\9cq\8e\v7åýªÍáìøì+wª¥\13ÑgÇ2Qf\8a\v×d\8a\18_ÖYܾäÛ\8dùYÔ««ÓþPÚ\9fªµFt\1c\ f\eï\83.c\99ýý,Tö-ìÑ\v?¹R\9a\rüÌt\9b\83óËM\1e\r\83õv;÷×¢hÌ×¥ÒÈû\85¤Yf\12S½ôã\8e\ 1ZqFé\87\19m\80î\8dU\<Û§§\8eÆ×»sQß\91ïæá+r<¤±çy\87\eÄI\99\11ôQ\93\vý\ 3\91\7fJûÖs©íܺo\85\1f}9\ fÙÃr½] þ~\9b\e\1eï\9b\98Ýä\95ac]\9aÅÃå¹õÔ\97\8dYa¾Àý\9d\e<¤Í,°+3÷?¤¹\83ÿ^$\15Úh\0\ 4µp\80¼ê,@ý\8b\fòMÁ\89ÃâzõÔ\9fßÕíC\rÃëju¿\9c÷ªü>^[_xï¬\86Å\1dS.ÖÃn\f¨-¿ßw7\82;\15ÖáÍRÖå\8a\9e®­­\94\81î.Ï¡µ\bÙé~aô÷\8fà\11æ\91\80*\a´O×_ò¼Û-:Þb\ 1\1c\8f篶\87 [ë/\80\9cÞIìì\a8@¥T\98l\16\14\90߸éy6¯ó\9a\9aÝiVr¯kÿ>?W\9f½Í¡å\1a§]\ 6ý>·\ 3D\876E\19ϯ+t¾¾¼\1c\ fÄ\12\ 3\vzA<ì~àÔ\fÉ\8f\87\86îÓ\811\9dÏßöÒ[|Ý\83Ç\a\190Ûä\8c\86»+<RÏÆ-[ødª¼\eæ´ææ\rç"äô¿\0r[¶\ e\90ã\9d\0èÍçA>  \84\16:\8fg÷hDÈú59×¢\9e¹\8f\17òýÛz3B¸óê\\ 1éBþ\12'\f(xy\18ê\ 3%[õ!úØ\9cÃä²ãõ\a\ e7ÛÌ\1dÑÝ9êØ-\ 3g:UñåʹØñÕÁ@\1f±MöK[Ï#/[\8eªéV»­LÌ\18ðZ\8añ\7fH\1d¨´L^¼ÜH\9a'Lþh\93 \1fw\95·
+u'7ß«\8f.Ih9<´'®\1cö»_sS^ôç+Lzí\16T\99½øóæã9ï¹Æ×\eH}t&vê\15W.CÍé\18¹¶\9d+sM\13\95í{k+Ú¤¶\9fXmi?3gg(4\19M\ 5\86\7f¯\13\ 6Üs\ 6ú*w\19ëýóQM¡è¨¶\94\7f!yñ\1e\96¼ø&\ 5òZ\9cfLjêóv\8aå\b\95\83Ô³9Þõ\ 5½ëåjÂF\ 2ÎxÕd i\10\87âÒÏ\ eÏ;o}Ö¢Yé\95}ºÕí5ãD\94\8eØ\8fb¯b½ÞUÌ\ 4·\1c\95<oôò\19I_uó¦\8e.ÙåDL\864m?êU5\99\0ém´Ê«-kU\98\93ǧ\15\18ý\ 2@\9cUbê®ß\ 1ùKAx]¤çð\ 63[æ<&"bïmÊÄV4\96ÝÕõ@J\8bökjø\9c\93\9f\9e±v\8fR9Õl¦\98>\8bìGÜ~[ï}>cÎ;!b,\88yE_£Js\12f\ 4zR¢F\ 3­Ú\14ÔñØ\9a{ê5Î$õ7;\14U\\14\19åQÚ\8aÊ\ 3¿K)F\7fág+ÉñÔ\ 4èW¥A\ 1©       7\8e\19\93'½Þ­\1c:J¶\12®+Nm}îs\9deË}        ~\10vÆÞv\18N]õV\ e\9c\eð·v\ei\1eͯy¿\19˼õÖ×O>3       ·X^;,
+µñY\8bÓ5i5\92n]å1¸\8d\94Ö®`ËnEØÊ\9ds-+}Ü\a%}f½\81ôÙèâ¿\18þ\ 2@³÷&ÈÓ3æ¥\9d\86ÌY=v\8b\87Nk\97ßõnfa[\8aÈô$\8b\15Q\ 4d0\97,n>xæåYµ§YS<ûôìö\81[\9aþí\1a\1aý\81\vOü®\1d\87o0¾´6Yõ\86ÍJʳb6å÷GêH߬*H\19`NF\vï»\1c!Yí=B*
+\9eàç*\aR-       #¤Õø\13\0%@bª¶dnß\19[?5·Yt\9f¡'È6\9cÖsëó\ 3\14\16q5húü¸Ãxe$\12§\91Fëöôê8\16\14W|cPY¥   \97\93=\81ï5uó¸\8c\9b-û¡<oüW\8eWMDúÎ+5)ë ­\11¢£=Q8\90ãá®fúò\8eÜ\86å9ÒH`sÃÑ'\1a¤è\ f¥ü{ð\vI_\82\9b?y\9dë\r}\91º\18|èTÍl(ÀõìFñ^Ù\151³rA÷Û«Í\vó|ÛÕîFß¡º_Õê\96\18Üî³Éþ3Xh\8dÚg«Þ\83ùQ\99\9b̬²/\89KfÀQß¾\97Åbs\9b\9eÝ=\94äSWP\85»<¸ì\9b³ÁDÞ]\ 6\13eS\1dLT\8aI õ\a\97£û\ 3þ\17\92)        ÅÞ\8aÄ\90ç:ÿÍî3\18\ 3mËè\vZÝøÉg1\93;Y\1f\85sé&Ù\99ª\84ä\94Ìu9ë«îFÆ:®L&\87\93çh\8dgu®ÚÉ\8c¦t\a/g*\85Ëhµ½<Å­í\7f\87rs\9c\17ÆU¹1Ð\vr§oÁú\90\7f\rN\16?-\f\8fü´Ø/%\88;üKì¦\13AZò)z¿\90ô¥fóîÆxùh\15}(\1c<¿\9fõ¥ä\7f\96íbýí/£mìI×\ 5ê6g\1afÏnYÚì\8b\13A\97\9a\90ªMòcKM\~OþV\8dÅ\8f\ eí\13áH¨?ObiáÜ\84\8f\aQ\8b\8f\ 2^åß0Nõ>ù\9eÐc»\96ÑËÀ\95\90\vÖ0ÚËä6T/\83 ½\1eË×þDÒ\97\98æµ\10Rià±÷4\ 2lK`\13¯\88\vó\ eü×õ1/.\a\ f\89\8cÓ©\16ª\16|Ü´ô=ßîiWò$«¯2«+\10t\9eJ}LðG\85\15²\1e\1eñÍ^Ð.êu@ô\9a/þýÍez\9fW¦ÔËD\99t¿'\97;æ{]¡ÞÓºùëkÓÍG/¤\9bßIDW(Ľ\7fÁý\ 2È»\13ò¬:Ùì.×ýÆkí ½\16³\0zÌ·ÝÁÕ\8d èìL¿g`õÂeºôm\88[\15\9f4\86(«¾>úP\81®9U\1aäæ\96¸çhoX×/\8bÁ\1d\99lûNÐ>ñ3·þìqå×\97ë£\8fB·°8`¬\84æ8æȶT¦¶X-\98Úr\95ejÓv\93Q^;\8eQN\9bô;ì?å/Üc¤Q:¼äÑg;ªoÞËç¦ý
+àéé1;]sgÇ¥\85½Åwø§1RûÈ\ 4«¡Uõ}òZJæØéIùà,\89òW\99\bQ\ 3±\a-e\99fBò\1f¨¿â¡7yàV&\1cuÅú\15°ré\8c2cä\§õâ\87éÜù\86ܱ\90mбÐ-Ô1?\³cF>\9b`ÃuÌÐïþÂu\98çs»`\87üS\9bé\12\1e\13\14_ÞþØ\8b¦vu~´\90þ7ÔUdsÑnÖ\ e¨±\1f\14äe·Ó\18í\98\ f=¼ÐF_ ¦\84Ò\8fñ¯Áw\87æ´\87ä\98\80Ë\7fë\89\803söÀ\9b\8eìw®c7ÏÕöÛΧß^mw.¬D}&×95Ç7\1fj^æ\1aÔ<»d(ï¹áþÂir¹dþ©MgB¾|4òî®\ 1=ÎvW¢öúÑ\9e¬Çλ\18*A\ 5\8edt^MólF\95Ù£<Ôskr0\85ùn\1fê"ÃÞ2>\8e¹¡eZÝ
+Æxl½R_1ÍFåØy\1eÀ½\1d\10õ=ä*\14\87àTk9\1c\8b­~      \9eµ\90G\1c·\90¥Y'7í#Mnê·.¹A\8fi\13ø)ÿÃ>S¨\815¶Pß\ 1÷z=gãkõj\7f¾ÂÁ\90ðÍvüêA\v9ßîÌGÕd\16\1cF\8cü\12ì\9c\86ôç\15ºÎ÷Â2Å\85µg¯+ï}\91m\bÃ1\83K\º+\82n\rH¿Ó\195Ã6Û¯\©\9eXÿ´\ 6J§Hn72I\96\8a{\81Ø?ú.!;Ø\93\90û\97*Qù\14\920Ú(tñÓ(ËþB2tîâÅì^yy²ÃFÎû<?ýèièw§YPs¥äÊò\Är\87Ù\80^i\8b~7
+Ï<â\9c\ 1·co\85®\8a\1c\e,¶_v\18bíð\9dX\92¤öwÜ×ÛÙ\119¥ø#³l I¬G\8e\1eý\17q¤¦(Q\9bÝq|\92i¦C'\8e-\96vóÖW"\1c\9b
+µ¦\11\8eZM¢«°\7fá§\aÍ·óé}ú°Îg\v\99\96÷\93æ\84[+=Ã\vÄsðp\aô\8bw9iã;ìU^.Øf\Hól\18\8bá º\93c
+\1d¶Àaí^\85ëP«q\9fom\rN&÷\ ec\90\15Ð÷\88Ff¸ÅuÅ¿7ï\97{¶ÙÂë\rlj«\1cÖig\8dÆ\a=\9c°NcQl\80ðA4<.Ãþ\87TRý÷Â_\rö\ f×(~.Ö²B\1d\9a¹U\82\10ÏûÏlÀÀ´ÍI\17Ó`ZBÝj/N\15¯\8d4\98-%ÌýGk\97½Ã­ò¸X%\95¨I\12Ú³Îà·>#àĶ¯¦\19ÄNIu°Xq\16\18\1d_N\r\9fE@#»àJõ¥r¡ëÈ\15\93ë\bø¬j\9by\ 4×6\£^\13^,\95`@ÿ¬á\95®v×ì\1eô:ïlUvp_\8ejøÏ9·\ 3\86\1cM9\19qtúݸ«Ôz;ÖZRĬIõÉ\1d\89kßyáwÑË4_vPhv\90S\1dó\86÷V#°îl\ 3~\83A}0,ªµí¾nÕJU.¨Ê®s¬Véï§2ÞsåJC>¦ùiå\88âµ²\1e\7f6e|{\86˸Ѩ\97ñQ£ñ\vö· \1cõãc\13ªÞ\1aZ\8d\14½åÿcbåbêt'Ü+­ð\91\e\12:20p»O\86MW$ÏØÜfÒ­\8b\8dŬýi E\11©\17Z\83R­L³µª²\13\89Ê¥"v*ØÔâËÆÇ\e\95\9còJ/ÆêÝ+Ò\9fæ¾ð\r}Pà*P)M\90¥Ó<X9ߧGó|\9fé¼\13\88ßÿ\90Üæ§4$ñ¶SÁ\e^\8d\ eÛÎÿ¬¬&ÃFç3?©­²ü\196\9f\87u[\r³Ñ¯n×õÂMßÖʯñ±Zû\88×ʤ+>Êf\9f}\97\1c\11ÿ\14ã\ 3\ 1\17\99\1a\91/pÍrêÙä\97\16ÖÈ#oª\85\ ei\81Cv¾-#\12÷qsÇug\97à\14çÔ!^ÌÕ\8b:\91«\97àA\82úè\17ÆS¹¾\96J\80õ\a3Óp9Y¹Ù\9dO\ 44òØz§bJ³Ý)sõ\81\1dóµòÓ\1eW.ÞÈ(ß\16]»ôÜ`\89\v´/x\85ï)ö\vÙè¸È#O\7f\85\ eÛ³-²ó\9c="±ËKî¸Ø<rud÷\81'Ã;\925åW%ãL`\12\9a\1eÄ´\9c\eb¨Â"\81vNðþ@L;\vý\ 2Èd\8fy\90\19}\v ã\97Ë ³ë6@Æ\14H\90\91Ö=\90éåÇ S\1dÌ\ 1ô\ eö\0Ú@/\0ÍX\14@\93i#Á+\9do\0¤7\ 5\0\89\9c\9cÀ4\12ìÜ\ 4ß%\80FDò£\91vKpþ\ 2HêV\13D,\80d|\14\aUQ\7f¯è\81ýFý\86ùFÍ\92õÚ\92\193\85õ\v?\ 21qA\13\ 3\v\89©_ª\ 2²\85Q#Á\82\ 2Y(3\0\99}g\ 22\81\17\80\8c\fN C\91\0d\90qòpÈ\15\a\10(&w\ 5}\11@WSK°³\13|}\0\ 6@!\7fLà>~\9e&üf\ 1´\13jq EÝ÷ÊÍI¯­\9fÓ^¥JÕ~ÊýÈJa?«hh?+`aý\ 2È\181\9a\18\86\15@V\10Ê «Ù\8dT>§AvÖ\e\81ìpúó4Ùæ}     ²\99ú\19d\ eÒ\ad\16û¤öU8©x\95K*¾oJ \8e\ 6È´c\17d:µE\ 2~\97À½ÆÁ'|Å=?\v¿×0V}\85y\8dy\1eÊîð1\ 6îø\1e±\vû®?´tZ»ã¶`ß\1e\14ý'@æ\86
+tbêÙNªô\1db\0¦RY\9aòd\0#/\ad¯õ5ÈzR\ 4²â6\ 3²\ 4T\ 5Ù2Ó\ 6Ù¬9\88ù¶\99~=.Î\81¥ñ\16p\7fúÎ?vþ+´o\9bר\9d=¾J v{*,\ 5\9eµ\8cSx`È\93º\13\1f½ã\82\1aÑͲ}ýܳöµ[Ù\98×.y´¯\99ÓÌü\ 5\90¥\89\9f/0gÏJ\11À­u\ 5À\8b*\ 1àÇ\94O\0Æ\0>\92.\80\9dI\bàöæ\ eà<\9c{o\16¯ê»py\91¯òþÎ>ÕÜ]xÖf\90ú\98@\90þÀ,tz7\92¦w'Üææö¤¹ã\8dò¥ta%\8a¹}6¢×Íæ5kö¹\v2îKç\8214O£cÅ8\1ek/ýX\9b¬´Ã¥9ý\8däMwó\89\89nbgp.\83\1c+S §ßÓlif\ 2r\863\a9b\97
+ÄoQ\9c\_\95¸\ f\1eW\19GîwºT½½È<yk\8fKl4\vóý\bÊ楫¿lL®YPµ/K¯3¿ \99Þú¼Y$Su\11Ù¾O\92ب\1c.\97V{oZ-aצ«j83\1e\10\87taeë;¶ô\17\0\9cS\12S\83u!±²Z\ 3¹ëª\ 3\90F]\0HÇÔ\93¿.ó\97"\92\8b\87\81í··÷ÀºFÞs\0®Á\96Î]V\vªzÞNÊø¹¸/§I}§ÊêË\1dÕÏwxг7y\7fo_&{Ò{NwÓlv¹k/©cè¡ög\e\10\ 5\aµîzø¨\8dVûÖw´ª¸»áòDû\7f\ 2À=\ 3\ 5¹bôÓ\ 4r×A\1d c\88\ 6Hòè\0y\1dõ\97Úg¬ûÓ]M#?ßð¯\bõ\ eÏ#y~=\9eMêuÀ·É¨ñæ·è®3       ª¡·\ fð0\93ó:Û\9e\10ô6+ß\137yx¥­ÅÎÊ^\17¿P\9a  ¹\929ò²<\9dîÅ\85n­À\9aVxÿõA\ 5\7fê\81\81ßa¯ýù'³å\7f\ 1Àûubª\9e\1aj\13 0É\ 2\94\9b\rß\95ùP¹¿ä@\8eàþ[9ïb#]ñ8N\84¬·§Àd\1dúHå¸åÍû}#\f\9fu8\ f\91ÕÁqK«êÕÅ\96Zɦ\16\11\v|f\b\81\r¹ªÿî\85\8e?\8ds\9bù\87\19¿ç\19ùSór\93*=\eÜ\e½Y>¨öÜ°\97Kõ´\9fò\17\92
+='¦^\eÅÿi¨R?1õv\1c>îñ\89\8fz£w÷,+]þÐÊÏF;È«ë[TX¹kiÌ®Võlþ°Ä.\8fhA\ 4ëw`¿7i\88ë»7§0ÿÂ\93Ú¼;0Io17\19/÷t\84\99ÐÞhnèÅ\9e
+çi\12Òä\9dsÔ%\1d\8cPºvôäYÛp(Æ6\96\17@nøÉ\ 3¤-V\0J\16\7fV£Ð\9bÙ}W\aíîm^Í\93ç\83XÆöïé°\15ö.\80Û\88®>Z\8d\ay}q·C/\98\95Ïhµý\9cë~#¯ß¾¼f\eq\v¹;ÞCÝòÌ«N\95»G8\97Ö\8au0m?´\8d;\94ªêֳŭ-j\ 6Cæ¬(ÕMz\7fd\8c¯µc\f¿åwþ\ 2ÈmK\ 5\80\1a@Ífë½\7f\91\9dG+\96\89«ÐåË\87Ç\97DÃÅãÞØ\94«b{\19­2©«\1e¼\15CñY«lÎáÏÑ\9bmÕÉÊݳÌnz¢\9a\91s-BO§ÙËdl²\13¡\96c<jf||·\8cïöÁ\19\9/ëKUôô~£þ\9clæ«òdÈ¡­I±Rl§ R¤\95öSþ\a\90\ 3\8d\ 2@³ûzR\9bLë6'ç\85s­©|\8fÆ\9bøîüz\0mvC±¼Âv9<\88Y\97õ³ÅÚÐ\13\1a\9b±{h3Öt|\80<GwOk»U\19ï¬é@N#\ 2Ó#:/#¨c\90\ 1\8bXAGùr}2\9camm\ f        \82Vé­­±ºi\1dÆu=\87ªW\lªWÖk©zF'þ\ 2@ê­ÄNâT{F\19¶|>lFé\ 1´\a'\7fyî¾ÇÙk»Y\90ñêòú \8bvÛ®ùÙK­å\15¦Ë\9e«,Û#'º¿&¶Më\96Õ9µæ&\e\96ÖFÏ~ìõÁ$¼NÄ\9eýÒdz\92\19\9fL³¤^§\ e®6£MW±H$]\8d\97»\96_k%#O\85w]\9eN\1aD
+ü/$=\9eML5@=Z42à\84ÉåÔDõ\16¢x%Z\9f°ÓcI\86\ fJTÉ\eú\17ÜUG\ê@97\ f\16ljmÉæüÕÐ\r\9e=غ@Íýɨ8ZkJ\8e>\8cÇ_ì¦ê'\ 4(V\b!ò»\oH\1f´Ù\91XQ\95¤L\19ñGé'ßGÁK«\8c\16ð\19OÑü\ fiÀþï\ 5@\9c^\1e ;¨v\19QÊó@E~\14öõÊe#½·§Uó%^\ 3OÅÁ|@eó³ÊÉ©;÷6ܲÛòªgúfK4\90íY\99ì(M×\94\8cµé×W\rã\96nóQluw\96\7fJsÞË\8e\16\8cW\1eå¬-)\ ebT\10ó3Ç\1d\86ìè9\fGåR\ 2\ 1\e\86\86ò\83Æ/$#Ó\0}5p<\9f´Mì¾ó\1dæ¼-Z÷4\92^]wòa1\9dçO~\8e\89\9e³Ca\99\9bêóvÙ\9e\ e\19Ð=Ú@ûïþD²5Q«\17±±z\9bÞLÅ!f®<C\87\vÉÏ0»Ñ"&£\11Òd¾b¡ÚÉ\ fË\ 5\16\13\14Éã\85\9eúi\83ó%{\13jÔ1/ÔÚµF\8aú_Hú\92\8cÞ¼Wãs¼\91ß[¸\ 4õÓúäz\87ek\
+\83\8c²ÞyaϾ¹Ze\b9­#Z´Ø À\8c\81TMפ'2»à´ú\85\1fª\16\1cËJ;Ý7\ f¡\8c\99ú|\84ÄèV,Ü¡Ë°|\ 2±P\v?È`\ 2\97\1aýÛ`ÀõÍüËè'>ŵOì\87¹¾Y|ÖSÔ~!M¸LK\80v\83âUÈÌ_ûxn^¶"\ 4\8e\1fì\82\8f~^Ï\85fw=«aÄÙy|\90ØúÄWÔXk½êäÐ\7f\10ZCQ\18Õ
+\10^\ 6\9f¥(\ 5j_\1d­Øº)\ e߯ÙPº\9dÒ\1dù\82\1e\93\1e¶zöÍå\1aæ\9f ªñm"O÷f\8e¬öfSéÔ\9b¹\95l/~ûµ\14Õ¿\0Ðù½r)#£çÎ_rçM5·Mjó\84\87þbñ³ñ\7fv\84c\7fj</{\9b>l\9e&¿\1fgôÑ\ e/k\9a\176U{B·åÏêÖ\95\16\84)\8c\ 6WF\11K<¤\v§ïv:¸\9e¬ \7f\ fÇ;þµ\14£\1eð\14¨\aÙZ\89ãâ\ 3ÅÁ^G\95ÔOãà9Èp°ÉU8î¦VST~áy=ä\90Ó¥H<BT\84\8f«\b\9b\1e\82¹÷ÙÎ\v\13a9½\19êÔ\9eéÒÆ\n¤H߭ɯ6é\9fQÕ¡\84ªüµÊé\b-ñá\92\11CÐî\r\15\e\1e        \9ap\1a\ f\bزú­\8fì÷>NkÓËèø\85Ë)xÜ\1dl\84"\eB.É\96ø\8c\98àµfKýå\97\15§Ír\82vå/$·¹e\ 69p >þu³·îÇ%\ 5÷ö>\7f8ogõ\1c\12Ø ÞtÌþ\ 5Zèû\1e|Ô®£×[}\89sX\81\18¢$¡\9d#&J\8eÚ\1e&qnwp[¿\84¾Ã\ 5
+?kÈF¯{ħ\1c¿­þ\1cÊ ,J'v4+½\18ÅÂ\10úüVpZs?\ 2\8d\80Æp5¦µ\11THP©¤(ÿÂ5ÿX¼w\9cÓ¿¬\eÚê\18Ì£ÒÎ\93\18e=%\8dåÜ\ɧ´{êÕÊx¦é¡µU§W9\92\83\vþ\91ò\95/*VËNU¸nûä \85À\f\ fü}\9f\87ƺȭÊ\9dqw\8b6lv\9f)\ 5\8cê~vô$È=:·7\91ë\90´\86µ\1dÿÑo;ÁjÞvl3Ý\8eÝv\14Ph;}´ÜvÚPé\17N\97&ýÜ\8axñ¼¤*âÁG\9e\99½;yc+\9b­\ f=]¾\8dͱÍ~Le>yø2\92û\1cG#éñ\1a\9eÃeV Ða©ïòÅ4W\9dg¿wª\97\9bNY.oÈ\ 2{¨ã2sÆ\e&\1dÕJóΣ\98\ fÛï\>¢>\ 5"K±\92V§2ð\9bk\ 5ç`Ú
+fê£\15L^h+\10Ñò_Ø3]3\9d¤×\rw\7f
\ 6{\9c\9d\8aÆÖIºÐÒÌ+°«\19\90ù;&\8d$\8crÄÚ«»\12n¡r\1d´Q*æ}¥\98ëõ\v÷2WX\ 5Ín9\9cÒlm)óô\8dÅÅÎ\93oLÚ1\93\9fRßV>m\ 2T×m][¼/@äú5¯\92\82\92\ 5zo\91\85æòN\84\a8G\84\8bf\99\bíJé\17¶[½yYÄ\15ý4\1f:\99ÃÔ\12jk+§\ fý\89fN\1dåk\1f&â)\7fI\97W\a/}¢õÁb9ã\83áq×\eT\8f7NÄ.ßnåµÍ3WC¯ÒwGNü\12o\90\84­v«ß\86f¸BÁVÕlõß\9d\80\1cÞØ#±'­\98¨L\1fe\ývh|\fÁ\ 6®Þã\b¯+LêÜ6¯È°Ô¼ÄÜo¬"ítö\97óÎɽZZh³ËÝRWf\90§ÎFUK*ÊݱÐj«boðÝ
+\ét\9dt«ß¢Ïj\1cwd\88<ó ©r/Ó¡ëlº°Ò\9eë\83\ 6µ°ÙVk=k±­\ 2Ä\ eÉÒ»¥\11
+-z¸Æé»f´Ú?\9b\94Ç\1e»i\e³eRÃ\1e\vú\82µb3\83µ.ÇRã=\9c\15\7faA¿¦\97Ùi\18¦      \97NÇ/l\8c\91Í\ 4cg O¥-³0\84Gù¢ð¹ókÀj\1f¶ß\89¯9±ý}\94&m\7fa-Úpíz¢ÐæýÙ\1aÚ\99\f¹\8bó\ 5²ÂTëD½Wjá\93u£Û¼c\ 3¹I\9aº\859¯}z^g\ 3ÐpÔ`üA®\ 1qW¢\1eTM¥\1e Æ±ÎM¢O\1d.~Ñ:\f}\v¿0/:¥\93óÆ\88­Y(I\v\8d¬l=\19ÝDÖ\10÷\v\1aÏ+ä\88½\8cE¾ÃLÖé\1aAKÄh\8eh\8cË\ 3<j\8c&¸þ9û8¾k\1c\9a69x4)x\rcîàPÄèB¦Ù\98\9bÕN#óê\fê\8b\95§×\91üÕ¯    RåX\r_\16T\1d¹p½Z\16\96Bµ<\o+\87GþUQx,]ñ¨(\14\9dÿ\85é#§ì,\ 4Ý­µÛ\ eøòª\9fw\86F\81ÒùeFUØËÉ\13:ÐpÎ\90û\eÒn>¼e2þ\11\98Ôð\1dZodÁhV_nÃm\1dÅß\97ÚæYM\9dÛZ±Og«{T)U+º\8bUNø¹S©/sBYO<ûróºZ\94,\ 2\8dJ­ì\14)N\a\10Qì4\96\83¹û\ 2ðßï\ 2°jÙ_°\16Îs3\990Å@\81\8f­49i\18i#\93_â³1{\85÷b;\18\86]²:\8a©&Ūd\9dÿ\ 2¼\16¢\94V+\89\94Y­Ú]¯2\8e\85U9\1ajû2~w¯¥\87\15¾JTî\99)ºÂ7_øÜ˵B·GSùÅZáó\bvH}ht\ 3u\16¨\10ìohAaóÈ®v¢\90\11\90Tdô¡Â\ 4\8bÇ/èµ\v¹P\82î`&6Î\86ÕÏzÇ {%_R23F=âl\96i\8c\19¢6$W\8dÊø\8c\7f2\88íò¤ôÜ\14¬R»Xp\8bLå;/p\8dÛ"¿4n\9b<ò¼íÑaûyA\v\1fä\89HÝÂ'w\6\91\9cÚ\97jðeë·áfé)doGÞÉ\9aj´Ï<#<Î8\86[Ì8f\89Ê´ÉA\1a­ý\94ÿAe>Ó¹x\96C§ß\ 5O½[ß×ÕvÏËô  Í$Ø\86O1dU\1aëõÒ}Ù¨\15c\13e\v¾
+zù¥~\17òÈã$¢\85Ø\e!\123UrÇÀÒrjÏKu\ 1ø²\9e:ÙÛn<Ë\92\15}\91i7ÆÛd\ 2\1e\9f\12Üc\88!ÙB\82S\vbZýQ\82x\ 61Ôè\90 zCL»\9cý\ 5\0©Ý/\80\8e*\ 4 §\99\9aå~´ÎÄw\ 4\86\ 1(_cão¤Hñ7<;ñ×,­â¯$\9e\13ìAü\95Kh\82A-Á\94Lpbâo\ fðñ\97¯'¿àû\93\ 4³i\82ç2þöéägê7\17\7fÇB:­ÅYcD½\11gľ\86h·û\12\0Õ}\15¼Ú\9f\0ÐRø\82LVK@ø\19\90)/áäòY\ 2Ð\8b \ 1´Òx\0\8d\ f*\80è¼\v Bo\13\7f¿Aôó4\10ü\8d¿÷N!\81ÕHpjÇß\aÌ%h
+       \86j\82\99\99àæÅß'¶M`Dq\16\à7\9aùV_E\14!\9f\15¼Ì<\8e\8f\ 2÷P­o\ 2ùÉ=êÕc÷\aÉmþ»HÌR> 3ZB clR\\12S}¢
+2¦ÑN|Ƴ\02ÕÒ\ 4@ïTA_{;\0Í \a\80&\9dlª W\0\94\84*\0\12a:A»\1f\a¥¾\14s\a5í71¬8Ö{UÛxïþå¹~mqäô*Ú\12ô81fù~\95\97Ľy¾toVaÖ½\91»     \17½¤a7\9aV\98ß\0\99®\9dØ\19\86I\95~n\10Èb5\14di£ñ#©Òo\16d\8b\r\11dî²       2Áv\ 12
+tL\15ôW\1c\ä\\9ckZ\95÷@¶\9a¯íyJ½DmÕ}\95
+ûÁS\96ö£gµr×\1e§3l?ÆZÓ¿_oýÝ]÷/ï[K@\8b×O\ 5M\93ȯì¸É\\82¨È]z\ 6Ä]rø½{^=ö¿\91X¹þ\80l#J !Ðÿ\ 4ßÜ\ 3\a0Òê\82ìE\97Av¶·AVDWïõûu|\8d¤ííyX\9dÒ-X\8fó<Ì=\1aÏ°t\8f\9c\8e\83\ fu{\18\19öÖzføèíTG\91ÛîL®\1fo0½ÎYouÍ\1c¡è¼Ö;¹Sh\ f\1aG¥Ùi\1f´V¾³7:!µÇ?sj÷\98\e­ÿ\90Üæ§ü\9f\95n\ 6$\ 6R\10\80å°\94\9e\91ÐJ\90ÊÒöU\8dÑáÞzU°\9eû\98\fJË;\99ÍìoTü¹E3<\ 3®~5\86¯Y!.^\96ÅBã\82ô\10â¼ÉÕèsAÀÒ¤¾ÓhG\88Ç#LiÇÚ`ä\1e´p±Ý\13Óü'\8c»µÒöÛÇðmw[nm\96Å'¹á÷Gr\83$Íâ\17þgb\15ÿ\08°a\90+å* 'êi¶ôµÿ£Co¦âã\1a½G·×ÖÖ"&î:WØ¢\96çm\ 1Ù\9döÙïõx\ 4Ï×ab/¿ûÛ%ÈíÉ檴sä \1eÆç\15\19δ+»ý&ñç\96«Bê6{æ¼M\9f~Fëb®\b¯*\85f\1a{.ë\95bsq9AÍÅD½c\8bf}ßø\ 5\90}\97\12S­Á\17ä\9a\11\9afxÖ@\ e¬¨wxðØ\871\8eØè³¥º\975}\11N\87\86ª\1c"´hì[­½»ë`ÛÔå\bÙ\8awØöòz´YuÇï\rê(ÐzÛvóë¢nWVÒc\8e/Oµyg©^\1eÂâ\8a\97&\8b¦-/\ 3r\v½ýö¡Q\98{µNc\ eMò5/À>U\8f»E\95_øI"ïu\92
\8f¿ÿSýêã:@Ôkë\89í\1eÍȯ}ë\97\82¦âI¼t§vî^äÂd\84\19mÖê[_\87ìÁ]\1djn°<\17µpÙèiç\85î*\8fàþÕ>A\8bTsþtj¦Ùvs\10\99ØÜ3\8eÌ\1cz~E¯×é:³Õü}u·'
+vK\r¥:\95\rª2­\12µÒ_HÞùà\ 3\ 2JLdK\0q¼ú»\92aë·Ù\1cAÏ»5\94\9eA| ñ\1e\12úA¾¾Ù\18!µ.o\95ÞR\8bËâÂØ}'\ 1ÕYÚ¾k,\83ù\57óÌÖ<z|fr\9b­)5\9eå'ã¬+Þ§åé¡ê5§ò\19pιI\8e\9dF\10ïl\ 3á\81õHüÏTRmÝÍâ\ fÌ·%\15~\ 1ä =©ÍÍ#\9bTä ø¼\9c×È\rb\17àÚßPï\83\85ÂQÈ}\83Ϧ8\17ò«ºWk,HaÙòã\97Ú\9bû#räñ1Hsng\9bæËvwÕÓÜ-\vûõ´Æy{G\9bz\91\1dE^l\13å\ 5lÙê¡b¾¯\9f\96é\1a\ 3Ñø<ï\9eÑíH7}\11^s:?ºçuÞ\0y\1d!®è/$mÓúùt\18RÏïcpÈ^¶Øîxª\7fÈý¡UÛ\87;èÝÛoJ\9dêc©o.\99\9a%\1f\9b^ÿqmÏ\8aÃiÏ­ôÆ\92s¹5T§Y©Z6\ 1Þ3ËÁß+3VÞ\aã;yÜ\8cîþ\9dÞF_"ÙäÆC\f\9b\b{\85\9b\14\94\8c¡\8dâíY+{84>\8a\ 3\96:¹¿\0rC+Nj³\9a½A8u>\9dVýݾ3\9b®ÃE\15_nBâ±YFö<=h&p[ü{¾ +¹Y\98      ÊnµÙk:×u\89¶-âг¦õÅÈô2ÊØ\84¨\91eÀMÚÓû2½\9e\f\85ÄÏÛùÄ]«Àý̸ö\19\96ÕË|×V\9b0&+·s~§\98\9a\15+$}\86\7f$Õ¤L\91ý\85äÅ\aq<¬\97\92Ú¤7û\83õ¸®ÂE\ f\ f6áü0_\9d·Ê"\88¡òn¾\88¾÷Y¸õ¿n5\1eä\1d£\9a¯[ïî\9a4½«@\eÁ\ 2KÓGõ\95ö\15'[é¢jûÁÆÒ*óå|\wf\eurõÏ\8aùX¾åWí\8aÊm½Ø\94\0>\eJ\8cÓ]JÌ*÷\94\98\93\ 2\98Ϥ\7fý\ 6ÈÅÛøq»åÓì\87³,9ûÝ\9c\11\83m¡ñ\9e¯.uÁ]<)Äó»§ÝÚ+8æÙ­ÙÜÛ!¤OÖrçnÑìÖyÌÈ-
+Ô$Äv\8cv¨8üøôé\8bêõÙÖ\94ûµb+­R=\90;Hq'yÃvº&=
+z\9dÌ\b^[5q5D{bÒ9|q\80»7q@ \90\96ÿ\ 4@j÷O\14d\88ó1j´Ã\90ïáþúH,fKâ\91µ\ 2ú;³½Í|\18¸Ç-wüÑ¡7Å\87\15OW_3«Ò\88¾É ÕI\19\9baZ\r\1eRj4¯³ÊÃ\81\aò{x\92äNp2$Ö]¹£\9e¿Ý\88«×õ:ÜFW0,\91Iü´\7fy\8c »ÒT\907Ä%Áü\93`\916è´\ 4¿\0\90~\ eº®(ä´\7f+ûÕVX\97üÕ¤=\9a\ 6 w1çË\13cÌ*}x6mÚÐÖn\9bû«É\8d\ 6o}ã\15àIù¼,\8c/Ü°¦\1a\9f:¡PÊ)\95Tez\18t¥nÏ\1a\8exZTE\81ìÙÃp,.\85Ãhp\14ªÇi<ÐÐs¡\1f\8d\1aT?\92\8aV?2\9f§~dñq\82\11\184îÆoÄ\9b~5{\11éËq7\9fXéJá¦\1c>æKR¤§~Ppt¯¨ßÕéu¸²í\97»ZYÐJ?\19¨ÓxL*rø\1dOv\12¢\92\9dzY\8e\ f×\86ä\ f-r´lõhq\83áüpW)IÂ1\9f3\84Z·ä\ f°~cß7¼NÚÒøgÆFy\8a\8a\88^\8c®&½8?Ùó\94Px%À\0o¯éßxN´Îû\åf\87\90·z\8bÕå¸ð\ 2 \14\9cù\80\94twÌë#§Õ\1a\18\16+õ|c`àû\1f\1dzò¾\8d¯k\17¨ä\8bÌÊ\1eþ*JÜfZ\e¡½\1e.\16±\12\94?]¡\8eFÃA3s\98ôM*\9añN3Úöf­Ï\8dûNjYÎoº\18×}°\12×}6·\9cO\1c\1f     â7÷5\91TOû)ÿÃm\ 6\8cèhä\99ݶàV\83¥yUf~àÆ\8eW\1a0ºóh¶\86\16\e~Æƺ\93\9bM\ eüc3\8ezöImùݧì]¿_)W\v\10q\eôJý\8b\98x§)ñ\ 3½~`úVi!ðSÄ\1d÷<ÈvzPk±æ`l}éöÍ/ÔE«|\9dÝÄ%\91Ý\¡u\ 2õÖEë»w\8a×/Dð\82¸ìiêºY\1fw\99`1eGé¡ÚóÁîè¸\1a\81Nl:\97\11\8cõr­L\ e\ f×Ò0Æ]ª\94 \1cäù´p\93r\8f#\10GÍ1<¬\9e[E¡áçêýG;Äù7îvz\9f\9aÆ÷2EAâr9Þì¢_>`EÒ81ûé\ 1¤Ùv\95o­B\9fü\ 3ÏTî§%Syp\11S9¨OF.9¿q\11µï9\\16§ëÕä\19\ 5A\86¢<¯ôò\1dç\89\9c4\13éºý\89\9a!\86c³YÖ\94x]ód®RH×oF\eñr\16Ë\eó)\z=h`Üòh\9fR\ få¤\17ͱ^\97×(\8eg\ 4®+´h\91\1da\94Î(dwNk\ráÐ\89Fö«cT\90R\a?-¸\ e~\ e\82\ e¾©_:z,½R<\7f\90Üæ¿\8b\93VY\9e\85woµx]\17Á|=Áæ®\16©\8eÍ@\9e¦WP¡?&\85]Oa¦¾$­Ê\e{4¼n\16Ã\13å\1c\84¦ÅÝú/¬\ 2øÙñ\91MF¢°Èõy­Ö\1d2|\9a\ fÍJ-\82fT\9a\10è        \89i\1d³\81¹íç\88\ fÛÔÑ}R³ú·@Ñ\91ËRôÎò¨\19T¿Pî½ÿ¤Ü=óø\85=­BáºîWW\ 1\ 2¯,gç\8eÓ¯¤:´\89Ò-Uk\1e°¾\1cLÉÎHTѾXe\9b\9a\10Õ\18o`í\13ÿü\83¡ç^p¼>¸Õvûín\ f\8b<+\ f\8523îQ\18}]w;\9d»Oðí×\14S(`\10\ e\ 59Ýu\8b\ 3óG\v6²é \97ä\8a\98\15\19ÌÈU®x$\97ïþ\93\\9e\99Ç/\84È=Ø.[ý÷j¾\8e\95åô\16ÎfV\0]M½òü(jGûöE\85ÚR\82![Ý\ 1E{#þ[Ù[|¶qOSâ¹õq»ë\8etïÊ*¶õf´\89\92\84\8b\96PèØ\1aUk¿ot\8bú\9c\88.\95    ±Q+w¤LR@GK"\14Ã\88(\1dË9ü ®)ü0Þ:ø\81nîñ\ 36yâò\8e»§xü ÍRMËõ¸Àn\82.~XÏÔV!°A\9fs\r\8d±\9d1$i½\9añÂ\8dñÚ|öy ¸ÍöÁuwǼҭ´{S¶Î\8a+¦ÉË'\9adz÷N»×\ 1mF r\94¿£Ë­å
+KcÏ\16\9a§:d±L\ f\b©?\9aàªhûÍËáqnNT>ÛlÖßD³\99\7fYØÍïï°\9b4»c&¬þÆâ=Èmæ\85\8d±\9e\92ó\9d\ 2àhѸ\94TM\13Kuh±öl÷ú\8cÖ¡º\95\aU§ï÷B\8bn%ý¥3]Ûãö\a\8b\fùXS=7sj­¾ùG+Ï\95>diP@\b9¬Uðs\99"\9bQ\9dæ\9a¸8\921ë°p\eïzfß\98^eÐè\18ù4`O¼LH«\7f*³mÝ\9bn.uo¼»¥¸ÿ\a\9f\7f<B·©e\17Vàµg\93³9¶\94/?\1f\8bÇp&ô\81µïr¢úhÑ\8fa¶N!åv\95Ü¡ý\169Úú<qÄãÔ\87&\94\12µ¥±Á'¨{jÞÄõ£I\1c\ e_Ì©ÝP\8cº\16ê\8d\19K·ëß\856¬sÈÁ¬-Åê¦\86\1cÆÏêF-Uª\9bqQ®n\ 6ÇUU\88âSµ0z^SDÿ!uÕërwm{\8eãë\aí4Ug¥·>Ú½\vò`*Vú\Hv\18\86¨  \ 4µÌOª\84:\ 4\15lZЫ\r\8f´ð\ 6\v¿¸\ 6´nÊõ@\9bØõ\1e¶        ê9(»¯­\ 2âVËW\85Ou{þ9©¯Z¢oXå\0\11ÝJµ§©ås-\17\94\e\139*El©P\8aºP¿¤\1fg^I_Æ»\12Þ)D¿àt\88ãÂ\b\95\8a7vò­ÿ«ê÷ÍQ/\7f\9bö\18Â^¤"$µ\1c\1f1¢>|\95°N¡\97¯­ó¹b¥V;TÊ\97z\95,k×\ 1WƼ@*ÝD`\96Ìr}^"\9eRX|:˨èô¿\9fb»Á\15\v\13\85\99_\1e\14 X±òþ9¿Ïsî\ 2ÊÃL'Ýæ\83®Jm\13íÛþ\ 6íóÏË/\98B\89ó5b%;Ò¶hL\ 4ë¸\91{\82p\1d0ÄãÁPýñ\13ǯz1©Ã\1d\9b¯\86ú!WÆ&<\|yU¢ØI\9f\16<ÄÔ\87.°Ôx\94\ f6S-y\fÏBW÷»\8f\ e\16\95\10       \11ò\82\88\17\13 ¥Ù«\90\f\99SJÇa®ú\14fðy\95¹ÀÚÀÈÁ\18\86·a¬\99\f^ÑÞ\f\7fAû?týé\96ª<Û\0ê\1e\v**ö=­\b\ 2\82\8a\ 2¢Ò\b
+b\8b 
+zþ\v|Þµê\esìýç\8aUsÖà\96\9d\10\82Ñ.ËCOÇ÷\9bÂ>ûÑ\9c\95        ¡È=
+)m!¸×ëU\9aí\9c9­Ö/¹c±Ú\ f;9\888\14óezV\1e\94\9c"<,AK\8c.
\90\ 3/Ôp
\e¢\ 46o\9bua\89ïÍ|àùn~Pÿ½\92"\87v
+/\80\184
+)z\a à\ 1\93\12l²     ²W\80@¡\\8a\91þ\ 36äR¨É\1f³Â\1cT9)¨-è"\8d
+DX\9e2\b\ 3³x÷9D;-ZÙ4êÍó-\9b\9fVA©f¾´ï«\9fâÑC*ÅÚ×h\83óÑ\ 1.Ü÷\ 6\9a\ f\8e<\9a\1f¤Ui\ emu\b\80èA£\14\84MYÌSÎ*@ô\ev\8atKã\ 4¾)R3\8d³\92þ?ØQÒ`iï¿©½·ôÛ $ô\ fñ7\ eÂ\ 4(\ 6AJ\14Æ_ç\92B8Qü­\16
+ñçI4â\8f¥añg\16±ñg\8c\a\95õ\94ç1þ`½GÊ4N9d½µ´|Bñ\a¯6S°^\8a\98þ%îÒñ\87\0\84\94Ñ*år\88\87Vçù¦\1c"÷bND9:£Z4y\ fþÿ\93\0Í8\8d\93þþ\961ÈÊßoâo\ 2%ñ×\1d\95⯤µãï0\1eÆßZ\9f\8f?ÑL\8e?\97³\19\7f®\8dSÊ4LÙ\7fR>Åøsk×R¨vÊ
+N9\rãÏ\1d`ccÙ\9aÇd\97ËVNzÓðÒ~±x\10Dü(Ý\15³E¥\1cÞ\82R-\ÈÉÿèôý\7fI\80y>\8dÎ.úÿc\re?.³¬ºSM\0,ßO\802NÅß\87\9a\8c¿ÆM\8d¿BÙÊ2è×\14÷\15\7f§`>6\em(γÕÚÛ\86zí7íaýwQ`°\17{\9d\8c^\90¸\99D\1e\16JQͬ\18Ïæ^¸\a\ 1?\8f\1fÑZ/=Ö¨[÷c]ªùÚp\92ÍUÏÊÚ?$@Ô|$¹ZÇOiÞ\93\\9f\8d\92\1cy)$¹Q§\95ä
+4\92\0W\83I\80Í{\91\0l{\e\8fLìð\1eoàóËy`\8fW¥O½#/Zä¢:ºÈVçI\9b¬ÛÚs®\1fÚ¡\9f;\ eÂ¥õÀÃî\18\1c\a\8aÛ\98\ 6\83\89¸y ³ðâ\ 3Càu/ÐÕâmìT«i\83îY¹rÞ¹r­\b\16ô\ fi`ý4D\19OC4Èß:·¹Ï1NòP\96\99\86\16\9d$\17\1cñ$§|Ø÷¡|\9b¿&kC\8e\1a=Y{¶\9b\v;\94\14\84\11À\rëõØ,\1cà\81A\1eè'^Pñ\87õ¨é\ 3·bÿNujø½ðeÙ\e32²\97\ 6]',è\9c¯W08Irîë­ì|ñø\8a\9dÂq£i\85#F,óÿ\90\ 6H§¡~Ø[\92Ƕ\8f$¿\ 5?YZ\1aÊVòèÄ6þ!^üc1z.t\88   \9e·KÖ\16xl\ 5\e\8c¹I÷\99gÝAÛ>ÞØ\92\1e\87Nx­Z^|\99\15O¹ó\8dp\8bçöîT;É ßñ\9el\82yjw49¾WÞÖ5¸âű¦\9døpX´
+\87rºõýQös{¾ï\ 2Ù\1c¨´Ìý\91äË\v?É3Ù\82ЯO\94\14`2KK§»»@½ÛѵÜi\87\83®Ò}\10\1d\14¹\8fÛ\85Ñ\r²|îr!öósg;\91O}s¢yê\8b±\8e169\1eq\99ɦZ¹ß¾\14ºäz\958\96\1dZ:T\ e\87ç­s\80Ð\1c¾÷JâܾÔ\80\83µðK\8f\e|w}µð1#øõ1Õ÷5ù\874Äm\1açõpO£ë½\93B¸Íÿ¦ö\ 2·rtµ¿`°áº\ 5¿`èÅëi2i\9e»Þ»ë­?\ 6z$Ö\vÊ\1dI<ï\8cgôâà8¤z¨TXs/PôÁ¾\1cè\93Ý\82Xߺ\9b\8b·Õ-¬s;\85±+»AùÛ7×\ 2\92UkF|}hú÷Û»ê\85Âð­\8d\99\95Êå÷\8f­ã~^\7f¤Q\9e\1fIaôy¤ÑM\93\ 4$\8eù÷äÆæ\827\r\8cQñÏ\8fFöb\8c}?çZy¨â\94»\97ì\8d\98ûÓÍLÛ\ 3Â\9c´ü\rÇîB\99\98í\ 6ÑH67-bk$\13tgèUîh\04wÓGÎ<Òö\95MN\e\9fÂúÖm¶°-w¿,7Ó\1câ®Å"\1f¬[Îì¥ú\1c\1d©R\ 5yªR\97ÌÚпòGR¨?ü¤pj\ 4¿¬ßSFéû#\17\8c\\1f¼Vܳ<zî\8e\86}¸8ìl\11ígS\14°\1e^)mq£~ËÜöN°a\147CÝ\ 2¦c\1d\84§S\8dYL\96[7\98fk?l«õ\89¹\99\8ai\8bþz\94îëvM\7f«þå]R{ívgµ\927\8còz\r\f\ 5\9bü){¡¬\1fÍ@\1eòÊC\1eÊZðGº7\1f·\ 4ìbÁóaã§;k_õË\9dþ\8dI\9f¢\91¥\1eÍ\1a²9xTlÛËÁý¶\8bdûeâî$§ÛÅ6¤\1dB°µ=^\9f\83ÍÙ8à\9bFdÑë¶/OT¹§.VÏ\99ª®`G5\95mÅpå\ fu¸ËÃÃó#ç8¤&Q'#\9bp¹< \8cºdâÐ[\1c'¥G\86¿à+Éý\1f\92\82\99ÞþÀåôé[ßîîr·°µ§ígÒ±P+.\9c\94ìî\88ØîP\998\1a#©t×\9c\9bÿÞ
+£ßëB6Í\a\v­;\17¤©öu¨¿BV1¦lo\11%\7f¡`"\93\90hæ®.\ fF°[BùïiÁ3ͧx>r 8ã£ÁüvÝ.ç\8bm{?ïàâ=ã6\v é\8fë\8f\9a\95éE\ 4Þ¢Nmv¹ysß8¡ÊAv÷dsq8që©íãõÙ\ eMBÅ(ÜO;mÒÐO\9bë\88y¬»F#Y½\9aA^I«4Hþ¾\95¦\9c\ f¸\9eT¼¢Ø\92+\ f¨\85Gþ^î(^ÐúBlê\83í|ñ$ö³\0\99ßg}ÍùN£a·5E¬H\10â¹l
\98»\b\1a\96»f\þ!=ððãñ\85µÃµ5ÜèÇ\1d3\93\ e§»3µ¥m){iÐn³Ö9\83\9aMDm²\9bh\eÑl\1fÔð\93»®°¦\15\8eM¤=Þ-,ÝA©²8\95üÆ¢>¼öÅ\16²ÃæË¥NÍ\94\95.L£ÛN\9e¢\90k\b\9að:ñß[ëÅ\8f:R\85Ï\87D6è5±­¼\96²8Mì³qÉ8ÿÃ\7f\aÞƹýéÅ\95×.Ã#˽\18.\85Ý\9bwi37Áhmòýð\9bEû³R\9fóÇn\85\9d\r\0ò.1ÛZ\96åXVk÷\8fxu7\85¹¯2м{§Z³Á©×\9f¢·\ 6.èP\9b\15\80QOä\v\f\9d\8c\rÆáܼ\1epܾZâ*i[\8a=uÖköÔ­¹)}ïÿãøGÖ²á\eåÇ\9d\eumO\17\1eªS\9d\17\17v\1f\1c\v¦±ÞÐ:Ûx\10\9bÛ^eÔg$/Vøp¡É\96\86ï¥ò5=çf5Û\17Û:÷\9a÷T\f\98ÁËjq\8a\8d\9e\15aÈÜÚüθ!\93ýú\90=G\90^&g\81«<Óöú´ù±\98«Ô»3bÏÈ3­\b\83Çþ¦.3íÂÝIùz\19Ç\7fxöÑþéVg\0ëH\89Æj\7fÓ¢Å.\86Z¼Aë\fµ=\7f\17Yæv-?hz¥\95ȹl7\9bª\ 4      ßÝbf\98®ØAç·ÙóÜ
+¦[öõ\16\8cÑ9ÇS\ f¾09ô\17uîØ¢»\uÂ\12l\83¦YFt\16Òø\ 1\18æ¸G=/ôÊé}h\98{tixrÍ\1e\8f£WǹM¯\1eÎ1Ãý\87@\ 3¢ãEªîL\97yÈ+[ÞÙ¢iÖ\92\89\ e\9dajÓÙ7û«Xý\ e\95ü)\9aH\1c\1e+\8b9fjó`ÍígëjÝ\9bâ\87WÖ²\11ò\83\17ÛÓd\ 2Õð<W+u*l3Wl1\vº\89\8ee¢6¦\9f«Î\9c\86߬Fm;ª7ú(ïxdÀrkd â|ôYww)\9có\83¢åÿáaR\97ì\148½î\94îT#R±ÖàZ4ìõ\8bß^â*¥F\8f|_\19q6.q[e¼¸Ö×¢Øå¹õlí¶Ì)\0\86\ eo+\9bËÄ\11§\ 1'Ôzov^\82\12\88\0\8e\1at\84G0\15\ fîÙì\a
+\17ãéÈð õ(_']\92\16­\17Yì u²ØŦ$½L\f\92\9e´\ e¤å¢ÿâ\97 ¹ã\rWàv\7fKjòNcç¢Î¹'~#A\1fj\ 5ÐfWâÞh6¾\10ë\95á<4êül3n)Ól¥\1e~üÕíIe39qu\19ó\19¿\ 5Fã°òü\8e\aTP¢QÜ©QÄÀì\8dFí5NÚ¼=!\8b\97h5äʵ\ 3áñ|H\bõ|\85\10\1a \9f¢g«]\13\1e\r\1c2öCȪ\1cþ¸\9d\ 6\bnn\e[©|es¤\8cDmÚs\855<¸Qr\19\18w\16¢ìwæ+w\8fÎ0Õg\ 5\vÈnßÛÝ\86;\17¦;V4`\97\91ÖÕì\ e=^-?!\8d5\ e1¥³va´\e)\15r\8f    ­¡ÛçÐa%½Â\89º¤Iøü|ßá­9âc~ë^Æüö\83Å|h²Á[lxÀ[øÕþ\87\8b4   m\87çÕ¬\7fc¡ð]6JW4­1f»éÊ(«£åôÝíÌÕÖ¤>%\8b½\9e\0\86TÚº<LgÜL\98¬ØN\19ÖÇO\eÜÓ[âv¢\fØòG\16®FäaÀ\7fɲ(\94\87U~Ô$\1ac\ 2ÆÛ\931ýËÜZË\ 5ú,^L\14\1e\16¯È;§\81È;oÐ(< Ö(\ßÙÿ¿ð>ÄÐØßÇìz\a,<E;\97»ËµJL\ 4¥\98gG¢,¿ÚÓ<ü,ó\90òÌÒvÜ\85ùàìrPæ\98þ\a\бú\S_í±£ò«ã\91t:\8b\v    )òsX\13Ù\ fÑäÑ\ 2Þ\19wk\98ì\12}Tµ\88\11ò\8eçs\ 4'<\1d6,è\ 2\93È:\a\93èv\ 4\93í\9e\ 2\93åU\96ë\84\87\1fÉú\87c\11¬\1aÖ«ÚY\e\8cb®¶\9d|a¹2Þ\r^ªé5r¦¡ûöD\10ä\12»<²õñ\v%{t2\91G403¦Tai)¤\v«úðÔ\99í\89ë\80Í\ 6V\88\96HûxWÆ_Ø`ÞÍ¡k\1f­ ÚyÐ\85Mg@À\85Ê|:\18Sö¦ï8y¯Ïqê·ÏMT¢ÏõÛR\9f«I»>\97\97¬\7f8Ìk\96\e\8dvÞ(Ùó\9ekDs\17²#?&b\b^\86¾ºê0á\11)Ѻs)R ì5Feö\8b\92\93\10a\87Ó7¹ Ä/¹Æ¥WßÀ\9e\18î¢o²\9fÖüëN\88\fõæ\a¶r\83Ò`\1fw\9b\8321ÆúUXà~\99Û­³êÞ\0Èí\8a»mÜ\15­-Ú\15çð²+\8eu³ÛJVV·å\8b»?ì\81Îk\ 6ó\8d·\9b \8f®Vù75_Îý\19\15e89\17ÅÞxÛ'+$¿\18\0ĽÐÍÒvxÐ\1euð¾¡\r±uþΣZé¾D¾\93x\83\90\97¼\ 5Û­¢7pzùû\0R\8bQ\9f¿Wr½KwPëÞa¢ßí¤7»\8e\1c\¤v\ 47÷mõmEm5V»mÕ\9f\88íôÛim¤·ÏÖUÿ\95\7füÆJ´¦hoUMK\14¹b6æ"L÷Y¡|ì\12l\9fêõ(:é×\88¥ÐÊ£\84*\ 2H\81\93 x|r»pI­\90\ 3.FùAÅQäþ´¢i½ëÔÎF
+{­\9bwêJ\9dû£\13*qÒ\19¼+¥ö\ 6GÛ­ÄTÈ\16ñºÌ[À\81Ü5wì#lR\95m£9zN§ÍÂÌÝ4\vt¸kØñÞøC÷\80¦¹^¯ÑµR:HÒ¢7Ù
+Y>\8d\1excn\11û8="oÝá\15\8ekhâ\86ùÁd\a¼{mã\bt{\97[¹óÜ´»\1døC\11í÷QçÚ[Þ_´ñziÓú¼\b»Ebܹ\95ûha\93&½oã°\aª\r\96\19#õãÃË\9a\83u^A´Úùe]k³-[®Í\96\14[\9b\11îªÖ\b\1f6ÁÃÖW\85\9d¿Z¶Å\9c8#¹>ÿ¿|ù\96BÉé\90ï`\9b\97P\81Ë\8e\98ë>>ûwËìýFØ\eÎö\994*\95"X÷BºY\17V[¤^\87oTíZ¬Nksg¨ÔZË\8dYõ»¾W\95r­°Úµ¤BeÕ\fÛ\95\81?¢ \97\14(\10\96§½r²\87òåd[¥ËÉb£\94\13ÜÕRüì\14ø\95?TÀ\1d\86Âȳos1û/e®Ã»!y.Ý`ìmÞ\9b0\84ø¥®R\ e?-SïE\8dÊÂ
\12\83\87\10fC¯ò0\81\9c;.\97s¾×)YÒ\17+Ñ$\92½U>-U±T¬½µâá\85\1d\8b\14\15ÙC»Tdo>
+zÄx\ ez\93Ú\ 1\14ª\87\18¬]äAáÂ\f%°¶Ù\e`M<Y\7fÈÕÅ^\9dǽç\92\17Ä\88g°j\81\1e\8d¬\7f\83Å\95Z\17\86ìzµ;À\eùVA¢âz\ 3²ÒÊ\12ëûe\12ñnE§b\a\9d\17ÁSU\80@ái¶Àºz\87\v×14*\88-\92/´|UÎKó\91\ví\9c\97[\8d©(\a\97n\10°áá,Ý\r`ùÓ\1cÀ
\1eÀ\1aÈ\aÀ\9aÅ~ÊC\ 40´¡þ!ª\8fª\9c\1eÜÎ\8cÙè(;â\a\f\89\ 52ð.D£ób\87Åæ^\97¾5ñ{{Aï\ f\19\96è»w\a½Ý2ËÜ\82\8d^3),&\97Z^\9eiõÜó®4sHWé\ 2xcÜOÑ\88\94\98\ 3ð&²\ 4pä`\ 28Ú¸¤ì¾\0\8e\94\84\ 5pÜÔ\ 1\9c£\1f)q\11À%\15NyR?²o\93\95\82\13²ÿKìC\90;Æ׳\e\ 1Wd»ÛyÝ6\95fY?\16ª\ 1\0~Ê_\99\8e\8a\8e\13\ 5`}ºöóÒA\vsj\f}\ 1m9\0\ 1¢K@)ó\ 6@T\96­\14³\97þ\18ã¿Ìm¯3N\99ÍRnk\80è÷\ e\0 \ 6p)ÅG\0\ 2VD\80@:û\94C\b\10\90BWþ\88¿ÄÈKAÝø[i9ñG    íøS÷ÓO`7\eX\89\93\9b\94\8b\93CX\8f\93e\v\8e\13n9N     Ä8\99ô·)\8b}Êñ\1c'|.HéÅqB\92@Ê"ý[òPMy·ãdÔFRD:Ö\v§y\f°ÝÝ» \8cÎ\91Û&²ÌmT\91¹äy"ÇÉs\9aGSj£Ï?Ä_MHCÕÆi¨KÂ\89¿@i\1f\7fNÝSüY   aü¡NùøÓ,5âO\91Cãän¦qúÅE
+\9dÆé[\87ß·ñß\978y´Ã\14&IQó)g(ÖåG=\ 6¢Gû½Ûä\ 6o
\91¯½Áð\91kï·Ï\93û:\86â,¼\a¾_\88\ 3I\aâ G\84ï Ç%ñãYñß\7fü2·ñò\98Â\1dâï}´O\83\1e¥ñjæ=ÝÓ÷wü­Ö\8bñç<jÅ\1fõ\97A\8f\7f\19ôe\8aªÅFé|\88s\93ÇùMYçÛ\e¤ßÏס\94\8b_åI>íJTkÅhrîg\99Û¨:£ÛÏé}\86<\eËã8l« üxr°í¿§ÌÕÇÞ\9b×ÝÀ\99èNBÔÿÈyðó\8f\ 4@Ön\ 2ÐË}\ 24G»ôGí\98\0ã,KÝB¾ñ×\17Ê¿o£{ÝøË\17É\98\CÜ»Ø\8dg/V\85V\11¿ÌkÏs\bÙÏÙªï\85·wÿ\1a.¶d\10<¾ä+\90Mþû\88
+sð¡îµê\ 3aî]\7fëå\89û·NÏnÖÇ2¯Níy¹ðþ-;\ 5Îó\9cú87­\99\7fºÓ´\7fZ\16\91û\1f     `9i¨g3\rÕR¬$\97û\9e\93\\1e\7f¦\98ù\ 4°\83Z<òãÞ\8bsÖhT\8792=X(\13\ 4×Áô\11=\ 6Ò\ 3í\13\9b_º{=2}\ 2\9d;wS\12N÷QO¹ßlU       ocÄN®\8e\93¥¹*Iý"Ìê\83ó|9fN]ÊY\1f_\90·w\93Ats\89\8d}u\ 1l}uÌÏüò\ fi`Þá\97\87î]öInòu\93Ü\91¼¥¨Q\923\82ü\9bñ×¥ç­R\80\82ð³o<°Ö´ç\ 3O\ 6»\17î\14u+\85ÔäZ¹Á³K=èÉgq\0oNþ\ 63OÝ\ fvðV$æyp~r?nÆbV­¹\89»úºúäQu\81K\ 3v(ô$\1eÊÕÄÜW[\95³=]¾ÎÖ5Ü{ÿ!®6ÿ\874ºØIrz¼Oòeü\94ä1ù\9eä\99\86\15>\82ùó\81W\93ì\84¾\83§-på;2t^´û\rï¹.ö\8eïå\17=bÏ"å\1a\bĹ¹eqæP!$9િ=0ï¾y(oiw?ùòWû<\92\9fö¬\906·n,Ô´ÚÁ\81ÝõÞ¹µ        §m\ 2c;*g}Oýc?\9cÿ0ÆÇÃ\1féî+:i\94E;ÉïÕK\92\7fÝ\1eñ¸m\ 5a°%\8e>yÆöWþ\956\8b\94ÖÌ?Æ*\9b¸dØÍ;Åm½r\80\94RkÏ_K\ 3ûÒ®dK\1aÙM¾D[\8bK\85ß\ 5­º¸\93ÝîÊ\8cª¨aªgî`ÄÍåÕÀ\97æKÿö
+%\9d\88F»ùÅ\96=w\8c-4#\9d\r\1fw\ e\9b\9a\ 6íÿ!É·\9b\87$¿Aö¿©½uãôô»óÝ#!w[ßt{ëË\,.=téhn\81];\aîªøöµÏ½­¥\8fåvʹ]2_ÅvÃH\80r× ¨*ª\7fßí\91>Â{\9cf+í\99\96vRW[g3I#ùHÙÒ\93\e¡\9fv/ë\ 5à»\9e3LS½{%~\15¼F\9b\95²YïW\ 3ln+ÑglýC\92\17\9bV\1a¢ì\86᪻½3Ü{~¹\ 6\88p
+]\8dM\eruÎ)C\80d_\13?\9b\9cdõèëÑÜì67Cß®^:5`¾Ú^¤\8b[\97GªÛ\8aÝoo¦%\ 4^_\87}b-æhFõ\11z¦foëZ­\0ÙP^ÔÁS6Eð)'\1c[\96\89sy$í\90\95"\8dâ0mji§¬\ 1µÜs®ù\ fé1GìwÅè\1c|jÍÈ\97E\87\15<¼:§]\v\98c[\1cÙm\1fãwH\11[\19d£jê \a\1e·Çñã¶9\ fÏÑú\86X_õÑU
+joºüÍ ^\1dæ-åõ\15ú
+6\9aã²¾\99\8feà³\9eI\14\96{;°\96å2t]¸G%·\98\b8*\9e^\ fQlàU-¥mÌoPCÿ\87¤P\989Áë]ÙÞªÏ\\96\1aò¶þ\85u\9c.0Ü_ÊCÄî \1fÌÜÞ\f\vÆ\\83Òþöfæ²»u\87î»j\9fhÞV\b\|*x;Jd\83\ f\v\925v!        Ô÷\8d%\9b\8b#ââ\8bªæ³â4|\89ó\eRÉÒ\ fó¶F\1cg\ fÂyÍäê¼3}ΡÉTEÕM\8a¥MáDÝflþH
+ÂñôÈñîú\1c@òܵgKf\7fÙë¸\15X\9f¾\19¯f}}\oâ[\81¬që»[̾\8dªPß­\12\9b\8e%\7f7¦'çååM*\8e\89`  M\ 6ñ\82·zyñ\1c·¡ù-\ 4\eó\ eÜ\18ÌäE\9b\9c>\83¡0E\ 6SEØ\8aº%àx=à\rS\87x\92\12Æ<9+*|¾YÛdü^L\93\96ê\1f¯\93Üwî\87õfíÅ\9bÎÔ©\10èØî\1aSÜL\b£k\14 |k+èö`½¼\9bÔê\ 5¯\ 5E\v\96\8a\h£[©TkÙ\vÏI\8eâew½\8aÍ÷)\9cw\ 2=\9b;8SêÛütÝ\96!!æå\96\80Û*Â\9b¥#Ãç'ïÅ\84¾4tÎiM/\1cû\0\v\1c$\87C\ e2\95e\8a·ÎP3V\7f\84O`nÞjClu\1c\r\ 3~\7f¥JY\96c÷º\fq\83\1d­²^VÖþlÔY½v(®\f¡\ 1+ퟸ\9cä^«E]sõ¹\ f\8bÖ,ìPÇÙ@\18Þ¦(Ó\ e\ 5Íh$¼iC\ 5>\9f@ÕÉxØïs\8e\8a\93¬§Ñ\ 2+\10\87¬Zc.\16è1sz\v0­Ò\14cZíú<\85[e(Ì\\®þ\b¶ j\\96àGvÇç»`K\8cO\99º_Åô2\8et6â¤[RáNÒP\86L\bKû(¤\96ÕÞþ\97¼¿ÞW˹4eÖ3\18j\e\0î\ 5"y\1cùÑóp\9dì\9bÖsRZ\1e¾\ej\96Xáæµ\99+\14¤áL\8bÜxyÃWtØÙ:´\126Þ´òl )§)­D\15%CÎÈ\86W\7få\8f\87Á¶\8c\19K§r×xkõ¸Ò\86ÕËaÛ³Pëdo\17\ 1\15£°«I\87¾Ô]VÝÕP\\14)fÞÛÁ³é\e\82\1eÝÖüηÌÉþ,\1f8ס=®Zá³Æ-Û\0ñ7#â£ÂØ7\85ú¸ûR\10z\859cêe|%
++àö(Ù?¢Qrx\fF\89#ò)¾\9c\91þk1\91ÿði>Ñ=íÊ/ö×\90\9bì¶ý=­³Ô#[Òh³\98\15öÕ\v2ø  e5©6ÄŬ\81Ì\9e!HM·âs\92^f\a\91\aÝ\852)[ô\96«:¸Å6vÍ##¾¡ëXz|Cú9(\ 14,Ö+ÔæAôG\9f\9a@\8d\86s{AîüoöN/\92\92å\80¤\14¹KR«\1e\97²\91È]¸ÿ\97;4wµãèÑ\17í\aLLL\12\15)\8d¿Ýðu_²[²µ\1fæ\96\96\17;S\ 3\9aEø¹7Å÷\16!äy#\eX\998¥Ù\94ór´Äδ\9aÊ,\94¯1~¼ó\ eý|\ 4g\1a©Ý\ 3
+o]\92\911  Ë£\9c\rtHºÔ%\87\87áx:,[fZa\8fûwâÈô[)ofX>L¥\8cå\1fÙ\84ˬ¼Î\87âÖ-Eù¹õÜv'\ 6íNéí¼sÀWé©ß\94 ¹\f\88ËÊô3[ãdQø^É&oË$<áP|ÄÕs}\9emƵ\ 5Ó     ¾«qÿ\15é4òðlJ«9§\91Ù2³gØGù\89ù&\8b´\ e\ eYçÔ$< Á\89\1aÝ\15ð\99&lð&ñ½àÍa\Ã\9b¤Eá3\13^à3¥÷Cüã<`?«Ã¹\18Ìw[¯4ѹÞd¼é\8eT\\19q\83F\96\87n5OßÙú\0FÂh\1däøÒ$®r'4ßc¯ChÈ,ß13V¾Ñ\8c^¿.2¥}\9cíÈ\8cÖ»Q¡¥¸d©7¿\r¹Ù<"\ 4n\ 2à\97Ó¦\8e·@\17Á\96\\81C\83\1dºB\15ê\92e\aÑAQ+£ÊX\1e¡
\9e£Á¦º@\ 3\11\14ÿð\88×VÞ·Cmf\92Ñk¢Õil¬nÚ$&q¯°6_U6_\81Êo\83ɤ7KØë}^düPk\8d\9f \87Ñoè÷FLJ¿ÚÂhwT\16#0¿TÉrI0\86Õ\1c±'¦ôè\8c\8b\ 4\1a\8aøbÝ·XE\a\81ÔG6\83ë\18Ao-\19Ö;k\17Ö»B\ 1Ö«8\ 1'ÃsZ#\r\9f"\9côn³?²ÆíþÁËVÔPæF©åó\e_ë1«\\1eB\17×Ǿ6Õ\ fÃϤ:Á\1fÌ\83ËGc\15.\0ô\96\1dÔ(Cá\ 6#k#\90äÁ\10¸áqML\87Õd¬\10Í\1c¡á\v\ 4µ1¹[?¢ÏU7;\ 5Pø6\88\11,\18\96`£.vá\9c\a\94WH;àÂrß?4\90ï\0¤\11|\0"\960\0\9bÇù?\1cf­ârGt\ 4Q;Iþt\r¯@F./\1d\9c\ 2èõ²¥'\99>\eù4¾\11nT^Ö\92QÑ>\95H®]ê\f\85~\1d#æh\9dÆïé~Á\ 2«¾Àúq}\8d®\89\96\89hpá\0\7f·\95+L\ 6­×\80~Á`ßi3Í>$ïÉ\1eÿ*\88½Úfiu/x?«Öz5®\83ôj\84Á÷jÝãü\1fl\ 5\88$cü\1a\88Û¶êÎVdû8^6\eÂ`ú­6*\93Ú\ 6\ 2hM     \ 2ÒÍ×/úÞ\8a\88Ö\19ËáRS¬a¡æ\ eÐ×ÎÍÚÐ(\ 6ú,¢³¯9\ 2x\89\ 2S\85×v°g\ 1{PòJ§~e_\bzÓr\ fè^ùi£Ûº¸xG*\17¦\9dîqi¦uZçÙ\ e©f¿\1dÂ[¶\1d\82\87Ù?ì\88\85\99U\ 4¿ì¾ú\ e)Af#y,ö\83Á@(ƹ*Û\9dÄ9\8a\11!jÉ\15}³Ò\r1\ 6R\84ä6\87<l±å\ 6\9cîøÁà HÔ üÚð}\1eÓÅÞÙØ«½fþdt\17cßé<ôW\96\1aêôó\95¸­\8e)¨õvwpkË×ùæç²Ü6?W<h~\ ex¯it¶ã¦\ 1ÝfMý{\9cþa0ÂZÙÈj²Tl\1cä\97s\9d\1cÏ\0\ 6\18¤mû[\8dþ4ï\ 5\92/ÇÙ±ÁÔ]âÃôµêõkç·ß\9b£åw÷®#`w9\4ºÝê\19î\ 4\97ܨ3h\95¹´       8\´Ñ!³n%¹\8dÕ"h÷Ü4\9d׳Y¨ö\8a\rû¬÷\1a¥\16ÀÔ\1d\7f¹®sróVç\84N6e¤\ e½äQ\1dºÞ¦uh\7f\14þØÞ\1eãÕê»\93\94¿ñó\r{\19ñÇj\880*sn\8e\1càRÂ\83õå\83\8cX?è]{ÏSûµCÜÖ\10GîÍ]z¿hR£u¾  Ö\83ì\99ÂÆþ\ 6õ\1aÌ\96$\1ae\fëî÷(Ö''pS;7Úvmz\13oµÆÂÿVŰר¶W{²"\17»R¥çܽJO\ fj\95\1eÏ\ e¡g^\9d@a´\15þX#q"Ë.ÔË\96Ó\15Ã'Í  \a\86#YùÄ\f({>k\12~G)£\805ÿô§¢\14t`Í:7ér|¨\9dý¥Sí¨Â¹"Çs¿Ò×\9c\ 4\8a&@\11ZW»\r\byÎár¬Ú£²\86D|\99(!«Ò×U³¬zÉL+çÒ¨¿\0\178(ÚûÝ´8f       »Xª´rÅñ°F\14ÇUvR\1cç\16³?\94}c#-üä8\9dZÂeÌ-\8b/\82\1eÉ\9fþPD\8a\rt(%`ÿL\ 1q\ai\81ÙͦYÄ;^mÞÒ\ eЫX±J»ºk\17\19ìt\ 4Ý£\7f\ 5'Bá\992\ 4Àj]\82RÂnáôî\ e\vÓí\9c/4Ø@-48ÒÉß*ç(ßVñjî\81\9c\94Lå\ïØ:\ 3j-Éú7\80ZWð\94\80ýcy+4\163\92hNþK\99\ 3ì\10\1dÞr|\175\18®Ú\9f­` \1d\8f±gÃÙ.nU¿ä\1d!4îîK`ÝÝ\81\93\8f´+4û\e\19ë\97\9cì®~\93aûÒ)\ 2Ö¹7\0 vµ\f \17±\ 3 QB\ 2h\81\9b\ 1h=Ö\ 1\14\96o\0\8a4\v\0J¿Q\0\1doD\0\15Ó\93\r\93\14§\ 3 \1aÏý1Ç\91Ùtr1\14æ\97/ÏZ6\rý\b£ßú¥Õ¿\10z±­­¥¸QY\18\8fj¯ô½\94õ\98;\16Y¸à\14.åÓ!\17¬'6\80\ e«;\0\9dL<\0\95ö>\80ê¯\b@\8f­/\80>Ä2\80~ü6\80A\ 3\1cÀpO\0°%¹ý塵ç\19À\5\a`Ç^\ fÀ\ 2`
+`_Û\ 2p\0\ f\ 1¼\12\94\0¼Jöþà\ 5æ>ù¥ÌɳXÅ1­Òï÷/>Pmëµg®~:<£\8aZîø%ën^A\8f"Îéfò÷cx\ 4Ö>µ\aÐDr\ 1l|=ÿ\ f±à\ 3Ø\86x\ 3Ø^\ 2\0ìuM7\bV\1a\0\ e/\11\0\9fåY\0·d\ 5 òð\11 j~üÿÎêí\8eÿß)ȳKÊ3þ%\88Q¤ôGü1¯füQvZü©3j\9cì{«8ÁÚ\9b8þ0û86ô[\1c\93a\1cÇ£!\94²ïÅ1U"SÆ|\8a)¥DÛ8¦\9bv
+yL\91³S -\ fa\8c;ÖëmV¬Ï;?u
+/úv©DN'îDЪI<=ø°|òqÙ\f/DÛ\rç\0\8fæ®qú\87øó}¥q\ 6î6\rVRãO\ 1\96\7f\99ÛëT\8f\93ÍÞ\8d\13\10Ä       4øÆq UâØóÓPOÝ4Ô\9d0IñÒP­|\1aªÕ·b<n\1eÞ&ÑôÞù]íò\1a\835?rØÚ3\82Ìâû)\14ê¹ð \95°y\f\8fù\ 4Ëz\9e\ f:WrõP°­ý\18´ÏG?ú\1c\8fþ«|óþ!þâ\89\1e\7f;×MüñDù\7fñ\8evFº\87_Çø\ 3\12Ï8¹mòq²ý¥Ï»p\8a\92u
+c"4\85÷\ eö¤waᨯqàé\91;ð¬\88{\ 5nTÙÄç§ð\89ïáµ\1f\ 4ak\1d½\83å\aÈ=Vù\ 2ä¿ÆhÏGÝ\v\7f×ûÍõm7Æí\eÕbÝë^G\9cÿ`\86Í,5ô+\7fÄ_­ ÅßÅu\95Æ»Z¦\91\87ÛøÛ­ïãO\88\9eãÏjþü/\83®Ç\85ú\e\1c\;\91ûØ#Qµ\7f\1d=\eè\89\r\9f\ 5\8f\(\ 5=:T\1fÏ\12 ?Vn%»uúï\ÁñÓ*êrÿ\14»\8fû\90Cß÷\E\ 2oÔôÚ¾\96\89.s\9eÞÐåIür\9a'\17\ 6\86×»v\8dãS¬èÿ¡¶\ 1íGü\8dK\9bøûNÒ8o¡\92þX×~\89ô_\1eÚ1oñ\97»¿^\87ï8y\9e\1få|¸\98}  _¹5\1e\bxîù8tDï\86p\eÝs×'wËÒã×\83ü^^Ù\ 1¨^\8e\9b´AqÖ?»s3\9fsN\8bqùâ=|,òú=µxTívÖ[sq\89\11\1cÒÚ¨\a»(m\ fÅ%³Ù;]lý\ f       @w7     \80\14\94\ 4PÑô\9357ÓOÚ!Þ\15\9dK$\18¯s\10\9c\87W?>\81Á}T~Ä·âå^¸x\93ß\9b/Îó¦R?-\89\vv&ê\r@3m©²6sD¡\8bàjÂ}á\12õ¯ê\98\8b¼î\8cpÄ9Ø&{;\94
+F²wnHË\16ÌíØ\9aïÏËÝòxXíº²µ2þº2\95h¦üH7ó+ÓØ\884ÀsKNr=EKrCÏJrUo\1f\eí±\81·ë{A\84´Ë   ¹ïORC;\1f_Êüá&ûuâ\ 2é^s¨\9a^9ìÇzóPrw½ý¤ºCö\95óudO\9b~Ö)´ë>0³Ä^AÚùj]ÛI´à\9a¡c>ÌÕ¤\ e\1a\eÕÆu]\8b\ 5=W­)\1a5\8dd\rl\¤\7fHc\1a«InÂ)Iε·¯ê7Y\85\ f¹·xlB6\e\93¾º>:>õ\94ëô\88\1dOªc¡'ëP¶ôã¾êì|»qÚ½¬öÍ\0v2´\ 5w=ïX5Õú¹m¼ÅÛÀض?\84þáß´nÔ«i$b[Ò¨\ f£k ±÷¶l¡\14o\8eâ){0f}VJ̺ñB\97êm?Xª\v¦¾P;å\82øÇÿ¢L¼m\18´±éÝ\86\8bä\95\8fÆØù\16¦\1722hÃ\8e\15å¨=\1f¾gÖ\1d\7fª;¥ðØ\99ëòóhhù[vëÔÍÒ1ÐóÃc¬ÑÖ%¯\15騼eµ ¾ñ\80¨³á-\b[_\8aMzÝä\10A½W\16+µ3=X« Ùx¬úËsMA¬öPÖ\8aÓ©\8cߏô]2³\7fø\rE¸ÚúUÓZ+\7fÄm¹Ë<R\b\ f=H]×´\9fM§x\9eµì\16ÜGv\ 3¡36\926"êfÔ_kéÑ6·\9c
+9\ea\11\9fÖ\970ÿX·êq¤.ÅïWíB%p¥\b\95ª\12][Ù<\e\ 5\98\1c\1f¹l*\9a2\97̹·\91FXÿ´´\r/·,ÕytÁ\89ÇÉ¢Ò>O3\ 4Ñ{Xü\1f\15é\ 1JÂóëiÑa<,m@8Ì\ 6lí§4\ 2\10d\83\864;úNZãZ¹¨q\9bÓNY¬Ev¾V¥ÑX_­0ÔV^\ 6qRÐ\b½Ëzkð\94\ 1i\90H£3\Xî\9bÃêr|\17»\v·«\13\8bÊêÄ\89B\fÈó+\81Ús\11¸G3\7f¦e\8b\9cΤ\164\9e\ e?ë&È¿¼¹\9c©ù;´<?=Q\93rAo\ 3ï\9b¹CÓêyAÑÄäQQ\a\87\85궪\15úë\ 5\b\90\ 3xå=ö\17ògè®ä\1c½Ï²ê\12¥íìå>Ô\8f\v÷-]\16Õ\8e\18\88§@OÄFÝ\ 2ç¢x¬ÏüÇs0ëÕs£éJìÍ\84×g¥\v\e³r\17°QÒà?\8då\88×o6÷ÿÁþñì\ eÂì.psÃóìø9\13ä¡Æ\f\aV_ã\eÆ·­\80:x¿|7ç­\bª\8fë´¹BÈ)"\7fKSZÎç&üò Á\8bÅqUU\16ÕwC\13\eAn7_Ô>îì1ÿ\f=÷\13\1aø\11Þc({ÆCÀÜ~\8b7ª,ÆçfÛÉ\84º?W\13P\9a\9c¸\ 3IU86\1fb\1c[\180\1c['Ø\fæ\8fàŸÊå\86Ó¼Kk¥¡}\97Û\ 33>á\r}\\e\83Û\1aEDj0hd«\8c(1\ fVdòþéHÅÕ\a[x\9d\a-^\ 6i\87æÞ>,fAMU¦Q\89ßL\91  ¿\13\16ëðß"\7fåIb\16M¬Ý:7\ 1ßf\95cñ{\9f\8a4[\ 3É%s><\ eÌly+¦W\8e\98M\1fMËpüÿAÿñÐyI>=¯yÎ\81L\9f°\14õÓ7Ìw³±\15\96InÝy¼\ 2%ÖõXÎß\17\85¥³Û6\16uhÑ\17[u\95\9c\ 5Gz<\8dl\84\17\96=!É\7fW_\99'ßßíÄîÄ»Iq\95÷8ö\96÷Y¯SKØ\9a\82\96\98Ù\95ë\8cïmm8îÈÑ\8c\ e\ 6¼E+ \9d£\95\9f\19Ô?üFK~C\10Ùs\ 4\97ë\9eءέ¯3P¾±ií®¹Õz½ñåB³÷\r»ÆW¼v\9aÐ|ùj¶g\ 3¹\88LÑuq$\0Ý;\93ö<l~2f5\91ã\ 4Ea½ýRcëeeÏÌIå<¾ÛæsÜ-ù\85\96\ 4\1aTdw1j=^\v\14\99£øøNFqpî\8dâ\10¦R0\8aB»Ìÿá^ÖÛÒ\91\19Ûoo\bsX9ôµjíRWWìü«\0é©´ä¾Ï\87(\96·Ù¸ç¼\e9\85éKwj\82NÛ=\9e\ 2\96è\84\ 1ç#\8eû\8e\18ö4 \ 4æ\8au\17LKn©ãe4ØÑakp¤\aÒèA­\9f\120J\9a»ê\88\90\11Ð#&äHµ·äh­FähöR\9e¿\8e\87ù.\8f2È?®çÝgé\16ãñØ
+e\910¨é¶¿¹\95\96Õ\15\1f\89i\82Wñº\9f]fa\84\aÓ\8dK\7f\85á\8c\83x°;jMÊ\r´Ï\9e\82\16Î\¯\ 5\8ai·K\93l^g¯\1aÎèÕì%S/ç¥QX\158\8ctºp\1d\ 1N7N/\9d  4ÜS\9bþ\90)\ 2Ì°äÌ×\84;é?\b\97¯5\86¥ã\81\91\19Ã?~\ 3;¿Ñ\92Ý+b²\9c\8dμÕÁZ®\12\15%'\96\92ÅTÙ\9eæ=\19\98ó½óVã\1eM\98oRàx°PcgP¡Ë,ò/d,\97B\92Vs.C½éÓ\94´ýr4Üí6äî½³H\10?\9d\87\8c\99¼\b÷]Í\1e.'ª8ÕÁO_\97Ƨ»\81\827¨ø\8a7\90{\r\9f®y,E\1dâ§Èú?\9c\90k\7fú\e01õ¤\8dk<>\e¨H³\ 2IlÏ}Ï\1f\fíMñ¢ió4¬\9c'\10¤dó\ 5Øóuýen\1f\17\1a\ay·E?\93Ý\80\8as:Aáôn<"       \89\9d$\92à[R\87,¾Ù\11ü@:âçÍ>Ä\e\8fG\1e[\fªM¬ý\92Fèc\9b\9e?2nz¨Ü]CèCBÐ\146ÛiXÛå\89?\8e¦þ\15lI|Ñ\865i\10Û¦@\ e\94o',/k\88ô\9a!dÇãé\15±ãx¯î²ÍMå:\ eøî\9b\8eÖ\14H#ém\9d"rÓîhT\9c ¤M0äС\86Ùå9\84\ eÔ\8cà¿C\19¿\8c\18\1d»cÃ\ 3Ö1D\1f\95\8bDè»\8e¨\ f\fG\10ù$Âñ\80\18\16Ê\b2+Â)}\ 2Aè&ö\87[\9a\ 5\e'ZgÕ\1c±\ eÄZÖ¿\91Ç\ 5½$.+X$\90qtä\84NÁd\96ó\93M¿r;\8fJ\9a~H\ 1Ã\1c0\1a
+9¾Ã\9d¡[éÁÄ©Ñ\1e\12õE\8fÁç^[ÀüzOºLo\83\ eø\9e\8d¬íá\15NJR\ 2\13Ãc\96~\18\98v\19\19\8cÆ«é PîÚ\83\11\8e\82)÷þ`ÔÍc\ 3\93\1f\ e\8d\8a0ù=` Õnïá*ÉyÝ¥w\1c\82³õ!÷\9c8¡s\1c\87èF§\12µ½\1dQÝÞ\81Üï¦Ù\94ø¡{ÛÄÃ*þ(\11SóÓÄo ØÇ\1eP\ eÇzä\87BWûÜ\ 4y\97A\11ÁHp\ 5ëvc7Øé\8dÓ\0Ì1¯>\83lËýR\ 2½É\90áz\13²nö&\83z®7©\9b\9dÞ¤\10 ?²\94ª;\88Ð\1f\f¢\13\83N6ÌÆï¼GÊè¾ì\88þ\18,L\ 1ù\18rõ·æQ\9fêÔ \ f\9d÷fX½¾müf<=¼So?1Y$\ 1¬\8f\19UT5\ e\1d\9f\11\ 4\1fßHØp\9fÙ)\0çs\8fé\80¦ßrÿà\96Í>\94k\1c{µ"\16vg\9cZì6\81w¯³ \87Lg1.é\9d\ 5Vüv\16m­ÝY\94\ 3¬#~.è\1f»mPçµSNd\7fóÌ¥ ÕjÍaâ\91Ý¡yfm<\99´qx\1aÑ´h\11³ëq\8bõ/´\86Ä.\7f@\88\9eq\83¿Ïw\f\8fÆÍ"\(Ñ\8dÁxÂ÷úÎy\86õ¹\99A÷¼»Å÷êÝó²;_=·\9dû=wèt»ð£­¬ä´\r÷þM»n­\97\85v_ë\16ÚûÆ-4¿l¶\90è\8e\90\8b\87dü>¡\86½\a\84m»9\9d¬ri5¸X\94\93Ö\94\ 4\8d\ 2׬²Ozû\12.$t_\1d0åhéð®\e¯\ 6¥¸hõ«@>[e¤w:ÑA¯Ñ\98%ÝëÛ+uÅí·Ùy\0Å~GÚõ\89N\8fbÙöê0\9bµÞÐvÕÂ\84³ÕÔo¹Ks¸\98|\e»àÜhP«!Õ\0á\97Zßß/Ïú>moÔ÷\92\r×÷\13\eù\91¥T³R\9b\ e¯Sõ½jp2Ôj\ eçêÅmñ\90Â\16\98A\91|\8dÆÆèF´ÂÕ\11Ñ/Ö®\7f¤óÛÎãÊ­Û\bI\98­8¿<¶¶\97{Ðü¶â¤i<ê`\934Æõf\9e\evÞËn6\rÚþ²\8d"Ó_ÔÙ#»­CüÑ«ñ×ò«V\13Õjuö-\13Õ¦²ZTî°p«Ü\9b\83\16/Óîï}\8dü±éÅúL±ËOnq_Ý\89éh(¶X¿Ý\aiàô\e#\186æÄ\ 3}\1f¤óà\90\1c\ fÝ\8ewÑZ\9aÜZ5JÄi];5\³&ÜB§zí\16nU\11@_ÙJR¹\8aOí*\15©ñêTº÷\16\ e\85K\8e\85V]{       Á¹¦U~Yª_ÆJy°\94¸r¶lNIç\eÓÒ°\16:¥aÁ/\95\88[·["\ e\8f\95ÙÀ¦\920WÙù¦c\ e''\ak\8f·5\ 4"y¶ùÅ¢É(\82Ç£é­×R­c+ÙxfÝu^jU¼1Rù=\7fg©¡\921ynJd\rÜ\95r\17Ø+Zkñ\91rJ\8a4\96+\16ifÒ\ 6\ fÇ\r\ 6\1e<\80\ 3Ya¼\ 2¡Aà\16\8eo6.ð\8b¨\91?\87ô(?SÁu~¶.½óçè\94þîZ\82Sêè\8fìÖÉ\99àT\ѵ±À<Ò
+<\ 2«]ªèvjxXo\15\90\82Óz÷D¹wo}à\8eS?\8eGFµÓدËÛWY*ÚCk\ 1V\9a\96\9a¿\ 2ò6?ß\19»|\8bº\1ds~1wÏ-ïð;×].²µT\81°{l\0\ 3\vDSÄ    0°\v\9b\14í\ 2\f®c\10\18ì¿008Xs`àL\1c`àO\8a)a7%éÿXH\93Åd
+¦u4\etW\beÛÛ6!uÌ
+B©z®×>N³w\13µ\8cÕâ\çms_Q\1a\f\14¨u±4y+\85is+å¤\1d)\ 1ð\ 2Y§ð\ 6\0\ 3\0\1f>\17\0¾\ f#\0\8e­<\80´ÚM\0Au\1c@Äî4ÅÑ\ 1dKß\ 1D+\96²\99\84¿Yª\88>Y\ 2ȱî¦x    \80xJ/ÅF~Ìr^Äü/en\82\ 3Â\8f\8bMÄ"\v¥ÞbóJZdxók\17;8B/¤k\97¨ºn\80\13¹·Í/\8a\8f5\80\15\80ì¬Ío3§\87\ 1 Ï\86\ 3 9æ\ 2 ÕÍ\ 3@{þ\e@y\18\ 4PYo\ 2¨WÇ\ 1ôkO\ 1¬K\1a)\8f\e\80\rÕ"\80ñ\14\ e`BIJ1\1d\0\9b\14»\9cr¯ý\98ÌkD6µw\f,\18l(\9eÙ.J2Ëzï>e
+­Ñ¤\1dÕ®#ü\ 6a\bç\16\ f\83×¾p~èv®¯çt\0\ 5\9e)\93\ 5 .s\0P\7fêü/ë[º¦ÛÇêé¶Dî\v`\e\1d\ 4°[¡ñ\9bA\fÎQ\0§!\1eÀUk\và\17ê
+à/°\0\10\ 5\17\ 6\b\90\9b\ 1D³¹O±B\80hAù\94&øã\97/\8d\93+(ÆÉø(Äñ¤?\8eã!?Mynã\98\1c\1eSNÑ/s;ê\15S6í\94\17\16ÇÔ\80IYÎc\r4\95÷\9757o\13òÌw^pì\97]¿¸/ú\1a]^EñëGN\a\8a"Hi~\9fÞ`Tzò/³\13\1a\13ξ²\12\87\15Ü)Ðû¥T\vïcÐÙßÜ\7f\88?#J\8e?õê<Nì\e\1fÇ   \9fn_\97³P\8f«4ÊÞ!E\7f¤Ñ\95s)ÓzÊ\15\8eñ}8|\93G\7fü¢/W>rZ×l\98(bý\97üôz¡úä\9f\89ö¬­KV8K
+\87°©·ÎÁ}H<\82\8e5~?\94â¦ø軥¾¿®Î9\1f\95{</\1aw­ù5îø=Ðÿ!þ(Ô2\r¶,üòÐÑ\99ý/ÞDÌ-ã¤ÝN÷êq¸\8fc~õ¿\fºVh\97Ò\0«õWq\9eë<½îc\10^à3\166··Q°øÞ\98 c¾\85\87RxÎ\1fýCNö#¶¼ö\11¯jÜc\ 1Îr\9dwüJ]nf[\8anyùV¼Ò/
+½8Ø\86½@\86+\9e\85¾»<×"=½\84óûå\1fñ'`Ä4Þò$þôoãø3\0\85t\ fÃRzFL´¿ôù»\80êÙ)\109çéç),Y0lÁxå\11\ 4\8f\8e\8fb\10\f\b¿\ 3µ&u3/}öVhõ\85ëXê\8b\17ç\89(\97
+Bjç:\81[§ùnvöüÆ#ñºÚ¢{\U\9e´û²z¢\8b5ËÙ±q\92Ûgö\1fúâ1ý\11\7f;\93YüùöÒP\83vÆpö¿4º kïÝcbEÕîû\10¶!Õ{¬\18öîoxþu\1f¶Èï\8dê\11à\95AÐÊeBt\eç)õ{íÁéz¨\ fNm¨\8ey~zVz½:Ê\1eÃ×|~\841Eq7\86©»\18ùõ\1c}\8f¿\ e»OÜÞ\1fê}Ò>bäÄ\9e\9c]5j¬u&óÿ\87ø»]Íâ/Þ ÓOâï\14ønw\8bøËîå×áQ\96Â\ 5\\13ý÷|-Ýs3b}-¯*æ¹aø\aï1vO^Ï\7f\ 5Gøé¿Ü-ò\ 6\9c\8f\9b+:ƤQsrçFë`Í°Á\ 1\8c\19b\7fФñ\1e\ 26\82ÍOOYµf×\9a\95\9d5[r·Ý=W\81LùNÀFDh\8c\81\9cæc=\9e\8eéÿÐ\1a(õ#þ¾W|Ê\84I\0x/Ä\85\8e8}qè{\12\ 4#{x'\97;ôÂ\9b\vzoî\88ø¹l\84Ýù®>Û\83Í~ì½#¼\8f\96»Ù\ 2^}Z\17³\91\11\92ßÝ÷xy·dø\86\19\1cg]Sá·\98\11EçqÚfÏÍÒ룭ê\ 4¿ru \8eå¶ögÕÙ\96H\9fÜp\97ÓhS\99ï²ç=\7fåúÔZ\r\7f¤\ 1ê\93\ 4XùÓçUß\92¾¾!:·=­7®Î\ e¬\9c\96s\1crµ¸Ö=ì\eEb_1\8b\9cu\15¡ÅÎ\97kk3\×Ls\904\ fÆfØ?ë\89Õ÷u\9d¦³W#ë\80C\7f´\1d·\ 4µÂi]Ýî§^w[ºÝÑÍ\84(\8e7U\80\14×Sj«¯\eÅÞCmwϵ\95d5PåY¬\ e\95\95\93\ 3f\9fø\8f_\88ѹÐã|C\b°k­égg\9a÷<ZÅãÆÏ\ 3În»Ìí«Ì¸jµ×DÏT«#ÒÀî\ 4§\93\0·Ð¨÷hµ=àc}[69{Ã\17\84ãúÌ\b×õô³\fÔ\e©¼ÕEÞͯ\1eãkeÕs_måÉ·ÒMG\öx\9cü^_V2öé\1f%\83ÿ\16¥Ü\95ì-i\8cÇþ\ 3ü\90è\1fI®Ú]\ 6iÿ\90¾z$\87xh§Qwl©_Ø{\10þ²\9b¥ 6UMÊé_X¯k´§\ f\90¨ÿ\8eMMÞqëæz'ª\v_\97WAo·YõÕýNQï»\83\1cww'y\e^}é\v\87o\89Ôry)OôjKzGõ\16\ e(\91\vöð\9a\8b^\85Ø\89üs\0Ì/\88Ö\9aÏ\8b\11:o:\17äG\96R½s6ü#\9aÕ\19ÁÏïúÔI    ý¾³\1f\9f\95õr»°t\ f\8dØ\19\ 4\9a-\86¯m%ÿ\ 6×séÓT\97k\10^\r\88ÏPA©\ f+kÛÏT\ 6\80\9c$\8d¨\9cº´7\1f}Yüæ²i×\vn\ 4z¢·\ 1ï¢\80õÞó\8bA\17æ­ü¢>[\8e\ fȬ[.sSE\966ÓÁ`\1c  ë}X\15Ö\a\ 2\16P¶Ûÿ\87P>Vù[\85ÍSÇagÚÝO-¶²[]\85\14\ 3\88Ç\ fm|ÕÏ\e!\9a\ 6ªT¥>ÊK£Ër²\9bµ¥\1dËÂËý\88\1c.K{\96YT\f\84\17§yD\9c_ǸòÿÐu¦Û\8a*K»¾\16DQ\14\1ei\ 5AE\14\ 5\15û\16{Qïÿ µö®=ÖøNýxp:g\rBÌ&âÍÈH·\1e±#ÇË  ±CÄÖ¦å§ÎÉ~\88£\97ÍM÷%+\82\12\13ëër4§Ä±×lÜ¢¤\99\9fI%s®ÍÉÿ\82ø\8bs\1a\9dÇÙâR?`x|\ e©òxlÕ>£5\ 3$C\14©,ú×ëyïóÆñæM\1f\99Ó9\7f§\95Nsvù6èv+Ú3n;Þ\88Î)]ª\ e)n¬V¿?síÇsÙ³ya3²"\7f\13[Àã²k*\ 2x3ç\13\ 24Ky\135Vó\8d`4\rÖ5*De§o¯»¼Þ\1a`u½\15\17ø\ f_Iõ{=M\92\9dµ\19îÊü¢ò.àSÖþÀ\11ÄÞßÁq\1d\1dú7q\1c÷Æ°¼ò
+CöØY[jÚvê\8d¼Û!MÄé±&Ñ\1a\10Ù÷5bhÑzwê\8a%]\88f3®ÖÝf¡M|ånS?s\91±¦´¥Qqí£Þ:\85/\1dõ^e­}§\19\r\9bm,õ¬;sµ\a3\1fµ\87\9fk\19ÞØ¿\90\14§½æZz¾øY\92;b\13á\91\96G6\10¤\ 3Ê\95¾\vù½÷Q\98t\17Á%î \95ýÆ=¦\97\8bÓ\9b^Þ­ÁâU´G\9b\17j\8d\ f\ f¢\19¯·L\13\ 2ç\82ih+ÕX¯¶\96\81äVmÝQ\ f\ 3í¸|L5¼RÜ©=\87\14äAÊ {%\15\96l|u\81Æó\ e\8e3¼ß\8dç£SÍ0®\7f\8bÃv!\9b«ÂgÅÅ~-ÆÆà{      \ fë\ 5íé§\11¶óÔÞ'ê ÍnäâacÞº+\8d½\1dâæÝ\9aÐí\sÆ·¿\v\92æ\92Ò«&\1c4  \ 3ñxZwn¼ %¬¤jx\97·ÔÞUé*w¦5R\ 6ÏÕº\91
+¯kCèW@ùô1Y^<\14Y^NF2Øì=dyMU2\18µÿ\ 2ýá»îyFîÚb\93÷ØiÐ\1d`QQ\ eáÁåS¾÷\1aÊyÓÙp\93\91ÛeëA+P\80©-âÀÚ\ 2\1fÀ©Y,U_f\19,\81FµX\80õzù\8dj]å\89«\97Å\9bUérNV\82Æ[o¤\8bÂ×åh\880:ÈæúæBnT£\93\8f\80¤Á\18*.ý¨!.û\8d\81¸\1c¨÷\f),.\83ZM\82ö8ú\17\14(ó½Þd'áÕÁF[®Qì\ fÁëÍ+\1aãu»^1¿\81GëþYy6\80EaS\9by3Ó\E{ÃÞÍoº\9bÌßZ÷º\80Tÿ9.+\ f|TS8\7fL5ÂG,4\0~¡Ê\93÷­%穧/e3S,.ßÒA,Ëý·°¹ß\10Á\9e7E¡j俾\80P5¡\8bP\15\ 3H°Ã\14ý¢ú\17ëOÎVf]\8bdÆSFÅ\86
+ùRqzílmkåøÉ÷¸\87¶Þi\16gL`l\9bèXo³ØJóD&Q¯ÛVª<\8eÖ·Ð\8cÂÃV©\11Ù\ eÚ\0\ e\1dRV°\1e/Í­NC*î\aM±Y\8f=aë\9dÇBu\9fÛò\aWyòõÓ\18æN½
+ÇyÔ¼ÍyôæÄ\9dú.\94\ 5:3ä\a¾¾ÝW\7fXÍ ú[þ#ö÷\15&\9a/d< \99S¾W¨´.ív\9bZÚ¯ÍcÐÔe´m´º·\9ev.¬\87ê\r\94'ýÞ+ü¨rkH\93Ê[\8eó8$\17t
+\91ô5\8b\89kD`Ä\8a+KBk%ëü±bµ\7fÊ­3\18rÞr±äÈfåÆöw\ 6Ä2Î\99f\9eõ¶Ã<±î\81e\f\ 2ÌÐEXF°Ël\7fäW~XÂW@\9e\9b      ×0\85÷\9fB\ 4v\9b       zrnä}n\15ø¾o´\92ß¹¸Z¯`8ÊÓ\97ýÆ{n\8d\e¹ó`-«òî,-f·T\82\8b\9f¼hY ,ìöPM¨Õa\8aï4a\81\10\95£jT\8b\1d\98r\9fyn{sfÔz^è÷\12ÏÓcsLÒr\85±h\19ᾩ½´\f^\ 1zÜhTè1Í\95ÿbîÎWÒ$W>2#\87\86q_ÎK@\a½<\93\9fdnZ\94îk\14jØÊh\ 35\e \ fv¥eå\13Hp@ÍE»h\1d\84}sp\17j»ñ7K\95O\9c¤ÄãÉ¥ÊùÄ\9d`ïý\94\14T\98\90\80,úÓÇ{´ü´bj\86\8f\8e\94z\85\92±0rÉV\fÒx\15Wä²¾ÿ\90ËRµL.ÞE\98\82øzù\87ßjI´PÖ\7fJ³¬\96uoq.~ÜÞ<>ZñÕ\8cõ¤Nú\8apÁmY«Ï\f\9b¸\82\e\ 6=þTN&<1\806\9c\9fâg\8e^Z/vXîæYn;C\98\b]b\f`ÌèÌåßHÔ¼z1¨bç·c\8547ø\98ØV\9d=a\1fn\1fü\0Sh\86\9b\8a»ÛÓ\1c\82\14ßß^%|¿{ü\ f¦| K¡µXóý°&V;{uþj\85\94¼oÂG:Öü&Ú\97g\ f¸%Vcû;Bó$P5ÙÇ\93è°¼¡\r\99è\12.\18ÉO\ et\\0ï´² \0º`h%Jß\98(¹®º$Ù<LDbW\9ai\ 4j%.Þ>À!vÆÔ\r\16iýVE\90zÿ\10Ëõþq>­÷\97æ×¹­÷»+(áTï\9b«â\ fã8âåa²\19\v½ÙäUi\13D+µóõÚÞp7ÅXy9\85\81T)A.葉żç'\8dVå«K\19îµG®ßå1\995Ù5\89\99Ø#û¯:HÔÜ+\88'X±\8cwÎD\1d»P"\8bõî]¥~çf­:\eÝ\83Z\b\9a0\8b\9fèøõ\81QyÜ\13PyÒ\1a¢r\8b¾¢²2\85P\99\99\97þ"Ü\fHeðh[BwËO¿k\ 4\ e\9eÍfù³×úÁcÖ(\18ï¡Ð\91á.;º\9a-\1a\1ao\rÂõt\13'T½\8dù\897Àèî6®?\88צ>ÌÑ\97ÚK\15ÓZ\ 4µÀ\9a¸\9cVj@÷A S².¢ùAìÎÙÉ×\17¨\16ÃÏ\1cYIÎ\r)\ föÅÊ\96\8aý®ô*[¼\9eù~\93f¾bû^é/\86§.ªùÓ=ĵ½\80/ÙÓK)5ÚÏä \8c\9bÛ¹\844n!w\9fá}Z\e\89.qpWß\8d1\18ÃV44Îï\9ah¡ýìTõKnP-ùä\14Y7Z\eÄÊG'¤2?<+;#\aV\1c\98¬TÐ\8bG\95\8fþ¡QÆ\9eE\a>\8fÜ\bî        \9fcé65ÁÒ@ùP%\16\8aÝ\12ó\9a'%f]ùz\9d%f,Á¥þ»Yþa0Êß4¯r\r\19ç¹bÊMK;¦\1a;Y&Y\0°ZñWì<a¦^mH¶6\9a\87\r¤¹S\ 3Ë%\13±Î\96RÆOT\13ö%Á-Ýc¹W
+Ô^Tâj»oâX1MÞ\87bè¡·¢H\1a¹¢(\1d«E\0¬0Ù\88ÒÒ¡\86\v³µ¸Êðy\174ÛÇ
+E\147\vE\b[\17 t\9b½WÇà\f\83¯öÆZ\a\1f\99\8c­>oßú\86¿
+þJ¾=»\88\18±Ý±cê½ ,\a\1fãÔÜ\1cÔÀ¤ßFìEÎ\86¯\9a \15£Ö¾\ 1\15à¥YÐý½S(Ñw/¿z"a¾9\12æù\8aàìÀígq\ 3[[\b\ 4Ñ\96\8aæÚÇ\ 1\9bú¹ïò*p&Ú#\80ì¿\ e\09\88
+\0éÒ\f@¶¡n\86÷\11 \8d,\1c%\8d\87_\9dp'|T\19ó`¯+j\94,AÉ¡f\ fnôÜ&4üzoð+\81Ïj
+H\ f\91V«íÁýûú{x}QÎQfa1J´<Ò\98\999¼gÚ\0\15Э\f\aP³M\bPsh\91A=\ 2Ôa÷\ 2¨'[Î\10Ó\0\95b\ 6@C§\11@\17Ý#@\97\88b\86\v\ fÐð \vÐ\0³\ 6è\î\9bý\90]ùò\ f\99*vÉ\ 28}Ð>×\ep\16\8fâæÃ\14\e~MãmMY/c\ 4½^\870Û@=hVé8\ 58Ám°NoÌï|¢\ 1ôzâd¸ô\0ú\ 2\ f\93ßm>\835ÀÀ·\13À\10ü\e`Ì#\92\ 5í:\9fájgö¸\11Àl\90ì·\97{\19`®#\19`nL\ f`s¯\rÀ"þ\v`«åê\ fö\82oH\7f\92·\8bE£&\}»Äè¡øm\ 2\ 4y'Ï5\b\86V\95\84$&¥Ðn\ 6\90æÝzy;u:Àõpo\ 1Ìðã\ 2Ì\13ï\ 2l\81õ\0\96\19\8c\0V9Ï\0Ö)¬\06V\8e\0»\8bî\0\a\96ò\0Gy5\80³Ë\12ÀMfm\80\9b²ßê<\0·}Þ\0î\16W\ 1îÞÔ\0>_\1fe\98í\0¾\80<3Ø\85\1fL<\ñÊì¾&D¯s©²\85øP zãᣦ>;\87J×ë.¾§\v\8c\v«16\ 4ÛÉ¢\ f°¨\9c}êþ(øÝæ'÷\92\85É?        È\1e3\ 3¸Hù
+¿ó\ 3À\97ò7\80Çè\17Àëýì\86\ 6ðO_\ 4\ 4\16w\ 1A=Æ\80à¶o\800$\91\f\ f\ 5\10\16³! ,Ù\1d $\8bg\86\ fø\13\88³kúr×Vú*\1aj\9a\8aw>M%PÊ 73ì\ 6i*3Ë\fÓK\9a6*`\866úG>M\95ræ½/êæs\ 2\13ÎSÞ\88ÞcVåú\ fõÐ\18= ¶=½/±îâ'©\9e\83Í\1dî-\93\9bußÜ®{.y_\9dw\15¾dã\vuéæ¡Öù¢\vÁÙ/\ræ\19F\8bÿ\vék\7fÎìÔ\1c%MÍ=\9d\19{á2\13)=ï\96jfe%Îà}åÓ×;\15æhé)¯Qô¡î+Ä}YǸ;ì\91òmCJú\r\19ðÍë\9eÕÝ«\93¶¼K"¶\ 6\97\85ç\8bâMÏ~aº:Ý\8dÕáÄn\1e\8f$mñÅD8\9e¾K\11Ç Qµ\8eòÕô3øÃ#Ø·\83\1f\ e3¦1ø!}\83ǯ¸Ûk¤é\vÌ\1eU÷ÎfVÂÙ\8f\92ãdx\86\99\89Êæ)¯\98ì.Iî~³®¹ÏÕy\82Ð%\11 o~Ú\ 5\9fÀõ³\9f\87É35ǹSPÂ¥\13»fÕ$DX3\11öªs\9cÔÕî\11ô\8cÁ\ 1\1a¨YÀ\90v\96;\e\18\9f¶.\ 4\17·µe\8fÞ$æYÝtËïæ\ 6ß\9eÍõ¥µ6þâûÐÞÈZÍ\1e­#¦¯@æ³Æ`Éÿ4\ 6ϲ2S\17þ\ 3jáÁuOÝ'\17<Z.ÎT¼Ù\9fØå&³t;{\1c'èòs\ 4;ÛÂA½láý\92^!»\r\1fÕvÈ8"¶.\18ýN(K´HØૹºö+[kuw\1eÞ\8a=UÇË\90\fNKá^/.&\9c\89/äWÀ-À\95ÏÍg^÷\7f\90¾­£\92=W\95Éàð\19Æ\8dÌì\85\9eµ\88]ë¾Ü$Íß\1a\81\92t1Ì\9e\8d\1f\1fí63%ÞîWÒj\93ì\98Ý\86ȺüÚ\ f\95ûê\ 1(¯U0uÀå«à\14\97áb\80,\ 1x\84-\1avÌ̳\8f\8bü»9[~¤þ¬ì_·ñV\19~\97¾§\87Ñ\v\9fbå";9m^Ì¿\90¾×;1³×¢Ò÷8ÎLµÖrö\98\17Êm;Ñ\98s\9f\1d2ÇÆùÌî¶Í\9e¼9\85\86¹î+²»\1a\1a²¿\8c|5\\ 2\ fë\9b\ f½Pxg=\9f\8f\9dý\\97\açÙj?~Ì\9aî\1e\88·§\ 4\8a\a\99\1eî\10>m\a,?9\17\84l®½ñ\8dÒ×ÑS{çÂw\8f©\85Ò\9dÄÃÜ\fÃG±VÂþ"ý\94ÎÂO\87Æ\9eâ\13â\ 4úÒ\v¦ÙÔ\81Þ\80Ópq+ìWñî³ñ\8eniÅÏÅú2×Ó¸¹Q\14\95\99U\11\9b±Ãj\9dé14ûS\1c°ÃÉyêÇ\13ª\10¬Æ·ãæ0fñý%zf£F$0ùï`\13~
+\%\94\r\93\18Å\97P\1c©þÇ\1e.\9eF4\84»Ø#@úVià\16\ 6õAmáÔ~è'\86\8aþ\90~\8c\92ü0¹\ e\7f\ e\ eUôX4\vù]½r¼nzW$Y=Ïa²P£î÷T\92\99\95\8bÓ¤Õ®O|ÁcÇA£ß\88BÝ3ÂÏzè\84\r\vÁûa8Ò¸Ód\ 4½^\8b¡)\ 3Ûa\19¬\9e\ 2Ûå\9eAµÞÎ\ f\/BúÉmKõ»3Bó¯ÅÀ÷é\9e\rÁ仼꽴OÕ\8b\8a\17Ä\13W\9bÊ_ütóK_ØÓÇ\92:­n\ 6 óYå\18ö¼(ÎÄõls½n¦ÝÍô4\1e\96¦ïH¼¯Ka>Z×GÅÝ\91\19\96\93£\14´\88\9b>8ô\9fß5\82Aýùl÷OaÁï\93@iä_§äÌg
+̺÷X´N=\1eî?½Èß\15<\89)ÕºÓ\11Ïw\15ãävæÛîº\93¹}ïv3\14Ëí\8aHÀÿ½U\8cåSnØý®°o)ý\r/Õíñ=sfËdÚC§³       Ó gQ\8e|®Gúò}\19V\ 6008\8a\7f\9a\7fëÔh\9fÉ|úÞ¨\8a+Þ»\8d\e\9e\1c\93½®rW\83n\16\9dM;úk´n¯¥Å7Ϧm\81¹\97»sYØEO\1dÒ9zoÝéÈÛië<\17o-
+\9b\173¬Jöí\1c\15ÿâJ\ e,ù`ÍÊäj\12\8cJó*ÞyM\ 2\87ØGò\ 1\9b\8e\16±5\1cfó\<è\8cä¯\9eÖ§lëÞK1\13ð>\94\v{ çÖºYó ;Ë\9cÏu`5h´­e g=É·\g:ë:Ia9pp#\99´z\9btÝ¢ZÔÅ\1e\9c\95
+˪\15\ 2¸d Ûç ùqæç¦üª|G\81ìJBÿÂY\10)yë·úØbEÊÅ\98x\b¯¨q¹î\86\9bÛz\1cÔ6\17¯ï\976a/Ô&s¯Q\99\1dº\1a\9b<:¦x͵måZr]ãTu\92Í\95p\88üé;t¶|ý$´h\18ÐìÀÎgcò¡Ø¶D¬\1e4?gsÞlPÁÁ\9c\ 5\9b§©ñÕ\92±\û¬aÚ5×(£¹\9dQfÆ\80¾y.òÿB2«~¤u\ 4óõ9Z«}snÇïJò\18UJÍõÀ#ÔÐ\ fÎv§\aÔé~W\8b«Q§lV\97î\81!\12ç$Ð\8fÖµÁ\0-z.\15íaI©Z/KÇ-q¦ÐÍiQ\11\9aù¦®\98Ù°l\99E'ê\1a\rõ-   |K³èöM¼i\a\9f×Ü\17@hõÕÄROVo­\9el4U½*\9bû/\80\1f\ e\9bõL\å\1f\85Zì}îP¤¤Á=hß±\95?\\80Coª\95ÝΪµê´«\97~ß9Í£où\8f\1a®ía°:[¯×)µr¹c®©°»¢9\ f\8f\88Y\ 2\8eu£©\9ci};:òzKÌiÚaZjiX\81쫧\857WIxuTú­üGa\18¯Þx¤U½ñx!\8bÆpµxdøä~\92j     Î5\1eo\10øawªsÜbõ:¢ÓAc\ f\8dÖSîÚ¿\85çE/×Û\ 4Ý\12qrÜÃ\87±\1cRG»ö\93B\87VôBg͸Âì\9a\ 5G¿\9a¥®\92\1aÍ«\ 1ê;T-êhGýú\ 2Zûb`ê\99¶hÕ{\8cdåÆ/\9a
+ÓÛu\eOº4nðs}/¿õí[\966\15$ÃV\91s­ÙTÎ\r\8c[\86% ç\9cñû/¶L.ÏÎ\9dܨ:\11Ú\13\8c\80o\19\ 3\7f4\1dÏ»\ 6g÷Ûè¨\99Y9;j6\7f[8Vn\19÷ÌE+\8e\8cug±0*\9fÛAG\1fÇ\8b\96\rÈOõ<¾çT
+¼CÊ@K\11\85-ÁxcdÕ¸\86\80¨\9a<v;®\9c;-FRÜ+}\17ò¥Â]y\88\8b`\a\8b\ 6¯K¢!hcÑ\10¡s\ 6ãý\a\8b°ó\aëh1§g\1dg\80\8eå³\ f\ 5\9d÷õÜ\93\17Ö¬\83H´ïô\1a\15Ó\16H«Ñ\8c\97\86eÂ(î\1a\88 \7f}h½ÖP§\1a®«+µ·v\8eÊ\1dé\\15Öí½\1a£S\0Ê\1f2\84åñmS\93A6¡¥ø\ 55$HÂmÑ\88\8d\81\b«ë¥`­
+W\ 1ivJü\1e)ñü¾Z\ e3l\12\ 1i±o\ 1Qðï|ó½¦?¬bxHǽÄA#hÏå\aÔ}\98xФ6u\135ß³ÓâNoÆ)"\99°ýÑtç\9dXZ\17ùôT\1f\ 3C%  y#\r\90mCxá'y"Q\ f\19\8cÙ\8f4SÍo2¬\ 4-mD\\9a!)ÂÛ¥(ØèÅ\14\90\ 4÷y\97°f|íz¾p]\16Ïg8³\1cþÚ\ 6\\97\ f\8e\\17KÓ?H:Ð\1f,\8dªNM\ 3BEG\9bS\11ôÓ\97~ìlfé7Zs|ãàYò­§\99ðæ"êµwWR/û®¡\ 4\9eí4^¹É \ 1\89Üè^ÖÒì\9a\1e¥"ó¹\8aË\14y\8b\9e\17\80X\11ª\8a\86ñîÈdùº0ѸîäÒa¯\ 5dÌú\8bßf?\966A\90y\94{$ó¨ô}æ\81\88\ 1Î\9e,-ïÓ/~¯\9e\v\ 4ÃÈ\89ÈÔªCw»\ 5z\93[eßvWËq\8b³\87]s¹\14\1d\86\82êïë\ã%\95\95\ 6àÔ-9ß%~µ\1f\fÅ\95Ò\9d\8båãd'l;ÉE¨^.)\7fèçA¾þ,Â\9c'Tk\1c\18¶O\9b
\18\86.ý/!ý\9adsxÔX\7fh© à´\ 4ñ]Z|å7\19Ü\a\1dÕý?øJªßë,\91\v丱@Ð\80\1fO{Þv.±ëFÖ\14ãÛFµ\ f)j\1fá¸Fdn)9ÿ\IR      Þêb³\ f´\85Ö(?\10PC\8cùöF[ó\98í'\9cw\bn\1cÙ^~Øþyûu9\98'uB\18>x\11ô\9b'$Z\1a\9b65½\87\ 1¥\f¡\rUà;)9ÿ@5R\9f\9cmr~Ý.Éù\8d»Q\85\8aöø\8bØwndT<\7fÐþЮ§\9díd°i=\121üéåßÁætø¨\8d(\v\88¥E¡M\8a\95I\93\17ÐCKá±s«Éõä©ÇQÈ+b\aíâ\82e1zÏ\8cÆ\8d\v#ÈnJ\8fgý<-k«
+\15G[\9c\82r\ f\9e4´ªIÂÅî\80°\9aÉ\8a@@ê\9b2\82ïf\9b
+¾;,L|·\18.ð]\98¿\10\95¤~ÿ\8bÉË\\90£\1d\98 ~\8e{<Û\98ήliZ\1c\19»ÚÍU\99õ^\95\16­-+86Fp\97â\93d\ 30'2©VÒ\18áÄ\7f×oèOÔ\ fèFn:¥Áø´¦fnùDiuúA.=         M²\r\13\9bÁ°N é\8aÃ]âªáµ\e×úl\90yÌ/øV¿Da¹î˪Z¿øú¬~±Oçú¥ñÈ~A\9f®?|gÏoö~pö\Ä+Åí\9b3 ÀesÑ>\fõ\8e¸v\e\1f\89ÖqËs\97!J1á W§\eÝ1GiÓ±L®Ð³E\9aIÉ#¶"9"Z\80>#ªÛh\87\1fZ\87\vÞ®\ 1\9e`ß&\80y\ 4\8fÔ¯ý&Uï3+¥ö\b\8bÝÚPtcôÕß\9fÐ\88m@hÄÕ$4ÂР \1a\95\86     \1a¾W74<O¯?\84ëN\87î\8f\96y¸S#Ð\8bý©%K\13\91û\81zg\ 6®¬\15Cý'Þ\7fV"Ë­+\f\9dO\ 6\ 4±}R$ÞÞàY\v e\15ëåÇ.FÎ\8fýú t\8bêÌ\ 5\9e¾t¨\8dèö­Æ?¦\1fô=|ÂèXÀp47ÑŪ\9a\9f;Õ¢>F\16Æ$A\8c2ñý4Hi{\17\90R|\8b\90\92+ec¬æÝ\90\12׺þ0ªM\1c¶§>ú\90K\1dÎg\v\9aºs=       ÚC\ 5\80­¶¸%\ 3\93ëÛ\87\ 6\1d\83(OV¶\1d
+ëõ.õÚèµgÐIe/¢ò\1dú\86¸Õ\19Ws«êKîW¡Uo\8cd_Ì\121+Ï#\ 2ß±Ge\13\8aÍÅÕ
+ò.peW\96Ìr\1d<\fádÞØÃDi\v\94.\13\8d*]¦N\0ã»Ò\ eÆcå\ eã\ 3þöàXC_\1fº[¥°|K´\ 6's[p\97ê°Â\fåâCȦÈZ×bÆúJ%³\19EÄ.\1d#\8bÊf)Y-:\1aV©ni¦ÜfD±\\7fº:|Z,3\97Õ¸÷a²\f\8fK׫¼*õû½¤Ä0»¯ª^|¤p±8\f\r¼È\8bG\ 5\8a\83$uµ\84$Í|\15¦k\0/LÇ\1f\ f\ 2.ë-$\95Ñ\e$\ 1Øã\a?\9f\84¤{\rÏ 5w\9d³îùô²\11CX(ÖJªÏ¦bàRËñõ\eIãÝ[E©E¶%TuïÎ\94\8f"\87\97\ 6ú   \83\96\81d÷$Br»¬C Æ9\85øÝígØO
\ 4\\17 \86pÉ/ó\ 1\907æw$\ f\e\ 2\aZ\9bØ\ 6\11\ 5\eç\9cEt\ 2\92òo\8fG®&¾¤\MºG¹\1a%l3\f.?üê\84·ÞÊ\184\9d\8apQ\ 5¾º\96l\80\9cr\ fÐ\18Òz!ð\b\8c;´ê|\82\1aUCw\1aå¤\96ð¥\80\11ih2¾\12\85bæe\82ö­ÿÝ\8b\9b«\87\92\0\9cÄ\96
+x@d\ 3Äôà\ 1Ä\8e\18gð7\19Ò\e@ìµB\86\vñ­5¢\ 3ı4\ 4\88Åü\b\10K\1d\ 2\88UU\0\88è\13\0Äx´Ïð¼ÿÐîM\0ÜZ|\9coD S){o\14eú \90\ 5iÉ(+cLÖàYP\ fs\87NuÙGíò        qô\12wMdH\11L!¿zäÙÜQ\9a³\0\99´\85\fQ#ÃÁ\0ÈWÙÍ \r\0ª8\9b\ 2T        Ü\ 2\14æ|ç\e\80â?%\80\12\1c\1a Ä\9c\99!
+\ 1JÒ.\0%\17Ë\0EÍ$\80j8}\80\ 4 \98éç\a\a(n   ³>4\8aÊtʾÄN\91>³ã\8b¾#÷qo\81qÃI\84\16Ó× |úü\96¾\8bï¦`\16\16\9d\8d\9aGh»\ 1\87\0\93\0Ð`Q\ 1h¤aep]\80¦f=\80\96?!@ÛÂ\ 2 ýñ\11 ·\95\17À\01\ 209\94\ 3\98ÊÖ\ 1\18D\9b\ 2L\15¾gHj\0\83v¾E\80\0¦\86\ 6\19æ[\80©ë¹\1f¬æ ¢´\91lTdëhçy®é¿èòcxÁ\9eek\8d\96\ 2m\î\19M¿({\ 3§`B\94\rÖ«3\ 3 {\9c
+Ðoß\ 4\18lf\ 1\f¿±\ 1F¿»¿Ûtð>À,\9c\b`\8eñ\f`k¥\1dÀª­\eÀ\ en ÀÞÛ\18ÀUË
+ÀÑÙ§á\14u\rpjá\ 3\91\ 28·ï\0\»>Í\10\1e\81,\86üüðKÞn,#ª*Ð\87úo\92.\99Ü\egÒÛ\11\85©ý¢L\1d\ fa1_*ø\85²3êæÈ|Ú\ 2\98öÝùG\82\ 6\0»]\8fþà\7fU_r\ ep\9e·\ 3¸Õé\ 2pçâ\13౬SóFþ\9b\0\ 3ð\8b\89
+ð©à\ 3\ 2ôÞ\0B=\ 6\0\81\80`Ðn\86Ë\f\10ºê)ÃúóC\9aF\90\90¦â\86þ\ f~ò)kd\88{i*£³\fý$M\e@öÇ\r¥ü'µwJ¤Â|Å='¥­ü\ 4­\83þ\98!\ fû\ 1¹W÷¾Ä\80ÞÝ8\17\83Û\86Ê\877ë^\8doH@¯®Î\8bÛ_³Ñãzéæ\82Ï\ 5\9f\ 1Õ³_ôÕ3µ\ 6{§»%OO\ 1"Ä'v\8f\7f£µßõ/ÒW\11ÿ\9a\1aâÿÁ×^        Q2ôÚ\19ÞQfjs\97\86àüþ\94W1ðPwqñn$cä¶!bì\86ô\17ßTÙ£p­\8dvò¥óÙi\7f$Õsóìç\8f­35\7fvOAéÙ?±\9bR\94\84Ut~ü´ùýQ>{ÏÃ\8c\a\92÷Æ{ÞÚmäyç\87=<>t³÷\1eÞ\ féK\132;Ãå×D\17Í0!~\ fML³·%Õz~T§÷P·Ft7\8eÎòf]zÇkmh]/øØHÏ>è\82§ ¨AIÚÔÊIXqkÇ\8fcãG9±éÃ\8c\83zífF<Mug}\1aævß0Ýmmþ+­¿Á×\93xíWÁÌ«9ÌÊ«\0ûÐ+öB5þ/¤¯@ȾîtYKÓn·\9a\99è×\7fÏõùQ\12ùf\9dË\8dKÂå­óEªöN\ 1T\1c%\99'ÿ]ñ8Ê\87×ê \9e¯»=\1cÌ\8f;$\1a\9e·nnxß$j?ÝàË\ 1°öË\83Â\9aÚÆ\99\11h\8c.ÓÎ\9a\
+\97cÖF駺\0G\15g®~\9aál©\14¯3³Ð\86fðb[ÏpÂã\8d±ú&\8eý®?¤¯=N¦/vRÎ\90dö¦Iö|Í       ~C<©rº7âj"¬GÙg®÷¤Ý\86eÕmm
+77ø\ 2r×Ô\ 6ì­Ø}\1a,Ãz\1a-\8534[L2_l\ 1\ 6à7ûa>ã\90d\ eEµÛÌÌÕÒ\19\1c7ò±\r\99åéÞôñim»\14\1ad\8f/ÝñlìKØuLç:`tß\8d\8aQ0\18ü\ fÒ7Xû\1a\vÖÒW\9c¢\8fâð\ 5Ý6÷öw\14HÂúè|Рõ¹u\ 5 ·öµmiÅ\91'lñI·Ì"\ fl¥y\11Ýj3³s°âÍåÔ\8e«ô©7Ý?\1eÁ´Î?¢Iw\93\9fO\b»º\19û\a"\19ÓCû\19\ 5o/\17¾äi9\14÷¯ï.¼\10\18ÚÆH\81\91É(\7fY_\87º\ 2ç\87%\14\81\82Õ\11,üA³}ϧo\84ÂÓ\1cû©_Î\9c\ 2$c\98¿\1cô¦ºÝmñÙjCôÊ«eD\\93ù¼s}Í\9a\8dw1FK·ê\14Cnß\ 6=!¹'7î\8fs\8dè     æôh8«Øá»Xi\87Ñ\8aé\87¹
+3\1aMo­Ù(\eÒ6Ãyº:\ fKæã\154w%(¨8:6h¥\a¥\7f\94Ü°\8fíÁÄïq\1aàSÅ\ 6л­¨Ï\ fß4¸A\13y§ï^\87¾âv¾\9c\80\8b'°í²Öq5z\13Óe.\v\92\17Ùø:\8awÔsþíÉ\87ñ\80}>"¡ü\ 1C\19ýÀ#\15ÿÔ\86\8b)L\rá\ 2Â\aë\ 5Õ\b\10\98Ò\aYïµ\aµªÚùª\83ÇÇ èãüxâ\9fßçµOÙ¥sop`Þ=v8®x£÷\9bõ\84ÍÊëÊOnÓ\99\19\93gG\83Ãô\ f M÷ùÃݺÞ\89\93\18m+ÛÓ\98\80't\9cµ\80áxÚµzßÛL.EÊ\8bR\16\f\ fÎ\87K\ 3>\ 4\e\9fz\föC.×ϾÒb\9f\0Ūï»&Ñ»\9f\17x]ÑKo]Å\v\a\93¦\a@ûNw²ü\ 4Ý|\ 5\9ev4\87Út\8aÙdÕ6Ã=Ø.7\85ïDàn+·¦sàús§]*ß\9cúºúl\9d¬üã/.W<$\ eÍP/¯Æâú9sêÚvüläF\11p\ 3ÝÑ\1c6­¡9ot\a\aJ\1cõ½¢¹ôé\9b}ìq©{÷"Ñÿ~7\1e0\8d ®R\98V:óΪÞ)^Vd{å_ùvùq\95Ýí¨hºÕOÕuÚ\r.p°j0oyíÍ¡E
+øÛîOÜ\8aÍ(°l\r\8f·ÈâÃVÒ|\8býÛ\1f\8c\81Öµ\19]õï^ÜS4×\88Íí¼\80\16pÇxL\82Âc\1dBd/\18V.¡3h\9f\ ej\9fd§vo¸íw=i\14\85]esXuôÃéØn\9eO7wG]_.\1a<A§S*À\ e¶FÑV\ f\16¹çY{PW¾\89cÖÓk\9aÖ\88\9cv\9bïÁaÔ̼¦U3·²o¦ZY\15ÌÂ]c\8dÅ\90\1d\18\86\190\¸ü\vÇ\85U'V\93º\9c\9fÕiü\115\1aÞ2Øwk\99£þ&ìÞ3Õ¿·ñd´¤u\v\97\9cݶ´wÏuz\95±Ó       Ðeëüb\ e-J\92®ö VR+\85\8c\9c%\98\ 6Ôü\94{HSnõ03~Ƭ©\8eÎ\rc ä,Ã\98ò}}ShÇ:Ò9\1cµ=A\ 2\9asÝ~»§V\8b\97\9e\9ahÂ*Ãøô/ì\9då\16[\16+µü\94^%·\91yÆæýkõâ÷DöÐìª\8f\9bØÞ \8eè:/GwðØrì{×éÛìu4±ÄB¼jN\8cõ÷Р&¸Ù]L­z|\9aÐá\933Lì\ 3é\e\1fDt\9b®áÚ~Èr\9aËwt5\19Çm\95\0o¡r9H[Åo¯R\85Æy´ñøÖë
+¦É¬\11Älò_\1c\7fØROé\9b×9ß²`~\1c9ÝKp\18\9cãÞkÜõºÚ¶e´íÞHp\92\15H·hô.Yéçn4'\87´ÝÌãp`\16ixb\98C|¥oÞÔ^·ÇêE;\80êC«kÆG=\15ý¢J4\ 3D¹VößÒ,
+\1d\80r#xáV\83\8bz\81\1cåv\vYÜów\19p\8f\15\19h\1f,i\8aÛÓ\f÷ÿ°\ e7¥ê¬m\òQ\81 N\ 3RìM¼éL춷#RwN\9cÀÙ\ f&øvOKÜø|3߶\eÆJv-}«u»zu\15\ eµve6UO\83\12éå \»÷³B_ÓGã\11×Á\ 6\ f\11%ùµ41Y*û\9c\fl/¦¤Ô`OÊ'ÎL\9c\87ï\8b¨K\9d\92X\ 2\95¯g#\96òõq\86p\97a²ÿ\8bUc\7fFbÒ\9e\80¿ümÿ©È㮾*w\L¾©-\ 6ø0\16°¡ë¦ÎWi£\ 2\ 2¼\8eÖ«º\86\91uG%ÙzOé\87ô¨ñ\ 4¸¯\9fÖ\18Níµü.Ø{Y2ܳ\9cÃg/iz¹\16¤\ 2\ 3 âüIÓbI0\15aõÙ´\85æ\96\9aò;´wäw5¼À·\92·Ì·N§\11ß:7¶\19ÌÝ\1fì°î~Y<\8d+Sæ\11~è¡\83Í\ f½÷¨\16u*Ó\83Ûºi±bEÙ<nêC ¦ïrsLk'SF%ûCIa\16s³1\82\ fmùm_û²txER\8c\ 33©à\ 3+qAW\ f¢\91×\1ebiÞÏ      V)*     \95õãÛox§Z\96xô`·¸cû\12q\1dA=pØç\ e²çé\88gÏq?àp\90ØrØý\7f±¨\90½ÊDà»ù cy{/\1e§¡{\\f\1d{Ôt\1aÍ\82Ý ô\9d4­jX¢T¿-m 0Dcd0\9c\15UÎ=Z¶¤òÙX¿\18\ f\ 3\11\ 6£±°Þ\9f\96\82Õ\ 6öüî\¼òN\8f~ó5ª q\9d`Xçpîʳ½qÝb)Ù\1f2÷*´e\ 6\87Á\87\19\1c\r\86\19$ú×\1dd\ 6ËÓ*ÃkÃÜ\8bÅí\ f³£jTÆ Eç\ 6\94Æl»F0\19\8dÞ²d\87\95\r\vËc\1a^k"Ê`ò.É\1fì\8dÉ u£$HÏI¢±®\18Â\ 6!]\ 1        \94>¿çÚßB3|-òf\"M7\·ò8³\17\17HY¿\8eåYêÔD\99\80\8cX\86½ç\9b\89}ZxmÖÔg̦Ôg\ 2\93ÔgZñ©O¿?§\85ëaó\ f¶«u|^
+\950óM?~Úümöë \91\1d´ØyÅjB]HÒ\92Ê      S\ 2\0«È\13l\94ý\f\8eª"|êá\82M\8e9ÞU\17
+_\87\9e6×õJ\1eG\90ä\90½Üô\98¥Ùæ\8ay@Ñ\91       \96\87\aý*?st¸Ã*tÖ\8c¾\9a\r5IV\1a\95'\8b=rvë.H-\80\9e\19\12\9cÔÚ»\ e©u\94\199[ô×\7f1\1d\k\95\11r\r_½Ië¸v\93A½o}V·¦±ñ\13QõÙ9&OÚGX*"\16\11õM\89çë\ e^㺠     K±WÑ\92Xz;2\99Gk×f¸ã¹O¿ÂÒ\98\8eDrAK\80¾§¦JëBeSí\87\9c\eÇ\12©\97+\ 4±jé\r¢\89\1e:D9áfø¶»¿eS\9a\9bÍk\88åà[\eýºêø¶Á¯\88òD_\13e_ZMÄ\ 2X    º#ñé\15akáø£\97ß\9cíbó'\997^\84\87\89+¤W\12ª«Z\81ó\98\rÈ2ø\ 5axz_§ß\99\ 3EK\1dV¥¦\17Ù¢\14¿Ó¥
+\8dõ·¼!¹ÈßbR_\946dÉ`NDs£<\89\8a=\82ðÖáXÇÑ\ e&bí\8bçbX\1f\98ÔÏL÷\?³\¥~®\v­ú¹x\1c×Ï¥Ò\12ÃøÊ\1f\8có|\8aô\1f\ràÞ±\1føÜ~Ùóo®ºY\ e-C½Z\1a/O\15\1d\13Z\9a\ 3sÞôSøEõtnh\97¨ÂÚ®\92\ 6\15Rdé¾\17   Kû\18\ 4RB\1c|wVû¸ÓëDx\8d\8a\17Øñ~;`\9daå^?¿Ù\½7îUkwðøÝ\8e]\eÌy»ÆêÛ\bMaî\88\8e\12:\9a~\9aèhР     Ñçî¼ü\8b°Im\90lXé_\OÚL-\ 5Ó»úa+\18Ê0 yI\1fI8\8f­\9c
+ó\\ *>4rÄ\86*\7fÇ4Ü-\16ËXâÕëX\97ÔX\8cÈÜÙº¯Î\9au\1aJÚµû       \ ej\81ÇNk\1ci­Ñô\16\9fÑpð|£"Ç\96«\93¨GW\erÎDf3}\88hÚc\8f\14B4af \1aÁfï\95\aßT+D\ 3\1f\82s\85(uWi%i=kÝ\89¹\ 6Ñ\8eæ=kFC:Õ\ 5±ò\91Hv°S\11Z¾$%\12~\8b\ 4m>µG+\8bL^£9\82F    G¥rU¨N[u¥ª \r«\9a\7f\ 6ßT+d>Ú\8c\10]HgH    À÷\95ÕÔºW\9aʦP©Ô(¢Üê\ eÔ2Z)øða×_Ãm\97\ 4àv[Tà6\7féÃ\87\8e<\87\ f\86°øáWϼ}ô\8fG;·¥Ç\ 6\9a¾;Êóüù\153YÜ\8ab6Ð\92\14#²V\8d\U/\15¼~§¡Ú\13\98çª1®ä\90ÒA\82+\16¯T+\95·G\96\1d\97kÈI\83\8f\aÀ\86;íº\aã\98\16\96ÎïÙªÔ\e§§\12Õ\10\81â=?C\8b\83Eí[\9d\aJáA\a\1a\ 54\9a\1e^\90 NYhäv{ÐH»L¡ç\1cYBÏ!´ð\16o\14p\ 6ku×4\16űv!nÝ\ 6\18l\fa¿xHlðF\19j\1eö\bü\88]Ð:ó¢áj|\9c\16*\e\9aù.\16Ã]é\99/ÞÓ]©È\99ç*ôªä\88\f¼\0\85»\96\ 6\89\83¹\ 3\89A~\0\ 1\1c=-L^Ý]¡\11]\9e\85¼ÌÁù9¸dóÚ\pÀå{<\ 6Í     s\ 1Mÿ\8d\80æ\0h\81¦c\8eÀe¼üî[ˮɪSK£\97=qk;c?¾\8e\95WaíIeoÖä®W@¥c\84\14\b§Õ¡ë\ 1\98`(xãª\95Íg\ 5Ã\1eÆCE¾\16\ 3\85éu\Ì/Ð\18É\97\1a¸Æw\14ؼ¼E°ÒG¿k\ 4¹Ö\93qrè¨=\0\8eÆi\ e`Ûâ1C\1f\0°¸XÏ0Ó\0\ e\ 1,x\1f\0l¸(\ 2X'ÊÞëÒ\83\f~\f`f0w\1e\8a\94ZE\ fÚkýz4\96çY¼+`ñÆaÆó×·     \90v\91i`´ÑËüÇ×\85ªl\13\11\83Éùª
+½÷$\\88O¹R\1eî\9f+¹Ú¦W\ 5ð\83\8a\11\0þ8\v\0þ¬h\19t\a 
\0  ú"Cp\ 6\88b9\9f!$\0¢Ä~wHf×÷\18 àè\ 2\10\0_\ 6\88\Q\ 1ðÛ%\ 2ð;»É`\1cZR\87\7f\eG4sÖäÜ0\16\9dy<dCsÓ¥Ê~¾\85]o\92\81Æ\99¯TÙíR\1e¦¦\1a\r}Ö'¼ ¹^\1d´o\95êï6\9f\ 1\f\90ð\r\ 3Èr\89Î@ò\0\94\fÓ&@J@\17 \9bZ\ 4\90Þ~\ 3\90\ 6\90ãM   '\ 2\93áö\15À\871@Æ\99GFÎò5\80\f&\1a@\ eÕ\11@\8e\fä÷\10n\v®V>\7fò·ËÐ|ÅÓçó\94Öcp\88\9f\ f\¯&'-\a©\96b\ 3¦#°\ 1M;ö?:t'×&\ 1
+â      \80b\9bÔ?Pç"@9/\r \82º\ 5P3­\rPûÉà§Cß?S\80Ϋ;\80¦o)@+\ e\ 2ÐNIÌ0í\0´ÛX\ 2t\eþdH(\80\1eõ²a;¬D\0Ý\1d\1e2\ïFw\r\81Jþp¿\vgñudâCnE$K*®\8bks\84l·ÃïD\03ÁØ\86Tô£ç-ßW¾¢\ 1÷\8f\ e-W\eÿh¾?¬M\1d Ï\81\ 5Ðï¤\ 30x-\0\18A\8e\0¦\13/\ 1&ÁÎ\0Ë\1eó\0\e´\b\80\9d\17u\80=,\87\0{4¾kÒ@æ¥À\19Þ2À¾"\1f`ßÕE\ 6?ûOïåC}»PQÚÃu\80\vcîAµxý\84ñ}a\85ì¼rXJó\85.¤Þ\1c\aÜoîÍ\7fÌ9»Æ?\12ô\ 2jÿ\ 4ßßm~y¾¿¢\13ýQð\8fð\9b\0Gê[\80kNO\07\ 62\8fûí\95\0^¨Ò\0?J,\80_vÆ\0\7f"/\0ÿzW\0þ=W\0\ 1v\87\80P\ 6·\19\8c{\86Þ+MÅ\19ùG\84ü¿äÓA'MåÂ$Ck\9fáôüS¼!Ì7Ñ礤\13OÐj²\ f\14ïËzS¹\e'ϼmȶ}³nýö\r\19D½«\93FÁµ\16®Æ_I5\11¯\8b\v>}íÎ>T¾\9eî¦\ 2\9e\82J\9eMRǶ\93°\96\fÿÿõ\10R1À2tk\7fåÓ\f\1fñ?u&ÎÃ4\ 4Éou\9eç¤È'\ fuGÞïFB~nÖµ\96¿î\19\1c¾$\ 2R½à\13\ 4;_\1a8õ'Uö®³Ò)(Éj\92Zò7UVn\1d?®ã\1dåSoxPo\83x¿dwûÝF*¼¶{u@lÝbî[Nw[[aö\ f\9b¤Y²þâ?\ 6\19´Ê\7fäÓ=ó\9c\14ö\8d\87ºIìl\84\eÒKÇ×ZðY\9e/Òew
+ e\92\84åÉõøiM\9eGù8ù\8a)\87\19\1e\81\aÈ\8f\8a{ã1,ï¬w»ºÝËml[\9bµ©M·èñëKs¨¬©ÝÜZ\ 5µko\99zÄl)Ü.ïÅ'h \8b       7áþI\95\8d\öÏ«/Ò4´¿&\16s\7f\9a\0]Ì`W\9f \ 1 7ëÔ¯_:Y,~¦¦z#I\r¥y\9cTùöA=cþÎJ\8f\83­\vd±m·\10\17#^¬©Íx½
+ªãý\8a=,NË\10\96ÂùøÊB±\v¸\0\83û÷X·¹úú ³¥\fS3xÆʱ]ì9Ó½U\99O]dú\98\13\9a$íJå_HÓ¥ø51\ fü\a\920­Ç)È\17Ò£¼[æöpß.mk\93ßÉ\17ë\8b^'Ww«Î/Ãz±±øxec\ 1\ e\0k®¦\80;[\8a\8073\81â Þ(Å0¶\võxº7êËimCì&Ý*}\9aà\a;\1dûX?\1fÝ{«jÄ>\06\f\1e}&à,Cï«@\8d&\8dÅë\ f\1aùQúCöÏÎ\1ed¢A7»¶:\9f{ïÁ"\11Vðbg=ªñú¢N\17Ë´ÕÚ-&xë:W\1fÍ÷Ìx;Pl\83\ e2u\8bF}\924-j\82ï,nì×~ÕàÆTÒQ£\80è\98\11{\1d9aÈ\8cº¡ð\\a£\89p\9c\8cÀÉs5Ô
+¥$X\1aä30áAi°é\97¸\81­<ú\83*k¯úûtyî»ËÙ?¨\9bÁ)}©ËÊ­%{À\897øoF×~µ\83\16\eâ4ì­8x×YÈßÃZÌz-\98îãÚlÒíâ»±?\95oQpTßaxiäC a\97G\8d¹\8d\8eòºO\fµµÏ\f\8b½¥\14\98÷¥\1a\94\83\8b5°_÷vÿ`ÁA¿\8d\bßÀÃ?\ 5\9d\9dO¼â[ﺮ\15{\f2`¼Ç£Ùóxýºì¾ñzÒ\8d.Åã\1fH½×áQb8øôÜ\ 1ïݾ28.?\95S8/\1dFNÜ\8a\97Êô`úæø:j8\11O\9bA\98+¹ß|èQ\ 1ñwÃRÝ?\a\15)x\ eZq\ 4ô\8fÐ\14ê·\97Û\8a\7f&Nuß»¾¨Þ\8dyq=&\ 4dï)ÖM\8f\9fríî»\15\8cºÒq³èÄxzì¨\80 ´\17Ê\ 5o\97\92¸í®#fæ"\15ý»Fð»:»\1d¿ùá\8aË/ø°\9cDïÕK\ 1÷³*C\ 6ãû2µÂ\ fÿ\12C\19ôøQÁS\1a\81Uk¶\ 65 Ýïã\85þħðhÕ\eø«£÷|l¯\9eÀ\1fÒîx}ËuAäö]úîd³]¥\ 3a¹Z{qF©6,ó¢»\ 1=ÓEÜU×qN\8fЩ\8dÅM«\9b\16\10û2B,\9b\86Çãï6\8aµ\15Ø»Õ_\9cÂh
+o®ñó1o\ 6\8dõx\18\8c¾ûÖFsÃ6\ 3{Õä\a®r$ú\9dË\98ëÝÛ#Å\vå¸Õ\9d¸Ç~\17<½'\1dèö\´M­´w7«ÊÙÍü黳ß\91o§^£ÀV\92¨p\8b\10\9d\9a}\ 5Æ´M+kÉzÔ*¶Åuùïm\9a\110\9c\1885\ 1§\ f\99Óº­\9aù1\18\18sY^ü\81\ e\1f\8eÅD*­¤ëà>=O\1fË°\10ãÞàÈ\ 3ºß\1f½Ù\1e\9f\971O\1cÃd7¯~¸ö\8a\84\ 5ÁßM²ÎÁ¤úNýjLZÄS\9eÛYßÙÚô§\93XÃFçjñYomFú$×\94°\vlN{iÍTè\1acÌç\86jèú¢­¯ÖïPoúͽ^¡\9f\80¶+\9cD\r\9e\86v?\võH\¾>´z,ïg?ì°á®°0Fê},øJ\1cì>ûÎ÷p'Õ\93óc¦£ïöh»ÙuQ\17E\eDëôiðö­êêÖ\13ë:\16?\9eõ\9bcp\135sÚ~f*«ýÊ,4Ó\83¡ïÒß¹Q%\17~êÍ\17\91Ó+\91\ 6kN®\8bièî"ª\9d:l©ØÉ\1a(=i·T(\90\7f(T\95$\e·c¾Ó\18tÌI\ 6\8bõón\803\97\86o¡VÊMú\97a·íÉWò«Cw`\99¥ÜZÙDZçáµh\ f¨SÍ\12\8a[²)WN¢©²/ÃXDE×\80sU_·ÔúHG 1Ö\9c®¶ÒjD÷ vúݳ\8a3³Té\8d¶ B\99åjc°å\98\ 6Û
+49e¡¯\9f&\vY\8b\92>æí*}\9aYd5Aú-iR-G\92|(Oþ`R%¦+yUËM/¯Íå\97\14ís2át\96ó·ìÖÒ\ fÙ¢\16Õ\8a5Úë`Sö\94²       ©|Í\80M\89Ö\91\96ò\8dÖ4çé\99j"\f]\15Ï\ 2cåÒØ\8e\14j~\986îúcÙ`/ù½\9cúÄU\ eií-}æCX\9aèWB\ 27UY\9cù¾+jôg"BOç$,\97TEX®H+Ãv\94á1\11\96ÑéëÙü®Kè\ 6æ&\l\9f\ 27qÂ\1e \ 1­vÕ\1a\8b-\7f:Á­Ð:ÀM0Bs\86\89¾!\1d¹\9c+ZíqÆÔ,\9aà\14ß.4\1a÷CÅlp\18æÊé[ïË¢Ü\fe\0ôb©¡õ¿\9e\8d\94\8eâì\f<Ä"\85æ\85å½\89
+æì$\be\9d¶y{í\8føª\8f\1c2ÜK|µ\7f\ 3«\a|u0\1dóUg\18ý0ß<÷À\18\bëÇ\ 1qeGݹ¹µ\9d\93k        6·°¿Ë«Í|½]4Êèö£¹\93\ e \12º\ 1)tÏ©6¸ CÊákÀË\804V¤F¼hJyõÜ\16µäé\8b\14
++\92\99\vÍ\kÇoÕþ\85oAG\80¯\9e0\84;x\1eËÕo'\93=\ 5Ü7ç\96õ´ý\96õô {e\8c4Ö3É\ 1ë\89JôEøï>K8÷¯{ÿqø\ 4\9d¦Òn¶®'YøéÐÆ\8aä³ÞþñÞʵ]y6\86\14\92\97#\ e*IÓ&R\93ò;ê+Û\89zM\10\85UWÕ\84òÕ°ø\16c¸|KY\a<Z¸M¸C\82®³\11_9±§kûÅzÓ3Ì\92*I17(Ò\19Æ|ù\fã\85\eúIq9úIË
+ý¬\9e\13­\84\fÓ"£/¾Ç!ƧÍ$7j\ e§»^tÞ\fÚ¨\91y\vÃ\1dÄ\99óC¾¦W\8f7P¹ÎÉ´Á\93ë\9b\9c\83ö\80\86y±Äì\11¡"l0¾5I\18\1eU@\99k\1f\11\83Ã:¬Ã\9eqËg½Ï8bÉÉñ«Ù07¥p`\ 6¨ò¤\9f\9d\1eD\8fð\eNóWI¡Þým\8f\1a³Ü\92\92¡ôMÉ%P¢¤÷ K\8dùwH\8d±Ûè\8bá¯\94Ì\10íé\e/F\82¾\8bM*\86%\1d\13Öh\9e\ e¨êù\83ï\96ß\ 6ï½\9fR\fu®¢~µR¡²Ðr¼\ 3Û%®SµQö<\f¨lèÝ\88Ìm¼W\99\81\rÚ\f[­uéçA\1eÒ£á`F\vünG½?¹+5\9eÈy
\ fjd¼ÈI¤j´Ú$Dä¿C'±¸NRâë(\92\10bt2,\86$\ 4\8e\ 3R\95×ÃÉ\887s\83³[Yu\8d¢ØkÝ\82£ÖTá     ££·aµñl\e\80\14«\8b\87Xº²\17\80o\Ç\87²9a^Ì3÷R½Â°\16ýmÐtJ¹\1c-\ 4]\99úp3\93\9a\14ïmJ^C}
+´¨19£:kR½¯ÏÄ\92{\7f\bã-W    x¼\16ðM\83tp;?\9fàÈ¢qÃ\91¥Éàv\11wqëå\ 4¸u2\ 6ø¦Þ      Æ¹;øÝVÚg\89Ý¢\83\9e=\8aFª     WmZ=§:"\8fÇ, Â\84\9d#|a/röU\aõÙ\93\ e¥É\87úÄÛ"5qóÙÔy*Sä,\12ER\93\\9d,æÂ\16±\8c÷=Ât¡\88(×Ùï>iÜöÔ\ 3^%ã\14Ûß¡2æ\ 6\1d®\9e¼ÎV½;VÂzwR¾Ô»Ó:Uïö÷v=¹    A=ÙQ\83\1fBX\f\9e½\ f3\98»\9dã¶cɱ¡è{\8c¦~z¹¤Þñ\1cï¢Â7ç\96õ­ý\99N_\8d\ 35¹5®ä\1cÒ^dÑl\82\84y\1dV\88r\7f\85á[\15àð\16TmàÕ¥ØÄ\ e¦ÛÁÚÄrX?õ\93¸î±ð®N¤ê½v\r\1a\93\83\11\ fLt¨\95\86\19¶ßm>(_ÚâèPè6Ñ!~ñÑG\17\1c ÿ\8f­ólTT       ·ôo)%HÎY\90(fÅ,æ\9c0ëÿ\1f´ûÜsæÎ|yØ\r{7%BñÖbÕâî?Û½*¬Ý~\96øò-*W\83E\80\90\ 5b!OÃD\1eG\91\8cÖ\98[\ fE\9b.\12ÉÎÈ\aa9\0\9cV\9cÜþ\ 1½9Î\17\8cý\1e¬°ÍuSdÅhi0Wùî2í\a^f\94¾Ö¢ûXiHëëé\92z\97³   5¢Ý,\95^\ f<\95iX.9\11Î\1dÒ¾\96w$Üõ(ÒÞË>iϺ­t´2mÿÐ\91Éå¹N¡\8bï\13\8f\13+~)zZö\1dÙ\b\16¤_ }\9fÿdUù£>eð\8a
\8eÜ¡4Û±Rn|aTiø ûÝ       \r÷\81Q\9f\\8e¡F+E¦¬VÙ¤²ÒÐ''·S\8dtzh\97D<÷{Ý\10þª{ °ðùÆ×T@ãáþYÀÉz¥\85íðÌ
+«l\ e\b¶Ëll\9c\94ò\r\9c$\v­\1f"`ê\87ªÐqûÅ\19q-¹'oj\16\86ÂPÈ/Ã\15¡5Û7H\1eAÌKô\89ÁÏvÍ\bø\99\95\ 3õ\99ê\aÒ5Å+±\98p\ f\84\10\813\1d\1c_\1fç,^\1a¼U\9c\ 2¶Ï\98E¬:i71ÖÙ\ fs\8d\13¾Î       Íê\1d½\88/\1c\8dnU\ 3\95«Ï*rçZ3¤\9bXßÎ\ 6¹ã\9e\85ÜÁ¾\8aÊ"Ôú¡±¬\1f¶e\1d\87ºþfÑ\ f\9dv+2-»Ü\16\rº:"UåqC$\84#?üNí>ØÈF/t¾Õ;\91è0·ÃÓ\8eý\94kÆ«kN,\1c\9eè\15Î~Uu´}\90\bT©û<òà[*ÒKV6Ò»\10\15D\1f\17»ðÛ^Îá\11B%°¹è!p¦H)Ð$3(Aö\94\8f!XÛ^!»÷V!»^\ e¡ñ|ß\82Æý}TãjÖ*´gË\8eǵ\9d¯\19ÖÖwU+¿ª\97%­5ìÓ?É\(\85l\96½ä»ozè£wÒëö.8=É\1dÑ뺵E\8c\f[«Ö\1dÎ\86£O\8a\e
+M)\8c\86\9c½*AH-Ìg\17Ü$Èb­s#³\96¹oÉ\91     ïÍ-Øé\97\17¨|\8a\f`ÆÀ\ 1L»Û\ 1LEÝ\ 3¦ªÒ\80q\ f\ 5Àxt)\85Y/÷+Çy\10Zå¶+)\95²å45K?\96Ò\9bÜ`ÒçÄà~$¸fWFé\11ÝÎ\90~\ 1ÿöi8SlßÑÛ\80¸ ùÂö\fCÞö\9eÅ»á\ 3ìMþ Ø­\fRTs)\16\f`o\98\9aÂwRlk\80½\8bCÀAË\1dà`3ý½Ç\89\ 3ì3
+\0{b\ 6)ÎgÀ®úß׺\ 16.§«ãK\ 4Ø1Ú\ f§Â`î3Ór·ðYKå<¥²¶ÚãtMò\1a\1d\91çΠ   Ã\18M\8d \ 3~\8c\1c\91E{Lû\8d\80\8bò\84¼Þã\9e©dûwÀ\9d*/À½\16P\8aä+?\0>GÒ),\11ðÜÄ\ 4¼\ 1\17Sx-Àû\97\83Â)Å\ 5\ 2|±!\ 3>äË\80·Îé\86\ 1xEa\ 1¯²\95\14Ó\11à\99d^Ä\95ƹ\8bb×\ÖȪv\15\84¯\ e-;\92g Ìx¥3/\b\91È¥S`±3´$Ѿ¤cðdpF ÌnAàXÊ|\80@e\ 1\10d   I\11\92@(ôY \94\ e\12\10Ê\19\1d\b\ 1ÂxX\ 1Â\16ê\ 2áÚX¦ø|\95[ f»\18\10!^Oq®\ 3\11î­\80ðÔ\ 1\10QT\ 6Â+.\ 1á\1dÎR¬öÞ)),\v\13F\19\1aõ\96ÔRbÛ­\88Tu\18°½þÕ¦¼7oà|¾*£ÆyÏÁ®[f²¥-Lþ«C\e[\12\88õ\a\rÄA\86\ 1â\82æSØ_+rÛ\ 4âsã\ 2     \ 5!\90Ø|\13Hîb\ 4¤\9e´\ 5Òlõ\ 2ÒÜ \80tx\17\80tìE@z\95\ e@z\v¹\14·<\90>õ¯\a
\0\9e¤h\9f\9dþÞÝ\9a\9ejÚ®2\90\8aýAÄu\9a§\1a\8d\8c\89\10oL\r\a\1d*\83<ìE²\9e¥\873ù¯\ eíÔÒ\9f\eý¯à\9b¹ç\81L\ 2\13È\12j\ 1\ 5\9b\ 1¹Õ­\0y´kþI\9eP°Ê\f(Aæ\ 4\94Å\b\ 2ÊI\11\81\9aK?\88ÊMc \1a\95\e\ 6\aÔb®\98\aj\88®\80Ú*%\ 5÷\1d\9d\r±ÜÛ(\b:\9f  üç9b
+7ö[Ü\12µ¹Ù@ßÃ0\84}\7fçfêoÊüÛ¢P°ÿʽ?Û±w,ÿÅWøU\ edý¿ªïø\9c6âÊ-\81\ e@+¾\9e@[5q óÚ/êX7\9eu çû\v \17½\ fÐ[¢\9câU\ 5z\9cÞRôq6-¿ÇÆýÿ\92O\7føʧ&bý\132ðoLïòú\1cdßà\11£oô>%®ß9\85w¤òH/ëã[º®\85\87z\r¯°y%;\84s©<sþ\85\19på¤\ 1¸zÂ\8fõö9\82ÍÁéæ{ÓS\17ëm\8fÏÒé~4\ e:qø4 ÷\10\v¥Ö¿9\b\7fðÍFøÙGÓå?òéO9ýi¨?ùôg@6\82ç 3\8a\1e\8aïSü°ºù\87ÕáJFýäÂô:\8f¤þ\1e\80sb\rà³4\1d`§nzË<>\8b\11s\1c\10±xøT\ 6Êo7Ç\81±O»\98Â\1eiÇþÎ\7f,*Ûð³\8e6Uè8Z\1f}~¿æ×  ¶JÊ\8e\92\ e-÷ÿ\87´My,\ 5\ 5¥\10\90?ÚéÇ\ eø»³Ö¾qS×5Ç\16.;I+%õ\97Ü<K\13¶wR\17ìøð)CóC¶öZï\91Öi·óo§Ó6|Í\92M5Ó¾þ±Ê6\90\11X%Áè\7f¬²sfñ¬o¥\85\91\óóXÉ\ 5ólß\8e~\92êçµ\9b!ã64]Ø/n\1aÀ/á\7fáÿRN!ðÈzÃÌ5<\11Ù\84ïÏ\91\93\10\87\98tø½s²´\1dÖ1ìM\15\9a\9fÝÂ\95´:~-ñË.\99´\16\ 3vÑ^\18§ã`\1e\8b»x\9eí¬§³©\9a¬fÈ ÙM\ 3p;OÖöó>)!Tf¼\vdlÌl\ 2>nб9J\1aX}$]V\9bá­#¾RTàaWu \7fñG\87þ§©F¼{_*\17ew|º\95Ý\1e©ï¶\ef$ïW\11J]\97ê\16ÿ,\8c#\8dέ\v\9c\a-LýON\99¬\v9cBÎr\85q5\a»ñ1Ì\ 4q\83$*£¤\9a«\8f"Vü>\8d\1aÞ\9aÊpØ\15½ÙàÙ©m\aƳ\97ôãüòÝÏN2xÏEÒÛ\r²d£î¢\18\ 1ñ<§ø$ÿâ×Ä;\12¢\97\84ïm\97\87\18lvZ»µìb\87æÜ:ûßïfºÐ\8cá¤\94Qçã*bíãc\10^GI9|\ fou7;T\13\17\1d\fd\97\18\18÷\12Ó\8fõ\92зÞ\r¥7µ\1aFÏýÎô\¸qÐ\rÐc­³.>;\1dr\87\8dÛUVZGÇfå\1añ×ÝW\1dl%Ý\8eÕ\8atºÕ\92Þåq\8aÞü\87æmT\9b=²÷Å'\116íd?kJ\8b\95¼\15\82{³¦þS3ÇUèb\8d\92\ foÕS}0\10÷Ý~¬\9eƽi~\9f\16BãË®\eÀ\97ïkD;kÿrí\90ëË3\1dX¼A»Jç\90èXÏáQ\83ç\98V\12)RKº\9bFó6ëùM-·¬5\ 6\11è×?wyY\8fg\8b{\1d2J\m\86K¥ÚLXõk\1e¸\8ekèx\eÿpÙïÜï\13\8f\83}{\1c\97\8fá¥?-\9eù nnp}x_éÜàÅf¤~Ü\1eÉ=\94\1fY]¼t-w¨~&j³qf\105)zÖºÔ¸uK>sûfÏR\92¦\9e\8d¡k¾\e&\1aBõq±\82Õmqò}ammÖÙ*5O\83íêr©Wª\ 4QîTÊ\9dý¢BkÚ­¼\7fC\\99\v§aé,3½RóNöK-\88\1füð\13£7üQÝM×v.\1a©\9b\86Ûwº¶Ü]µ[Tg\8be±N¹\84±?¹ûõ\91[íÉÇjöNX±ñN\8fO#ã¨Ýº½0Fµ9nÍjÞ&\WWt¸¯\16\1fýKekô\1f\15:\8eAùPØ¡env£K纤\96Ä$tÃ\8e\85*LÄž_>\14\rAùN¾\b>\19Ü\v¬J5J\11uþ Ë\94ÚûE©ö\\8csÝUÜÎv\9a}Ôz\15:¬r\16#\19Ê\12ͧ(g\9a}\87E\e\16\8e\92\81\8b5\f\13òU\92\92½J¥\17T+\8c\1eEåú¨ûµó\94\92l7.Inw\16ÞØõ&T\9bëCñ)Þ®E£óy\a\1f\ 5Ö2`ý©85|ç\86\84ÞÂõ»^À>6\1evîdÝuÜ,¸¥2ÔHÁ¶]\8a\1f6Âäp\9dn\96à;¾\19f2X­SK¿Ã\96Nù|£p\8d°Úâ³\a5l_úTÉ\91\r\97\8fU\9b,%òX\923½|¨1C·ø<îËżpj\ 4ñøÞ  
+i¿âO\17èÔw\ 3vå-6ÂÞ\vÚ¥\9b»~´¿\ 3\ f·4¿\93Î\1e§d§z\89<û¤\1c\9bv\13q涰̼
+\97æ[/\Zíj¡-\r\9bÿbùÆë\97q\vîMz+cZ\89\94£\98oÀa\96­n.(Rárî»,L6\97\92ÜØ|OèâË\9e§u¦¿¥\82\96ü\99\92Ëûh\9fv½"¦\94<|m×Ý2eGξæõ\9dtD1vØ÷le7­ÍÁ\16Ón¦Ð®)pAáz\9cuÿ@\96¥\97ܪù¦\8e±ùVFwsøì|ok¦9Ì\85)ÌÆ¿X8°u\19\192=ê\1cö\85RÓ*\9cõ\1a\89,\98ò¹¶\81Ã\87\v\9eÅáÆ>\aã¾r÷g±øñ\8a5\1eq7g\8bvi«\92\96\96a\9fѾc7\97óïø¦p%Vé\11¹>¢\82ÒÍ\r¬Þ\8b\98XúÒÞ\98#¢|6Íë\ 1\98\99.Gå'îÐÈÃË{hÌ[¥\811\8f\98³á+¤\90b\15\18¾
+×ÿÅ\1c3Ôë`ò:\fÚR\vúȵÔJ}\13Pá3[Ì\163\97áÝ\9fû¹\93\17f·g·üZ=\1cn;\ 5v\8bÙå
+×Á\87\99¬dõ\1dÌ°\fDrÌQ \ 5¦\85;U3siEùI{>Ì#ðynÌ\17¹½á7\8aß\19\92\ 6&l1=\9cвN:m_Û¡PGÛ±»£V9¯9­\92\84^\8aUí/Ö\93ê\94\99\1eÏý Óï·\9e\9d}P+\91\96RºõY²h\9d¸\8cï÷Í«»½Í\ fN½ilmIU¿O
+\vj\9e¿[ýM\0\99\1fº\8a\9bV=bó\93¤+å\9dx\977\16ÐÑ1üÙ'40\1f«ékÞêêdäÇÚ®0ßhU8sÕ\98C\88¨ÇúAP\eyÓU\ 5°ï(ÉÄÝ*É´D+É\8cùZ{Óe½ö/ÆÉ0:ö(Äï5ãAϯ²,)\87\83Ñ\8b\b\90Ë\exdL\\1c~èï
+7û³²\ 6ØóhÆòó\9a\9fê·W\1eI\a½F\0á\84¾ö(V/q\ 5EÛµÜß{Ø«RÃÕ\98[\R\8fÓ¤©6<l 
+\9c¿T\92óä¬D1\99UäB\9d\95ïô×;}¨µd­\81¯em(\90²Ö<\16d­¥Vÿ"ä+q·£í;'@v\1anÛtË\17üøµ%\14ãÛ\ 6÷Ö\8fåÇ9N¯Iá6á·V\9e_,Íì½»5\16«ÆÉÀÉî]§Øè£U\9bCDcÅ\r©6&\17^¹ wE¹ ¬¥D'7PäfT\93ïæ±'÷²ØLÖváQzU·ßËS\1ar\12-åßsS\ 2±Ø\10Ç\85ÍB\1cÛû\9c8v"S\1c»Ù\8a\ 4ºÈ\1f\8c\80ñÚ¶£û1ªã}Â)ÝË\v1p_mì\8f\ e-\9bõ£\95¯?7ù\19T]\18ÁJ^êTWØÿ\ eÚKNÔfFx(\97\8a\9dUÚL\r\93ï\8d&-÷\84±(ëà\9e\97^\13Ô\95\86\8e\\96L¦Ñ\96Àq\11\8bã!¹\13m³ò\14áÌ\8d\10f»Ð\10¼êµ*xµöLÈñ5Xð\1an^ð\82õ7\ 4(]îÊ?\ffòx\1diïA«F\9d\1fv8ôK¼_\14½\9cÓ,\14ßÖ«â\1có3y°2ð³<O\8fÿeª6\83ËFi\977{ùþ¸_e=\ fÞÒ\ep\88d\96uRÊÐE^\1c\1fÚßâV´û{[\84ó \14æ\80m\bÞ¦:\14råõ\8a_1Ì\8d/>c\8c'\86¤ÊmÍ~\89ÛZú\98«@\1cà¶6®q[¥\1a¤\88B\9e(wÃ~\91ó\96-p+4*§Û¼P\1c¯\v¼G«Ü7hÆVtúi\8e\aÒÑ rîR«MÁL\15\eñüPÚKéí7·\92\99\8c\13q"/\9f¢}¿f\85¹\9fÁ\ 4\1fãX!·6e~\155M>\94g>OÜï5n;\97û\Åo,8\ 6K\12ö°É\7f§`±õòNbyÕ)2ççcÈ\9c_§'s>Ïd\96çó\ 1Ëcù"[÷\83°»¿åæ\8dÙ\8bª\97Û§Ð\f¼\19Ê:gã\8dXoóñÈ{\eì¨Õ³ÂRIGéSÙ\80õ\91dñÊTD î\9bg#ø5ýÀ¯Îö\95\ f\ fOZs\84«L·$ÇÔ2\ 2{ä8\9d­\9fm\87åG½2\93X§6\13\84\91f\8d#}ó^\19ºË7\ 4Z½dÓãs\99ô©g§|¥Õ]M¢ÕéÝ¥»\10õí:éÎ\1d\r:â`5­\13íe¥¤_¥¼O,O\8c}\8dÏ\88\95Ù^\9f\ 6q\7f\1eU\89E\97r\7f3\9e\89\93\ f1\12üÛuÄ\93Ëë\82«\8aï-{ìfNlÃU\9eL²42LT\fs\8c\9cÖNôízø>X¡»Ý\8c\99ÖJb@½Ðf\93\1a,÷#*\1f
+;
+\90\837\19ï)\86,Ôb\9b\84x©MBBîDB"Á\93\85âÐ&\væÒ'ãá)\88\fØ\8a«u¿V.Nú7Ý=l\87t¡?\eÁùùqòø^7ÇÜK|-Y\8fæL\b
\98«\ eû\ 3Vèô§ô=¨/é\1eÞßQ¯öêB\r\95ë\8bÊ?\11\88\ 2\ 3\89 ÇAÈ\936>ÒIhsv\89t S%<µÜ'Ðç~\85/\87Ú\ 3/\9a\9b¯Ê\81\13Ù¼\89mÒî\f+ë­-¶éOhlÓàL\1c_\14½\1f~\91æi\85\98+\ 6X!\1d¯H\ 3\8f²¬U\98Vµ õP\93Öú$\83\f´\11Q£¹à©\1e<a.\93ú\90z§Ç\83\1c?\98oeCÂ>¿"æ\98u rQå\86¯äþ\a/Þ×\b\9e\14¶õy        «`¾\89ÑëQ1w(½£\\9d6§9î°IÐsCGÑ\96pÒPñ\1aT\91k\97\"×\1a\83£âl¥£ÍGÎýá\1fK|\18\9bsß«¦\1dwá¹Q(\13¹\19\90^-×\9fJw7=\8b3åµåË\85â\92m®23Z_ø#Ò¡>}<líb\8c©®ç¹#{\çøáó\88&\16vC£¬\ 6R4r¨4]|\8b[äVËjH\97S]D=wêð³õ\18Á\ 3Ù;ÀÆý\91Þ>\1e=\ 5ú4ð\12\14\v\8b \14\13\v\búX¡\ 2\e£«\v\e­«WI\9eh;X\1c\1d×¹dqÙ\8a\1f\ 4\95Ç]\15V/¾õ\94Á©û½{
\ 5t`Ï5oM÷;ç99\ 5á\ 4/ånÃ\£Zí!w±:\81_\95Æ\12\1e2Ým\8ac\ 2çOÙ\17\f\9a,\ 4\8dE\97\84
+×®\bA\9dÄÊÎ4¦\94u_õnfi\9eW\99bÖ~fðéûûi@émÛ\80\1a½: \94Ü. ´\19P`C\90Z
+«P\1aR½¦O\8dIÇîi\90bÎü\1c­s\ 4\ 2+zd¼\7f\929W\8f_'ú\19\9a[r:8¯ð´Â\9aç\9aÒg\82Ü_q\f\9b\93è{
+@ð ºÊ¬ly\9d!æÂ\ elýB\ 2*Xõ   èõ\f\ 6ô\ 5gR\94´\14I\0è«ÕNq^\ 2úVN\7fåÎq\80Þo<@Ï\83\17Ò\ 5ÐCF\0t³b¦\98ûE/\14¿z\9aÛì=\9d\82\19\\14cK\9eiµ£fÑ\9fBÆW\99Á\93éÎ^\17
+êzG|³yìrÍOe\8dô=d\ 1[Åã<»`â%Ø\95Ý5`\ eùm\8aê     0\8fÅ\1d0O\90\ 1,\92ÇSüÞY\fX\16±R\84å\14×>`¹â\16°<\fR,%À
+¥t\ 3\81M\0\9bÙ>\0\9bݪ\80¹+Å\14Í\86_a3uG9'®é+KUKÐ-+\17°\ f.P¡\ 6³
+>\ 6\94\1d\83o/\80o\87µkNª?NH\1eê\1c`(çì³xå¹\ 1쥱\ 4\1c8\1e\ 1G`·\14ü\13pb\90\ 1\9c\19ç\0Wü°\80k\19j\8a\91\v¸\98h¤h\8f\ 17ÆO)f\bà&®\ 6¸)ù\r\ 1\ 2\w»\ 2\95þy]Q\0×@Óßo\ 4C\8f\ f\1e\8d\82µÛù\ 6ó\19êÊ0s\10E\ 2ÎÒìµêâ?ë6¾«å@N®´_\88    Ä\aäÕηLù\16&\80G\8d\14Zx\ 5¼Ûú\852ðîü\93~\11\1f\ 4ð=\ 6\aüÌa\0¿ïK\80¿?L Ðv\b\ 4\ 1\82ª-\80à$w ¸%\ 2\b\1ei¥8§\eüá\11\by\1d\ 5\82 \8c\14ë\b\b\924w4ûÜ2ñáú\9b\ f­)\85\93-ùlFç\12C\95èB±Á\12Tr!sJKÏ!\16ò@ L©dA\83¼¾ÿêÐi\7f\f\84u\88þERÏ\ 1á3!\81(d\ 4 æ\15\r\88A1ý|\8d±\aÄ%þSnÅW4\ 4R\ eÛ\ 1\89\e}\80Ä«\\8a«\a¤ül\ 4$³q\a\92ÄÒ)\8e\ e\90\95â½´fɼ­\9f'IMÉÖ¡¢À\16\15\871\v\95<±­,\94\0ñH\81\1c²\10^Tè\7fuhÿL\ 1q\91c\81ÄØâ_Í÷\87J[\ 1Rg¨þ\95\80oÐ?±\13RT\ 3r\98t\80\1c[3 \7f®g \b\1d\14(¦¨\ 2¥x¯\ 2%\1cÌ\81\125~QÇJ[UR\Ë@©Ø\83\14\9b
+]\87êàEvÄMRh°ýN³La³­\8fE'¤\80\8cû\8d<Dô ío\9b~\8dø×süË;þ
\7fTßÜà\97\ fý\1fõ÷\e5ü7e¸?\0j\a^\0õZ<\0M|½ÿ¾G.Î;@Ûd»@»¬\ e@ϤGB'\8b6Ð)¼\ 3ty°Lñ9ÿ£\9d\ 6ä\ f\7fô´\9fðû7dà\9f\98^nöËoxÄhív\9f\12å÷\1d©´à\eÖ¨`×ðR¡®d»Ã_*\8f\96\94\1c\8dº\9aÔ?\9dü9)tìs\ 4M\82ÓÍ\9b\94OêjÞ8\ eÈíWî>\1a{xz\889e\7fȶz\9f\7f^\1d¶,ý\e\80ð'\ fá\8b´w¬Uÿ\91OYø\1füZ¾\96\9f\83\fæ<¬\ 5Rº;\e&ºù\ait%#æë~¸0=r\93ð#ìx\96¦ÙËI]ÜîÇ\ 1~{\1f>åKæ`\1dNð![¿cûô\8a¡v\vùÎmÃ÷LØì¬\8d¶a¦{kÝ@_ÅU\12\95´+M\96]\8e|-Õó\82[<#ÒZ\fäì×5ô[þÁwõÿ\92O\7fÚô}\9a»\10×ðÔd\92£êIç$_6O7»\19\1c\aX¹zÈÖ\94æn!\11\9dmø|ô7Up\18­\8föv²æçÛÅ*ÂVßykË[i¾[v©íiñ¬mÿÇ-{\83æÙî\a\9f9o\8c\9b.,U\9fbÓz0Y{¹Á\84\íïã]IÇÇUʤþ\17þ\97vzÃ*÷ïSÜsbp×£±ì_÷ÎÑymÃ\a\vm\98\18Ç×ü\8câ\96·\10\92\17Ï*0æ\9fƽ0·.wo6Uîá\fé_*SÿsªO±ø\1eMJн7Þy÷Ѹ\8a¡óøXÂ71¿\17Σ\88Ë?\7f\92\f\ f»Ò\9e\e<{\82=0ÞÏQÿ\13WNÿqÉþ\8fUöO+û\9fÛç\1a\1e\9b\87S7«NvXD\rW\89\16Ïr.\9e[çë|æÜÞû©ÿÎ\'k\8bø\8eÖÆ;\17\83ãc1\8bÅü6K\8d\92
\8f¤#&\r»\ 2¢\ eÕ\vc\ e\ 6
+\99îÿ!\ 5ýØP+}ë\13F½i¡>è!³Ñ¼\eä¶ûκ\ 4?;%ªB´wuÚmWùM¿Í\ØutlS__çoùÃïX^ÉFq\7f4\16Çá\86\19Ò¥Å\80"\9déB­:ã\9dMyq\ 3Ã+£\88bÛÃ.'\8c\ 6ÏV~ÑÿtµmßzåO½©Y¸õÜLðê.\9c\e 5¤³\ eÊßÉ~\9d\12Þ¤Ú»r\9boWé±\12\1dëK3â\93\93ßJÚx½%=´~³kT\17\8dg¼N\1ayXÃê\9f\ 5æÖã ÞJ\7f:\ fÿÅ\r\9b\\92ã`\17¦ç×\96¨Ì\³¡\8fw\ 5ïÛu\8e\92\10f\aÏÆ\84ïÇJGéM\8d\e@\9d ³ö&µ\ e¹ÚvÚUò0\8c\8eÕó4âOçe+i>¶-éz=4oÝÌ¥©>ß÷Æs\98û4ò\19\12®Ç\ e\vH(Ö¦A'_C6«ïÄ\98ê¢\92kU±£7­\94\84ý¥B^Ç|\85¼Ény×­VÿŹm×\92õ\19b\a³\9c®\ 6£Ë})\ fÀsNöÜý1=@R\ 3î\90K\ 1\89\8e\15\8al%\rVhÞÚ\82ÞT\1fÚ÷õT\8dA:\14«\7fÖ¥Z½ 7¢zö>è×\½;ª!ïé¬\1a¤G \8a\93É¡RªÞÒ¾Lg>åê(\9f+³á\80/5vÇ|xÑ\99R\18½[½â½\94Û\17{J\86*öìq¡¨3P%x\1dîßhýßò\0O¯ÇEæéµG×\8b[èÃ/\98ïЫ\ 4\89Ä!öjµÛ\8bGK\9e\8d\83úX¯\11µ\99Õä«ËjO«â¯¥])\9b\9b BgîÕr͹7Ë\1c\8bvKÍ&:,\89"û5*\87í\8e°
+\15µp(ö\16Õ[Q\ f\96Ù`¸yQA\86\11T\7fü\1c\ 4>\9c\7f¶½y¦µõ¼]\8bòr=ÂrWº\1eü\8bu\12`\9bI\95\9b7\ 6ÙÕÝl\1fë\15¦ù,ºP}ò©~K\8eÚ¼{9Ö¼Óò\]^\87·Jy1\ 2åÚe\85\95\9a\8f\15\13^\8d³\1c*ëw¾ø(\13nQ?\10Åà]\17«\81\99\88Í \13\99\81¼\91\ fÏÚ\vÏÏ\8d÷îªu¹»¡,"ζWæ\9c\8awù¾ÖÍ>$ùº]\8f\92¹]\1f\7fr6ï´ôBÂ\1c¼\7f±\ 4¹êbÔ=\91\95.ÕôôæK{\92uÔ¸g*»3t-7To_Jøë²$QçC¨r\87KÑ°\1e\9fÀr\9f\88?9c_;\8fï´TÑ\9bß\fÍó»¾å®Ñ\8aç\86ËNÉÙ\11ýºSÙÎÛöQ=\8fìú+·,$¦x,DDïcÝ:\ fÒêj¶niè©l>WÁØ\1cDAÖÌÛ\98\92¢âþ\8bï³µ"
\ 3\9b^\94Ú"\ 2«õY'Â+û^ãSj3äø*¼·E\90\vçA!«®|\17\95ö^@H\17wÝñ?.ùl N5\1f\91ö1í)íFy§\16\92Ã._\88ê7§ \vHhuÇÌ·\80²4Ûè\98\83Celæë«m~\fà{¾0\ esy¨|\95\8d\19c\a\86û|\r\ft\98¼\ft5\15\rtÍ8\7f\11cö¤Ö\1e\8e{ÅØ-¶ôh"×\88\86\8b\97®i\91U4ËÊÉ\9f\8d:ßû\8dWD\9e\13w\83O'Î\1e\1e\13\1fïm!Z_\vmèö±î>@¬\1eF\91æ«ÄræP.(&è¹ùüX¯:ùÂ{\10\1a³pÝ0<òÓ7лµÔ\8bzë¬\13X\16Ò6I]ÐÊÑû{Ð4Únw5Ú\89îê\ 1Õ¸\14ë\82\89ýCÜþ\88ÃÎÁCýÆÄ\v¥J]As¡þ¼?ý¹\919z\84«.\9dÚ8\1eÛ§¹6(´KòÌêÕØ\95ù:Ë\aÓ´\82{~<-}o\ 4yÛí!Æl9$\f¯yâõåõ$ëÅ.Èë\84F¹Ú\16u+ZyÙm«\añ8Qk7fÿ{¢¯\9ck\f«´¸~A\11?b¤H\80:+R\ 6bRDV\8anºáÚ°\86ïéõûÄ£Ý*\9e¼:F\92Béú^"Ád3~x¡µ=8u1»(\ýÂÈzX¯\9e9BOq~Blfy¸rÚ\18Þñ~ÒW"¸ëÄ\84\0ÚÖQP­\82ؤz\b<N­ãMEå.KK9·ïß®Si9rS\91\98h$w\1a»\8d¬\9aÆKzf\16¤ô$\1dSêï\1eMɨ\8dw\92Q\1f\92Rÿ¨åS\14¬\1f\ 6\93a¿\e©\95¡[#\9d'\1f>­!âûsïæ\1cÙÖÞ\96\94ÝÜê\97¨¯?ÍÌ\9cz\9d<|­õ\8dܳ<ÖIà͵J¹¹S\ f\87^¢òüð\91\ eÇV@iEWT¾Þ\1f¤Ü\99Ó\82¬ú¦.=ù¶+õ\93ME2ÆTOü\94£\95\18Ó\9f»h=«¸\98\1d|t1;ì\7fcA\85©e¯\85iÁNW\8fAºz\8c\9b?ô¿\81¹ÍO`Û\95c°à\8a±fC^ ÓovRtvÖÓ\8fçf\96Ý÷\8dE¦ÜÑÃ\ 5ÝÖ\982<Pë\ax¬´>¹¥"ÅÊAîBú7HSzzúC\1aäÂ\8cd\9cG\98øim\191.À\8aX\80\94\82\98Ý7K´¶o\v®!Ï\ 5ä\13_øÅFÈ¥X«|P±*<ÎÂ\v>¨qX\8aYºÎÛ\18übvÉ÷È\ 1\195¦vîÛ§\95#»Ä\ 4Ó¡\ 2¹Õ\12w+t+ÌÖ\8c\99±\10{=\9d\91z\8c\r%Òç]ù¶Ú\8e¤çn>\95òìv-~N\8f£X\10ßW\11Êr\1fa:µ\10Á­¶(\ 1eç"¿8=ò|0\12¿§\0\8f[µ&·!ï\13®´/\9c¸Ò\ 3 \1cÕ¯Êì>\9f\rS\1cfìÞ<#ìÞ*Ê\1cÕ\1a\1a?t\8eñ­õ³Ä\97º}\8dö\83ö;ã\bîõb\r\8eÈ6ïÖä©N!vWmDׯó^\91½V]zIa$\ 1Íé\89\85¡\1f\v3¢¾\10ÜíhÇ/\99É\99\ f\9e×'\8f\ f\91,·1%\9c+\13\15\9e£¶#\8dÝW®.[Ó\94:˾z#æ´Â\ fL3lg\98f\89\15\18\91Z\ 4ôåà\7fÃ\81\19\91é@\8cÈÒ"Ót=ý\87¶¬7êµÒh\92\ fó1Jy¥Ã\16Øòr{1ÇX²1\8235U\e\17¢#ß½QS\1a¦'¼h£X]ðD¦Ë/;ä\80'\10\95\ 3cÍÑxøµ\8f²ûËèÎÖÚ;ÀrÊ\13\bÏ0Í\85¯0b0²é«\98©Òí«Ù§\95ÎrC=4ùMõÑ\13Gé+×¥ô53¤ô1ý¡úàÌS\ f\91Ö~h½¬|­rr\1d½\bMOßa\94Ë&íOAÏô\93¼GÅk\9dºÞ'\8a\ 2½;\92iU\9a\925~\ 5ÖenK'\11{0\8e=\96\8b\8f#æ\Æ\96\8cx wô5\1d\1dÞ\7fÒÊg\0Q\8fxGP};+P\ 6m\99äûÐÿ\ eØÉQýÝ!-Á[\92\99ËåAL&5\9a\98L)\9bpÜ]\8fpôÃ\8b\98ô[,\999\9cÕ\1f\9a6
+*åv\91Ñüå°\8d;¢\þX\19Ä?\eÅZ´VÏÈf"½õkW´wa\8b_å?ßË\93£\1fÝ2sN¢\ 6}\83¢\ e­z\8d>Õ?\ f&\94ÑZ¯È\8ft;\90£;v#­Y\1e\90\9a#¦¹)K8«§F \91áã\vyÔÂýGn\86cýö\15[ç    \1c+\81q\1e#'\85\b#§á·äÀÂ;Iakª"§\e;J½Xn\87á\9b>*^ybc\85\87®¼ós\9c?ét«°R®Áx"eVç\9eàk~ÄUÚ·:\93ð\8d
+õì±e2N\87ldöÆv\bWc\a\ 4\8a\ 6s|±l|Ku<(NÏ8N\1c\1fØú\86CX©\9b'1J\8b¤Üîu,äª+µ\86\9eÈÎ\b\89S\8am\ e\15|EE.ؽ\8e\\88l\82
\ 2G\e-Fú¡ZKh¿h'\rÉ97\88\9c5²à_v÷ª\8c\9d4>ûÍÁ»\f§¢Óz\fx²iµYþqkÒ\9a\1cTÉø\8d\97ñ¥zªaeaÓÊíÛËN®¦\F9\ eÁ\17èi!ïÐfà&¨\88wßÈe³G\91v\87âR4ò\88¢&ßç7ðýeôáÞð°\87\87\90S ×}X\81^\8fÁ\ eN\vW\14Ö\91\1d\ f÷ܬ\î¸[×\ f=V°;i\87m:\95ëK¯ô\9e'Uªj\e)¦Û3\ 1Û\9d\87l£#uèîg×"Ç\9eû-9\88\\16T0:è\95PñP®#\1d£ÙF\94\ f?âå\ 4î\97^kØ ñc\8aà      ½\ fC\18\1aÕ/4d       ¬
+e.\r?ë(Ç(\v?­ef>¸¾2¾è3`Õ¹:\99Ün3ÊøÔîk\1fÍø0\8b§\b¸ÐêX\ 5÷(Þyëã\8d\90\98<µFîv\96\aE|#¢|yÎU_\87\98¾/ø\1e\95¡Öm"×*41úy¯¡\92]+ÃO¿Ö\80âR­\93\9dÖì^Öå\8a£Ì¢UþJª\99@êm2Øms\ 6ë\1ex\ 1òM#)\9a\1c ?ÀJQ­\ 1
+`Ó\14ÛÇwv+\ 3È\eí\ 1rw\1a\ 2r¶{\ 3\91)\1aB\80%OÓ¾-Ú¬9mÕ\11\83Âçoå\9e]|§`IP\ 5ü\91Ì\99\9dP\16\90\86\ 4Æ­{\18Ó-´Q\19Ü\9bð`Þ«Ccl\18e\96\9e×\ 5e\92è\ 2ê&\ eS\14g)\86\e@g_        !í\93b\88\ 3\1a\86¤\14%'ÅçÛC\ 3\1aé,\ 1\8d*o@ç2b\8aY P\9f mþÅ\85R<E@m\19Ãckq¾0\ 4µ?Ñ,Z\13n½eS[_ÿèå-¯¸¡>êyA\ 4´1ÁXë8BåeÐ\87\87\1d¶÷Ó¡\8dS'\13\ e Ïå> ß³I\8aý\1c0\18´\ 1\f¯\9d\0ct\9f).0`\ 2\8dI\11ë\80)\92a\8a~\ f0¡¸Kq\85\0S\1aj\80±óuÀ(\9f%`Ô$ý\v¶ÿ³(2ì;pÚa5o\8dÛMÁ Ù\10û)^¢o®\1f\1cß\ 6g:/y{b)\7\18\87Y\väá>g°E\f&ÙùÓ\1d\83]á5\ 4\1a\ 1\96fg)
+kÀ*Ñ\ 1°ö"\ 1lùùøéÐ\1d!\ 3ØI\ 3\aìö&\ 2öf\15þ¸\90\1e§H\8f9ûhc\80}\16Ò\r\vØÓ*ý?έtÝÚsSì\e¶>\rÌüÊ0\ 5õzµ\bÉÙ\97 \9eUw\1fúÕÇ¿}\1a±BË  ÆÃï#2\80*;8{\96¶YÜIÒ\16mJ\vÀ   \8b\rà\82d\a¸Æs\ f¸!v\ 2ÜÒúZ\91[\9f?Vd\9eËâ\80×\r\ eðÞH\a|\9f\b\0?\1fv\0¿ \96)\16Ï\9f\fXÀ¯\98tÛê=\ 1|<¼\ 3¾­Ó\80ï\07EÜûãßnPº,ÇG\87\11¨÷\0gúø\ 5&ýH\ 1\98\90é=\91! nЬw¸þW\87vë7ÀOç\7fvs;¿\81\90}üãB.0Y \94\9c\1c\10¢>\r\84õU\ 4Â\85Ð\80\88\97\1d æïµ\7f\12'>\a ¶º\10\10cU\ 6â8\93~\9dãý
+\88\93v\ 6\88S-]×Ý\15\81Ø3¾ê`\9erdGÕ9Ï\10\92Ø\9b\94p\94[\11(ì4kbÈ»\9aA`\ 4\9fÃ\19fM~­ÐXæ¯\ eý¯àûó\1cÿp¤9 >Eþ¯Öú\8b\9d¨,¿¶\ 4 u!\ fH»B\ 5Èäº\ 3ä\92µ\0rt½\ 1yÜ"\80¼U¬\14¯6\90o»#\90ï\83tÝÃH×=Î\r ?õX»6\82PF¡Ë\vöÙ¤m\8fÑðà*¡ÆjÉÂ([d¾\9d\r{8\10\7f\9bõmÌ\9f&LfÚ_³ñOóý7lâ_õ÷ߨa/©\0enu\81J\1ff@íØÇ¿ï\91#giQV¨~å\a \95¥)Ð:ð+Å9]=\1dV\806cG@ëU×ÿxc\7fÆÓßÌý\9f«w§<\9f&ï¦è7\9eO+3z\1aSnõÈ\16\89ÃmA¿\93ë\9a\7f<®dôø\*÷ç×p\99\1cõg.áG7â\9c\14²ìY\9a~\84ÓÍÃÔ\93ºÂòÇgÈ;Gc§\86\87\98µêû©h}ß\1fÖ\9aî°Áö´-eZôfçf
+\9b\97ÿ\93\88ð}\89ØòV\ f\9dÿä\vü´I4ó3Êþ\fÈ\ fkÞÐîH©jß°ZTº\92­A+9jQÿ\1ce\82øÔEÜùq\80k«ô¦Àn\ fÙ:{Ü;        \95ì\162~Û®uðÜ\92Ã×gSͼ¡õÑÍ|õ´5¿\84éUDÐÒ²ËÐÆâÙ0ýÅ@\98EóOGÛέ\17ÈͳÃ\922\9b\9aî_¸\19M\9e!\13Vúß.Yk¶Ì^ÃS.\93Ô\1f+øt+ô\89ã ×ù&õ\1d>á\ß;§Va\e>%wÃ\8c\91`ÍÏ>å\95´Jj\7f¬²Ïê±³\18°·ÁüÓLâ¹uMfólç³\9e9ÏÏ~º0\91Ë\14\9b\90¯I    Ñ\90ñ.\bèq\15_ëñ±"Ucþ\94Ùþd»f\v\8c"q\82\8e¤k\aù\83ï?ÿmåÝY±×\84ï\9d×Gc©nvXTZ®\8f\16ºYE(t^v        ô¹\180\ 44·.\19læÜßôÔ\7f\9f¹ÉÚ:K\13rzÖþHª\ fsÌ,¯v|,¾ý\98ß¾K\7fܲÒ)\17\r»"=\18ªW{>\18¨å]ÿ3\18Þú\ 5p\86zSGä{.\8aÖº\8bâ`Ñ]\84Øå?.Ùï?ÿmâW\87þF!ì\16<h­¤ù¶2\8f9©2]¨ImR\ 2»ö¸
+\1fGñÑÿ,c~\83\1d\ 1¹\fÕóó>xF8\18\18w\14êÇ:\84ö­7Nô³#\96I\v Vè!SMí\ 6¨\96ï¬\8b\85¯üÐ!·¥r{W\99¶ÛÌñ\18GÇ&¿\8bøkåÙ\8a´,Û\92^×jó6²ã\9f\ fº\967ýµò,\8d*³ÍN³+\8b\ 1ù1§Xÿ"Æ\8d\9c'\ f»Ì[\1e\fÄ\8cÙ\8fUø;\8f 7Íçª=\17(ín\0\8b\83ÎÚW&\1dr­/ÛUJÙ´\99½y\88\1a\9c~\8eø³wo%­ò»%Ý*Ùæ­ÛÉ5Õ×\88n<\87\91Ïf¬zìra½\806;µiq?¯!;ùV]Ôدɢ\1apq±\1aðÙV\15\9a?$G%³þµ2=\97\eZ|ôrÄP=JÙ¾u?BÝ [\82;%4ÀÛU¢ÄE\r¦¤´\92Fdµ¤ËÀov\95¸Üxö§\8d\86ñ\89£ú'^\7fU\8ez\8Æõìl7­M½ÛªæbÙ}uQÊ\9e«Ø\1e{TÖµ<T!Ï%²\\95b¹Ìܳn©¡«õ\12ÿÞÎÂ$\1eeÃÈVäP\86ÛNúÓÒÿáP8Ió\ 5\88[ÅX\84\fâ¾\8d;¹NéÆ?Ú¬P=¶\92:unvÓ¯¤1Ðî¯zl¾ázv\9a#k.JóÕE\91SªØVÌWÖ\95´´%\8ffPÞ5¼r\99¹ØµÒ±]\8eJ\r¥Ý\ f\93~;\ e#c¹,ÞâÓ7\9d§¨ÁÐ#xÎm4Èc=Þÿl@Á/ÐnZµ>ù\9d\ f¡\18æMOu9ÅÄøa-º¯Þø\90\96q}ûxfÚµ[#Óì=ª\97úx7ÛÖ¡\93·®¹\9dÜ&ý&æ\9bJI\9e\7fýÐ媷}\94\8eç\ fT\12d\ 4\ f£\19É\84²§JÅîÙÐ\8aZË·\82\97\82|·R\f\80;ªù\85å$ò¡âyè¹·ÜÒC»öÙ-¢\93\8c\8b\9f       Æ)KżCÝ.U{?\9b®íýaðó@Õ\ 6XZ\0\ f\87ù¤!¶\86ýÞËèTú\16Ù4ÊÏwÍwOÇJEÍ-Ë\\1cÆ¥3dMJ§\9eµ\bÛ\16¿)öªê9\186ÕG\90É\ 4Y\7f<\890\1fFº´7[L\ 5Ïk$ß^À]^\8ey·Ø~:.¡b¡S\1e\90\80§7§Ú¦>)\9céù®Ð<æ\9eÖ5\1fâV\a\7fh\96²-WÌGU^\99}\9dBStÅ\14±üär®WûÈ´©µºî\ e«-¢Æ·äøé»a\97êÏ\8bFó3\f,µÔ\ eÌcuàOðêÄ\9bÓ¥¥»âK{\97\88»Wg[X\7f\1c\87í\83wÇí:\ 61\85s\84\8b\85\96,hÖµ'[VGw}ó±\8ajf?Üõòï;ò}R\98\1fõÂ$\9fÍí c²V\ 5Ã\89\ e¾\81(í±\81\8c\81¸,\9fB\16\7f\88e\96,wö\19ZiÄ×\12\9e©{¨µ3Û\0\92ø©·\18D}wmC-\97ô\96Mg»ÚôìÃmóU9l^»,\v­ákoݲ ±:;áe>Y%köOvÎ4\86M:\1fg\9a\9a\8cUc\8a,-Ã9\81¢\814å¦\1ed\1a±\8em?\am]\rÒ{ÿkǨ»\91e«»µ8T«eü\95bü}~\93.÷¼ºÛÜ\85a~¼\ e£\8b?\17\0\87Kmgs\rìÜhíá\8bãØÙ+ZÏn¬fÍB²Ó+\ 5éeF\96zåºæÀ1ÇùÏÂ[¦eCq\97ÏnÚ\891mo^\ 6òØfôEÿú=Óô \ fSÚzC\vZ©¬k\1a¥´]µÚ\9fUT6ÀûÊ      ¯®\95Æåó\94/N@Ê\17\17±ä6:ïÈmnÿ\90Û|\91JÑãå6Öäú\1eVð[º\\11ª´|\82\8aéÀ8ñsRý«C;µv7.\V÷\8eÕÓìº9į%\13(Ûj¾\90Þú\r7Þöô%t\1eë¸w]h\e\9eØk¥D¹¨{Yy¨Õ»\9fQÙ^\1dUNéÉ¢\b«­(_¢\9c)·e;\94\15\91zuü;OZÒùÆU|\ 3\1cO15ÄáÄi\89Ã]-\1d\8cí        B\1cÎ\14V|C6×#(Êk\8cÏ\18[>ëÃl0¡\95¯¿\98_Úbß\1dY½Û¦c\9a&\9dv\81\87NÑ@\13?Ôñ½UÓÊ\9cõ\1d­©ûQØW¹l}¢\9c¦£\95"¢£\9d|Yn\13¹Ý|?¥û-\9b\91z]\1e\93t7äÄ7;×Åáéí\89æÈn\8a\19k3\15&\94\96\bö~\83
+p¿ òó|¶ÎÏÍÜY\80\87\aL\80G¹¯9é·ìÔ\96K»î]\13¦Ô\91làÏëôÙ©\9bØÒzÄìÐ4_í¶1\87\ f\15}ù     \8bZy\96uÕÚ
+«(Íí§._\99O$+Md =Df"é\1d~)¾\1dÿ \8e\90úE4\17£¯Ê!f\1a7D\98\88\18%8\19G\16àíÜáçU¸ÆûZsÌçÞàÄ­VM\98\vK¨Ì\91Ô¢Ê\91ôöÈ\85\95\16\9aâÀp«IÚ\7f\8aÛf¡\16ªk&44êã\85áùh·Ú·\85ù\81Я\ e\9dG2v¤\87ü¤¢Ñ3ÒWÎ͵#_;\8b¢ô\18\fÊ\92\ 1\ 6uqdO;bf>\1d\b\ e¿\9b
+pr[ñó6rà}Û¸ó\18\Íð\18}$¸Õ\11\11¸pà[\1c\99\9f\97Ù]úÕ²\95íøë¹e\99®\92e\8eÚFdêï ÄÔ?\95\1dsÌ«é\86F\9fþ¡õX(f\95\11ªTÑj¼Þne·:\16ÔþtnfµËÀÀ\1c\18¹RVZÍÄ\93U§aKFຢU.\84\82Ó×¾A3\ 2b\ 4\8fK=n\r\95F\8ëÎ9²¶Û±;î\99°\95\ fÿNÑȱÌzÇ1Ç2f0\r¥\122üãÚ£\93\81½¡£àþ¡e¢ÌQ·\1d\1eP·=¿¡eê\93¥#Û¡~HwÓüà´YNh\81\b\9cÍæå4ÐÎÁ2\92Æ,\8f\f7\ 3mg¼\9bJâYeY\9d,<1\16´\820U \8b_øxÀ­ÃWÈ\91»W\95ÝõØ6˼\85\ 1s\1c\15¦L#\8c6\8c@NOt²K¾#i:êQP\8a*MËÞQ£î\18ãSÝu§MimbE¾\94á\8b\1c<9\86Ì\ fö\1e\99\1f&Krð\9e\ 2òÅ\93ä\ f\rg¶ÒK·:NøØ¡ý´#Óß\9b\ 59\98\19ص×W\8fñù\9bm'ßVR9­®ª®àÚT\81ǹM\9e£¤¥Ã²î,`\1a§M\85\11\9a\97&\1d]ï]Zî¢1uwµ%ÕC\83=¥-»WòÕ¼dÈ¡\84ã¤\99-I$\98î\1cbìñ\rÂÎMf\ 4\94è¿\ 1;\94<(|Ön;ø¬3\98\13ÐÎ\7f§Øá\84\9dM\88:¶ji¿h\16w·Öï\ 5-=Õ~\92¹¶{z=å\ 2­\9aÒ`\97-        ¨-;Ü\86»Xl\8dìå\99¦Ö,ÐíbÓ§z\15ïkç¡tµW'\87\83^D\9aùå\80Ì\80Ë\94\18\raW´3\ 1\17>{îs¸7Äy<g\ 6&¶Ê\1c«Xqj\8d1¢ú¸`D­\83綼håÊ\e<Îmñç\1d\0Å\8aÃ.^­V¥ï\1c\8f_4\8bs¢¸»\95_`»?\92ù)¯÷~\92¹8V?e¾Hç=v¿ºÛ\8c¨\95óTïJèä\bá\1cb"\10\0¥\8cÏm½\81ûp±\8bçæí\18[Õ7K,ä_\a\8c¸°ß\83\96Û¶\8bP®b/é\1c\83à:zX4Jh½\98\1d¢<Ñ:"ç\1d\89¤8\eH«¶\19 çùà\8aò\b\8b u5\8f\95/ÂMúE³Øòé|5¡u²ý£\97_Æ\Oz­ZMa6HÊ?\1dÚ`=¦yÛØÔ£é\99¤Ådt|¾>\98Ø\1aºz¹\1d·\rr\95óµ\92c"¸\85\1e\8fÖïæ\ 4ågí\r\92x\9b\ 4\89\93¢H Òz£À·¶\1cÀ]eÑ\83Órx\97âö\1dâBÏf]\81\9e\ 5«k÷\9câ\ 2Á]\80cák\1e \1e\8dÀ°õº\8e.Ær\1fo4NÝOä\a\9cëI\19©Þâ\8b\97]\85å\12! Uvæ\90£«W \90F&\8f\95¨¾\866Zõ\ 2\12MÃïÀ\ 3\91«\9d0Ŷ\ eßÙG\aî\9e\89\18ÖZú2Eï\ 4½¤Ó\v\1aÜé\1c\94ï\95\85lü^\16²\85Xnf¡Ân\99\99ÁÎ+ãÎ?\Æ\1dÌÃÌôµßd¦oí\91\85¸!\\84)\8auÄRÿ;\92þ¥²è[.Ú¨â`6\91Þu¸/Ì]§Å1ô¢Jßd!$?ÍÙ÷Iªç`¥øm¡'½\93Ö>ÙJ\ 1\15\1f2\8b~\11Ê\10\95Jv¼í·²veÕÏÌ\8e\87IÆkÂ\9bLNT¾\9e[PìT\0 Ô-  \bM×S\9c*\80Ð\eS@ðÌ=EÂ\0B\18\ 5\80 \86+@\90\8e,f\7f\85¾î\80¼\8f\e\89\82\8d¢âã©8Y½\a<YT#&©/êÔ '|O\ 1Â\9d\8c\ 3¬\8c+.zÚ?lDiõ-X¿\8dÜì¤Y/frOÌ\a$\9e\rSðµ\14a\a\90Âj\fH\11^§ð.)¶Y@J"\93bf\ 2RÖê)\9e\v@*£7 \19ëçR%Y¢\fÈ\1cº\ 5Ä{\98~®÷\vÿ\13Í\92%\89\8fA*L¢&Ù`+}ìÞ\7f$sêU\8a\9bĬEU±òb\B[´\12 *\ fûÐG:xYçÕ÷AIµ\8a\80|:?Í\86BZõ\14\93\bPLº\1f\17)\9aû\14§; t\ 5\ 1\94·\14\0e°v\8aE\vPy\7f\r(\93ɦ¸ª\80\17@QÁ\16Pt\1e\ 3\14\1cq¶º¡\89üB}\7fô*,}GÒ\8a\86æw\7f$sv¹\8déÞ@ê\93p-ncÛ©ÐD[\97e\r\8b\15(\8eÅr\16­¾K\80º¶\ 2@g\ eµ\14ï\16 I®\a\1e\ 1ÚjÏ\0\1d\9e\80\8eØ\v ã&HqÿMü§Ç\ 55ű\bè\89ß\aô\14>¤Øæ\0\15\0Ý×:\80n '@7³, \8b\8eaų7\91ÇY2«F      vû¥²ð´\^1Êv;%\9d2?Âvá´\8fFC¹\ 3\ féËw\92,\ 4}\86­\f\e\80>s\rÀäÌ\16`ôZ'Åx\b\98Úk\ 6\98\ 2Ì<¿\ 3Ì!J\0ó8¾\0ËÈ(`Õ\98\a¬\86Y):5Àêô$Åæ
+X£Í\06\1dÐ\0VÄÆ?\81\98ØÞ\ 1K®dÀB¢oÎ\8c\f¥sà\ 3ÉÃ}ö!\10\vêÄܸÚ\8e\9c6¶K\9cê;s´ÝM&ðHì\8e³ó\85<\ 2LoÜû«CÛlº\9bv~\ 6ر;ÿ+ý\82éöç Æ\9f\89é5Â\15ý\ fà\9a\83tÝ*K\ 3î]Ñ\0\9f{\ 4\80Ç\8a\1dÀã`\9d\ 1<\11È\80Ïòõ\14ït\1d\ 2îaË\80{âÕ\9f\17\11.ú+äÃ&\97ü·\87¦ÆÖ8ÁË[ø\80v¢ú\16¶Þü&\8b«»Õ\7fuèaö\0¸\97t\ 6<ë\þ\1a\90«\9d;໣\aàwÛ\17àïÙ,\10(\vÿ'vâ,\ 3acÚ@\ 4ûÚÏÚ\9bÉÇ)ng f£\1c\10\ 4"LtS¼\12 <{8\10Ñ\82\ 5\84×®¦µ^\aN\9aÆ7ü\97»ýË\11!H÷òBoGå\ 6\8fíÌ-KXõäo\9b~-¹\9dß?kïOx\8e\1dä¯ãø\v\11\eá\7fc'þ\95\80\7f\82+RÓ\80¤\9e\1c UÙÒ/`\18È\90ºJq~\ 1\99îp@fô\0È\1a>NñL×yëï\842 û\96\9fb\e)C\vV\84ò\83á\98§\16Ñiç²Árí\16\87 \99Å\ 1Î\86\a?ûW\11ÿ¶éOK¾Ù\17ÿÉ\99ø\99|¿ªï\7fÂ&$Ôúíæ\17ñð?¯\92[\94\81âó\9d¿/\93«\94/@í\12\18P§û<P÷Ý\b¨\ f\7f\ f4DÅ\80\86Â\ 5 ±³\bh\1c>y>óxö\1fµï\974ðÓNÿ¦öþÉo\bËÏAfÞyÄÈv|w6óå\r«w¶W2ª\1fÿ¼?¬þ\ e\1fç(k¼ÎÒ4ø\9f\97\88\15°ã\80(Ñÿ¼D¬ªì§B#¿[(\rw»6¢òfW\18|/Ï\r3{ÎÖ\r,\ 6k~ã(«\88\1eyÿ¦ ü\²¿`Ùÿ×%\9bÇ\1e1ÌRw$|qÿ\87¬÷\W\15ضv¯à\D      \92sN\82 (f1aÂ\9csâþ\ f:çÚs}{ÿy\87ÏÐ!}\94\8a\1a­ßÖÜC»î¤·se{tp\ eÁ£~|\15gíC\12\f¿{\ 4\a¨Þ\19î\16r~¼]ëÒt³Ëa³\r;Í.×M$»]\v\vò¸
+       òº¼W\98×R;ÈÐ"\12L|\9e\84e~n?\ 6Æ,6n¥\192.\fc?+¾c|¾dÿ5
+ûOë°ÿm\94ýZPïÅ\1d¸_\1aÏüý¤ÅçûaLÎ\93½{\1c#\r
+endstream\rendobj\r28 0 obj\r<</Length 65536>>stream\r
+»â5¦7;³)¬\85\99./ïeZ_¼j°µ0Op~>\96àÿ¤Ê>ßÕxa>¾VÙëwQ8]çA\7fJÍáñ¤\86\13\8bñ1àvcaoÝF\97z\1f\1aÉç\133ì)º=Ô\9eÂ8z\r\ e·(²\10ð¿ðÿä HÛc\84¼FÛòý1ø¹d¿FåWð\89æI#3\9bCav;s\1fü5ÆGÙçdçÞ\92 »xeÇÂf\87\8eBfG\8eäÃ\85\1dö\84£0Ô.w%z\85\89\11\99\8fÄ\1e$\ 3ª8°\13¶Ò\8f\1d­Ý÷àƨ·(LW=|õüúlºëÀEºÔþcvv\8dÓ S\13\9dÝ\1f°WeûÃo \7fU\1eìM³¿\92ç\ro\ eµ¢Ü4\0hn|,l\9cÑ¥¼/\rïµ}=zµö\9d(\92áñ`¬\83y?¶\1e_]àOØÀÂ\ 5ç\1e>\7fߺk\1f~u\ 3\82\ 4\9d]\ 5\83;5\86ÇÃc\83§Ã¦\90\97Ú\97°b¶CeVlÝû×FKKèa3rüMÓÊÂ\99F2O\9cÆØo\87\r\87\18\rþ`쯾I}?/ïÞ=\88\9dtøp{º6gü($Gè é°x?6^dÏ\87vl7@wrgWº[\9d\1aE\15ÃcM¨\86ÂIh¶CIî¶î]aÐêiÚ¸ù\8aä¸\19Yæ²\91L´Mc\9cw¿Î\94\86\93mÜëq±ý©{ø\1a­-\82;[Ã\ f\94^]7ÊÅ*uY\85\95]G]Vj\1a\8fUØ×Þª°o½ò\ f¿L\89\9f\ e=ag<\15E"\ 4úÈ\88½uv~ïÒ¾¤+úï¢ð\1e¦\93gí¡BMó#a\8d±\9dc\e\ eT\91ë±W7êȲåÔ\16¥~¡\86oûåêº:©U\ 3vÙªì\9a³N¥&î£
+{}L\83¦\ 6V\81ð\12OåÐr^¥û¤\83\96\87\11ëë¹õ#\7fÜô-ÒÝ\14\93\9d\8c§Xi)nÖ\ f«Ë6\13LvÉ^\1aL\80\90íì\91ãµ­\18§u3Ò³ã\86\ 3n³:2\9f/k>¾ÚU\ 3z~®ìê\87××\83\92      \8e!\82\aÂ\ 3ù.qË\97>+\94å\ f%\97î#A/õlÓö_±æú\91ç\96|\v­Ö\8aãR;,:äjT\88«·eÁã¤\8b·h5 Ï\97n\9c\87ßó\8e»î\83®\e\18\97\9b\e\98\ 1\9ebÁÿ0\9bÕ\85o?\82è}ϲ\9dý½\984?8}¬c$9¯VÌò°R»_:ÁqØë\95/]\7fP\96_Á¤Ô³Â\95ÿ\9aD\aßÊ\8e¯Åqqü,:ø\ 6\14â`\93-xô       / û7ã-\1a°àù\ 2­ºë\90ûnHº\81â\14ò»~PÍ×
\9es\Cs§\19\8e¨\²v87%;\d\ 2[i\81­­\f\87ÀVV(\95\82 '¼oY½\95j\13­\81\1a?j«Ri\13\9c\83ô¿\7f\96â®ÿa¹\86?\8cÐïEK¾µ~¤#Rï´\vñy\12yKh\16{\84·\¹\eî}téÖû\9aßËè+_\87T(ÏÅyÌi¡9Ò\11O-Á¾¶&\9a­f6vî\11Ãå\9cÁé¡õ>E±5\1cág+\ 3ù\909\89ïß9´\99¯wËf¾Ñß\98Y\8bKR´\88\1f\86\83Â^ï\bò\11\8a\bÍÌê'î\16\11\91k\17°Ç°ê\91#²è\916\13¸\9b\1dSÏïOX;ÏKÌÀiu¥©}Cr+»³¨|Å{[õ;×Ü\93\98¼rFe
\ f³E¬áóCY¹\88\11Í)\90t3?©xÆ\9c\99Õ\r,\82\87úÊ
+vz\19Ü\13\9d\9cz¬¶­Q¾Vå³Ë\14\93·V5³hzë\83\f\10]\95[¯Vð½ä·F\9d\1e\97Òk?X\14\91coàîê\9bf¾       I\81Ó^L=G&\8a\8e#m\1a¾­ÎÝ 7\10ªMë\13¶{VîÑ\1dY\99þ|nN\8dC:\12£óÑ\98\aÙ»Q¤\99\8f\81íͬ^æmB'?\83ï iU{nh,M\96ÔF=\1fª\82qZ(çĺ+íõ\95TäJÓQäîh¦È½Ü3Å(ûC\8fÚÜÄ&\8c\10PEt;'ß\19¹s/Øø\83¼Xî7í^ô,ç¢|ѵ\92Bò}§Yvy\9d³ èR0\11t]2Ò\93bÃÀe¤«\97{øP§t!Ö¶o{­U\97\8d£z$\eWµ±\1d½U¡{G\94ö+¡\14yi*ò½4peíölH¯¸\12K\91÷¸H\16_ÇÄäB\7f\ f#&Wa,\ 1ð¹\8bÉM\83$KráNs0\12êþz\ 3Ê}B=\14\96\1e\12çO\r¢g÷9£\9e\ 3\95\8c/\88c¢Pl\1a>çëúºTËëÔÔó4öè\95Õc3lªÂ5ì(\97NüU\a\950\7f\99)J6YËé\99ø ë¢|\97^W?\9d\ 3NbB²ò/Q\1c\1f\85\9cè4»U\11Î\91caF\ eO\82·ã\11\ 1­mt\ 1­\1f#\ 1m´Ï\82wÄ¡\1fB%t¹\1a½\ f\93R\8eÉ~ÕA¯â\1f§N§}íær\12V3g\8dªo\94 »£\a§ÀÐjS «'\84°\94Kò°\15Åyxrï\0\a²Þà\9aÒ[л\92\15ê\91\ 4\9cÚL\9cÀÑFtfë\93\b\970\13\94¬à%á×/À/\9dµÎ\97\18¹Ì\13ÏUÄm"uÏU¬U\86«\94Z*ÇPA\97«\ 4ö)Å.ÃmÆÇLkh Lå´Òß~¾þÜÿüÐv\7f7ëXùΧf\94B­¨3ÜÚѸ\9b¢+×Æò;\1d\94\1fa_\91õÇÄ\92\86ÆÐ\91ÀhR\14óÐ$\10fÞ¬!\14Ð}G@Ïð\88_¶¹9_²ÓÁ"¡Þ\8dÛì®i%u\9aä\18£©²\a,ñÙúºÜcùà¹aÎjºXl½H\91i½éïÌ\869\eÈ!E#aùz\ f4óÒ\9a
+n\10ñ*båÑ6ßÎ\86\93Ü\88ëwLl°ªê\95\a[üfÍØJgðPeé\8bR® 
+b¾¬jÂl'\99\ 2ÆI\ e_jI\ 5\9e\94ò\15®ÒÍ\7fýi\1cãvz\1cS½NÙ\ 3\87®ÓE ufùaøaÎ¥+δ)Qb¤ûØ£o}*¤»ÆhEk¸ô¦\9eë\ 3O=7û\ 6­\91ë\1d­Qò\9bîÚvÒ(tÇTy\80\\9f\ 52®n\9c®é}÷o¬i©\14\1aä¥[ÑøÓÅSº¬nÉÆz£J\99z^\14æRºBXiO\99\9bÆU\89§Å\1e*\1f\97m°X\8997É\1aÓ¶\8c0EgÄÈÄ~I߶à@w»ú\93Ö´\ e\90÷×/@\r\96\8eC\99¥]\93Läâ\82\1cÝ\9fOrô\18q¤=(\ 5äèUÛ\90   \9b\84Ã??÷~idÍ\1e\1eó6×ö \14Gæ|ª¶u\96.\ 6ª,­=yÐä,)ó\18ªBÑ&\ 5¾ìn¿ï4®Ú\\89l£3U\99ós 3rqjÓwüP¤»ëg\85z©ÙV
+c@\r\9e\95\982çË\1d\99\14ß7r,æ`Ò¾\ eY\12êÂ\16\11»a\9dðP<&\90åà\86/Ê2\85/\ 2Ò'\90\r÷\8d¡&<bý <p|W\ f\1d\ e÷Ý|ý\9e¿dðUnô FÆ\1aaÚZc_¬(ZµçJ£+j   óOIávì\99g\8fÖ\80e.y\97¡ï\8dô\89_cW£"§l\91ɬ\9c'ÇõQ\99tøÕwíIBçg\97\88ClDxN~E pç\84\8f\ 4÷\e*\89\13é4\16[_é\0\v&\8b1\16L\8bW\8cv\13\ 2Ý£+\ f£\8dÍ\f\v\ 6Þ\15[\1f\8aÌo\90"nJWç®Þ\97\96{ÚÿÑË¿bJ\88É\81\1c±=O\8c\95·Å¯í\9cÂ\1e£\83À\84\95*Kë&EQVÀ
+¤Ó§\14b\86Q:\91.}l\ 2-»E|)·«¸\7f\9f\878Ñ;GXðþÌ0ze\1cÐ}¹õDëÔ\rCëô¯{\1cÊ=\1e%ä4¨\r\91\96\85\9cR¬qDÊ4òHKîÄÈ)ä.È)°\9eå\97ÜÉz;'s±#3]SøÒ,úIæJ¯L\ 5?½\XôO\16·Û\19*s%¶"Ý{\969
+\84¿     \141«ÝY¼\94Û\89Øf{T±Jõn¢ûW\92GëCª\84ò9­\9e¢ÝCÎ\99Õ\14ií²[Dªåî)¶h¶sÆÄ\14ÃB:(b?Åå\0?Õ \v÷_¬   ?uu\98Uk×ïä6«ÖÅt  \89æ`7].\9es\8eS\9b\eA5\9dªü\93Ìã«çñëÏÒbOºªÑ\8fÎJ¢r\82Ë\93Y\1aOK\Æ\14zp{<r\8ez2Ò¶Æ:"\83µ\9d½m^Ål·úKðÏj¬\16¦è\8eáçñ°\86\a\ 2\9bR1\ 3}n[\16\1aõT\e²õ};3\1déË\8ck_>\19WéI\99ig\1af¦]u     e¶ÃsѯÜ\80ó «G\v-è3\9dkæúÊÃè6¥       rüÚ®\85¥ª{ܾ<Ë1\9d\12©QÃÃT&³\81)àeô΢\87m\8f\8b\1a\97í\11=\ 5\8e\98@\83ÍCÍ\84\92FäBca]\86ì˽\91\89\97ñ²f\9cAæÝ=ðñí\13à\e\16K1ÿf¦\0|\9b¯\ 2<\86g)âô¾YM\0ø Ü\ 4x\84-R\14\8e¿\14\19ÛzÉ\acSFcM¼J}ù=ª6%øx¯ð\9b¹R`[ñЦ\8d-i\90®0UñÕÞ\94\95\b\8d¿;\85Ù^3\12\13i\10l:\1aX¨\ 6\88:a¥°¼\14½j\8aK\a\10\ra\92¢»\ 3D3ó\ 2DÔ&\ 1\f@´&u@¤\8b{@\84T\ 2\88`'\ 1¢²j\ 1­oS\9c¾\97\95æ¯{ãmÍÖÉ^ßßá\99ªæù\81\9c+·ÛÂ\8a8V9~M\17éç©\9f§ \8dÏákg¤c\1cf«H¸\83䬾X\880ØDr¦P\f4@*\8a\9e±\0é\84n\8aE  \90\15äwE>Y1û)Fs@V3Ç\14¥$Å\93\ 1d¯e\ 3²N´R\1c7\80lô`@úfúD%¾\ 3H\e½¤¨d~Ñ,féqÜkgí1S\ 6Y>ú/½¼û ¾û7\94\93éx\ 4!\92\ eÆõ§\16Ò±]#kx¬\ eM\89£\9aÁ\ e¡\ 2Ȥ¦\83ôTè\0\17\0eáe@ùf\1dPÍn\17PÑm\ 2¨!¿NѺ¦øÀ\80\1aU\ 4@\8d\81\9b"úuÁ¢&î\ 1P]\1cKq¶\ 1U\eö\ 1U\8fß\80*\12DÎÕVO\83Åâ½&£`!C86üYÌY9éÕ©ñ\19\ e\88\12Òñ1^%=D]­òðg×v whÚ È^L@=ï?'$Ͳn
\a´Ö¨\ 2º\9a¾xt÷Ù\ 5\8f\0½«,\0\1c\0\ 3\8bïÿ¸\90i-Ÿ\fè\97<\ 4\f\9a¹\ 2ú½e\ 1\17\ 1}±&\80ÞXP\8a\8bháþà\17ÍÒ8¯\8f\8a¹Ù,Düþ\1cqbUëÑ9zÜ&V\10\ 4Я ZC-Ãc'SÊ,N£ô\89¦Å\ 2`2\83\12`¤U\0\98Ò­
+\98\ 1\98\91Ú\ 1̪\12ýñ!³Øc      Xó\97\9c\ 4ØFï\ 1Ø\b¤·\16\ 1\9fâå\0vXl\0v\94\9d§X¾\ 1\e¶dÀv\9c:`«ø*Å+}°75ÍÀZ}Ôû}|\92¼ùlÅóX&¦?¾9$q,îaÂ\89\v\11½òÓlà<Þo\81Í'[Kë Ó'ç\v!`ëý\1e`gË\ 1`\1f×ÿ¸\90¿Á\14\ÞZ\0®ÓÛ\ 1n²;\ 3î\86?\ 1\10àsG\1aðm[O±-\ 1\ f\0\1f\80¯\f\91\9f@ìú9À×ìô×úç\ 4xcK\ 1^hyº8/¿åÉ0¼\bÌx¹c^PvI.:Õ\19Ö\82\8ecÄ(5Gpö(\ eAu?ëÿ-§¢Ä\7f\ 3\1fãñï0KüøWiý\17?Q[%@\98á(\10\1e.\rDzþM\19\14³&\10«é³\89ÕË\1d\88µ\1e\ 3Äz¹\ 4Ä¢:\ 3¢\ 5>)&\ 2\10szA5.Í\8cXîö¾:4{\9f\9dÎ\94÷æ÷8ß\18l\10³À®`äv_ýQÆÿ\94õ­ä\8f\ 4ý\13\9e\7f\9eã\9fÉ÷\9fÓ÷\7f¤ßÿR}\e\9foÎpNýY{\91e\1eÈ\1eW\ 1\e\ 2yfïS$0\90çS\rÈQ© ä¡¾\ 3r\eÅ\80<Z\9b@\1e\9bU\19yDè¯\ 6z\8asï_\985ò&°\e\0æ׿\85ýüÐÿÑ¡\ 3\19þß9\13\7fÌÆÿ\1aÝýr&þ    ¿ÿ<¿?Á÷³¨\ 2Õ\94û@=\1c\96@}\95\9e@C\19\16hÜ£\b4cñ\9du\ 2­8x\ 1Í/K@kñA\8a~ïÿʧ?\7fï/¼án¼¢\8cP|&®ÛxB~±÷\9fP\ 4<¾²}hy\11\86¯íY\9e\1e\ f'm\11\9f~MÄ~.ÕJô8Ø\87Þ{\1f\výÌ\1e ûÈ.}\8f\13[jTg7l\\91ÖMt\98[\85äÌ_Þkpg©\9d¢ý"\92}êOú\81y¿[?ü\²?\rõ\7fÕùÕ¡#@d\1fîj\82ÞÖ\\ 1¿Vo9öÒx\15ÔóÅj}[\87IÞÁÞ}üÝB\9a\a[**V6ìĬ¯\859Û\\858\15\ 1Þ[öhv¸xÕÙéÂ<³\8bùX\16¶s¨§\9dgîÛþ\9elâE®\99\8dñiÌL\ 3$1&»Rµ>©Q¥ã\84ÝcØ\7f5\f\19â\97.û_.Ù\18ÓïW¶CnN=h´?@Uh»ÃÃø°©~\9a×u\13
+?+yY\81\7f\92j5\8fÏÇ"OÍb\95äfÈ\0û\9f`Ù¬1¥f\99ܤ\86\13v\95-\8e\9bTök\95ÍÖGò\89ì\f{\924\8a^Ýü22_\9dó \89\9e\99\81\93Éñ\ 3(V\1aý¸\0mS\14¿\9f\9b¾\87\99÷?@VÂí_\9cìén»ñ\ eoo\9a+y>\ fæI]«Ì\90î¥\1aãÑ=\9c\ 6\19h8Ù¹Ô||ô©í(¤_\87a\8f¿\¢Wûò\88Ìûñ=\18ë{0°ß§_wì8·Gû^æAõ\16î\95íù(,w×%Ôè\ 6¤îuvÕ ÖI'»½°)^æ¡p³oíK\ fbÚ¡\91©·åO+þ\97%ûÃÏ%{Òbv²>æ²å9Ô
\9f\83Ø©p#yûä£Ws.þB\ 6\ 6Ð`j÷Ýdë÷\91ñ§ÞÃgÏ°K­Îýήü\19wØÝ3\ e\9bÜm\11
+§Ï¦}igömù\9e9·î=ìÞÒÞä§ù\1ajÙ¦\95q©F2\1dÈ?I\1598õ¸\84\1eY\1fÖ\16Õ÷±¶¨\13RÍç\17Á\1f\97ìÿà\97)±ºäçŸø|\88iumd`?º¯îÚM\9e\9d\1a±û\84¡\ fÚ¡\90\9eaïá\86\94÷÷0-íI[M3Aó\8ddÌù\r\a¦\83z\ ju\ fãZud¥tk>%\ ejøN\1fW\ 3Î\9aW©S°­Ô¤ðRao»$hê0\11\boO)\87¹¸PV ¡[ºÇ\9fsé>û\b¥û¼þm Xê\15\ f¿±\8cñÁ^H\87\8fÊôðéñ\1c6\19°ni÷ܬ1Î\91«z\9cÿlêÈ"s¬ù\ 4ù¨®+LR\r\18\e­ì\1a6Ya/.\17\1cò\144\95\86V¾ô«f94Úß\86Neù3(\94î£yPÒ¡yÝ\7fÅ·®o¡\9fQ1YI«¢C\95.Ehw\80\v\1eOr\ 5äÜÏ\17\90\8bÓ÷\16\1dû\9dâÅz\8b.+ÿ0\8b%Gý9\8d»éÂíÔÒ©Â,-¬øÝ¿©á«K«²«\8dà)Õ¾òi\10\95åW3.Ý£xSÒÁâè¿&\97»oe/ïb²\0Pqì£h\11ÚÀD!®\10LÁc8¡\80\1ctÕó\ 5ÝôðKà¹\81Ò\f\ê±\ eó»\ 1þí\1e\97g\13÷à\1cÇ;à4ó\1aç\88ÙsÁ\11\91ÇÒ\11ÑÞǾ,¯ø\ fã\13Ý\11zþ§\9b´\f\1cÞ×Jêj\12\9czÇNY\99\12Õ\92\14}\v6JÅqÁ¨\16¡\95Ñ,xT®ë-jù¯\ 2åù\}æá§áÆ\r¤þÞ¥n³K~×Ý<ò5íôq\8eÑ\19r\9aÖ\a\f\97©$Ú
+\923r÷E§\90Ó\89MÃzm¹±\15U{\aËâÐ\8c\99\9c"ÉLÎ\83¶9\ eÕ\8d\99\6ßsZúó\91D9í@\87\92uyÔ\vËÒ:=\1e2ðG\88Ø,Ì\1e¥\92·\~\\8fØ\8e\1cwýªº.ueóù\9a*øÎq W\1d!ÑZöeìöìЩ\8er÷Y5Îõ
+íeNÇF;ëuÞ~¯[³¢öóiY\ e\951Ç3\ 13\9dz\957a~n\18Þ8ã\e¨SêêKú±Òý\83÷Ô\89Æ\9bÑ6Öº¤mJó\85¶)3\97\14ùWo\95\15°æH°.\95\86¹\9aù\9fm¯û\13w]æöüªêÎÙws\8eÔ\81\ 6¿LûÚ\7f\87ݳsú..ZCnQ±¬Ó¥eN¤K×ÌCÈÈ\84c*6f\9e¼2
+\ñ` §ÆU/Ií\97NfvYm\13C´Æp\9aªîO\83\82Z\1f\r\f\95æJ+~Ü\15©Þ¡\15©\11\94\14©iÏSl/)\9e\8fNC^d\7f¦èrw_\9c\16\16\84\18æ\8f²\1aØw±íæ\ 6³Ä´Få@¶2=\82·2:§\98\93\93h\98Ùôu4
+]åûßèË\97\1eè¥Èkè¤Uëh[Ð\8b´Ê$\9eª\af·Rë\87û^å\9bøM9\8bZ¢H\93\1a.ß*GIV\8f¸#=\9b\8d\864Èecñ3-]ÄOL\12âÈ{\14ÄQá\18\8b£\86{\16?óê÷Kº­\95ôLµz«ïýdÄN<êñn;
+\9a)第\997c;6\8c\ 5ÊI\ 6.î9½¬Ö\19½\9c\1dJÚÖl)\1a³\1eZj\83\9e¸*¿ß\94\94sýZS¤óµ%ßB¸/w\1dq"k°óÕl¤AÁßK&?¾\8b\9fó\ 3\12m\87£E\bnêÂô\0\ 5\82Ûh\fùyò9ð\v0Bøâ´dóÅØ\eñ\v(I\7f\aãçæ\98y%Á%â·EÏ=\8eòÇϲ\95{\13Û?â®A Þ÷\8b@ÛM®¢ÆÎ+\8cÚ¸\90\84*8$£´û\98 ß>YYÖlÌ\90^\10ïH\83\8b  \9a«\88£S½%Ú­a_\84¤ÍD\88!x- \1e\17\9cÿæ\8bïï5\81#Zæ\ 2*,rÔ\1eù\9elØ]\7f°ek¦\90akVÖ`k9xÀî\86ã]\8aÝ©á   \8bO¹7þl
+\84\1f\r\9d\ eÔjZ\13¦ë\eþn\9dÓö$§ªÍùDPÂP¢å{o\8bÉÚi\80I\914gŤ:àEûØýJªBlM\rÁ\ 3[G@&·"¿p³UÞg¥6·n\1a\ 3.°Z3\8e\ 6Ëô¨[ôÁÖªù,Ëi\e\81\96Ç4\97»\ e#\96í5}\95\13@\87\8f©J\87ÏY\8f¾jÎ\86\11«á±NÐÁ×\12_²f«µGO\82èç\876gÅbQ¯pã\9czª¢ª¢¬+¼¬÷3\94\14-G\988\9e\10/4B@        \99æý\8aÀqë\83\9c\ ePÃ68Z(;ì.\19\95ØÚxUc¹J¦Ë\9c\18þ;ëd\9aÏÊ\9a\11\a³\v}õI\88V6y\86zt®6Õ×¼&¥¿îsò½l¿È÷Ê\95È÷º\10Ré˺¢ú\96u¨îyåé;\9fî*\7f\1apýÜ°Å×\8dåÚ,jõRÍR:\8d\93"\etþ»Ã.\81á\96\14áª\8d\bh\13\82x"¼#\ðx\91ìÞ¸Ð,7ºðL\vºÈ\8c\18'\ 6\v.Ýáí2­|ÚMê±:DT?ÈÎ)CÉ\1fÉ÷cò!\87s\92"sÅ\8eIf\b¢NL®ñ÷\92_brs\9f\87ðD¾O¶\88Éc³ 3\fº¯´È÷½X\90\8b\9a }k²ÍÔô-L\15ÔÖÖ³ä'¾Q¤\\81ç\84Ù´KðËH@¸\8a³Î°õB\98aNç\18§¯÷\90¤;½Þ×y\9f~\1c{\ 2Õ\1f.4Ê(ÝmòC!Erx7ëd®Wí\92\19o\e\13S,»#òçÒ\8bȶ·8>WT\r/§*\8eͽ      ¶*¾®ØÊ_³Øªthàب\14ã\85Ï~\17¨ÈäZ uáëU·\9fòµgÎ\99[M;è/Oé"¢)}\9c¾,æW\18ǯ\90*ÁU6\bò3H1ÒÈMh5v²\94q²pòÓrÒ\ 1º9\1c\99é\ 621uÇ\16á";\8føú\ 3ðyK\ eñ¢Tþ6\rÂñÌv\83­bò\8e\95½*\82Q|FA·çV\19­\86Ä(Åú\82²j@¡¬Ö¨¢Õ\9e4E·»ÎöçÞ÷ÒWm\9eûÔf]cU\9cW\7fz¹ü\8chSÊÌê²PÌÜXnë»ß0z\96ß\1f³t·\1cd¨A\8dú\90£!\9a!!\92Ã\b\84\ 5é\0½h\ 6/Fº\84ã\96§ckÐt°òf]ƨʫ\89îX!B«¯Æ\12e£Ã\ 59æd\18i\92+       iR\85\12"ìÞCDØ\8f¿\16Ål((döâÛ\15DXf')
+[\7f\9aåOùse\11ÿ¢Nôí¸]Qe2v¥Ïåm\88ÙONú©å\1cK¸$#\e;\84\1aì\9c\f9zã á^/     îg¯Y,\10ö\18º\v7ßæ'hÍyó(\97E\15ä8\17­\14µ"Òl,ê\88($}D\14ÝE6ìtOÙpJAYÅí
\ 3%\v)6\ 3¸7Ò÷°n?\10Xw^\ 5¸7\99GðýƬ\8aEìstº\8dæÔ\9cos߯5í\b\97ÿJæ\90r2\84â('sÛ×\9ce\85\8aFÒÝÏ\ e%Ǻ\ 5\11\9e\ 4\ 3\9cÈ\8eßè.ég\90\932D\11q6$RìÙl\a;IÙ\ eN\98Ye­¸ð#\b*)Ö\1d¸¯R߸)X\7f\16÷ÐÐ\9c¾¡\1c (\bLF¹ÌÄ\95Z\99<²_eà¡óÉ8\1fßÌLL-L1\9aþÒÌm3´&Æ\9a\95Bõbh\81l.ü¼èî7\ 6¿\96\8fª/?e\8a²¨ñ÷R\12">9YÜ\9f\82t~4ß\0ä4\1eBÙN¿\83ÂO¬CÀF¹EC\1fj(@ÃÝF\83\87\rexÂÏLÎV#\93µ\9b\ 30\87\8eK\80\15ðK\8a\b\ 1XQÓR|ê\0³ús\80å\9cß\82\1d³E\15`\ eÞ\ 6\98R\1cÿÒÌsP\9f\18ë51ÓVz6R\96\1cÂÊ\v\8búÆäv=Ff.\9b.G½q\9c"\9d8Æñ\12©#\18\83\0\189%³L¶\v\ f³ðÀ\18â\90M\95\88\8c«ç~NÈb\8eg\0\9e\14-#ÅÞ\ 38D×RÔú\0§^K\80Óå{\8a\ 4\a8ÓM\1f\82¨M\80£`\9db\96\ 1اi\0,©öSÜ\96¿\b\19Ó/\9dF\9a¨l[r4}}uh1ÞX.¿>OLö\84\92
+ÝÏ6x
\ 5\96ÀÐ\98Ä\98ª\8e!ç&\8af»Á&­r¿Á {5!ÁBÏ\93\0\1f\1a\97\15\1eà§\99\9aâm\ 3ü,ú)\9ai%çË\10à\17sóÓ¡/«'À¯fúG×\9b\ 5ðÛ0\ 4øÎÚ\ 2|\8f¦÷Î.9\80Ïoc\80/òûÜ8Ù­\rº:\1cªJ\7fÚ\92\81û
+D´by?#<£\92\19\95Ê\15\e"QØã\1cV\95Æ4r~9äO\87\ 64\ 1Gy\98\80 Ï\f\a\84\0áõY@Ô6" zo\15\10\ 4ÄÌq\ 1±\1fWR$\1d@\1cìi\8aù\1e\10G)I1g\0qÊ9\808£=@¬ÖG@¬Ãô©&öw\19\ 5\88ii\ 1\88\9f ûp¥\9d¢úP1°Q[ÊsPõ\8fd.Õú6õéb\ 61\1f·\15¬º\82\ 4äÒ]óÙ^\14r°5qØÌÌxS\80\84\86\ 4 å\a\aH\87\96\ 1\198\ 6 ÃZî§C\8fÇ. ×÷2 ¯B\13P 1Hq^\0*c\R¬`@Aé\e\84\82®E@Á½! \9fö\r\90G\9cMñLÿlùØ\0\ 1Fed-Õ\eQ\19ÉÃÕ(ü«\97_Äo\b\10mæ*\7f\fæØnÖÖ\91«,¨Yýu\91¡É&\92ÀJ\10y@^D\ 1Pé,\13PfM\ 1T16\ 1Õ¸ç¿1Ó> \8ev\ 5P¯v\13Ðì¹\ fh\9d\99\ 2ÚkíR¼_\80.\94\88\9f@\xë\806k\15@ûr\fè\æ\ 3hi%\ 3\9aª×\0M×ö\80Îê¸Þ ô\95ª^[\13)»kwxVÝÕ\19mO\97IÏ­xØÞù8Èõ\9cNt\8d]9\a¹9<­ä\e?@\1d\8eæ\1f\1d\1a±\ 1]Õ\@wmï\8fúKß\ 6å¿Vd\99ì\0¦\\18\ 2f4\8c\ 1s~o\0\8b\14\e\18°\84§Xç\ 1Kº!`¡Lz/t@\0óèç\0sðz\80Y°ç\9fQyÉ
+Úùîld{\90\9b\bÔ²ÚcîIܤà\11ñM9é\94\91Û\9c÷áľ\153\8baÃû[ÓÏ\14\9d;Tþ\b¾ÌGmýU}\8dJç¯ôûõü²û÷\1f\aqVYþM\9eè\n\7f\9aßñ\99\ 5\rx\88ÕSL\ 3ÀÃÆ\bp\8fÇ7lbF\ 3î\18\96\0·4§\80\ee\9e\92òZ\8a\1fçf\9cxk\ f©)¼ëâÕ\1a×Bî\9dåwë;\vÌV#S*\90µtX²õ¿\15ýó\1eÿ4ßÿ²\1d÷Vÿ­þþ<¿'ö\ 4\ 4´ñ\ 2\82~\84\81Ð\97) <¦
+\10³|!Å$üi\9d\88µ\ 6"
+\0\10Þ\v\15\b«F\v\b\97Â\1e\b\e\f\ 1Âd¦ËðV<ðß\99\1e=Z\fb"à\93\11ª\9cjQ6ã*Q\86¢gé\0í÷Ñ\9f\9aþTò\8b½ø©Îzùפî\7f9\8eÿ\84\84ß\9fÖúK\19þÓ`îÌ\0©©ª\7f\9bÉéz#Åz\ 2d£x\ 5²\89\93@\16¶y \13ý!\90\13Hw\9aK\11\7fýiÂöh]\99ר²'Kà¼Á¤±»ÊÚÃd\99Y\1f£ÿ\8cÒwlþèà¿J~\9eãïñÿhÎ?Á÷×àî\9fêû/bx:Ó\7fÖÞ\9fÏ÷_ºÃçØ\0j±8\ 2ê"³O1\80\80\9a\9e)\81:BÓ;Ú»5PÇ\v\14¨\93ª\ 5ÔΧö\7feÞ_\82Ã/¼a­<\93üñë ~BÅ\8bÿ@\82{ýV>Çí+ÛëõÏ\97\9c?<Ý]krÒ\16Öühn¸åÁ>Àë},\80Ýn!_\8fÛò{xÚìrÿMÄ\84Å\b\9b\11¾ì1\aa\11     7c\9etÔ`n?7ß7ô,¶fð¿\0\84xá¢Òd\17\94\98±pºáÿ7\ f¡ùºã5:¹²\9d\15\93vöÔ\83»ÔI\9bm¥Ã\98\1aè»â\8d56Õdm®\85YÏ^É«Ú÷\f½ÔvNa\11qVi\9e´ôÊܾ\89µY¬\89­\99û²zñÂrF1>ñfÓ ÛÜ¥ëèð:>\ 6\9bÌX8 Lzzl:Ã{§:\eÞ»F2Ô^\1aôë\15\16\99É3ù\97%ûÿý\8d\98¸­Ùáñ§¡\1e Êx²©¾\97ÑêâÖÇË»ßZ.µÍð°0\ fÃÛ,V
+ϸøQ\93i\0±Ðdç±è\84]RĸIâßTY\84\e\85,%\rïM\\1djWÄ\88"\15ÿêi\91ùÔJ\83±é6\ 6иÑï{ð|Þ[\14\1e¾.f»éb-×\rXqÚ¥\8eá!½5>þný\²ÏÄ\89ß\7f\²PÅï­Âì 0OW§ÆtmÑßV\\ fg,¬6_ùa\14R×êHÞ\13ßLYn\18\99wx:°_\8f?nÙÿôå:\1d»ëâþÒ\rðÓ½K­\1fïN\8d~f:ì!\8b\86M\81¤Û\97P\92Úò#oµzF§ÔÒ>ïn3r¬eÓ\82\14ÅF²@ÜÆØ\9föÿW\9cìO-ß\15Ï×ÖÂÜ]¬_\92ì\7fB\ 6.ÙÞÂ\ e\91\1e\1e÷Èn\80ÆBgWZk\9d\1aùrÂ&{)´/Í{Ð\96¯÷z«§^Z\7f$ÕWz`ó>h\9aÉkÔ\18;÷iÃÉBË\ 64§vu\ fgϵE ½j>ÝDªëú\82«R\17ȪìÂrµÂ>n\93à8xf\83c´·\83ã\90\vþá\17\1f\1dzt)­°~l¸\8f.µh\1eÚ!¿ùj¨\93CÓ|·N\8dq®so@Óa\92â\89Õ=äC×\16¥\8cP÷\19¥º®bF\95:fs\95]\93t+ì5[\b\8e\1d²\1c4U©^¾\f¤v94óß´\84Ò}\\89K=g¶ó_³Ç÷p\1e)&ë¾T\1cWh¿è0\97iÑá\10,ÅHO15~\98'µµùÓ¡{~æuI«\9b,\1aIt\18Ö\91¹Ð©\ 6Ô«_©qÇapl\1d¿ZgÐ\94\92UùÒ\83öåPg¯eùm¾K½\9c\95\19\ fñ#×Á}\vñéb²¨ñű\1fÊEhÓÔ
+qel\17<fWô\16\8dKÕóEªë®;vì\ 6êü\94ßEH&_³\1a|\9eË0ß)G:Mröy\ eF\91\14\16ýÃ/SâWe«'çã_\81imNµ|éìýRϬ\7fåÓ|P\1c\17rµ"´Êµ
+q¹Ò/xT\7f\92b¿ô\16µýÖó¹ÇÉ]·®×\9f\19Vz?]ê\ e'ù]\8f\84óì\eC\9dãP¢\9df./Ú\97iI·Cwâåî\8bS-×+)Ã\9cNÆ{ëµã\80\15Õ\16¢\15ÕWm+j\f\8fVÔd2?\f\92ñ9i\87sx[[2Ý_\afqè7ü(©\7fûOÎ-oÑ\15\14\ f\86K]\91\~×ÁóyöI}åS­æ4M·í\bé´Ü¾\8cÛ#[\81Ûqî>\e,s½Ât\9bÓ±ÕÑz­Î7+*\7fÞ\96ES°9®ËßÉ­éðeÑ\88Û£\9cá)Ùª\81<*C}Ñ\7f\1ft߬úoY¦îçÜQ\8a[ú;\e»v+\90öjLjõUpz }?\83o*^©õtóõ¦l8-g-ÛWÃâì°L\v¹{\f\7f\15¨\9c\9e~wX¯%aYQIñ,\8btÊæ¸jUM\87õ[&t¬u\8d¸\19F\86'\8e§\ 6r]/õEç²Óñç뢭#ê­\ 5\96\87ª»I\8fWkùWNå\90b]9.nS¥Y*\\94f\99ÿº\86\94f ÔR¬ÇJ³BmÚ×k|«\91ùç¬dLý¶·2r¥\9f¸\9b{\16Æ\8a\13\9c\95a÷´9i\ eS\10\84\99<gx&Ï\eHb(ºï\18\86\ 5G[ï[E-¨\ f¿\97Çi4?k¨»Ïµ«rö5RN0\1c+ͽ²QÄzp\91ÃÏ8\91\951 ¥tÕªK}ú\1eHú³:\12ßQæ$\ e­\11.\ es\93\92\95\818,G\8bæ0áN?StÑ\15Ñf¾Q=\7fO\9d¹ç\132­ÌÝ\92\8cysÏê«|\9eÐÉÂ3«\93&Fh\9bÑ\87Ò*Ô\8dQ÷µ3¯r§\9b¢\9cÚ\19S\11o\1f[¾ÆLQîxR «h®!=N­\9eÔoMÆ\92!\9d\96â0\86\8fbγ¾\97Ê\8b\19nF\bù6¬
+Y¹Vâç0\12ñ\85Y÷À§kU\8cÇ|µ\98âÔç±\928¯Ï½å¾¬ñøÐ[=\96uGn\8e\1eźQ\¢¢¶}\16(õpÉ`ª\0\8d\8d\9a@i\9dܯQY\91JE\îlmRV«eNê\1f«²d4Ûºø\11\98ë\8c<1\93?W\84iöÓ\14ò\v¦/dýÜ\94/\[[\1eëìïÜÊ\95\10\8e\´Dv[\82\vlU\8aú,sgwÌ¡wD\98Cÿöͳa\ e\83J\8fe\9e×Y\8d"K[\7f\9c9F.;*Us\91jçM$®i:µ9   jú}H)ro\8aÈZËÌHÏëç-\99ÙÕ[ü\fv\19q$\1c\111\13îpaªÜ\19!;KD~^Ä5¾\88\vße\14\8f­M\8f+Óv\99#\1fÝ\16»ío#¶ZÄ\16Ìa­\1e\99F8\ 5\8c \92,}~ö\1dº½\10CZö\17+êNú\19êNUóÔ\9d&;´\1c´¦\95Æ\91\\17ÝWØw.±T±Æ\ 39¯§\1f\80¯_@=\1e\86¼¢ÐYRz-Û\888V?\89\b\15\aOazqo\ 2BÛ/~>ó\0\8fc\ eÌ\95Ë\16ÊQ\94O±Õ\9aϱ¬\1e©Ìá½°\98Æðâ1B\99ªÒ\17ÊîÐíûhJ˳Ì\9eêaêW¹¥´ó\8a"_¡j\91\91²i\90æÓ\99\13É y\13É\10±Hó½m\91æ\87\1f\aòú°LW¿NϾ¿³ÁO2×ö\19BQ®x\85\93Þè
+ÿ«ë\ eΠ ¿\b«O\1eï#\17®üþ5zfwÒëŲÝ{Â4^§\f#Do\94\ eÁ\9b¤å-ÍS÷ª®R=­éPÚ+.\91¯EÒ"£\92<$-©»&\ 1\94y\10ã¸\8c\13Îws\aæ;u<¾\10\85ë\17îuv\ 6îU\8b_Ã%\1eo\9f£²\ e\8f\16\1e­rÝÜ[<\97\8d%u±5®\v+òÃ1X     \94F¸0CX\98÷Ç£\ f\17ôµ\a[+íÎÌqÛ;Ò\97cx£\151|Q÷k/¡tµ\ 3\91Ñ \83¦Ø3¤å\83ï9\8d\ 4\ 4g\12ã«_ \9cNT#àü«\8fÏX{\89{Çé\15G[\14\82-ss\r+Aj\ 5#âý\ 4Ý\14\82;º)65tcQU\8c\88FÑ/wÛå\1a ó³\98ë\e/Ωâó¡Hï>ùUnÅ|¦\8bóK3\81¸àQ}³Ü\b¹3bw|¦\95È9P}à\ÈwÞy\90Ö\\7f\11\13\I\bçRBð\99R"RLx¼\0_5\1c\9d\13ylÙð*XI\88:X:\9c3t3qOh¥rùu\95gØ¢\8cì\8f\9f2RoµFH½­ß\10^\11\1e¼*È~S\1dø°­Íòâj\1fþ"D´ý°i)ª°\94¥\1c\9fe\84\82VĸM¸Ë°uÃ}3âí\92\8eá+<\93ï\8dx Á\ 1\8a ò&qÃgcø\81c4üÆ\96{\ 6ÂJu\ 3ÇH¾À \9bÏPA+£}\ e\16±\ 3íµ\91ú>\9e õ§|DøÁ8\93=[\82\98m\83\95\9fmgJì\14Ãç\14o.+ÍÖålë©}7V
+K-\99Ú\8f¸Õ21¼èk¼\14Xr\7f=\91Å|éLóË£\8dq\8c²\83\98ÓÙ|Ó\9dîåN~\bÿLL\9eè\ 1\9f\1d\92÷çtê°¿£UtÿB\99å\r \87r\ 6A\1a²D#ü=ÿ½*"ý94³çø\9d\16S\10\9bY\19k\8eR$;øv©&p7L8XSÛ\1eô|\91=èy\î¡A«\82AÏsàÁ\9a\80\84^ÅZOr\1f´Ô2HG.ªR×±¤\11\\97\849yf¸-Á~EH¶¾_@\8cÔ6?Tÿµ¾\93¹\8d\7fÁçEø\88­Ú\9b\8d'Gäð\9eÝ\10¡4{f/ä&ɶ··lz6Ï\92)\f\ 1¾s\15\1dî¾\97éQG \ 6½lk\0EÐx\95IêÈ#3æÃï\ c¯\11+\ 3\ 5£\16\88\19u\ 5b\16\833P\8dp2v\1cÖ\>\1f~\83Á¥æ/êDQ\8f\9c)N\8d\9cȯÜ)Í1\13\1c\851D«;êM~¢õ\83pUï\8aã\ 2qFwÐò\80\1cõÉ7n*{iÍîð};yÁ:Ûÿ@¯ã\14\82¢æ\ 1\87,ñÃf\92\e£d\1cMJ+yU|\10/N!@Ib\9a¢w\ 2(¥ )^&@án\13 Yc\ 5P\84\84\ 1\8a\12y\80¼\83\9aÓÅ\95ï\ 4Ê,f\9fu\8d\7f¿
+²)¢¦\98=«"O¾\ 64ÛÈã\18#cc\98\1aô\84\84\84\88Å\13\9d\eº³ßgäØÛ\9c²\97Óì\ 2?ÈÙ\ 3\1a"ýwf"V>\19¸S\ 4\0\1d\98é±\ 6m2Åök\89\ahD¦Å,Z¥\14\8f´Ô¥7Kq¹\0tÕÄ\ 1º\96s\0\1dßÒ;&ý-@»y\ 4 =¯\90â\12æ>»ÇÀ \84m]¹g\16\9ed\aWCÀeFäªÍ6Í\9c\9f\10Fkåðûñ$í%\92à\8büø\85Q\89~GN0zË^õë\15~´öwhX\9d½2y¿ó\ 1\18\0¦\963\0Ë\8fÐ\147\ 6`.#§¨Ø\0«\9e\ 2\80Õô^\8ax\ 1°º|Oq$\ 1V¬þ.ùM¿íÓû¬Ç\ 1`¹%\ 10y\9d>^1#Ë\1dNúÚQéÖä\97\ey\7f$óò\ e\13Ù£Øfè{!ÁÉ$®e   ¯ÄAX0\1f\7f\90S༲×\19÷\84\9f\18ú\84F\99ý#\93\8dú¿¼NlSOK½N!\80\833
+p\12£\0\ 4\80ç\86F\8a\87\ap[¯\ 3\r\0îP\9b\14\83\17ÀU\96Nqv\ 1Îö#\80\15¤ç\11\ 6à¸Ö\ 4\9d\19ëj©§\86\86ûµ]KcßwÿJæ5Lú\19á©h\95\90Ä\f­¡Ø¦\8aÂ(/,3Ù\9bÒ\ 2ðÀ°\12È\96á7\98¿fO\8077 À\87\99\97<\ eðS>=ô»Å\ 3\ 2]*\80àá\1c \fï×\ 2\89\16 Lj\92¢½\a\84\95M\0!v9@HF\11\102\91ÞA\1d\9f\80\80#\11àÏi\aà¯üVç,¾«èe¹*Á\84ïý\82cØæ2#Óú¡Ê\93ðýEãd®I ü\82ø\9e\ 5þªå\8f%\92\89e5\93>Ç#=\8cÎ@\80ðÔ´\88^+ýF\8ag, v\ f       \10\ fT\ 5$mY\80TB\ f\90Á«\ 6È\8aÖû\8f\ 5\99¼\0ÒmÃ\80ôÒ÷\ 6éí\ 3@\1a½ùO 6\83\f EA\ 3$ɤ\8f\87ÀU½V²]ÙÚQUq&öü?\16sUÂ4r\92\94E¼Ì%\1c*¸M:Û#D\12¶T\94Ìx£!\96\96SBÿ\8aÑö\89\ 6d\bX@\8e þw\98µ\9e\1e8 Í¿Vd3)\ 2ª©U\ 1µè\86\80:~&\80:å¶)\96O@­$"ÅÆ\0Ô:h\0j"¬\ 15ÅÑÿ¸\8fg\11 
+ñGy<3=\19ÜÍ\86@2þwQÈÜô\8eý\vdÁ×pYAÅÌKÌö\8e±\0\ e\a\96\17À¤\15¡\Z\89.þÕ|\a±þ\13~\7f.ä¿Ò¯«}µÖj\19ÐÓU\ 3Ð÷l\170ra\f\98òrõSn\7f¡\13a\1f\ 6L\87\16\ 1S\89<À¸Z\1f0^ö\f\18ýÌ\0\86\1fú\80ùî%1 È*ý'9\10\vo¡É    ¸S¦\92\Ç%ðä\93C[XÛÌöcÍ\80\pÑþjãóµñO\87þIÐ?Í÷\9f÷¸õ©ý\1fõ·0\1c\0v\ eÏ\0ût¶\80SãËßtánÄ\0®GY)æ\rÀÕssÀ\15á\ fàÌÓÏ¥Ê\89ã\16àHw\ 38\88E~\91'<Û\85ZôëaU\89¥;)¡g\86)d\aí\83\a¹ï\86\9b\ e\90\90ÿ[Ó¯\9c_\0ÆO}þ       Ï?\93/\ 3\8fÿ%Nü\ eó¿\84ß\9fæzr\1f@àv0\10ê\ 2\ 5\84ÙT\ 3Â\9c/¥ØD@\88¼#\10\864\ e\84ÖË\ 5By5\ 2\82\ 1Aeh!¨\9dG¬rd{äìã·°Fóô\9d\ ef_óz\rò\1eLõOm\7fr9¾Vè?\ 6è\7f9\13\7f\8eÏ\9eþ     ¿\7fUßxþúo»ïÿ\b¾\12¾ýj½ùßk#½NE ½­0Å}\ 5¤O7\ 1ÒE\93\80´ÉÖ\80Ô9m\80Ô\1d¦\8fëéê¯U%\r\ 1{\8c×äñ\0Ño\\ fÎ6Aÿ\8fZÿ+ì\9f\ eýÇsü7êø\7f··û\99\8dÓéÂ\7f§KüÓ|\7f&ßo\1f¹o¦\ 3PF\81\ fT\1cé\0µ\91\9e\ 5T\9f¹¥8P@͵\ Êz\ 4T\1a¿ÿ\ 4âÇ\8e\ 3Ê¡èý_¥÷\97ßàSÏ$o±O¨è(\ fw]³ïxÝ/^«w18_¬wítÏ?ÚÇ\b\9fu\ ecºßßÇ|%Ú-äÜh[~cãÍ.\97ýîâ®\8fùÛ|-ÌoëUº´Ø/µýö²\88øçg>V t\16\e\147CFå\ìÃ\99pº.\82ç4À\87Ü\94Z·ØÑ¥µÅ~ù\ 2¿~\ÿ¥ð\8eáÞëgB½²\9düwcå,\8f3×c\84ο¡\bkp°·        ¾[\88;fÃ\8e\15f\15¢on©m\97ÂÂ<\ eå¹}­«³X­\183dPÊÅŤ\90\9f®\9d|a\1aÀ\95`²+Ô\e\13vÕê\8c\85]g4
+¹åjxo½¿\eùCí®B\91ùî\8b\83±\1dv\ 6\ e\f Yãù3Èþ4Ôή\19ì\7fQ\b¿\ 2/\8dÇmu\18\13Ñ`Ã\ eÕÚò^<4\16æ¾Ñ\9c\8fùA\7f\16Ë\83É\féM\97Ó SÝNjHñ{ÑÒ¸IØ×QÈ\b÷á½!¼\87Ú\85J¢W(Â\91ùàÐÁØ \89\81ýQØ~l+ÿ\13,ë9Ýu)\fºÔv×íÔ8|\1e\1e[Õ[(ÜY®}éçºíÐ\98-Ò[ûeK\87\8c¯l×\8c<l|Ç«ËÓO\87þ5\f\9bÛ§P\9fRã:ûkÅ5ì±g1\8aÄ­:H:çÜ éò¥\81ýRë}d\82µzøìÓé\ 6ØgÐÙ\95\9f£\ e»»MÃ&w\9e\87Âé¶j\87Òù\e\96o\9fS«§}n-íÍ$Í('#\8ddZd\e\ e2Ðë±\7fóëÈÖèÕ\16ÕÇ¡æó´ZÃÏÇÆ¿,Ùj Ç\8d\9f\97÷\97ÖðËAø)¼¿\90\81.µø\99,Âc¥ù\b\85CíÝ\ e\85\ eÜ\96/K²u\ f¯é\a¬\7fR\9aæçd4ÆöÉn@ñÞ­ÇÞ5=êò\14Ô\16¥k­æ\93ïVu]}w«\ 1\87\ e\16\11Wj\92¾ \8eÝà\1a\b¯I¦\1cZïïj­¬dü\©ç^\9a%\1dÝ\9eü×ê \95t<\97ÿ\87_\95\93\1alÐ?\eo§FX»Ö½]\995\1c0\18Ô\91yu\Ã×n\\rhw\99bp¨Rûí½²«?\93
+{þ¥]\a\85\ 5Â\ 3¢Ê¡\9e°eù\83\88¥^.\91K:\84èþ+fmßBY¯\98,Í è\90\bm\aQÁc\ fKoÑ"¯\9e/uQ\ f¿cª»î\9dZn`$Ow=8
+?xøóõ]ßü^é\9f\ eݾÔ7Ë_\81Õ\80\1a7\82c\8b\ eJ÷Á°TÒ\92\8f\9caÓ·àe·\98Ì®£b2§\17E\a§7Eh­\1c\v\1e-^
+È^\7fx\8bºóñ|¾\ 4yø¹\8eº\81\ùîâºÔ½Ãæw½\99\9c\eÓ9\8eà¢#BJÓ¾ÄÑÄVÐ×!w_Õà\/ ´\¯\92\eçzUñ\9d»o;È\ f\83$Ü~~%Ö½¬Ù\r\9a\12\ö_cÞ):èÈ( [íûµæáGÁt\ 3Qp\ê*{ù]Ç.§è6ó5uÚͳÏUä4ÍÕÄ\11\92Ãܾ\8cok;t\9e;[ÉfϹ^1sËé8ù¶^k\r¶¢ L\9aɾ+\9aãú9gB\17¦bÄaÿ»ð0<\958\18Ès\925\90W\947\90÷ja \1fãnxFá\8f ß\80&\8d~Ðl)U\1fÀ\98ãùUYÍ×\9c\80u\9a\ 6\97\11 m\ 5\82\85\Ï}K9\1d\85µ?Úéké\14¬¨ä\7fM\16\96EÖjæ¸Zk\99\ eÛì\98б70âf<1<q=7\90ë}«/ºÈYÇ_ÔS[G\ e¬\ 5Ö\98Uw\93»¡Ö\·¢rÈy¤rhë¢\1cW*­\1c×~S9n\90\85Ê\11\8eüüf6U:Dº~\ e\9f\94ÝM·a9\12<\96r}\ee,ëXÇ, ò°éÐϬ\11×o\98áñOÒ@.\19V_\84¤¤û
+¯éøÃÈië~ÞÕ\ 2£äkÔ§^Qw£NC­Ù\93\8eÊA\9bè§Üz§X\111x#_VÊE\ eË\9d\8ctßíi©W×-Iç×uI\17\8a3I\17ù\8føºñ¹\14×P|Ýõi\ 3^Jór§\15\v\98!\15\9dÖ\ 6Ñ­\8f,òfÖê\90úò\90Éê$6ÿ\86Îi\9br%Ñ\82ØÎhÔ\e\aj-\aA*\97ÁQå8\15(¥éj\9c""¶$_\16EMV\88¢%Ý7Õ¼Ô«t}Igæ5ñu8\87bÔÌ\ eEK4\96Brí_\ 4G=g\ 4è\95ãù8Ú\7fw
+ùx\18tyÏFv¼ç t\8as\91÷òF»º9L'~.\82ë.Ó\9dçs\ 3>RÌl´atrÎ`êÁ\1e\99ãß\8aäß\1eòõzxÉ×Êê#+\83Æ[zàÅ\8f¤;NF|Ãþ÷\12,1Ú\87¤hÕÇ\9c\bø\85$\8cÏ;MpÆ\90\ eUäg´[ç½}·Ç-\8dmÌù        yà\88u+a7\95\fËV\98V\9e¥\8fhÈì\9bÑ\9aÙ·j\b³o»N\8am­Â\87î¨0W~r·Ó¶\8aöO\87ÖËù
+¥6Ê\aä7\9d\90\9e\93ÃS2\ eÕ«8LØ\938¼h7q\18jO\11ì©\97\90G\93·\0¯Ð\f?k+\18\8fÞE\92[öt\96\9eÄ\91hÏd7Ë\85ËVJ÷oÇ\18\96\91\85´\98{uÂðÞjG\9f1æM·V\ 3\9a\96BÉ¡nʲMu\9eÎ\9aR#\14NñÊQêЭ\94»\2ðÊF)°µ¼\903\11]\944¶¨\92\8aìµai°Í|D»Ø¸\vÓðg²\10²ñnÏ\17ÞQ\8aåøÄc¹ñ\95+M{÷t¾;~³\95Å\10°\8c¿D\98\ 3q"\99úæÍ1|\97Sé³fåèÖ«éS7kÜ ºé²\86RoÅ\r9Ц\ fÒx\v\19Î-bd\eßë=       \eº.\89Ìl\89\10v6Ê\116\ 2\ 5?«¹ËÊLÉJ\8c»©¯Å\87 
+c\8c\90µe\19\16ÇÙÃ[@\1cùÊãúñÈ\95\8eÝNÅ\15[e\895Ë,è=sð¹\13Ão\88\v\88_ç=-\1dÄ\84º5rYª+\94\bJM\86\1cï5r\90\87ó¤ÉX\15bÔ¨u\bۼϠ \b\98\17ÜÍÇ\b\8e°¶\8eÍ\8fç*VlUb¬XÖ\13¬\18\88\ 66_/Ê>ôÿÓö¦\8b\8a"ÛÖè\13Ü\87\búV\ 4{ž\17±\ 3¥³AQìÅöÏ÷ô7`eí¬]§ê\9c¬ªÌú1VÉ"W\8c\981\85\88Á`\ 6Ñ\9c\94/ÙGSFGn>òCw×b:\8d¾\99¤\8cdQx\83\98=EzÉ]ã\9cé\1e\ 5A+ïbª\vÖüùâ,ù\14?]s·½³ã²âtÏ>ÎÎ\99-¤Ì\eó\ e¶oÆZ¼atê,Ë b%AÏÏ\93\ 2]µ®áj\8d&Êñ!åòú\9c¢ûÁ\91ô
+
+Nv\0\9a&9Gë\10~Ut\b?ûz\12\9a!¹©Ò\8a,ñ¥`°i\14\88ÀÈg\8e«I<\95ËíèD9K#¢k\8f\9eqîõ¼Äà\9dzÏ_\ 6dX \89Oy[\97Ó±þ\82}æ+K¶`U6\8c\8dæ·\fZKútu-\1eibX¿C\98\ 1Ê-\9e\89âq\8aöáµØS&5²\93»«$÷ÎY\84¿ñ\ e\84Ò\81·Ý8\7fL\11ñ\98ÚÁ\8fG6´%à\83Áþ\81\ fZN
+?nr\8d¨ôvñ¹Õêy&ÞÉe\12\85~<i\9cVtôæ^Ü»W\1f\822¼\b   ¡¶ç\82ËËãr¼ã²2\95\9f3e\ e±é\85\82,iâEyTS~o)\ 6ÁCI\95ôæ±+ÙéUÞ$/¨8á?7<¡\18ï\14¡¬[U"ÞZ*ø)Å\9bø \18ûxb\8a~ ,\12ص\90mbãÏÁÀ&`rÁ&ÈP®)¦ZUòëA\11à\8dZ®³®åÒéq1,Ê\90p\90\1e\19½i\18çû\85Gl°[\9cùt3ás¹ÎÕcåz\7fÅ\94Û"\\94Wo0¥\9b+\87ìl7.±Ï¬6\84òØùD\9f ®DÜ\15\9fø©YBñabÆA¸%ñÄ-VÄ®óax±Á&Õ\93\8eeÈô\1a½¯Ý\a:mË14Ï]*h\9e\1fiÈë\90< /7\ 6\8f\11ëbe0\9a¨2VHU³}$\91MMù\8c\90À´\ 6)2¶\a\84ø\86»óתqæ¦\80÷Y\13Û{\8cCõC£2]ó©9Ÿ;\9bä¯\96Cô+ó\15~:¬<|8;ìñdávÆn\0\7f`\13G\0X¦R¢ÐGl&¢ÓÃ9\8fæ\a±\ 6¼ªt\87\88\ 5^K¤8o^\11¤\ 6\180'õ"¨XÜ\10à¥]dQ¬Ø7\ eT&\95|9­Wú\ 5Òæª\99a\16Ë$Í:\15\93È0cø»ö\89\r\93\9fà\9bZ>!}\16\1e½l×]j­Ç\96d·¹\83\14\9dÕ\ 2?Ç6kì¦îvXæ²Ú£³´\15®\bÐü}sCÞÓÛ\e±
+\ 4\8e \1e\:Ï;í\14¨ò«2À\ f\94\ 2ûbÚ\0\7f¦Ï\0?\9e(\80\9f Uü\\18\ 3|óÞ\ 1|\8bÇ LKÅ×\90êå¶ú±\1c¹á\13\8eyãÅVS "\1dº¯~øë.\b¸é@9³æ$~`*ùõ\96¦¸ú\9aÜ\91ì\8a\ 1²ìîVx
+?{èã³ñ\91\ f¯ù\b*6ö jµÏ\80(i\ f\bG\14\10e\8e\85ÐN\ 2¢ó¨\ 2¢\eÕL\81?¯s@ô:\17@(qxBíX\ 6D]Ó\ 1\1f\ 1!W$\b¯ºìLÎÝìþå\96Sù±\99\92\8eÿæ.§Ú\1f~2\7fÞ¹|spùRõë\9bå\8eb\17-\8f8\98±ðU\12ü|}»xªr[cÙÕÛGì´å\83E]Ý\ 3âÜ>\0âm]!\9c_\80ø\b\ 4\84v\f\90ô!\vH&Y\87`\ e\ 1ÉÆ\97\10Ü\e ¹\ e\ fHL¨A¸\19\80x\98ðß>×\91\98B\9cäN\81jÌ:\99\112(%\8bûnRÜdg\9cp(\7f\88H·á\1eÕç\83-^\95ë\97ªß.­÷¤\90ëî\bi\98ßâ©\1dë¡O¸FFlïà\83Út¶\ad}~\ 2dÿp\ 5ä\f\89ö\8d"WY\ 4\90\a\8d\81p\10\ 1y\14\v\10&-@\9eÀ\ 4\82â\ 2òL?\0¹YÀ\8exj\13\90\ 1ä\9c|\ 2Rgàɺ?Ìí:\8dv:KÈÅDU¬$¿éå\19\94äo\96\12N Ø÷1x2ÕJçFm>ä\99\14\16ë#!½&\aì\8eTöè++ú\88#ݶ\80¼¯|@a\8f3 bl\0¨Læ       ¨®\8a\0j²"\ 1å¼y@Í3)\b\93\12\84W\17P\8bÚ\14ÂÅ\8b\ 4âeï\r¨\19-B¸u\05pV\80j5?\80j\8f+\80*\17fY)/´\92\1f\86\91¥Æ(\93ü.\99sO®\83²hóù¦éUçNÆyìJ$\94{(\95//¨©õÏ\b\9e`\ fQ3\9dÇ\1e\92\89A\96×ú\1dÐ`ò\ 64³A\ 1]D(@·D\ eÐfW\ 2ôz\9b\aô\86©CP\ 6\10\ 2\eÐvi\ f!@\0íh)@kE\ 5Ð
\ 1ºvÇ\ 1\9d¿T\ 1]8\87*GZg\83f\12\9d\90ÅÈe\1e\17\ 6\96ÀëÔ\85bm¥\83ÓÍÉ\1d\90ÊGy\11I,÷üRË\8b»u\0V\83Ö\15Ð\89Ö\rDçÐÆò  èã\ 3\0úÅâ\80!ó¡\19y\18\8b\91\ e½Ä²\80¹×*\10ì\ e`\1e\84\ 6¡·\ 2Ìáv\ 1̱G\ 2fMå \G\0Þ\87\ f\80\19+\f\8d&`ª-/%\v\8bF\82¸¿\8ab'UÉ|YÌåÑ\93eH³I\92ûÃ+\{\12I{\89b³z\1d ó\0{\7f£õ]\8cÖ+\ 4`ü>\ 5\98`B\ 3\96[²ß¬È\9dx
+°v§\0ØË¢\ 28úÓ\ 2\³=\82°³\ 1Wd·\10¦OÀ\95\92áJ\1ap©m\19p¼¢\ 3\ e/]\ 1û\14àß8!]Àn\98cÒ~z-É}\90\14\173ÜkÖ\16\99ºrá©ØNa\89\94ÌÓXa¿%\91\85\7fã\14ÑIm¹o:ô%\11=¿ù½\ 1ù»ú\e\14\ 1OHuÀWG=Àk\87Ñ×æw1ÎÜ\80\18OÞ@\fë\13\80\7f\80\14à\ fF\aðÇÒ\1cðëØ\eðæ;\ 3øÑz\0ø\8eqHV\88gT"\9c\7f¿*ü\83esl\95\9e¥©\9eù\14\894a|¹¶ÁÚ:ýFë»\ e\1dJп3\1e\7fy\8eC\85\95\9d·¿Ù}#Õ÷«Øp+ªË!ÔOs ¬Ò[\10\8f-® \9e\8dc .\8cã \1eç* N®&@8\17w@ðb\14\10¶X\15\b\13×\0BO½I­­Û\15Rè«þUê\84Ǭ<\91ö¹\fV\1c\ 4\19Ð.Ô\92Qt¾ëÐQ\r\8c\88LÄ#\12\9e¿;\8e#\85õ{\9d\89Èî\ei­á½Yl\ 6û¯\1då¤ø\11\aÒ´\1a\aR\7f#\ 3I-ö\81Ô¸G\ 2±$ëO ±9  H¨Ð\a¢\7fX\ 3\81¸zpûÜçtoÑ[9_#nâ¡\82Y\v­\ 2:Y´ø\8dX\14 \88S$©~÷\1cÿW\9d\89°\99?\16\18þmg¹o&ßïþZé-\81¤Ñ/\82ä      t!\fL\90ÜÀ\19QÒò(\90\1c«pIÔ-Î@²Ê\ARX²±\9cç}\15\11      çi£É°\8b}.\99\ e7íoÅ9"?ô\1fäÞ¨ÎÅoe\85¿iÎß\v\vG&ãï\82ohòýªêÐ\9b|\95\98\88Ê9DÖÞ³«|sõ6Î>ÈÈm\ 4d\92l\1adØS\1f¤\83ñ\ 6¤\97e\1c¤§\9fì\1fäÓGi©<\1e\9f
+ î\vjO\a\8d\ 5ð\ 6\9e¾µÏXh\80¹¨Ïeå\14Tºõ£A\17Û\87Ò\9eíî\89áMÙyY«¿õeuà\1d\91'­JÚ&åIÓµÎK\96k\88Übe§èÍ
+Õ¥ã\920\vÏ\ 5=o\12ó\ eá%\1d\85\95ZöQÉ\1f£ê\a¡\132Ü+,ÒP5¯ç\9d~'\9f\86oðG.Ù¨\ eê9eiëhë°ý"öÜù\8dËñ´óÒÏǶ÷>\81Í\98\1cb®!ÄðUéò \97Õû\81Y4Þsnî\95,!\12º\163ÉQH-å\bk+g\ fØ\99l]zVÕJ\1dWm3{]©\86\91¹Íf\1f\9e¡Nå:­á\aZw\9bë¶Þd=?b7>Nøm´\15×à¹\10\9dH;\8d6¹:>kDøêb´ÙÕ:ëIå\15:ôª\v7;®/hCïÌ;`1tü\8a\a´aY©½²0³ç\9ak\18©ÚvöÑËûYé%\9f¦\8bb\ e6\8dÈwÝ­æ^:íæ\11ÍkÖI\8dÛvù\89\12\9b\84Î\94ñ@2åÑe|m\8fR\8f¸6Ô\vº7Ì\812>0ª#e Ã©MTIVqUnÜóFþ Ú0,òòF\85Z#ÝÏ\fzm|ö\19\19:\r(Ý--\18\bOQobBx\15Ðée¡<ñÛ\m|T\88ÖX:\11½/·l0ù\8c\86ÙG0\19<g\9foVÙ\8f\83.Ô2Nlú\8b\ 6½ï×èìMq;\1dD¡÷\v¾×\11?¹®?®v¾¹da\9at\8efTÒ(²ÇF\e\82Õ°¶óR\8e\1a½Á\1fYP§Õw6\98\bÛÄn\94:OV\83§ÞÝ\ e
+¯Ö^µ\8b­³ZF¦O\bg¸Ö«ÞhÅmî8\85Þîâ=¯{Nö¸Ã!ÓõÕ[ø\8eGW\91ÞåÎqü¨u\ 6\19¤Õ\91\1e¬Ò\1e\17b£V`'g-½Ü]5\9fËå©)ïcÃîÔã\8d2ÿª5ÐÃeY_\fi\1eB/[¯%«\99ïE\ 6¢:\b\13¿ÙÜCb±pQ\18        \94\1f÷;Ça®ß\91nåI{\9c\95§\10\ 6\ e\ 4oÓN=/û\96._οU\1a8>\e\9fÕ\1d4Êô\15k Þ\8bª/º\18W¯Å\98x\9d8$Rµ¦\94Î×èK³Zí¤ÇÝHR½\1fµ\8aR\10ÜpC´[yP¡Ùr\ 2?ÔÊ       2q,'àÝ9\82¨È@¤\96G1\8c\14Þ®¯t\94vê1­Ãõÿ»Ø@×£\\9dØ©¥\9aÛ\9bÕkMÁjÕèãF\89\132\81\90\9d¤èT|-¶¬(Ùä¦"<ó~ùhTNå\81ܺ\95\13 ÿ,]\9c\19RJã\16Y\fV\87X1G¿Óòs\9b©Èrl¢\16>Gl^°\aãk¡\9cLp\ 5\ e\vè½~\89\ªéå+\ 2­C\18\96WF$AG\ 4!-.Uå.z¼|\9cƹ²ôæ\85Ò¸Ä'Ji4\9e\86P.\14\83\fÁh\16uxºü\/TÙhycYf\8fÓÂgw\89,#vï9/\94ãÄ:¿\18\12»|-)\9dóÄ­ú̹\9aAäè§/d=S(d;EKÉò¨8Ïø\8bm\90ñ\97ëTFi\ 4fÆwG\87\b\86Ù 3\8f\9cÆ\8dÏâ,W=Õ\97ÊÒë\15\8a\85ËF\93E
+vgÿ)\94ù7\91\1fô\97|Z\93Øx\9e¸\88I\bõ|Î\1dwK¹fzXËzÓn#ÛÉ\ f;Yî=íg|k9Î(¥ý,\13G_óôqÉ{éA½vI]6ãÐ\12\9f\1a·ï\*Í×
+É`\1fô\93ºª®\92ú \8a$õá´\99ÔGe;\19\9cõU\94\91-}6mÔ\9a»v¾t­\97ã²ì¶Èü\92¿!¹¦U|d½ùí\92ídÏ·\8co\9c\9f\19E¾}2q\10\84+\82ßäS\81M\ fª)!\9d 
+\89ÔÅ­fRãf»\90J3j9\19lg\8d¤Þ]u\13ÏÃf\900ÔÇ4!'Ä¥ô¹v\ f\92=Ù¿¥r6\1f\93Ðç¾,.ÌÚX\X\9c/.ìRB\8b\98i\12\ 6ÌYWñ½Q\ 3[\8aµòÉ{fdsþ\8aåáú\82ÈƸú;}roA:q\1d\9d\87°O¥ÅÏ!\19l\9e§¤Þ~^\92\13$\9e\ 5!\8d&\8c¾L&d±ÌHöHæ¥rª\19N\a%4PÒâB7d±\96ój"ñúôâ®%MâÍRo\1egÐÃAð\96\ 5DèÔ\ f   \81§ëM\81g\188\9d\97Às´\fAëµ3\88¬ÖXvS.>ÄA2¿\ 2]&Û\85·¼ôðD\85Oq\93\8f\92\80\v\94C¢Xòw      àÛ;É!;;©Ü\92}     CÒ{q¡Å\ fb-\9b¾\88ÄS¾Ç]£ö\8e7å.\1a\90\14<Çä\84Ne-
+<~ÏÆ|\97¯Ä\94\13\8b\84?îÐÐËÁ\ f4õÆ'r\ 4Ã]N£\ 2w9'\aÜåBúÜåÊ\v\10ìRÓt\81Ré»UY¶¸´\94\19:ªö\9f|L6÷Dñ"\9c¤\8aïùb}]ÛÄ7\bïÆ[=l\1do À\8b3³S¸Z\13¶Ò~'ð\1ds\17Ûcæ!¦,\97\97X¼¾½ó'\11N\88\a\17\8aà\13v\86ã®åV\82\9b`f\81Kï_Mö®æFì´°X°y \\98\97³ \18³\9aÊA¸õ\19ùÕw\19ù=¤\18ù\82\853\9b\ 6\9e\1e¶ËÉ­P(T\89W<\e{¿É\94Öbß KíÝ$Ü¿\1câ\9b\13vU°\12b³å<Ö¿\f!xÓULL÷]þ´¬¸ü°^ÙpW+³å&¥â\81ËpÝ+{÷'OvªÌ£%n>w£\99×\9b\8a3æ¦\92c\8am³Î ilH;÷æ\9c®L/gjù\91   \b\9f\1cUwÔ\1eEUcK\8aªÅp\8aÊM\13µ\8d\98i\16\1fS?\v\17hN,#¥vDræ<^ÒÜ+\ã\9bµ\1eÎ:\85^\95YÇÔÂrÁ\9fÇ-\9bOîE\93ÓDÊâ2æÛæ2#|Á>Ø÷\92Í÷n.ó\16Þ[Æ|±G¦h&o\fR¬¼é92"èÊn\17£VÂ#MÕO\99*E\99¦JnJ\98M²¾\12ºí\88]\1f#\88\9e¨g\89\9e\94U\88\98w^\11±í\ 1'zl+Yí±ïºü>\e\99\1c\97éóé\94\13Öcó\14]\8c»Ä¹âÀ\8f©³»Ë\8fÆÃ9§õc&û8=fl\81ÝÌ\18«ªÍ\98âS\r\9fß0\881²éy¢çи£®¨Ue¶¥\1aøêHQ«s@nàm\90l'J\fÉ^µ\ 4±s\1e%¢WÍt  \81p\fB\88Ë\a\\1dn1\\1d5Ó¸\94útp\89\9f9Øù \ 2\\12D©¢VwáÞD2ÊuÒÙÞ¡ÅG\92¹´\90´GÜË=Ï\91\ 4Í_¤\93Ëiû\8aÃÎθÉ|ØÍ\94A\89¶FWåÔ\84ƯÜ\84jdè)¹\99~fd»\80Z$GK+bç\95vD¯Ó;\13½ñ.´Ä\13B\ 6%ð#^\15que\15põȶqiÐ×±K\11ÛbcdüÁR\v\1e^,rF\1dÕÞ©\19ª}\92O4\90αòÈ\98U\vD-\97\8a,æI#Y@%ÂS\1fqní\9fb\ 3!·ã\82\8e\13~=Ùg=ï0\9fÖÛdЪ¦Ó\84\9c\1aS\r\87\1e\93\1e\16\8cH®~Ñ\88ÞÆ\9f\12Â(°ðcê³ÀÕ;½Á\a\84KËÑ\1d»ô\8f\18vQ\ 5\1e\e\17Ô,\96ú\1cêhà$Gh.f®\90ç1Ú\ 5\v1\ 6Û\18"³¹2øì\ 2\r|\16»+"c#¶¤]Û\95<m2Éô¸L±      »Ç!b3]½\vqÄ8òã&³årØtÅ\16ÞI\87\ e\ 6]}ª:Õ¸
+\90bú3"üº?"\84÷Q\8bäî\92\ f³\87\vlìâ\aslÜG×XZä|4xWo¨n\8d>h®}a\90\17Ï%\10¹_-! \7fè\ 3û\93w@ÙÞ_\0Vé²\0Ë2%\bþ\ 4`ñ9<&6Øbá \94rÜõ\1eª\1c©à\8e°      \98ÓH¼Ó\97\82Ø@\e\1f\9c5úÝ%c\8fb\ e½èm\fÊ\1d´u\8a¾f5\92»\7fÆ\84R\ f&øÀ:êØ\95;\1aXZ÷-T\7f¹\ eòjy+Äd/[DöÑ\13prB¤§\95_5\f\1d\ 3ØF\92!X]\80y\19\eÂý
+°­Ã\ 3l.W\0¶ ¦\0Ó\1f\ 1\80\91\8aËe\89(eã\99}"ù\8a\1f\98h)'ì).à¯\82rü½T^\8a\9e\11еêΤ\18¦ª\93|\86\9b\10Ê\8aÐðÁù¢á  \ f\fú±\91×ia!Ťn\ 3g®/\0Nèk\bÇ\ 3ÀãÒ\ 3Â\0\87\10Ä\ 1.\96d\80ço
\v]\aà  æ\ 6á\14\89)xR¯\ 3\9c+\98\0ç3/\80ãH²@¦\8eÅLB5¥È\r/2ãù'r\97GÆröU¾o\19ûÝZÑ\8b\0w¨5±³Èζ:%ú¸¤ã'\15òLÒô\fˤ\9e\ 6ò\8eûa]\ e\ 4)Ú6Àµ1l}î® \ 4[\80/\843\846lÕ?R\0ßK\12\ 4+\94¥cðë}XÂ.\1dkw\80¯\19Ø\87\ 6¸5\9b\ 3Ü\9e¡\0\9fÀ\19Ð6>.¤îã\96\98Àæ=
+6\13ïò³Od0ç¦\89Ü\815ùë\96)\9f».Mêø\9cÜ6ç\16±\9f´\rütÈÎðdC\82,m\1a²Ô\ 3\13Ì\87\9e\r\b\0\82½¬\0Q¢=@´KG\b£\0\82\ f\0Ñá¢\97Ë\89\8e\9aúM\99n\r\ 1Ñ\ 3ðü\9eý\ 4\99\0D=Õ\ 3Dþí\ 2BzS\80H\9cªÙ~²\9cO¾ö\99¸¸v³äïôò<#\1fY°Üoé娻¦X\12Y\10\a°r"\13ùÄrðä¡gcYº`!\1f\8c\80,_\17\v\10Ã`\ e\b\8b\86-\9c\v[@¼Û{@\8a«+\84Û\13\90\92\84Cèñ\10ÎY@&ò\r\bÛ  \93å\r Sè\a\90\9c\97\ 6$6\8aTu\12¯ï\0ñ¬ó\808åÚé\eÁä\12Î\19\17â;@\7f\93Ì3ÕcÀ¾AùÄTúW\9fÚ ­\r\19\15!\81Ç
+Oe6Kô)õæ\88\9dÎ: \16ÿX\80¤è9 ó¥5 ëj´o\14\9c\0¹¼A\96\8fØ\13P±6
+aÎ@xK\80\12*E\bë\ e âé\19 Hw\a\89\ 2ò#ä\0yy\8f\ 1¹]\1f\09_
+\80\\1c\87Q\15s©~;ľ,æ¡Ò\14¾±òÈ^î,Ò\95Ï4µÙïÉ^­µ%¤VÒûRË\ru·FÊ\1du\ 5\16\90\ 5ä]Û\0\8aßù\80ªàg@u\93\ 1 \9cnèC^\85\95HÞ4 \93I\ 1B?\ 3á\14\15e S9\15ÐÜÂ\ 64\9f:\ 2\1a;\12\80Æ-Ø\87gw
+¨Sî
+¨M:    (»:\8d
+\99\8bíì*\16YÌ#­.ÒËéÕA¾\92~êz\8a¤r<]ì\1eP\93\88ù`ÙY}ÉÝaq\91ob4u\84\8c\92gȨr\ 5´<¼\ 3º¹\feÖ7dyÊ0\80\ 2`j§4`úñ\12`êÍ\16\84ã\ 40\85ì
+Âî\ 6\98D\83\ 5L2V\ 1\f\a,À ÇÈ;Hïí4 \ f\ f;Aä\87\99oUY2\1c\1dIæLõ꿾Üå\83=vÃîæö\8a\16\v &Èá\e§H\8c\1e\98\ f@\1fOoÈ\ 4\ 1ßT_%ÿ%³F:´?e\ 1\8b^EÀ\96ÓYÀÚã\12`/\97&à@v\bà\fÀ\ 2ì\r÷\ 1»\e~\0»\88I\10N-Àö\8d%`\e
+\ 2X¹T\0\9aKô¦\9f\8d÷\9e\a\91\ ff\1cË\96k
+Amc§0\ 5\88a§óÆ\1eùÄ\vEv§Ç7\8d\15§\90o\8cB\1dúK\82\8e\fÈ\91Ó×ãÅo2«ÔL\ 1Nµs\80[}*\80\1dÀWWCÀ/b&\84a46¼~\ f\0?í3\80\ 2à\e\8b\ 1àåÞ\ eðÉ\12\rx\94­\ 2.xÙ\12C-\v±+XIQ\rsºÕRhâÜ\ 4\ 4öÄ\968²(\15Ño¡\8a8E:tH'Ô\9f#\1d:Ò|W^\1eðø§\bø,Wþ\9dðû»RÃ_\9aoq\ 2\84ü>Ôzs; <\16\ 1\10\8e\f\ 1\ 4w\9c\ 4\82É5\81ÐÚX@(õá/ÒE \b\8b\8cÊ\8f£\e\8fûý\ 2÷ÆW)È\99\13¿¬Û9Fæ\91Úyû\9bW;*Îñ]\87þîï\8dtÕ° Ãï\9dÆCí{uáÈÚ\ei¾áÎr_º¦|     ­µ½\17\90ò(\r¡\9a\0\92\ 2\89®O\80\ 4H\1f\88Û5\ 1Ä^'¬)\\98\ 2±\8e\9cb\99S¿Ä\12Ò.G\1e-!\85O\85 \85¬ðÎ×ÈEA\8b\1cÚßåÞï¶ã¨\9cCD"*1\11i¾_ÂsX]"*\98\eɬߵÞï¾ÚHa\1dä³ ùÜ×#kï)=\ 2ɵç\82ä¨ú\ 2É2\91\0Éô¡\a\12\8fá\1a$Üø\87CwÃouD­\1fÑê0õm\f¿\ 4ò\88X¤õF\ 6è\88NÄ$R\9d!\89Hîþ\83Ïø?&ßß\15v\886\8e\8b¬½aéÞ/Wï¦Ó\0\19\15\ 6-3[¹ 3ÈÜAF>ð \93\9cÔA:\88\e ½\bn =ÕÃ\97\97÷#÷é\97|Ú>\ e\ f\ 1Ý»\aAÃÏ#7/^$oÜ°\15»
+Z+y\1e\83döhPçü¡ä¯J¾\9bl\94w\9cAW¶\82ý¬yÒÒolR\e»µÖ9£ë\1aqEY}\86Jøªü
\9aÚ\920j梠      \94Õ¼\83ë\aG¡Ý§=\88a¬uQÇ%+u\9d\12·\91Â\e\15ùP¿äÓÆît\8eäÓóè­­¾$ÊÐ*ë»\92lm{¯}8åð\ 6Èzá\rPÒß\8cIìì\1a1çº\¤ó·EãÍ>æ\1d\14y;~õ\83|m"6`\ 2ʺt\8f\8c\95:\1cc¦.ù¢ñ\1c\1fÓFá\1eÈ3»\80Ög¨-õ§Ä²jèMj¾Õ:<\15\8a)\13¿ÿ\90\15[\8d¥û}\13i¨ýE·­G>Ô\88àoÜÀh­Ó\85ʲzK§ç\9cm&\1caiæì\ 15\95­KÛ©YcîÔ5õø~`\14næxVzN¦Ó\85<\f¿7SÂ\19Îõ&Þ_i^£µÖ8¯¾\9dø\9dîa"ì»\97ñ@ìÞG\97Qÿ3J\ 53r¨çvñÁÓ¢ä\81\8cÖ»ª]Û[*ºQîýEçXï\13\87Ô¤ëë\8a\ 2¿/¯V$ Fì`3_ådÃB­_"/:í=¢j­\1aç\1e\1f\13aë¾!¼ð\89°Kóãc¯\96\18\8d\13\89ôPÏ09È\1aÈêÇz\95\8cÕUt     ZýE\9dìõ\89\r¦*n\9b\19+´Ï\84Ûºõ<%íô¸SyÓU\92Ê©sÔÜOGz1±ö¸¨\14ÛiT\98´\82e\e\8d\8aÇ6\8d\ e[\8aê\vDBj´§Y´aXÄ.R'#\r5òN*n#5U\9atc\1e5Ó©® h;\b\87K\8fÛ\9f\1f]E<\7f:ÇÑ\ 5ëHÁ\91l_ô\80m§^\97X+0\ 31²Ê6\9fóO®iÔèRã³æê\r»Uè5Ð]{R\87Ë\87E\9d8±çZ3©â5:`â\fUo\8aéÕN¡FV¹\8f\11\8fê\v\94\8fË\ 4÷»"\ 3¡ê\a¹Ñã®pJw¿4ÔÈ\87úYÆ\1a\r»\9eéB¨«\10¦\1a\84\93Ý@7§å÷J\ 3ÿ_T²õt¨Ñ§û¥ê\8dÀ½ÚI\91ï\8a¯ãHEÉÅÈ\8aðÊ\87\95\ 6êÉr\ 2\99Ê¥quß*¥É´^Ô[\86WÌqÒG~ú\9f¬ü<ô=ùyÌ Q}\81¨@«î\96\88\93Y(w\87"oK/Ô«õE«\9d­5\ 54\19\15áÞ\14ËÇé8S\1eäõ<\ 4·\ 4áÙ(\ f
+B¯t±\85Ai\NMJi¬0+êõ\94YÌQ\85¹üÜT]Ùh÷v²Ìi§\82­Ì\82\8dû \80\9eQ:¿\18\95\92y"\98Urî\94\1då\9ayg\93£?\15$ë9F'ëÍç>\84ó9\82È\ f\1d©äM£L\95jô!HDÞØb0\1f\12òÓM¢²ÌàHÁîâDÔL\8ce db\10ê\12\84\80\1e\1c9_\93Ìr\9e¸,ë9w¼mç\9aé\93\92£ï÷aÖ\9b\ 1-Û)0f\96û¤\97\19¥,o3ql|M\1f\97'$=h¤\85t\82vË©Ë6;J\8d»\8f]$©öÞ|*-¦µÔ¸ï¯#\88\86»\95ýä+\11ËÒÅ<Ñ\90\e\ÛÖÄÊ=×Lá׬§\1dÎYî¹¹~ɧ¾ñþ|YO\95¢@B(q\99\88§\8fó^22ÃVGÙt\82Ð
\8b;¯¤Ò\8cUO\ 6ÛM'©wo\83dN`g\89籸L\18\83é!!'^oésë
+\92­cU©\9c3t©\9cW¯R¹ð¨Hey9\83°þÒËë5¶\94)'D&¬\ 6'\ 3\86Esî¹òÈøÏÕ9=è
+»ÔeyÙ¤ÒÔb\9d\f\9fÔÛÇãoòéó\96ÌñÜ\vB\ eI\18ý4\9e\90E\99\96\1a/Ù£\8e(\95S\83\94\84\ 6vA\è~U¬å>¡¯S$Þ©qܵT'Þ,\9d÷q\ 6+\ 1Á[Þ\12B§Ño       \9dfn.tZ:'tÚ£¶àmnÃæÓËTª|ã\99\92_½%\93[×W Ó\17ÞAj\92)\1d\13¯\91ë%@-·\94ì\13æHåÄÉ\89\94Ûëu).&÷µ¸Ð°-\ 4~/Ö²ñ\93H<Ó·¸kÈÏxS.\7fâ\fha\82ç\fi¡Sq\ 4\81Ç÷©\98ï\ 29¦4ÓÍX\9c\19\fùãöâð\83\1e\9c\a%\84\vÁ'âZ\9e»\9c3ám\8d»\ÒgîrmføD\92h7°Ú»\NÜõD¡"wél,Õý¤&Îì\9a0­À\97*5e#ÂÉè"Þ\8a\99\96°-T\fÁûäM¡SfM\81ÇX\eBr\11ó\97ÉUL©g6±8U\fÕAþ¸©\1cùA»uå\13ÜðÉ]ü9Ê\8d\95\ 3Í¥E\d\83s&\aÁi²ú\18\e³¹tgÅ<ï\9f;ó|,\ 4Æ0JuÆ0\93sÆ°Z4óüð\85Z\8bµ\8aÅ©\95\13\aEüG\87ÎÏJg©²Xìâ\e\84Y     Ý\95ãÄúvÞàOwDç\87µÛ\94O¬W\10\86ó\19weg\ 67ÖÚ3\b\9aÍ\ 6OuÎê\86æ²ú`¾es\89Ý\91y^o7Æ\98Ãõ\89\­Ò\f f¡ªNÛîM¦Ë­L\aÂÖ 1N>P\8bÅ   §\16Ëq\8eZ¬ª#jáöï0íÄXe\7f,\15ä¢\ e\84l÷¼ÃR\1as{$\901q\14)³é       ÝÇ~\11\13ÇE\93ON\91)\97\19ÎÆì\83\1dM"å¶Z\9d°y¡¤1/CÒ\183AC`¸)\ 3º\84A;1ΡË\ai\ 5¡±£1U=QKiþ j\9f\ fN\91N*\ 6ÁÊ\93ë\1eÕ&[B\7fJ2'Ì'¶C\13#¶ít\9aØ\96\82p\ eMlÓgx8¦\11\91Õ¼\807M.£¢#$\99\7f\8cn\91¿8Îîâë\98*\99s>¹\8f\19ìc¸ÒØü®=b\8a.7`\10\99\18Ò\15;\80й\8ch\1cóÇÔrêN¨z~¡QäÛ\v%Urm\1d\1d²Uzºd«\93=\90\ e\88íÞF\88í\83\8b\11ÝY;GÄ\1a·6~`\8aS¼¿=ùx\7f7Áq±F¦!¸]\Ì«..\16ªhir÷3y¸Øe£j_\91^.R/#Ò¡\ 5\ 2¸ü¨\·¹Ìë6eÞóÞ\98A\fZ¥+\9f§J­Òn\9f¢úã>¹\11\a*ÙÚ4U\92-É*±Cå!\84\8eFt\17c\93èúÇ\15\11ë£>~\10¥+Þ\7f\8fQ\´\8e<.Ú©ðî\89\9d;V\13\eÅ(\rK\1e¦[\14\10\b×\14ª±µ\16ªqÒ\ 2Íø\8fw1\7f\1e¤rì!IGÒ¾4·S\97x»¥ìb\92´^r·{ÑfgÃÃ\94)      ¥\11]M *Õà\17
+¹éë\91É\82ÝÀ%â®]î\13=4¡\101\9dQðþó¥à*\19\1fáâ©<\830\9ecçáb\ 3ásÂF¥ì\vK¡c
+½-.    Të\17*hVÜ\f\91Ç%ï"³ñõ\85\142}\11¼\8fX\1dÂ1ÚùÂ\1aÎ\9er      Í%²½F\8cN>\11ü-\11iá"ôæò\96\1f\92}R\94ÉXsM£çnvD­ì\v\8cáTWHöÝ\81\14GeÈ.H(øAç\15\|¾zØy\8d©Ø¨\85\r±\14K\86       \8dÞni\13\82\ 2\9aí£Ùê3@fk\1eE
\81\0>I¸ú±\82R\ f\94ôÛ\1c y¸ØC\v\19\ 1 Òµ\ 6Ð\84k\ 3\94Õ^\85j\8e\912ªõ¦\12\9fÌù%Òµà\14;
+q\8f\vÒÃÐ\9fö¥\96£YU£ xµ¡hÞë\93íºÞ'v\9b\ e\fd©ÜÇ\ f\v¾\87«
+¯`ç\17¦`©\16PQíú\1a"ÏÌi\84Ì\1e¯)Rpy\a|\9aò\ 6Ø        ý\fJ×Ë\a ó\1c\aáëíUtQèBxCªËå\ 3 ³\96\bP#Þ\ 2(\9cð\ 3t\18 ùÆà.¦GÁ\8eL\94\ e»W¼ý:\9eb\92Ëx\vß]DR9½ zZ¸ÍÔ\90ÜÜ=\95äòö\80è\8d\9a}BHÉá\93B\]$\14ì\12g K\13ë£Ùë]Ed|­\ 2[]\8f@YÚj\0½Ü-\80\81ô\1aÂø\ 4áù\ 1\18Ûá!<\v\0ãT\ 5`¼¸\84p\7f\ 1\f7\13\0#\9a\90û+»\ 1è9*Ê\90ko×ñ\94\1e\9f\11\91\e^P\92ö\91O}î\eÖÈ\17ç_j9a44ªqåFd{\7f\1c\12>¥«\840êôq5H÷°\8b\ 2y¦^|\1fÍ%1\15\ 1øº\ f°\82©\ 2¬±\1fCx\85sh\80\rÒs\b\83-\ 4ÿ\ 2°a\ 2\ 1\98¹\10\0fIE\b\ex¾Ýr\ 16áa\1f\fÀz\vx¬¦í\ 1V×bQ\15ó¤Ñjãb³Ü~D\ 5N8}|Ú°²XY0èî\1c.<(·YÕ(ÚáÆ$·ô\a\84Bé}|\90*C\96¾¬`é\BAsC¦\8f\80î\1dþñ\19\8c&vx\8d\ 1Nħ\10d\vÂ`\ 5pá¸\ax\9c\v~\93¥\9f"ÀÅF      à\122\8cthÉ\\ 3\9c©ÃÞ²é<À\91Ï\b\ 3ök\7fK¤/\1e¼«\96{),*ÈÂ_\89æ\81Ë\95÷\eƶ\92sz¡\1dÌHÕ';\15:\14ô½\ 1>\18\rúx¢=V±ô¢ÖG^C2¼B#`\aú\0ǯ*À³\fdÙ+Ï\0®)\90åÎ]B\b<\80û Bû      ðàB\ 1ü^HBØÕ\0~ÈÃ\7fq¸ÃS\8ekÈx=.\ 2Ü*é\0\1f\17\1f\0ïVò)}\8f\87\13(©æ\12¨ \9céo\92¹q_o\98ò(³ k½³E1\89ö\94Øãô\ 4\831\9eØx#,\83êCäõ\92UàÜ0\ 5rb\ 6\90\8e<\ 1\ 42\98\ 1\82\80(>W\80\18       \1e ¬jäR%,í\ 6á\ 2\0a§X\bV\ 6\10\ eÛ\80àè\80Ðr> t\92\ 4\84\12T\0Q_\99\80(,?\91"\9d\94O\aVd¼#\12YÌ¿ôry¿õ\18¬\9d_RÍãÆ"ùmÏ\88th¼0Ã\93\ 5n\8a>RG\r±âã1¨&Ë#H«6\86´\ 6\1a \86\vÈrýt\0ñ\16V\80\14\eÛoVäé#\0ä\8czA¨\12\10Vño\951\8ci\17\90\80à\9e"\81¸Ýa\0Y.Ô\ 1\99\89Í\ 1)ÄÂê\1dåvTÈ<\1eã]ä\8f\929\19dV_\1ex±¢ZxrÕ°Ð\87'\99\88µ\b \9d\96\ e\83`ºðÿ^O\vr¢£"§_Âï´á\ 2r?Û\ 2
\9d\0\95\89\ 5\80êÖß\80Ún\b\boî7\17²Y\ 1\94\10ô9 úÂ\15\v\ f¨Âª\ 5¨Äd\ 5(vB\ 2
\95¨\8a¹ ö\8dðaqä2ÿ\92Ìqq»£X%¿&ÔÄû7µ¼0Z è\92³\ 1I¡öo\9cª«ßÄè?S}»w@Ëpøè!BDe'"åö5M@¸Ë\80>§[\10\16\1a /©\r ½Ý\vÐNO\ 2´\96ï\ 1Z\89o\ 1\9d\a\14 ¥Â Þc²ô·ª,\vâÉ"\93Ú%ª\19C\1cÉÖî\9bT>;oÀ\92WÝ(h{uý{Z¡ÔúM\87\86÷\96o\ 6ä?\b¿ÅÐî»\8c\ 1\96'ÃRÃM\19°c·\ 1Ø  =\0l·g\ 3¶ò>\ 26;Â\ 1\e\17£\r\ 4Y
+\8c\0söÃ
+È6\ f\98ɬ÷UÈ|T÷pöýü¼¾
\bÁõ\8c\8f×æ       5³ù\ 3¨\8foþW¨¾8E\82¯»}}£\13\16\14\8f*N\84Nߨ\99Hdmß\7f\10I\9a\91æ;»\94\0÷,´\ 1\8c\0_ÃMÀçZ[ÀǯOÀ\8bý\18à>d\ 5p\97£\ 18g\16\0®×N\0®\96ï\vG¦Çs϶MDí\85S\ eÅ+?ðI\9d¼\7f¹¶¿¸\85¡ú¢\15éÐ\91÷8ÒUCõùËsüßÅ&¾Õ\99\beÖï\82ïW-\85â$²öæO\v ¬Ê{ Ìì\a\10\ 6<\ 3\ 4ÙÈ\ 3\81M©@@nk\10óç\18\88M»2\88©\89I,\9di\vQuð¨08~ë8(j\9d+¿\95\ e        MÑ¿Ó¡\7f\93T#       ú?u&¾x|×|#!óû\8er\91Ì\1a\15vø®õ\ e\89°j¯\8b\ 2)Ïq@¢zY ~ð.\10½©\ 3Än"Ò:ÅÌK\ 4¢àv@üÕ^rÅB[¢YÓ\r\94Yôs\7f\84òÐ\14\1dÙ³¿dñ\88S$©F5\85#­7r\1aG$þSS8d\125#û»o\ 5s¿Ë½QÕÜHa\8dÄÕ&"~íË\96<¾: ¹VL\90\1cÁ>$S\ 6\ 5\92\ 4\12+j\ 6\12êúÌÐéÞW\11\11Ì\94í\ 4h}âQ1\13N5²_\83÷¥ÑGÊø\7f¬½_¶çïrï÷Â\12\11\93ïÂó÷Z\ ea\19\87/W¯ff#\997l&2ædfÂ\b\ 3\\13»ì        d\ 6\16\ 12ÉL\1e¤o§\ 1H/\ 6\1eH×ãèÿ\83ÿ\ 1ÙèÄ\90ûF­aÃëd\ 6grî\99¢»>K/ôs\99\95W÷ðÁ=w?£\87Ø\bÐd\àb\ 5Ñ«äF\89\9aRÚ¦À¬\81¦\1fä$\9b\1dI\86\9a\17\8aóuÁë¬?Å\9avJ\95Á2èV¦Ç÷¢\96\82\8bÌú1\19\17\9b\9drªÙ®íêv\17Ü;AoF\f\94¨\85Þ\rõ(;Æ°ÓvÏcrâ3\13Ç\7f\94õü\13\80"öÆq\90\8e\95\97\1dr[\1eÍ\9d ±]\16p\15[\ 5ñIv=(\18}\8f\1fnÖÛµ½ÿø\95Ý5y(d\88î1¨±Ëó@\8d?¯¼\99\ eÇâ¶öJ­{åV·\1f\1f¬s{e\r\1eü-ø\93À\85wÇ?\89ÝÏ\ e\1clæÏb÷³\ 3\a\9bù³Øý\8cÀÁ?ý#I÷o\ 2\a\9bøѤû7\81\83ÍühÒý\9bÀÁf¢\9fð>Á\93Hn÷É \93þ¡\8d\9d\13\8e\ 1\97\87\83\9eÕ\10Ê-¦$\ 6èZ\18¾     7my\eþÆÃU\87xìññÞ¨X\14½L\M\10/t\91,[çkʬ¬¨¯@&½f(ÃåÔ^ÖÌû"{\90éË\e\85\ 1Ý'JNÞ®\97ß@Õª\99EÅ«\8d\1a\89WýÈ\92±&ç\a¥VSÝ\fÚËät\19ÆõÖË\e2­h%!׿àHw ¸'\v\ 6wq\1c­ccl\82\9d\1aafiÅq¦¡Ï²\8c>½½\9e[C²woS©Z\82µ¥úå0ÒÃyE\91V\v\83åãzcÜ\94¾ÎÃXë½Í\1eiÛ[f\99?íêÍ\18îÏ9\90Ú¿÷Çæ1;\98OOãÔpw>>jáó\980ðñ[«LW\82\15þ\18=\90õÖ}\16:ƽ\11s.Íÿ\a^µM\17\847àðËüû\9f¿\ ft}\15V\fÅ\86Û®\86\1f\14Ù#9IxQ\8d\e\1a£kq+ÏÀ\15{\8f}ie\9bÏä¥\13ÌW\ 2\17\ eó[*¾{\ f«\12íÔÆ\89Z-µN:4õH½¶\ f.\93Q¶r\98¹ýÜáÖ\9bétñ"7e1\/\16\97(\96\81\19|iWòÍ\95Qոɾv>´\90\860ÌIÍN\9a«µÜÇ{ÒÁÌý¦[,ÛÏ0\91y嶩\16\9bT\aJ\9c\\f½sp\85ÙìQ\93Jn\96ÕÌO·£?æ²9KÕ\85p±`\f\18\145ýÝ-e7ï÷¶³4<c\81\94f{\98Ú=d¥­\8b\92{éÄk\9b¸\80N¼Îé¼Ù\91\9f\að+ó­¸·êFõðdzãSÊ/®Ã\f\7f\öI\8c»Á;rù{ a3Q¬a,\19\1c\18Ï\ 1\1f\ 64\8d¦ßj\19½î\1f\1d\18ÒÖ\18\17\8d«MÄü¦Gì6Á5Ld@5¶\ 1K\13ëF\92A\83w9\8cp\975\ 5F\87\91²W_aN\8e\8f@P\ 5-ô-\85©-\8bíý«+¹\ 3ßJb)ë\98\92\1f#"Lí\1c\8c´=È÷Ö\ f_n6ólÉ©ûÝjÆï\1f\e\82Ù̵I­»îÍ\84EZ=\ e®Ë1é\ 41Í¢§\83\9f½À\9c\9c\8b0D¯ð\822Çãô\12f$õXe\8b\1d£¯Òú¸ò\a\1e_\1c9aF\1e¿¢\84g'ü\1e\19%²0-ýúá    ª\83£ö¼\9907ûÞ9A½.\97\ f\0sÝÖÆÉ[+õ)\ 6\94Ô\vßd\b#8¼Ï\93]óQ"¯kxµ¨\9d\9e³\8bÿü\89\81\fïç\7f\12Ë\9f\1dÈð\9bþ'±üÙ\81\84ÍüY,ÿ2\90{9¾­\9eý\93ö¹ð䢳\7f*oøeÒ»¢{\9ao\87Ë{e¹[Èi¸ø®Î\ 3Ú^¹\1dÚÚtîá×ÓÜ\89\8c\95XÂØ\a\be\88Ä\8a\9e\9d\8c\19;Kl«üÏ\ 1ØÌ÷\ fÿ\90ê\ fðü¯fþ5ü%OØÌ¿¦úw\83ö\ f©þ\0Ï0\ 5~íèÿWo~ÝèÿÜ\14øßyÂf~ñèÿ\8dÞüë\90\86wÏ_;ú¿õæ\17\8fþOK\81\1fà       \9bùÅ£ÿc½ù9!\rSà×\8e\13\8bGÿg¤À\8f\86\14\8bGÿÿìÍOüB\85ÍüÚÑ\8fx\863\9b_;úÿ2\ 5þVHa3¿xôÿ·ÞüìËéÏ\9d@ý%ÏðFðkGÿ\9f§\80ÿ99\95³bª/È×\86!\9d"\90ç¢\v\17ý»}ÈÓù\8dçîÃØ\8dA3L\ 1«\9d¾Bªù>iÆÚ"iôµ31;\1d-r\96\ 4\rZ¿O\9fÄ¿\ 6ØÌ\1f\8e\84T˧Á\ºC¾ãÖ^&\ f»M×ïÆÜ¡¶T\97÷îr7ÿÜ+\1fHõIÛtB¦,ö¾%Ìî»N\18\a\8e\82\14\9f\166K&\1aØ4\13£1íµ±ÃG;ÑÏ\9f\b¾=\9c\94\8eãCp=\9dØfÓÿ¬#ïÿ¦\87\ e\8eºÌ\1d\86Û¹=Í\7f\1cB\v\18ksMÀhN\1d81µòð¾Ô; ³d³\a¦\13'\ 5ô¼8\7fiÀ/<\7f\0ÂÞüà©\11DT÷¯rópJhé:ühm6=n\12s\93US]¼\1a\15o^Î\8bo\87è\1dé/\9e½ü$,\ ec¨(\ efÃç\1c²Ü&_úty~h¦¥Þ'Ø\v½ý\1c\bí¸ÿùà\97\8bÃÒ^ÞçüÃ\94^\17}ôÖv7½Ô$¶\9a\18õþ¤óÞ\1c}SoÛ\15\ÊjO\188æV\11Ìνëgz\93[Oý\91ÁïÚ[\9cß&\8e\9f:\8f)Æ=E\0\9bùþá_\83\8f!-y\ fúñݾ\88u\v»Zµ°Z\1fôèéÞò\ 1\92Ê\ 2tXÏ©\15o/»q4àÀßO¨¡\96\12ïYòh>¦\99m&ÐóËóECJ\8dÓxù|îG­ÉØÿQ\80Íü詻żXð\9d<¿õ\9dz2³u]zµ\16O1n\99Ï ÊÜAß\e\87¸­\1e\96\97hâ¦\907>³³\8f\9aÜ\rÇFÏßßg­xÖ\ e\13\áv£\rc{Ãî*·ù\89\0\9b\89~îj½|ÁÇÌûÆÇÎTzK\7f¼\85\9bÜ\1eØ\859=(s¬¶YÛ®6»[Ü$\ 1£i5_³\94°\ fôYW<iV}·\9fTÑÒnL\19Çõp\97\ 6\a\89Y~\aØÌ\1f\8eüCØ\91B2¿[¶®ë]=yNy\9dò`¾Ê\1c\ 2\9cg¡cÁ©­gkË3J\81©àègváÒ÷iV\1e\9e´÷\ 3ßOæ£ÑvÜ\88\13î¨Í,\96ÃØ*í¨çöýïAø\fæÿ>kë>ÅÜ\8e¼­WÛ\96ÐNl\94~n¾Ì{%~\8e\ 5Õ\9eÝ\9cgW¦ï gãX÷_Ó ûºè\85Iå ¡ÔÆ\e¯\16ÙðÅÖQ[öçÃ^eà\fÄ\ fiªÉ`mül\80Íl\99&\9eÙ¶²Ã\95×Mp      ÷2w\9cù\9c\fx\87<Ñ=sO{\8eqÜ{ÇÙe4¸éÏæò \95V\947vÑÞrÔ6>ΰ71¬\81:+\9bêh\f¦}Mqô?\0læÏ\ eÿ-ð:\97[ÊëÊâr\13¿/¤ås\82;N}nÄͽZk\19\83}-´àÌÆVs;Õ\95ÄQ³+uoBX;Èò%ÙÃÞõh\ eÔCgª\8e.q­¯ù§\89ò\8c;ÿ\0`3ÿû  \9b}ÚJmDl³t'¥¸4¯.R\8e\15K¿b³«~ªO§ÈIÓ_Âk¥Ëòi;©\15ØåÈÓGÎPI\12Æ`\10[LÕ±T\v\9bé\a\1d~¬<\95ÓH)¬ÍáÏ\86õ\90*\84\8f«Ýɨ°\\9aÍ¡hs\95Åb\96©\89¬þÚU*:\18ÔUÍ\ 1S[Ã2\13w̤ÎöÐ?U!Ën «cÕ\98ô\ 3¯<êçøøP1j¯aï³Þ\ eþ\fÂW\fþêw?\0\16¤\97oÂ_Íëù³h\8c\9e\8e8Ë÷d9\9eç'äþÑ\19¯\vT\18´ñZÊ;#^Y\99\83Á\8eÓÔñÊ\e÷ï´\ eYv\9a#ÅXÆ\a\8a\g\ 6={}Wÿ!\84½ù«ß-Í\81\92\99´k\89ë,¡Ïë|v¼Å\87öH¨7Ðᡤæ\86{ßê\8exÿ¬\ f\9e®^«Ü¤\7f\83\1e\ f\14\13«©\8a¼\94Ãf\14PO\ fze\vô\7f6Üg\99¢~\7fL¬p\9eöÈLnýKK\88\1f6\1exÄÝ\83÷î­F\ 5j±ÌÜÙËbFQ\9f¹©5îs0û\ 4NÙÖoöb\99¸ÚÄz\7f¶\vr¶\1aZëjÑD>07\83äÓl3)ð\a\bÕÁ?9ü\ 3ð\9dê\ fð\f\1fEü[ª?\0\7fÑ\9b¿Eõ\ax\86+\82\7f\ax\86+é_;úÿ<\ 5þ~HÃ\14øµ£ÿ\17½ùÙ£\1fñ\f\9bùµ£\1fñ\f\97Q¿vôÿQ
+üÃ\90\86ÓÁ_;úÿ³7¿dô#\9eÿüÒù·B\1aÎ\ 5~íèÿÝ\14ø7!\rõ´_;úÿÕ\9b_7úÿüÒù\17!Ík!Oð\8dg6\11ñ\14#\9e°\99Õ¨\11[þ7ÕÇ\7f¨\ 6ÿ¡z±Ü¤y\85TëWsã\8a\11Õ\97É^%ð\ 3\10öæÿ>ë>\83sP\b3p\7fT\ e
\1aßoÚÛ3\fé\15\81!m°aH©ó"¿~¿çæN}9\8eúyØË´\12Ød\9e  SÀr××À¢wÃ\9bée+\81Ù6ħÉ%²èì°?¿\7f\ eÀfî\ 5<9\86T'\9fû£{\86\89\90êAp\8f\0ï®Fjl±Ìb±Ë"\7f&À¼¨õÞN¥\89¾ì:¯<¬µÈÜ-¦¸½\9bÞn
+Ù=\8bOC\ 1ÔÇ\10\9c,9\1d\9d­w\ 4°\99ï\1fþ!|ñ,Ä\86\9fû,¶é]Z½tÈs\17òD:\90'\e¾\r\f©²çE\81\92Ð9ÒS?\ e.}Þ6\85\rÞVKL¼Ímñú1ùÞäm(F    Ì\8eW     \9f^\ e4©ë©ÑûG!T9þ×\13\82÷A\1cC¨¿îùǼ\v©&üMû
+GÿÈà\90êL\84!åÅËü}æ OMGì\15\83\ 1k}\9f\0\8b¥2\88Éß\ eáäÖè\v3lv\1a¨T$ËêS\1a¥4Yi\7f~\ e\ 4\96\8a\87Oq\83÷£û\86T­Î¥¥¥ý\r7YÅ U¤\r©Ææ\90jì<\7f¿9Ä\99÷\fÌ^ÉqÌÚðKÌܾó¸q@q2\92y§×m\89Ôsï\ 5¢\99£'=)¿\9aà;\84²Ý\7f\1fù[\10 ïÛ °fÅgð^iíKk\9e\83<\9d\r\1cý\ 4\ ey®DÈ3-\86[|Ì?\94\0©Î=Ân$\12\84ÕÆÖ\84\19\e%ñÙ\99\98£Ó\e(!útz~k (=ÇK\93{\8d\97§1þ· \­ýÕïnÕÒ¼\1fX«:¤z\98µ.­\9d\1cR]ñîQ¦ ÕC\ 6\8e~'s\9e\7fòYÔ\99ß\ 2Ún4Ë\94Ù\13û\98\1f`zKÔßú#\16Uv×\8aíöu¼t\83ó¨Õ5Î#¶ò|þ\1c¸6\94F'(©Å°\19\98
\ 6¤\9aÛm¸í\8as\8fM6¤\9at\96\b©ö\vH¨ 3V»\8b\11Æa\94GfIwòÐ\1f\15ê¦\99ïÙyRѹÃh\ 3l\7fØ\9dÉ»Á\81®\1dÿ\0\91\9eö?\ fÿ\0\Ú¦Ð
+PI\f\82R¡Q¿´n¹í¦\938@\9e\83\18äùÈ@\9e\9fúiþÙ·Ñðî\19i¨½¾\ 3\ 5xM3×üU{÷wÇÉ<UÝ\8fëÇ`;ÜÅjëAÿBºê9\r6\7f\1f"=í\7f\1e>\v\95Eõ6ÿÄ\82\0¥KµK\9b-CªÍ\e¤jÄ\9a«q,o/õ\95y\9a£g\ e\84\1a*\8cæ{ð\99Þ\8eË\9b^\88QG\rÙh»ñªÆy£60B=m\18\16ê¹t\9d÷o5ç'ÁqtIÈ·ªG]oU;U   \97QídÙÛt\ 6gz\1d\17òÍÕ\15\f­\85ñ©ìífV{\9a~\86\ 4\910©?Aë¤\95ò\87Ý\ 4\ fJëÑÆ\b\96Ã^¦ã\fT\89±BuÎìk9Óú3\88ô´¿øÝ_ÂÞ §©«[z_®n\9a.]6§ñv³\8d#Ô:^-Öݤp2\9cÅkµµx \ 5Æ\80Z\84³Î©ö<\9dµO&¹\9bTG³õ\98\8es\8bánkÛ\83áf©g\ f\9bõoþv¦<NÃé?\84Påøï#ûÂi\92ºxúêpñ\14?wñâ\86·Ù*\b¶î\17\ 5ØlÆVÇ%\ã¸ôγqªyÓ\8d\84s\98,¨³;nøíÅ\88k>­¡PÑ\8d\81Ô\90gjªôÒ¢ -¶\9aò$Í\9f\ 4¾]l%\ eÁgà\9c\95á uöÍN\98i\1eÛÎ\80Õä\89älf\e\f\8cÁ^\99ÏÆ£¦?ÍÅ\99\83VÆóë±[\9aÏG\1d²`\ f\15\0£=Àõ©z)\94µ~P&'ý¬¾\1f\973þK\b\83ö¿\9eð\aØ-ª¬àÛ¯«¾/b-Úw(däq¢ü°×O#m\fy¾7½§0S\7fűµ\ eÀÚ\9bÔ
+±H\87öô\91\1dj\93³Áqr\84,UESS\17yÒ×y2T'¯#¥pZ\ eÿ\r\84½ùÏ\87­;{ð»Úm:Ú--\1cÛ2\ 3N\99WÉÒÕH¦Ì\94þÒZM\1d\13Í\ 1ÎüK\98l¶oÎ\970yÜ¡\90âÊ\18«iº3îë\9dܸ\9fÃ\98/uò\9b\b9ü9àyÞ\9cÞ2n¦ïue    ¸\13\ ek\19\17¬\19ÚytðØI\1aæ=ª\93e%9\9cÔ\ eEc¼¦\93Ψ³Ø\98Ãx1«\ f\12\95çD\1dÏ\16ã>Ì Q?W.\8f\14cJª\8a\9cÇ\ 6=Û<ý\1f\10\89\90ÿçY\11lü{\9bØôÓ;u\9d¤:Àîú£¬\8ee·Ú\84¦gȸÕ×òcæ¼é\8e¶íÛd´-SÖPyiÓABãBIU\1d?\9e\93þ]²\87ýÜX\19(¯ts¨ÈÓô@\ 1"£öì3öï!ê\rü¹N\8c\9d´¥Á¼~HܦeYH\8ewÍum8Ä*«ÁeÔF\a#]M\rFñYm\90\1cj]5S\95ºý|áÒU̱ÑQ\8a¼ÒQÀ¾Ùí9õ\·W¡\12Ý\1e¶á{Ýe \84Fåèç¿\86ÕTЩ%ÂtÔÙë\9d~il¬-\r/»tY-ä[áØô\91xr£\94oâKÁ\84\14ÛuÇ\1eßñê\1d¡Ã\8d\12ñvÏǤÖ\91ØK-Õ]'Z\92l&\9b\170I6Ï×Iº9\9aô\7f\ 4`3?pÖ+þ\\8f\17ó~Å\87\99Ö]ïô\ e\87\91±ÀÖ1lTwEj7]\r;¸·¼îc·eúu¸-ô[õ2\7f\1e\82Ó¼à)¡4ä|øôÁ±¦äÑ)¾ö\a\ai9'Û¹\r϶³\9b\ 6v¥j¾¬¥Q\7fü\e\bßãø·T\7f\80g¸(ü·T\7f\80\92þ·T\7f,hÿ\9aê\ fð\fSà×\8e~Ä3J\81_:ú?\16´\9f\13Òp%ýkGÿÿìÍOüB\85)ðkG?â\19¥À/\1dý\7f\99\ 2\7f+¤a
+üÚÑÿßzó³/§a
+üÊÑ'_¯¸\99\ f_ó¹ëc\15Ru]|\1dã5HU<\84T\91Ír²d¯\8bûz\17,r»êun¬\82³ó±\95\93SZòG\a%¯G{>\\9eìÊ­\7f¶ñjýjãÙþÓ¢\12\99§Ù\9aPÁw\bEÈÿ>ò\ 3ð\12\89íø%\92\f¤º.Â\90\8eaHSM\1d]ÇÒ³ßx\8eC\9e\8b©¹\8b\9eF½æp5+Ï\82«c\8f;g\a\9d2g»j®O6\81\fÏÖªW¿ZõgñnÕ\8f=`ìøÇ}v\10­Ëß\82ÐýðßGþ\aU\e\86450°oTógHÕc½åä\1e».¦§Çó\9bÖ«\ 67§<\1eÜìE\9f¹ÚÄp}ùãÓ¨ÌËØuñ÷LÜ\8c®Ós»wù7ð\12\85\19ç!ÏS%äÙÛÃf Õ0ªe+¤zÐWÉ1²^f\96ÔõKî-VK\ fÇi<\1fö\92o\ 66I\81\9bÕdÍ\9bE÷ê7³m$#\99\17\99©õÕs\9aBK\17]«I§?@8Uÿ\93Ã\7f      ÿ¡ú\84T\8bÍ{®Óð\ f\byÎjßxÚ8ä¹\87\1f­7üÞT
+ϧ]Ç:\ fkM\91\ f\8ba\97\ f³#T\1e\86/\8b\1fC\98HÄ4ÕV\1fÚ\93äÎZ¡ù<ü}\b\85®ÿ|x\9e\8eÎð%æâ\90ê«Þ\82T«;HUG U­ê\8aõ3¤êáî\97ÒÿMë\1d\80PëýØä½óÿÓv\9eÛnÛ\·¾\16õÞ{ï\8dUì½\8bE\14E\15\7f@ÙNÞäs2¶\93\93?\93&´=øp\ 1"\81\89\ 5(\12\8af:â÷¶ôâ\9cç.ÁÕ\8bý,\13h©8}\94z£\a)\16o\17r*YÞ¿\91§ÿ4\8eO?Ê\81§@4\a!%v\8e{Û`±skT÷\ 2\88*r¡´v\90ÑÔ~¥}ýn÷Êb*¶{\93\82á"      þ$ä\13\9cK\99i®~f\vlë´®Ò\ 3á\9c%E¾|'\94\83å\13Ë\8cèýLb\13ò¯>û\93<q\8eÇ¿¡6r[\10Rbm\ 3T8\ 18Y\10RæBjíw\1epvcÎÿõzc¯SغL\9a?\98Ã\1c×èÛ±Ó;ÊÐü\95¢&\9ds\9ePÛµè¨?ôà¸Aéó?\94\1e\1fcTì\89\e\89ûÓ7\86ëû@Üý@%d\10RõBh\9df\15 î\87WùÝè¤$Ù>çÅõx\90\13\9aã\90[2Í\84ÅE\82f\18/"%ºy#VÛBDäK\83Ø\87>\16\8a\9f\9aôåßȳ½!Ñï\9cþ$æ\\9fÜ\e\86Å\9cB¼ÆCoÜ\1fG­3*)j_\9c\ 3ÔÕ(%)©TI0O\95\졦XüÉ¿¾¥ &;\8b\80Xaç3~òögÜÎÜ\9exµ©ßðÊ\9b\vþRbwðoÿà#ßPÛ\e?|âxcq\1fX;\80ÊŨ¢¼ÐÑCþ¨\1d\1f\13Uí¿\ f\81üv¡ô'_\96·ÝS\8a½P÷xàÁô®\93\e\ 5\9fÌ,\vα4ß[\98W¨[X\83\18x\18Z\b\9eà_bøo$Nç [8
\14<q¾·¼\ f\ 2èäÒãÅ˨Z\1a@\95ò\98FÌ·²J{Fð\13\ fõF½ÔÇù\93×y4Ç\96\81WÙVì\9dÞU$\\9et$D*q2,\122ËË¿\91\ay\9dC\ f\82v°­Îï\837
+8±ÝÛ\80FÞ\?oÚñfdÚu¬\8aÊX\9cxß<Tèþ|³G§r§Yir¦\92/Í&Ö\83²\8eÛ$!ÿ°OO\ 2Ò\8b\18\11f'\8c\ 2³[×ø{ùøi\7f÷\a\8f\9e49<z'Þ\aЯé}X\80L\97æÖ\91\ 1iÞШC\87\9dÖk1\9c\94\9bP'Þ\91
+!\87åÅ\aÓç\f\9f\12\1e%\9bÐnë\8f\9fVn\9d¥Ø>åÿÇ>eñ\ 3\ 3½Â-\ f   ÔVü7r\13\86a¼       Æ\9dím\1dÀû\18ß\87££é\ e°éÓ¬\94òm\ 3\89\8c\99\9cv(R¨lR\ 6\87­Ä3Û¹\8d\ 3zt\ 5\11\\<ýhÕ;\12\ e\9d,>¶O\19´³OÓH\7f)\910k\90\14$Øs
+\9aB\938¯ósü\87rÍûÙñíåMìû(#ôïÌC\ 3\9cúèn\95v\87¼2avC¡â)±\99µ\90\8dÄv;c\9b~ú \97Jy=\83Ø\94\ 5\19\ 5\1e\15\ 6\rÖ\eú»}ª\\898Ãñ\b\89É\ 3\ 1MåÕWäs7\7fñ\99wK¹µ[ªY5oÓõºu\13Ö¨âQHÒÕú\99a$\1cÈY\9f%ëw\88\19Èw\8eæÎ\91A\89\12o\12ºð\90\8fû%*àõd\8aÁ\9a\ f1ö¡ÑÎ{I"ô¬~\84\9ft\84ãè\84\84Ç¡Y\92üWâ\8eðI!°\96T\9c¨|Õ»©J\98\9d\15\98SQï³bI\vnlo\80ôèIv¾¥¤\16BQéùA$\97ì\9Z7\93Ça~Áb\18ù¦bc\92DnÁ\ 6Ghb\86ÃÏ{\1d\87ÇÃÄwSqÖ\96\90\8fÄAûíä\97ÄV2\97´ó\8eN;ß/-Ó\8eÄÌ\87j²H\1eØþ±åPó\91Ü"W\15oI\18«Wì\ e\12\9bw\9e&\8aDIÄÝ:Ëb~{D¡×ê\93@»¨u\8cÝÉcìNâpT\99\18©\7fÜIÀ{I _\95o&äÿ)>é#9aç\16ó\85­âÑYcSã2ßi¯gTnãòàI\84¼pï\bµpÄ9Îq\ 4\16`Ü¥¿%wRXKn\12(\99M\11È}}>~2<ã\87M4\83ãLÏ\r\16gx¢\90\94¯\83¨\9a9ôß\88µï®"kÿ~Mô0\7f\8c·\98\100\8b)Q:s\eâÇæa\87ÞÍ¡\8e\ e\96½'òħ\15äÙ\86\ 6ðëY\18ÂÓæm\ 2-ÒØ\18Ê0\9bÉaõêNÀû¬2Ý\9b\9dÜl¿µïÓ}    òg;;kÄrZü.à2\7f\82\18gãq3Àkt"ÚA\8e¡µ\e^=âð»\8f>¯é5,ßæ\ 4¤µ\e&´Z´ï\87¢\15Ä]\8e}\ 5ÁÒ»ú´\95Ýbt:·        În~ClÔ¦\9b`\8aë\9bD\96×to[Z÷\1f«Êê\89\ e«@&µ_\12p\99?\95è]\88ºËy4Ñad\133\b,\9bLc¬0j#s\92X@\9b[\84î\1dùÀí\9aÄCÝPÂÎX³Ë²½\12Æ·ó*y\10ýeì[/3£Íu¡\ 6ãp±"\ 6ñ p\91¯ÔïsÃ\ 5½Þí*÷\ 2R|ÿ\e\89ê­Õ\ 1Èé\1cÕÂü(ª-\1añôêu~í%\9c»Xo\e{ÕFuؼ\88\9a?ËÛZKÍ\a*Á³gµ\13\8eÎ
+õ¸¹J\7f¤xòCÜ»2\9bn92ãÖ=y¸Ê\9dåa#}\91"3\11J``ð\94\12Ôéþ»Äã\9b?\96ü½ü\fõ\v\9c±\99òoQ¿ \7f¸\9b\7f\88ú\ 5ÎØ\17ø·¨_à\ 4\97ù\8fkÿW\9bÀ¿  )¸Ì\7f\7f¸\9bÿ®ö?\9cñeþÛÚÿpÆ#éÿ¶ö\7f¡   üë\90ÆMà¿­ý\1fw\ 3(çû¨>vcTÐÏ«-ªÆ5#Õß\ e³/¶\8dÊJ\ 6¨¯\a@ÝçOZëÞ¸ª\84¯]\94\9bÝ?+}ïæÉÏ\ 2\r\10÷3W\1eº\15Oz\r\13g\897|_âq7\90&%7öÓDi!=\84Uq\18üC\ 1\88[\10ÒñÉ\8bêÉ<à\84\1a\80óÔN\0Î\[w\elܳÑë¦Íixçõ±{¯j×Ð\ 2\85¶§\17ù©Ý|\99}\13\0ð^w%a\10yÒÄp})Ù\96.R2©ÞD\89R\9fBîÚ¸òÅûÃÿK\89ÝÁ¿ý\ 3\ 2!Ýøç¨^*\ 1\1d£\82\90\ e»    \80:d\11½~\899?¶ô½\11Æ^o¨\fäi slàKobÿ\99\8a\10ÜÊYJúîY\94ÛüE\9cS\87@\9cCäCÈ\17Ûwîä^.,rDÝ\7f(\0ñpø4\81\8d\v¢ZÊ\ f\0jC¿f®­·\1dÝ®-Ý]±°^\7fÙ¬\86\13\99Ø\96Î\aÊ=
+ïÊ ÜÝä1\1a\ 4\92¸ßøRj\95öE\997.bF>\ 4\82V[Ý\ 4-\8b¿9;\1d\86,bRqÐ\18Ü\99:ÿP\0âv\17Õ±+\b
+B*·õ@#s/Àé\ 3N\84\85ôFãÂ~&$coòw»7²ww9±\ eBi6Û\ 4¢2L\Äl\9b¹\bëþ<\14òú$âKdæÉ"/öÊ´\95¾K÷\8c\94õ÷\12\7fõ\19 D@íc>\bi»4ø\8e*\15_6¯¸-£r× ï¶tP2U*Ý\0\9c¯d$ó2ô\94¤Qp\93ÒÝM(fýëgaÌÚF®¼yîÝùÝx\94dÑ¡ü`Ú·Ñ\85zpo\87\1a%ÎÖ?\14\80x\88Cê»\9f&ðAµ{¿¡\9eZF5­\1d¾y¨ø»d¨T¥\11§öfÞ±Ý\eIófð\10\97÷å]ÐýèÎ[ÐáÎ\97±Þ\9b«Í\vi¦ÓYߨGTðÉ×Õ±ÉiO\8cûi\9fã¯ËwTî
+\9aì¤úá4\0g.úÎYÑö±\81JjÇB)\1e\11|K\98\1eåkIybs\89o©½9w\ 3\1e\97ø=â+}äÅÕ\13Í4C4\9c\14õ\öï¤\98\bÎ\84ü OÄ\ 2\85\8d/H<ZûIñ\1fPK}\80\1a×þ)\ e©\13£vµ]ì¡\12ÚqÔÐ?ù²Ê¨QKü¯×{'\93üa\9aLqHM\88\8fÓKE\1d%MÎ&Ù\e±¬*ç£>Ú\9f\8eë`füC\ 1\88È\ fÎmc\107\81ZØû\81z;5\8dêLÞèh5\ 3¢\8a¶5µ?k\ 3ÔU')§\92ANÔ6ݬ°½KßvF`®×Q\8aâwè\9b\94\14=GäÈçý¸aÅ\vnY\e\aßw»ÆGb\13ò·\93¯ÊwTý\1e£Vûß9¯\95\97-¤N\r£º\97W::Ï\1cµ£\16çË\8a\93¸Ë¡\8cÔE2öP\8bb¡ØÍñÕË*Ͷ90ê\8f\7fË\92-UÅë±ÔϾðJ@\0·;s0X­\9b_\958Kõ\8f%ÿ\8b\8a·\aàM5Ô\835\99xÚBÇ­}÷PÉ\fª\11\99\89¬Òkò¢\8c»T*ÞÆ¡\10{¨ÉØC}Òl5\13\90s§ã~¼Óø2\88U\8cíÓÍ%v?o¨ï.Ï(Þ¨\9cþ¡\0D\1cp\9e£\98³Ñ\ 3ÏþIü½    ÖR:²\85Ý©\1c{\933ý<î!Zp%Eõ>\aïsEHF\9fµü\9f\ 5ò\f\851!5ÍË\ e\91×oßíÓcÊU\10*gèHÈÌ|$\-}\844ëÎï\12\7f,ù{ù\81z\aÿâÛ1êP\vÖ§ôÓ~7\13%ÃÉ&'F½\8f@:\ eç\ 4YªT\1d±ðÜ}¦ð>\vä;p:¤G\87¡GfSkãXN(r¼Ö\@BZåá\a\8f\vð¨$i0+tÏ0»ëz¿$\1fKõÇ      $·Qý\19ÙQÝhwÁ3u¨\ 6ëkúé\8c\1e¹\8cY\ eó]ÐáðWJôhÓâÆ^\e<|H\ 5\óÂÝãUçg*5\fM¢0hÊx­\87}_kÞ¯\93Ô'w°½¢!\81\9asÐtÁ¨Ð\94N;ÿP\0\8d\1a¹\ 4àô{\80s;W\83\82\15ÅÝA'Ú¬ßæIÙV4*Û\9e\88\ 6^Ãxز\146¸À\ esS\ 6\97ϪsBï°Ê±\8cgÅo\vÎ;D\91\8e\17\86\13л} ¡)\ 5ú*òsÎ\1e\16:.ýIâü´\9f\14ÿL¢F\96\a¨õÄ  ðN\0*¿U¯¹Å2ðz¯ÒÍðnÃ\94´¢n\ 3¾\1el\10\96x\r\ 4\86V*\ 6ÍqQÜÒÈe3£\1e-\18\12ñÚ)ø\96×ùcÁù\15 nI\1c\9aÚ\aâ ÔVä!ËmÙ_\97ønâã³=Þ®\9fí\8d¡?ý¨×\ 2¡ÝÊá\-xÞ\9d\ 3\9dv\996\1f\9cÿºw\99;\7fÚÓ|V¢èÄø\ 4:\0UDû\9eÜi\8cØï«Î×\ 4ùÉë\84\9fjú[&æÇ\84,ñøA\81ðã!{Þ\12ÿPB95í?zÒAzP\89°òl·\eü\ 5æuÊÀïÏx\7f\ 1Þ{ß\ 2ú\95¬v(iS]Qi²÷IîäÉÜz"ÿ!¹óM¡ÝQ¼ê|6Æ`N­`¿åu¢P:ià\87å\82ù©ÄAû«Ï~\17\91ôíåµ¹û¨Jå®z·<µªgm*mßÕ\ 33.\8fO¤¶öÊ\84¡j3¢x±¡\1fÉ\9d\19þ\93Ü\19?:±°C¡Äãv\8cW\9f\1f¿%wr÷1úIî\84ÄWì+â\11zPB÷\9fJü½y]£\97\8f>¸m\98%2Ñi\eF\91\92«+c\96åj\v²xòyüÌ\1cîxs
+U°\v}\1c\1c»\8e\93;!´·¨í\11FO\1dàèmíáI\17ÛÁ\89û~\aIÈx\aÍ\eÝÝA=ævqÐV¥hwÈÙ×ý?\14{\81\92w'\15Î{ñÖ\1d\84\9a\ 2\8e¹_\aä~êÌ°Ðâc»\ey¥Ú*2ö{7X\fG9xÖï× ¬åT\ f\9b4Wßï^ãú¾|ì6w\90\93hìj\8bë'ͳµE9µý-ÍórÅ;\9bãaÛýKùäuþÝ\1fXV¥q9\15\9b\97ºúZ¦¶<Õê<©r©ÑÄ{%g\82ÌV×=´\8eVÔÁ´çæÞÞ\94ü\1d¢RÁ\16?\8en\erñ¾oºÏ[<!¹fZúk=8ñ\89U4Ç\13+>\83¤Vcv\95^%FóìR\fz¹ålßÈÿC1k\86\17¿\b4¦/f\85V:½¤¬ÁÆÇo{¯\84ÈFj\0\99\85ÍæPñ¯Ø\ eÓçÌ\86^ÉÜzäôÅÕ\94{+Kù\1a\98Ël\863\17\1a\8b|°tæ&±<Ïw\95\81?/¹Ý˼¤v¯3(_\89_k³Ã¥øø\87¢w³#[¬*ã\a½¾ÍàcÇÂ\15tzk<à\82ô®\1dj\84\1dw­¸¥­_óÞn©:Ðn±m\17àù!sÆgn\93#fõ=LOýô\9e\9bbÌR\98\863i\12\\ 6Ê\848vµ   ±\e\18\93nyp\1aß\94\96ó÷\ 2\97\9fEµCf  d«EµªY\8dªlH>p\ 4}\ 4KóRv\83\80\9bZ
+\87#ºc>d½^~YÚYyyZÓ`]5H\8e\1cõ¸ÈÚj[sâ\uµ\8dZ®r}Ó@,ÂSÈ\19ì+de\7fQÈ4vS\88;\17É\ 3apÿuù\9dóÓ\87þ\97¨_à\8c\7f\8bú\ 5Î\8f\99ò/Q¿Àô\17wóÿ±ö?\9cñ\88à¿­ý\ f\ 4þÛÚÿ» ý\7f¬ý\ fgüLûokÿ/î\ 6P&\17?PµJTÕ^\14@\85îAn§\15]B$bT\ 4Ñá\9d-êõn\12\84ÔM\ 2N_\0\9c¥)à\84
+\8eÚö\ 2G  \9b\9c£\90"üi\ 2ä~ÿA½(]w\16(]u\7f\97ïÃÍS\1aË÷ë¯KT#ó ¤ä\ 1pöLÀyNÆ]õG{¸¾\ 5¹£ \9eÝûåÈʵ&°\ e\v\9e ×÷yKÃܼ¯µræY%\92SWíôS\80\92µ\0å\9bp\95Þ~ãÉw·\ 5D\1d\ 4ò\1d\19\842\93\1f<¤±}¿\89i\f÷?\12[ª¿\9d|A\0e\ 6\84\94ܪQmî\81Ú÷^䣽ÚÝ/ÆT\ 6\9cÄlh\1a\89ÆA\87M\8f×ëDÆÔðt#Î\1aR\83Hû8Ó\9er«¾]\85Z+®üØ/ÝØ\91\ 6ÂÔ}y\98Ï\ 5òàU\8f)ý» \8e·\17~\9bÉ»_\95O\96ê\8f\93¨&å\ 1ªtP\0ª\r¢úLþ\86*\94\9cû~Ð7\8db\8cz±YÍ\9f>t­\ 5B\1aÛÒ¾Ú-­}\85μ=ù\11`®ÌvÇ\9e<d\8ag)\8a¢ÏT\ 4¿½\86\12?MG\80r\1eðÛjÆã*/óôëò¿\9c\aïÃI=Ú\b\14'*_¶åcÁ¹\13\0usÍïuøe3\9aO$u­\9d®^T2ç\ 5Ê=¹¾Ä\ eúYf-Ø\93\96'ñÑõ,M&F %ÂÓCLëÛ\e¿íe|pAÙa\eeÔú]bkè\8f%\7f)ßQOÈwÔZ6CÝÃÆôvÙNYÀ)v»æ6\91ÙéHã5_LjZ»RõãléØ\84\8c\13¦c\a=8Ë#\11>K\ 2\92\8eÓ¹U?N\8f\ eÅùBzñÛy2àªyÁeüÛ¢Ã\Çø%\89-Õø\b(K?PÉK\8c\9a$¿£îؼs\ fÆ]³h=6:2ô(Í\8f3&¯÷\8c§ö\86\99{\9c-\1dÈ\9cö\fb\aýò-Qz\1e§qgú\87;¿%3q\a\8au_¬Ï\R\v\87\82I=ZOõ×å\açAþÎYË\83\90\ e\17\80óÈæ>\13\92ïAÛ,¾_k\1d\89½Iÿ\9dQÕ°R:+\8fFæ¡\fKÇÛ·léYe\1c'J\9fâ\1cém(ä¹Õ\9bõ\1alÀà·\91G÷¸·E\rO\8eN
+UQù\93ÄCÜ\9f\14ÿI\0e~\1eÕ®x\1c\fP3 ¤Ã8¤\ 2\9bu\1eÍqË,\15\1eK\1da¼£viæ\155\9cU=屪Fò«$|º\1c ö}\17\15·\e\búD\8d\1déá\83«Þ/Ñïf4ù\92t\93\9cf8\8d\90×°üëòé@]«?P¥°ò\1duµ¾_Ì\86\9ds\1e£AÃ,\8d^\vÝ«¼\0êº$«!Ñ\ 6¨Lã)\v%íýmÇ\89å}ù\10\8aíÓ\93s6£\14Ó9\1e#j´¹\9dÉé\9c;Åέ¬a\ 6\91-lÔ£f-å_\97\1f\9c\bø\97t\ 1!íçcNPûæÐÎ8\ ft\1co4cnÏ%\80:{¡ÚEk\88j\18\f]\85\91<mßÒR\ 6kÅv/\93â+á%ý±yÉwÔ|Æ\ e¯\1f;¼ö±@\f\fܪÔ\15\16¥\9fIl©þÕg\1f\ 1\94¥YTO\90q;x\80\90ö3Ä\9dÊw®\17\13ñÒÎC\9bUÍ]¶4Õ=)\83èÍù\To£­«pé9à\14\9ayQ;cñ\86çñ¶\ 3\19&,ÎߤDwîD>ÙJà§&qÁ+³±\8d9jÑÀ\1c¦¢ap#-ÿº\0ÄÆü3\15ñ\r5\ 4Q]\94È;Õ\18\81¨ªaÊíÏá²iʽ±QÛô`½yEx­[\95\1cåù\96\9e\92²«å\85ò<\97a\8f\8bë\93\12\1a\9a\7fÜJÄ        C¬ñ\19\88rC}uà¢þª\1e?:QÌ\884\14ïү\v\82\90\16\19Ày}\81\90.ò ¤ÃQ\18\14\84K\17\95\92UØ®bWÝ\80ûÛ\9dî÷ï¬Fn+\8e\9cnäCÁÚì\13\1c\11ý¸Î}B\83k\ 6æ­ëñr{CE¨aÝC¨ÆÌGH¡h#ä$2\102é+\7f)\1fKõ/>\ 3\94íy\8c\1a\a\b)T"î¡»»\ 6ëkýíÞÎç\9c¥+RÛ¬\18îJ¿tZ\94,Íòª`=\17g¾v\7f?\99Û2\1dPSä\11\aí¸Û\ 4r\9cÒÉÁ\ f\ 3ç \97\8dÈðh\9asàQ¹îÁC9²`\86òµ_\17\80Ø\0!mñò·&ð*E5ªJÜo\15ô\12èÜ2òÈN'}R½AÍ´­åL\99 IT8-j\ 2秭\13\e\98Ü\95\1e]I\87Ìî\ 45Îë\14â\15ñ4Ìò\b\ 5M\17C\ 6\10 Jõ¯\16\94ª§ã±'4yúƯ\v l\ 3Ô±\ 4\9al)       8å*ñ 
+æùº\f­Çù²\7f$\1cQ\80\8aêðíÅ.\87p:\9dw\1c\9eÞÐlw7Ð\98Á þIîÔ\8fÖr-~ò:?)\9dð\88'\8f\9f\83\92]1\87,\86\88\87\9b\87ìæ~ú{ù\98\90ÿ·\18\0êF\ 5¨íd1ªÙ\râÙê\97ÜPN¯¯\97zûý6°£\13\89%\fkríJqÍ0¥+AsO_¢\13E×$t+©à\ eßa\7fäu"t·rü\96Í9K\92ÇÃâ99\1e²ú\81Þo\8a\b¿/\\rý×\ 5 \ e\ 1\8aQ}\9b)|\9a@²}|âÛ­\11XÈH?\99&\7f\92\15k{aÃÝ©FóÔjNIã\15\ f[\96T3¸z<¥<!6&Ùoy\9d\83n\17\87Çõ;\1agb¢\a\85"±Cö\89\1c÷:GÒûbQ\8a·\98ø\1c\7fI¢:·\ 2¨ú        ò¥|TÇ'ð-Õ\94Q'ãF\906\9aÞ8\1eÓ\17'zÚîåHÕz\8cã÷\8d\81\vĶ\90!\88"\91á¾%wba\87\8eó:\89xÓÎ8\9b³ò=\1d3]:¡\87%$a{ýÌ\1c÷\eΠ¿ ñÝü±$ª\9f\ f\0õéòQÝ/e\1f=;9r_ãAE\1fP\19H¬uW\b-u`\89°F~t\84Vr\ 3÷:ì\14wo&\84#K\93À|\1c%Ñ+T\8bó:\1d\1c\19Xâg\e\83ßS:gf\11=¨¥\b;ä \1fß\e5ÿøërã\85\89s\12ýô£RÊ÷Ûh\9cào\10|»"UÛÏ\r3=-¶ÄANPx\8bÁ]¬\9bÚ¥P*Z×Q\8a?\8e\10\16êOaaý\9eCr\97\9eB\19d9;¬.­ÙÞ,'fû­|\9díK\v\7f±;èêbW\1d3Ë-"áë\8f\80Ëü~ò\ 5q\1f\9bèv\7f\90süªw.ª\89\16W\9cd#»*;1ý       áÜÞ+\8c²®("\94·
+<\9f´/p\9aêÇË| Ü&\9b?\14»za_É/\8b;xÚ*mÏt¢¼m\9eÝÊ&بÕMçDV×·ù¡¶¦3ÛƺÏÎ\9b+öÝk\7fUâ¼ÎßN\9ci\86¼¸l\84ÔâM\11\ 6tõY±ºÌ\91µZµ\871T0GÒ£\1c\f\15|\9c>\94\17\13mçY¯Óö8¤ÜMÏ©¹kæù<¯^-ë²\9a\1cè`\95Ì`ár¾^Æ}èeú=~,Tq\10-VÝz´È¹Å÷Ü@ªé_\97Óz\96w­Jz\15)\19rYæFR_!áäÇ\17À\9e\88YG²¥Ôä`wgÛ}£}ǶÝkï¸\1e\9bìq\95®7Éår\92b\17:\19\b\8b\82§Ësk-ªó²\bk3§»Ôg\90;6g5dp\9a\9eó-g\8a
+\15\9cÖ\83ß\ 5\æO%\7f)&ÄS¦2»;\ e\87<éLÒ8@\9c\9bH\96Ï&\ eÎÚiì\9b®¾Ø°gw±\92ÑÒra\ ev˹]jÆë=gîãv\985\9a\162Åg\ 4:m§        bre`jB66̤kθñ}7\13ÆLj \8d\aÊ@\1dE\83®ñK\ 2.ó9*âjÌñí+/\93ÎØhâ}7¿D²\9c@\ 3ʵ½\v\90Î{3zJ¹UV«\96ç\ eÌÖgXiÑ\9dvØw\7fB\ 5Áx̪ôt<\1a\12\8b\91pܬFÓÎf;J:³ýP^\ eâ-ôÀq\89\rçÑø8Ìð3z µgü¯KT]5\9bQ\95Í0Qu½KF\95·°\8a*{Ûº\aJ=Þ é\9a\123µ³³èL\9cÛ
+\83NSýÎ\98z\ 6W\8cr7ièµ\9cpÒ¼íú¤!aßÖ\10¹ik\8dZÖÑêÏ\94§Õµ÷YõG7_õ\9bÏ«ê\17SwÕOÔ^
+á:\8fß%\1eâþ±ägò÷¨_à\8cý´\7f\8bú\ 5ù\98\90ÿ\12õ\v\9c±5ôoQ¿À .ó\1f×þ×\9aÀÿ\9f\90ÆMà¿­ý¨\8aô[\9f& åcÔu\ 2 ²K\80j\9a÷Ài¥¯© _;ÃýæÄ¡\e\9bÃ)\85\9dh³Àn5Ýéæm½60\1dÍÃw'\rM\8e\0â¢\10\1cÕg\ 3Wõ×Á\873PýVêþi\ 2ÅB¤\+ÁS\1e\1cg×_\92\ f*àÌÐQ\15Ý%¢jA^G\15\ 2\84\94 \8b©@±\92Õs=\9b\1a\81ËØO³µ³\96E\9e\85\86ª×\9c\97£\9d㨢Û\1d\0\94k'õò¡ôn®\8a\8f,OÅ\v\96¯¶Dýª¶öÖ\1d :1â8\94\12ËÄågòIíý\8bÏ¢*3mGU/\1f£®Þ\05®}ñrº\13N%\19(\97Wù\ïgG6wÌm­ì\15¡\8cò»ªéõtÞÕÎqH\9bí\85­^¨Z<ðPq/°U\1cµ\1cµõ\16=座/ʵË\85\80Ò\8a}óñMJ,î\17ayE\9c_\92¨ª®;\1fÎoS\11\10\88jS\8eQ=\80z«$\ 2µ\90,{~õ=°9!½1uiNêðî¡êõJÞÑ°ºéjÍ-äª\17¹éªmÖq\94ë\9bs\95«H\9c\15²\ 2\a
+q'î2ýZ>\0¢\1f\aMP[¸Ço3=û\97$F\ 5!}\94@HÙ-\béÈ\ 4µo\81\90\92å\16à\1cå\ 1gïÖ³Çx´\8aÍ\94\r9$tø\18Êz}Vu5lyñÔ ½øfö+áZÿæó+½ôì¬tÝM(ßWðKJ@×\10Äf\15#6l®r¹\98\7f)à2?+\8eª.Ôù\8eª\1dbTmõ\1dµS{\ 5*Z*yþáÙµÇF´47Rï¨ÃB(i~%ck­Áå¬\ 6\8b\9d~W¡\9a\ 4¾ùü̪âËLc\0b       \9dBa\95Xù|QKÚ¬{\94\rÆWPí\97ä\eg-SýÆùi\ 2k\13 \ 6¡}'w\1d\80Êæ\v\9e/=Ûö8\8aæf\91l`:|        \858\11ý¤µ\98äE%¶èù\9bÓß{\13\1f\93ß\93¢K"\90øi.\12rRãÌ\9d\90Ða\91)e28üYïI\93xMþ%\89ª÷c\17 \96HÐZ\91÷wÎ÷\ 3p
+#Àé\95rÞ%\99\93F\ 2\f2N\8d8-AGò\ f\89Ò÷Dôî\96º(t-u\96YbóÉ<÷¥IÛ½       «bïÊ\1d\86¦Ë6Ê\90Å´\a#\9dîM²
\9cÞÒß\v¸Ì\9fJ¢Z\9aíEµj\83ú\81
+j¿Zx\81Ú7GÏ@Ë4rç\ 6^\ 3¨Hzb\96\12\rHGÖINó­\92©^ÝR Ü·l¼ß\b\18T¿+\83³\94ÄOq¯S\9c\9b«6\843\83\13M\1a\ 5\9db®7\95|õ,\89\9ch\8aðKò\83³
+BúÀ\ 1'j¯?M ù²îáp÷¼fÈIöÜð\9b5[¨´Ææ\96\9b\1ct÷QbµK¡a¨a¥\1d(\f®Ýdî\99½JS·\1e\87\90;¸ö\8d\ e\a\ 5\9bb\13\1f\1f\9a\89ÇÉ\84<"Dbþ\86㬡Ïñ«ò\7fQAíWG/ó\1e®v÷kæºÍ\9cQxQµ\85}w`\9aýÃV÷æíø\99¦]Ð\89®\86Äüª°ùÌKN\9cË\ fq\89ÔoüN\9f¼h
\ 5¤pà,BF7*\91    ÆÒQ\13gâq=\e\vÇBzÀ}Ab£ë·\93¨V\91ûQ­× Ak%\ 1*ë­A\13\8fö\9d½_\17\e2}>\97©ªýnî{V¡¤n\8cZqNèÍ9©©·\ 2rQXu\9a\90ä\ 5\91\12\f\92b['¨N(\a=n\ 2Çõ{fáV¥¢â;·"ã;µ"âåU\91ÇËÃ"÷Kò\7f9m\10R.\13çu>:\15ávU²§´_»xàE(Ýz\96¾*®\f¸¦âúÙÏ©\1aaׯê\80kdÅõSɱí§z?\1aWÑÅ«\ 5.Äà{×ÆêÃ\9c\8e\9e\8d»\8c\9eq_@Ï[\9fÃj|Ä~$\1e­ývò÷\12պ株Í{\14h\ 2\f@Õ. ¤ç\92ö8Z\970LÉQÒ\87ÙLÑer\8bÎI\1d)só0Ü`fUëÄOh%ò®\9e¸¡´ð³\83'5]\856\86\16r"Òó¯'\84|u=\84\9cÜcÓÔU\10Â6D$\b]\ 1    l\97ûªÄFW|ü\81Ú&\7f z«¨\96­*\8f`\9c¼\86³]+q9´\98\92G\15òm'U·\17¦Slâ\8a\90Á\19±h£*ç§o\1eC\ frgb­,äOJ'$P\13\ e\12\9cD\9c\99\ 2½\94´\r½j'\1d\1eÖ\f\ 5fjª\bßû\ 6ÿK\12ÕfÞ0ª\1d\86 ¤=\1epz\17ÀÙoHÏV¶\1d¿¤oã»ð\ ev©AÉoFÝ\9e½¼·gêh\8c/\85SXC¸\96\8bq\fí´\fJ$IëX6\9a\ 2rë&\bhJM\88ÃB?\88\87Å9²\ f²~· $fhÐdÃ\88\10¿!ùß%¾\9b?\96üL¢Úþ\12£ö@H{Ì\v<\0ÂU¼D\86\8bê¸êß\87\/
+,äYp_ÛVMï"³\86¸[NGìõÞÝÑ\11u\8d7k\8c3'\152×l(\9f\1fO\12\9a\86\b~Èr\132v"\85}áê\9aûõéd\1c2WI=ÌO¤øKò\99\8dÚ{ öA¿\ 34\ 1&\ 2Màµ\8aê¥\15ýl·I3Ì\92\19Ïc¢~h¢í]BÒÝK\8eë4÷]z\ 2\91K*}\9acßöÄ,N\1f\ 2\86ÉY*ö$1HÄOØaÙÇñ½Î1Ì7\13R\15wûÃIßí«\ 6èàöxå\97\11\17À)M\0\ 2N*3\8dê\ 6\89ߦ\9b\f\r:ñeÌó2r\94y(zÜ5a¾é)nÔÉÕµ7%¶ëL\9c9ù¢pw ³èµ\9f">ËÌ?väA±\8dß\9cÈ\13³;%NÂÖͨÊ\16FUýO\12ûi?)þ]¢\9a\18\ 2ÔÓ\1c Jê\13D³Ú\7fP¥ÉÒÇS\85\89\ 5§\13¨\9a®h\1a\7fÙM4z¦\ 4!a\8dÛ\85#´zôq¯c¯p\84¶ã¾\0\86oÑ#Ú}¦08ÚcÈ7;2½K£ß\9cÈÍùtÜ\171\9fÞ\9d&ia\v?\fé\97\ 5¯þ·©\88í1ª]\8d\9eI-Ø\ f\v¹Syç×T    ë¡\ 2F\ ehZ^7YâPë:8\86xI\f<èkh\18QC´\9f\/à\17ú\ÀÉ\19½8¨¯Öâ\90ï¤\97ûRÍXî\ e\18¿ÞU\8bL\9cm·uO<´E\ e\ 6¾mô"æ\97\173ý¨Þ:à@üûmºÞ^íõÊq´I¶Ñ\14.p\1f\93j\1c4¢6¡I\8c¼û:\12)H\88\8cñu\ 6\16©i\r\83Æaí\12ÍýNhµv\10uom½³ÑÙ6\8bLos< \83u¨M\86kj=\9f¬\1eÖd¾b÷\87íÏäcBþÅgQ}Ó\18Du\f\8f÷\98q\r'\93om´\bJx"*PmfÑ-.\b¤\ 2í°Aq\86#©2ÃCÚdnCùþð¾?ÌÌç®n\8eÀsAÉÅK~7ÄÙO­ïE)³\1eÌñÜ\8acçùåûÝ+.E¢]YÎ*\8dúBAJÍŲÑîÿ\92ÜøN¡\12Õ\9f\9f½\1flE\9eWõÞ\85\1d\ 2Ê¡Ï(ÍY\91@õá\0\eÒå%¬\8e\ 6ð\ 1\f5©=\[ÉÛ âi\eJ\80Ìõ¨^8­¦       Ë^Ê=Î[fн¿XYã`\91\9fuÃù\96)Þç¥Fú9;]ò\89O^ç.\9f\9eº &¿$î£(y\8e Ý#½k{\ fÑñô\ 1@Li\ 4\96m½°ÑEkÂZX\98\1e Ê>ni»K2Â6Ì¡\81­¤\ e\8a-\97\b:1grny:;¯\14h~æ\88\984«Ý\97Êô\8c\8cµ)Ö\98YÓ¦9°'Á´åN:JÝ\1fß\ 6õð/å\93×ù\7f\8bí¹\95´ôι¦K¥#}f\94¼²$°\8cO¡ïãÐ\857\89wêP³ôÖöv\9c\8d×b\91\9f,×Çp²(E»é¼\1av\96³\86v[Mñ·µ\99\84].þ]ÜI\ f\81¡ñ£\ 1£cÆÜàãátF\8c^©%=âé1;JD]a(á]å\97D¿°:/\15©;Ë\88ÍU<¾\ 1\94H\a}ãá\16.H(¿Ç*Mwó¤ÄÛj\99I?\17û2\9b\9caíZfJô³¥  =ºÕÇÜÌj\8fÞªÒ\e\89Cq4J\1dáñP)ïgÃ\85²\\f³ËÍf EËý`\8d\8f¡¾\19\ eâ\r3ú;h@þ\92Hëç\ 4f^G\e\ 1\88\95\e\17\9a½»û¦#n6£g\ 2Yê«\159\87k\ f~
+ºÆñÝLúïé       °\95Ï£\94ñ¾\ e\97¥çs C÷ä pö3}\v»\16úûÖµÜsH·Ö\83{~«W{\{Ý3{\1fv±Q4í¶\12¹õß\v¸Ì\9fJ¢òév\8f*íç4ªt\ 4+ª¤\vµ¨Ì\8cШ<\84\9cÇ95N\85\8fÇ¡\12,êÞÀ/é\9d¥\87¨ÜÎm\97ë\88}çNÇS4_\91§1Ú`N\89B\89·f\9dK<\85\1cO±R´­\99JÝ4M%wqÍ\85\11úæBÈÜ\8cµýxèe\8eº~U~Æ\19¿\bþ-ê\178ã!î¿Eý\ 2'¸Ì¿Fý\ 2Ý\1fîæ?©ý\ f秠       ü\7f¬ýëû\11U¦)À9ÕNQ¥RkDeu\81}k\ 2\82÷@o\83TÈ>\90j\90­_\86g[ï¯ÝË\8a\86\1cÒ©àö°%\91§IfÎXR³*Xéi(\9a\8ac+ær©éfÖgMCßR¶¡OdßÐÛvh¬ÃËS\83[ëPme²\9f\84Ëøø\ 5\89*Éì3ªì
+³¨r¼8Q¥ÛiFeww\ 4"{\ f¬<N\86#o[¹è9{x\86ôÑÖ=®8Äfë\89x\1f¨\13\7fehKb{¼©îBÁ\ÞlÅ0r\94flpÈ4\8a¥\9d­[òÚÓ-
+½ê\16$G\1a¼Ù=\15\ 2q\ 2y0Ý\9f¿ \9fÔ^p\8c\ 2@=ÖæQEx¸Qe6jEå;J\0\91Ý\a6]¦ÂqæP\ 1ã@¹\7f®q\9d\8d\13¨=ª§©S\92$9+3j\88f>eËƶ\ e\10\8b<dê§ÒÂÖ÷ò4^|¡Wj£@¯dw\ f­Þ\1a\ 1\1cJQy|\16Ågä|U@\ 3­E\0±³øι\9f¶@S=\12 \1d\98q\96ê\ 3;n\92á¸\87\94/\9bºÖ÷Î\9bÂÚ¡^\18v\12ü\ 4c-ª\aÁ\\ 5y@I˪~2 C¯\84}Ks\17MW\83Ïå\8b\ 6\9b\ 6cÓØÚ\ fîòà¸\ fÀ¥ï\8e \16Uû#\1fKõÇÉ_JT\99t^QÅ\1c\8a\95ôbÔ6 Dq\10\Ûy`æ>\11\8e\ fxé²Yj]\ f\e½\17\ eÝÀÐÓT\8fX+[Åã<\eÃ$2ªn\ f\ 4C¯N\16\96\86\8e\86d\v\8ee\ 3­>®=\94kåù\94¢Îø"JÙÈ\13\96'òÄo\1e\13ã«\12\7fo*ÛÑ;ª\¦\0\83Æ@,\0ê\8c\ 2¨Ä\ 5 ¾ w8\96Èâe£Ø\1d\ fCßsûi\8e¡S\8aóisí\1d¾O¢Tý£¥yíÅ\8fy\93Ï\94\1dª\98\94ú¶*â8\vÄ\99îzBî°=ñE¶ap\15ó¥}Uþ\97ó]úÁI\b\80Ó
+O\ f|HÅ\9b\9c\86\93\ 4_¸lnfÓÃΩ©ý|\8d÷§ÔÙ§Ì\82\92\9b\ 1\94>kÇó'ñ|ÄÓUñ\82sQ±àý\94\1f\ 1¢áñForâ\ e\85¤Î"eMa|\9a\95\7f\17p\99?\95üI¢
+¾LD\95×:6Mó öÅ5@\15\ 5\f\9c¾N\ fßÕ¢\90çüÂeÛñê\1e^+Lìh8ÛZ\8an\10fá±\92\9bÿÌF\9ds²£5즭âlð\99\8a\b\94.C?ÅÙÙðùm¦}\ 2±¹\18lý&¨L;·\93hrÛ\17¾*Q\85ß'?&d\1eZGÕB\15DU\\80ïT ¡Qµ\954\1f\97´ù\fùç=w1Þùºç\87£±3L\13ÛS\1a\8a\8ef±w\10ux_:iXNsÕã¢ð\99\8fð\94®»¿\89\bø¢\96±Y¤#ÄcO\ 6\14\9aÄû\12õHÖ\ 4j8\7fs_\95\ fjTm\1c7\80³\ 4Bjí@Hß\1a\1cU7yãÙ\90\92Qø¢+qjo\90×&õs\83\87\ 6\ ecé«Sú\96FÍ¢\84ó:lU\r\r\83óÚY\14\ùQ\99\9d¥H¨G|Ñ}¹\8c¯¬u@W\96)Fz
+ä«zæÈ  kqdr¤0\7f\928µ÷'Å\1f\89*\ 6\96ú\8eÚl\80\90ZñLJÓ\ 6¨\I{¢­êã6ê̲ÁúÀÔÏ(¬õÜ~¶¹>É\8d=jn±\13«»ìÖÐðJ;ødwײgIÈ'.ü¶ûº0íAÓ¤\98ÓY&ù\87"\90É5Ç\13r\93ã\88\f\ 13G­»¡¾*ß9\87ìö\9b\ f]\ 5Q\râ\99\94\91}\88ªç\86úôÎóÇ\8d½`é@où5¿fµûîm+¯í©\94B­õ\ eã\r¨\9d³´K\93      \94\81¼\b\ 5½\9cxÐT.ë\90\93\a¡\12\8bÂ^:jû1w\W\ 6\8ey·Kã&R'\81´¾,QŧÓ\1fT@×\ 6!\r@íWÑË>ªe{JT\83Èû½\7f¿e®Ëå î\ e^*\a\7fà]g«µ\13\1d\e¤\9dæBÍÚf¼PëxQ \98\15ΡïCûtÔ×\98\8dïÜ\9c\8c\97Wi\ 1sòi\ e³_i\ 6H\8eÆìK\8e\ 2R$\7f&±Ëñ\93âï¨+y\aP\e ¤o(\9eE}ì¢Z\7f(E5[
+ï÷D?\1dÎ^A=(\r¸±ß\b±\83\a²\93\8b~\99-<iy)Yl\87\8a>ûu\9a­§\84¶Wc\17!BUF\82Ð\10ÐVÒåÐfè2hÓvi\14K^)\14\r}â«\12U"\ ep"æ>ª®{çoMà\bP\1f¯MT£VBTo»Á\83ì\9béÛD:6®ÚÃ\ø~ÚĽá,c\9anîj*bÒ2ø\ 6vTI53\17P¢IpPjáëÐä\fÞ®ÑY\92à\81Nr0\18N2ðíÉ\7f~\87½\9b\95(\84è\eäW%ªæ\14@Çx Y®Û\1e\10ª\11ÕjÉUT\v\ flTç#ïAÞ2Ép!Ù\95K]´ã9i\8fE\93\98U\15»\94:v§´P;\ eiúµ\13Y¢h58dÐ\1dà{}3!v\16y2÷\1aI*\aé\8a\vФÅð\10ßÂ\19(\1a\934<Ø\90ä_J\9cm÷Ç\92¨Z·²ßQÑ\1e@eÙj\9cÕ»\88ê\13\86z¶'Wó\96\ 1 \84\92®pì7­\1aÚ\9a©\13¢3\17êÃÞ\92~7ô\1d\99'U4ÞÀ\91\8a7iü,ÇÎÕ\18lg]%~ëx\86±3\1f¤²_g\ eÂ!ÓÛ²\a\89<ÐP\82\\91_\95ï\9c\ 6UÙÉ\19ÔºVùXªa{\12Õ#\1f¿        Ü\81»ÀACw\93¡v5±aTT§è´*4*Ã:\93H;]²0>Mqo\9fÙ¢ar\8dÀ\93ô\1e:,í+º/b.µu{'qã\17$}ë\8c\10i·[¯ø}\9e\9dÇS\11{õ±¢¿*QuyËGU7\ 4¨ÚÄ\8b×r\15âM\11ú\8f\9e\8d¬\83Jã²\a\88\vÊlåiWM÷\84¤\80¢Äç§*\13A\90&¬ó©\82£A¦\8burò\1c\19ê©\15\94i\fÖûíÂÝî\ ec\15Þº\92Om|ö$¬É.¯m°ýAÚBÁVØ\95\vsöï%öl~;\89ªð»\10\ f\80êͽ8M>\1d5rdëªwµ¦;M¦º\80r\8c«\99âÝ\150òí1ÉgÆ%\ eÐù\8e·Ðj\16¥\ar\ 3\19\ 1´èrý¹«\8cwUN\9aÆ&dãpXlp\ fßoÚ¨\81¯{\84ʬ\86\b\98ÆJX\13È\90ýª\80\8a/\97¢Z5\ 3Zécî\80hæ¢\9b\80\1añ\9c´7Ä´ÐÄVÅ6 äq\ 17P\85I'\11\99¨µß\1aFz\95\ fÈ\17\8b"\94\r\82ê~÷\9aÕ?ËÌ7A\82é¬CoÞ_=\82ádÅîçËÕ¨ËÃK\81\ 1/\ 3yÇð\v\8dço>Ç/\b\88f¿\ 2ê<\ 3\9e\9f\12®?ÛãÈñ[2Ê\9bgX¹\0ÄyG8\82^*\93\19\16       \ 2VY\ 6ëK\e\11I:FÜ\81\82VTïz(\ 6\97h\a¿\96Émk\11¥7Ý\96\94[\ fªHi5.\f«KqÖn.SL£·X¼Úc Èz\915]t^ %ê\v\ 2.ó9Fµ.T\8bj\87Ò.Îéæ¯\ 5E\83,è¶DÔù¦x\15\8e7­Ãd  eC ×\ 6\84\rÎo\1cV\88\1c{°J\ae_+fìí±qô6=º|Y½\12b°J<àûr^\18G\8b\1a÷ÓæÆ0\93\99\17ñWavê\94ê³ý­Ý\9dUèítê\ eøÍW%ª\11\ 2x~\9e\1a\9b[R\90gÖ¡U*¨ó&\83\ 1ÄUì\ e\ 2Êe\91hê`üÿrÐ\15¼BièpÈ'È\1d¦¯¸Ï\ 2ùÕ\en\8a«Ôø©.³UÅ\\14
+°=ßÍ\96ç\99Í\f\82YõR¿OÑrñ5¹,3©        \1eås\936ß®\8eÃö°õ\91Ø\84üíä/%ª½/­O¢´UvÛ\81:á´·Ð\81B\1c \16,\808x¡ï£V\87\vTsz¨\81PlÃ\85{Xó^\1eZªô:Î\84\l\13od¾\7f8ÄÌ-pô¬>Ãø)ÆlâeñcðàÝ\8d­oëÚéAË\1f÷£Ámĵ[ÏÑ(\9c§¿*ñÀCÊ\12\19kWg\r5Ñ=ëBs\89]i½Ãm\8eÁÚgQ±3ñ k\1e¤öX\85¨oû·J\7f\9d"\91ÑÂJ\99£9\84¯§3tQ\9eO\8fÍórBU¸Íø±Â\ e\ 5#£Wg\89\8f&p7ö\ 5FÉú\98\1dJÆX\1cÎ'cu Êck°êϼ¯Êiµ\9c\8a\8aðJSü%AÒôºvÊ\1c\89ª\8fNCo\ fí3»xnmßtkÞfôÜ_\97úÊ\aÏ\b\9e5ÃBzrc\83üø)ê\95Ñ[¥ë£Y\1ek\ f\95ݾ7\\96áÑ@_.§\83u4[ô­ÉxÓß\85\83}¿\f\r\90\9eS[\92=H_²¿\v¸Ì\9fJþ$Êk\8b\9f¾ìél\1d\85\8f\1d3\8a\10¥ß)\1c\9cÕy°½áãõ:%2\87ž\9cDgX\8b¥&ô¨É\8eÇ©·4\9aåÎÚpYRâ\851\83M\rs\ 6\853á÷÷-øÚsÈͽ\a÷ö¯^í\81¤ºØè\90ë6ßH©\13\88d½C̤nû¦òï\8aPC\16ñÚ(:3~.ñ\9e\ e\91ÈâaÚ\87\9aY\ e7\oð\nrhbvFß¹É\8dáª\0\1d*ÛÜp C\89E\7fß46=\870 ^í.a]lÈ\93\9d@ Ù\ e1eÄöM!Õ6½dÌö 'Å.Gëi\18Ak\RoÍ·í¾\9b"ôÈ~U¢Ò0²¢Ò\9aLE%l¼\89Jcë\14\15Ãt1*\95à\15\10K\0§·xNúQ\97\96ï[÷ø(^9\1ej\ 6³ZmpY\ 4ç©¿\ 6Ïr¿ÐØoλiw\7f.ݺ¨g/+8èô\14\8a\179¯ºíÊ®\97\1c\9b@hßEdý~b3     ß\9a\x÷w\89ÝÁ?\96ü._Eý\ 2g\9c¥úoQ¿À\19w þ-ê\178c\83ø\9f¢®Ó§¨\84òé¨Ä-·Qis¶£R²X\8aJ[\11\9c\1eSrT\9aÖnwÿ\84Äw\13Þ\8f¯ò51Y·.\8a\9e\1aø:aÍÏÖp³:\97\9dgßê°WËF¨ëq\11é¢E\9fq\eÒUt\eTZs\e\ 5BÜO\8fC.4åéÊ5Öõ\8cý'\89\8d®\9f\14\ 3Ê\1c@ÕN Éêû\1d\88ëÍ\ 1\94³ZTòo\87¨tijO{×\7fÜq\80\1a2D²\1aH\13¨{Yê\85\89\88\8bsù2Þxpªrpϵ(Þ\ 4ÈE¹+á\N\12å\HCp\8eÕ\93ê´5ßrÚzýz\ 2\9d\9b)ïægÝäl[\83\ e\v\12\95Ø
+\80õ\ÀyÆö\9f&À½½¨d`\8d¨Ü(ÀQy¸6\9e¶¹\8bîí+\9f\r\87\1eÌ'hß76©)è\9b*k\ fÞµvî\99NÃn\93;aÎñÄ\90vø8°6µ^       65"u»\17H®Ý»¦\1f¦|\9cǾ\80nꦣz\8f¦¡\ 4ù§ö\ 5\ 1Ñl\81\18>®¹¨\9c\15!\10Ȳ\1f\95sJ+*#}4*3\94õt\1aÂûÞ\19ûùëK¬6b3%³e\87þv\93\9d\9f+*½ñê»îÁmÕî¨C´$¦\1esÊî¯\87üéñ\9e«'Ðá³\80¨¡\95|moºùô|õ\9ci\9e\94ÎQ×å¾\ 2«?\93Ø\1düc \b\89Ê\99(\1f\95k:\1c\95¢æ%*/\83NT¾CxlK\ 3Ô\95üºw¸¨p}\17\8b¶eG~    «­<d\85í\<U\81\1dBw\8f6}8\90§'Ú\8bß7§\91X\92¬w¥jXï4hÊÓáö¡[Yû¢¢\8f²#ßv¢)\8dü\8a\12\v\ 2¢9v\ 1\10\95û\16¨ë\?øLE¨©NT©\1c\9aùtT3ºw¢tþ*\16\8bæÛã³\1d£6\10úà\\95\1cj3  òx\8aâ\99\89·\95\17,±üR­)\93±­T£\1d\1a\ 5(¼©MõíÊýÛÆ\14ßF.ö\ 5\84e\8f\97x\9dÝò_\10\10Í¥\a(\8bŨ¼8#Q¹>\r£JºÙ\8b½^4ªì=ãé¦/ѽ;(f¯"ºª_ÖÑg$\1dONlÜ\v£À\ eéÔ\ 1¥\84\90§Ä¨ÊZ³N(\99ÊÀ4Ì\85áyÆ\1a4Z\15ë\95}ééÌNâl|Õ\84\\95T8+¨ò\e\96áþR>©½?N¢ru\7f\ 6\94\15\80
+Ý@Ë\în\80\8f\8cD\15ë¡G\95S)º\93©Y6LTÉÚE§Ãþ\19Î\82gL\90>#ö\83®\1c\84ÓÖ,Hrߦx²¾üyØl\92öM=K\9d«ô¼Í\1cA9I:_\1cµ%®²O\8al\9d¶9\ 6\8b\v\ 287 ¤P«\14\95©7\16\95é#à$Ö½\8f«\1ehPT-&U íÇýjÒÙp\92ðk\17£\92é\9e\1d\e]ºÁþ\8dØÏÔ\98<MN\f\83\8ch\189V7\8aIÔÓËO*\92¢ÔØ\15\96\12cp§fCe\91\94'2x\9dåi²=\8dý4º\97\9cÒ_\90¨Ü\83AH©A9*+Yð\rºi\ f\10\eU\v±\ 34ÎÈQu3¼=ÚÈ9\13ò~½\16¬FÛ®_á͸gã\ 6×ìÁ~\1e\94¼J¬¹:¾$£È£¦¾\87 P¾ç¹@X\9e\18\8b«\b/\95Á\a\94@\93\93\11KÝí&C\rû\ 5\9a\8c\9e)êï%¶TãcT\9e\13þwT§|\8c*åË36&ÛQu\1d{\0\U\8cªçCø8öÊ\99Û(EÔ\ 2­çöü\83Z\9dyx\1f=8\ 3Ä!N)ìÎ\99y1#ë\95pdÅ©û1"\1e\ f
+Y¤l*ôÕX\v\14C\15\95y3ädíPd²i\91\84\14\17ä;§<«|çÜg^ \9a\fåñÍR}öø¨Ög.Ïææ\98¹=G\85úU\8eàÁeÇ^\17gt8\81íWµF\98\eI¥Ô Ô¡%!\9fæ\84|b¥1>\8d*Ô=,\b\ 5,\99\1cY41\17i\92Èìiò¨Uàãqånbkèsü{\89Ê\a\ e<?íM\15T|\93\0_£*@\1dQ\8d\998\13qÎF5ùä?Ït2{{>\16Õknàô}ø<X¸ô\11\89\87Q¦é\10\90z½] )\9dîB\1c$>\10\9a\1a4é8»\99'2Ä\9e9®ÓKê\98Wg$n®\ 6G|\97¯c@Z_\96Ï£\93\14\ 1j\b×¢JªO\826Z}FUT¨GµZ      Ê8\13ÕK\91÷èbê+\9c\17FÅË)zw¼pLÌO«âe¥7ÃôZ\92¡Ú\92s)dIE)\10|}4F0§Qç°Úä\93¢\b\8e\11\81ÕÚ\11\8eÕ:      ¥\bÃjåÄGÐ/È\ fÎ}\154Ð)\15UÞíGTÕäØík/¢zòã\vDõcݹ½\12êý\9a\17×Y\1f½,Z\8eð\18\8f\r¯9\9d(cq5á\9d\19=¦Ùn8>n\ fð\14m\19ü\ 6\1eè<\rÓ\1cC"\9d§tD\88\9a\81#DVÅ\90 \7fÂÐ&äÇrE?\ 2.óûÉÏ$*Kz<\1d\8d\81\90vÖLTm\ eï±á\17¯\8dïM¢úÖ'\1e×[Ñ\bå\83q¹8{9éÝwBÓ²h¾­õ\a羸Å?Kåã\9f\12ú\14ê¡G"7\80\92\u¶3Gyü\90ɬ((qX\1d!îtÀáA\8bÄazÃc0ÝÂaø\86\17$*\9f¬ÏÛ³R¢ëQeº\8b\17HM¨Öó
+ Î\ fã¨þ*â÷áó*\\v\9ekûí^ýíd¶å²Ñ\92«Uy\99mÕ¹Ë\19jRsÎhb>^nB³-ÓÚ\95ï\97Ñ:P.ðæ\9cnл­U=ÆCÜÕ¨\8d\1df\8f9v\10\1f\13\ 4Jd&\104î­¾"Qùz¾F\95¶Ø\88*;\94\ 5ßøy\10ÕÈG.ªãÌàÑ\93\8dÍu\93\ 6}¾ÞyÉM\95ÉЪ5A\1dòo»(¸3¿D¿Ýwé\bi\932üÒ¬òήáõ5i\86Ã%\7fI"ËèØãÖÁ0Ol«÷\12¾+ÍJèÎ\10«È~ùn@{µÙû\1fùXª\7f(ù]¢Jâ\ 6\13\1d 
+\ 2\a*~\15ïÑ_J?q\9co\86\v©Ý÷ÛéêÂÉÖlÊÄ\9a}W}÷Ó¡hËÂ\9b\1d*ù$Y¼\11\19\94Içã¹µÃf&\16¶MN­­\1eïFo9mäW\vùÈ°Ë\84Ó Wô.\7f\\1f\8d\17ºAë/x[E\92\10hÔáî\v\12U\8aoðöÄÏÍo\13\92\17.ªÍI\a\ 4´\eÝ^çjÆÇSǬ­\9d;=#¸\9cqu6¿+b-<ZÌ{W÷\bûå\ 5(;Úß Õb\18íÜÆ>½é\16ùÂj\14´ëËÔª4\(yæ0_+*¿È\f\86ñ×s\99XfðåS~ «[)<¬;%o÷\ 5\ 1\15\9f\ 2!5Þío+\ ek'Éx\84ÉÜùâ\Ú'[Ó\84Р\8e㶢\1eüø×ã\ 4\7fÂÒ\8cø\1a\8b\84ó¨êè\93t,H\ 3­b_\9di\97ÍU)<ã­/\93ËÙ¾\9a_,\87ùú|3m\8fæÅ\94\ 4ÍÊ\91ÏÏLþ@ÏWÛ<º\98é/h!röîO\12\e]?)\8e*ÛÚ=ª¼Ê\9fÕ<Çx\8f~1ÌΪ\94\93ñ
+¸Að·PY\91|GÀ}mÍÌ\11\18%Ü+΢ѶÆC:\93\90ö\90Þ3·í\17\87\\10O\13-%m\7f[¬*\95×¼h&s³CªT\9fº\83Þp\8aäN\87\89?M³Ó\9aÍSS\9bꡳ­\\82¿  \9a\9c\1f\8eúQM\1aÆ\rúþ\98¯\ e\8e¤n:\ 6\81Ï\8eJ~^¿   \9dºÖ`\163kF \98\v¡/\98Åà\\80\91{XfØÍM5ùõHé+Kùä\98\8bu\13vç%µ\15Ìþ\1fioÚ­*\8fµmÿ\16;zE±¡\17QP±AÅ\ 6{\11l@l\90èÿ\7fú®ªzªF­}×\18ï\97\ 3a¯±9MB\9893\13\vc4®\97úé¬<:b\94\i·8éI\9e´\1f\13\92jÎ¥G3;\93Ëôiò?\0äA\a\80Â~*\82¢m¨ç&\92K\1dǹ4¹u³Kk9C\aÑ\1c\99\84q®Üð;!\93Ûô±8Óí\ e\bÐf\89ƨµ¡:f\13-\7f§\roaÛÊ¥ÛÝÕ\83\96äÖ\99q-\90«ýüS\9a\1eK)\89\93e\\l\8d\12ÄC\16Åfs .úÁê¿!q\aÿý
+(4w)@{oî¬ârà<H?Ø:\15\ 4]rÎÇ\9ai\11}\1aßuý3\W\ fdÏS\19®;\8cv-ý\1d\1c[­­\98ÖT\17Õ:\8dBáe(ÅïzX/_»\89  )×\i\91¬\83ßÂ2(»¢Ô.^Å\14©¼\ 4Em¥\84,báB&\8e*ünY\94ÿ\a\80Âå\9e¾,\87¹£SÕ\82Í\16\r'ÉøÆ~ç×ù\19\19ã      \91Z\rë¯\86ßëæüo\97¹ö)]\8c\16r`«\8d\v?­)Ã3'Ö«â«.spø/\89X_\17WUÅ\10Ó}É\14\1aG~Æ\1fÒµ\15ß\9aJ\a\1eãº\17î\18L\9248®m\9eR\1c\90ÿ\ 1~-\7f^9£»dmtn>¶Ù·aOácV\18½ºmi°ãü¾qÑÄe§z\vN\9a\92ÊûMÜ]&®z\83¾Uâú\84}¥eî»CÄï¾O\8a
+Ö/     MJ©ðN_\11xü¦(\\97ä[\1c\8c+{l/\96F,m*³ZPîojÃÓÌ­1Æúò+\92¼Î\7f\9e\1c\a\f1Øh⻽\88ÆöÕ\rÓË\11wñS\ 3Äæ
+\ 6í:B\9b{\12ÍV3Ûî6.=\7fX¿[\1d\vª£\97âw\17ï\84]Û9òNovN¼Ó\80£\1eú\83í³Í$\13\92¥ßF*qN\91ê}m\90Õ\892/W^û9W\99µ\8eõ
+\8f
+\8f£ýÿ\ 1\9bý}¨,f½»l\91ïµj\8a·Â±¯}\17IâXçÞ»<µµ\98\8dU¯­e\15æ\1eà2÷éÓâºY®
+ÈéÁñ¸\7fª³\97\89ÕdéhÔ®\99\82aT﫶Y­eZVeÖl,ÊñQ^\97ívëÀ|Ï­\13³î\rn\8cBÏ£ÒÎÜ&ÙÝðè#ÿ\ 3\16/¤ÏNN^\8a\e|·#¾×ÍĶ\1eOæfSG\16}%\18R\13\99\ 3³\85¨ ü\8ew\8cì\89£Â£_\vfVÒÒª÷¥\11W^ÛzªÂ#b®lëU\8cù\9e\98\14¨"\93ñ\99j©ÉÐ|    ¹sJQ¯U[E<ª\e´7ï\8diê3\@\1c\7f\ 6¼ÍÏ\11à/r\ 5ð\99à\ 1¼ï#\0oµ4\88Û\1eà¾\91\818q\0_D]\80K(ü;\82\ fbÒGãwaõD¢R\7fK½FËqéù8«Õ§¥ªÂ#²¹úc^æ\9a\8fyJLÆ7\ f\rî\80\1dNï0òÝÜm'}  ³\8a\1fø§*w¾\8cÊ\8e{¶XýðgüYg\12\vüÿ\95ú?èLÖ\11üïRY\17à»\ f\ eðA\eJ=d\8f\80(,s\80àR\ 2 \90â\0àvq\rp]\ fßg?ÿ\8d\86Õ3ú\1a£c*±T\9f\95Nùɪ\1cû\88bNz\b\ 4®ÜÁ\86ÒîK\962îË\828¾K\a;K\8bÕ!TÖ®\1fè\9fNp-\ 6Áé$0èÁ[\8eo»?#)4"S\82\12v2,Õk\8e\0ø|Ð\ 6D®è\ 2Â8¡\80\98ÂN\97P%\13êmîbOjÞß=¿\90\8a\98ª\8f¿*`L?Ù³X~Ìc\9a¿\7f\88\8c|_n2Í»\9c\8fÛ÷ÔþÛ\ f7"\9e\f£Â\r#®Ã\r¾8\aGA\v®\ 3.öOó!qt\eÍöÖÍ\15[ÿ\a\0AU ÎKë\ 4ð\88$\ 1¾·:\80h(ÿ°ÏaLôómÎæ\ 4ê\9d8±g÷\1foÚ/¥_wêL<§#\8d~,T¦zÿ\98\88p_¥2\8d{:\1f´ÂÍüÒ\r\e¥û(É`\9b\87\86»ík½ÀÏ¿2·Sô.\9fÜÍe°wÜÔ{å´7~²<îçø+\0Q\15 ÔWÛ\ 3\0¥F{\ 3\10§Ù\15\90\158"%å\89
+?y3¨<ðâ®3yF\81_ɾª\97\ 3ùäF\9dÒCäèÄ\1aº×ñX
+·y§\116æ»öm\1fÚý[«n\8fo-Ø\97ÞÐ+â\ 6DH\87gkÓô½tuî\1e±vz{(,:ö~ð­Îÿ\f\e\9b\9fB£¬3 jB\1e\10ùk\ f\90\84ã\ 3r©ç\ 1y\v4@º\88\rÈzæ\1cç\ 3û\15\99o6û|½Îù\87]QË÷U\8cóáv}©\87¹½ÝºµÂ~÷\86Õûfp¼\98ó ÝÜí\83\80\8c\Fö$ôÒõ\91ë¸åp·÷áËoWy\ 5³ísæLÿ\f@tZ\eX®s¨Si\14\0ae\a\804¿\89-mÓ\80\12\906 JÕå\8f«\1e\8a~\èÅ0¬Èɹç<\13\16\1e\92Ü©Þ3vF\b\91ÚZ¹i\82Ù\ eÜ\8e>\bÈ~mì\9f\80´ô\8dÑÄ»\ e¦ÎÓ\93ÝùÙq%ÿ°\1f\8aÕõöyñ\16\eQ\96¬õ7]\1eÿ\0Þæ_'ÿ\ 1@\8c\rØZë\9b\v ºm\1a\10\8f²\99ØÒw@Í^%@]ë]@í\87k@\r\16·\98Î0\9f¨b\r\90§@=\v\8fT{X\vw6"ß´h¦þÌF\8dù¶\7f\9eå\87~a\99\9d^}²¸»\ e¶fè}\ 6×\9bã\9a¡»gp|³åxs±^\9dQk¥.\8e£\15".Í?\ 3\10«\ 1ÔÙÙ_~\9aÀÄ \ 1)%\ e\93ؽt\19äkÃ.Èñ  "7\88{\1f;\1dUËWì)¬1ú¾\19\8dÙ\10Õ¾ràÁ·\9a\7f©Ö\f\9f.¢ãë\90\88ìKÈ¡Þ\99Ý Ï#\16¿Ï»0\8c\93÷ÍfqSìÕ.w²\96ÚÝ\18ÙÝle`SûÂÿ\ 1@¸Ö\ e\96ëé
+\bo^\ 2¤=\9b\0ê²zý\95\80\9e\9f,ÚÉ~#6<}&±@Üo\1d¾Ñ\ 4%°§(Êô}\8bº\\88\ 6´\12tç¦æÓ\17¢we¤Óä2f\8fÛóSÏÞ\8f\87\19æïîØ÷°þÊ\84½B\16ó©íu\85ñ¢Ï¿\asS^\19ó2ùÿ"q9þýÊ\ f\0\11.÷°h¯Pê}Ã\02ö,\90§ü(É\97\85\ 3ë{²5Ê÷³\0ù\ay\ 5ùM5\1d=2]üi³K¨s÷ao.R­ÿÌ \\83Kþç')Ƨåì´è²;¯\8eµ\1f{FË\1c×ëJvµÔñÆtqÙ§Çss´\1dÎ&Û^\7f\1a!bw:s\98ö\9f\ 1\88Ï\ 6êt\1f> ¾Ç\9f\8df(î5\ 5ùÎ'J2\11iP\10Ã\16(èÉ^\19\12\97X2~E\97>òØä6Tèô?\95 gRâåY-6¼MéÝ<ê2Ý9\\18o¼g\ 6Þn½\96³\eÛ[Wfó\0\1cƳÉYKVáMg1Ó³\80\94éX\92\17w¬T7Ðÿ\8c¿¥\86 \0$~­ÀÇ\b\9f%nß\eJ\@\9d\8b\8f
+
+\81\fu\ 6£S4\15\9eI\0õL/«ß°íµ\91 ø\\15ÎöªYvµaºzð\89\98ÛÕ®)i#©\86¶ÚY­\89\9d¯åæ³G¥7\9eÎ\11zh-\99¸g¥Ö\811id×íñ¾ejãý`ö\9fH,Õ\7f¿\ 2Hìx\80\ 5\9a½\ 1\92¹Ua\ee Ôoé\ 5
+Ãm²³4©\0\9a\eMßã\93px~ë\87ë];SQ\10äG¹\8bð`0·MÌÉ\ 3\ 3ªù­XËÒ«ÖâSþ\99ñ\bëÂ|\84VÛÓ¨W\1d[2\1e\f&\8dÚº7Þï'Ý1\865Û££«è£v\87oAHÿ\a\0Yº:°4a¡\92\ 6\e¨ºø+¯\93}\80\82\9fì-̱u@o÷ã\88/\94V\8ff\7fáÞ®4\1d^_\1fåëi«Iê\102¹ìV:\98¹\15~\96ñ\ 5SâòÓ\ 5Ñg&\9b{Y\1e·æz\7fäbJoDv\8a\1dóL\11ºi\~\16\94Á#¡\99\85>Úü\1fð\ f©(,R\9b`A¾Þ[\80\82Öx\0:÷$\92üSé}\ f\ 6ýWJËMï$zØ\a£¸\97¼oÎYgÿt\ 2;~íD~\0\bù.Ê\93UÊú:\13d¬­N¤I\93­ê \f\8e]\88Sg\10:§ö ´\8f\1aÄ\15Â<5!n?Pÿ\e\92\7f\9e\0R¸A©L\1e\96jP\84¥ºZ$\86_;\ 4´\9aÆ@1m      Ñ\9c\90µGkü\1eÞüãs}\15k±ç\9eÞ%\7f?{÷ok§ñyØLÚ|M\97ná=&\ e\99ï°,\97\92_\8fëÁ?¤\8dõ\10S{⻡÷ì\KëŬÑês\86\ 5Ñ\18©ý©µüAãÏ\0d+:\ 2R,ÃW\12­p ÿ9/\92ý;n?y\9d[2\17ßÈeí%\elýNåsÝ`ÒÁì\93Smî\9cqýìm\e
+qYö½i0³Ëèmì:«p8ÎØQOÖöß.\1aÖɶÁ\8f¥\8e\1e¥µn³\8b5\8d̽¤\1aõo¥a¬\19!\89Ó\8c¯(×ÿ\a\0r\98r\ 1©ñ\ f@õú\1c|âÓËd\a\87kòûaé7K·ò\8fÃ\82¬\85ÅZ«u]ª¾åöÍÈÞ\8bËz\12Ü®Éãþ8\8f>´g¡\83ýÙ,çÄkoM\16o\9dÎ@\88t\ 6ù"­çYä´1yÖôëÑo¶Oü³ÑÑg\1f¥ãì>õn3\8fÉ\10äïH,Õä\bÈ\ 5êA½\12\94z¶¡Ô!¶\0´u<\83â²ÿy­Ê\85ì\9dú\92yÿ-´¤SûÍô\9dÚ{dmÑ\¼´'Hc;U9o?\1a\äC\7f9AÜ.±\0\17íA\15\1eM{\13\eUÑ骺Ö\ fí\16Go\9bZeºmè%\12>÷×öYnw\8f¾Ø>¡\1fùÏ\0ä\81\80:\ f]øö¬\ 4<|Ü\vSPLÝ\9c·µ-&¶Ý\ 3\9fïC\7f~;~ϸ4­\1dÃ×ZÛmk\15s5PfÓyªö^\8c/\96¾\1cÄ2¹1p4ØéãÚÍk~úò½q@2i¥ýЪ
+©¦{\8dÝ㬫_i¥6ßÎJiYñBÖFS7ÙKU\eõ¶â\9f\ 1H¿x\ 2ä{ö\ 6y\97\16\ 1Í
+cX\9aÙõsë\8dV\ 1[ÄÖ§ÎÚ}\1ek\19³´Ï\f-yÝÛö:\8bE§<´Úî!q L\16/O{Í8m·Íóeݲ\ fıá,\a·úÅédäà\14Öä2½\99Ô{HÁPÚ¹s«Ñd\17\8aZß,êM±¼\92\9abjÈÿ\19?oÏ\1c\7f\ 6Ta\97x\93\1d       Ð\ f£\1f½ÙA?IAm\9d(%3vf\17ä¹C\19\16_\ 5gµ6ÿ®ò²EÍß-\93³¼nOk[ý\ e\93ÝNZ\1fçµT±uíP÷;©P®Ü°\9cÄ\9e\eÉÄ\8aľºSi\12ÜÆ2#±ÝzAûhõ\93æ6\14ç°\92\e\88¿\90þ\f@±ú\15\v\80BäÊ h[ÚUBOø\89ªwy\87\9fv\93ÑÚ¶]\ 2þò1¥2s%Ì\17&W¶Ä\9aü\88\92{N\94ovÊR©£¥(µ¯êF0Sú5}+ßëù³ô*\16ßbLÊ\98\eN\14ûÎL\8c\8e5Kª¥,C
+\1f¬&\ f¼·"_ïÏ$Qùçø+\0e\980Dj+)@\9fÒÂåc]\9fî5;\88\ e\80=q\9bsic-Ùmú<ϵ¸Ïdpj\10Ã\ fß+÷\|'vFÏ\87ªÉ\87\ò¾Q\8f7±«\\17\97a½¼×§RD\157b\fògQªHoaÝ\eaB&\88X!s{M\85Ïrg\89ü\93\18\88³\86¥\8b/c¤ý\19\80zx?]g¡yÉ^ç\8dÆÙ¥+\9dã\1eØC\7fc¸iÖ^lÜÑL\9bWÝñ\9dèFÃÕËE{\1eM\97:w¡Ï'\vä%Õ}\1d¤FáÉ4êc<hKï\92Þ\13?\19É\12S\80_\v\rRòø½ÚMÜA\1eµ\97Yî(ç+\;\1dôøf\15·\84zz7\14ä­9ø3@^úÞýIÞ]¹\86\15Ø»ï@²×ÆEw\16_Cå¦\1dàôÆÕS>Éë\1cÖ_V⡾ãΤÄç4%ÕÆT¯s&\95`ÔaêÕ\0¯Ivv'\8a«Ðl\bÛ]³Ã\1f\96\92ÉcgiÎu\10ýÀ\9e¥þ\955\1e\1e`\vÓ"Uó9§Î\1aýú\88=õ9ó\a\89;øÏ\93ÿÀc[Üì<Â2Ç»UeÐ_õ7¥áüó\95më"\13ôh\96·\1a\83\1d\9fÄ\12ZoÝ\9e\87ÖN\89<\95º\bW\85y<ïòL\\ 1ñ»o&]§\98q%B@.µ"\8fß\8a5\8ez\16ël\9fãÛµÀ\94Ì\1asj.ªwÃvª\93\p«V\9dbªZµ\1d¦ò\92¾â\9fqÚéýÁ\ e<\7fÌû\15=è4çi\94Ñ'ÃÒñjÚE?Ûw$\951h÷U×m.Õl:-¶Ý \83U¿^}scIÊÜçbæ¸ÛðN¯\7fà<³yb/\96tcé·ò®1_!U\9d(\r¼òÚ\e¥
+\8fYüO^§{j\95ínjP\96òµ9ó½Î\\bçògì穧²*\1cïülý\80c\e¦V\94\87õgÚëyÊâÞ\99Ð÷X«\7f±\94Ú%Õ\1c¼Mý>ñpÉ®K\ 5(\10­ò\8eñ\10¹.³QX:2Z\7fÙ§\93zì¼v\8di\85G\eË\7f8§Æ\85Qhëùc\9a\96\9aå\10/!Ï\©èLe ¢­ü\vð6ÿqå\a«Óq]\9d­Ùle\14òËZ\7f?}4\fúh/´ï¼5jâÎa¢\98\f=\97âål-f\1cþÈë\85ì\95½\8c\8f÷\9aÉ[ïêDî¥*3µ\9eM¼Ód'ò\7fا\f\réZ ¹3Râ\9c6ioÎué®Ð\9b\14.«ñ²Ð¯\1f\9cB1ó\ e
+Ålîþg̾ÙSqt\e\15è>ÒÝ\16\7f|hã¨i\99¥«6èëZ\94¹øÆ
+;\8då¸nñ,Ô\82é´Q\9dH\9dv\85Ïqý²\84ÓcFÉ#³R³ø²\8bÎè¾)âÏà@w¹\8bW¸ØÞµÐ\97î\8f|°¹Çùrî\91¦î\ e\9a|\eªF\104ù:Õj$_h*\10]õÏ\0\98Î\8d\0\96ªÛ\054\a \8d8\aÐçV\ 1X]°\ 1ÖÙ\84\0«>1\80e\v<@¯­\9f\9f\14Gçsø÷Âþ\b\16\ 2ä\9b\ 2\0ñ°,@Ö\152vjl)Ö®l5Æ[²\b1×Þîç8xSµÔ2¢\85ìá9>ï\ f÷XjìÃÌü½     ð\8b¶ü\ f$.Ç¿_\ 1\98)B©\ 4ü\84Z\1d\97A\0\e\0[\19+\80¹·'À&9\ 2`\8a B½F\ fêÝÀ?\1e\9c<(6z\0\14Ï~¡Ø\12\1aëù\1c\19ã{,IQ|{\ 2Y{wÂ\92\fa´ßTgiF½ÝcóbÚ'ç1CFÇ°\1e}v\81^\1d®¯}ýkÿ\19\0³Õ1ÀÊ\1dxëÍÐ\ 5è\14IBu\80\8dÓ-\80\e\80ãÙ\b
+\ 5õ6$¨w>\84z\8fk\80îog\80\ eá¿¢b!\13ëÝ4ööv\9f»+¤+o*ÌñoÊ­¨Ñ¥Þ0¢Þk4y\ 5Å\9bó¬nçnøÝ\14\92\81³Zì®}ó»:Exmúgü-U\1a®\0z\9aÂRzVaM\87\85\7f8èÃ\1a\0¸Ø¦¡XC\86b\97P§òøù\11\a,\97\r\0z âX¿çrïSæ\89¿»ýgñ\9dGßµè²JKQ¿\8a5#úÂö_AÓ\98þwéÞc»qº5\85Ãáz\ 1øæ\\e*\v/ÕÜOþ\e\92ìî\7f\9e\0ÌÑ T}\fKõ±ð\0&w\b\80\v­\ eÀ\ f©\ 3\807ÿÂOË\12Ô»\81-â{\85Me\93Ú\ 3\8cEoñq\81\82÷©ó̽ó³3\19]Ñ3\13\15å\ 3û
\87$T\7f\99j¨¿L¾0zÞGòú1ãZ§0\13ù®\9fo2ûS$Öl/ÕßÏ\8eè¶0ú3\0\16ô Xs\ 1[$á\9e\ 1v\Q\0ßÏ\7f\9e\e\82å]@46iøéQ\ 1¸\1f5¡Þh\fð\14á@½µGL\8a©ïÛè¼±hPÜæ£âr[y\99ç)ÿ*««Æó\1e\1cºÏ\89þ\99>^[Á\r×\9bôÅOf"O\91V[»
+0\92\15\92α\97\1e\1fòßñàÏ\0X<\84\15\94Zöa}\14ÃÂ_^/±é{\80xDY@\9c\8b, zµ6Àãò\14àzí\18»\9bZ\12r¼Ï\1a\96\8eüÌ\19\7fÝn\8bâ«üìTa|Õ\93\9e5Sk>"b1|Ì6áò.éØ5 :êé\14\9d\9b½µ\16\ e\99ó'ûR\8d\el\9fèËø\15\99\1c\ 1\8eL-Ø\ 4\ e\ 4ÞW\80ϱ"TI\f\ 1YvÎ\80l\97\11\88>\ fHrÒ\ 5ÄÔ\@½ú1ö\båù¦±w**]\âUi÷JO«Wgÿ\9aâáO\ç\ eØNÒÒî ðtnhkì\9fÙ\9câ¸YÐX\1e\8cÅÂÚ\8d®Èpó\96mc½¢ùö\9f\ 1pn\vu\ 6.Ô9Jû\80È
+%@\12<ÔyÌ\\7fF\ 4¨\89\ 1\128\ 2¼rï\ 3²rYB½»SÜ\95ôg\14\88¹Ì+L\1cÿ)©2\8f7Í wðÀÕû\92¥û÷\94&Ú¡â\9do\97\91´>¹9T^\1f
+Zoº\9d¢Þpý\99JÆj«§\92¹µ¥\96·Ô?\ 3àª\v;\80ØßÀ6J\ 6\80è\ eÊ\80´'#@ñ¢\ f¨Ù\ 5\aÔ\1c\87c\83\163\0ä\87Yÿe÷wc\eê<ü,({\8d_.ùäHµü\10\1cJ¼ËÊ«\15nZ±\19f'ÌÎÏ¿\90ÛÏ4ÉÞgÔù\96½Ùæ:\1dd\8dåa½oÛ\9dA«µè\8d1åÏø\99Âë\9daÛ£ß[ØFå\10\10÷}\ 5P\887\ 6Ôez\ 3ù<E\81|­SO6ó0\ 1µ_ìÞþ\v?¿\9elíöä_ó÷}½E²¡z_ço8ÆW}#>\89×Rc®\9d­Éhì-Ýc2\85÷3C²y/û£\95*\9e\fÛ\8dÚíEÏ%[óáù¬ÌÆñTþ3þÖɧw\0ï\ f\1e\89Û\auö¾\13\90¯úa²\8d\ 3õ\93\9f¶^Õ\13gzø6]uù\9aé\8eó¨\8f¯§°õÄÂÀP4p5·\9bì)\1e¸¨\97Aéüñ`ĬÓþÞÕCáÀL7\8b\91>Y!̾¿¸\94
+í¹\99>7gÕ`Ø\98ÎÊõº\15oªÉHúçø+\0>\rg°µ~`\91^\96\8dÖ\12cr
\91\ f\0»\a\12\14p_\8a\83ñ\9a÷\91ÉCy+Ë\90(\8eö~ º\97ó\82ë'¾\80\97ý\f\9eÎ)µ\88÷Á$\95ÙUGsr³pZ\95õj³o/µµÑ_ÐËg{6áÆ­)OT\15Kb3òd=¿\8b\13¥õ\7f\ 1àÛçÏn×x3·\ 3\ 4uz\ 22®±°@;\89\87ÊÞ\93\r{qP°11\9a\96ÆÚ3m\ 6ý°}/ZþíÙZ\9f¥Q¼sµëñxðõíeÇV½p#mÑhÕTÆ)Ûë\88ä¢\8fv\84Ù};M\9e\9b)_¦U+\95\7f)\13e~\91Ç»ÏZ\1c£õ>?:Ræÿ\ 1\80\9f?sXñ\18ÔÙ\ 1\11 ¸&Ô9^ÌAAl\85É>¨Ø;ôüäw<\9e_\8a\93ïÚÆi\aA>?¼\b_\7fê\1eMÅ>\983r³\8d\99Ìa­¦Ñ\93\16®ó[oñ\9cF,\9f¶lO¢'k8\9e\19ïK¶2:ÖuiDìxÁ<5˼i yÖÌ\1f\89Ú\ f\12\97ã\9f'ÿ\81¿¥Î
+{@¬³/ØFM\ eäC?1&\a\ 1 s\9f\4\8d\16\85Ç®O³·Ë{׸Â>¾ë\1d>ÜÐ\19D\91µã\1f\8bÅ\1a\ 1J\12§Ù=¯µ\9b=§½£µ\8c\82ëx¿ëF£ve\80\99F\13\95ÌB\91\90\86\ 3\87\83Q\8a\1f\96Ê\11;,\11Qmp;Ý*\7f\ 6À_i¨sWùùù]â[~\ 3ê¼ãA\81IÛ à[×8 s©\97Tê`wý\86\97\82\9b\7f\97ÎJÀªÇËôe칪1ÜäDfb_\eÑtöº\85¶U?ev#wW>\ e}ãz\eT¼sºÏ¾Û\\7f\19FÁã\92ïOsK®o½ç5\88eµoùËÊ\9f\ 1\88\f\ 6_:»Ò\1e>ö|\ 4òä]\80m\93\\0º°9¿'â)zfÇÂ7,´é¤\17¸¾'fÍkw\9fòáAôµmf\94î.Ï;o0·¼\81i5\10u2ò>¦=,§®û^Ü\95/F}UywÕ\8bÏ\18\99Z\815ê]\965V\13¡f|¼FÕø¬årO¸·ÿ\1f$\ 6ñ¿_ù\ 1|\8c
+6|ìÙ\ 3 \87ú\eä;\88\b\9bge\ 6hëê¾@ÍðïÇWé\15ÜÓÕÜy\e¦èãà3ävK-[_\13ìA[LÈfgZ\17
+½1i!É\80}X)¢VoÉÈË.*»N»k\1fîz\7f[¥ÚùÊ\99íà·w­ã\94Ò\95.ÒÂ*]u@\96»Û}\89ù3þÖù\92\1d@ú³ø§ëta×Eç\84I\1cln»çf.\1c\88]|^Í}¼.2À\ fÓ\19\1c¨£`ßÖue&\99©æ\ 4?ûíá\1dÛ\19½\95±\19t±yzª\ f\9cΦõÌi~ó\8dßÑ\96e\8ek\9a\19\8f\93BÓûÓm¹\9dOûå¶×~3\1d|ô.þ\19\80¨\96l¨·í\0\8a½|@¡\94¸}Fk\18E¢<¹»íç4\98,s»s+Ë\ 5GsSH\96üî\94\94WXõF\8dê|QÊ\b\16\96?ÖÍ\11ÑSûR_×»:30t3}\18µ8K\ª«»xiì²ANÍäzlSØ\f«-\96\18\96µ²³b4Ó\99\16õ"}øO$ßæ߯ÀÎI^\ 1b<?\ 2j\9bù\82Â|%'ƤñJSÏö-\98.ºWù\11Î\¿\12\9cöÀ]Æ\eBkbv\rÉ\15§ê\16vð¾;\10\ 6\82/ÊÝã3¯è·½\90¸\1c->Þ\ eÔìP\(ú\95sëÝO\90©w½© 8L§¦¦ý^Eý°=¦9·\86¥Ví1¦ÿ\f(±±\ 2$vó@¾"¥\ 1\9d\ f\93P=.o\ 4õî¡=\ 1ª¤$\8fæïæ!N)\87­\86
+\8fåh\ 6Ò³\8d²%ÆW¢I\ fùb¥b8
+ζ\87\ 1\16n£©ªRØSÈïx&\ f\85±+\85\1e\93\91Æ\8d\82*\ fj\a¡î­§Iש8ø¸ÒP\99NIMkjáÏ\0\84\0òP<'{â@©Þ\87»
+§Çë¤\9b©¯k¢eî Þ\1fÆ\16\9fÉëå\9d\19^ç«í$I\83\9b\9cÇZnø\16   ¼×2>\85N\11\1aÿ(rê\9e\1a)J÷\èÊæ#7\97j\8bÊIä=7+\80\15_\85\96*\8dö!/\ f²\87Z=\9f\1d2u/¯\15ÿ\e\12Ïæ\9f'\80øÌ·\802&\ 1(Ìbä:/\bg¯Ã»p [Oß÷J\97-oò\¨Ù¯ou6ÛMõã¤/ÌïÃØ\1a\83\9ev\e¤;Ìd\85kbïN«\a\9f¯*½Y¤Èãé2Yº(Æ©åBøÒ©«\90\91\ 6\88\90i¿\ 6\82ÌÕºB|XªâtX\11ÄgéY\93\15óg\0R\80\8d//g\1e~u¿Zyd*^\1e¦\9e\9dd©î²ïÌi]\8cUz\ 1V\812CÏÍÉø6\98ï\86ËòùÚÓ_ñ«Svò_-Õ©¦Uý±Æ\95â\9a\16F\b"è§tAy\80      \8f:E\87#\1e\93\98=m'\ 2§Ï¨!¯Òv\87ßèh\13ÞF\90\98\8d,,<\96ý3\0ù&\9c;¦æì\13ZÞY\av\16\8d¶Èù:]\95\8eÅý"Ý1óSr\9a\95ýr4L/Ó\9b\1eé©\97Nå¹N椵ôþ\1a©\9dbé£\94ÞNNæ²:%®:µª\90\ 3E\85ëô\8a\aC\83ÚÐ\9a]j\fMdªá\8dÖj×\9bØç`\88Þå4}Ýâö§býW$YªÉ1¾<ºÎ¹në½\83U4:?É\9döCðû³ÝzãX´\11åGÜÞª\ fTøf0.Ú*ñP/ûÖ®\81&\1ejûR¿[ïP\8a×ãH̸å\14ïô    \9c£\1eQñgûÐ\9f\14Å\rÚ®ÖrÒ´ò:8^\85'\98o\85O3rezîu«!©ujW\92\19×izf8æLnnZ\13­nWÏq}º\7f¼´ñØ}$\8bË\87ßÑ9××S\9dJפ\ 2Y·¹|+Ù
+µÓ \83ó@~-¸±øÝÝçB\93\9c­9ÏT\1c¶Ï\96añ}\89\96-¤*<V!ËvÇàÊ\12\98õ\0\9d0Jiæ1
+ÓÇ\98Ì\ 3\11~ÜAgªý\19ÇK½¥nöµ\fkWénm\8a\ eQÖ|¡7q°cßgãÒÒÂö˼\0-³.dÕ.9%ê÷É· Å«YEÌ\1c\8bIF\17¯\17\1eR\92\82Ú¨1\1fA«Âÿ¬_áÑ\8aU\96ÈÊ\9a\1a^ig¶\1f%ä±Ê\14\1dëC\17uN\96\8bx¼ï\17qÐÜÓÞ*\9fú3\92\91´Ò\89«vÅ&J\963\1e\15Mö\bz.O´»ÌY_hkÁ\98ª\9eî/\14\93Q·2\abWT\90É\15ª+ÞÙËø\11Õ\180ÿT^[-S¶u\ 6\ 6\95g2>].!wJø±M\93ôQo^ïÑÔg¼øÛ4ͦÃ|°\17Sy³µÈçM­Tÿ3ìÛ\ 1\14,\87b©aä¯H£ó\81qÄk8o·\90í´©\ 4\83ÝÏ4\11\aPYÌ\1cæ\rÎ\e\90M\96~\86\9dêDZ\f*|®3a¾^u^Ú\r2«¢3zí\8aøóåÒ]îu-\ìø\1fÎ)\92ÊQ\13\9dÈ\93¯\13ÏþØ¡Dì;\ 3"\ e\90\ 5a\9bõd{Ã\9fã¯\98ªU\127k\v\r5¨J\80êÂ\8daTOsJõêó\94\17\95\1cFr^_Åj\81\15ã\95×zF\95%L¢\99Ì%_.:fT£=ë\9aD\9d\85Ëb#å\83õ¨\9e/gG-jÒ\1a´É\97\91<5\18\11v\7f4ÿ·ù\ 6W*{\ fÛMow¬É\13_ÔYV0\88yåÏ\0hÞüYS\88ÌÍ\ 1È}Ì9È­Ö{\80\f@\91*\ fPz5\84\9f>\ e@nì\e Ë!  \10\ 1\84|ë ÷"Ç w\11\96 ·3\1c\90\9b-}\90ëÃÁX®   ¾ '\940\90+\19\fÈ1Ùä×|@\ eo\9a\10;û}\8cú˨0./\9f0\9c\80\82`\85u&=þ\15?R\ 1²\9f\r\ 1\82Í\16Pìå\0\90·\97\ 5h¯'AøðO\9aäÏÖ\93\ 5 ÞE\ 1ê\r%\80ÔÓ\1d\80P%\vê\95×PïÀ\85z77¨÷\16\83Ü \97\ 5¹\16KA,9\90\13\8b]¨·?\8d[k{\1d\9dKÒú9¦O\8bûÂhÌnÛÕy\1c\1c\9f%XÉñ¿\ 1 µ   \94z]\9b\0\v\80\bß#@Ù\18\ 1èyQ\87øL\0:+¹\0í\8f¾P¬[\84bß2@Æ\98\ 1ŲS(¶½\ 3Hfþ\93m\97{\9d\1ePtR û¤@çí\12\14}\94@Nã\87\10ëå»\1du7¯!\95]ßß\ fc\11f°§å»\80\1723ø\15\0UlX0Ñîg\85$"ìl\80\1c\18\ f [\1a\a\18é*\0«\96¦\0Ë´Î\0½¬RPoX\ 2h)§\0\f ^\19~¹ú\0\8dê>\80\11ÈEIi^+$\14;¨B±7\15ä\16ýY\8cMúIúhT\b\8bÛÇÔ´VaFøÌ}¯X\9f\\98ì\7fzu\8b\9d_\ 1Ðî\1a\8d\0Òrl\80\16Ô\13\94X'\0\82m\rs\r\e`ãå\15*>ÿl=\89Fi\ 6 \83B\ 3ê\95a=\84Æ
+ «¥\a\90Îé\ eõF\1f\80ä\v\18\rX\9aÑ\ 6\96¦\8f\1a1æIvt\9eóûg\95;nÃú\ 1\1dPµÎ\13¦9ð¤âµë*\95\81þ\ 3x\9b\7f\9dü\v\0\9d8]ØZ/PêÀ[\0Ô\9a^\0¶\P\0/        \1aÀ\85ý\12~\ 27\80y°¨0¥P\86b\85&@ç\ 6lÁ%k\ 3\90Ïé
+ÅÞ^\0\99\90¹\9fºQØ<@j\83Z|ØoÔ\18û\80Ñ\9bÊÖvÏ{úq\bë~níS7zv\9au\89\81«È\ 3ÃÑí´~ð¾çÖ¯\0èÚ\83:k\ 1Ô\19}\7f\92a1Â÷ÿ²{ñýH\aø;»\ 1¸Ï?\0®É\bÀîr\ 5`]£\ 5°ì\1c¶àù~\ f`l}ûÇ<O    û{\8agßàc\X¶\7f&v^Lûv\b¿Façwy.¹\8d\a2À<6·Bïн\1fôÝ­Å©»²\8b(¿\ 2 ^`ÀÖú\82\ 5Ô W\0\eånP"      \a\ 3Ê­\ 3\b\ 1Â\98½\0\13\0_l~\96Êcß9\94:9Á\16\9c½9P/\b\93ù\93t¬+9âí\r°ò»ó©Ô£KÕè'\13&û{l¶\8e¾wÑ6\1e¨e-çHçzûA¾£o-ùÞØ\b´ ÃtS\12ÿ\85$kè߯\0ô~\87\f, S}\rpT\b\ 1QkÀ\bû\917\0YÞÁQk%\ 3\0ñÌÃ\ 1B//\ 2<Èv\0^NMßçÖf\1fù\19Ã\7fÝ\96lô*o\99쳦gÈ$Ïff!Õ{ìsjøõV³@ï\f÷\1ePR3§\9dû\fvðÕ oæÓ\99ºN\13yi¹\8f\12\13æì¯\0è7î\ 1t\83[\0+\8fa5÷\8d\9f\84·\84A¶i\ e\ 1yÃ=\bõ\vÈ¥Y\84¢'Êûª£\9d¨\8cµ\86ÏW\93\>\16Öáx\97½z\10æÐïë\86\9e¯é\80°O\94\9f7NµkÑ,vOs¼¼t`³\1an\1f·»¾^\ 6|²ð\7f\1e\1d¶¸E/SªÍ}õSþ\15\0ÿPê\89\82RÍí\16\10\99ã\13\90Ì#ñz/& ú\9d3 fA\ 6\98y3tS|±ûM\12r<dúÝ\rwou|Ã/÷\95ß\9bJ\87KØ=\9dOïª\10zËe.v\e\85\18=¶ÊÕ\9aÓfÃÑÖ:\ 6ÝÕ\96H5l·5\92\17\85\17ÆÍ\19$¬ÍªÄ\94\99>\1fÓò\7f q\aÿy\ 2Ë\12\81R\1fLâ \87?\86ß\v\90N\99\85\ 2\93µü\99\ 3\1c
\98ìÛ\1c\ 5ô\8bO\15ÙG¦Þ\92o®1nú××½w\8eÄ\93é­Û\9f©\8bHÚÊéÀ!Ò¡°Û%s\ 4»°2\89¶Oú\88\95fs\95\9a\8bó\8a\95ç\fíóÓWjXµâ\ 2ÇXâ\90*M¾"^ü\15\0\93ð\1eÀRÕ¿miÂË¿\ 1\7fm1\91Q' ?É]ãA\9eK¿æ\9c\89\83\13\rGÜdÍg<Z:}ü¨\ 1ËçÝv\8cTu°7;ýÉvFDöF\1cn\ e«í\¾,\ fc\ 3Øî,©ÃçG\9a¾\88\ ekÙ9¦:Y\97¾ÉZÜIf|)\8eÕ\97\9d\1f73\ eý+\0¦Óý¿¥&Æ$\89óPjoÆ\81|g:\ 1\ 5\¾FOôýz¦%)\1d¶WKÌ¿=ÞÅsª¢'\96ª\8bÏ\ 5áàÛjcÇvtm#=ö½UsB\8elo´],h[ÝÏî¬z\9b¾D\ fµb£ÊMê\9fKeܤlfäÌÌâHç»\ 5Ó[ò\14\84ô_\91XªÉ\116Ïê\06\ 1\11J}       \a@jÝ\18PÏ@H<T+öqÙ{        Ïéõ®5ð(ð_Vú²`4Ü=\ e£Â!x\9e+;n\1f\88ë­~\92\97íu®µ\18È\1dc6ù¾Æ°åO\92ÍL&ëYß\1dï\96÷Ïȹô+#\82o2fwY+\ e¯d¾0ì\9fQjXlÀA\1a\ 4ñ+ N\ 6\16©Ù\9b\ 3\82j%\eøØ\1f\90¯|\ 5P(}\92I¯÷¸\96Û>3´ê\84Ô>öý*\90Þ'\ 4õÒ\8e\9f·\88Ý\R\8b\9blF©.;~\83\9f\87Ç\9e<}\8b\81f¥>|o\8c\89iäö\9bá \95
+\a7ãV\1c\8c
+§Â ì\1fó\10'ªÿ\18\1e\93>­ÿÐö8Äñw\0Ìæ`\91\19|\96F\ e r\1e\94:¦ ÔEiò\8aÑÕìî\98Õup+½ÜKª°\ f\j«\81ýÓ­ \9bÍ;\93ÔÍò¤GÅE¹ú®Lm\1aá'j\8b\97Gd°×\87\83wcØ\7fæKvoîÊç\9e0i\15 \f\88n\9bê J\9bì     µ\16\ ea@äÛدøyß8õ!|ì\17Pª»9\ 2ª\ 1R°â9>ö\17\85ás]Q\aa×ûN|¶n¯NèZ>9¦I½¶_5L¯Üñ\1a]\849\8b\9a\82å¸8iNìÊ\88zFÂàÎ
+\8d^\9cñ;Fú9Nê¦\9b\8bÃcGk\9f±Îaô!»\8d\ fFt\e!\86w·X\ 1\ 2\vQ*!¿\ 2ê\14\a\0çÎ\8bÄEs\ 1\ 5{;P\10zÂ{ì\9eõG³\87'¶]p\8b\92^\12\96[à?Î~\9e÷Â\r\9a\1aÄvP\942³·ÇbVN­R£\ 2Æ\17\a\ fݪõ¤\8e/v\9b\15µÙî\96é¡Þ/h[-°«)½\17¯\88\9e\89¶{~b\1dìùD;\1a\95N\16þw´ô\aù\15\0\vÔ!À§o\e6i\ 2v\9d$\9f\ 6\85ù\98{ųº\14\1aâZð9aÒ8á\85ÍÀ©\9cÇëíÆÕ/«ü¢ð\98¿\9e\99\8fµ+\86I88:ß_Ø°òBó=ا\17»\18:fõ«\99©kåë«×\8cº\99e\93\8fÎQ3b5¢u?õ0-ÐW°ç1W\88~\8eÝ\9c~\ e\ eÙ_\ 1k]\eþÌF½r°T}þ
+ò£nâM\1e¸gVòJA8áéó®\17Õ\8e\81RhïE\9d\99¯Ý&êØ\95Îû6K\1d.Ñø\94^~\86\93Ö,Ó[\977h\17¯\86¤î\9fëåÖ´v\11ÔÏx×nlùW\92yßÈ­¦0\1eùª¤ºÔT¼9{wÐV\8dí!­»5ÌjÌiú;\0\8eôÌ¿¼^ª\91¸}è.û\9e`\1c}\15\8cýã¼SK)/ß`\93Ý®\ f³åJÙ"WÏ\\ e\1fÇÍìs\e{\13·Ö\ fÍ\91ÝzõeJ\ 5]ý=Èè7ÔÅZ3\93.¨JÉc\15§i·ê]òbÉ\97Ù4¬Ss\95R´|\9dh4&"ª¦<.§\ 2M˪\80\11\7f\12\95\93ã\7f\ 3l£Ó\11 >0"¦\1eÁýù\99L\1e\17 |\Ïå·\9eÛ\1f°\ f\87Í\f\91]Ö¡ØÕµÚì.x­5·\9c\9ex\181ãü©ÿÍ\917\ 3»U\93\1f¯o\97<ýÓ\9a?W\19µaU)¥Ý¹Wåëñ¢J£Þw,Uøð&>V«\92\ÄzT\9d\12D¬î\ e8D9dÅl#\97ÿ\ 3\0Þ;L\09\8f\92\1dÇÞ7v\1d\â*=÷Ú©»í\84\87ûf\ f$ñ¼ËmÂﺰ·K\8b·\145¦­æ{8.Þ¿ËÁ\12\r}ü<µÍ\1e~kÅûæKÝq~Jé¼5\\ ej\Uª®¸¦ÈíÆ\13Á.É\89Ñ%\88ë\16'¼«~Q|Ô§\94dv4Lî\85\1a*\9fC1÷+\0\91þ$;!ñG\7ft{\r=ÇÒGN¥\96\1díêK0Ý´«ÝÃ\8a\19P`±\88A!\89l\ e߶<\1eN\17Ý¡Xò¬\1evº­Û!\1f\1e4Á¤/êÞí\86ÊéH\0ùæ\87\98Äæ\ fe\ 1\84¾*¤³ì\8co\fSw>G\10<¯(\e\9eÿf+e\ 1>\95\ 5±öÚ\12âä5F\7f\90\18Äÿ<ù\17\0\11\ fÅ:\8cOÛM¶í\94ûF{»EÒúêba\ 3Ûz\8f\96ól\8a\8f¬n7G\8e&Ó±0XÏ_m£+£ÃöD\11f­µ:^©z.ã(}ÊIrnåI¥\e\8b±É"ºѨðM¼Ýà\9cÉÃâ\88Ü,`=ÛaY/å58ô\9dâ¸Ý~Yá3B\85æë¥\1cõ+\0\19íç\977RÔ\8e4|N\13?m£\8dë+\1ac\94\ 5?ãÚS\1dÃV\93Rfÿ6ç=\8d\1c\19Á( J³Í2\9b^«Qy\8e\1a§\8d8«ßÜx#E7Û\13\97S3\14r\84\91â\8eþ Ï\9e¾{¡æg\81Q\r\99æ¦:NM\92¤¾j¥'ªµþ\96nÔ.9[`I-_eÛ¥\aó+\82þ²Ùr;\1d¶¾\934\8e[\15Ú;v.¥\9a¼E2\8a2\9a6åó°N\97â>\16Åd\97)6\93\0J\17ŽØ<¸¤Ú ¥i§^Õ\98¡$ö\83©°KﶼæL<\8e²&\8fZ Zéê$¿)Tf¥\87T\8e×Ò°,å¿'æ\eÐef]\1e6+¬£Õ«å\80æ«eíÎþ\vÉ·ù÷+§\9c H»xÁÔVùs­8\17\95Gi\92\9fµKÃÅ´Áö\1dqåu\83\ eå·gå\1f\ fUÈ©]ò@)Ì\83cdîsçD\ 5í˼Ó+7¹n\195X:\8aF?>ô꺨Ì\9aÇCÙn?\92Õú\9fTi7bé\12òÜ4\8a:ß\\15ñO3C{«\80)!o®VÚ±\õW\1cªF½¶ênÑü\¸\8e¨ñÅù$\91Í`\85O)Ã8m´N5(εúg°P½vz­\98Ìô(Ï\ 4\ eÆyêýÉ;\86    ¸.ÓÈÖ\829\86U'ò\13\16\9fêWÊ\12±å\19¥°UKÈ}Õ+âÑyNSß´Wè+B\94\ fö?ûªçMmÐÎ\97    Ý¥î§{üg¬\894JÍçû\ 6>¾H[t ×(¤KO\1dT·k\82ÞÔ\91^K    \ 6ASæ\80¤\89J\ ety=?OVá±\97qê1\0[T^\9bç¦lk\a\87Yw\17çR³Ô        \8azU}Ñ]¾þ-ôå&\967Õn\89\9aè3\99\9c\19\97\1eÉÓÌ\92°Í©OH\15\1a!¤j¡\85\7f_­Á\7f\0Þæ_'óh^B&Ty\98\1dH\97 Ý\19ÚRºµ-̨ƥk\96ä×ôV\82\ 2á\93\89_¶4K?ëpX!!Õr¼÷8fÝ\99I¥f±©\14ñg±IS1ª\17è/0òåìmð\93\f\8b\9d&ä¬óX\11vÿáàë\11\b°Ý,ÿÅ\10ÐΣÎò*¢z½Ø\85°ç\10ñáWL\½\93\1eHýŧ3\94ðO+Kuãú]^&y\9d\92ø\8d¾¼N\15ÞµÀ\1a¿+¯5þf¾Çõ»Ô¤\9b\9f"þ(¥
+\97ù'\9b/g\16\86\ e1\92'U\82°{õ<¾6«%<ó¨V±&Ë        ¨³¨«(þÕ:HW\19\8f\90|Ö_çú\1a\96ì;\98+â­\bÂGsE"\97ÿ\15 w»ÖAN¾j ;=öAöELA®Úß\81Ü\9a\8a\9b\95\94Ñ@Î\12g Ç&»Fæü\18d\ 3\9cH"\9b¬-V@Ö\1cÖAV?´AVz\9a [!\17\10p\ 4\91%7\ 1Èf*ðï2Ë\12ȼ\80\b2Q\rÞ+Ûí\82lmÖ{ë\1f¾ó\1aÐûÖÃ2*\8dÿ\86\9e\1cÿ_©ÛS\1fª¬AEc{\ fr_ñ\ 3\10Üa\0\92¡Ô\93:\87\17¨÷      @\ e¡I¨W­A±c\ 5\8auá­õ÷\18\95\15ÈÊ\86\vÅ\1e\7f\\8e\81\83,u¬\82l>ß\80*\9bF¢r\107¯æ Ê¿RÝg\85hká\aó\95_\ 1\ 6u¶oPçó1\80\12\9bPÎ'p\0¢\99?&$2\8c«\0ÑÅ\ e@\88¡\rr\8fó\15ä¦é/ÈqUX#H\8f\87zW-\90uBX#Kl\ 6²#a\v1¿BÑÑ\e\83\ 2\ 4\90 º\9a\ ea\ eAvr±¢Ó\8a\1f>+\92\95L¯Þ\85aZ»å\9auåW\0\ 4\8d ÞQ¤ÃÒÌB©a\7f\ eU".@ü]\ 6 1U\ 3HÐé\ 2Ä\-\ 1R~ú ÷¤ÒPl\9d\ 69u*þøÐô\19V|ü\86\15\7f+Ø {l9Pô&\ 4Ù\15\96\ 6Ùñ\ 66\90\84è\ e Jgú&>MëYÑ\97\83ð£åºÁ\81W[×^a'ÿ\8a\9fB+\ 2(u        ÔUy\bà»z\ 1\90·xú;\a}Úá\ 1ªn{\0EÂ5@\8ed\b\10\99\83ß!Ý\83-x»\855Ò{\1a Çc\16È\15å-È¡Ö\ 5\ 3\96fÈb ë>¤\9f\96z ëífïã~f?GÁu\12®Dlè»#¦}ap]ñ\16Ç=ÿ+ °\14Ô\19¢m\80`M\13 ×W\92+?<\ 3,]E\ 1VùY·\ 6°Lz\bÐ]a\vP^¸\ 3\ 4ÀÈ\ 6\19m+\0!}ØÒ/iX\19³Ê\ 2äúÆ\11\8aN&%\8a\89Ó\8f5`\ 3Á\89\16Äd\1ccy{õ\f¹Ç,¬c\9f\91O\91H÷4½¢\rw\9d\1e%\85æ8Ì\87û\15\0i¡ð^\9f<l\87\83Éèo\ f5å^\ 1\9c\12\0\vI\ 5°\0\96\f±±Ìü        ÐÙ\19\ahñÍ\ 2ÄÅ4\80tØñOÝT\8d\r@2KØ9\nO\90Û\17²që#\14Þ\9dÌR\89
+Ëcÿ\19önó°.¦'×ÞæÕóÄã^="NA>PI\96¯Ù¡«¿\ 2 ó¢ús\e¬\98ÌK8c\80\9eÄ%T\89\ 5\0o~òÉ~#M\88Û\1càb
+\96´\97\8a\ 1\91\0\8dX!>\96\84ÎÛ»`£7uK/£~êã¼\ 2.\17¼\18=÷~\8e7\fòx¾;åûbí'\93^a¦ô´®´u\1fºkÙj\1d¼õ¹¾3W\f¿\89h§²^¦\9a¥_\ 1\90}Y\ 5H©ÜùË\96Ƥñ\1aà|û\ e\88¬\\ 4\84\12µ\ 1Ñà\7f\u¢Ðõ\ 1¾Ð¿1\95'\89È\97Ýêkd÷\94§ÅrÝÇì\8b\8fïöå»
+×#ï\10\81\7fk"ß8pd\9eô»ÈN¹\98\ 5»ïf\9e-m\7f\89\86õmmzáÖKB©¬²ó\a½DÝM\12\vü\1cÿ\e`Ëä\9b°â\95.,M|\ 2ÇÔç\rÀ/û' ÖÉ\9e\ 3©Z\a\90Äz\r\88Gp{\17'µø5ios\ f;\85çïõ\92Ã\86¹¾Þ\b\8eg4él|\839\8d®ýhn\9f\1f\94°=E¨|õ@º\1d{)4]96{\85Ö¾8¨Ã\80?賫ì5*ÛÇ\95E/\8c>\v\83\89e\8eø\15°Â%¨óÚÿÙí\1a+s\93¿½I%\15\ 1\92\ 1I\16ò¬\vÈ\e²}\97\ e³óó]\ 4ÏûF/\80\9bó\99 \ 1uC\8bWF3ØÓ{y\90¼e\oº\8d\ 6Ò;¢a0q\88\9d·>ä\97÷󾸫¥¶\8fÑ%\99^]ËD\8d[bز¼(4\v\85YXöÉYÅ\82Ñ\e{è ¿\ 2 Ùf\v yÛ\0\98©Y°4\85\ 3 ¼ò;ñz+ÉÞ\bÆ;(\7fWÏX\91\92Å\17÷íyy½uòï§_â\8b©\13¨\7fr^æYÏ\1f5Ï+\1fή$ìKÁ£±}²óÎæ\8d\8fÆëOv¾Y§>·Û*\97\9fÓ6Yo\94ç%;,L§\85\ ea-Ä*6ùx\14:©Sqö\a\89;øÏ\93\7f\ 1JU\9a\0í:Pj0´\0Q\1d¹\80\14»\0ªìÿì9`¼^ïµõÈ\96ÐÕ­«7\9cë½Þ»\9eV\1aÿp±Jãs¸*fv_®¦¨-÷h%Îíúˤ¹\95Ê/êKìÜéؤÝ\99,
+\9b­3/9ZnúÜLiKdhrR¯ÇØXí;È\18)®³#mÔOÿ
+X\9a:ÔéÝ{pØ\7føIí%Æ\e\ f\90\8b\19\94º]WÞ¦óÒ\9eÒ·;\bÛ\95ÛÔ¿Y¥Õ9E\ 4\8e\8b÷\8f×ÃPô_;¶\1d\7f6rJFVÍÕ\81²½eµ´ \ f\ 17»çg\8détÕ5¬ÅngO¾Xç=ÉT\83\19\89\8eð\91\9e3;O>cRÓrzxá¨ï¯\0\ fkÿûíÿ\95ØM\84·\13 r\97\ fÈ\93A%bS\8erßGy-ðÕeÿ2\ fWÉ"Y\ f=t7N\91l\9dvܼ\1e\81ùZºØñ»¸.ñܼ¼\98\91ÓÙ¾ÌL¾ç\e?ÞIû\16Tt\e\9b\9eÞ½\98Ô³\8c\ eû*\91\e\ 4\a\90\19\98Ú#\ 5\11¥\ 6Ì×\ 3ÿB2ðø÷+°s2[°s¢ú\7f¥ö\92"z\ 1\94ñýÆ×Ê«ü\ú
+\17Â÷iݯêró¤¢ÔàX¨e\17û\9a\93>l\94zæ²ô
+h¸\186Ùh6Í-¾Ör\8f&Áí${^æGúC¨\f¯xN\1eܲ\95~ÿ\81möýÉ}\93í×&ót/ªY©^\947?\10³Oov5Á¯ø[gbKÿ$w\92\8bò_«"ÎùÔ{¤Ú\85\87\8a\13L\10TF\95ów¾åÝ\8eµë\1c\8dµ\95\95Õz¥Çkw\11¸\9bËlF¼ïV]¡¢±FÎS¦qÊ¡\83ÛÇ-öÙâ\987Àyª\er\91\\19©O%m¤ÂJ\92\0c¤Üò×\90>üÇ\90ÂZ\f\ eø,Í4\809\ÿ/\17\8d|7ý$\131õz\97ËXèe6\84
+Ä      ¥¸\8a\13\f»­ÝbÛHÜÁõAÐlûúÐ÷óÚep²Ö\87©?ÖÑàaÒf\19\fªÂ!Û[4UÊHO©j§õ@\1am\97\9dÎÚ\1däøi»ôõÓÁ¸kÜiõ¢¸³ß¥Þ\9dý,\15ý\a\12\9f'\0\9dØ\1aÀ\91Î0ÉD\\ 3\8a5\83ä\a\ f\95rùÞh\90ÿ\RëqÊíÆ1}¨)ye\9b±\v½åù\85Xóç\10]OåQÅ\19\1f»\9cg\16§}\7fP«=\9eÆw'$¿\82ÕE¬\17Úîxë¢N\v¶¤1Jf¨1\86\1ciþcþÑ\v\ f+ÖÏú1n\93æ1j·\9dÛï\0èz§\ 3\\9d\9a\80,í·\80Úìn¯èn&¡ú\8dÖÛç\v\18V®Þñø~9#Ã$vÒmϯ\89ÚY_ÜÍÝpú­\9e\16\13\8d}oM_@\9c\ 1+\95\94;
+:Çòû¥_ñIF+\v
+Õ|½\14N\8d\81ÓSm÷}oδ֧U]4\92\84ËÖ=gD\1aS\18\90\1d<\7f\ 5\1e\94z>\8f\ 19\a\87è~Ï\9f®Ï\ e2=+hÆö\8eKq\7fô¹Þm?ÿ¢ÙM«×¨,\8b\9f¡:\ 3¬\9e,Z²\10\0\ 30Ú[,\aÓ³³í¥#pì¸Má¢û¬ÿhY{\ e¨\9fL\1eol\96Ū²ßN:J«¹õ\eÙ}\ 1¨©|á­Æ\9e\1059¯òl¾\18ùñß\0oós\ 4\98\18à¤\9a\9eÀÎ)ïø·ÑºwΤ\94¡ë½uëXÒfö\81«\ 5ÞVmÚ`U¸¿ó\v\88Ó\1c^ÖG×);\1cD\ 27é)zßîxãÍF7IÒmM¿«@]\85\ÒÒ\1a\b\8aæê\9d\1eÊÈç`¢Ë½Ñê,\9fÇ¥oý\18\92±²o\95Þ\re^x5¾Qáþ+à³Dwa\ 3e§O»\1c\ f\ e4×+Ý\f§¼Û'ûÜî\85ÛÑÜ63åÝêÒCï\8bWk\8a\ f¯:î5oÊpÊ|Ú½m\ 6\1f\82d飦e·æ\1c¹W\95\95#¥¾êùv-+Ý\10¾$>\88uK\9c\938é«\19i¸+}ä\1eUH\92Èëdýÿ£ë<Û\14ÔÕpý[èb¯ J\17\ 4Å\ e\80X\11\95èÿ?aÖ>{\9d3×ìùpG\1c.yÒ\937oBæ%\1eFÄã\7f\ 2vMZ\adZ=çRéⲯ¥:ʾBU[®\90\8fZk\9aþ\98Ë¢,;³\17Ó::xý\ 3ƹ²\94í?7\1dÖ¦\9bd\8ak\1aû§¡ß¿\95~k¶X;\8aRɬ$£´ó\84\8b5
+ùj £\8d÷`\l4"²Å}Üê\91\13\ eAªÁÝúX\93¡\84O3,\96Þ|_Í<ÿ'~zOtg\85\9bûI\v\90³ÐÜ_É·àò}­¹jo\vü<4\9aÚT(\1a={\emÖã¼Ü½\r\81Yr¥Z4;Y£®?d_iñÛ\9c¡¨öb \99\93Æ\\18¬Ð\1dÏpï[c¾       \93¦\93[\1d²E\ eÏÌZu÷y\ eêTªM×\95Q>Í¡\82\87s\va\844¸¶\1cÿOÀÞ\13µÎáeË{\99Í\9dsçÍ,³J\1fÆ\95y\8d´ê\8e$ëÉüfÜùÎ\8da\98/¬ú³S|±Èúøk\16\1a\11­Û\v±Ò\12\9bW^I}$MÊÇ/K\18±k§ù^õÜƲ5¼qJv\86Öµâ½Äz˶Î\1aæ8`3\97\1cÅt\96 À¦k\1d\9aÕN©d\0U'6\ 1ò?q§©\9cào\87\11»µwde¥\ fùÂ,*¿
+¶r_\94G½â\84í\83\86?êáEgÝñcédTZ\8f·6¿)\84J\95ý¬túð\89¿\80ð \10\9ew\8e\ f½\89\94×}Î}-\92\93s\ f\98\ 5oæ\*¥k7qÂ×\869}Z«ÌL¤ú ýB54¥l­\9f}Qµ³ÕBþ'\82ø\95J|Õ÷¥G³º&\ fLnöXMÒ6\89¥èá`íezBè\95»í\ 5?6K:¾Ô§÷é¡%/Ø»\92éG\1f©4\1dS\ 2ëVòÍe\1aÔ\1aÄì,Ô=iÛf\83ÖaÈôkÇUmĽNUÛ(&\1dAå}\1a\16*ÍFN+/ýÚ¹¼4CØ ¼®t\19\9cÇdÅÙrØÿÄ¡3W*k\97b²óʸEÙ\84\1d\10Ãò»\89\1aâfQìÖÚõñ"±Ü¶Ü,ë(Æã¾\94\ 6ôÒ\13\9c\92ro~Ý2h\90Ç\e^÷ûÛ\fk1Ã"\ 3\9b\83z\8dÁÚr\95£:\9dä|\ 1»\8c]\17û\92Z\ 1ÏâÞ\96ÓE\1a JÁ_Â45Å=ú\83¢¶\9c%±ù ÿÂféJÙùÕ\17\b[îÎÐAØø|»Û¶ñi\87\býÕÄöHP|]lI\83Ò³-Ô\81Õi®\14nÈíÍ\97]7KÇ\15su\86»ÚXh%f»ª£\b÷
+\9f.½ËR¾\80%dzf\12GÙjÁl(rÞ\12í~îêF\9b\%%<²¡\9f*fÇ\9dÜ(Ëä\9d=ÄÊû\9fXX´\80Ûën/yëâ°Ü¸\83®\1ad_íZnÿVUW\8d¥k\8f/        NýVnJ\84\áô\1cÊ°§aÐdÊq_¬:r]­ð4Ý.c§°S"o§A\91\8eöv!\e¯\16ù"2ws\15buÊ\8eµë+ãtpêÇ\19¶ÏÕèo8×èÕ\84vh\89õn4\16oÊ)w!\18ÿ\13\ e\1fô>Ã~Ã{wÕÉ7Ò£©\15)ze{\13ìòâÙ\94ð\ 5àèS\1da\v\8fSÒØÔj_\1d­Ì[9¢\8c\ 5p¶·\1f¬3\ 5\93íäó\85/[ÌUð|5ˤ\b6ÃeÞ\8d4_¸KôjðÖSîäÓ§ösbJ¥\11Á#Myý"sd>M\9cöÓ\ 6q:ä:\84Õ\ e÷?HLªÿ½ø\17ÃKcùìº\930Ô£\ 6wÿQÉÃ&ùÀé\99O\b\ 5Ö\82ês9÷Êß\ 3w,\91\97#,ZLç\98/|ØS6t\89kÆÑ\83[\9aÏ\8fî´TÖ\92}Ò)\95©¿(½Q\0¤¿,¢d\ e«¤\bKåòøõ ÖðJÆ\910¦°ï¢\å9EâHô\91¹½\8c\90¹SNýO\0ÜÎ0\0'3<À`\89ÿ1t\15\86&ÀëÇ\11À9j\ 5\ 1^¼Q\0O1u\80yV\e`£Ó\14`\fé\ 1,'>\0\86;(@_§4@ßÙ\1a@/\8a\bÐÝÒ\0è\1e\ ezÐù4\0è\ 2\7fC´H\80\ e;ÉjÔO\bÐÛ:\v°â#\1f»Ô«ø¦7Ãü+{mdÿ\ 2À7ùÿ+5f\15\80+S¨Ó~\8d\ 1îTÖ\0\aÀ§\14\rð\ 6ÏA±ó\1f»\0æ\853\80\8dËG\80\v\8aváw¹8\ f°|\rÆ\86è*PtÐ\ 3hÜX\ 1ôz¼AMU\ 4 \87^\ 6b\9aO$æ\13\89%8\91JWßt0-=-½Z\88\ 6f\94ý\ 1|Ì¿\17?\0xPeaBæy\98\90-\15^\1e;\80ÀÒ\13\bu\ 3\88\ 4\ 4Îd\0¾µ\9a\0oí»\0/\93K\80\85Í\13ÀV6\80\8a¯)\80u`\9b\88Éb\13`ìLÿ\89M>\1a\ 2¬ÐÚBEp¼\8eQ\ 2ü\8eZ\17 Î\95De\15`Ó"ûÖ\85\eû,VJå\aÓÛäCnidÿ\ 2À#\16ê¬\97 Îͤ\ 5\88Ìãç|\ 1ÂàìÿXÐWô\v\10c3\a\bÉ\17\ 1A`}\80ïê\e\80ký+ÀéÝ\17à\b\ 6óðQ¯\ 1ìØ\15!\ 2\13`\9b\8c\r\ 3g\9fN:\86\98¤!^?ê\9a?H\96¾÷\1eÞ\8cn\95\ 6\eNS³òm­fó×VÅÏü\ 5@ °\91Ä»\ 2\14\81®¡ÔeÎ\ 2ÄDz\ 1Yz&\16ôî\a\90e¿\bH\84T\0±n\8e\0!\8f~ö{\12\84\aKÆî\8b\ 3|^/\0\\873X\9cßÀl\11P\18\9b*;\ 3xfê\ 1<Ë| \8eð\96\ 11ÐÞûOQ\8e\86i¡y_\18}æÚÒ\9f¥s¾Éd\83áé\98ú\17ð1ÿ^Àd\94¡T[\10\01|hP Ô\ 3äÔ\9f\ 2òRó\ 1\95\ f\7f|åk\80Ükð¿ú\fÆ!}÷\ 1\11¤Þ\80è6á\ fÔû\15@\90;11\9f\e\0¿\95`e<´W?Õóp;\ 3|É}bÊ]\14_Çö\9a{\9eí\9b\1a\rù\8erG³ýæ9È;Õ£MM3ÞRÉP\87\8d\16à\7f\ 1\10ÕV\1d¦f\ fêüP: ·ã\1e Xzþã\ f=\99\9d\0\15Õ)@\ 5v\1dPöÅ\ 4Tá3\aä­t\ 2d[\0\80Ìôa¶D\1e\ek¤'¿½ÊÎx·\8f\97á+ ¢Å«³Ï{Ï\v"?¢án\93~°ã;\13\1fù&»\86têÓ|2äð\966\9bßïü\r½\r>Y|[\10\9eè_\0D{Ø\80X\8b\80lU4@1~\1fP\ fm\ 5R\ 2q\ 3©Å\92N\1c»y\90\12«\16 \9e\8d% ¬öåíGÕÄÊñ²\9a_êy\95âR\14\96®\T\13OÊÃv®\9dð}\vÇa3ó]Ý\97jáxGo'âªÕÃÒ%ó¸òA-\97æ\ eJÿSÜ\9eJõô&T\bíT$t\15¯+È/$\13ö$\84y>\81Ro7   \90\r¨#6\0©\81ç\82\14\10î\80n\11Y\88\bèÒbð\ e¬Æây'6»hbvï\ fî^û\86\95ºãȹtSóGîª}×òÅg¶æù\94Z$VõsA<o\820\95{\1cëN\8böV¨\Ýká½ê\ ejd~Í¥ÕÔr5}a\vÕ\18\7fæû§\ eþ\ 2 \16ÓÆ?\8b'?ný)¾>\ 24\85î\0í,\1e?3\ 2\82tî(½\8bÙv7zv¼qøÍ\95\97pØw:^½´\1a^:\1aõ=ÝÔ\19\190v=wäôBÍçY\8c÷¤ÒW;¨9l°ß·Dwç\8f>\9fmáCf7LÁ/.W\17*½ \8cub\1a\9aÁù
+6í!\ f0-®\8fï¿\0\88ú kPN\ 6\94ï·Aê:²\ 1íÊ\1e\9c­\82'HûÛü»\94\9a4¢i\em\85°\9dêÞôöɹ\14\8eÅM`;l²ÇÃÿL\82«'\8fÅ×\81úPØ>\1d¼2Û3¿.¹7vÑp+ÚVÛ0æk¼æú\83Ë\8a_#äB½\1f\ eU%\9cÛú\8eÚ\8fÝäc³åv<\99\8e«¯¿ðÓØܶPê\8b\93A\8a~\1ap\ 2è9 \9d\1dB©!÷\8e;þ1ûdOÕJ(¿\93÷\ 4öÈÖy¨s½#ï\94lOÍ\8fÖ{Ã}zÛK`]ÝQ:ýÜ°Ó;ºn\88\ez\85ܺÅ%\1et\e?Æûý¬=ogò«Y§~\ 3ÓR:"ìÉn\84N\1aãêg,8ï÷\18U߯Ñ\86º<ÿÂ?:)FW`Ù¤M@o>3\90^\1e\8f £\râר%'û\b\1eâü\9d»\19~³r\ eQW8
+÷¡~8¬g½\9dõ\f\1dwÜ­¬Ö±¹=¬Ä\91p]Â>ý5÷d\17\99\ 5e\87\9eöÎVÙ\19z\8ehG9z4y\97\82Ûøcf\91Ñ\86\vÀ\888ìâ¡\96\19%\896ðºÊ#Aø\17\0I\9d¡TÓ\84Iz­waj\96\16 \93\ 2Éë.Wq\14\eÔ÷®Ë#â2Ø\92Ùãw\8dÔ<\9aËÈ»>]6]V0Gkd¼NÜà\96ê¨äÎýùÎ\9f\15\8b\13æ°\97m\ f\ fè¤YXdÆbúÀ\8e6JÎ\1c\117ò8¤Q-\1e\18Ýæ«\1f\³Q¿À\93\8fÞåû½÷.áóö\17\0É=~Ö=)\7f®\ 2º`ô@ÚH¶\1e÷sÁ»ïK\8f\87T\9f>®g­\14\9f¦Õ\ 1îí?½Â¾ðØ5]ûôÔ×è\ft\97©\86<\99ç®Ëù´2˺¶ãºÇ  \9fQocl^\8c\87û<A\r\f\1fM\8e\9bê\9fpYé\17úü¶×ÿ\86¯^yu\8a,Xø\1fÖ\18wïVm;¿B¬þ\ 4 -\0\93ôëB\9d]»÷\8fµ/sa\82çÓy\9dï\87Jõt©\8a»ä\\8e£< ?\87Ü\93Ín\99¾Â®Wí\81¼¤¥µ9»Ø÷¾\13±5ÛnÔö˱\8cVv#J{\9c\ 6ætòè\17³\1ab\85\a-Û}nf\8d.W\9c,º\Ã\8c:ñG\r;ñ]½wæ#þÚ\99\e\b¹\85!\7fþ\v°W¢`³Þ\fµÄ\8a6\84\19¿X'ÇL\9e¢ùaáßò9\ fö\1c\8bÂÁk¿ÆÑn¸\7f§6\v\89,/÷qº9·\1a-mZ\e̺\93Ï=L&\85cbÁO\87íÙyÝ?\9f;^¯òL]ºÓôåÝáw'Ê\94\8e4câ]tblë¯\9b\89[8\84\8a_M\9cCÎ&^\0\81\89\17\91Ó_\80u>\auöã\9f}kéÌ{\ 42­ãæñ\9dDóK%Z\rNïîÕ>\92Ä|½¿x\95«û\9eÌ°5Á\9d
+\8b\xc§ã'!Ù<Ûl\8fIgl\r³ìkÔ/ã­\99\b·óá7\81)÷µ\87\91Ê©X;\93r\92" wÆJWïL:gýx\\ÚéÇâÔn§\ f\10È6h\1føÛé/ÀjÏ        °.euX@3\138*C\9dsxy©Áb\8d\98G\85-ö½ì¸8ÛÕìG2÷Ü`t   ,3\81\86çiÕ\ 6×\80\1f«÷X\19æ\ 4Îè\97¿\8b¾U¿çí\8e8_.\8dÝE<´³8}Ó.Ãï§uw¸|«
+\9eZ«úMù­»&Ã
\97\ 3íBLNÚùÒ9êyâçu\88?á/Àj/        °.Õ T¯:¹e\ 5J
+\804\94ü]ª×ò²âÄØW¨ÃÄåÓíÝJÇ¢hÞßç\bg6\12\8a\13bÒ¯\ f\8fO_ì\ f\95´nqçvòB§\8e\87\86ÞÑfúiE»Zùv=©\ e9\7f*óô+-\7f»cYþZÞ^\99½ògµÎ\94Nj´j\ 4­ªßð[ï|ü\v°Î\ f`\8fÞ\15õ×-¶\93Ç\9cÇt\8bó·\ 6Ú<\ 4\16!íÂ!¡º ^ê­Õ\1d±ZX\8bÑuê\987ÄÆ\9c|v\94mÖ*ýQÛlX\8dð(wäeI72\15»«\97èì¸5)úK\ 5t\1d_^§Ç\91´%\8e\94Déjâ/ QíåNRÛï³,~Ð@þ¶2\81Òl\11¾2\9b¦¼¿\0ReW\ 2itÔ¾e\8eSöø\ 5AÕËÔwÜn´î7\¾)6×­\__æ±ÑtÆ\92ÙäÍåöº4x\8f\8e\88G\ e*9¬`ÍëL­£\9c\17¼\91­¿e½\9c7\8cV\1dûö\95¥àÏeb`íÄöE½  \9dpMð\17\96\97úÈ\15òõÏULoÞ'q\1fEGI­¾}Ém\7f¼\1f$±ùïÅ\ f@j\16Ê =\fÌsHWk>ewË»û¤Él¾Æ©²:\14WÕE/
\99\9dþ\ e\1cÔt7ã¶[¼\r\86³Î×\ 2\87=Ýi!TÉÈ\8dÚ¬öH_\ 4\8aIõT°[Ø\91ôÂÊ\16³GÇå\a´ui\8eñ-Ú¬],®ñÔíuãYMÝ\9b÷!zå{ó{ ä®\97£Ð!ïþ_\80\ 5\14\93î©Ê¤v\µûÅýùA'§%¸MÑ)¬t¡\98\9bßöHaÚ\94)ÆVV\8c\8a\94=\18­×\9eõy¥¢\8eV0Ñö¥u µ        È\17ÕÅ{ÇÊÛsM\902\99o[èéû\ 1_%ÜUãåûg\ eì\10\84\13Ê+\96\13ÒQ²C\92CìVÄÍíÒ½Q\9f\8dè\18\ 5Íê1ðþ\ 2 #E½\94éLÅK\ fèü\96½;¹Õ¾\8a¤ç\83ï\84v\96)!\ 3\ 3¡4¼¡m¾ÿJw,kå\97\92Ó\12:itvl_×\85§Æa\13T\15£LZÖÂMI<\95´\86P¶²JóY¥û\8dÙ\95\pâ¤pª+3ã['ù\ 2S'\85Î\9a¥Éõ\83m]Û·:~­\9eë«+z¬\7fß\1fÿ_$&Õÿ^\84øu];J¨\98ß\r·ûÜZ\19"ôü\1a¶Hg±ø\10cC\9f\91\ 3¦id¬õ¹_é¶`×mæ\85þ@\8f\902\9c\1f~³²]¨Oé8GQ±\84\aY~"ö«Í\ 6e$»¾\eÈFéÔ·º6e\ f\9d\99ϦãÔ\97\81\9d\0Ã\1c\97éUí¬2÷Zq\0îµ\13?=3Y¤á3íGæð\17.¥/Q>äV×ìF¤ðÔ¢àW1gQýy¡Ó8s¬~ûÏå\17ë¶2\ ea\9ºÒ\1e£5Y\9b§é®ê¦N\8elÜÌ­x­ó7¡¶N\83f¬¡Tc\95}\979åvoÖiû¢³ÙùgÂXhãP\e\14\16\fZ\95Zù³\9aWÇØ7é¤+6ð\1f\15»­ß*\8fããX­¬·Þ_ðÉ\98̺3\8c¡\17\8a: :ù\8c3\1d4î×]ãÕ9ÔÉw{ļ\10m\91\ fYu˸\92|\14-C*Þô\7fÞ·\16çVÍ\85ôò\1a¸·½qÔóøa\8f\8b\rÅ\9c7»Rí¶\87åî\11¡\9dÊ+.Í*\r}z*/¢<Q\16Ü´RFKØ®\8cÜk\97\92\9c\89Ï%i³:\95V\9b\vð1?á®Z²ÒKïÒ¦Îp\ 2Æm3zõëV3êè»}¨Û)æ®Â¿¯\1côTF¼»\8c(Ô3\94Ö\ö\1fV\83Ä\ f\93º1\9a\ 2×Ù3åöðV«u{ïj}n\13\95æz\96øª\97ÅÝ\8e+)áÇ(îeyV¤wÇKÁ¬´R\85\1c:ïçOjv\9f?\15\v~>¸Æ»\ 4û¿°ÚuzØô9ì¼Ç\87ñýÙ¯s\85ÐôCõ¢½«\8fdd£Ð2{\14G\85\12ÆÏùi©\89íZ\f§çª<{\1a¡
+3¨ßÛ5\ 6ÙY\95x7\1a\96¿~\7fZÆÎÝu\89¼\e\87"\9cB\
+YÐ\8fóEt\95¸Ê~\99lxP\8c,\93      \16\99ç©÷Ì8½uR 3\\99\19¥ã\90\99üOÌF`ø\9ePcïÑ·ÕìÝô}þ¬M\83m g[ï\ 3ϵknCMµAÝ·ê\18s\9d\±Ú¸¹§+ñÖÊ\95W\ 6\9f´i%µ\98«\16õ*U/dß\ f>_ø\9eå\\ 5?èY&µíf\1cã<IÏ­\17\9c®\8c¨\13\8d=;HJånÅ\14ùQUj¿"ç\94\bÄ\85¡t%%þ\85dÝÓý^\1eýÈ¢o\1d:äNZC\19úÒ©\14\1d\9a¼|]Ö3þuË\94_O¯ê\88î©ü=è\97\92Z ®E:|=ò§éö\99\e\88É9±Tã\93á2e4Í\17h\82\96*X:¥2q\9eÒ\eÏda\85ôWX\83Ìá5\9d°Zý1~õ¢=>0[o¼\92{ç°ðÒ\16°ñ gC\9cN\7fa0<Ñ×\8eNóPb½ãý#\11É\9f\96LO8\8c+±[LZè²\94\8az95ÉÃYé47\10ìY\96!Åy:>fWôª\17®SjÍYS:gº¤)ð;â´á}¢Hò\17| «\116îH\0åÊ\r\1cá\199\vqk <«[\b_Ç6\10v²ô\8dð\\96\840
+\7f\ 1`\9a\91\a¨¯U\0ú\9dÕ\ 1Ö\8c\ 4\80ñ©\16ÀÒÕ.@\8f-\a \93í\ 1 
\ 2\95\ 1H|h\0ä@\19\10º\r\90ÅêçÈVdñ=\ 1dY\7f\ 2d4À Â\1c@ÆMxëøÞ\ 5È\84\9dAL÷\10çÓ\7f\11\0dý8\ 1\14\0Ze\1e1ѥ¿\0°~¿ðc \ e\8d
+T¹\83\84\b\06h÷\0V\99L\ 1\86<|\80\ 6\95\18 ö$\aE¿x\80\16\99\ e\843\ 5(uÝ\ 14U¸\ 2䣼!\\12 _¬\b\0   ?}\80<ZË\9fØ<\ e>@"ü\9eh\v\13ÀO\99"üÔVß1±©¼_Fó\1cý\ 5\80ÍF\ 5\98\9a]¨sv\87:ã¼\bp²¥ÃO\13¨s\7f\9e\ 3\8fg
\1e"\0«Þ\8a\0Ã*2@O\83>@Ýë\12 S\1aF¤'Â\aöf_\88'\rP­P\86\18\89\0ÕóC\88Å\16ÊÁ¯\10R\9c\b\83\18\9a Áç½³\99ï3\b\ f\89[BTîÉÏ¿\0°Ý\f>Z[V¡@\82\ 3xW\96\0nOÛðÓ±\ fp+± «Nbé\7f\91\0ûTj\0[\9a\f\7f\ 40\ 6Û@(\17\80åfï\9fØàW\1c`D\16&ü[a v
+@ã*\94\1aß<\80\ 2æ\ 11E\13³4\19o\ e[ò­Ù2ñ,\8c=$|\8eòïÛ÷º\8cþ\ 2À.K¨ór©ýØ:»%(5êI\80È\1cÛ\80¨\15Ç\10ã- ²Ï\bà/\86\ 6øv\foi\9d\f\80\97i\a`_å\0°pv\a\98\7fÿ\ 2lMÓ\10J\19`\93Y\13â\ 3óÆnM\12³ô)v93þ±C\vCâe\16Z©Wv_MEå×\92¸Ïí÷÷ªNÄ×Ù¼_ÿ\r
+endstream\rendobj\r29 0 obj\r<</Length 65536>>stream\r
+\0°÷®\ 4pöS\ 3\ 4ÚJ¬\93[¨Ó\83µ\85\93óFb\ f\10_1ñ\95\7fLCfÈ\ 3\82\0þÖ\96\0ß-\ 3\80÷£\17Àõ\ 2\8c+¯ä!\96l¬N\96BL±\91ñÞ_ó\93\97ÿèyOk·}F\15s\87&\ 6}:t<-u\93ö'üÜI}Á\91E\91\9b'4{Éñ\1f?á/\0<\7f)ÿ³~òcH%S\88\ 2È\9ei\ 1òü]\0ò¢Àùëå\84\ 2²ÿ-\ 2\92¯Ë\80DúÃx'Û«8Õ_\9eÞ\19i\14½:Ó9ö<{ãÄÜý,eW¥èæúõ¨\ 2®òã±,ô\1e,Ö]Þ\17Cïv[Û1rÝ\ eBúrèXäñ\ 1tà¡åa¸Oõ\88˶\8bÚþ_\80©y/Á¼nÀ$\ 5\87Æ\8fkï´¨\0*\97\98{'Ê\1abw\ 1\94\9dÅ\0¥h\95\15ùuê\93\9dgÿyu¢Ñá´{ØÝù9\9céÎëþ\99Lлp\99зMy]º\11æ\81»î`ã\7fMõÕɹóZ\ 5ÁðùóÚ\83#»h£~c\93Aö©m)r/vÿ²©U²Áêýr÷\7f\ 1àr\ 4¥¶[5@ª\8fÆ\7fÜ\11\1f\851HU\96.Hµów\88\11ñîÌëÅç°õã>ú\98\16U5äíbÿ\8e}_³ë¾µÞ]üÚä|>Qíèt\89\1aß`4È\92ÇèXÈûïK½î7é®æ\89lj} ¾ìuçm\e\9fmpøÄëgºp_~\eN°p³\8c7ßsÈî\að1ÿ^ü\0àAª\f\88Û\84\81ÙM5ÿcCÕµä\80á÷\16ÐÅ^ø.Ô«\9fÈ\9eîép©2¥Û.\7fã/dz¬\9f\8b\ f\98\89\ 63\87.o¼\95\15z\a·}J¶Ç\1d\7fïéÁ\16Û\19ÇsnÛ½"\9c{­X½Íè\1dî×\ e\92\8dVó\\1c-Ô¬t\99ùóÇqz:.\ eÎõ"¸\7f\ 1V£|\19\90Å5\ 3(\86ááD56~\{ã\99\rh\8bÝ¿OCá\12=ýà\11bÏÚ÷êË[úÜßæ+Ç\99ÞløhëÚ:´,ÓÚ§£\9c½=7o+÷\96Û\1e6\8fÔô²~>{¯5W´ñ\15\9f\97++%-ÜÅq1ß»éäµn3ÿ\86ß\9c\eÑ ìq\989L^âg7á\oó\17\0!°Pªsc\ 1µ2\ 5\90Ú×:pú\7fOl½½ÃóÁ¾½pÝ\10\83ëq\10>N\ f©\84úßXLvz\1dö¥yu\17Ü(~[z/´M$ɽõÔC'+¡î-\97rzvX¨ïþe®\87Ý÷Ì<\8fÉé¹\143Óâx3r*»\92g3aõ2\ 6îÝ\1f#·Ù~$W5w¸µË«\7f\91,äÿ÷\ 2\10\8bV\ 5\90\ e¨¯#&\86I+Ùw<\8ds®ì>À·¿¹µ\83p{\1e¾Õà\88f\86¯C\e÷ñ]QÍåÝڻǬ\9bîGXa¨­/v\ 3±?o¿1{\967üä1Ó\12·ò\9cju~·ÙÂê;i¤o¹ñ¢ë´Ç\b¨¯Gr{\14\f[vó0ðÈÂn\90ÑâM? ¯Ë¿\0\v\ 2«Qº\ eRÚUù\8faR¬&\96ÛWµr\99\85\84óµ/p\827;.Ý­{ðtâ¶+\19*²y­\17ô\1a\91Rå%\85v¹¹\99Ƥéµä´\9d\91Ãõl»\9ds&\8d÷k3FÇÇã\88è\9d£aËÏP\ 3\15\ 6\99ÙxÖ\ ft2±@õ.æ~×ë3®Û+½\9cµuïéó¿\0Hj\b¥\9a\f\aR»¯
+è`×\7f\17¯Þ8jìÄÑ-[5­ îm{Þ¾ÚXî®ø2pëä÷½F59YñX\1c\16vvvÖÉê´Ò\1a4lÇJ+\13\1e9\9bcLë\r\86»Wc60F¥]¿«æ¯½~[A¬{ð®Y£)b[µÖØë>Sæ®k/¹u·.\16\97      æ¿\0\1fó\13\ 2\92\9bB©+\9e\ 34YÐb³;³îÛ\e%\9dï¾Ð<9¹\96tÄ1ÖØÃÆÇÙÖ>\9a·^!ûhIc\1fdvQ\9ai'ÂWE»\81\15Ùñ:½\15FTSh\rüsÊê[Õ`òãA|ݬ»OytìÄ\9a÷î4\8fÍ¢ùí
+}óë¤÷æ\8aC\sUx­\12\15y\9bý\ 5X\97\8eU@\85*ÔY/·"ÎSÅó]\8c*As¸LÆ\ 2G\1cõ8/­ï\94]ee\8f\13½]\91\17ý6ï\82-\98Öx\92²\e\1f=7\96÷·Êðpiq\83Üó-õ\86\19»m1seÐ\ 1ù2|\96\9fÝ\eî¶þ0¨Ô)ÓÞû\97N{ÿX¸í=\9cÇÂÇ´÷ëÉÒ \1fÓ¹A\1e\87Ó¿\0ÈÓ£\ 6\e'\v\9b­k§qÏ\aï\83Qð]E,C\89ÍÚ¾øn
+î´Wë­ñ¹¿\\98~ñ4\r\83ÖÓ\9e3~²Ók¬8\14=4ä^¡\7f1      ¦W],ùît_S;\ 2ìC\8d­±\9f´ÛÔj£wÐÓU;«<©õJF[ë\95«+í¬Ék=×\17\16º¹\93gº9k8\7fág)\ 2\ 3Pjßá^\95\9cÕ¸\94ÄYö\88å¿\99\83ï\87ù}ñ|*nY#äÖ\eôd.3¬êÌ\86êñàpûü}\82\97ú\9f!lµÉþUkd­gqWê6\15±nņh¤\96\8e®\a\9c\95XÕµ^ .[ý\15¨\93ã\ 3UÙn¬¨\93ç{¡FxjÕªæ\88yk(¥¦­\9b\7f\ 1PR\9a\ 1©\8bËÝ)\19Í\ 5ïa\81ö´¯Kï\8bS'»eE5q²Ø\bÀ¬­RW³5ï\97scç-\fÝ\89lÞÏ£ô³öêßä)j½rhª\8b ý¼©¦ÉjÛo¸M½`Ijk´I[j\9dǧJ\93-zòr6ÿÈ"¿\97dQ°§òçp_*3ê\9eÔ\eå]¼8*«Þí¿\0ë\12Ã\ 2:\1f6¯¹û2sDß{r\7f:ëÔvbðé\8dp\ 5©\15\9d\7f\14æ×\1c\10§öé`Ù\18É.G^os\1c\94æñÝzÓ\2êì" ÀMêÚÌ´Í×µ¤Ý²&ÛbÚ\15I\99Ï^\86,1\8f\89¤\96ñ½¨3êK¤ßfSÔ\v\9a-îë³\85¤Ø³\99\8cF3[\16Q{ü\17`cÏ%õæ\19ö\8a̹ª6a\82\86crWYæ`B\ e¶ø\8a&ÚØ|\90cSSÇh³¶\94aõ1í¿íAÿYw{õÎþÜÅðÜÓLEK¤\9d?fI­º\9cgÕé\8d«((\ 1\9aÒvuÓÅvã\9c¬I\v¹çmÃ÷\1a\17¿0\9d\8b\8fÚ\98ï!ý\85`\ eF3Á\1f\18¶¨]\8dñ_\80í½Z½í_\97ÌQ$\boµ*¸Û¨ßðUjWùÎûÏÛÇ\ 1ÕebO³ñÁ¥8NÏîÒàÖ\18õzÜà;ïâ´y0üÅí¢_\aò³õl\85\88ÚtÇ)y\13U
+\12]\ 6u!8ß\14¾o\9cûÍ\1aõX5lC
+\euF¯5êD}Ø`ߣEãñ\16\9dæ\90\15\936\8d/vêÿ\0hâÔ¸ôÄ~Ú£M\15ß2Á\ 3[íòÜw~ÅÎÀ\89\1f3ÐðBÓ©AµWc­O!nu¶\97ñÐè´¨\95>TÖ~kÊ\96\92\ 1\94²®yo\99\1a\9a\98h^\8b\19¡ØÁ«ÍG
+H\rÇ}Á\8eÌË-8$;¿×W/·Z\97\9aÚ \8e\85ö¼¾ü\1a\ eפ\9bcîݬ\rÿB(¥SÙã\92Ý'«¸»ë\9dÂ6hº\87,ºâ9\9eÖ#öùc\ 6\1aÜkÍÐú¢\85OwsÕs¦÷\96\1aíË+ÝÖ¢è8Q?\8föF!BÔ\97\8câæ&\ºZÌ\8fÒ\fÙd/Å\ 2÷1Ó\r\ eíqf\9d\18\r\92zö\9eß+,Mß\12ãÑÁ\80i\8f£9Óf6S\96\92F\13VÍ5\a\7fá\9aóìôÁÏq\98Û ·è2ã=â©\83V£        %Íî\83;\96½Z˵{5s8\97\9c\1e,¥¯ÎX\8bbk\1eL\ 4Å}\b\86\9c.g&¢åD\e¡RÝ\1d\9bμ\e6xVürRSÏÔ)\gØtÊÑ\18Ó\88\9dÚél\9ckÖ¬_ªYz{P½väYµ¼KM«ýÞeR½\94úÉñ\86?á/\1c\85÷\1cß>2\ ftÕÚ¥Á¬ÖnD\13×ßÜ\a·à{¶Ä¼z4NÖã¨M\vÃ\93²ËËw%5\v\b9³&ªb?õ\11\85êéc5ßÃhÚXÖ\83äø\ fN~ÌNõÔlôd3«9Áä·~¹V
+I¥:b´QµF¤\82JtÍä+\91~3Ëoöæ\94§»©]\ 2_aRvBbø\17öV\89B×ë£ú\9d\97\8b\9dÄ»Û\96ÊÞ}XÂ0¨\92à}Ã*®÷-0Èïd/å\1dÄ
+\9e\8f\84qË x.Û-4¾·.ǹ\9b®Z×u­Ë\9a\1dÃa`zmk\83Õè\\1dogqåU\8a3eÀdëe~Ú5JëÔ'\19\ e\96¤ð\18\97¤\0\91KxA\1d\15\1f\17©4>)ìÇÇñ_Ø\80ý\14\99_\9cáÓ^5w·a/ó=YÂ\9bñ\f\8b\9aîZ\8bòg#\ 5Ùò\9c\87íÑ¢)\18\99Ä\9d§A\14i\82KU\vy6 \v\fÓ{\14ÄZu\ 6\e(Ö§­JãLÛåe£¾)mD1(î,88KÝüTÁ\10Ë\>píN¾P*ms\97/Kç.Ç"ìKóL/×{§»¹Ò\f±~\0\1fóïÅ\ f\16\81¸}9s"º\8frËìÙZæ9Ï(\1c\162öVRÞÍÎ\9bÍ\99\1fV®Ë\9e\98\19\10.V«\85nºZ\7f¹¥ò×[ÕËØÉá\8bû¡©\14|[O¶\95\16²ñ`\90/"\83i®B\8c7Y\86\19§C!\19.?.§çý¯\9aæ+Ë9ý\8d¢\14½r¦"ÄY£%nÛú\vÓzçs\1f\99\1e}²>2ÿ\8fÄÄ\1f\1aY]Öb\9f\rÑO\8f\98SÐèÖj#iS\89]ç\^µõ[I-pQQ¯0 \90}§Ð|á\8b\92ÙÐ\rR\99çÁËg¸LPIó\ 5¯NK\95@N©ìݤt\1e\9dPi¤ç\93þ\ 6Oü¡ISY\94É\1cÅ\9bÄÉ3nÄɯe FÕ¿0N\97
+§^c"yF\17\f·êZÚ­Ä2\85Í9·\ 6\86µ\e\99é\94?\1d´WRó\82]¤Ãü,\7fr>\89Ù.7\10v«ìXYn3\ÚØÓßKÍ£±\90\ e\v»R4x\86¤)|câäR\18Q¤*\19¼\92áª\18S0%Ô\19\84ÃÄAv\8fÌí(Fx®[@øFÃ@ø¦zú\17?&Õÿ{\ 1K\87å\e§âdû\9f\84tê+NÍ!£ZeNtJ²\98U\vÙ§Ý\83ÂH#óÜ\rÔôÜTÛôªÇ\98
+`RÕÏ]Òä\17\16qZO\aøu×\19á\15úçMK\18\93\93çH|/­\11¾Öð \16!Â3)\fbRBx¶¨B\§\b\9e¡^\12\85XVþ\ 2\90\ 2Èó\9a\ 1¨Dç\ 1jÖËð\93òsR\1fòR\9a\0éu[\0IÍzñ÷þYÆ_¿u\8e¿ãÃ7þNJy\88!\aqkÅ_;\ao±U'þv\9d5Ä3\88¿Vý        qÍÄß^³\ e±Tão\1f\85÷ÍJ£\ 4Épð'\8c¿;v\9c`\12\7fß­)@\88Îì7~¤¢µo\16 «Z\ 1 ¾\ 2¥®º,Ô;â¡Ø¥\ e\90íg\f\90\ 5Hsq\ 3H\85À\ 1\92n\15\7fb\93>
+\0Añ6\ 4?\84\18Ï!®;\80\vD7\86\883\0Á\93_Ãß\ 6|jcü\9fçç\87ÿb\ 1\10\8a×ùÅ&Æg½õ¿Hb\93\84\05\9e\98\86R¿Í<ÀÊý2Àè\19\94\1az\ 2@ר      P\99µ\ 1\9a\9fî\ 1J"O\80\\ 5\98\ fûu\15 \vD\86à»\10\8e\r\90ái\r\90\11éC\88w\b\17ù\89Í8\9b\98Ñ=         \93\92\ 51\99%&óí\7f±KÌè»\18¿,v¯L.¿yv¦èú\17\0:\8a¡Î°\90\ 6\98Ö-\0l¶©\0l\17Õ\ 16 ~^\81\84é­Ä\82¾]\0\fÅ\ 3\80\ 6\12\0¨½\86ñ²p\ e ª¤\ 3\94s\86\10á\ 2 %\1aƦ$\9e!f/\88\98\0hY)\ 1´\82¶ zc\88Ç&\967éàÝÚ\1d½wª9M\16ò\93ðøÌO3ûG5\9a¹a\9dTÖ¿\0³;±Í6Å\fÀ.³<Àó÷
+Àë©:À\95\9e\ 6?\9dG\0§Òk\80Ýô+À\16\a\14`\ 6\ e£T\93\ 4\80eW?\8eÊ\18ö´\ 1\86×\\80¾\8c\13Äæ\ 1Ðsô\ 5è¥\96\86\98Õb¥\1c)o\8deÇ/Cël\9e\ 5¦w\8cú=ö\18\95S©ãcÔ¾û÷æ@Ü_\95­¿¾h÷Áò\17~\96\ 5(õ2Ê\ 2\14\0\1ed*\80@ÛM@T_& ²\8c\rðç`\a\14\ 2¼\97#\ 1ÞЫ\0
+Àîq?vÍì<&ϵÝ{ß\12Ïo8\16\8f^¾Øÿ¾²î\9cz\9eÔ0qçy\16¼\82\10\95Oö0t\84Ùò\ e\a\r\8e\7f\83\9b\844\83«\8a\7f½\93¥\16\13V(\ fÎAì_\80y.¦\ 1În\12Çn´\0\b¡\ 1u\1e\92ÃQ>\\17bõãÚKxO\ f\10f6\ 2\844HÇ©\92U{\1d]Iz\9e\87\9cù,n¸Q4\88¥åãÁë\87\a3ÑÏá\8bu\9e!×_ ÷yx¤ïü¤ÈÞ`SݽRæi~>¦|(ìdúAE\a;ßyÿÔ\9b\ 3î\ 4Ó];#\8e·Çnvø\v°Pj4À×\97,T\99\87RÁ¤\ 6È^E\ 5ävÞ\87HÌÒ³æ1¦ÍúóU¨ÞÐè¾?ä\1f6;­\87\r¿­Ü\85©\90\14\81ÛúÞ\9a\·'ayMQÂþÒn·Îçã¦\1d\9d\b=õø \1fTɼâO'ÂÈ\13Ê\8dõAf2î¾Å\ 5ëí1\10ç\9b;}µ×ìT\1d¬Þ\r®ÿ\v°XÚ?çÙ\10é\ f\94z\93\8b\80´Î\f r\96\ 6(ó;LÌÒ«·\19\16\ eÏJ{u~p\15îu\97R\1fòºçvÅ\8b±1Øs¡R\97\83û\ e3\8e¶x\1døo'\9cypj½ñ\84àt<lÈ0<\10ítb\17Ø·\ 2«¼k\ 3Út/Jvº¹7¿ËMÕ¿.V³\86ê,Ñà5\9aïæ\93Þ\ã;Ö/\0¼³I\ 3¢\9dÊ\0\92\e\16¡Äb#Ù)«\81Tº6z\1fßåY\14QNR CAOïnÔg}9\9fÛ¥8\18\87\8f?\Þ[©Hí <\ eü^»¬õ\9d±\1aö¶Ákho\v¥ÉÚ-g¡ê\91u\88ÖÑ=E­Þϵ¸ü|\90Á\12Ëæ\16\v¥û\9aÍ|¤3\9ev/\99d\ 3³ÓÿÜ»Nyéu~\ 1àÇ\0J½5r\80t·%@\8dÕÄÜûÔAj®\r\9f#q5\fÅ:>¾\1a\8döôt\1f¼wþGª]<\ 2ÝÇûvZ&v¹Y¾àÞ²QâD¾  \81\9f\81­­â}¿·üN\94ÉR¼\18ë\85[\9e\9dæû\9c\17Ïé¾V\99eaFM\v\97êÔ¹ö3¶=\16½áıú½ñ|X6\13\18¿\0s=¢\ 1Ylå~\8c)YP\ 5)z.\82Ô>Û~w'X'üê@»úfË8\8d\v\17ýÂü@g\1co\97\7fäB·º\|ÖoJ¤V\v\9b.Ày\8b_[¨¯\950×½\816;bãþôt3\1dç\1a\r¶N¥à'ó\e{<äè\89³ù*p\ e¯\8dÇó\9b6\1e­ÑB\7f¸%®\9d!¥ÍÛ\7f\ 1f|r$\865)ÀÔÌÕà\9cz/¾»c_}Ö<U¹íw\8dƹÒ\9e5ýÕ;\9bl%9¤\8bîd;àÓ\9b\8dý\99\9c\ 3\9cç+y\1f\9d{\8c\ 4g-©bqÚ³aÅ\1fêGÑ\9eÈÛödZ\9e\ eÆ\8bÜt>Fz\8fãH
+ed¨¾©æ\90Úíû\83Cÿ4ì\1fÇV·ßaT³w\9e\16\93Ç$¡ö\v\80Xäa\19u§y@\85\1cóî2\12wW^\97Ü¥È\95ÓçÊ¢\9c;
+tX9´ksy{ëVz\eçµ]¬$5\7f\84}\9d\9dr\85÷´¿xàN\8d\9c$VõÉ{Ò(\8d?Z\9e\e£RJ\19nowsp\b¢É C¥¶ý|¦\1dõÎÏ\ eÛ+5\10³Wj1}kèá\1d«Ú~µ»Qæ¬%hý\ 2, Õ\f °m\1e\96M)1¦\84\9d>_÷>\1ap\17\v?
\ 1å¥\1a|n×»1üæMßÌÕz$;\8b6\12lgÖª\1c8áÁ\7fØõXý\8c¿2A\8c6÷ ;ܹ³ÊÀ\10º|¿[P´^éXïY#¢»ìÚt\90¸ótÞ\9de±ó¶\87íÎL9X    :\9dF<ÑÍϼÓJ þ\ 2 )!\v¨Ú6\e·C¦r5¢è\e¼X%y£×÷ã¥T\80î»Y$íÚò\99]\8bøäç}Ò)+5\9a\9dßý\95ópbo\ 2\14õ2\96&økD~\96ÈÀ·´TßB³\85^¹ÿd¬\9a\19Ê\9d8uê\98_,tL±U?\1a\e?\9b16\8fT\v¢Õ5\94IÃ0\94NU3\149¯&HNçù ÿ\ 5l\9cZPªqÈDѦ\91¹\14Iï{D\96ñûàQn¼ÏG\ 3°\1dÍ'äúÛ\1cV\97»;+Ï»ú¥?­\86õ¹Ý\18®¶cY¯\9c\86\87Þá1È9\8d¸wË`É^\k<ó3]\8eq*æ×S\9b\86«òz{/èã6mï÷ºI9¤n¦F\92n\96QS÷5¢­û\8d\8f¦û¥HI ÿ\ 2¬K\1d¨Ó\ 3ù;Yª¡'¦#&f;o{ò_ûnuðÞ\8eö\95×f\9eÏ£+5W*.²ÁG\98\86l¿cÏÎ\983Vêêz\bGs~ÿ\92m]{Uþ\13u_\97Í·³\90Ì\94\99¢A©8«\1f\11 h§\18ï·n\b¿i\r6Ùd#fkà\96y\88¥Ñºa^[+fw-­\88-å¿\0ÈÓ$\v[¦béê×0äÈß\9fÏCf¨?¶÷¸\18mæÌ1\¹Ë-X\98\8b]z6\98/9;\ e³\89\ 4;ø£¡_ÉÍû\97Ït׫\15«§îL\ eÂ\ ej\8aoc\97*\12í¶ýÊêùô¡ÖºíÖ\92úX\1dºÊk
+\16J\83^=\95FúÄ)Ó¶ÑV^\8b®®2\aCUÇ7Mú\17ð1ÿ^Àê4ͼz`\9aûÉx\9fÀüçî²á\1enÝ¿Ý×xªw[\1c9á9»u\15Ò\99²õêD:\85ò(­¨ÝA\91\ 1N\8fÁZënó\11\1dL\97î_\fº\91\8dô ¸&\89¦\95\91!¥F³VQy\9brC^¦ä¶\8c\1a\87\99$\9f¥»$_Ƭ´)ÔàwõrK\16\94\82"/ºYQ\ 6\9bÂo\0J\§Cô¥aÁ+_{\1fÚ·A´­\rðÄÏf½Ú®ïË´\93\86\9dÍÙ\99ú!2Yßè=\1c7\a¥tºÝc>ëQ\97¿\95à\1cp·Ù¶ýW3Ð\8b\99ðÖ
+çóX­¿e\þ\9a¥\9cä¦2¬¸Çª\9aH«SG0¼ÊU0VRr\90&\f¿ºàù±*jt,KÄ\0\13%B\8b\85_ø)£7Í+ þÚ¸þ\93\9a\9b¹y\v\97\87\9ap\9dÝ\8eË£ý\19g\ f\13âÞ|\8d\f\aý:ÃôØ×-©\9e]áÔ¶Ì\94|\9f´;cc©Ý<r×bÉýY\ 1\13ó!Ka\15\91¨^\8a\16\8eè§Ê\9f©¼Ò¼¡ò°98åÎÍÁ\96+7\aÓ§Ö\1cô®*oá¡Ì\9fp_\10²ÌéÿA\12\9b$|çÕõ?\19\ f+û8r\9f<\ 2Kæ§w\9b÷ôûÉ\99Ñuo¬-ÜÝ°0\9f_ûaç\85[±y(t1£Ó0ü\f¡·\vÍM_«\95ʶ:ë\86kELÏ=i§I7±ýJ'\9e)B~\84\92Í{áSjDÕ¼Ø`»\9d\ 17\ 5¹#7½óEnº|¶¸éèªr¯Ñ^n\8c½\95Ð\bïsþ\17ÂåxF\1cA?ûÞ]\ 2)Ú ø1\t¸ÌeÊδÄKu¢¨á~p\1däÖ\16(½¼î\1aÏ=;\94\fó@TôÁn'´\9c­b¨\bF\ ed\95ßO%ú=p\85ÓX
+øA©øhÖN)\94\8bÛD®þí²|]¼.zul(y¬\v+\e«8Ï$oXÅ
+\15vcùR]p]¡¾8­ø_¸úF\ 1\83\rüêé:\15ü±<\88­Û¬ÚY\ 66úÂ\ eC« ¹\16hL\17f{\98Z\18\11è÷t\ahlßH«\8bs=)i
+Q£%©=8\19b>ï\fù[hÎ\9b\93\1e\aÇ\fÙÜ\85\13\8a\15P\973B\86m\15\86\1cÓ®\9cM&\1d\rvLúyÊÕ\8e\8d\9a\3ï´RË     W©æ·]\9e¡\87«æ/ÀÇ\ 4Ó¼\bv}\9b\8fÖÒöø\98\97øèl/Í\827Ên¬mÏy\9dW\9d\14\95\9aêÕ¯f«Ë{m¥bâì¢\90j\88HFàgÄÂ`ÏðaÞ\91\9avh\99\8dÙY\1d\88\15GòYm(%ûÖ\18Ã\1e\92µîüP­^Ñ¢^í\añ¦Úß\963\95ûÝ\96*5¬.\96#\87\16*UûËWªÊµù\v\a\8fsaþF¢EÇboά©\1dG¾àî{/æµî¤\8aùdMZ\1f5µ±\8a\r¯#ÑZs#¡2S\97üC{^\9b¯N\ ei\80>\93m +\89©o[\9cÄ\1e\fÎd\8e\16\9d\87ÒºV\8cÆ\97j%Þ\7f+\13!],¿6\ 3¥<µÄeyÚ²S%0\8a\1a%ÞÝ$\ eþ%\84ëóÅÕMä\8bR»Ðø\85míÊ<\97íZû>e/£`¬Ý®\87þøHm:-\8b\9dë#­;Q±Åi ZÇ\9cÕ\0Ï\89UOEò\90õ\82ó\865,æÆf¹mÒ{2\ 5á\98«õOx½\1a\16\8bJå)pV¥¾Ñ\9drs?Þ\97V\95ç³\84Ù\1c]TI¿Y$\ fƸ°\1f­¿\85}\8e­\15èV\95Ï{\1f\82Ï\eí \99Ïf6\8d_Xm\eÛ$ofÕup\9e(SÌë?à\0´³=É\v\1fÙ\8a\ e\85\9b\8ct\1a\82Zj±Yâ¢×\ 6ñt^}ð\87]\95        ð[eZ¨\80ò\82\17¨2²î\14JøeÈ\16\83R8¬\1e\9düñB9ù|ùçü´\oµ\7fåJ2\97Ë\ e/W9[\9dïVÙêðCg\1e§*\93y¸y&3Q   6ÃÄwæ\17æ¥!qµ±\Á\1f\fæü¶Kd;K}4\9b9\8aÚ\ e\90Å»Ü\86*i?\89ÖìË\15®D\8ae1ß^\966³É¾¸[MÏE:w|\16²\8d;\92/\88\17*×?}òÙÑ\87¨e\9eb\9eOÇV£\9dn\82É\98^        ¯=\8d\9dôwÊ\9dR\85\14ùqZÔ~5ó¨ýd\97£tâ\9eTOJ»ìÊ\94¶[\96~Á^®\9aÇa±`1Yé!\11Ì\14u\18\8fùÇ\e·ê»a^¯\95Ç¢TúFóF1åfµBöù\863'pYæ*¨çf\19rçe¸ô2±u¦ù¼}£¥r?J¹cûCí§c\82¢?n\8e\90!NÛ\82J\14\11~õS>>0w(^É·X,¼ê3l<Ô>\10§ô_\18\9e6ÎÞBSÇ\9f\15ö²\1cÍ\15u\89Mø(_ì×µ!kTk¯\9aTtc\9dË\9dÏ\80Í\8eå½\96q´±\9eæsz\87\96J\9c\95Rk¹>¥sÈ\90ô\17\88M\9cÖ\8f\19a)ø\ 6\1fèÈ\ 1\e\9bà\84:}ä\81ð\fòý±Ü2½\ 2³i\19âä$>²p|Å\89i\84o\94T\84\1eÄüþ\vÖbúrÛýÉ{®¸\9f,lª:ê¨N·\e\99ÖäÂ\81ç¹ìp4¬¤\9bÏ[Ò¦ÑØmÂ¥È\88eH\7föaÈ\1c\826 K\8a\92²\9b\18\93Õx\94+ÖE\84¯\16\14\bÅ\80X\ e!>\v\84¯   \89­÷\10\8d\14Ä\83\83\ 3(V\84ÿ¨Ã©5ÏÍJÿ¸ö¾\e¿\0\90\v\10\8eG\0â\fp\80X\ 3\ 2~g¥âïÁÊÆß\8cY\8e?\81ËÇ\1f\87\8fªMá\f?8Ä\9fF)\84\18!\10÷Lüifà}ÍV\12\e\18.T\88G'þð\95IüÑW»øÓ®¿ \*þ\184¼ÕÐ\9a       \1aÿ\ 1\1cæ$\10\92Køi9\92~\ 1J¬C\9dnâ*ü\9cã?¶Îgâ\8fëîÓPï*\17\7f\17n5þ\1a\98\14\7fkJ/þb\9byü9£\1eDû    \11àñç\92ÉCÈ5\88\85\bñÐãÏ5×\870gñ'\ ea¼@7\86\88Óñç£0?±ùlàO¦.ê\7fÑJ Á\7fxZü-Eí_\0\88Úü\ 2\14K\8e³¨¹\18@Å+        Ðl\buºa\1e ½\ 2\a\90\92\ 6\7få³\eÆpôúc þ\8eå\13Ä\11ÄßI\9e\86è\94!\ eÍøk#\89\19\9déBXc\88Ó:þ:\85\0b\16Çßi½\0±\81÷íòF¼Òò\9d\89N\8cyo\88åýç\93õÒÕQr\92ÅOø/\0\10\85R\97W(ÕKl³+\92\ 6èX¬\0\ 5\80æ"xß%o\ 3dÖÙ\ 1D;Ü\0Âg`yá{9\883\v\10!-CHð>Á\19þäMõ4\aH\8d\86÷\8bÝ+D\8c\ 2D\9aÕb¼\15Èojô6_i'°\9eGnÓ{\9a·¾\95 \17\9d\ 5¥÷¨\\9eæ/À\84\9cC\9d÷'\ 6°2\89\ 3L«Q?\96Ûf3±Qï\98Ä\a]\ 1\18Ò°\0z\9c.\0:y\1d\ 1
+{ \80Ö'\14@\v\8f2@\8b\15\18\eÊlC¸}\88ï,\96\rl\13\13Ù²ÿÞ\9e´û;U\9c#¯L\r+?ójS|Ü3ÍdmíQí\8a\83p²'û!«Åýû\9b¾öo\8b\97Õ½\12\ 6Þþ\ 5\98\90'\14
+àv5(õ­\90\0Ï{\ 5\80×ó\1cÀ\v\1d\r`ña\b°\ 3µ\ 1X\9b?\ 3LX%\8b^±ÒÝÒïÝþ\~yÇ[óe(Hë\19ì©î³\90N\8f¢Ëº2\8fÊ\ 4ç>î;ëô\18i§whO*Ù{³i6n\18néW¥5\1e\4±Ø;{\e`\9d\råÖ\rÊlIóëÆLú\ 1|Ì¿\17\0\89Ê\ 2
+pVÃ\0>\99A©Q¦\f\88ÌD\0\ 4ú0\ 1~ÊM\0îèÛ·\1eTN¯\1cOEÑõ\8db\8fÐ{g\1f\f\8eVC.\85ò÷¹\88ªw\1e+uo+\95M¶ùÜ°Ec~u\85ÞþJ\ 6Çûeo±Ä9\eõØ üh(þsV2½xy7<\1e\87¯;Ò÷äã+oý\1dì/ÿ\7fÀ\1cÆ\10\98\86M\88u\1f\ 5DåM\ 3bñóJq@Ü\1eÉ\81ÈL'Ö0nüÊw\ eÓ¨*µÝpºl\9cïB1ÿºá\ 1\89_©=\96»¤Wqõl¾¾üɺ\87J08ùíã£\18\ e\8fÌð;÷\9dgáà\ 1®\ey\88A\17÷[ª ìô \9b\14\81­y9iî¹ì¨nq¬Êë       õâWÓê\9aû\ 5\80]ò_\98\90\ 6\ 2Uz8TÇf\ 1Ém\13³tN\8aµ;c<Ë\93\9e\11ÎNo붠    vÓ\8b·Ö¶ç|\98MzÏ zØGþ»>øz\9fJ'å       \9d^ñ k-f¿õ;â>\85÷Ú»vk:Ø\1e\97Ûù6\8f#G·×\9aâ\9bj\r0k¶QÔV\rá¦,\17\9b\85´Dɶ0ß>RÜÌÃ/ì¿H\ 6PI\b\13\94ý\ 2\ 2\99Á\ 4\9d¿   @ªÃ\ 2 O¯Ä,Í\8bÏÁ~(\84¼\11\88×} ¶ÎÅ\Ü;:\9cäx«<Ø\1c\94Õ!ØÓ¥ác\97Ív¾Û\ 2¥¥Ü~U,lFu\91]G\ 3\7f³f\8fZ{5Ë\8f\8fæm\96±\14.ä÷½8×\90¼43ð·4Ë\9c#qÚ-m\9aN\19\13ëöHÍÖ~\ 1à\1d\19êä=\f\90Å\12\ 5Èç±\ 4()Ǿs\8bCÒB\87\8bƨpmWâRðØJ¬/P\88z f\93ÞÎÜV§î5zï6c}sZ;ì(ZÍËÆw¹ú?\8cý\89\92ªÊÖ\0ê>\v*`ß\83Ò\89"\ 2Ò\88\80tb\83bß \82¼ÿ\81ZkÿµO\9d}#nÄ\8c\ f­²f\ e\11\92Ì\91IZ a7\8f\93\r\aBPÔf%\92¶ö7A°ª\15{a\8a\12tX(NP4\1ey\ 47\10\ 6Éú\9ezÚ®!´¨óèk\84ç£ó%8ëü!.\1cæÙÞ¼§¡J8\1cíò\87Æó½TÀû\90Kò·±\91¶­Bä\96\ fr¢×ô¹\vEläM\8e\865_Æ\1e\92\r¬¸^;ï;ÌÚ?Û\13u\11Z\82(\ 3æÉWË\8b«>n.Ú\17®o \ f\99Ñ\175GÑ"¥°Ò\88Ç97§A²;Ïog\84ºV$\\85\1eXo6Aáά\(´ÿðÏPÄ*\1f\83Ñ'\97îP\ e~\9at=º\1cËùûiÞZÜ\8eÆ@z\ 4ù\óãóz¥¼i#wÄû\1cÅÑ2§ç§Îx¿6ì
+&xæùØÜ/n6p5\9eÂí­¿Çû¼\16\ fVe\rh\1aY1s\9a[\91*#\1eù\99\7f«\9b³r÷ùR\84\85ÚPjÌ\e\93ÏÍg_\96n\aDnª^GºuõÖ\1fþýàûqò9À=躻\96®§9.\9d\ 2×\7f\1eökà\9c\9d7~@x\8fMûn\81^äð­e~R"\9d\12¾æ,\91!ÕÅ]\7f\9b\86QòÖ:n\8e\ f\1aÅwoó!S\8fÕq7\ fθzTS¦¥\b\95åz\89\91nì@\95:Á÷(>õOEÔG\_ìAT\96¹Í¶ÝéÛﶦæ¤ÒøC\fÎ\8eéÞ\94*¹§\89\16?\97úòz9\10\12°ßC\9e³÷\ 5b¸ß\ϽË
+\93ºÉ²Ð\87ªN¹\16ô­Æ\8b\1c-\10ï<Õ£¶\9eM\1cÓ\ 6ã\963\1f!9_-úÛÓ¬âY¡RWÄDº×è¢\18\16é\96Ø\ę)Îø¢àì\89­@    \ 4$PÚ·\97\81\b9ôÞÎh
+¹Ú±þ\87\18ôïÿ|QÀ\89\ 2ï`\8e\7f\9c\90âä¸_\93»\9d_k÷¶\9bÙé³Y\99¹m°\1c\ 2û·Ã\95ü\92ÕtÉÎ\ 2\9dÅ\ 3ݶTNË\9f[3Õ§BsÆ_­\95Ò\18\ eöÒ=©^Åð\94¼§\9f]\\10¾k »\ 5KÈ9\ 5\8c\a\8dæ\84\e\92+îNy®¸Wº\ñnt2ÚÙÓ\ 6WtùÚ\1fÒ\ 34\ 4b¸ª\16¯{\b¹\1f¬Wó°+\83ÜvsC¾«ÕÛ±<\ f\88ÄÝÏ|è\8fø´.\ 5\ 1\v¸©;S\ f×
+\1a>V'»\8f¤\9c¢¹&Ϧ\88-!ßh3\8d\16ÁIH8ûɯ!)á|@.Oö\1f\1d\9dTÛçqÚߥ-¶Ñ\1f\ 6ÓmV\\ f²64+.ú\rV\94ÚÕ?ÄPãù}Í>zr\11Ëù[\90·oûí¹\8do×=xëy\94H8nq\9a6JëAõjvïe@ÿÎÎ5\r\9eÊÉàP\91G\ 6/w\9eýlÐK4\8b\ fcJ.\16K\81V¥=\ f\95+\ 3\9e¬:<¾jÝ6ó\90\874£µb\9dA\9eù\ f\83\ 2×&£QP\9bÑ:I\83ypù:ó £ê\1f~\ eÐ\87Ã\²\19]§¹¹¼ì|ÏÙmT´¸ñ¾]Ãs·$dÛõ¯f\9b\b¶<\18\84èGÚhª\96T\9enu\94\8bz§¤\90$\18\11\97_Ói®ºÖø\8d3q8®QÛLjA|b\9b\9b÷\8by"Çüèݼg\87À0F\8aä\90\èê\904ý×\90´fõ¡ý   Zø~j\f£Ï²:ÂêëÊ\1fbhÝ+ÜÁ®\11\1eì<zô\85\8b¼[÷\98Ïf9j°\9eSE\1fi\88\8b\9an\10!\96uصõDx©\ 1Û\ 3\95+\166¤WCì\89Ä°:\14Vs\9fã\8b·\8929\8eÊ\ 6+'Ïå¸+;;¦Ç;\8fá\17V\93a.gUéBtÄ\ 6cª'\rÆ\ 3á1\18ÓXu°Ñ¤&]x,\1a4\9d\10\1eí\95f\95?Dþ\89\83¯<4x\ 6ù\epØÜ\96=ßs©ýÆ-\91}Ïjïg¦\9e\99\ 6·\ f\9e*lÞi\v2\7fûJï\9cQ\16\ 1 ß\15\98Ö\8bâ\ 2f6\9eH9,[ûaüh?ç\8cqöì\111à6Ã\ 16¾Ð`HE\83â\95-R\95\83\81\92b\ 3\14\89^I±X(\93Ç1Ý \8f8V£¸\r]¥vg²ü\87ç[¨|Î\8a\96Üwåé&KB®{fÑ_\8e\8cÕÖn¼\93å\ 2cÐÅ|×Æå\99\8c÷,¥[\9d\ 6\92©Êï©7C@\ 1ÞD\rn\9a_öÙ\eEÓcT\89'£¸¶\91\86˽lÐ\fÖ[\ e&ÝÞ\81ª^[!Ù8ôA¢}Q²ô\ 3®µ¿\13\ëÖN¸V\89\8b¸\96oÖñ\aÒ©\11m¤\&\94\ 1\úÃ\83b>\9f\83\8d0ç­Ìª\81窡ï\b\1dvc¢¼íè\ 5ï¦ÏZØ]\94,ÈPEê¹ÏºQSpû½ò|áò\9d\\ 6v\89í:L\9b1#\18\eQÚm4\ 4[\8e\9d8\95\9ar=\9b\94\1dÑ\ 5êw\1cýôs\18\96(­~ìU&}g\94VÌNã\rõ\1d¸YïÛq¹Ö\8f\82aP\9c­;ø³ýåº\17\95×\1e&ããÚ¨QÁ\12ZÝ÷Öl\v­\f`\87Zê!\99Îå~Î\15\ 5Ö\f&|\95Ot®a\ e\96'\9eãþ\ eË\8d\96P¡2\1c-o\1dº\84;\ 4u|qÙ*\8a¤¢v§ÄÜèêx¿SYaD½~î\ fÚÔ·7ª)µ\1eøi1èÖîøè\96+\80è8¬UÑñ\11NY\ 1\95^áù.þá\84l®÷íù²9zî·u°Ï\80\98\9d7\v<¿\Î÷àm¡ Ep6]\97\11aÒÁ\9aÃ1f4EÆ\814gä\95\83ã\90¹\ 4/º,xyêÜÒ«äì4ì\10ÚmHâ\98X\1fc䬥ôéiÝê1
+\1e \13\81{#\82¼*#5b\98u<ºg\80^uOG4ß\95útµÛðËånÃ.\94º\rö        ÿa¿\81Ñ˺_ã\8en\19ÚïMô\9b¬µm®iÏÚ5N\17\a\91!s§oÀ1±w£inÓ£\aÓ»\9cM¸¤.\83÷\92¼\8fá#\11òÍ7þ\91º\ 5ì«v«XN¬wûà¬Nõ\8az\8bG+VOGê\1aµîÊoçÑQ¿!Øé.e¬\1dN5§\1döŤÝ\9bÌJ­÷\13+¶Ìi\19n\99ÃÂ?d)Õÿ{²m)\9b\93\97¿SgK­\ f|#\87-<µÑ>[b²º«|MÉOǦÚ\19Ó{zH\91ÈÈűe\8f\1fb\83Ï^ê¯'u·Ï\94åcoÒs^h`\1d\vÈiy¬ ÍÂ'krt;Åï £  -±ý:sv+º{Ç\16\89ÂI\v\90ær»Ö\9bËÙ6jæ½\0n¬ë3¨1ÚÒ`\ 3"\9a\85\88Íôl\9fÉU`|\91×F=^\v\8edóõ¬ÉÁ\1fzDÚ\93¸M¸a1ñF$b¬0,ÿ\81\8cÍÐÎ3\94È\8en\\85N\8fé\9bí\ flíÚæíûh}\aH®åæÅJ+'mÑæðö\19\ 3\m\14O;¿¾\97±O½ò½5kÇà\94}\vVí8=ÞkÓ+\ 4ÖêÄ©P=?ì|U\16\84Ü\1fܲ\ 4\9e\16f\0mçû\15\96~&ÅáB(\1fæêøÃ,§Ã\12ñdI$\fÉ>c&\bÒ\8c±f\e·ÎÍÆöýÓ#hL@\94i\94.ö¬.\10\ f§^+#Aít\10\1f5I¿æª7¨T­Î|¶_yv¶lE\v[\8bò{ä\1dËfsX(Ås\0/94á\97ìw\ 4\94\91/\91ãS¾\98|íÜ/i1?[Sß\8eö\1aKI+ùµÑ-\81ëlµñgq\92è ý\9e\10ï|\91îÃV©×U\1d¬Õ\1a´7õzÐêVj­6<¨ª\ 1ÆUBt¢TzælQ¶\8aëUé;\7f\1cJ\83BéY\\8d\91, Y\ 4ïB    f\a\ 1\ 2\97
+m\16Ú\9f\8f\16Ä[Ó\eT\9dt+à©RæÀSU|\82¢t\82@\11[\16@±¹ÈÿA\1f¥=Zå±|ºSøú1Øl¡\1d:\98À<aæ[?ÃD\1cÛÀ:F\97ì4GK¯Q\93\90\82^/\952±~Ó%ºÕ\14\8aëyM\82ý\ 5¬Â¥¸¼H[\9c5\17<­:[P\1a\85«¯½
+\9dò.\9fGëïzn1ÃH z\ 63À6ø\0 ±Fá'      \89·F\0IÌÎ\0IÂÀÿb6ë\14\96Óq\13\86ÐP\87¥\88\14   s0fÑ#A\90í¨" \8dÒYmT;£{¹D~Ú`\11ê]\9apéóé@\ 2\99Ën\92\ 5O^\8e\ 2\9b\85pPè\14÷Ã<ZuÇ9¬9ç\0²«H)\97\ 5@"­M\8ay\ 3\92Í\92Ý!\0Ù\93D\80ì\13»l\1d\84ôgxq\90\ 6\8bnS\1e\9f?dí´´uaO\90ÒH\eNF\92L\98®É£Ç­1l\13á¬_\17L³U~϶å"X\82@\88×\902xZ*\8dÂuÓ®æ\1f»G)·\10\97\15\80ì0\19³F\8aÝN    Ð\94\84Lãì³?;­;\97S>v\1aïø\90\12\7fÓxÍlV/\9d¾¥~c\9dò3\vy\9eÍB\1er\7f\88\12\8c\12ÿ\1aFÉõõ\8a\92Y\90>*/_ÑwªEQüѳ\ 3:\8a·ïF\14ÏP<\8aÉ\ 5\17ÅT^Oa×)ûs\14\ f\8aï\94A.Å(¥\1cÓ\17Ó \9aBQ)Nú\17CØHY\1f£xTý¤Hé\7f*\ 6Õÿ£öSLºý\17ãÚøKb\9fÂ\18\80¢\94f>\r5\8a²x¯ïèû\Gi¼çBômÀ\8dè\vId\14_O|\14ß\90´Ô\9b»\8dâ{î\9a\82\7f~\8a¹\e\85\94K%\8a\1f`+\ 5ï§èÃ\94\9b\10ÅOl\91ò:Eq8\8aSNå(~A­\7føæ«\9dÿ£\e}«mä\ fi\88ÉÏ\9a÷\0\ 3¥¡.\1a¯\18\90\1aï\18\80óï4Þ(\8e\92´ò\8e\92Ü,ýóU0\88¾R)[·\8e_¤\¶Ñwܽ§ÈqÊ\11\8a¾,XMÁÓ\17³*\91r`¢ï¤,¥HÖO\1e\9a+\9d£¯ºÎE.\ 2Õ?+\fê~@ÿÕÉè¾·\93Ó\ fÈÿâß\10Oí0ÎåûÏ\18xeËn,Úi°\92THwóº\16%ß<ö\93\87v\11&Jø¹\12%ÈÅ\89\12´w\88\92\9a\9a\1e<µ;\10%õ,7]\1f·R\9c~\94ôâa\94ôQ!e6OyyQ\9e*\9d>ÐHʽ\82΢\1a\9ezK$\14?\1a\126,\ 1y^ÙIVCgÛÞóJÐèSIPä\97\7f£D\88G\9cãG\19ì3Å\8aS\92R\9cC\91v\f¼E*\ 6Ì-\1f\ 3lN\8f\81\8a\81\92s\89\812\10EËC\17\8cè)\97­\96ðY_¦\9d\ f£8øÛ\7fxÃ÷D;s¯àýV^\82Õ´Âsi\16<gçë÷\81.\81òÝ,tÐ[\8cÅè\8dÜ\9dÑ\eÀmR(\a¹z9µ{¥WÜ\7f\91\868H\ 3Û\8b?ßì\97K+í\14å\9e%~\81\94Q5η·ÙÄîÏ0Îy])Î\r§Ög\93\8c7ïÝ{||\1dîãç«\8eÈI(/,øy\8bWõg\97Ú#\8f0\17\12\8fÞè;º\7fàºpÇ9J¿}+\9bì\8eü«\17×>\97ñªWJ[\ 2T÷x©\85\9dcklµ\ eê\9em\1eº<Ñ\bôS©\16ô\16Ð\7f\11ç\þ\11ç[V\8a¼MÙ\84¯¸\0\8e
+YZº\1eç£\?Îû8óa?`6Fð\12OÛYØæ\ëñ\82\8cÍ=\ 2æÇ[\ 2\1aám@XßëjéÃW¨pª_ØñµsÞ»Wì\ÍG£\93\8aG\85'¬Ã|q¹\ 5ýA¾°K`¨¹Ë\97OM\7f4]4¶Û\vSßn·dV\v\ f¸²áçqé\978_4Ò\0Í}Êûþ\88\vS<\8e\v\87\15\94ò­Ç\85\7f×6.þ|bÈà\1e×_\93\e-\ 4ÊÅßk\8b³À\b«\93DM\ eÇ\ e\ f(\80fµ@°\18R\85}dá¥=\91\f\9b»%=íïèÂ\86ñ×ãXñ¡`²Ý\ 4æ5^KÈ»²\9a\9a÷pÔª§Q\ÅCsTi\895\8a°\e]¾Ð/q~¼J£+|\9ei\88Å\9funA@Ͳ\94!\1c\83\½öº |ía^íêm¨`íK\ 5\87\89£:S\87Áû2\14÷\8eÐÕwÞ¸µô7\83Ê~\9bö\0.Û²S|m\84°\9a[\9fûíÒº9C\9a«[GÄW\1d}5ñ´\bÌîñX\9aåÍÃ%/!äxíoÍ)hû\8aͼçÅ\1f¬É\17)Xe·\9aÿ%Î\9fÃ0.\fs\8f4D<\8cÁÙ\1e\88Á[\11þTA\17zX"\11\96\16\9d\14\ e\87\ 2K\v³\ eûn5wû~ñ&2\9bã¨/®/d[_Ý{Õ¥\17¶ó¾×\13 ËÒÜ@/÷[¬å\jÐ,9Þ\9aì8\85X ì1u\92¬ÝÉ8\9a\87[\ 2,Î/¨¼h\8d^Eã\ e\9dà\fH\ fËRv½Ñõ\ 3\ 3ü\92\1e\8f¹4ÔCå\1e\83\93ñó}¼ÔÃû\12ô\83+{®ùW¿69\1d5`zÜ/iêãOª\rx#\95£öêÁú\84g¼gã%1§%wÀttgD\95]{k\94³þ\8d]¼Ö®VåPx\99\95_\Ø^uÑ
+8Ô\98×v¬\1e*\8c§÷\9eù\8fF\80dqþÝvà¹Ë\96Áù \ 4äÕÕü\ 6ü!Ý\9bà3\ 6Ë­[\fF»è\9eOûzi1\97Zóé\1d5¿ç\1c\16^ÎÙÓóíz{ènïk\15Ð\0o\91ÐÕ%Ð\82»Îzu£ì   éM,¡.˦T\1a\e\8bY\81ò\8c\aNíõ\17Ò»é}        \8f4k7\82æIÅhÍó\8dã@]ÝÆÙÀÊlû\82o3víAJ\0Ë\85\8c¼Âߦ9¥ªÒ\89|ê¢ß_â\82WOC%©G\88,øó%8ëÃ{V7÷ÞØÐwãj_Û\1eÔª½î\92\8d£\87³¥\8f;d\9eÙú\ 2öÎp\9a\80÷\167\ 2¤\8d'òáõwó2ÓÒúd1O"c5§;ÖQeêóGÚ\98^\ 2J ø\15¥º\89z²Tâ§ÒU\1f\9e¤Yï\93\93:P.\9f\91\13\1fÛçWÔØCôCÖ\80ú¿'qáYO?xß|ßip½;ݸ\83\17ä
+GÃßç\11u[\9f\9c\94uW\99i˯io]p½xØ\95Õ\180åg¥¼èÊß®n®-BsT\9e\99\ f\eÈT\1d\ 3\90:Ûõ ,«®\1cZÉV>W£\8bt\83_o©3\80!\11eÐöô\r\9f&S\8c\84\18\1d~\ 5ûÍ\ 3\82S\90\93\8cì)\17  ¤I½\7fùùà?ûÃøu\83ÛÚî`Îzö®8ç³Ïfs±_Ê*ÜÒS\8f¨uT\17ª6\97v\95ê\9cMÅ.Ç\86!ïa\9d¨\1aÍù\8aBzêø\12Q3.¸N\94©¹\94ey®\19\92*I\9e¨s\93`j\8e&\ fÁ!§\80\0\ 6OGµ´\9bËA?³\1f6ÜýÃmÒ¦^Jý\9b\11s\e¾øþÃ\7f}ðÂ\eÝ\ 6¹aÎÚ\1e×\84¶F¦KÙ#\96\1d9;Ñ®Ú\eÓ\9cÕo\81±@7¡\96ðb>KÞ\8f\9cFE-õ\12D9\ 6kBVpf(Í\11L\10\8dfS\9dâGÀ\12(ë¹á\87ÚíÌm>åïd÷è\96'\15Ô!ØÃgá°S\9f\rÙ#tL2â\8cOúIo_¿d)Õl\9bÖKÓðaSÕãé¶\a6»íøhn\94[Có"k&»kéÆÙB\7fÈ\993\9dÓ\8dwI÷u 8¾Ï\19¦õ\9d\ 5ú£¨4\82YCz\8cÉ\9e
+ÔÔº>Ç\82{8HüÊr²..Ç¢òr·ä\ 3+VÕp|\91.ð¸uïõ\99»ÖY0w½tOáã\8cϸõ\9c§\1cÄWFøK\9c^\85?wzø:\1c>\rÝóù¹k®\91g4_.\ 3&ëâ:eÎãÌ[é;2ÌâWÑ\ 1³âÍÇùÊyv ?\1f¥©Ø ¤m°ª\88\rà®\90\w\18¿\9eªCÎg9~\12 ¸Ê\9eZ=g|­ööÌ\ 3Æ\1f£WE,¤up\88\f£æy>\8cZAv×÷0j7âQ_éG£>Û~\8d\f\v        ÿ\10±3/ºÁJp\b¨gÏÝ6\16üÂ\8bÁÓÜeÞ¨l\9d\r\95\e\83Ò\81\975\9d\8fÕ´»|\88.\81Òê­BI\17\98¬\86\9eÆûrYðúç\16Ï<õ\1eWfq\8a=\17\8aãñ5þJÌ#ü,F¯ëw;\8c\8e¹\e\9dø\95\84¦Ëó\16\9d?\ eE:\7f\9a\9c\9aD4\9d\7f½ée*\9dhPH'|òü%-&\9c¿æ\97Ë\14\15ö{\b¬¸ëÇ\8eX,½örîTZMÅìÎ\86\9c\9eC\10BÝw\e\93\99Øà\r\94¶RïA\§n\v\8a\84áê\fr{@®N¦\16Þae¡\82\8f»ð}ÈôrGa\18Ûnvz\ e\ 1Ýõè\82²=\r`!=ù&\97~\9d*Ï@\8e*«Í#5Ù­?\19\8fýp\07\83gÆã\97'\ 6³\97S\97\a¶>\7f¿;+3\87\98îXXh\96\92\865¬d·+¨{û\85+\8aå\8fdDx)bDT½é`\91\1cùmè?9~fæØË\ 5/\8dïËb\831°;:ÂC\97\1aRWcB\83SV\1e\14YÞ¡*´\12\90Ssû&ä%T!Zô\91!Z½ç\8e\90\r-kÙ\10²(\85Äy5{\92µP{üáîå\90KðõÍõæzZ9\1epI\16Ne3Ó\17\93µÕ÷Â*í­Ô\97°\ 2FN\97s\9a\17Öë¥Å\97+\v\7frò¥+ÛI{vÙ´ë×\12,\8clìR\19.»«6=º¦\87.{`GT\95íOÉ\ 6Ý7\886>òñùÜxbá;_Âú¸Kcýöa\8b\19\93É\e3H:ÌH\7f;!ïx×\9f<~¹rÄ5\eÂÛù`×[£;Åq·íIJ\14\97ÖõD\9fJj°¶Xi\110\98À\1cÕ\ ew\98l\86\93³Q\98±7»ã\8dÑ\ f°\1fÅîû1ô°Ý\97Þt]h0¹²UJ8\10]Rº\10\14Ñ\11\1a\13\1c\1d·ç?\99ÛA\7fÕ·×Ö½\ f\14óp\8fæ]ªGÓçM\8f®\93a/íÍ>{Ë\1eöè-ë\9dû\1fNó"\19lOAî\9fá\9c\9f\ 1\88EÚ¥\9ckp»%*j\ e\9e\89f+\8eMZ·16JE\9c±j½Éèk\9aÆp5pÖô\163O\ 3>'\87Ô4\1a'dËëÃD×j4ð\9eVêa¸Y\1dõ©yCê\r\17\ 3\17\1d«Ê\19Ù\85¯\1cÂ-\\fáäó\12áX!DÊ\8fNÖñ@ÊAí\8eL\92æ_\82<él×:¶÷Ü­Ý_\9a\8f¹dê´î©³³t\14$\I\18\9eϽ1æóÝ6\86\10×oÑ%\83'\ 6\ 2tϦrW,ò*¶¶ÄcÖÊÖ\1dÄ_ÓJ\88EJ5×O´R¹\9f\97ó­\1e4/\91hIªòHU%\16]1t\83Î\15+~;J|A;Ê\ 3p:mZz´ïiWª}ß4SÌòõ\ f~\8dèm<*4²Ë\9a-ÕóKÃ\8e\9b\8by9\19ÎäÞ\8aç\ 5\16\17hV\ 3Ôþp½\987ÉÙC\80ñ·¬µqì~¢°x\89\88\18U\10;7¶6½\rï\9ezðiÿBË· \87\8fJWîGHçæ4Fíçj\94MNj£\91»n\99\ëÝÂ+\9fv\v/ÔÌf,Ûצý\9d\\9bä\1c½4I¾ù\97\9f\91'·d\8b\9bÅ\eY8Ú¸wÐ\95îî"MGZ2\99Ì0x0Z>\8a(u6\1aY\e\1aÇÇ\1d\18ÝOt\b9ê»&"öË$Ò\80fÓ®2YëÝv\17ZwæF;íîFDØîO´´\87vðëͤ\9eàÍÁ\8c\10\1a«çÊi@ýú­îCßZ}ûíÌëì`y¬\17_Ú¹¶gÈl\9dÛÚ\1eC\8f\7fX\8eV{ßê\8c#O\1fvËæL©Qs1Oö\85ÉõD\8e\18À\9a\12\83:5ïâVmQí\95 \rØy°Å\s¹3òÍBw_i¬_E´Á¬§L\ 3f\ eÙ\80d\ 3\96Q·¾Ãµ ^v\83gí ÔòµimÖª\9eå\a]\95      Q¯Ü\96ßCE\9d\1eá\8aÊ\94\95JçfïÊOJ;\94\9f]éPÖ\8e\a»9ì§\17 æÄQÅ\92cdÍÁdäÊ\9cä.'\fÕ;Ð\ 3\11þ`8A_\9bhÐx\16;\1a[É5éÝ8ª\1d¬oTén\ 2 ô¹_áÒ'IûLÖÒ JÖ\ 1\9c\96\b}¼(&½Í¶\98\8cÐgqÙðÀâ î Å¼\13d«ÁÁk^\Á\fÚ\8ba\18ÄI\18ò\99\r\fÍì\vä\97\85\13´}\92Ç?\18ñÉ^Î+Û\9b\95Ï?Y}Æ9\16\98\81\938q¨vQ\81©UÛo¢\a66ê4\9bÑU½´ïïr\1fçÃb^j¼á\rZªÁð¦Ñ\86v2O@\Ë\1d\83\a÷.\83\87\0·Á©æ\ 5\85óû\1d\16ä-W,´f\ 5<\7f'}5?¯(§\(!¥\9cQT5à#t.À\a­]r=º\9c\9d\9e?Û_´âªéÈý}]ûÉê3_
+\9b\fÄÍ\90Æ\92'ÑCÎÍN½\15?p¸¾ï\1a¹Êýñ\8dKÄ]|Ã0\9c\7fB\15f\91\ 3ÅÍ ]¸¶Fh¡íòD^Ë\8bÙwHæ\16M\85\ 3ì®(\ 1D¸7\ 1âU÷S\9c\10 Þ½2@\82\ 5\1a >Aú\8bÈz\ 2Dì"\0\91Ô¶)×\18 K¯ï\1f\14d3]\be\9dUÆøNà\a'ÔÌ\ 6½pÒ^\91\88Ì\bí\16õ\90+µSn\9fv ÑoR,TÙ\ fxè<\9e\ 59,Eù\87êù×qY\ 2ì\99ð\7féÓe'åÚ\aÈnu\98Â
+){\1d \91îö?³dÇ\95\9f\94j¯9ÊV¾uÿ\939\r1\80$:\9b\94\93\91\9eÂöQ\e\7f$_¤«Ám\82\93QH#òëÔkåÛçf­\11\86¥\92}Éç \1d3\88Àz·ôÉ\85¬\1dþ\14Ó)\0ÿ_:Ðÿ+çû\13ô#-¿ÛfþÍõ"à2[Áá\9eÆK\95²)ÈtJâ¤Á^Þi°F\13 qUJy\9aÿdÕ\9fæ\ fÑ÷\89\1d£\ 4@\83\94Î>úê\85]ô-ÜvQ,\1f\8eQä:×(\1a<ã(¢\87\95\94\e\16ECl\92b«)\89\e¥-Ê]Êü\92²\ fS¾ß(b\90¬S\98nÅZÊ\1e\89¢q\85NqfQÄv6)ö-%I_:\81\81ÿ\7fH:L\1açdr\88\12\92ܧÁ6Ó8é·ÿ\93¹=ß\82(Vàg\14·\87ù(z\98i©Ëw?\8atl\9c²LKÕ\13;\8a\fÂO\99\9fS\8ei¨â'\8a"©]HaË)«v\14É \99"OÓèÊ^\8a\96¾/6ÊV\80ù$ÚéûI\96\8fä\93\ 41ðI\9e\85|\ 4\0åÂ_\12[;EÉUKCõ\85\19\93î×gÙ\8f¾Cø\10}ëô+\8a/N\1a¶_hEñ,;\80&K.\8a9Hûy7\1cë¥lÓ>.÷½G1ß\8dRÄBʪ\9còIÿHèb)ê(%V¢xºÜ}¼vðx3o?~íÆ\87ük'ß
+/\ e?ÿ\0þ!KÛeÛ(\89ìc\f4\16û\14m\97>\15ü4^:}Dj×t'\aQô]\15\8aÑw\84µ£oߦ¢/ôâ£/Lè)î*å{\8c¾ÅÞ3Eþ¦ì¡è[ÊÕ"J\0³\19]Q®Öê\7f\8625ü\80øF~í\vÀ*\9cîk\97§|B?\8f;Få\1es\18Ï=º»Vî\1erEà\7f\11\ 3#ÿ\10\ 3Æz\97boÓ§Òúß\9f\7f²ê0\9d\8f\92\9dV\8d\12îÔ\8b\12¤4\8a\92üHJ¯Ý®\19åâíê\ 3å¶û7;º\ß%èûzñ\îûªV\1a`(\1aýJØèó\9d§b\eijM\86Ü\ 3\11©ô\bí¨\87ë\12ôÞ×<ëeck\97ÑCM.\90Æ%g\1f¥¾ÿÀ¾»ñ/1p|\1câ\å±K9mÿ\ 5i\â\\95}ǹ|\90ÍBO\1a10Fð\ f³È\ fßåNÄ\87§ËUy^\1f\8fìô|vÐdõЬRp\7f%\8dë\1d£ÛáÍÞô¿7r<\ 1¯Ë½T¹Òó\13rY¿óô\ 5ÆÅùI8mw\87Yh=\ 2\1d2>û÷dôÞc\87Æk\17O¡p\17ÓÉó\ f?yènz çæÐ>ιy?ÎÝÛéÓ¯xKÙGq.ÈC\9fq|ª¾ê3¦ùT·ÍÞýS\0¨\9b³\8b'WïTP.\e?Ö/Å
+¼<W\1a°\7f\9aÎʧ£¬Ã÷ÃíSû\1cºD7Ë\v\ 4ú\92*ï?\ 5\15Ù\9b\17x²£\96\9aç\83ãõu[ä\97¯\rw\12Âõ±\89>×Ó[í±\9eîàûº>\89o¿¤!fËU\7fÛû8_,m⼬\9câüæò\8cóæçó\ e\9alÖñx>J~|'x*\7f\1dq\95òy\7f\ 5;GÅÜb\a\ e\83>fp{ËYÍvIîhí\ 6£ûÚ_Ù\97½\ f\ 1áuË\8erïm   B
+\e~ÂÖ×ÇÃ\96X7úSÃ{\0^°|\81\87Ð\8dJÓìVy×
+\86w\97\10z7'©Õ/\7fH£ì\1fâ<\8eøi\80\83m\¨íÏq¡\97{~&®õx¢\ 4}¸å\8frp®\81õÛA[|â½½:\15wô$hú0h÷¶åÒrø3\83\98^rkil+««»\¬:yßó\1eëWà!ñëº\\f È\8dÖ(ì\92ð¬ë${D´×\vwcùNø°Ê¹ÕÝ\fVÆÕ\14FâŬA£sÆé\974ÄAð3%~Ó_Ç\ 5ÔÚ¿Îâuu\aNãùu\þª·\ 2×Z\1cÕbÛØ;\1c´õ7~õ±­Ô¡d-óÏâJenM¯\97ózK³¿¡]\87ô8\17Ð=Å¡?»\85½iï<\eÖn\81µ«ÿܽj\95\95.`
+\8fimqFcÚ¸±¶ct\ eÐE×kÑU{Ëþ9ã¤\99-ûð\87ôCf÷q¡ ú\9fò}°»­òº~>N/ò!\94"îÐS×Ü>GÒÙ\1c¨-_b\9cµ\823\a/\Óá\92ÈÕ\ 1\97\8a*e\aÔ>M»(ßû\16·¿Óæ±úá\17\17ø¢,ZÔea¨«ÏZ\7fƹ£Þ£Z/Í\\89°\8639lNq\9e®z¯ÎA\ 5±Îy¶\89ËY\e\1efc\a\b2ö¿Äù·\98MeÜ\1f\1eæ§ã\ª\95úüÐ7Kü>?bFþö\11ÓÛjë0YÍoÞ|i7\ e\e7?õζßv>\16\7fV
+fcЯ,ÚX#«:\8d¹ÚÀtC\84\86ÚçZ\154¢Ü\98Ï\a`ÉRW,â«àrp\9b±\85\ 5 ìÙ|K©\ 4\17Y\16{\9c/×?æIºXòAºlõ {´ûCzXÎw\11üÞfïæ¶\9a¿ÓæJÉUöùp=Ù
+Â{°¾ºC|\85ÄuÚM¢\8aè0Ó\9ec\ 5\8fîÞl¶À»ñ8\86_ýå\9f Í\1eÚõyb-ºó¼&\11*$3£\19»\9f\88J\90\17\ 4K\9eÜ ì¬\18IY=>â\ 3ƪ"ÂCÜÔxm½ißÌ\1d\19»\f?cûK\ WAØ\9d,W\97\0ÖÍ\80ÄÛ¢_\9eMصZt(Ï\84\12蹸\ 3k«,\99bÕîG}¡bÇ\8d\81\86«³ætÄ÷Ü\ 3I@e\96åâlb\ 2\r\ 3=ùt¼\91ÒÕ?°R\a8Ë"
+>­é\82\ 4\1e6\1f|bMA~9¡i\9e®´\1d>\1fZAÆ>#krdÛmÆæ\97¸°\fO\8f\8f>[\9d\e!µØm*Ñt#\ f\9b\93\9f\1c°G\1døÑGÍó½=\t\99\81¢\9b!»Ô¨Ùà n.¥ûlç¾"e\8am
+²Ü5³V§¤6¦-Q/\ fûS\13Ä\87BLP\82\0 \94ÆÓfzÜ3só2ñ_ßÜdbn°I\99õMöPnì3üIyÒßfl2Ö¿Ä P¹Þ\a\1d^É1Ërø\ÿ4]w\95Âxé6)Ê\19\7f\fÔª§\9dñEwu%u\8b\82D-çC\96Ê\16\1e\9bYÅõÏò\ 5Ó^\92\1a\ e\ 1Q¿vá©y¨Ô\ 5g\9bCxÏ\rI¾ðúN8øö\99MÊǯÃN\9b½,g3>sj<n¾Z]æfv´\94\93?n¾_Û\8cMÆ:cõ˧\82\e$ÀËÀ©¹óm\9d\\bÞÇ}\8eÝ\11Õ¢¬c0@\16H\8e©êD\87éÍW\97ÅO>\8d]\ 6ºrü.<YY\b\81\84t±ûôs\85#á»\f\vü
+wK<ènÛ\qáâ\93\8aj\8cغhHãÖÄ2\19Õ»ìG!Ôú\8cz\93}sÔã\9eê¨Çk~Æf¤ï\97ë\8c\90m½_Â;\96÷/\81ts÷\85û`¶¾O\ 5\9evc§$\82\94Ù6K]\9d\98\ 1¥ùè\ 2#j) \19Ej\91\8aÜ~Ñ\8eøR;»)qy_\84Ár\17ò\10®&\     a³6ô¤Ú$jl£Òî\8eÛP\83b\902"\8c\8caúÏ"Ä-ý]^BÚ\1d\8a5z\0©2=\80Ñ´:f\98\14\8côèïbò\97gh¿üs\932\1d\7f÷ª*«ð3É\964r×Ø\86µNÛïÀXp×Î|-\9cK3a`6\95&v£¤gµ \8a\8b\elN\81úmͯ\ 3ïÀMÆÓûD\18P\11+aHa<ëV+\8cÖÈ·G\8bR\84\ fíBĦµG^¥ó(²\1a\98å¡©mR-Q¬×\9aR~®°¦¶a!ý]·æ\rF*\9aÂ5\97¿<¬Càÿ\f?mE(Q<»\84M\9d       §³æìq\19èä*èÎ\ 4w\bɳ¸W\93Ð\90ëOcßÉ\ e\ 1Á\9bzs~\Ò]®¼\19ûìyÐ:\8foX1d´ç=\19-.>4´\ 3»F/7\vt°Þ/G\ 38\7f\92©R\1c¹¤0 .Äi}\85\88Ó\16\14\88\93µY\92ÕÏ{EV/·%)Ôã\14ðéd\13.³í\ f·51Ùü\f?mÚ\9d«²¤ÑÚÔ®­äÉ¢WÛÓóqgÒ\96\ e\89øðX\9cæÚ\9f\ e¿\ 5+4·o\ fåÉôÜ3Ù\16_\1aã{\18\97Ûð\vn£!\90üܺH\17Þ³Ê\0¾\v\1dª|\12(²v[L\89æqmâj³tÄ;7¿\80=ù=\8b=é©\83w\96\e\ fïh\8e\8bÏ\ 2ÏùÃ%x×Ö»ñ}®¯\16õ¥âÂ2,Z­¾\9ae9tç«\ffÇ:Ú\16ñÃ\ 5\14À\80Èq<>ªMÄù\96`\95\8f\11ê®2ýþÅ\19&ÀÖ\1fæ>Æ\89\ 6\1fâsP<\8f¾TåNÃdýD6\89Ö\8eÄñî\8a\99`=_ÓûV9Ú÷ñÕ,[t®÷e¬Qï\8b\ f­>.ë^\1f\1fËnß4Uç\ fǧ¡º[q1Ð= ­ÍìÃ\1d\96\17½g\8f\9bo\17\b%ß÷qKX]¶Ð¤áìã±Ö¿\16\99\ 5\auFÑq\94\86K\9b\17éµÎê\ 3ßb\97\11;òdö¯ÄuÞxã\ f    \ 6°\97Z®ô#±\8cô      \1f\eõ\ 6\aIE×õÇ\16\1d]\95\18\85T\8b\ 1e¢Puì¢P\9erÐÑ\80KA\86ö\ fi1?Û\9f\91²µFUuw\8c
+ªÕ
+cEw/EnvêD¤\18\16\17,\r\98ÁìQ4¤/¥\84\1e\97èÊ`',û\83ò;\1aSµ$/\93­\ 2d\12*\ e­p}\90\ f0s\94Üú\ eùÊ\1a·}`\ 5ý\82\r·PØC\aÈä#ÉÝ\ 3ñX¥§\ eûêÖV\16Ù97{Fç\14\ f\9dÎé\86Û\9dÓ®kýágøÉsê\89a\1fÇ\13Í\88:º4÷ùãD~|üìÆ\7fa\93\93[¬Ú\1aÀCï0øRõ\ 5ó æ]9GtÃ[\1d7\98&\8e}v\f\8b\11\95\99ÒwEÛìç®þº\a\a\94í\9d\9e\bß\ e\92îQ\aª\9d\8bÕÄ:­DâÛsúå´\11pþl\85¾ÛÏ&Ã\86ÜpÞ2rS§¥\1f)«¥¯z\7fY?bÞrÇÁiaÎOå¹\9eÿ\f¥\99t\13\11$\92«\93Ý\16\83\9f\1aÅ\ 1O\94¾¸\11\96\1fýür÷êAç{\ eõ\95n6\9d\a-%2\86\ 4Ë3\8b\bÓÚ¬{º V·Ù¦7\9d\99&\9cÚ\8f·ýn£ø\rjat¡Ý´7̨  \14Ozc\19ðç\ 6=UZ\rº?T\1ay\7fjÖ×\9d®Q_\97ë\7fI\8bñ¨\11\8d±m\1adÚRT\ fÈw*}Òc\86ß\ f
+øØØæÚ´ß\89JÄã\14\ 3\ 6Âî\99\aOm}\16>[ï\10LZæ\8a¯¶ðÑ\16m~\9bÅQÓ¹Qb\93r\9cE3G=×\8dá\1aÎÒvõ-LFõñíP­í\91\ eY«,l¥zÄû»ê4ííV§\a\¬Ö{\9cQ9_zzå¼m¥X\15í\17gÿ,¹\8b\85Ô14Ø\9aÎä°¢ðÂÖÔ\86ÿäË\19FÉV¸$gɬ\88\ 1G-A¦¦ùl}fÛS\ 3LJAõÔ\8c®ÕÆ<ÿª6\ ª\\aA³2«\95ðJû<bË\ f\965¶â\95ÑÒô\z=s¹ÒBW;%¬_ã\8a1tõ\8aö.È\15íù7«l\8a6M\19Eâ]×\8bÄ&§ýÁÔø\99õ3g_¹7Ci:\12^ì¤\1dÅÔpS\r\11òvIêX\8ez\83Hýý\8eZ\11\¼×}\828V\9bM\7fWÂü\8e\ f\ f{pöí
+Ðæ\82Þ¡±"ÄÐØz\97¡"Ùé\82ûòb\bî+y\19äBq   r¯Ü\15¬¬]\18¬lÆdáh¡\8b\82HBÏB£Â\ f\vbµe\15\8eHF\1e\d\98¿è\1e\ 5gólf\17\14WÅ,\vÿ\932\1f\rK\14\8cQ§¿rÑr÷Zo\ 1-\12Æ_õr\9b¿T:» (:vg\vmÑ÷\ 6¬¶ÞAþ\8a¼/ùö\ 6\1eãN\92ÓZj\19x¹»\ e°\10j4\80¡Z6X\f`ÃÆ*eÿ\ 40q^\ 3°\ 57\ 10\13[\ 3Øv\92ÖgþE\ 5°\e·ý_¨Ç¶©\8b\90~òå#oë\f¨vÎíõ×ÅY=\e2\ 5\9bË\98Ë*\9bZí1¿\97{jt\86W3á\0\ 6`y_hÜo;à\r\8f7éÿæ\9dRÞi\10\ 3`ßq\ 1À\8b\87:\80\13\18\ eàÊU\0p_t\0üV¿\ 1x|/\ 2ø×\19\0Diá\0Dg\1e\ 1\ 4µÏî÷\ 4\b\ 1Þ§Há\1f¤¨\eÎøÚ8\12\98\ý<¤\14çK`ùwÒívt¯Ô,Ä.P\95\93Ë»Dðí\aä\93ö\ 5¬\81ä)§½v{\0\8bÕ\1d@ÔÈ\a@\14ÐûO15é\93²É\ 1\ 4ú\86\ 1¢W®\ 2ÄTë\ 1Ä
+\1a\ 3DèêÿÎ\92EAà?³z\17J¶ìí)[¼¡ôï´Xb\92¾\84¸¾\7fá\ f`CdÜ\3\9bsK][Ý\ 1FëD¿Û­\14ê\8dí\18\84+\8fr%)ÒUâ\ 5\1e\0ÿ\9e¿)Ì\15À±Ý\ 1À\17ñ9}¯³×ÿ\8f\84/
\bµ\94Eë?¹^düÏÔÞ­\96-Ø»ûϬÞßxùc\1a/\ 2ý»Z\ 3®Ë¿D_ú°JñÜè[Sí(ÞPf\14}ÁE\14\15E\ 3j\9fr~G\11\8d\17\7f2·ô\ e\89¢am\98"\89)×ô¥£ê*e\14¤\18×\94Kúz\ 6\ 2Rúp\8aRO¹ô¢hÜ\e§¼Óÿ\97\17³§×ÿJéþ\14ó?2½ßå3\ruyHC\15L+ú\16Æ\8b(\1e×\8d4Ô­\96FÙÚ¤x\8f4Äz!Eo¦Ñ\ 1d
+Í¥¬çYZÚI£C¶)âé§\98Ñ*}ý(\8cÒ\0\eé\1f1l%eÕ\89ìbn\10\11{yöYVo«Ïàܹ|òòäý^·È×\1f~~ñK\94\94áu\94\94Þi\9c\8fÝ?sniN\8fâsWKãÅÓ\9d\TwQänni¼ñ7\r\95«¦\9cÓ\1d4ì0)3é?ûµä¥\föÿÙ¯ÇWdCá÷\93L¢Âgp\84*ïѵÚyù\9d\9f\85Í^%=Ô \8foB>Ò/aÕ\9e\9e\9f'rxúåçg¿Dɬ¹J)8QB\9c\17Ñ7\90çÿ\ 4û­9Ë\7fÓçV3\8cbV.DqûÜøÉC\97kX\14\ 3Â8%\90£8W2#{Õ_E\0Dì>ôdpz¯\ f\83Û\e®\8f\89Â~Ãà!\81a­¶¨=\9b­ ÿ\98i\ 3ùþ,l\97·7þ=ÞÌvîtþß\1fÎ?dé\87ÿ{òC\94\;Ë\94\82\19%Û§\1e%ée2\rúm§»»¶\8d¾\1ez\8a¾Cé\1d}ëg(úBÍV\ 4<kýOáÓ¤ßpÒá^\1cM*áaÃ\18a½(¸O\99\97²\95È\9f­ê"x¨\92}yt\9b§×]WßÀí\93¯\95oæ:m;R\$]@¬á\9cö\15d\7f\12ÿXß^·\87\vëo\ fJÉÞü!½\92\93nJÇ\8a\81FA\8f\ 1\bÐ\7fòÐP'ÝÉi\8b/Jìå5JÈGô\81JjîÅ\8f\87Åçeݪ?î»\1ez\ f\8f8uû\ññ\8dè\f§WWçÔkî#\9b\97\95åx\170ñü3KïN§ý9~\1d\8f\8f\1cplÐãFðhݲÊf¿(Ô\8c\9dÝ"7þ\12\ 1<?o\1c\96Ûußsÿ\171`LRV¤\99>\82Õ\18\b\ 5;Å^¥?ów\11í¯Ï/a\1e\9f\1f\8f#w»E\87îçºT\90¬ãqaÐvå\.¶ÛÇÓ©Ú?\o¥Að\b¡q ­\biÿ\86\ 6ó=6a­\9d}\10W;Rß\9füå'\fý\ 2Ù\ 6·ÌáNlÊvK^×<n¹jn뮧\16?¶×Ù_~ÉÎ\9b\9fí\ fq.·Xƹ
+cĹ.9\8fsêÒNy¬£áj½       e\9e³î8¸²/\9bq\7fu\9a6¡Ã¡[\7f=öï$úî\9cÍ\eÞåJ\85º\ f¢0²\1d\9b5b³ûv\98Me\80e\13\95×Ǽ ®ëÌÌZÉ;{½jq\8f³§\9e\1a±×]\ 4M÷3@8ç+\19\96\93SYÇ\1e\86\ 6\8d\92i\83b~ñ\878GÙN\1a\98¤Ç¹8°ÞU"V\1fýÑ*ûlîDyÄÞ¨m\9e=\1d+\1d60Ðx¶sµÂÒ\87\8a\85\7f\95\9fkÑ)|W×\\1dò\1eP¥ê!d¥½4¼\16æF`oèZ[\8ew\92\92ª:\ 3Á±\9d|í¹³GJíam\1f*l\95\86tvÿÍâTZh\8b\86\86r\9e\98\19\v£-\93Æ\1fâÜnmý\e¥ÝÔoKÛ\9d\9c\83ïupì\94ß½Ãü2íî\89M\17ßúLe²>\1d{úªCâëå\eij´\9d\e%½§\v\14z_\87\1e\ f \9b\19 \15Ë_\13\1d\88\84\198âȬå\8céB\1a­4ãêß=cƵÎúãh\0:Ú¤p\rënäyz°Ys\0Ú-2\fué;Ú/YÎ&ÛþD\19çÇÐò\81ÍÇÊ¥ü\19M\82w\bc;Oëµü\r¼¯o\ e\90ØY© ?X\9aô\r©ÖÊv
+/wkí\1cãd\1e\få¹8ÛâwÑ|J ¡ö´\9aþT´\8e\8e>ìl­!ͬ-\99y,\9f¤9yO,ÕCÛ;\95~»ïÙ\86\18´\95\1d\95ò¥»\90\ fJEÏÐäi;7ÏP\7f\89óXâ¾\9a\0¬ß
+qQ>\18°=Ü\8dJ\9bþæÈ\1d³ªsÝ\9aUK\9en\9ej®óºö\1dp\9e\9fX<\fÍÍú\11r\8d;ûòõPx]ôÞæõÒp÷\94ÌÝü\r\9eç°[]\ 5©\e2\e\eOJÙÅ\ 5N©tkiù\ 6íIçhy\95d\87.\89÷*\92e9Ä®d\19Ó°©h\19jÆì\ fqÞl¯\9ez!6ÎÇÞJÜ»+\9aÞVåqo5\8fæ\8deT8Ánn\8d\15íR\ ek\9b¢-ÐÆ£.\89ºñ\90\fÍ:KY¢kîÞ\85@]\9dèÛl»Cß³R®\v(U¨U\94E²Û\94.\1e\85\89w\v\1f\89Ýd*M\rÔ±\84\8f\19\1f\ 4\8b0óü÷0\eò®XÒøA#¯fÌ2\94\fù\97\9f¡\887»½;sS;Î\ 5\84÷}\12\1e¬g\83\8c\9e£\86³\1eL@+(\9fó\8b+±«\1aÈû\8diQPææK¹¬ª\fR°g\93F¼Q\84òí(Kàî.ÍÒ«ªø W\ 5\111W\95iß]e+À\bÖëHñîíÈñy\ 4Ô¹Ñbès\10\16Ç\13Ö½\11\93\920SRl5ãç\91<a\97\97×)\92ìÛp=ÕÒ\83õ1ÙÖjgÊ{÷¿¨K_Ú\r+\88kYÕ¹¸n\99X\7f½\87E\8d\9c«È¼Àl\98Ù®²\91\14áê\18²tÐ\97R\87\1dú¢¶\1c\8b\r\9eVÊnëË'¯6ÌçoÕ:Çt  lâ\8bì\98\r\19[=\1c½ñI\1c\87ãF<î\8f\eßZv÷jºÅ\94\f9C\1aK8ó_\847\92±/{µ;ßÓ\15\7f²¾µLréL.¨\ 3'PÃl>ã\82þFÞ¡\ 6Ìs :nÖ[³J\8e¢ä³Oñ\92:쪢Îv³,ÇÔ¤+\eÁÁ¾\ 1ïuï7¾ ^Þ\1c<;å'å©_f\85íµ;\96\82\88fn`Ub:,ï\8e´ ¼\8dÐé§;BÅÝ4å-gH#íT\103¦¿<\9f\1e\96\15snôÂ\99ï_'ãÕÓÕ)×{\1e{Öôtª\ezZ+kÀÍyªEÈ\0\94#p¬Éò%}Ç]íËL?øG\12¾ÈÝà½\9bëp\9bÐò¹bÃ8O*eñÉÖÁÑw,³R\91Qi)[\94aô4\17Äðí\ 6Â\10{çM:6\8d\10V\8bvH\8eKñ¤\f\91\8eÓëZÆô\97\87y©ÙG$\98ËÛC\87\1c\89£\1c\16t{f붨i_a\f¨Å\11\9eu<\94º^\8f¤»2(\8a\ 6­t§\96¼\1d
+\83ªÁóàMQ¹â\91µ&\15\9fX±õ\ 3\12\8c\15°}cÔ¤ú\19éo¸0üà\9d:ýEÐ>MIÂdàÝ\ 2c\0\81Ú¼ûujó©°\ 3°'gçÍ\0¬sÓÁpªþ ür§îo+°eDü\19\85øIíÛ¼bõ\8dWN¨ÍGx-Qê\8fÏUBZûp\1aU_y!Á\91\16¿Î÷     Î\87\aì\84?"\12\8d,Ë1V¼¼ÃÌ7\89?2Üëiøy]\9fô÷\16$t.¼\95\a£&\80Pl¥<"÷âD%ùF²'+·¤BVîá\98¬\ 4õ)É\97zS\92KZ<¹'ðÿâº]{æ¾@%Y\1eúg\14â\9fì¾\98\18\98NøµÊ,¨<¿\12\97)q\1a\ù5ÇÆ\9co¬+\93À~ôØ\93\17\rÇ×m2e\1eË\87:zm®Ö0r×+:Y,ötÞÑn\83\88)öjÂ$ÿÜdckÄ©þ¦\89Æ\fUpå¹Þâmc       ámiNãÊú;Í\10ðË;Çgp¿\ª*·ð¹\86ÿÏ(\84Ã\86]ÚìÔxl¾Ö\9ee¥       m¾Brê\9f\1cd_I1\11¶Ñ\8b=w0h|\eÎÚÌ\93µÉÑ[°Ùa,Ûò\10àg:]`\18{Àì\ 4\9f\9a¬è\13)ØXHHÞ0\8f_?r\ 3{$\e\12CÑxÚ_X\13¯\8f\91$Ð_¨ì ¿àöBÿµ»g-\9bþË9r\18\12\87ÿÅ\11m_æ\9bKY\13\96îëÌÚµF}h,¾í¾Z\1e;%I{Nc\9e¹5ÎìÙ\9aíÇÝÚìÎôðu2Âùweè¼;=ÚûbÃÁ6\8fñ\83"\86e_OEU¨Î\82¬÷ËKB\9e\95÷¸ª×î\98®\94¿ý÷cXíÅçi¿GµÎ|\ fx0.êéÙ*S"A¡Þh% ^ßâz\80è¦\8c\fö\97\0\90ùÙ\1a\ 1\19Á\85nNÖ\802o³:£yÆ«§È\83ii\1a\7f\86ßÉ!\84\8f\fûÃAîy GX9\1clwShPªlZ\14/ÞpR\9c=\19âò\8c§øýó\9eãHûmc}ô¹é[r|î¥-°\ fº\92\8b\10
+ÞÇÙ­ò\b\8bìØîÞìX]\9eÈ¿º|\19êwy@áºûÎ<¥,Nº{\80\1dÿâsë\92â\11AS°Óó\90_ôtp</N\96¨\14bxI\0µb̶¡ü\8d^çÒ\1aT(Së,\9fÖøL/Ä\8cÝÅø#ø\16qM\1fv±×G¦0\8cÐÙ¾½ôäÞrãè½ü×sQfpØ#\13æöè\ 6.\98ï\9cÖ½f§ ;Ãöuß1Ú3>¹·gÃF¿Ý¾\88\93\1a°í¶ÒÏò\ 2meK\8c\7fù\19\85p7\85\8edµDoª\ fZ{fÖ¨\vè4É\15K\93\13|\89G\91\16Ü\ 6åÆa\8f?Ùܪï0[¿\9fö\89®½!ÒúöÀü¼\8c\97.Zl\81\14²»w³&\aRA¨´*[p\8bÎ9Ö×í{Î9·»ý[ÜÒ\9dVµùÉéd\13g
+Jã\v\96u\92ï4â@\994\1c´Ï4\9cZ;¥P\1dýâÙ\8a¦Ø\87oM1>Ï¡0g_ólR\9f\8c<P\94÷\95Ki¬­Ü/½i-îd«¼9ôÝüe\8dìÅ\92ݹ\1c ¿Óîõ¯íûg\1e·çÛW©\8dL\1aíÖ«Ì\12-ã¹\9d4£ÞEiZQÑj$$î7\ 6\9eþ¬¯Á\ f\\87&Ãla³\9a_~\8b5ö¸ÞÕØuÔª\95Zì¸Vüö\99ê~^\1aV÷|þ¿øIí\9bs1mO®       \90\9f\80\99\13\994ßVy\94+ó       U_\vOÌRä#Êî¶ÛNûñÈ\86\89\9aä\05ëë\18M;\1f\8etªÃÜõSÛUË`mò\9a4jåŲ_=`¯QuZìËÕÚÞr*g!w¬4ÏãoùfåÚåN\92¶GÒ\8bäªô4´jéÉ LI»å\87\8fRìG\96\17øÙþ`7\8a\13]O<UV\ fù\v/\99ÊcÈW\8c]\8f±x±:à-2\87/ºä«\a׸Kg\16\89~\93*Ún\8d\9b=\8dò\9dà\8câÇì9E\vç¶Ek|»\15\89R9\86¿\8f\98    ìj»\ e<\18\96\ap\1e\14Ä\94Ä\85V×ù\r\1a©\8d"4ú\7fè:ÏEE\95m\v?K)æ\ 4"9\89$     \82\8a\8a\19sF\ 5õý/¸ºwïÓçÜ?\9f°\12\93¢\16Ì\1a5\985I  \99Uz<̬2P.\9bÍ\9c\85l&|´²bæö7¾nøîºÐ0­¾KÊíü&~¤ºa5©\0#(\¹Ìô!4CH(ôD/\8fÔ\11æü¬_)]Ðq±;껹\8f\95r²Ùû¦\aí²÷    TQÂeúXª\1eÒæ^zÄØgÒð\0AR\17ÊáRN\1e²RèÆ\9c\81 ]¸\83~e\9bÌ\11\0üdÈ\0\8fú\e\80_\8e\bÀ¯ñ\13\1cß´Z ÷Vþ\85Þ²:t:ÎxÒÖ3Ï©(÷Ð\19Ý̵Fu¦ßë\15     iÕú ]\8c»Áé\8c¸+\e/sQxø\97qN\18~\17Eͨ©k/}<Ç\83 ~(\ f\ 112&\80ð÷k@\9c\91+ ³\13\0H8_\ 6dkÆ\0ÒBu@\ eÏS@úî\1d\90\ 6È\v¡\ 1òZY\ 1\8aw\83\8e\1dc?ú\83äl\92OÛZf,#],«
+\9a\83ø¦\94\ eqæÎD5B\16\8fY\14ë\8eÃZ«:9\97ίÅ:ÿ²¡yV\92ô1´Ç\1a^ªk\9f\86\80\9cÍc\ 4×1 R\8d5 Jú\11PÜî\ e\9aúêÐ\93a\ 5
+\rèÂJ\a4+O\ 1­\96\82\18§2 »k\ 5ÐÓ\85\ fè\99\a\ 1z\912\ 1=X®\0½\ 4Ç?0&+þ\97^\ eÝh\9amD$J¬0ª\\7f\89:X]W¯A©\91û\1cò)\85Zg6ËÀOw\1eê\1cPÅ÷\ 4P\ e±\0ÔE_ýh¾4<Û\ 2Z\ 2\17@[l\14\1fa\98\ 6t\bÊ\80©¶        À\18Y\ 50ûÍ\b°ië\fØ
+\9d¸d+ͯ¤ú/Wï\89\0,\ 3Æ1\16·?PÍî@þJæìõ>'Éì{\8a ¸¯æªë=ý*º4\7fË\89\9e\94C|\9fÂÍþê'°\9f\98\ 6¯Dè\ 2ô\13¾|EiÀà­àGýe¦Ó\10° \92ø{Íêokï·\92\83¦ÿ.Øûuõ6\8bq¼h+\8e³0û\1dì\b\ 1,­¶ÿà+Û=\9b\83_"¤ùîDѸÓ\8e"Î0bìÝ(â\e~\8ce\10E\ 2\92ȼCäÿ\91OëË\18Ú>Æä\1aã\1aFQ«\90\8aÁ\17~¬½£ø7¥Tü\9b\92eüvõN¯?\1a®WH
+1ü³õ¿ð®Hnô\86\1aNôZ¼Íè\95\eiq\88¤\1ccdÇ!æ¿un#¾\7f\8e£Ì\80\18z%1 \93ÿ!\9f\1eâS\12³Ó\18LâBî\1ccøñÉ\89á+òr\ 5(bÖd)ü¨\9dF8-]\9b\94Üç\ 2Þ­\9eâµx}f»ÅÄ  ùXaàöÿ"z÷\9c8T\81¶ãx3FÜ®s%\8e2Ëÿn×Ð\8bã\94v1.áWA\8f1Cãè î§]½LÏþ:\88å\81\eò[o\1c¦Û«ÅsQ9o\9eâ1:>VÈçö\90oµ×}\8bS\99»öô\90àÀ\94¥ N\82ûAmúöo6\14nnõåiýÿ"zß\86ý¯\ e\12Å?£E¯Ã¼\15Çë«qûî­(r®ÿt\81¯\82^JÇ°ªáGr°ç¢¬Ò\8f\15¬6ïÛFS¾kwË\b\ e¤ã\ 4F4\1eÜÎìlr³Ány½5/ÉÜÚ\15ó_×ËC¡Á\85ÜÍà³WC¥3s\1etOSt::¥ûíÁÿ\8bèS\1f:ѧ \9aq°y%zc{1zã\99vÜ}\91¸G\f¥qô¢Ç\9bo\17x\a·pÚ\9a\85ÏVÊMÝ·\8a\9c\vÌ*_¹Õouä\8a=køå±\14¹\v\95\97[gOÓ´3[v;§é`î\9eÒ¯ÍäØ⮫\83bf.ûíENï\8e©7¹½PR{\8b^úΦϩɵÙ\10%Éþ\85\14×ù\83è3Úu£OÇ1âxK­èýAâxo\9c\11G®wã û^ØÔ¸ù£\ 4Âu`1\9bã5\18ºÁeÈwßçq«\9795\evé(\91f2½zX{=|¿\9b\99ô¾\9a±\85\9d%\ f\94íå¶0·Nïán\820;Û\10\f¹_\87\853XM2\1aé7o\13e)C#}±\91äöBË3Ú¿PÚÔÕ/¢Ox\89\9bôd%\ 5\8fO\8bñ\8e£Åá\8f­èÃ\fíg!µ±nWëa^F9»{\9ag©ÑaCT\16»\93öÚn¯ÃÜusßT¢\rYn¤×£A³¸z¿TxÅ«\ e¾J\97\96\9c\17yéÇýiYà\8aÉ p±-\99þ¢l\9c\83yml#Ó\9b±\15¦X\14µ'\ 3v¥N(à)ãhfË\7fá\ 5\9aÏÎ\v\10c5ÞZjá²\1ew7sO2w8[ã¯î\e%O¢Îáû\9aùNf
+7\ fãÞ^³Åw\7f%\90Õ¹\9f+V·K¥Ï]\17í\11ý\9c\1f\vZjnnÝÂìR\99Ôf¨åcÓ\80~sS|\9a\97'O\81³'ÔÒ\19\8fÇÈë8\ 6½qÁ\83ü";ÊmQe¨V\804,\1e\82$\87\1eìÌ\9dø\17^`ö4^ \7fÑ\9f%\9cP®ôöF\9düÒ\v>ìvHq\7f¸jÐ\16W\v\85Õ\fÍbËu§Ð\T+us\8eÐü`Öдù\940µídxé\9cÇonò\8c\ f3ææ«\947Ïns^sõ©\8düR\16\1få\8d\1a7ÜÔdmX²G½\81\1e\84ËAÕ\9d}\dMàýÆÞ\92{.Ù\94zDD´º¡\9d\17þÂ+\95ªt^©\ 6åÜH²\9b\bħB·Mî0\1f)¯?0\96Z§ôÑËÏ\v8\98\9f4ª2½¯\ 5j2\9aÇW\84·\a\1dOì{Ã\91\1f®æÃÍg±\19\96\85íi`,\ f÷AM\ 6Àíls¹þ­\ 2×úÝ¥@ö\1ey³Ù#µE¢@uGÏì¤Ë\fç\81ÃOEÄ^T®-;kÍÅÎ
+q\9b     \84\8e¼\91¹?x¥8¡{?-¹öy¡×\9b»^pÁÖ\90¹)-w\99[jQ;DÁ¬»\1f\84\13\ f\9då¼Eg\9dÈv#E\bøa»\93k\ f`\1c8®=,zýÞ$·è=ÓÅm\8f¢\8aç®7®<º E¤\9cé\-8éÈBì\16;c:«Y v\8aYص¶«ÕÞ<Ü{e\13¦Ò\9cq~e\ 5Ãö">ARµ7ùdÿà\95Z{\83ÛC+µ\8f\95ÉYØ\80\8f\8a.õ¹\\9c\ 5Où3y\19Êe<Ýån#eó|\ f+ËFŽt\9bd¿ßÒ¥ÞPµ\8cîØ°zÎL\91F\ e´S\17¶TÕ\13Ûug-ëçNqë<-½2\81Ì£äÇ\11mî¸áTJ¢\1eX\92­÷\91תýì\1dsm:£ÐÚË·ym,+ì?`´1#Ð_<ËõÀ¾\82Ú½½#8\9cñ7R)Q9æ]¶\\98¼'õ\8f'Írçán¢\1f\ 6\b¬?úýý$×£½\13ÚMéwÎÉtBÅÎ÷B«£\1eþ¥_¯\9eyÂBßDÌûÎp.qê\7f/§^:aÖòmÚÁ\10\97Y-U\9b'\9a\8d:»4¦j\ 6Ë\ 3ÅO_\bEZB\\ 26\ 1\93\80V¤Á\8búâQëíìsnÖU7\93Z\9c¥Õ\1aWd\1aáQÁó£ÃkX}Ï\8e®\13ÝýÞ¨z¿tãñi\9câgÄ$U·\v\ 5\83´öG­i\9e®\9afÖ±\8em`°èê®#OÚá^^iï³xÔø¢|Wçz/­fN«\8a"\17\1e\94¼Ñëª\:\8dFÒÞv"Éà$Lª¥Æl\ 2FªÞûT\82Ä\9côýüâ\8eBkç¨w\18e\9dù¬©ùMô\91ÉÔº\15Gå]/r±\81tèÅÃ\90\853ßv\ evA\1a\85\9dòäS4Ï­OݸiYF\7f\98\1d9i½Íì>\8e6­e=5\1e\18$\99\8d\9am\7fâG\99\9f¾ÊÚ6û\96\ e\10Z\90j\92\82µ:\9b\95$Þ*å¾Ø=¥\ 2\11ë\\11\11³i&\ 1\9d\80\12»+\8eL@|q{"CgßX\9c[þ¶2¤f\ 3ÛEÆ­É*YCr`\8fØ°ç©Õ½³¨3óÎVªm-8\8d\ 5&
+\9b\90\81s\8b\9aN\89[²Í*Û¦&4§\8aÚ\92=KYM\a=y»´=¹ü¶\97\92É{Ç\96M\r\1eâm|Ì\8aØ\ 3 Í\ 1Å
+B4^$/É
+\1eo\1c\ 5\162j1BZð\9a\19*\ 1)xø\eÿ\83+û ;Û\913\10\97&­SÓ1èÖ½âÂ.¸ø´øìBÄ}×Ù.¢©yI\1dVFï|;ëÔ<ýn³g<9\eM\bXTm\85\ 2£(\1f¶%ïpJ\93\8e4nKð\84\1a¶ì\a5\17{\17tÛ|6\84 I\19VZ`íq\95\9fî\ 2\96\17\8c\96Å-^\85-·¸ÖÊ1æ\14\ f!û/\b\1eÊûØ\17\89¤\9a|^2¹jgû­æ\ 2å       r2Ó;èð¸fó½±yyØky³3/\8dÁX\7fÚ¬=n*;m6Z\85êrûÊ)ë\13\ 4Ë»[\8e\94\8e\87\17'!\b¤´\1a\8d\97\8dW¿ù¼@ÉÊåÂk÷Z\v\\16ºÄ£éÊ\87[6¹\12\97óÇ\14«\16!\9d-î¶+¶¸\7f\14Ùâ¡\13\7f-Ý%\13à¬ò00v\8d¹?8©ÁÝZg=X\98ã\87\ 65^\9edtàì\8b¹nÓ\19ß¿:4ÞÙêÏ3ëµSÐe¨.?¹µ²©P7yO[)é¤Í*\12rØa­ÆzÉ\88ni×j\8e²cMx+KGH5û\ 3¾éÏ\16Üò³;²\eè\12²%&_`ô©DЧø¦F[¾\9d\b]´µZäikL\92  \búxa°\7fÐøâp\1a¹\86¿ÝAÂôõÊS\9e\eý°³Ë8yW\rÌn\9eÜ´SÂk¨æ'zOÞ\ ff\vé´\ eN­ë£øja-)\19x\88¤*ÁÍÑÞ"\85ÉJâ\85tQWøl\8638Y\96úìfªN\99ýRß2Õ÷ðN×Óû\fÕ¥3(Õx;\12é
+\951é6\85\fé\12\1f\9c¼»\85\18FºA5öå\18ó,úE|\98ïk\eKx¸ã§)5C\8f\8c\1e\83õ&Óq¦c(ÈM\ f\1féµZȯ\87r­EôZÝ{c"\ ejê¶é±ã»ð\99\82\90M\95ù\85Rjp+=Os\85SUdÛ\85\92Æ\98\95|\87>[H2`§ë\e§°\83t%\a97EDj\88\10Ì\81\13ñ\8f\ 5yø´PLá\1fæ\86ã\9fú¡A0\9dG\fù\8cþÁwbg\1e\\97ÂØ\9f½\99ÁMÊ6ºYK\82Ì\e\1e^Ûüj\9b¼® \9béþP\1cè'§      
+sW\80ðÓ\9coùÕ\13·®«/®Ø\eåØöÓ¯1GúD0ðäÊÑöã*Q½×I'\9f\Ø'©AfN°ãê\11\9fÞ\9b/\1c"ý*Ö\1a\978,Ç\1dÝÆ:\1d%¯Ça¹Ê\14Årд\81e\9f\83:ÖÂ\17(Öªxõ/VÊÙVfôcØô´ðκTã\80Úm¾\9a6(dsUW³Áª\15äô\91 Ü:6§Òe\8b­\96±\11c\r:k\ 6\ 3ÚÙ\14\12]\80ºcL\91ê?\8c:\19R]\8a¤\1dW Æ÷\89\86Ï¢\89\8dgØÓ\18\93úïmCõª\ ft\ f:\ 5T\9f\85³ãnýø:Dõã¦\8dÔ\8f\13\13­\1f»
+\82VâÝ?X"\ 4ú]ªrþ²Ä\11,¿\85\9e°j#\96\1d]SíYÙ½*\15ß\\8bt©éqêRt諱2(²¸è\91\fq\98\10\9fl=¾\9fØÚ\83\8b4>\ f\1e%<+\16\1aØ*K2X\81eZ\rm&\eè!ã&ÒPý\\98/ëu=uCº'9\87\95\80ÝÀ²`w¿xÀî \ 5Ãn«U\87]\8aE`\17Æá?\98\85\9b\97ì%¥v\aý^(:j\13\86\8dg0OiyظI\8d\16\9aQ#\11!\99Ó\95ï\91\912µðì\r´\eÛc¥ß¨ Ô\14=¼½=jNnw\14n£éú¥¢\94êöÑC\91\80>0Hï\93Uà§\80Ù0µ4¦5ïí\1fk@(\83ê\f\9a£UH&ÚUH±¯\95Å\1dNÊ´U\16s\14©,Ü
+\Y\18¹Ú\1f\87\976B²R\9c·¿GÍN'ÿ\82u.tÓòÉ­]\9b\9f|qÃiAuJ=\ e¤\8b/3f\a=\ e\8em\84\10U£öF¥nm\1c\8c'5nöJ\12¨ZJDoÕyÍ\ 1Õæy]¨f\1cP¯ø\1cËVä\94§Uòó\8f[Örü¦\Z__%£Ì×JÕcJ.\9e:ð±xbA¹x*\16\91â      @Hñ¸\rj\7fàí\9c\8bî\86ýj"wwå\85Ü4\1få\v¢n+Xª5`³\ 1¯\18Áö+\99\13³16jT{\82\83\90©¡^\9doßr¹Ü\9d´KµÅÜ.\9e[÷QÑF\1a«býª\9e
+·î,,ô\84\80C4\9c\7f,\87L~ÐÉ%   T\9eªÛã\\14\14.9¯¿*äXÑ\10r §/²\9f\8d\9eË1ïK=Çl\96ð/LƵ/\86]rmö\16ù»b\9bj½©\vj\1f\91ÑI\ 1jBÇÇ\83E\94ç\91äÓ¡\8f\95ÉZ²\ 2\90Ø~uá9Vé\98ß«\ 5üR\13sàt\90²\99Bdf\96»B/\866ËHú|\97\91\8cü#\93\f´\8eö\b¤\8e\11\1e*qãNz\9fFý´¾8¿ÒUÉFS§\82ØIW\95Ý+­\8fûÉ­3½»\fÑôníÔ¡â«ÿ\83þ´JëN{0QÌ!\13\8f(u\8f«\8b\13*\9dãjØ!¢\98Óñ\82m×á¶\8eϲóêÒL\16º<Ñ\9d|üÿ­eçbZÊ\14
+[)]\93\ 6mp+·\92\97ý@÷áõ\ 168O\ 1¶Äv1F\ f\80\9dʹ\18#\f`QC\89\0öò\ 2\80½\95*À>¤
+pп\ 2<Õ¯\ 3ì~¤ÿBW\99ft«oÔ\7fÌÛI:HZï:¿\9d=\8aô0\17¤ð\124\vê\84ÒÝV¥\879-Õ3c7Ï\98÷NV¼\e\ 6Ôf³Z
\ 62À7q¨øæì\0üV\18\ 2ü#/bø\a@ H\b\bv\92\a\84C\93ñ 8Hd;@LÌ       ¶Ì\ 3\10»2\12ã­\ 3â\ 1ö\80\b@\84\ 53F­ó\a\1dÇqµ¶o\99\82ôÐ%BPÖ2L?\9fB\1eW\83Ê\v      W×SµÀßVÅ^õ9ÎM\87H"\re\94½ï¤á \1eÿ5é\1c\1f!¬Û\80¬ò]@\12î\b\90\ 4¤\8bì\0¹·®\80J=?\80ÂÔ2 Ú\80\ 6Ôtj\ 2j'.\ 1µÏ\84\80º\87\r@=\8e\1d@C«\ 3 3g\18Ä\1d»ÿÕ:áa¢È\8e7_è"¾mÉ=vÍ\bkj\822ÄtUÁ5»\ f!Q\8b¾W¶Óú¾ð$ÑE\ e::ch\9fÎ\ fÁ}fô\0Ù\1f\r\0\ 5îc@q¥\19 Td\ e¨1·ü\8a«ßÃä.g@Óh\bhËJÅ£\89g\190\19\9b\ 6\8cX7\0ãÞç\80YÌBÀ,U\ 40'Å\ 2Ì\99Ù\ 3æE\16\ 1ó&TÀ\16¨M\fûü\85b·*BSÂó$ã²Y\84(\frIÖ\89¼ÒËw¥ýé\
+Ãù`\9b\95+/?}.ëó_±}ÃZKþ/¹×\fâÆXB§_\82ï×\8a,´ï\80éyq$;(\ 3Øb»ú«jïO\ 5\87y÷«C\7f\97fÃó©ß«²\1d\92ó\e`)£ò«\10òO\11\aÇ\8c^fhE¯\9c«þV"kb\f\9d8QÄ\97æ1\86\97(\12ò©¯Æ\17\96lýßò)¹úºeÿÛ*«\95\7fWphÄ¿&\83q\fû\18y\85Û+b¶ç÷_\b?íÕ·ZÂ\1f£ì\8f¾\9b\88\90Ѻ\1e\87ÊFL\1c\19£\13\aÁ½ã?Éë\87¤ÎD\94Ô\99(ÆX6âèrüoYÚ³cÜ\86¿-È_«l÷\94\9c\8d\97\9d\ 4áG\99Gá´xN\87i=*>\175\ 6\7f\8döX5èñC¾Ïö\8f\82»»Ü·äìüÝú_ø%î\1e6rô\82\19.\8es\15\9fu<`ù6ÚOÓ~\15tzý\1f
+ºS\8b<hG\86\1féÂ\87üæ)\87évÎx\8aÇ¢óÌZèà!_Ññ£Ð\15\96÷-ÖÞÞË\ 3û\1c\18¯Á#¨\8d\9f\99\9b\9dÆë×[ë\9c¼\15qíåÉáå¡É\8b+¶é,¿[\97A\99\99ÿ\85è\8d§´è\9döÅè5\90Ù(ò\ eq{±[üw?p;_\ 5=\86s
+ùµúx\8aûNê!\9f;\89»û®\ 5\9djp ÜFP\e\8d¨[ç3áoõéFºö }û\8a\9dË \1föÏ\91ööÎÌ1¿<M\918{Ow\9d×Q|VÑ\83ü\96\9a\87Âd×Ù·ÓCk_^XæîÐ\92\8c?Hrèä3z÷òjôÆ|!nZ\9e\8cû\ 1\16\83bâ Çµ¤ß\8aZÄÌGý\87|*\8f\82\ 3\9e]Þ:ïôþÚK§¯\97A.\1d\9e½\12\0§\8f\91Ë\9døs®t\ Eø\98íW°\83\1cÂɵÙ\97§\80Û\99\10ÔÚ\9e¥\8a¾­o¨Þ¦Wî-Ö\ f«ð\\93×Ae\15u?ô\8a\89\1f\8aþgqcýikËülý\83è}+ÉÑ»;gâv­%\15\9dE"z=º\ÜÂn¢§E ÄÈ÷6B\89WlfµÎ^A5NüSï\1f³\e}²oÃÄbgrôvk\8bÄis;7ï\e\1c\95^ëGÐ\85ÖTsR\y¾\ f¯@a\8fûBïÍû\10\97­\91å.Öhå¸(Î\8eɵ\99W"\9c\9cY
+LÍât\94\9a^\ 2\88ü\vѧ^\12£÷Õ§¢÷fBFï\89K\84ó\\r\ f\9bj\99\ e,øR?¿\84;|Ì\99\1a¶;\8a$·E\ 3LY?}²³zÝø$ë\q¸6ó\9b\92±ö3ùÑq\99¬¦\1e7ØþµP\a\9fÌ|\9f/\97çU­^\9f\9dÊ\1a3C\ 6seê¼Þ½ic2Ü\8fÃa#ç½7\ eæñ\98\8a\8dæ\83\ 6ú\ 3\11ÎÔÿà«C\8f\1aÍèä¸P|\8cè[¯\ 2\95Î\1f1\ 3Ns\81~\9e\9aÔû¹;îêÏ\rÑ«dWÜ\15F\96~\v¦\17\1aGIsÃh\99³Ó¹Ý\9bÞ\80éM»»\95?yT·»      9z\Ç\11[\88ÆÌ\ eOÜvÞGo\97=þ4h\8c\16Ì\99\1fµ\0f\ eWúf1ØzFÊ=Ìö\88\vW7hÿ|\9aÔûv§\8bômÙ\80ûhA¬}\11}BU\8a>§fë\16È[ì\fÝ\97å=ün¾7O\94<­#i\9a\98aWi\18>,¶$\1aÍÎ}"?íuTtB        :3ö\8e\9b¾×¦\aiA\7fÔ:¼ÆÃ5\ 2\16CåZÙ\ ev<u\1dèióå\1e\8ckå.Õþ¥[¡úè#~,\ 6\83ǨûÜÌÃø\9f+[NÌ°\1c]F\1cðNÃöÌ9WÿÂW2¿\1f\9d.wI\rm|×µÂü\9ag¯¯å\86_\1d\17U°[ÌaY_M\9e\96z\19se\17x\99ܦ<\ßOØ`\9f\r¹AÕùÖ\1dt­;bö¯$Ñï7<ÚëÝ\15kÙ#vý}wT\9dݺôéùq&h¾à¤ú4j7C\87·3^ÎéÈÅÇÕÒjBÞÜÛí\9ai Bå\aÕ\0/ÿA¸\94¿S\117·&ò\87\85®§f7·l3F4ë\95ØÃdÔF&cn¼\9f\8d|ò´\e\96\82÷Ó=\9dë¹~wF½GÕ ºQÝ\10ºL¯«:\93§k:izÔ³ÅÉܳ³üÕïÈ\8b÷ÁÚæó\89Êa\9552e\1a\a£b\9ca\9f4:×\86®ß\84ÜNÇ\96ËL{\90\ f*? 7»Ò/L\96Å/\1e»gU¾ðý,·}f,ÄWSLn\16\fëÑxú¹ìF+u?\1ej+&\19°»\9d°¾ìc7íÚ\8d\96Ý\8fóy\1fJ\ e\94¾¡v.w£;\8a\1a5­íþ£Z\158m\9a¦Sè\eç{mb $æë·È8ë8;yµ\aýC^\8b¢BCcYMÒ@\89\9e«\82\99\a*\ 4ëÉ0JY\\9a¥\ 4Å_XÓ\85\1d\9c\14úÌ­gB<ΰ¼tv2¾\1f\9e#Ur¶\ 3ØÓ¼þí¹ív_ééÄ\99¾Î;»õÈ>;j\8eÊZz£U5-²\85\19\17¯Í|\1dÄÀné}ÂÔÚÏ\91ÝiS\9fÁ@\e\v\8b¹\ 6\86Û\9d*¼£»²\14à´\12_6X^K\8f¦\Üv\86ÒN×CI'3e©\12\86E©rºæÿAî\8b\0ÓRêþB    É\1dz\95§ÂÚìÞ;gÇ\99Uï1°\1eȺ\17fÊ£.ûÀ-{©âÃN)ËúV\15í]M¤¹ú\18\8dNPÐû\ 1@ÚÃç\8bÐÞ\f`5n\9a\93Ô9TÔÕ\f]t\14i\ 2\8fäM\9aõå\12ÕN^.\97ôøzµN©W¥\85´XF¼æ>]ÑÙ¦\1eb£7)\89\8d¶[H\90O\90\13\eB\9c³'¸zäFÙ>÷\80\\1a¥yu:Z.²£2\81\ 6}W9ùÝTw;°%ûeZº¿K¼ê&2\r¦ú½\ 3íuâ#\84m¦be4\1e±Êê¼ÛGÕÌcL)25\13äÍx©È¥ûÒ\94\frç¶Nöe&^û¯½Ø\88аé²V¡I\82\17%\8cD»#0¹îU`òd!\ 6\93\b]\ 2ýÆr       ²\7fp\81\8a\1dyÃufø¢ãNj\93)2Í\rÎ\f¸õ\98þÜ·es0°\8cêÌ0º\82ÔÑIÚ\1aµ\19m½ÑøÁ+PÅM  («r£ oáFM.;D¢uJƾA·Î5ZlÕm®-vwM§ù¨Zã&Ù\99m\85Ñörç?Õj\96ç;\ eÎÍ\83\9cÎÍïØ\99\13Ý[.F\94ãæ\8fl\8cý'ó\a§5!ÊëÌÔÁç\98§%âý¸ÅÛ9·Çï®Î\82\11\17Ö\81\13\£;åÚíÑë\9dTsË÷UñE/\14¥d\9dä­\eßr\ fÞ>#ÁàZjÅ7\9fºxóߤ\88\17S|sÐLÉBä\97:üg[\1að\ 2DøÜB²\12Ï-\97Ý\9c V\81Ju¶°\«ÌV>ì\99­2ÈÄXdÙ\82·Êü\ 3è\8b\93\9b%\87ͨ¢\ó\8a\14\9eéS­þÅV\84ÚÜ´ÅJ¿íÁoUKïG²¢°\93d²Xn÷ï\13é\98mì[\97"\1d´Ð~'%öB7ß|2\93Z\93êM0Á{Î\19\ 1Ð\9b\16/t7m®5Ø÷ØÕ;5g\8b\18rbÚ\83xØtx]aÚ\9cX2\r\v½-\r7[\10mö{Ù\ 4I\8d.ÚÔM\88\ 6?ØÝá\81°< 4>eû"<´À3Ý\ 3jóÜ©Xé¹þ¬\a=\r*íU¥Èb¢d\86\8cÙr
+Ú@\fz¾/\12\99Ô¥9\94«\91ðÚ\92\19\81«ðe~f\89ÈWî¾j$'a\86Àª°¬0;§k3\95ýdL[µpO]\1câE¡÷Q\85\f\ 6\84HöiaCöëÅxtV@!2\90Ù\18\f\9eN\90úbˤ\84\1fëþ\ 4ò1xÐÈ,\13×\90³4ª'óâ\1cfí±°î)EO\93\195Å~÷¡5\87Ë´#¼\11~&p\93Ñ\81\9f§7w>Óº\ 1NZG9vSNWÙ\92\99m0ú¥ÌЧxÜD#\ 6iPÎÙ\18\91ý\9d»&Âê=)\ 5F\fÏb\11\7f£w\ e\7fcE\1f\7f\97o\1fü\rAP\824Aã¹Ô\1f¬E\e°sÜLáã|½\8eôÃ\82\ 5ìRýt0\b±7Õ2\88Õ\95\10¢&5C¬Ç\v\13ØlñbÊN\92[Î7\ eC.ÿ*¬ØÍZ¾°åR'd\fÃ\83èÓyZ ëè
+¦ºý\ 3AÞÃ\87@\92õ\8fF\8cúµ>þ\ e5\1fçë~\80Íûå<&\12>\83e¢Ý\14Ë\\ 6\11\96Y\1fÓXóuI}\91HªÍË\ e|áoÛÇ\1f÷þhß.×{Ü\13ÿX\1dÈÝ·'(;Q´4á\88.\93\95ùù\18ç89\1e:²e\eÖ\18\13´ºô¹9\98Òñim©\9b\9d½Q8ÀÞäc¦äH*c&Ï\eÂ\93{\rü3\1d\0­dl!E\ e\96Ýbó\86\ 2\19gt+Ý ´¼\95      ´¼sFhy®<Ѳ;K£ec\bPm>\8eáö>_,.y\87\994g\ebX§n\88ãoÀÛ¸_ùÄ2¢\89Mx"\9d^y§ÉL³*W\98Wxú¼\1dÒTo9k\91\83ëZ'^\ 24 Æ\10µ Øãà\88Ï\90Å\1d\17®ñ5\84\ 2ÖzµÆ\9a¦\88Fq¢\b¨\9eö\8cú±õðêð\869"Nz\94èÐ\bº$\epСûpÀ¢w8(ª\0\ e\80ð\81o\ 1õFP´õùbö|H¬·9ù\94KîíZç@\8e#\9d9ÔvÊ\96\ 1\93\16\16Ü\1d~1¸©\fl\ 3\81|\ eu\ 6o\8a!\85IN>q©66)Úl¨óþ°Q2\ 2\1fÝÃÅ#ª¿ZO´:\1e¦ë\9dÔ¬PGæO\14éær\f|W)\ 5\ 3·6ªE\9b\1a}1^Õ \96FªÜãnU¹åóZå:è§ÊÉ\95w\95cr¯/\12\e\ò9M­ nTûÌ\99\1eT¬TÌ[Ð\fµÅê³\93aì8i²£¹Ã\15×ç6Õ\9f¾D|^n0\8d2\98\10õºÜå\10¬çJð\ 3?Y°\eæ\870éK~-\92\87Ç\9aW\ f\9e5&(%eÚªS\82(UùÐÁªéÑ¥Yi\ 1Ø.¯\9a½EYÉ\96\1fåÂj[-m\9d¹^Úò»KI;f@I\e\ 4ï\92f\1e_¥Íáùþb\\98# è\9d\ 4§¸¼\94\rê\84\84jqvØ\89Ïu?\11!y©7êÑWqª\13\93a 5´K\89Cn#\83¬±æ£QiíÏlyMF­²òª\19åâÚ\18\94vê|^ÒK÷]©òhÜ\8bÇ\81\91*ZÔ¾R\84ß%²àh\8eVhTrã|pô.ù~\87úºT\9f\95'Rô!\8fï7 \8fÏg\9f\ eßyÜp^_\8cà\15Òês\e\83ï Ú¸Ü\9eÝò\91te¼½0\17¥)[£;.é\15{&¦h\17µ\8eÎóÍÚ¸­1\95\80\17;E*Ñ:ãçu\8eÊ\8dz\15>F[Ë1ø¢\9b}?\1fãìÄÇ61FA\96\97£t6]dj\99y°ç3¢Ë9\19q\90Ûe²Ô2\rÉ]\96\82üÛf\95É\ 27\95\11ÑI:#\16\93\ 1_$Yg¨çån\ 1®q&IY\15µ\fï#Ñ\83ì#×F\9b\vjp\10\87xîÔsê×8ß­½í\8cTÞlH®X·=2\17\8d\8a\8d,\94>b\90²Þ1éö|È¥+âQI\1dsP'e^\ 4\ f\\1aöWO³ïç+@\ah*Æ
+\ 1èP\94\0:Ê{1.\ 1@½Y\r ãs\17 Ýë\1d =\12\ 2\9e\ 6¨PN}Ñ\13'¾dé4ß^¸\8dÊ\8fy;7i_è l®\89ÌXKæ=ÑN¯çÂÌ~ש\143)­\88\9a¤\98\e\13\1e\9bYNQ
+*µ\ 2\ 28\91J\81\86gq ±ÚÉ ±ÎY qi\8fb\1cV ñ&o\0Ë\1f2\0\8d\18¡\ 2°âx\ 2°\92ò\0X\99\9e\0«`\1d\80U\87o\80e\eH\f¢þ\aNÛte\93úx\9cZE«p|W\8f\13\82\8ei?ÈtO:4`Òðá12\18WJ`Ü-ÜË{=\97r³R&ÿñ\9a©Ó\eb\0¶ßÑßÃÜ\9f\1cÀÓ\94\1aC1\0^^ô\0\8e§'\0\17ä-À{÷\aÀwF\1eà÷<\19\ 6ø\83\9d\ 1\ 2ª¿\0\91É&\vÏÜ\1d@ä¨\ f ò\14\vð·-ÿ\81EdÓ\89üðS\7f;B®\b_É,òÔ¸á}°*¢^áI¦¶*ï\9d¢W \85ª\93]\94:\ 6Ô®\7fT\10ä\95\16À7\8a\ 4\b\ 1\82Þ¶\ 1\f@tê}@ø\9d        Â½\ fH\928\ 3ÒX¾¿\ eâ\ 3W\ 1TúÅ\ 1ª2°\ 1\e@\89µ4 Z\19\16P\16äÅøD\80²y)Æ{\b(§1ÿ¢-çYN\1aTi\9cߥÊ\15êõ\862\98QyEðdæ\1e¾¦è¼×³\92
+\97qÆxí¦-\94±~\85u*w\0©w]@î6\89\9dùäý2ù~\85_§¹\ 2Ôzy\ 2Ôåu\a4¢¦\ 1-\ 5U@û=\1e0Y¦\v\18\ 3\fu\82\0#­9ÀtVɤ\17`ìI\ 4\98ñ\88\0Ìd6\ 4Ì\14Ý}!cA\9f\12\94W·N\8f »\84\1d\80\9a\86?ãRP\86©Ã&Ï~\82YFí6F©.;wÿK\87þj½¹áæ[Ëá«Cÿ¥ùþø{½øг\\ e°À\84\7f»z\r\ 3°Xi\1eãø\ 4,>®\ 3\96°Íÿ.Þ0ì|\11EkFü#BÆ\9fQÄ¥¹\18\98\14£kE\11\9f\9aÄ°\8e¿\8b\f|åÓoñ\86ÿ%\9f~+\rüe\95ýU°7\86\v\7f\ fóãê]v#¯@m"f»x\86Ó\8a\17ý\vüÑ\ e\1fò=¸þ«ÈÀ+'6£H9\13¿\95ÓC²õa\7f\88»ÆÇç\9bÛ\18»Ç÷0B#û«~\83\10$e\85áøL\9bmý·\vù1\8a\18ÿ1\r?JÚ\ fù]v\17¦õÚù¹¨òϧxê¥\1f«úªü\90\83\1aýS\11A\8b\bÿ¯b\bña\ 2\13\10û/þe\94}\99\9d8ÔW\96\8c\ 3\1c ¿\91ÄûÓ®_\ 5½ºø­ \83O\14çuÅp\9a§á0­5ñ§xPÙÇ
+ÖÅGÁÑ\131å¾mô\8d\1d\81\\ e\82\9a·\9eÜÎlàßê³×þÚËVîWlåd/\83R\859GFÏ<{µh|úØ[ï\8b3s¾\8dÿBôZtøèE\95ãÀ\14»úÓ\ 5Ú\95\18Sôw?Ðôð#\8e\ 6aZÙ,\9fYýt¸oëû 8àû×íL\1f [}r.\{é[õòh=Ð\v¹~\10g¯ô`ÎÌ!+\9e¦pA=¥\9d²y\14ïXÿ Gdò\90Þ·\81¸Ù\99\19\9e\15¾¾­ïæÍÍMßÈÿB¯:\91þ z§ÝD*-7¢Ècãëʲ\85\18víÛ®Ïl\9b¢ïånQ¼\9d©\8aq½qxb\1f½\f²èôÌì\8aþ\89?\15÷Gñ\ 6\9d\ f\85Áå¶/\8f\9d\99Ú½·gñ\ 4më«kaÓ+Þ«ë\87þn¬És\86^y(Òò?}Éòùp=].Øv´ÌÎ\8e¥ÅJÌ5\16\85~\91¸TÿÙù"z\97e"z\1dÒµè%®JÑ+\1eôEÑjZ{.ò\97âõÆ\8c2çH2*'þ c\87U\83aw\a6+nmè£m°ÍÍZ\ fÊ\8fÞÊ\83o#ÿãܦ>\7f\7f$\v:ùéAv¿\14_\85ËbÅ\95\1f\v\82ùVTòóòª\aÏÌâ\96\9e\9e\8dr{Z?ïýÉm,\85\13¼äçÇ\8fû<?\1eÌ'\7f#zk\1aö#F¿\1e\ 5ø¾ëö\93\86άëõ6jÜNi#{Ø\97\87½Ëæf¶¢5\95\92²þç¬V\97\8b¾\84-V¾Î.\8aõ¡4o÷ÆíÙ\11ZÛ3XÚ¹ÓK\1dL§h\ fò'\81@\1d'ø²u\1f\ f\91>ð^ÝeÁ\e\v\95dÉ=\ f,MyÔ¬\93\8bár\eFÃ<QÏ\rÔá'3(Ñ7è/üÒ¡y±\11\9c¶PáÂ4\9fï£\foN;kÚ\9emí×kº¦<gáC#õ°Pq'\9c\1d7\9d\9d^\1e\93Ê$xÍ\e\13¹³ãáýÝòÞTJó¸u©ã¥TÂ\1d5÷ñ\880cX«¡\14ÍN\83\r{|\ e´\12\92\86\8a¸ÕóNè\9fÆ\8bi¯;¨ß»÷W+Õu×BªKªx\9cF\94ÊÉ\88À\89RÙ÷\17Ñ'\7fe\1eZðHÖ\eX\17÷æ\15    ×/<Úûb4\1c-óÏ\93³(ñ\9dþôªj³   \99í\1e¼w0y\8eæñ\89\8d²Ì§2,\b\1f\9d
+\94{`°¦k|Dµ\7fn\eÉ»¸}»2q{7Ë\9fôzLfÛ}L\91k\97ª¨\1f':îË\ e[¯Ò\ e\0Àµ¡ªwíäêG`­n\8b\8f¥ô\ 6ï\1f\14qóõÅ/½ü3@\8f%\96.¬ßö>\\96ÌVâ~\98¡\9fÔ`2XgõqÔÜZ^z:u\87
+}ð\a\15ìsqa©üê£]<Ûë§\95j÷Ù2\e]ê2 \9d\97³j:\ê¬Ú3ñaÙÍ\yÐYªØ¼#5Ü£µv7O«øJgM\9d\13\93W°Ìj¹d\18\b|ÜéÎ\84\r\1e\83\a\bÿÂcûê0\97\14Í¢[w2Ïú\85\8eü\9c>ªÁz\9cZ»î(Ï\fÚÃâ2§¸G­h÷\e9tÒ\r\9dó®ÙÉË\17N*Î\86ìæî\98ïøÕ ÚÉ{\10fi G[¥\19*\9aF\86Ò\8c\93,t\8cN}êé×Þy­7Âô¥í2ä§M|V5mÔ$[êû\8cøêÄÞEj*\18\86¿°s\9e_$\86Ëäó\8e¤dö¸9äÐuzMBó\vT{\8e\ 5\87e¯ÜsëHEíÝ\r\95ï\86ÊÐpøÌص3\9fã²S¨\82\93Uf\8aOÓØrñ\88¸"\15\8dº¥ÖôîUÇt¬;dÚ\83ô:\19\14j\11µnk£7è©\1f\1e\9e©ü¢µW\16ð"T²Ý\I^aS^.\f»3iË wIû Ï\ 4\ f©<Íߥr/\15|q#VuvwÓõ\9a¯ìk\99é°±\bFÅn~Ñ\ f C2YÜ\8dæ\81êð³<gg\99\8cbmñªm\9ayblؼµÕo\87uÐ~\Ö¯6ÅÝ3\9a7\7f\975¶Uª«Óu\95\12Â)-\83\96\95\ÍêÈ\8a2\1cJÛÝe-UjÅ[Ë´õl\væ*IÊ!Ú\8bìXD[ók\8cë£y{Í\83\7fpûâ2\99¥ÙÍ«\80T\17Gÿ\93\99¤²íÛ\0Éú³îkb;ö²ØW:Åü\865MÓ\15\r\94sÛ:n\9c\ 6mj\9cZjãRãøu\10\93ÜC\85<é£,ÙnNÉÍF\15YÍLPi'ÏI©\928\9c¬Ê]kÁ'¤/:uuÙ\fzËK\13\ f3iá9\1aã\ 2\rz\ 3\81N\89\17þ57îüË\95o\7f!±Ä¯\90\16\1eaeîÜÎ\19O
+Ðkÿ\8eº3§iR¶µ\e5$\13^\18\8cÞ/ÕØ6\15Õe\rì\18[m6'SE\92ý\8d¼¾\85W¹D¤BI\1f\15ÒR\95Á
+-kJÖÄ+ÄcbC\92\93*\8aÍþ¦#\vaÙ·\ 5Ú\f'üxSÝó\9c6|s³gµÎ5Gp\97kzé#\97AË·_(f/\S©]¿8VÒ
+µÊçö\95\19 -2Ãý08÷è\90\9ct6\1cÔ1\91^&y]A'\1aeJ\eû+Bmön-%/=\fY½Å7|\ 3â\97Rõ89µ:\88\7f\17¯ÝýGl<Î\99¦KÝJB8\8e\10\97)þ½ [<÷\12MnÎ\8dF\f~ß²r\8e\88ØüúTc6Ú1YÊ\85Ñ*Þ>F\140\1at»&¸0êópf6øã²G\9d\1c±Ü7&\95)#\r2\83Nwxì¦>Ù±e4\8f\96îR¾¨\8dÃ\ 3¡ø8\8bÊZ^á$\83÷´VÇ<ôÄëå3\15±8¿H\1aÍ]0\97&iv"at\19¤ùOÃ+ð¼áU¹ùy\81qYô̳²\9bn3\9b\88t\19ÍvWô>\b\1ft\8d\94KÔéÕlS§·°\8d±¸Q§«wù\82®å§ç/¶T8Nîi\8b\ e©\95'i­\ 5}ýÛö*}ö̺<4Û\8cê\8a\8aß³qi\7f\85ê­Î"G\8bÝ\vÜj>¸v§Iî\17\9eàÕÎ>ÿ\19§\8f¼\90*\ 4|z\8e½¹V\96Í°+E(±\85]\e\1931YÐ\ay!ÓµmÔ¥ì*¹¤ê'ÿNöÐz\91Äî\19\99Ä\ eÐ*FûJb\8bÖ\99ì¥Í\vÙ}(§/6©\82Õ\98wWrÅ[\99\17\8d\91\9dóFú£-\19\10\9bÒ!\ f'gÓªÏwHs\80\ e1ÁÓw<ÿ\89r:/°x\9f[ìÚ3®¥O·ì*<\Xeô\89\98\1d\80RL¥Y,Ðæ¨R£Î\1f\9c PA\11ÉÞra\13\8fw4#(\819ã/è\96ŽӦ\89{«c\92ÙàÞ\18½à\9eS9áÑ\ 5?ãÑ\1a>~±òñfcF\ 6deTA/ ;\9d½w\16\R\86moH\18\8aÂ\96\ 5ñ6\ fÐ&ÅZ°\0ª4Â->M\9a˵\872«</6³\93s\1e£\17¨ä0Låf\1fi\v\1f\ 4Ôe8}S\ e\90ñ³·BâO\80\11C\1aæñ×D1p.½\1ac3©|Â\9aùE\ 6\83\1d¾±lZs\fr¡3\ 6é¯S\82#\ 65\83\ 3&ÌÁÑ/çKè\14\89Ö9¸\10ÞÇiù\9b­\11Ôâ'9Ä\85m¹Òþ\bMÊ[¢¼\106jìZÛ\94\18½\15âôñZ\15h\84\97\9a\1e÷)çð\9c\91w\ 4Ú\90ý+z&B\8cz\10Ã\87\9eÂãpó87\9e!Ø<uIæÖ°L«¢5¤u{\88nRÛ-ª.\ 4\80\96¬:\8d\96dn\8a\96\98ã\19-Õ×G´T\98\1dP\95Yþ`a§Bt¼d²U\17ÿ°¯Î®­­uêór\95µ±o·\1c\v \187Xµ\eV¿¶ë\8b\1aûN\9dtÉ    E\84«»D0¥\8c\89¿ïÍ!>q\9d\8bÇ=6_\ 5WLTsQÃß#\99\86l¨Uts\1e\92h\19\räºaTzÈéÜ[#\1d§ü\82¯÷\ 3\ 6_\ fá\b¾.­ä\ e\r_\87ê\ 1A\8ez\8c¥´ÿböÌ\9e\1a\9eÚýÔz\\9c°X\b]_i³ã²/WÙ®&\12Ý©ÀùÕ>F\9f\ 6§\1aéÎ\99\12\9e\94\93Ç\16Õ,\8aeG$ÛX1\1d¥¡\14ö6ºmß\13]\0m\13È\12-\87Í}ý0ê\au\93Ù}\90ó4, h¦\8aÂ7ß\12`¼p±k\ 3\9dZV£ÓêQõl»^õÔù êñܱê\95\91}ÕK\97\88oì¿\98\82øÎ><\99\87\9a\86ÉØÓ öç¥*½ûýÖU\975aÒRxVëô     
+\eû0>U
\86bõâ\ 4­lW\91\vÕk NîÆ#覠ÂAWtà>æz0þØ,kÏÁûP£óÈ£úÚhéêXÛT«à\98I\9e\9e\95\1a\15èú\9a\95%\¹\95s!Z+çÎr¿\9c\eg\ eå\9cýÞ\97sÊ=\ 6\95[^¸ÿ\96^wݽRé\18\1ewoOVÓ¥¼\7fH}Ñõù6\9fUY\81>÷t\92`\r\17i¬ñ(ñ\vÔ-Í,ÔBô\99­r§gµ2g¡FE\ 4\14WÉÌL¥ì7§VY®FÃrþ\_\966¶|(iì&,\95S\85\q?ï`ÅZö.\17Nëø\99ÖÑrçüõ°,æ¯ËÈÎ_;£m\ 1ñýd$]@F\93}\ 1鸻/FÆ­\13ß¹¶Ï¢Ù#2\81\96\9d\99\869W\10ðB\9b­\88¸H\ e\11\9aÂ$¥\83ÖOtT\83É\1c[¬ÌÃu¶Ô\86¤\á<á*\ 5\9b×Ñ\ 2\9a\9e1ùÛá\95Ø®ó=\v¶ò8Ò\1aä\1eWo\91\eLÓç\1c%ðïì\vÚV²\9eOrYV¾v³ hí2Ó}#\93\11LE\8fs$f\93ù,µC\96y\1a1\8eòþ\8bA Ì9{\87\f\vºwÝÜ\94]ÆL´N\91\9aç]NEÒ\ 6u\a¹\16Þ| \f\1d\1c&\17+¸²pár©=\1dçóA7\ fe_Ñ)\9b\99\ 5×Jüp\7f×3\19\12¡¡e$µb¬-H\1aC#(ϱ«ô&5½¥K&\ 4¥ö¹v2öLé\9b¬
+New\ 2\10«\1a\0Ë'ppÊÚcp\8c>\87\94n\96\8f©Ý¢ö\83>×åYË\19Ðùv\93?=$§\87¯\84\8cü\1eÒ×ùÍ"ø\11P\1aåKC\80\9fõ\ e]\85Ög¬TE\8bIű8w\1c\97³\13³\94ÏdÑk>]îLÊ óä+ >Ôê ¾<± îW\95\18\96\ 3ê§×\fÔÏÊ)Æ\13\80úÅD@ýZ\8f¿{\r§ ¾\9d=A}7ÆA}þ\88\7fnáÞcÌ\935$A}0z~ñ]´Ò\b×DQÙ\8f»\8f¯\7f\9b5¡û\98ôV\9f^c×Î\19\b!"R53\94¹R­¶"ó\83\fÜÈ
+å1\f­.\5e\86û"@o~5FØ\0\r\80Ð1¤ï\eù\8dâZ\a\8d\ f\1a\rs\ 1\1a\1aÃ\86@C(Ä?*l4Ðh:ñ7Dá\r\1a-\9c\ 4\rÉ]\82\ 6c¤clJ\7fÐ9÷Ïl»\95y\17%\9c4"^yÀGêùÉ$5!±\8d\98\1eÕ1       íV\17\97ÌnWÊS»-\97\85>,ý£Cw³\b\ 2°Z³\ 10RÅb\8c\19\80\89ÏÄ`TÑ\06Pl\10\8f´G\0;ÖÖ\0\87æw\80WÉ|\8c+\ 5p²ÿ­Ú\8bSlü=\1a\8d·\98,\ap¶4\ 3\96\0Îçâ]¾È\7faR·\1e«Xík¥Ùܵ\ 1ÓuÐ\eÑ\82\88=\8a*Ø¢Ö,³£\92åsv\9e¾\18\1f\9d\9a\84rÿèÐ8\96\8bÿ\90\866\ 1Þ¥Ä\1fá\17¿\ e4\80¿o6 êõ! äÎ\1c\10£ð\0Èlÿ\rÈ\16Q\ 3äà%\ 2r8p\ 1éËg@®È2 ×\8d¤Ø\ 4¼\ 6ä­\r\ 32\10\8dÿ(1¡©÷\vÙ\1a]70w8Mó\14\98\9bï\ 6¢\11\97Ú\9cþø¥:±\e榹S'S\88H=\85J¶ôo\1dÚÏZ¿=Çrï\97êûSq"Q}KÕäÚÄw/ë\0¨qpÿU`\98\81P@\8fV2 W\9a\aèKã\ 6èw©\ 6\98\ 4L1»\aL)]\ 2\1aï\96/~\8c`%\91~©Á·çé25Þ\80Lã4<\86µy(ïKh\8aJjÛ}ës@;ÃïþÛ\ fý\8dè\eÌ\7f8\8eÿh¾ÿ-øzoÀô\8b\ 5À\ 4\83Æ·Vo\8cÓ\0°\98súZ{\7fVeûÖo¨-\0K¥>16\18\99\13\8f"öFý\16M\13#çw\97+\b1äö\7f\14\19ø\96éý/íôÇÚû\1fòé\7fºe\7f
+Ëþ*â \97"/7Ç"fS\95Ãiy7\rù#uù«Äí·úÁW;½Þ$\7fõõ¤þ\88\90_}׫ÿF"G²gòwý\86Mÿw\91\81ñõ·\ 1ù[ûöëêý\16\9b ä\88ñ©vø\91\15;ä·J?L·m﹨L\17Oñø-\9eõX!çÓC¾¥\1f÷-\8e¦ïÚs\0\a\a\86Ô\ 2ã³\1fßÎÍÌö_HÊ#|½±?\92*\1fô\86¿m±_\11Ò¬þÆ¢ñ»]»Ö÷l~\14\10yéõ3\9cæö©ç¢´Ï?VµMåQ°÷õ»\16\9c\88à@\9c\98À\bßâí̼\95[}úÖ¯·fɹb~upyÈÍù\85ÜZ»3s\1cßO\9fN£tâo\17ñ¸ Ðä\rÉ£\18âýcvTé}qX1P÷Ç7kæh=ze?I\93
\18xî÷V\ fþö\83p\9a\9e\8bbÖz¬ªõÑ}['\97AmXØÞê\93Âù\8a-²ñ¿ãê\93Ôî>{%(õ\1fnÙ\í\98í\17\e\87Â\b"÷åÉ\8bÝ\99PNÚÚù\9c¾¹i\94»Á\ eÞz=@Z\995y}à+\ fOs_«ìÏVÔ+ó\7f\10½Ä\bù6\9aR\8c¯*\v\81\18pÒ#\94òC>XùàÐPá[Ýk\92\97A\86\10Î^\81ÓNi\vé\1cVX¾¿/{§á®6ÛO·u\7f¾Øô
+þfýhû\875yô/+\ fÙ<VÌõþñ§Ø'û\95T\87ÙòR|×\e\8b\15/rómËÕçí|s=;hÁ{V;6Ê3³ÂU~¶þ\13Ñ˽U¢hÅf~â\1c}\1e\9fgV\83\9f×î's;}Ôîý°BÉdÒkW\9b\ 4ÐæÖº\94Ö\ fõ\89®¼Ú\85ò§è\91_.\88uk\99\1dí´\85ü9Zó­pìÎÛÐk4;È`6«m¡ÕÔ®\14\ fÓú\91½Oz\88\ eÆ\8fî¸8&\1fOÜóè\966úLË«ÑTp\93¬s$@£è\aée'ü\83è5\8fªq\17°ó\ fec¾oh_½ÄÃRlqÌv\84ñÖN9Þ\9aÜ!3\9f¿¥6Ëì0uY\14&ùhvh¥ÓÓ³\9a.$/PÔ&½Z9\19\14\8e\1fv\99\1c\93A\8dó¢>Ùò\98\90o\8f>#Ã\1eñ\1fw8\\bóù°\ 5\85ûÁJ.Ý\a\85\9b\91uÛz\9er+$4ì\9bçÞ¡\ f{«[ï¢,n=§8¸þÁW\8c~J:\9bÌ°_Ý\12x\1dýÖþ´mXÐh5îÜ\r_ ±öB\8e<mvнî\14-,¦ã'tÞy/$ºy ]x\8f\84#\9c\19.iª4ÌmZÈ@-+ø øð8W§¦-·ò:ë}KK÷úH\99L&\8b{\8e©m»ÁË¿wû\93rÖ     Ó#Ò¡-ghO
+Å£\9dj\83Sg^\ e\8eÿBó°;\84ól\ 4\auþU8eo³÷fÐ\8bvK\ 5ÐîìtH+S'\80\99)\1a\16Eïõx&ïß\8cf\e¨?\94\ 6\95ù ¤Â;W¿\v·¾\15      Qïªèé8¡±òÝ{\7f\12áºá\84£\80v\98b®e¿w\94\84évæ£é¼#²é\93åïÄ\8fU¨Þê¦æí\1dãPjn\8c\9aÛL\1cÄú\99$v¿PC¶_<6Á\ 1¹°ê¸°í\8b§Çr½`×Ó~yÒõ¦'E\1ae\a:9ô\9d*9Ðj\19¾\7fÚUõ^קݮ{Sç\8e\a9;ûc-o6ÿ>F\9d\ 5\7fM\C\9dìá\9d·VV©j\15Þ\ 4fn'*kVÊCÙ8\1c\ 2Û\80\91âX·'­­\8eò\87°Ý[R\15íYÇL\8d\9a\9e|õ%\84;u\f\9d¶*;\9c¬ÿ 8ûq?W\15"¿NͺI\87\9eu\89õÒkîkö@7\9fbÿb\94ÈÞíc ÝÇÒ \1d\967Z¶`Î;\9d\9cº\1fYÊ#å\9b;ªt0+k"0¬Fó¥_\9­;d·Ð\ eVs¸ÝW®\84öܽymèrºú\8a\9cd\9aHåØ\9d¯ÌæÅ\9bÒ4\96\ 5yy\19¨r\1e«Ï¤õCÜHê\80\ÿ\82Y_}q\1dâJ}{\9f¸Ðr[g\1eã\8fÀÍ\aûÏ¡Ó»ïÇ¢ó\16&¸=\eGÕÎÒx`\96Ê~k?\98U² \19\88Böt'0¦í;á®Û\84ï\9f´Qýt×èÛû­N\88lFMùµ\922\97ùº\92Ù\1a\8cì·}YÎ\1fß\8e¤Õ\eÓÖ¾ç\1c[F³
+µjÙ\Sì(Û±X/¥×Íëî\91\f<\9a×ÙÙÿ\83ÿ£ë?·\10e\1a®\rðXJ\10DrΠ¨\80¢(f1ç\9cõü\aíî¹\9fy×7\7f.\94å\92\12¡Â®Í®ÃèÍs\8b\8fëÀãÃ\ eºö\91wvÔ\8aµrØHò²]/ù¢PÃ\ f\1d2¤F\ 1[9Õ\ 3%hÛ\91ã÷º«\9a÷É}º\9e\15`ãòø.®Ê\88¦\1fJó\ý+w\970¿ù)®\889Z$Â-åV\8f7Ñ¥\9b\9cíÔo¥Já¬\8e{\ 5q\99[Û7¿û±;dE³\9e\9bb²°ú\gfõ±hú\a½O0Ù-Ûwvî
+\ 4\94ÜÍäÜ%«ãïLaóE0Õú|ú¶Â\90\81\84ÊYV\89 ½<æ}½sç=ëÄXe\172üÒ<\8cã\12vL\ 6ÅÀÜÎ\8adæ³uÃ\10\f#>\9d¨aÀ\85óÕÍ\17âv\87³oÏ\95n«&ä[ý±ò} Ì2\9cÙÂL\16øô½\87hÂĽeLvÆì/¦Òä/ºÌxÃU
+ätM=¡¡\89ØÇv\83\rûy¯\84;±gTâõ\9c÷\9fg\80{6SÌ\96]¡Å\94òôà\97ý\10ôïEw\873u\97iÛ]'z\96G\ e?OV\85V~²/HëóÍîR·\8fõ\8a\0b\rx\9e²@ËULûÑ/\1aSýÖ0Ð\91\17\85åU÷\90&«ç\17­¦¶ö᩶6_\93\1f¾BW¾  Æ?¬::NLv½\eÜ\9f®á}K\96é^}1êúÕ\86[5üW/ä<»3ÂJ\v\HK÷Ô(\97\82Ó\90\evá2[\ 4\ 5\19»4ín\v\1dØ\9aÌO­w6ØZf)ü\99aG«øi\16\82\ 5lLwGÜÈq°¨{±ZÐq²S×*µçHÝ}J'µ6¢I\95u\84ºÊ*ëÉ_ÐÓ±Zs\16\7f°\ 4Ä    \1f7\92     Ôóv»]ó­=»µÊ¬èýthOѽQ¢²%\ f7Qw×;AN#Øc\85V÷ÁÚÝUN³Þ\92\86p·ne\8aÓ\8e9f_c3\e\83\851\93\98½\91ëòW}©¹\1f\1d\1f6rZ\15\9arêÞ½\e\94ªÊÉ\9f|¯4EØ\11\aùZ;äå6÷\båv¾1þ\83«ÑJÁ×F?̧ê\f\1fµÉ\ 4îRËƦ1¶æ\9d°\8ei\9eÿ®"Z9W\83\19w÷Ì!\8e\10ô2v/çg­¡Ø$­ÌdóÍ\844\1d6S0fM*0J\96\17ëËI­¯ûîhª\13Ìe£U\e¯\93F\8bäK­w4D9½<Z\11\85®*·Ûw_VT·'õ\ 6Û­¤[\11*~à^ ¾\1fÚè\aI§Ì\14YùÛ¬ý¶3ÏkãI¯\16ÃíÓÖ\G%5hUE2WöÆõ\83ZÜ4vtá\1aÌ`[ÏYÀÊܲ\1fc¶ 0\ 3\13,N÷ÇM]'ª§²V=¼k\1a=\10:êÁ,\8eÔ(ÓZ*g§û\95í\94\18ÙÝå[ù\91\91\95\r\8eK}º \8b\9fhT\12­+Ü\16¡v¼\16\9a\15\9c\13\9cs.\11\9cU6\11Æ\9fÜ?\9c3Ã)Õöñ!d\19P«}ÄWuÂ\94âàÉ\9cJåRÜÿÞ7n}<¢m=ýçLg\92\96\12\8bÆO\9d\18\9dQ\8dÞßH52hYåóU'­ZÛ\81"¥ÿ\8b|{fúr§ÏN¥\17\90×R\7fä\9d$\90m½Åd¶Ï\89p>'\bnÅsùù~Ýäó<ÿ­:¹Õå\ e¸Õ\8d.q«íiÈ­&§\84[u6é«p6à±í~8>Íu¼_F\ 1h~Z\9bExpà¦\9f\bÃb\89\98\86\8a#\1e\1a´éB
\aÆò­1éàG¹`\ 1$ߥ\10\93;÷ù×8&½\8aO]\1a`tQ2Î¥P\ 2q»%Ú÷á@\84§ië?-á{\ 1]Éw~\114\11>¿Û°\\85Ã-v\17×"¶&Ã3æØë¿\99c´u\98£×ì3G³=d\8eB}À2\8d^\8atß·õì\0\91èn×É»áêÕYUâÖ\r\ fyZ\8e{Xª²ý\ 2EÚÈ«\1c¬1­ñG\91ÎÜC\1a\84ϧ8\1a¢Y1KH¤0Ý\ 6¢\90Sû&¿x\1dʼ7\84j<î+\1dnCTÇ\e;þ\9a\93Ø=³9±µSîÃ\9cD\87d\84ÎX£¯\1a[¥åá`D=lãNõ²¡Eu\9fJ\97êÎ\95>u\7fêÿp\10{ÃÏ\ 3\17NzÔפ8M«ÈJ½´Îs\8e\13ßHÙ\1aQ2ý\13ï\8f"¢´êõ\8f4ØA\ f¡x\r/<~\88?\1c\rº\b»\1fí(¶^ÍË,G\e6s:\84\1e#\1aý:}\ 3\87\1e#\13Zqô-õ¤Ó®°\1e=säG(ɤÕÞxÄø¥\r\bgðúN\16\13\88\ 4«\84\13\84#C}Â!\9f½?\18Û\9fÞ \88ATü\9a\náqp\1eûðR¨ý,æ\ 5\8dA\15\13ýd(õ\84Ó¨ô\8eË@\98\ f®ÚW/L\9c\ 5WZùä\0Õ\ fXôk\865È"M~v-\89LºG\9b´uØ#¡\8f\14\11\93\13\9fáó=tÂËu7\93_\9dçL>hé.¶},ÛXØ÷ö\18c¶D,ôÃ\ 6\16Z\93\1e¶mÎSøI
+«Óý\85\9a\7f§¾g\99Ú¥ò £¤ìM²5çÊ\9e\1d;cÜ\15½
\ 5Rh$':]#Ãm\9däÉÄ-þF\19ÃÑ\89@\17Þ\rÇ3M\90_\8fÇh\9eB\96\9b¿E¬æQ\ 6Æ
+^9w¼\8e¢\£ýúÚàr\82ª®ÐË«\7fC[K\1eG\1eDb Ý\9dÒ@´Úc\9d}so
+ÑL´\8et=·\87tM£\8bÜ\eö\1f´¯\e\ 3¯W\rü\14Xy;)QÏw½Ðó·®\89\8aÚ<.\19)1 üO¼oJ0s)'\1fÊäà;\91s[\17l_Í\1eÐv¼¿"½éþ\85ôfX\16Ñë\16\99b(e\87ç¥\99\1d^ð´\12n\15ã,$/&ðøI\1ea§ß\85aÄd$¨4N\ 2\bS\95qfù&¾\ 6\18\bã\8a%¨TÎ÷¡Y\9fìÃÙ\ 3ó\a1\14¯s¡Ø\9d\1d¼Ò\f\1dºgþ\1aY\13¦ãj\87¤¡ÊýÍ\98\13<øF°\82J"Ô\90je\b\f\ 6/ì 4îhÇÈ\9c\11\0o.°»\~m×P>l~2A:\8c\ 5;!ÁAx=ó\80é\10\ 6`&í\00Ól7Ec\ 5\98\95\0¦_.\ 1fÀ%\80if\9e\80\89\vEÀTà>`
+äè?ü\16­¬\18\90\1e¦Lbè¨Ð\9f\r##¸\86%¥[«\19bq>\93ØÓð@S\1fS      ìÜB°h\99É ê¡òJû\87Ô\ 3Î\15¯wPG«OÀ.:\99\14+\14°'\8cNáÈ\80}/\1dÀ~ð\10pØ`øSnóä.Å\b\0\ e7xÀ\11X\ 5pÐf
+8x\b\0û¸\94\ 1{ØÎ\ 1{$\ eé·!û\1fj\ 2\9aÍúÓ°zr/\93Ëø\8fy[8D\81\84\88µ\ 2\17Q=õçÛ&<Úøz\a±Æt\80#ïN\ eÍ:Æ2\v\11%1=àvó\ 2<\8c@)ô<àÉ:\rxi)\ 2¾\905\0_ñ<À·vMÀ\8f\8dI\8aí    ð\13;\9bâ#\ 3~:«\ 1¾×X\ 3¾_@\0?(\7fç\b\0?\\1eÿ\1a\90ÿ¡Ú\132h¹\8aëç\82eîfúAëuådÔ©ó5fàÑon_ |\11Ò°æÚ\16\91ÏpÍfQÆ£ÿêÐ\9f6\ 6\84Ò\89\ 4BýA\ 1!Ê0?\1dº¯É@\987L \1cÖE ¼Ð*\10\99¨\vDõ9\ab­y\ 3b\9dȧX\1a@ì7b \ eÜ\ 3\10\87\ 6\ 5ÄD\f\808\1a=\80Ø.²)ºò\ f\ 1ÒÛäÜNÄÝÌ5}ùÖЪfíǦ¾ê0OáøÇ\14\8dÅ/¢\80\8cê\81\ e/IF\ 3§¶÷O\82n\ f\14 ^\8f:\902w\ 3H\ 40ÿJ¿\96Q\ 2R3©\ 1iùl\ 1é£'@æ6[ GÞ×\ 3\ 5ä\ 5ΦX\14\81|\8a\ 6@Áª\ f ä}\19(x!\ 6\8a\18Ü\80"ML ÈâW Õ\ee\16\1eã\85lÅúè¢É\9c¥t@¹þ\93Ð\91còݼ°ÂëÈx,z0\11t\9c_q~:´EÚ@\1aÚ.\90s}ﯮZ»Uÿ\9a|³J\ 3(\85\8f«VÙd&@Ž-P½ã\r¨K\ f\ 5\1aÇ(@ÓÏ!Ð\8cÞ\1ch^5\ 3´fÅ\ 4Z\\1e\0mäÿ\8cÊÚØ×\8161;)ºcWo\ ei3¬Ç¨2ª\ 6oþdi'j6<ÏòboÔE\a\\87Â5\14\80_Õÿ§Lÿy\8e\7f\90MþÙ\8d¿ÁÂ\8bâìw\98ÿ£ùî\98\13ÐÓ\e\19è\15\12\aúe«\ 1Ch×\81!Êó\7fKÈÝÓ}ò­\a\fe\7fÿß\98\e\9eðG;ý)¦?ÌÅÿ±öþ\172 Ïÿe´þÿ\91Oÿ&8Ìã\14ÏþóéÐ\93\14¥u\8aÞñÙG6\8f§>ÿ@\8f\8f§\90\ fkÓþÎ\11ü\8b¿½¯ïÎ\89¿þâo\7fø¹e\7fúî¡O\7f\86\7fåÓ?âîO>ýá'G~\8bÿ'dàoLï?÷ñ/¼AFÿX{\7f¡\bSéñ)®\8d\87µ\\17\1e\90\7f÷îÎö^½#5¸q\9b³dç\865\99áu%\1a³+Ñ)o/ÕW|½Ð\83\17r\8e P=sS±y:\17dz_Áþ$"ü\14Þo\82ìÏ¥
+ukkzÁ\ 6ÿ¤]\17ÿg<ýɧ?WïÏ\80ìWþ-t§-\1eÖ\82ÚÝ\91jîrâÜëê_høR}`¹óA'Èsý#r§³-J'q*~OÚñVt
+Geé\94\ e}¯î?a½¹·\8eÃÁn"\9c\96;¤#?¶Øà!n\88\89\ú©¹ÿaÅ­OåE\87³
+?5õ_éHø\9fvú{\15\ 2\8fO!\14îÎÊÕoXÍ-^¶¢\e\9e\ fjÐ>Å\19wxTæêô ¯¥ÕÞÚ3»\9dsF\8fÛ¹\94¿mü×å±Þ\9a\97Ï\9a\1e?²«\b\97g/C/Å\r.-:´`Î\9f\91çÏõËâ{Òf\89\12\9c\0ä§nF\95þ\0\19\ f\7f̳ØìÈý+àÿâ\8eøöçR½ìÁIL|ø /Åü\1e
+En;\178u½Õ\9fÖ*\82\ f_sÒR\&ÞBÙöÃy\9fé7f\9fF¿=³®ýþt¢$ã©ó\-&sã°\9b`£Ûe\1cd?¯11\97Ð\11½6è$¢:úð\1c!µaÌ?vCñZ\85\ 6\1dÅ\81ÿàÖ®f\7føi\9déöù\8c\18èO)õdû¾®èÁáÔ|·g{ký\¬·Z~¶\8c\91õz¡¬\17§Ù§¾xÍ x\93\9d̵q~¼²\86ô\98\98\8c\85Q\88ÎÔäàÍÌ\84ÛÌ\9caL/½¡x8}CN\a\1dþ\11\ f\94+>è÷\15aÖûô\v»\9e\r\1a÷AºÈ\9c\15;s/\1fw°M¼l¯ª«ãÿ\véý\11 \8f\ 4î</a¹õGáÝø·Vm)ÎfÁï¿IG\12\93¹r«\8f\89Ѷ\93\1cJÛñð\1c\1cV\83[í|\1c(§ç½¯ßn\9f^¢Þá\1e4xaÝ\89\85R]d\82r\9d¹Ë+\1dl!\99í\95\17\94ÛÄ&®µBzÒ\89\ fÑm\1asWbß<·ûß'½\9aâË1\1a·a6nt¬â¤¡BÚø\87è9aG?¤·y\84])¨ü9\98qö°\12ÜWwV\90ªÞ$ï\18êhk/\94áÙ/j\ 3å¨9½O[\ ezPßlv\91´+ÓÁf\85¯ÊÑ\ e0oÕÚ\ 6\95}\8b¾7.q¤µ\9e1\9f[BÍØßä\9a\92\94e\1a\9d..5Ô¢W\88úËn%\ 2â¥S·»äì»\14ý­æ~"¡\86®­Zèɳ$ijãÿ\8bô0÷\1cÅç\8e\8f\rx¯ëOq3M»0qÒ,G\85\81¶¬\89\9c\11={Ôd»(§\ví`g\99-fYõcþÖn4[î²ß¸\1f\1f³\86&¼×Ñ`\92;F\194w­\8f\16»\9eÅ\15¸6½Ö¿&\8bZNéñáây2BÜÌyÕʦ\10W©önV©½øk\85\1d\92b lW5¿­A=_~ݺÿ\a\97ýð\95Û\95íÆk\9e¼£Er!\9aQ\1fú v'\0\ f¾µ?#_U½Åvâl||%dSn'bô.Ï­t@\7föëÙô\1eª\95òH7\¶¸q\88?ÄEµZ²vU\1aóÏ\95zÜ~U8i\ e\aÍî\ 1÷o\18&úíU©à=¥YÍÓ{\99AùSj\1dÊI¾ðý5¥\89Bú%\17étKÈ<ì\94\90~¹ý\1fN*ºÀV\97ñã>©D¯é \93ÁjíÝ eÆRâ³\rÃ\8cÐÈzÜ>\11\84]\90Úì~!Cÿ\fËÕ\10f
+\95\88U\83à<\f¾.Õ@\82¢\9e\7fÛÎ'¾ÊÌ\17ÞóõÜ{\86ù¹x\0¢ße;´Ñ2ÌôÙ\92\19Å\ 5DûÅò¤ÝuÓ¾ÙÆ\rNKÄÙI\83¢SËò\1d'íf·\1d¦\a·þ¢ö\8a\ fpÕûf¦,Ìuý\9a\{\8dq×Ç\92j,ÏÓ!d¡ñ¡k\9eA"ap\8fÞÕíÉ\ 4\95¨#£A|¬q~73н\ 1½(z \7f\ fË\ 5ðj\96á\r?(\15iiRB\9fÁºè\19á¡\88\83äî®×¯¯WÝ¥è<áÔ"[vX#=·\8d1\16ÛW¤:·[\vêcËMͱº·EËênGñÿbÒmn+­\f2\9bíK·Áp\97\e¶ë]#hXöI«áÏ\84ª²Ý\ 5\1c\   æ;ððï\87ÅÝ{­÷py\946\8cå,OI¥\A¶\8aÞÞó\8ax½[w+\9fiÛ¥\92ãЩ\93¯\99ÃîÉmáT7.\ 5á\13~ì¶=ÈÙ
+üâ­^I²Í÷*®\9bÃ
+21-yó2ÆýåWî6\1c³\18\e\8ePhþ\ 5®5~X]\9buh²\r\88k\1f\19ì\aq\a\7fyõÒ©®T¹\96K\ 6\8aX\81¼ayý(\8feó\*~
+\9f¢Oú¨»é\8eYg¿Ü¨\ e\9dÂéÎ~³í
+bQkØ·\9c×µÛ§ÁØz\8aÓ¥Õ»]\ eæG\ 3w3É\99Y\13ò[\8cál\8f¦\81ÔÔP/\9d\92DÇb릭ä\92¦ùÏ\#\ 5\15kþ!×ü\8by¦±ÔC\v\1aóÌökíí\ 6N½×ø<§åp;Qä S"   Ï:²\99Ò<[»\17\97çìÉ­N³O§~"àB\f)¤}\v«\92­\1cÛ¦õ\1c\9c<ËÈ\Có³Å[f\12jC\13:\9aSc2hm\r43ºèóñ;óSnQ\96Ô\ 2¯¢j$~\ fÔ04ú*Ã<OÊá\8cÈJ\14/ëJ\14l\1a\7faÏ"å\90ì\e\vhÀAIç\1a\1eÛÇ<×\89¦ VªF\v\rÿ\8e\97ÑL6S$VìÕ9\84Ëo\92E!6\87W»S]\ 1«ß?c\16È@¬\99ltÍ\84\95ªkL\9e½À@ËË\86¾È_»zy\93\eëùª¼Ò\82§wRwFë¥ÖÀ\ 3W\8e\8e +ü¼U\96/\1eÚ\95¥Mg/ÝÃ\89 Ý\8bÕo³\96n{\8d´·Ú\8c~\90¥Z;\9aÍ7\b44\9eê¡Õ"?íº\97Õ\8a\15i}H{ùá4_\fö\eàD\9dÇžgJ{«ÿT\8eæ\bXO\13®DYÃ}¤wÞ¢t\93t/OXÚº¥|\9f\8dÒ*r)ÔÈG»¥îf\9b¡Êb§\99r\ã{E ä»|Ù÷r²Ì]\ 5©Û\92]I\93×mqÐ7¶¢iº¬hZbE4E'\12MB¯\8b\ 3¿\14\89\ 3˪O\83ý!Ó\9fÆ\97m¬±«ï\1cA\8dÂr®ÿÚ÷\85ÒbÐʻ̹õ±ïfïd\19Oqo«óÆ@\1fØ]Ç1\12h\95ØÎk\94\14sjm:×T¶xs\94\13GW\94ÆYo(B\íÉ­{s,ËÝåZêa\99«¤­¬o\97C\1c\92CNÌÔ3\ 5¡pö\9a\85®ù\99BÒü\8c~úü\f%êüô\85Ô\84¬J×\85,\83Õ&Ìg\92éyÝѦ\99!Âfõ\ 4m
+~\86\8b\84be\À
+WØûXi\8fúhLW\9f\9dîM'ß\99B\8djNÎj\1d\94S\11 \8apb(ùÚt%¹mõ-Y\81¶e©ç\9eCIg±\96ø>é\898lÖ\97bæ6>     \8e\bÙ·Eó%klrË)^çüâb\91\8eúw\ 4G\80¤\9câùuwsøå\9cV\87ùÛ\1f\8c\85 \81ºÔ°²\8ef\8cÚ¨´Ñ¶ý³n»uDÆì^Nx\eÅ5vÐ6ÅÉV­\8böJiºö^n7Ê7é\99éf$½ºÎ\8b\1f\ 6pâð%i¢5(\7f\9d)"dv\ 2ÁÙL"\ 1©Þzü\9c!¦<ÖÐwÜJè=9¢ý̳Õ\97¥±ôà\142\11T\9c2ÜÔË1\Ï.2\½\132õYÿ\1fzq5yt#¨ÝTs\8bº/ Q ãÎw¡\80\92¯å9GÌgs\96%æÞ:\91\85\8e*gE[¹}D\97\92¾¾¬Dë     N¤L>\ 57_ȦwG\83äËòTà±ÇEçVs²È\ 5e£Ê\91ù¨Å\86\95þ\90eäÏ\9a\89úâ\8dá\8däÛÞÐñ\18\91©t\báS\9d\ 5>¢T?\a\9dw(Ur«T'(\87TǶÓW\92Z\19\9a\89\9fùý<<dwu\1f¢i³H\9b\17Ö~\92{ô§\97kt\ f9Ë·ÐÝ\8a\9fõe) \å;öäóvkÇ\91µÖ\99ݱë7\e~²(Ë$2Í\1cmObø]ˤ/µE\89n±¯\1a-\9dù.uO¢\19¥Á«cÚ*ð\10ib}\9e\18\12Q Æ}\ 2>t_\ 4¼\98Z\ 4<D+\84\7fkhÂ^Â\ 1\91¼Ñ \8fõ·ï&T/Mªâª\16\96K\9f\9bá\9c«\vÖJ´1j`\87ëG9/og©¿0v\82»_¯¸
+©Í\98F3» [\13|O=PêBu\8fÅ\ f¥5Ú(ù\16649\84²¿Å¶Ì\89`\91\19×ó\88¢\15\11ÙÆ}\88ÏDu\83ç:ýW~©\91T\1e\1fö\vØÆNû±Ô,sÁ*OMÇ6È"ÀÖÏ\91\9fÇ\95u\90Çé©ß9ìíG\94\87\91ÑÏg^"É\95Qèô»_g\8a9Y\ e\ e,?òÝz^Å´QßsëUwÅ\9cXvNõ\94á\98\18\8f\9aK|¶oîðR}|Á1îúɯ\0\9dËû#+mâ\vM\19Ûf\976V=ä*\18\1d\15;¹úe0Ëqmô\826\9fµï%\80\8a\83¼\8eÜÌy\ 3é@í\ 3Ò¾ï\15ä\96-ø¨(\17ÿ\81\96:Y_£\99\f½)~\rÜè\1d鶱®°FùVÏ©ü£ý\91L÷pã½CþÀ²÷Ö\86zBÙ\ 51É׿}èüªN\8crQç¹@/9h\8bÆKú\8cJ¾óFîb\1fE:·\ 3\8dtî´\82¨]ß;´e=Ûÿàì\914vYPÀax\94\9dÊ°=·Ch
+\9e\v\18¶,\16¶cÊ\87\93\84\ràÏGû^\ 2ðç,\ 4\8déX;þrÂË82\v\1cY\f\f+\9b-rZm ç~\8fi\v%argëkøD=\9bÅ-1é\9f\96ù`_\9aå\1aâg\8ct\a\93\1c¯Öð\18YíáÂüv\85³\1e  \19n|O\1a\94«\ 6LfIϵ\8cwDÊ`#èMP¹Î¦\80êÈ7@u3t\8aE    Põh\ 4¨ò*\ f(¯í\0ÊÜ\ 4\80\12\ fu*Ùìü±\fzÅ:h\ 6\ 5m\eZ\ 6¾b9¥\9dö\85¿\95\8d3u!\8e~v\9e´Z»_\88©[8ä+\95ý&'$Î\12ÑÑç,\váÛ9\84\ 6T\1fÆ\ 6Ð=÷\0èÙä\ 1è9\80\ 1}p©\14+\15ÐG®\9c\ 2ô\89]¤Ø½\0}þåÜ\ 2úbW\0½Áf\80\9eÐ\18 »B\90\ 1t­Õþ¡zËU·\1eÆîzns4\f\94,\8d\9bâ\82d\e\ 4Á\93M\e¡ïëøCfý×#_5\8b\17ôÆí\ f\88\ 1·÷ðd©|m×\99à0_\ 2f\9dl\ 1sy^\0\1e\80ÍØ\19ÀâI\1e°"ħpLÀZû
+`m³\9fâ¸\ 5\ 6\ 1Ö\91\14ÀºH\ 3°êf\ 3XvI\06\ fÇ)úKÀ\82xñ÷«\9etÄmi;¼\f\v\ 6W
\1dB\16ä\81\95\95\ 5¼ ²LÛ-ã¤Ó\edó¡\96\ 5hçé=³£Jî\ eçØå\15Ô^Ä\ 1p¨~\ 6\1cã\\0§\ eß)ÎYÀÕh\1cp]'m\ fºCå§Cïs.à\1e\8d\bpOx\f\7f\ 6<ªb)>&àÞ³6à>Ýt\1f\80»Þ\86\80Ûö®)\96Ï\9f\vÙ/¢úÁm©ÓÄ\ì¬H\95×dIÄ\18Ü`Å\8f"\91ÓLðUnó5{\81£=\88B³ãh\93\85ü\99\95\ 1¿uÅx  Ë\0>Ö³\80O\1c\ 4ð+\1f\ 5üyH\0!\9f\11\80À\v*\10\8c\8a\r\84ò.½Þ\aj\e\bÇó\12\b§Ò\ 3\bg\84\ 2Âgã\ 2\11\f\92\9f@|\r_@¸\95\15 ÜÛC <\96é¾\ 3ÎüPÚ;ÐÁ\1e·\ec\9d\e\96ÚÒd¦V¹\86Y,Qc²iýLÑè³\ eóY7l0\99\9d\16\82\9bá\7f%è§Àý\ 4ßïaD§&\ 1±Ú\92ÿª¿\9b\9d\ eÄ[Þ\ 5\12äV\80$&\r Åt\ 2¤ór\ fdà@@Ƴ"\90\85]\15Èbg\ e\83\0Y®;@V\1aS »w\1aÈÅ8}[Ü\ 6®\9a\87¾sk&\19\8d\96Ê`ÒK\ 4êÓoÓ\9fê¨\86oß³rNË\7f
\19\16\9a\10õº«\7fK²Yk\7fÕç¯Ö+\9dÂÒ_qõ¿°\89î'ü+³ÊÕ6P*§ñÏA¼Ñ6@\15\8e\ f 6\e\ 4P\13É\ 6êêÓ\ 6êe\7f\ 4ZfC\ 3\8d\80Fnw@£\ eé[å\9a¾U\8b\89=£Ä·vË '©¬åÖi}\89MHï\98ïa\8a\94\8b²s\9aó3\91fÿLä\7f\Ðßbý
+ó?Âóÿ3bâßbr\7f\ 4_w·\ 1Ú\94¿\0\9d\Ã@o¹,ЯD\11¤£\84\ 10\88Å\r\18ÒèW\v\18r?\ 2\86Ò>\0Cõ        `h\82\v\f=?ú'\9fþDÓ\1f~oÿ\v\19\187ÿÅô6ö)î¯\9f|úÏÕû[ç,oÿ\12\1cþX{ãZ\8aUëÏúl}\84\98>õ¹¸z$yýð°ÖÕû}B%ðÝ9 ì\1d\896Ám.Ô¦¿\8c\86ÿ"n\7f\9fAv[zß\e\7f\ 2Zÿ\8a»eâ\8f\ eýÓPËÄßòþÉ\16þÅôþ\fÈæò_öm.ó/\14\1e\90/ówg«)·9£\19·Ò±è\WB±|%ÚÞw\11±VóB÷»ÝóÁØ}\9bµ?¡\bgG½\9fÄù\828vðÈ;*[¤\7fx\86\9f\ 4ý\13w\7fù\ 2\vå,ÚÿtÝ\9fá\14Íü{õ+þÏ-­\97\9fú¸Þx$Èø;ïywÖÃÙ\r«·7\97­T=\9e\ fZézæ\86þë$NÜÌñæ\86èQY\84ø¡\8f\87ôþS\8d\84½u\88ÕÝ\84ïX;¤5)oVz?Ü\10ɶ³¦gÈb\15a\adÅ­«Ú\9fà\ 3qÿ[­ô·ýYf\7f\9f\90\81§\91\87þ¯\86ª\8føüÝY\1e\89«\7fì²\17ºÝUÏ\\7fô\r\94]T\ e\15í¡\9a\19oç"ÛÝø¯Ì`\1d\82ëhu(\¿ÝÁ\157»®\961öØ/nÁã¼PvïǼÏ!\99Ù'¦±\99uW\98éD«jSd¸ô&eX\e\8eW¥ü{\1c`]zL¬\1a\7f\ 6\1e\95Dl&?\8c\85\7f\8aø\9b#(º÷KõR<\1e;Ðò¸·6Îe[º\10Ïuõ}ɬ"(í«\89\8b\v3\7fV×âì\13\19Ô\1aYSç1r'¥O«<Á\92Qu\1cÀ£h´-NÛ#z¹\18$\aÿþu\ fÂÛaÌ\92ßÊf(\9e*Ð@¹uÉþ³KZ}ýýIz\89]=ÿ¿\²ÝI±tÿ¯\94·9þ:\9f¹îf±·ÖQwu0\8bñBYíã\99uj÷¦H§9\99`\83Þw\185\ e2ËË\88\9e\ f\9f     ·î\80aL%è ÃÅù\81rNè~_JøÞ§\9bȽD[\19=h¸uº\13ë\13t\91)Ñì\94sÊ \83-\9bËv@l.­m\8dFZôédÅ\91ÔèÆÜý¾üáëR\8ddxõ\1fþ+åI\6g\e¢S \17\1dL/L'B¨\8f\89\110\93(·(\fÅíÔï?\e£¨÷iO»=ë¹\ew]°^tæ\85ã®\83Í\8e§v\80\1do­mpüJC­\90|Cñ¡\9eÉÅ\11GQÍs,\bÍXò\8cÆ­Û-7\94÷:\8aú6<¬\7f¦ö¶\9e\94\ e­\ eNmRqZ)üÎÿÁ\ 3\86wàti5Î\e
+\v\86³QPÿV6£\9d\ 1ËÃØÜ`ýgäã=ëA\93]$Áøöª\88h­­O¸ñ!$\82\98;rQ3\16\94NãÖÖ\87\rå©O¢¾¡/"\ 3\94Òã\17üSÝζ\1fµI)ÉÔ\ì\9c\ fç\15\84\ fËÔo´V]Õ{\95*q~ô*¡ìí+\f\82Ã1_
\81Z\r¢\85\1dþ\87kÅj\80½\ 3g\8es\v)ÄÉ)
+í¾9ÁÙÎb\8f íµï¿[Û\ 5
\88\1a\81¦x\1eä\1a*¼þ\8e\b"\83½¨uÛz\15j\93\1dêÕP\8d¯\87\8b\9cÛ\ eó¾ÛO/âδJv:ËÊÎ=\1c+Ìâv\ f\8e>\ 3\aü­Lù-5Q}9\87y^×÷;å×=³+§C\ 1\9cáFå\14»Jit\9e~Åûßö\87SÛ$?«sDoÆanXï[§\8bÑ®î«Tóz´3\ríѹEoL:G\ 3[JÛÿ\13\9e©å \8d\bq¦(T)¡¨Ujã\86\13\9c\90®\1f4æé\b÷\9a\ eõüv\ 6þNä{\ f\a\9dz=\84_\97ßeãT6/Ñ»\9ci¥g­ðÌ\8bÅ\99á:ÅRþ\16»Ëª¿v}µI;\9b!^tÒ±jù/¬\é\87ýD_¼\7fbô°óâÂN°ð´fg
+}\e\82ú¤w\a\9b¿\84\84PÛV7\8e¹¯ì\rí\1a\9c*~Æ¿Î\86\84÷X\r9O\97öZy8}\14ÊV)ç\95Æg¶Vrb³U\9cÝ\výbiÚ\9aº«Ühãúgps¶\92\0;t·B\17\ eÅ×÷\12(p+£f\9f\83çÜ\16\1fϼu\9bÏ\1c«S^\96¬\8e1.þ\87_LÇd½\0Ó>ü\98\ 4ñå\90Q"ø\9aà!9\rß\15¾:8ù·KfíwÈÙÒ{j\9bc9!\96÷ÒÄý|5\9b\12râ¨bYT\ 4w5)énà6\1dg{\1cúNØØÔ\vÇ̵]\88&¹¤À»òÂ\8e\8f\95£u\17Fo«sË\11æË­hæ\0½WLà\97GÆH\8aQÃ~è\96\ 1÷JE\ 3®[î\ f_Iõ»]Þ\9fËÛ¨ñh\8cºx\ö\eï`&\87\e^Å~ú®÷º\98Çò¨¸\\97¦\848-¡ª¾-æ=çâ\92ß$\91\1a
+Çò\8a.4\ 4H¶/cÚ²[\8e^²îs«bu£æWU·4~Ü3\a­ÍÄ4\1d|g\8cææÃÈæ{9}zÅe=§Ô<mñÊ\ f5oHB\1anÝtu\ 3\1f¬ï\90£á\12á.ÌKûöË`ns9´\1c\8eXå²pÎ{Ï/ßGIÊÙzöPô&ÎÒ­D·\89³[?W\85ãþ¶·¯\0yØrE\82­î£LXZ¯Ã\9bCl¢\9aæê`\9b\99\16æ\e\85\aQ3²=½­Ïôj¢çV³µ¶¬do\1a¾·\10µªÏ\ 4\95N\87\93_\8bb½0ê*\1c2y+\1c\9ahòiqvåÓ`ëȧƼ °Ç\833G²þm\01§~ÜÞ,\8a5\7f\82ðAû´FËãËâYôýÓÁÙ7\88E¡IõÇv\e+O¬\9e\14oÍ÷tr1-öþmÖ\8cq\fç\fÇV\19}65D½T\8bM\1dc'Emy:T4Âú4Õ-Ì\rTºhÍ\95CnxR¸\18\82ä³Tåd±{r¤öÇlIÊHºJÊØ\90SL\Ii÷Ó\11V5.ü\90\1eæç7ïÍ\85a¯©\1f\1anHÏ\ f\9c¯ßZH     ëyiçLíí\vbá<·\1e\1fwd\ e§ðÐ\84Xue \96qÐKÛè©cá"«ù¯\v¡\11C\94WC\82QUzkØÊ!\f=%Rçß\0Zù<8tåئÒm¢ï¥\8e\88Ï\13A\8býfÏ\16>w<\16\92îë$Ø\ 6\10\ 5\9b·\vBRvÿÁ0ì    }û\ºÄÓê4 \8béTÎë>ëA¯B¶H|Ì{!6K_û¨õ¬Ï禵#\13\ 3\19¬û:¶¹Ïµ@EwêvÀ\U\ 6/\0å°iä\14^\19Ñòù¹\13åx\81\9a²äñEé\8e»UI­\86±øR\ e\18 [\11\98þK°Ç[\82\9f¢¢Á»\8bÍ÷×ð¨?Øs\vrÊs\8blÞæQ\99ü\a
+µFq£sl\1f\ 1Ñ®Ï\1fx!¸S\11[Zd(Ø9ÂøÍV«Êδíp¦Ï\a\97¡\16T\e=5ì·ÆJ´\1e¬ä\8b¼>Ê-ä\17¤)ÝË\14,uó&.©\97\16/¾ZSU\1cÈ\97\82\bæ°/\8cÊRC(äÃ\ 1?­L\96<z\80nÜ"
+1\ e\a\1f\8d]\8f\9b5\96Bå5K¾\8b\fK\9e\8e\16[a_6[É],v­Ý­áKQ¿\ fûµâû!®\ 5§½å\ f8\83\9d,\h¡×kú\17Ó;\ 3­Ù3\8dlO\87ʱ\èÉ-\99\1dH÷Ya.i\m'\ eâîU4í\13\103ÙlN(\94pJÈr¦ÈOÏ5\83/Æ£"\9f+\80\9frëÍÈ.\87\97\829[YÍÏÌ\9e"\11¦¶OdúÄÓ\15ºqy,èÆ\8d¥éÆvdÑ'hjÑÇÛÀüa`\7f^ÛX}÷\9b!së\99^\81\84)·¦/3v×Û\MøüÜjë!?ûÙ®ó\85¾ôÈæºâ\9b=uÄ\8c\9d\99\b\85\1d¾âg¬pä\8bïÊ\93Ï\r\870çC³<\87o\1f,»©á
+[eÍ\ 2K\9d\1a\ 1\161ÃÁè\98n\16Ý\ 3-æ.0Õ\ e\f\81|ì¶\1eÙ«·¿Ï\14\92½hO\90=¯h\92\8f\81\97¢Q0(yQ4z\8bé`Ý\18M\8c¨ry\95\8cr\8eÙ\91N#\19f,³Ú¾\189é°Uk[t&=
+Ú@4ß×®\90Ý6[ÜrP\1fp\ 4Þ\9b²ÕörÃÒÊã;MÄ\1cPöÍÔ\17\ eÂp^\93¤ÏøL ÅöI§n*^¢Ú¯B\9d|\9a­>Ù\87À\86ø¸î\9b\17K@~PÄ'¤8Â\9d½\93Ã'\bn\10\90B¥ s:aUY£³'\84E\94óÀ÷\99Â@\ecZqc\8eÈ\82¼«g̳yýIæJS\85çâ°N\r\ 4\84Xv9ÂSbæà\10m:æ±!-\ 1}Nu
\96R©Þ\95|î7\1f²_\7f"¤ÁÓ\14     \80/\13Éhh\13pvÿírà\939ÕÆÑ|e\9e\9f¯_÷|\9eö\blu\84m\8c\14&=\8c\14?Y,\b6:¶Jö)â¥\96ÇV\e­uí\9ff5ê1¨þ|ænÝ©\10Öû¤\ 3\ 3\ 3ÖEÝ\9f\92\9d¬\94/sÁYå¾]\ e.@Û]æ0æZÔ\1d[5Hc:é\12öi\92\10pó0ǧ6¶Ç\8b°rÃÑié\93÷r\11\9aÏ\9f\f\8e\11\15«HV1·ë6ë¹\9aö\1e¡Ç¤pD\eö;\87
+Ù®\81´ÊR\viyñwn\r¹4-\ 5å\97\ f¢wÚ{\19îKãª\18hA\19³;\8a#F&aN \1aèDE¿*1\14íÄOk1çóp&a\19¯Ý§îé\18\84\ 4»¸\81çD©\81U\8eL7·7ùa®\9eq¿&ò\1c;\8ewèÉ\99_Ñ&\ 3\0\9a\18rm\ 4\1cÒ\16V&"ß\88JöÑ©÷²=-»Ëjïa\16~'²\ 2\9b÷u\r6\9fÈ\1d\1eÒ\1f\ 1~»¢\96Õ:Ê\1fDeè9\fô×Ã+\86¬ý\95»í~!\87\eó\90ÈhôC¹IÏ\97½\13ÜÞ`Áî\8a\991-ÓN\9f4ãg\aÏ\rËM\8cFA\1d\15+\8b\ 6¢Ì\8e½l\9f»$Yý\82.àOKÚ§\88\1fp"¯aØzÂ$41$\19rAçë³\81\90ѧ\99)#Î\f¬Ê§\a Æ\16\ 5\88 U\ 6D\97_\ 3¢'\11ÀßO\14°ÊÎ\95\fV8¨á1\13ô<·=,;\17\82\91­d\9f%ôÕ\v\83\14©ù¹\8a\85\8c´ç*AmI_\85Ó\84´òú÷\12À1vÕÅè\8eÝB%\1c4³ýý:\86íó®\9fYhµ\ 1¨@ò\10\90\93â,Åh\aÈ\1dúHá!)\8e\1c ÷\86\9db[\aä¡4\ 5ä\91z¥¸ò\80\\ e*\80L:\e@¶V¿ÈV²­;\80¬\8a\85\1f*]\ 3í\94*¼S*tUX6§¥\1c¥\1eGgH2ÃÛ\9d÷\9eÌ\91i\16½59|.g8¶çF¹#4\1f wÏèfM\ 5í@ÓÏ¢\ 56Z£\a¨e+I1ý=\N\9dÁ\ 6P\1fã\92¢ó\ 1t\1eÆS\94¥\14ç" ñR\vÐDf\95b\96\ 14ÙP\ 1\9dU\e\80\a@\1d}\15P'¼\96~[î\ füÂtÑvO\14\aÇ´GWÙ.\7f¡Ú\8fÞ6+\94\1a·\17s®Àg
+@i½Y¾lV¹ãY\9f#Ý×j\9cÍl¢\11\84\19Ì\10ÐÓE\ fÐ\ f0JÁ/\0\93\rv\80¡ú'ÀÈ·'`\1c)\v\98j\9f\ 6L:\8e\f@za\7f\9f#H·£=`zE\140}É\ 6Lôé\ 2¦q½\ 1&Ð\À\14àAú\1dhòCÙ÷\emçº×}³T¹hªØ\18Ò¢K&({¤\8f\80\1aÔÉ\aî\1d½s®Yßï\11}êlàI\93Xÿtèy\92\16ë\12-\0ËÏ×\80\eÀ\96?\aÀ6¾ëÁ\ eª\1fÀ\1eW\b\10\ 1¸\9c#\ 2N;9\80ÓÍ\bp¥û\14påè\ 68O¢\0g~J\80³®é>i\ 6\0G½Ê\80c ÕO F\95Ó\ f¥\90\18ôì$ \ 2\9dÑ\8f¦\fÚK\81Û½ç\ 4­ã\0ÅW\92\9c\ e\83Û\8d'b\¨;\¬\9dné=Ä\1dÿêÐaûþÇxüGõ\85\1e\1fÀ\93\10\0¼í`?\aqУ\ 1\9f<$À¯Y\ 3\b\ 3A`:)Ò\1f'\88Öç_ØÄ©
\ 6o\ 3\ 4g\91\a\82:O?Çe/@ÀzØ\ fνáõM<\87\84J\8f¼»\82\1f]5F%¡ï³¸DùÉP¹kÎÃ\10\vy 0VhÂ\7f\v\13\88ð\1fõù\7f4ß~&í\14ÏsÌ_õ\17Ñx *5\19\88Õ£\rÄ     ï\ 3ñ\167\80$\11c Ùã\13\90*Nî§u¶q#Å¥\ 5¤Î*ÝÝ]q@êmÒ\8f\ eòï\14/\19Hô÷ë(ÞH\8b!.\96P\8e¬°­*å\92³¢cbg>\92\91dxááü \98\1e\10\7fJò'û¢ý{<î¯Üûó÷þr&~Âï/gâ?á÷g­íÑM PË1PÚò\16¨\997\0*Ñå\80*¹>P\vÜ\ 4¨U"Ý×\11l vù\11PëL\ 6¨\91ósw«ýwÇØñ­\85b\86í\84߯:mÚFº5\9c\19Î<Ô¬\9c\vð2\ e¬?bø\1f\17ô¯8?­÷?kï/]â'øþ\97.ñOðý\1dæ¿`\87\9f¿·k<\80\ e\1fQ Wú*ÐÛN\1dè\13a\rô\1d\9eî{\90E` â\ 2\18(\ 6§x\18ÀȽ\86ÿ?ù\ 2¿lÖßÛ¿!\ 3?Iõ\7fäÓ_üíâú|Ú8\94¢\88§\18ñ)îÚóY \vÿ\ 2{;õ§>ëÄ\8fOiÒ{X«ùè\ 1\ 5·åÝÙC\87Û\9c£\1f·Ò9ÊÝ°\16¦]ýÇ/9éJô½í\7fÉ·?!u\8b\r\1f\vê­î;ÿÄÝ_¾ÀO9ý\99Q\7f.ÙÿÜÇ¿ð\ 6vúG\96îCëÇ#A\97à\ 1yû¯µ÷\8eT\97ø­tXÒ7,:  WÿrR.[ùj^ªÏ\8c{>\18YÿÌ\8dðú)Î
+\7fB\11\ eÏ ²9ôÉ×gÿ©¯õ}Â\97\e?\aï\ f¿\b\84\9fAvf½:êÏ\84úG\87þÏ#ûÃOîý\9dä¹øÔGOûaÍ!ÿÆ\r«#½ËVü\8cÏ\aõ³<Å\99íæxs\ eÇó<¿\1côõü±O¨ùg7á\ 6Ð\ e\89G¹mZ\1d}kè\r1l±ë\10\1aÈ«\b\1dY˳w \96â\96é,:Ìê0\7f6;ôÏ·;ût¶ú\ f?oì/sৡþ?]²Î²\ 2®D#\93\1f¿\93v\12\93\ruT¦'é /\1fÖnÂ,\8b\eÿ©\97Öô\88\ e\f       \97âòÓXt\88gkþ\f\9f½¹~|&³DøÌfP\aZÿK\95å\1e\13llÃã\0\89ÈѶ¼UGôF©&\11\83\7fg
+\13î¸Ì\ eÏ\8dMî'íþ¼±ý¾\81\80^bÏ^ÿSÊo\14ÂÕ?4öß ½énB­æë­\86N\97gg·ZÜÊ\97ÓüY¹?g\9fú\e\9e\136)½ÇÄxe;zÚhëö\84\11½è)I\84÷\8c\7fnÙYyp\8b\96ÕAz\9f5û}ùÑï}ú¹Y/1
+\87\1e4ê¾».\92¡:óò®Ò)ãé      Æ6çÓÏ\16ûçU@'\87Ö6
+vÿ_\1dúcO^\97êEØì?åy\7fu0³þ\ßÑ¥)Ò\9e\94Ç\ 1\b+£ô \8d$Â:\83aLv¦\83\ eÛY÷ûb|è}:\9dk\ f\1a\84\8f®\9b       ?]dÜ\82;e¤\95ë`ó\11Ù\ eòS®µ­¬\95\9f¤J\83B|\88È æ.v«ynM¦Mñ\89\9c\e\1d£\93\99\8f-¶ïæ\92ÿÁwß\9f"nys»söiuõUx's\ 5NÏÎT¦\ 6·ê\89íë\97öw\9a¨\aõêj\17I\9a\85N9ýÿÚAn\1cµBbØ\8e\ fáx\10sÇñ¸\99þió¦xÝl\1a\1de¹o(Ïë5ê\e×gdd0¸\9e8\1c^\87æ\8ePK\7f½]CÖ\8fj8¯\16\ 6!vØ\1dª\81°øv ªÄÍõ*ÛN\18¦¯:µÿp+Càr\0®3\9f¿ô¡7Úa\17q Ò>Ò³îíg§\fq¯Ö¶ü\ 2ñ¡rG\9açú\8blÜâ\17\1f=»/5Ò?h¡\9eØùr\1d\9aþ,#57GF5dÉ·Â2Á÷Blk\8cª\ 1cÏ«Ä1ÚUB¡\7f\r\ eí]&\88T\92ôÏ\ 3Wñcsëy·\89Øó:Eá]~.÷Bù¹\12ìÿ\83ÓeÔ½¬\1a\9b54®\8cç\85¾ÙÉ2íõi\ eÅ\rcumJu°i(·Á®þ\19x\87:4ön5d^\ 5!¶®çª\ 1Õ¦*ÛúP¨Ðç¡\12\1câ\8d\15p÷¯üؽú¾ø¾\86Þ-ÉÆ\9e
+ãýòsWü\8e\bÊ\ 6Û:\94ÒÆïS²m\99(Nv#½èÖ\99Ð\9d\7f>\e·|ù\10®\97iên~ìkÿa?\96²ÇÙ¸¯Å\83Ç\ 3\9b\99\8e7\15\1cy×Ç\128Ôr\9e¹\f½Âu\1aæKËï\1cA\95$««à\98k\9eü\8b5{ûÒö\8cx]æI\94_C\8c/\ f,N)\83­b\96Fa©X\82_Õ 8\1d\f\eÅ\fÖu\17ÛÌÔÅ\19aï¬\8f­·C\99\ f¢P\9bhZ\81uw¡}ÊÍw¶\10Ç_åÖºJgùÿ`C·ýÝO\8cîÎÃ\9aÚ¼u\ ei\9d\99\84\8fjõZÛ\ 5Íd8õÛ\1aÒ÷[o$ñe\v\99\95ß\f´)g\ 4ä\9cVáâ»8£]¤\98\8b\ 2Â]ò\9dï\95æâ£\89âl
+[Ó¡f\a·°\8f\90J\81½ÐMûÔr\ 6¶ðh/­vézµ\94¼\85\9a½ÊX4ÞOÁ7\86\ 3taX~>o@DYü_@¶°xÁÛÕ/ظ\1dnðï0*²Çe´\1a\9b\7fÏSÛòç¤OJ\13\95\9cH\8dKÙµ1(æ\1eöÔ%°`ëTãþµ°¿OÞ\ 5®xDì3\ 6\b[\8có\9cu\93xÙêÀeË|\16Ã\92ÙÏ%¡ñi\9e;F"Ñß\11\81\ 1uý£îæ\ e\90\8e¬tN+\93Ë¢\86í\e#uÕ\1f¡j`¢Â\1f¬\ 6\8c¨®\1aya6\15íy\7fTX\ 5±ô\19
+?§qÐrÖ×\9f¸[\(\9f±\e\8c쮳\9dÞ\9b\ e½\\7f\93,
+\11qIìX}-¬Û\92<Xª¨ÞÍç­\921\r·\953\ 1\8cäx\17\rXxiúäF::êª\81¶@£XË{\93D]\13ØN%;Õ\8f\12¾Î´Â\fK\ 5ùh³\ 3¹A\15²2¿ß}{\9d2?[ðr#{\14äè±æ'\95òeÒ]\9cË^c°+ñÕ=yÉzo¾q)åÄúÊÙ]&£BCGÓÁ\1dÑmXwµØ°ÔF¥g\1aãÚØ\18Ñ£µ\ 1÷Ó\11ËÔ\84_z\11\97³Ú¢ª}\9f÷Ô<¥Æjùç@V+ÆÔT©ü«¬ÔªùºÂÒn_nDÉJ\16Lî%µÆ\1dR| \90)v\17\9b®¨ùW jA\83ÿ\83nÒú\83Ñ\89j\8d:T7_\8a²C\9a«\b§Ö÷q\85²\93ÕÎn\15U\96\ 5a\16$ÖC¼tÌ׫\10\99àò®\1að3×Ö\8bev¨-.\85\85\86Ë\95½ºÉ\8en*UZ|\94=÷F\95Ú\ 5'\15vd
+r3[Ôd!½\9f¤ké\18Jò%ß\15{²û5À\88Úãp\17\86\86\94\17,°Òù±S\8aù±;xóãb\81ÿ\vMã~Hä³<l\9d\ 6\97bm9~²þãVÈ\940,wr8\81XZ\8f³\91\98\16:h\e\85\r^×sõqEó>§ïêqj\15Þ÷\94}í=Q꺼\95O\89y\96\9bAã%\8bä\18\96Úµ\19&)Ú\9b\15\1f\1fJ\11{\89i\v\1f¸â\vÃݱ-@\1c\9d8¼ð\88\fr\©\17¨\1cfpMv\95Ñ\1eì
+Êq\1c&âßÛó·å0"Ë\ e\86\9dG?V\9c\96\13VçsÆ\e¾(àn\89ÓѾɷ\859¼ç\87\ 6"ÔÚÚ²wª©Õ ^QêµRM>½Û\1dYôÇ\89ÔÞn\16\92ÒÍ\1eÄÞ;w\15õ¥\ 5\84\8f_ýöl\84\84è\91\82u;\89üD}\e¼ó\16ÊÜÜò\1a\\19Z\8fØUM:±Äi\90e¶1/3ôýPgègîÎÐ\87\rÃ\84È\89ý\83êsÃô\9dÁ¬×ø\18\9a]åF\ 1U\9e\98YðÏ\ fýÓ¡\8d\89\ 6\86ÚJÑZ*\1dôBù¬)\81\89\8aøì\88±h V_ø,êSÁ\16\86\e\ 1ºîÏü¤ý~ò®ËÁ<\8a:8Wö|\96ËãC\95]]ßE\96\1a\13\ e¼\ 1Ã\98÷¯rKG\93\ 2Dóî]¤âeT¥¤`x¦âQ\9dJÑf¨ó¥ÇÐ|~ÈtW\8aÕN?\9b³\82ÛL"Keyñ.\9c\17í\83ù9÷ç?\1dZÝÎå¶\1ckNURE,\10\rçà        vôùF\81ñ\93˧ͣ\ e\91p\vD_påCóÀ®ùö\95\r.³7K\8e>(³sh\8a©!\8eD\1fËu\8bnð×*ui³=Jz6Öä}\80\ 3RË´8â5Q\ 3bPôOÄ@ç\bâ\95~\96TgÎ÷\89ü߶Ã\0\97\8b'Óï¯`¢Hê\8d\97ÝÙ8{cr/Ï´`<\1a(Ñ:Û\92Ô¦\1e
+ö|îñî%,q\1eÕ     Ùu½ßdÉϼÇì\92Û\84a)hE\1f÷Ü\91nÔ­;-è\9dߺQ\97Ï*Oµ\92\ fG>²´Nv÷u\8fxs\9b\16a¶Ø\ 5\91\91\17/¼Ð\17h<kÜËùé\rÚáYñ\83ãY\12¡ð\82\8dQø(&¨V<\9d\1dÑÔ={»Ã]&ñ^Ö\80VöúB3¾:´ZCZ\ 3¹E>Z"\98Ð!\9f\ 3\89Ï®\1fn\99©­È2ݸKuêZTcª\9d\v\ 6\94¼ìÏÈGó°%{\12t!Þ]ìE\f55KX¹\98"2Ë\83\82;$ââÙ\9dßÈ\97ØÍ\ 4[Æòw\19\97NDnÓKÇÕU£³Êm\1aq\ eÃ\17+\12ó^Û?h¾\9aATå\8f¢ZF\8fÝ|á2\15\9ef\81Gv?É\i\94+\ 3IÓ6-!Ë\105\ e¯ô\ 3¦\8eIeê:9º¤n®¿Ê-1Ü\"\ 2¢/-|üÊ\ fqg ÎqÄ,oóóLÿ\9a/\8d·\9f<\16\92yÌ?¦w8Ñè\98¹êõ\ÉÑ\1dg\88Ö_û#Ê\r«\18\12ÃY\13\89³Æ\ 2i>\99,r¦\ 3\ 2å\9c\90@ëi\8d\9b\1e¦\ 1¿à0è\8e>J±ÒÖrv÷\94{\1aÅ\11´W÷\ 43\97[\17o(\9aÃq\8b[zH\9dÙÏâ
+u\83Ñ2©\ fF.î"\ 57\9f\aÅ
+\16T¼:FR­v.¬\ f\869\86[ÏÐÃ\ 5ìШÅ\7fs P¾P\83\90KvM"ñ<¯ R9ò²w\1cêe;\9bö>«\86\1c\92¶ K\rî/\17}¸¿ºdà\170ȬÊÛd¶SvÉÚ\86j\ 5~¦>\97]vNå,ózzèøt»SN!:\97z²ù\15!\85ì­×f«­[\9d\16\13·B\1aèËÃ'ãV\11[ç©\ 2z¬½KHË¿\ 6\88Lfê)äN¶[3\93\14ÝeVcwGøuF_ð .ä`S\1añé¨äeC\ 5=hd¦Ém\9eÉeýï4\11XÌ      \1e,\ 6\99:X\fù¯×ì\88g\8a¹\v\9e\99\96\0Qm\ 6¬WÆ`W,´ã+j"Èì¡Ñìj/__ðB\848jÈùG¿M\9f\88ìOÕ*>Å\8f\8e¼\12z|d\1cD\1e\93Åð{rª@ãÆ8\84²×a\94\99µ7\9dLIy\8fÀr\90[\ 2ß4O\80Èt?\80\80²D\8a\86\ 6\b\98\fSl§\0\7fT\9f\0\7fê\ 2À\8fl\ 4ðS\90¾]\ 12E\9e\ 1x\ 2Ó\81>\98}\ 5â"=L\e´Oq\88üRYTn8?Húå¸àËR6a¢±Þ!_AÒÀ§C¾\86Uæ£\0mRr\19Q¸l     þ\88§\12\84\ff\15@\1c¬/ªõ\14ã6 ^\99Q
+-=$:ºü\94Û\\ eJÑ`\0\89ÁV\8aN\ 4ȼ²\0$\8ed\0\99Ù«\80¸\8dZ\80\10 ö\13\19\10³¹ú\83\87"ÿ\1fºÎsAUmÛÖOp\1eb\88ä\9c£\80(\8aYL\98sÎñý/R5÷\gÝ}þ´9«,¡K\901>\1a­ç½lX>\8a\1ec&\r\ 6/µÓ     \ f\927\9b.yîx\1a1ݹùe\9d\14\\1d¶ð²GÔÑæeQ\85#3SJ;\ e\19¤üã²\0èÍ \14Ë©\ 1è\eÜ\ 6\fd\f\0Cµæ\80\91/{À8ú3\96>
+\18\97\90béx\80ɲ­XN[Àx\83ø\ 5£ä$\80Øtú\80\11'\ 4`Èr\160©¶\ fèk-\9f§GTÖyù#1\836g\84.îkoyÔ¨\9c\ 4&è®\99Çx?¥²-m\88W¨N\17U2t\vî3\97\10\9a\ e\e\r°Á¾Ðø\14ï/æm4\13\a1Öè\ 1\96_\8f\ 1k\82\ 5`kú\ e°½ð
+ØÙ=\ 5Ø\83Cÿº\90\12`\8f§>`O\8d\13`ÏnüÂE)üq\1fÛ\f`»nõ¯ûØkÌ ÏÉø\97ï\18Údô\1a¡¼\ 3û#R\88sao¹þ\9e\9aÌ\1f\8aËSTõ\ ec8s­\f!\9cHGñ2F]À¥_\ 3À¹Ü\18p-kú+ëh\ 3¸Ëù\ 4x\92}\0\0à\vs\1cðM*qBò\83\9e\vø\95Ô\8ce=\aüÈ{\ 2~,J\80ïàuÀwS{À×R\1càë^\ 4xÿ°\ 1¼µZgÛyÊÏ`\8f¾ªµ7YJ\9aW\ 3\98\v\93\86¡Ñ\ 5ß»ï=ò¤\8b\e\18Z²ÿæР\82^àÿÛ{\1c\8f.\7fèogü\ 4Â\ e\81\81\98ÎR@¤{\ 2\10K\98\ 5ÄQ+\0â\18íÅ2Üý\86MLÙø\85\vÄ\b$QÇb?­\ 3±\99\9d\ 31À>I£;Ç\81\9e\ 5£\1e\fÅy6\ 5\81/vH&õè§\89
+÷ú z\94yÀ0\9cº§\98Iþü[Édöü\ 5Ï\89çøÇn\Ã\80\84\ f\88ÄA\9cÐß$y"¡¿\aC\ 62ÒÏ\0Y\a>\90;A\ 3È;d\1aËà\ 6äG\91\ 5ò\93Ï\ 3\ 5¥§@Áh\18(8\95\ 5
+\91Y\ 1ù\1a\1f\16òugXëþ¹¤¾«SWÜ\82å·\1f\ 1ké«øR$Ƨk\8f\9208[¿¢)ö£A¿e%ñ\17\7f\89Ýx<Õ\7fä\1f9\13        úýë«Mò\1dòT\bÔY3ñCkÙÌ\11h\9d\14\ 2´ÉÂ\0Ú®\13\ 2íQ\8b\7f÷¬ñ@G»\r c\9d\13Ðñ\9b       tP®\1aò\ 4oÊó\ fQâU\8dôhìmf°[ËWá)u\94R»k\86\8f·       ÃÿÖtM¢õ\7fëH\98ó_\9fq\12+\9c\98|\13ð\9b¤K|\9d¾ÿ0ù~\81¯\81®wÀ¨zo`Â4\vLæà\ 1S\e\ f\80éµ\1eÀ¬¶T`ö&IÔ±\19\râß4Ê\120\9bÕð\8f-öo¾À\7fZqYOóO\97³$¼!ɾm\1dþ¸z\93¬Þ*óÛ\97Íy\99?ÍÎ"X/$ +¯\97\1fCÜo>  èÞ³»úè6ç£å\r\8e×\95B\83ËÖ\b¸\v;Ô*ç\83s\9d%a·\89$\f5!¼?\9còËPÿÀÝ¿LRD~\90j\82O¿ÙÂ\19Á\8b¥]û\93}\9b[?ÍIõô\80
+îí\9eÝ\14>·ü!\9b¾®Ä,v¥ZYêR~d¹óÁÌJga\98×Oaºh\9fäiÏ?jË^å\10QËöþSy\7f­½{¨)\1dwHçÊlóïFþ'£áë3N\²3¨_Ñ~\18ê×\87úßðé\ f¥6G>÷\80ò\8erG\82À¹åwQp¥\9aaý|Ð+ß\18\83S\98rúGm.\8eÿô\ fK¯v\13\ 1l·sùrØ\14_£Óº\92êÞV\87lÿ½<û½ôR^ÏÈ\85¶_
+óHx\98³OK\rfPoôm\1d6\82þ\91\95á¡J\92ÿó\9b/\10=#6õ¯*\1fö´ò¸®ØÝõ,ô\8cÛ±\93\86\9fûOá\ 6í¡ò\93Øe\8f\94¸Þ\9a\1di%L=mq+\8aæüY¡\9dÙ§\91öfö\15øÓ\89\ 6JS$J¼\1c\13\1f\80p¼rÓ½15#Æ£
+.®\86\87À;\ f\85\19\84ü\91êßBÝêwTm\18={§[Âu#óóø$VÙμ\88_\12\90ú¿84wMr\10v\13Æúâ\87\1f£ìÍOµææn\1fÍìÓi:ÍÞ®\9bIþu=\8d©ñæ>bç³÷PX\ f¡\1f«ì­6$ÿXe#¡÷éFÊ\1f«ìÁëzгÔ\99çð°\83/ÍQ; \9a_\ eÝÚV\1e\9fV\85\1f«-ö<ê\86\87\16½þñÆ~ݲÍÐ\98Î\e·Auú'S\ 2½\1cµ        ;Z\97_jinnÏÖ\ 4\8f\80:b§#c\10R9«¯\1d3^\14I¥rïÓn\85=(j|OÏ.2ª\8e:>Ü\98·WùƺM­\1aûV\85®\9eÂCµz\v\85SõÕ<7{PS¾\8dñÆ­så\eÚ\eÖë\91­æj\9fI£Q\ez¯IÍÁ:\8fê$\bͪÇ\b\8d\97[ñÿìv"_ÖùýÍ}\82éñN\86´ñòìÎò       ä\1dÖÑ7\11E"\ 4ºÙw\94îà\93\0mm\v\16Ùb7\81\18ÖÙÐh\9eë\91Û¸µ:~C{DåzdFõÚg\18µjNºÓ­AÓÉ°êa\93\9aåvUñ©ó¡\82ïðG9à\95tiÛ\f\98RE>\98Á¡Ë\ 6\18\ f\ 2á3N\15C7gIJÈÿK.l\8b\¯Ù£Q\9eàû\97Ô×\9e\8b\fØkkëû_GW(ìÑ]£#ï\8euóÕ¿Ô\86\99Å»:É.ãõÏ÷dÅ'®|yUz(ejÿ0J\15áa\97Ø\v\9c\v\ e-&\b\84\aS-\9e{jX\94?\99¨Ðqr\93\82\9e\1eíü(wyø\16nàùaÐýv\8fË;\fQÈCûÃ$7©\9fÑ\9c'eÕ\7fÉ~¤ç\1737\9e=÷ïK\83\a\1dÐTaçX\a^fV\9d´\9a½Ê<\9f\1f\96\ 3Z\9e\94¶Um\19\1c\9aÚ>\10nöµ\18êùo\bPáÖ¯À\ 5=UÁýç¸Ãø\16Ò\11ò\9fùDÍ;ÄÄÌCëC67)}\8a\80×=_\94{\1e~i/³\81zºf©§\89ºÛh£º\*Wu\ e\13ÿä\1c¦\ 4\1e\8b\95ïysJsѨz¨Ø]¬U$\9bêúð¨Î¸î¦Ìä{£àxGºÅK£Ò(\86m«UèX å?GÄ ÿ\99\11³¼#(ÛÜ$´Î94í=¼ù®\vy\ 4ßE³«÷\9aÎ\ 6\83\8bàîhð½\15áVv\9cã\1cy½àÔß\9d¦}±\ f#»E\9b\87̽:Leº\ 2+X¯pV°ú¥ûÞê·§\98\95Ñ\16ä\8fôÛGj>È\96Zý^÷e¶\ 4û\86Õ²¡u-í\9fزðx#}ßF¬ï¨3ï®Öå<L÷+ùô´ßÈ¡Ëx¼HÜúÃlI_,ÜÝâ²w«Mâæ\1coôÛitÔ´#y\ 5Ân-J¬­\16ºr¦»\19\99\19£\ 3|«ÿâêV¦_\1f\9aãÔagÂ\9eð1fèü{\9bÈÀ\8avA_:­\83¾tU4\96\fþW&Åݾ\9ed\e7\9eý:R¡ÞàRÔÓ\83y~\92\9dGÞJy5²\9b\94e¡T>ËtR\81[=¦jN3\ 5·ík\96\19ÚêÁøb»Ì£^ÚgLкZïÑèe\rÜ}ÚJÍN¸9®c\9c      _\18Å\98µr\8e\81Ãý\92^Ì_::EXK­\\1aÞÕý\93£ÔZtöTÁN­U¡xBb¹¢ñ\8f{$\91x\96\98ý>*ßÞ^1¥6yÒéàÂ6\8e¾3ÈÎ\12¾ëÖ\9bñÙ\1czd`w\88¶gk%ÛÍ<âó×úàå\9ae\aí\8e\ 5)û±\99\9d¾W&\92'\ fF~Å\\r<t?úJ)Ã:5íQÚ6·ù\8e¡5vù0ÕC ùªpo\84Jh\1c§\8aüq®rÇYã²\ e\a¶ô<\f\16RÔȦ¤ç±\8dHÏE\rNd 7 Rx1ãy\1c1Ü¥\8a\ 60\ e¹E\85\9aºÇ\1aѱï\95\-Ó\aûâ\17w\ fgfÖ\82\8c9       Ø\82\89ì\84\8a\81¿åP_\rò}\9d¦jSm»\1do´JçtR\ f¯ë]­/©\94*\16M\ ·YVQ*=Mî¼N\9e¬\ f¤ºÔ\87Zc     x¯\93è,s\88\98\ eéo\14\980Uµ©0Õ(\10\8b\ 6\8bé²ù#ÑH\9d\14\9b]§(\94«Õ\16(¤`lï1âvì´\ 6¯N&\93aªVzß.\98h\88¸\86¿]eôà8Éj;i\eh\ûPS\8f\1eÞUÅx\18ñõu^\1aÙ¥¢\³[ù>n_änvù\96\rä\ 6\ 6NK\19É\94ÅQ»l\8b®vª\bÓ\85:\100rtà\17[     æIn­sëÓmÄ­ÏË\17O\12PúG
+\16\92î¡\1fÏo¤0êûLaIj:\9fü\f;í²üh5±\8dÉ¢m¹c¸j,>Å\82\9c]mׯ[êqãÛÊåàç\15Õª\97å\a\98\84²QÚFÒ\9bùL¥þ\81ZK\99È>I)«ü\10ÝQ\98\12áÒ\96\10rûgBn±ºlñ\85K¹ÈmÔ}\97+#\85\1d»÷¯\10Ëo
+
+sªÔ#\96ß5\9f,?\9dClõ¾ú\91Î&Íåk3òÆ\16\1f\15ô\95+R\83­síUF \876±Ù¾¢\97i³ ñýùר¬JmÇ\92\1fæ]\93\8d5çI\ 3\86+H©\9eU\13Çù°+fñÉH\98\ 5ó¹\90W\9e;\ 1{PW~ÙÓÞ|Ѭ Üf5á¸rð1Øý^öYAh·\99f+µbdµõ¡Û\11)ÒZFü\8eÓhÍfot»YIÑ×S\a¢¯ËzªÍ÷×Ùj\91\9d0\85÷áõòÊ\95æ6ñC[ÙB£mPø¬¢ <î+×MÇ\95{>aJ¶²ÐÄñôî
+³å1/äÃtYÀ\15\8bSëË\ 5x*\17L¸-ÖYqåÓáı!ôdkw:Í
+]\8ffB,R\19yùÉÑ\1dÚ\ e©gu¹ Ì³ô$?áU \87ê=$\87ìùB~*V\8a2'N,\1d\1d\84×qË­°b\85N|æñj²µEv\93ù8úÈÄË\99_\ e-7>¾Ü{\ 6®8¾/ta\8eUU~%\97L\9e\9at=®Âõ\v\1c{ÜÕØCãÕfë67dÎ\13\84\9e·e\14.ºÒ·ã\11к\fpêy³\12×\90¥\87\ e9\|ê¤S¬Í\88É.õ P¾ÉâóU¡B ÄðLx\19\14üȤA\80¦é«v\12¾\9dÏ?\1a\ fWÞ°ë\fÔ%\86\ 6\15¯I\13\8a¢]Ͼ\14O\9b\1c\ 1?µ¾\93B\9e\862*Çq\8cÊ\8a\19ÉfÂ\8d\91c\94r¡Dßµ~\93Ö£Q\97zYÇ1ÕO\81%em\94#\ 5ÊÁ\93t\ e]\98L×ï\1c\91K)\16¾ÈvÊx\ 1eÇغ0¸bôV Ð]\ e.bôÌú&\bÁcõÁÖÌöGê\13úa\ 5Úé\82稳zst\16Yÿ s\8e\80CUáó\15ÙÒV¾è¹´ÃÓvÃ`\8fºª1Êå$Ó\ 6|5©~ííRàüÎ\93£\16Y&]×ýÆ\7f\900\í\13ÓÙhF`øb\83/.é+^h\19)lý¨RX©wÑÑ=P\8a(ïNúÈ    1OHcþ$\10©p* ñvÙ!\8d°òF\8eçÎ\aåñèSÃßc³\b \ 5\9eøÌm \1c¾þ4c\9dZ\ f41x\84¿È<\1aú\82¿'\\8eÛVM¦U 5ê\rÏdrôi*DîÞÎàË\/\8b\93Ë\9e\8fm\8aË
+V¦\1e-\8cÙ\91\ 3tßu\17hÍè\1eQþ}|!M\aÃ\109]ú\1a`àëô\9e\87ÛùJ\ fÖ\bü\90~¬çXÚd\8bñ\14Á\e\8f®÷\81Õ\9dÿ#\15ÎÓ4ß[\14ÐÄgnM\95h©ï²£\81ªìö¡lÝ\84\8a\98\ 2O¿_.sE\v\16m\8cáï!@\8eÍ\81B`wMÄX\eWQ¡Ãf\90³.g\91æË. r¿V\83o\99q\aî¤N#X\9b\90kXÛ¶îé\88[¦Óæ\89á¡O³ëBööÕHMøÊ2\85\84Ð\aÌ\95\83\9eBÊä8\96¤×wj\ 2¡o\b\92\89wI¹Ü\94\IÃ`ûu\1d\ÌB®²Ô\8e\87þPéV÷-Éõت@ª\95\ 2{\92/Yº\97q3ä¸wÒãQYSÅÊoVBÎã§\f\1f3\1d]\9eNÚjC9høD¾T\1dr"¹\ 1¥­|/5\ 5\83Y
+u7;àÏS\ f@øy<\96\87\ 6\88\ 2\88¢3\a\84\83|byê\80ÐøI,\97øï8\18$\92ä³dOø>\9d\19\8bQZzKõ*6¾\94Cî¿7m\11k@U®&X\ 5FÓ×\1e\ 5eU\9bÀW{\13ã0[EÂ-$ÃúᬤÁåf¥rù(\ 3HÚùJ\98\ 3¤r®\0ReÛ±\94DZ\9cv\80Ô\8cW,K\12\90º\914t"õW\r\90Æd        H!\80\0\16 ¥é
+\90T)\r\8b'\92_æâcZK\ fâ\ f.f/I*\8bò\88çF?¼\9cU·U&>Í\ 2Ê!û9\82\10I\aã¦Ë\fÒ*\16¿0\ 56<V\87ÆÄA\ 5ËÚÐ\ 4ägâIJõ\0E@E@\89f\1dPÖ \8aå1\ 3T&s\8c\0eKL,k\eP\8eß\ 4\94+l\ 1\95Ep@i§, xn\a(\81 \0\85[        \1d$?\8aà\1dÈ#o\ fNyÈ,\8eì«v\86ü\8dl÷2#\81Z\94;lX;4¨á\9b(\11\ 5¶_Àx\95ô\10u¹tÓïmÓ\81\10\89²\05[\19\80Ú?ãµ>\85\91b\19Ðl¯\ eèìµ\93\8a4\ 6t§µ\ 1ôäu\ 3ô4\87\0º»\13\ 1Ýór\80\8e n,\9b\13 ûc\16ÐÍF\0è`x\0´»\95ãe°\ e 5Üvoó\16\97ñ(;mlKù»ò\\88\eÑ\ fÕ      \17_\1d¿sO:£ÌC¢°E«èiT\r\10­\97   Ò\ eõ.¤üF3^MÛö\0\93ê\15\0#-¿Ñ\15§
+`\8a|\v0Í\\ 4\98åh\ 2\98Óe        X\?\ 1V\18~\0kÑT,\91\ 1Ø\8cP\ 6¬´L,\8a¬Üx\0V))\80\ 6`\91ì\15\99\e¿\9d©%Þc§\ fª¼µ\80ʨ\16~Ø»4-\13;\9e7\98\19=°ì\ 1±|Ï»è¹O\87pôX4ÒéUµ\ eJËT\Î\92¬\ 1\96Ï\85ÉjªÝί\ 1\8b@|ü\ f\ 1Ç(sÀ¹á\ ep¥Õ\19pcü\ 5¸k\ 5\ 5<\ 5I±Ô<ÀÓX+\96é\1aðp!\r¸§\9e\ 1ÜK\e\0îd¦\0·\1a\95\ 17r¦\89|-ñ)0\95\8djCF\95Ì\14y
+e\9f>1\11%­IB-ÏÐKg5\84\a©`\0å-ô\ f\87fÒÃ\1fúÌ\83Îò×xì\9f·\80¯?w?è\97\7fÉ' på;\10¼m*q\10w)\1c\b»2\ fÄôÃ\ 2"S(\ 1\91\8d\17$²Ã3\10¹\80\ 6"¦ù \9e«¬\80\b\f\ 2\b×(\ 4­}Nr&¬e­$kZY#\13\ËÞUñNa\á\845óË\1d<äå/\87\86üömõ[VRQR\87W»ýæ\1d'Ì7      \9bH\9c¾IØÄ\1fðûë¯\8dx  H\87V\ 6È\1c(\0¹\12\81\e×±\1cR@Î×¾3i û¹\ 6øy$ÈöD ;Í\ e\90Õ}\1aȬ!\18¢RÒå©es¼TÑ1\1a\11J\10.\92£\17\92\ 1Ò\ 3*\9c\96·_\ e\9dÔä°Ð¯çø¯¿\171\92ÓóÇç\9b\9f\88\89ÿ¤;ü\83ù\86\ 5 
+x\v¨³ñ\14Ä\13°+P_p<yE\8f9 ñó\11ÐÌ-\ 44+þ\ 2Ð
+\97      Ð\ 2\8e\ 2Z   ñÕ\ 1ßýÞX\11ÙROc\ 1:\17\88j°£\90÷VÂÓ>8a?\1cú\a\86'e%QÇ   }þO\9cð\ fðý\9b\8ft\89\7f\ 2ßÄÚ\9b0ß$Óáu9\ 1£ÚJ\ 3£§«ñ\94\88­\ 3ã\ 5o\81\89Á\140q¢\fL\91Ý\ 1SÂã\1fe¦üÇ \9bøOEä\ fõM\²I\8b³$¼¡WO\90ª\r\ fc)lþ¸za\10K\ 6ÿ\13â°V~\ 2\19p\1fC\1cä\1fP\90.ݳ;´þ'\0W\19\8eµJ²oÏõÔ\11=\9d½\95\7f\92\97fÿx+æ¿H5  ½M\18\83ë'dà¿g´&\99\ 3I½_,ý\13Þ\90dßî;    \96\8eGÙÒæ>!±Ã-¿\7f\®Åóþ~)ßgßû\9eç\831O\9d\85Á\1c9\85Ð\9c8Þ¼\15{ÔâIÒ!"ÏÆ~ÈÞ²»\89ø\f¶s\r   7\ 1\10
+¼|­êDM_\9eKË|\12\8a\90ä \8c\ 5\9f\7f\85\füpè¿õ*è\ 3ÊÝ\89Û\9cZ37¼òR¯Å\13í^Ø\ e\13\8aШí\87t)ÜeOFg\8bw°Þ\86\8aÞ\835;Ú\8fVux?[\86ørµ¸\ 5\9býBÛ\9d®sótú¢¡\99}{¢Ó\89Áò\93¹m[\13|²¯\8f\ 3lw\1d\12\9dÐçÄÆ\9bdÊ&\ 6Ù®\87\99·\7f\9f¤\81Úý±:j\93önoo\84ýv.|Îë­1ù¶ÙY³\83\fÑ\11¶Ð6\rjö©ç¸éDå\85ÉÜÄä     >Äôq\90\86­Ñ6\a»#v   ç\87õx0:8W\98Æ@>ª½~G*Ì¢Hkì{\9fh÷î9)\89éA\13±ÚõÐç&©)a\9d\9a¸e[\15ÑÙþ\r\19H¼¼\89\ 5u?$¢Þ\8f\19Øþ\fj|\8a\93üs^\1e\a\1cmÝs\7fÄÎ>³AHÏ\97ý\ e?ÙEÏæäôc\95µ_\9dïü¦;É\84\9f®\97\1aÅ\ 3¬ì\bïàó)Ó\ e\88\85ئÖ/³Uaé|x¨;õP¸DÃf¨~ö\8d[ÔÁ\1a\9d̸ô¯,ÙÚg~ê×\1cbÐK\²ç\83\9aZÅ[\ e|       T\ n\8f\94\1f\9c\v{"zÖ\9bLo¨Ú\wbÚJgîØVÇO×ríU®Wnm\8bÍzx¨\94[¡p,÷\9a¡T\1e6ní⤡=\8b\8bú3ªmê\16h\1ekC·}«A³  ¨Æ\1f\9bH\90ê\9a\95*>StË«ø\8fÊ\81\98[\94©k\95þë\92ý\87Tt¯\9c\98¢·ùÓ¥1³\8f¡\9e\10ÞÞ'ܼ;~êyn±ëàÜ<×ô[ã\16\8a¯\86vÏ|\1f.¯GF\8e¬\9bï\96Ps \86ZõÐ\92Y\99\17JNÅ'[ùòªÜ(\96\ 3¶_-mëÝF©".ºÁ¡µ\1e\ 6Âã8/\9e#úXT\80ó.tÜ>YÐ\11T÷#¿Rò£B~å[T\8dÍ\7f¶×/LIþMÄ·èTæ`Î\ fýÙ§²2\aa<\95H oXgÀªÑ\91ÝImhm\ 6UdÖ\9eTðUy^\ eèÚ¦´­öÎ%ö4~\ 6\87æ\ 1*\9e;+´\18êgªpë\9f¹\82\9e:\7fç\9eþsüÔüÈC2ùÏ\ 2Éæ\87\ 59ÈC\e³\9eóØb/\87\1c\96\vÏ\97à\8b\87_ËH6ЮJ6Чµ,õÞ^³Ô'dÜí°Î&\12ÿ\18q«zè\8c*«µÔõv\87\ 5+_«U-]H\8dË«å',U8§\1cÔ%¥V\94\9fDXèXhÇ\8fÜôÀ·`q\9e\1fæõm\1eZY§Ü$ðï9d翽yµ\91öðS\15Í®\9a]*\eÈ\vÁÝvÖª[Ñ_¶s\18\10\ 5§nûß\91\8d}\9eL&v\98c϶\82\rÑL'\10\8c\94\egt\96xÆâ¦\7f¤S.Á      \8c\8eúí\a\136¢Ï£\ 6sÕU\89wä¨ð\88\87u~\ 6\1f\15ó£4\9fÍC\8bk.ç\91×¢7/_¿tÐÃ\ fï0\eHpänÛØØe\9fØÜ9DüÆ©[ÆÑ>\8f\8c«\1dº¹\97­ÀÍtæ6\e\13\19\1dßðÖs\r\e\96ŨysXk4MG\ 43\13ºTnƤMÐ\86ç     5\ 3åá­\81\1aÕïéi ¹Ö+ùaÌd#§³\8c§\1cõ\81é]JûÚfZ0SQ;7s¦e\8fl¹li<vÜÝ<\9bqw¢\9du9\97õ\1cÑD
+v¸\12\12æ;\99nº6ÌèÓÞÌêóãµe\9dö_·]|6=næÈa\81\99\9e
+\88\96Y\ 3=õT}Ñ|çt2\9dij¥Ühª1¸xSw«\1d­VK«²Êkã\8dÊ{üó¯\fÚ*j¶\ 4j\85Tó]p*¶ïåI\1e±\94ï¾É\96\a\99ÀiF½¬Ývq3ó¨ÎÕÌ\83\9f\e\99ûûàXoh\95³2Þ¡d\8e\8e\9f¦é6©\9e1½QC#7±\17\ 6æ\15·ú\12m\9fu²0xj\eò\90Ö\98\ eD©{]\93U¾_s\95&yý^¤åkÅ\98Èmn}\91\1eÍ\f\14¯"õÜì6\96ñMꩽ«ôhÍn\91Ý\1cé\8dgÁK\97+dÿà\ f\8bÔȣ\13êp1\13©¶kÙË\95a\8e·\8elf¹4oº/E7f\12g%¸{låô"â\95´M½ÒÐÊbÔ\8dG:Û\91º\1f=\17ª\0\7f¶ÊiN\9d\95f=ÿ\91¯\97:*kê\90\95\9e\bnI¦\9f/\89\83õ¦/B¬´\17Æ\87\13* Ò"/ öa)d\87æ%\91/\1d\1c\9fíK7ÿR\95ºÃ¢© \8c\8c]\1eÕÎC·¾\9c62/ñT´Ò8î\18óIÇÐW\ 5\8b\97\1d¯SêTÔʽµ®\1eð\8b£
+Á=¯\9cU®ªÈ=®)ßL«'wðúDÖVÃ/å\90"z²\97Ìûç!\ eM\ 2\12í\8fG\v\93`¨   Èîãó¾\90ïòøù±å\ 2µ\9c樧ëp4\1aÎ9êu;q\81\ 1\9d\13iWܽX\9d\7fv ¨\8f°­·¶\86\ 3GÙVëÖH\1d|o}\e\vùéètÃÑ5νHj=_bUáã²JèTUù6­\9a²Îw³Òó´\ e$Ë>Ö$\90\ 6mq¸\13\87¢SuæÂääo\ 5¯Ù¹ð\v(\9e\10øS\94àÖ\98%st1òØÊ\9dúÞÂc¹î`ÍÔ?B\8a\11G°Å\88ce\1aËäÄÔ¯ó\13s\94\ eç\96\98ï    \95Rºó)\80éi\93­ºAß6¸\Ý\9cö\9a\ 5½¤Ïmõئ5åR[H\8a\12fXYï¦()z\93¢\ 4læ{ÿ&¾0K\191]Éå\ 5ïU-\vh¿Ûà\17\85]\8f/\90¯1Olé\15\94#G¿ê/¶\9a\99¢Ìqü\12\98\86ç¹ôe±mÒ*¥-¨neù¢\f¾§Q\86°\eRÝzp¤îóÊ\8fÄ«ivi\93+soë\95\9f.\ak·1sú\99\94Ä×\8cÂÐöµj?²\95Ë3­ÉÝ°!Jý*Ã\8a£Â\92\14¦í\19+Äc
+\99_Ìß&O\92)\97[_¥"Wj»5\8eѪm¶:ï\ eXÞ_\7f\9f\8a`NÄkÇHeâF_µ\12L«Ñ\94£z©t\862Æa=¾ä@32Uh>\891\95U\88\1dÄ\v\14\ fdfd\1dÉþÅ962<Î\ 6W\88\96Pyå´>\dÁåTU/ÝÙ¼ÚLÕ¿      0       \82\96\9c\99+#`Ù6É\93õ"Å\95.M\91Ý»m\95­Á³\fËÏN9¦)¼K\8ct!\eôµ¥vé¶[\9dÐ\1a<ÝP½üñB\99\ 4\93"\a­\12\1ek\93ÈZb\85@Àê;\86ÆóYó\8e-\17\90\88-ã¹\b\8e½ï{|VC\ f\89ÔaéÌ\14{Èå\91øÌm\13zõLl\7f­j5\ 3É+í¬oKïáN\13³\98!òËò\92áÊ¢M°5\17Ç\98ÓÞä\99ø\eá;[£ÛC[§5§ìPOz\ z»}\952«ï\16\90\ 3Ò\1ef\16$ä´\8eDvºxás<\85ãùsCÇVÊ«\84Q½`\84\96Ïç3ʶ&\1cʶß\1d´|[ìÑ-µÞc\94\1d/«ðL\9eñ(Ø {ËÖ
+ì2cëë®A        \9bªÚì?ór/R2\12\94\9ejB¾È\8bÜæ0`\98\12ô͸aÔ³x¦(óö\11È¡þ\94I\ac-\12Z\9a\1e1)\16\ 3Â\93\a\r\99uq_\7f$\e\r\7fó[,(\96\1eèv;CÑJ\95\91\91é[@ê¡8@Dåp\81ÃZ\85\85Ãú²\8d\88Üè\80\88hw\8fÔõþ¾Â\ 2\87ô\118wuåÒsaeû£nÂË\95\9btÎKC@gD$×ý\9e7|q\8b\89ñ´¬Æз\1eERQó\80\93\8e\17b\84×\88X|\91\1a\8añ4m¢bkö\90Á\82Ã'\87Ñ\r\8cî2ù\16ZMõ\86È1»\"\r\14» â¢\98\86/\85«\b·¨B>}¯Ü{é._ÿrè´\1e_,ÒúºXKwIw\93¾g\1a\aXi´\ e%9wÇrÅ3sI|æ&>.u\12d.?Û«¼\ 4\8dh[À\97U\8d«°o\91 Ke\96zá8E:\93       N }\1fÅJ\9aB ñ×Ú÷6\11r¼è"ÒhyZ,\91\83Hî¹\b_\11¤\ e·æf\ 4«~s\9e~\10ûcº»\11\0ôfk\f\94©?l(%5Â\94[\ 1+0=öÓ)\98ÿ\ 4)XXNS®Oî ðT÷ÅH\1e¡\1e{K\92,2ð>3hÄí$È\ú<\87y\11\85Ó6\1f\14«:[\8f\1e\12Ýy\149rä@4\81¾"\ 2\15\14åë(\ 6_[\ 4\ 3k0-¤\1f3QI÷ò\8e\ 5½W¾\a\r\82N   ²ém\98\1aW\9f_Ïm*+È+0\vËW\80Ý·\bÀ\1eE\r`O¦\1aË}        °ã4\r°Ó'\0Øy?\aØ\9a<$âO\16\19Ø\r\17ã\93åM½\99v\14¥Î?yù,íp\ÇÕ\13ªÿ½ã\91\11²<\91ë<\19¬t\r\b\94\7f*8|½¤ñtï\81²\90½<r)¤Óç\ 1ÞoH±¬M\80\ fÐ\,^5\96y\ fàCj\ 1ðÕà\ 6ðµ\80\ 3|´4\0>®6\0>Ñ7\0\9fÒÉsÒxÏ,\ 3<Êì\0^ïÞ\13É­Õ7d¿ÚÅ£I,¹©zi\91\1d¹/\9bU1\aB\9f§O\17\87i5â+hÿ±T\88\99¢       X93g\903âSp\87\10Étä¢$\94Æ^, ôÖ×y\ f\bo-ÅrQ\ 1Qål@tëÅX¶\r@ôØA,í\r "ø\19K\93\ 4D\9fÏÄro\ 1¢99\0"\f)@\94z\15@\94\8f×x)<\94\11¶AÆõ\85\83¾»¥¿<MUU²+§ lý\a\997nk\97z\8f\19\93\98­z*¶å\ 5     9·W<Ü\89B.mÅ\ 3ºT\ e»S\80\84Ö\f é´\ 4HEÑ\ 1éø\19@\ 6Ã\1c Ãg\19\90\1dË`\ 2È1\9c4¯'ÇÕ\ f '0\eË(\vÈ©ß\ 3dO¸\0\ 4@6\98\8b~ü'Å\v\rH{G9=Þø\98K\17:h'\ fÌ\94\1eÌGbî%Ô9\ 1w\8atï8õH$Â2ØvÚÔ\91\8b,¨        \87F\9e
+4ZG\12X
+"\ fȳ(\0
+÷d@    \1d\ 3PæÁ\ 5\94\ få\ 1\15Åû\90\9a7\9b\80z>\ 6\80F3_\17òô
+¨7     Ç2\8aßñÑ\v±|\86\80ºì_\80º.5@m×   \1a¢f\1c\ e¨ÞPKÄ\86(òclv\9f£&sèB\1a\11_¾RMFOë%ÒkwóØ®\ 4»HkÐΤß\15Û\82\10ð\89ËÉ\87* ö\a\13Ð,b\ 3:+|#+´, ÇÍb¡7\9b\1a` ¬\r\18\a\8cÝ\9d\ 1&L\1f\03\fÞ±Äû\81\19U,À´¡j,Ë\ 5`:\ 3\18\96\v\98|8\ 1L\ 6\12~C\8fÉAÁ\9a{\b\19uQ,p_
+«Éõ{z²J\ 4µ¨ôÛªa{±QDÚ5ÆO\ f©S>E\90Ùì?9tf_\ 2Ì\0\8e×õV\e\80Å2MÀ\1a¥\16`sÝ.`»÷1`÷Ê
+ppý\08÷ù\ 4\ÛÇb9'\ 1´\'\9f\a\\17î\ 1®:=\ 2®Ö¢\ 1g\ 5\ 1à2å\rà\94\94\ 5¸ôº\13˽où\1d\13NÂD$t¶[sRf?¦Æ.ÔÃÙ\8a\1e"\9dÖ±\91vÎ¥\1aX¿áÊ\8f\1fú[I¡\13ú\9c\922\ 1ÜÈ\9bý:}\89áê×îû\ 3\và_í\ f\10ô\ f\ 6\84j\96\aÂôj\ 3aVª\ 3aNÌ\81\10Í_@h\84
+\10\8aÍ6\10\82Ö\1d\bêÂN\01ûY&\11\13\ 6/Q\88<F\ f\16ìöô\90½.ð\1dN}£¬ÃAz\ö\87ÿäÐßr~\10tâ9NìÆ?NãÁã\97°&Ñ\ e
+\9epè¿\11\ f?þZ\v\93\80\14U3@FÑR,\9d>\90\b¤÷-~õ<v\81´î\8f\81Ô\1e!@êÌó@êI×XN¤Ú\9b}01 \9f\1fæ\95{]I² \1eÑx\94ñM¸LO\ 6Â\ 6TÅo\9eówÛü\94\95Ø\8e\13ú\9càÞ\849'þÞD\12Cm\92\17ø&\1då\92>r?¬wX\ 2ª©õ\80Ú;}q7P£\1a\0j_U\80ÚL×\80\1aB\a ¶p\ 1¨e¬\ 1Ô\8aõ\ 4jÕ·dtD1ÜUW0*?̤°p3zÃn\89\7f¦X¨÷\87\8d'¬7©éëyþAÏã©þ?ÿ\89\98HJø\97Ï8a¾\89É\97±\9bÿô÷&\8dÛúÕ\1500ú\ 1\f~M\ 3Ã\f=`øå\110\1a\85\ f0\9aU\e\18ÃÎ\18\18ëN²o\8cÍ8û¿X_b\99M\½I~Câ\92Å\9dXÊåXNÝ?-Ù\12Wïññ|:L:\167~\87Óå\9fæ´+?\86XW\7f@Ånæ>¡\16ß\87/îHe\1dÜðÆ¢v-^/ÝKùù\9a\9cë)bw
+\11ïs¼\15,ûð,\1fÚIâí.ûPZ\7f]²ã\0ïs      Cý?\²¿-Îþço÷8-\1fË ñ4Çûþ\ 3òg\93Û\9ci/®+¡¹½\94ïöþ\{˧ÓÙ\96\9bG=\8fÚ\82\ 6\87\88¤áý\90Eñ=Tç¸í\EåMñ\93¶Öì\14õWÂR\ f\97òvûõu.:ü\96O\10t\ 2y\13\ 4\9d\14\980ÔÄ\8cúßJ}\fÓÃ÷\1d)6àkñ(!\17¶ÍÓç\83VPNg«\949<ó\8c»\87*ûÜ6\7fm~Û\85¬·\96\X\1d\¶¼<ç¡êR^AÍE\87ú´ç\11w\8bf\9fÆs<³oÐr\9a}Aû\89\9fÂïãUÖAF[¿Î\8fØ\r\94\e
+\87ÇjpnÌ\90\81|m#}í©AI\8clÇ'?ç6u\b÷ÿ\8bCÿ´äú&\r$>ÔÝ\84é\8cÖ[ý>\ÕSëéR\9e\8bN¼Ïæ\11³{Ì °û\99Ì\8d"4^ÙYt´õ4bÄ.dz(l(n\10²¸Ø¿Õqµ¯]¨/\17\88"Uðz\9f\9eYêÙ\9fr«ë¥Û£Î<wÝwð\95\99j\a\f\15Ñã$û ©íÇ%+¿»³\ 4¤þuÉ\9eäAy\1a\17æ\96ç\11õÉLæ\1a­\8e©áë»\9aa\1dëg\ 6çâ"?\90·ÇJÿVEÛ\91yÝõzös1ìz`4íÌÝѲ\83Ïú\9bv|h\1dZÛ {nUèé#<T§\9fP8m\90f(_éÆ­\vË\rím¸õÈnUk\9fÉkTs°ú\97C× ÕÜN¢ckкÙM<²\95y\8d
+Ë«æ¶~ÃË\8bãáé!Ãe\b÷r\93üã.&t²7TƯÎܶ?í\95§§[Û\82\88µØ\8dÅ\86\87rE       \85Ch5åK=Ûè¨u?Aª¦\1fÔ>C¿Z\e:\95f\r\9aV:U\ f\v¢Ê¼X\19W|*Z\96W\95ɾL\1dÏ\8fRE&\90àÐñ\84@xÍÝây`·\8b¡ã>\8b
\9aÿ0È*p?Wèä\vÙãÍÎ~ç7KyVóF['Ç$\90·½ÊÎ\8f¡°»,ëÏ\8e\r3̪:ÉÂÛª\87ðçÊÜW\9f\15\9f(¦Ë«R\19/mkyºÄ\9eó|p\bkJ ÜËzñÜmf\8aò»\99\ 6\83BA\87fß48?ò6-ßÂàQ~XT7yhÛxä&Õ\14\99CN\ 5Ó\9b\87bÛóU?åÍÛ¬ü/ILÑñN®²=¨[~$\84·nÆã\9e*2\13\80\1aÖ\82CÃÿRõâ¹mµ\8bòÓ\8a
+·¨2-è ¾ò\9f£ÉÑ·àÉ5?ÌO\9ey\aߥr\93`\87ä<úBä\90=`=_\0¢\87\9fi=\e(¢ãn»NÑ­\18\1c\ 6Ï©Sw²gû<Ý¢öyÖþö\8d²C\7f·´ÃB?\1dË\1aû+        2\8f"\vO\85\87µµ«¥\89Í ´\9dtjÅP\9dæ\vÚÇpó\9fx:\93\87\16o?ç\91\8fÀ\9b\97\1fUÏç°VvÕ £l ©\13wÛV\17\89\19Vs·Î!Ê\1c\9cºU¸:"h¼ìÐm¦l\ 5\1ec\99ÛìÄft"¥Zϵ\91µ,¦U3?\87ôØtÄàlBW\94\e[2¡»º\8f¥ûü\11G\99¾\12\18Ý!\ 6åïm¢z\86\9a®KÕ@èù¯ý«\9c\9bV\19Ïó¯53\eÔn\92»\rç\8aËÞç\86S7âÃ÷<Xåìо\95l%\rÕ3\9d\1cÔÊè\18\15YQ\91\1aY\16%ÏÍÏÖÞ\98ÃJ<\9b\80\8eå\9b1i\f¿7½\f\11ú¼\83\8bº¯\97]mÕß×µÀvg\1a\rÝ\1fêvº\90ÕíìÓW+~q§nçÍ}"}\83ÂØæ\15¬n\15²\9c\9a\15z©z\98ËíJEwÏ6mG
+\9e\9a­\1a\151s\1f(Ió\93Î\16\15­ç|!X\16±PÌaim\9a\ e\9aÐ!]0<1]6\90\vÝÐç#««û®?ÔVûú\\vjíF\v\87\8bZ\19¡@å\\8fRê³HUD\9f*ÊáºÖ\93\95\97îìéûT\84Ôy§kR\17\9bÏ¥.\7f[K÷\1a´\89\87·5²>\10¬sp
+Ë£|VDë\89y7\81»ÖÀö$s¬\ 3Î\84­\16iL×UÚ\98\96\1a¼á=J¢¾0KªN¬º¶V¢»\9e\93\87dÕ]÷RS«fº­\1cWD_i\ 4ÊT\91h\7f#·ºáYV\8díGê\ eÓ\84d8¾*öwç¢\98\12ÌH\18\9dO\a\ 1Vk\84\0kÓª\0{\95E,áJp;\9d\8c}Ðj^_ï\vO\8cú\8e¡½UzWsäúÀ³\ 6ï­aÌ^\84¨/×}FÛôx\+c\ fD+-ß\84Æ80«V§)A9a°ª4Nª­HÍ\^nÝr\81¬v\1auéá-ºR\ f½\8cÄw3½\14\a²r\14S\1dï\vï\ 5÷ÕÇøYæ.ñØÄÊqKïÐáÈ¥½eË4\84±e5SeË\1a\98±\9b61çÈ\r=\ f\9b\950]Þ\92\8d\9do_Ïý,{jU3\91\9bÏ\9aÈ6Ôõ\80x\89ê!ïÒÊY¾bJ³Óþ6©\8b\87pyH¾ö\9b\84Ü\96\9a´ô\18\ fDÉDÆ\9aø>ÄgÑ \91Ê\8b©+\\12Æm¾!d³¹\1e?\9b\97Æ|Þ\1f­¹åúxá\8am5Ín\9e-\9e\97ËÔÆ^\93>#ç%Ý\\faZ.n¾ó\eº¹êOè3¾\982Bþ8kD)1U\12\ eÒ&\8f<\87\91s¾¹\95Ädl\10\ k\1c³\10\940`(¹ã-1éÙȧ\93\91\9føÑ(X´ë8.B\96Æ
\91)    H©fòù}íë\17àñÚÀçVæ©Ê\ 5 Õb·.9`+LnÉ\1cj\8d#S\17®\80>·x\9a\96\1fÝ\fÕ±Ð:ù\1c\85óø»ÄJ\91\16\93Q.3"\9fÓÒ\84\8a¯;Óº\83\0\90$E{k\10ôìÎ\8b)Ç«1½\15îj;IÑ\94\8bÐà\7fЮÕèa¢\13\1fÃ"4Û¿\ 5ä<\aü<|â<~¿Q\\90ûð\1c\8dS*»]É\16[  \8b9æp/\aL½;h0bî\1aÑá
+\9eÑJ`ì©Î®ñ½ÃN¾ø=AZ¡j\90@ÙU        §gMñÉçùƧ)9\87O¡Ô\80p\ 6Æ\84\18\9e2\93\1a\8a¯>\85è¾Ye+\ f®\93é\8bï\92Q >n¡å{Xà%ë¸'Åt;\8f
+h\1d\82x\7f8ø~§qÁ4ûdw|\b³\3Ä\99£\1cÑL\ 3:HôÅ;ët\výØ´r\12|êÞÌV)ýVn\93¯ÉrLösð\96\ 4KõN¸T\eçÕ\94\86£§R      +(`\8c\11÷É\13]÷Î.F<7IWù\ 2û\18áè\96\99TÖéÊËwNµE\92#b\8d\92^ò¶\8e\12ϾUéuÏð¢+ÍH\ 1}\9a\ e·)vWÍ¿\98ã\80}0\12$\ 2ºU±Pê~Ô    ªÛ\ f8ÊÈt\14ò\9d\9a\7fG6d\7fóÌ\91\99
+U&FG¡I¸\8dâ\0\9f¥Æ+\1cË^/Ø\12µ\11\8c,,\15´´U\ 3dÏ-\86HõTy ÕÕÄAªñW\17Êø§1Z\8a®ã2·ä\1eù\9c\9c_8­æ¥mN÷ã@«.&ß#MQó\17UJñ\f'äÚ=\92'E
+aw÷I\8ai\f´\17­\96owªû¼½Èw\ 1\85ÉÌ&\8d\91©6G\13îS\14\b8r4|æ\87\ e\9e\ 5lY:Ô°"\8bt1ò\99\9f£ekpBö£Ï7-\ 1©ek\12" d\11n\16úCX\86\94+,§\ 3\13\96ál\17nª½\11Â_ö\93à²yÝs¤.Ìm£3j\19\1d$È\6VkUtO\fÏ/Ù&É1-\baNF'E«[*®n~ø>½J¦.\9d\e\81À#\80çkS\18Ç\855\8e\15Ã\1d\83QnZF·0g¢å\99ã¡l>,#\aáÜAj\17v\8a\b­Ú\11n>¶\0\96#\93O߬k>­\8ds=¨÷¼\1f¡Þ\e\95¡Þ\aj¦µZóÛÊ%ÝÞ\ f&E£Þ¿f÷Ög\96ɼZ-}\13\96\83\1fdn§»\8a\90\1c·©\17I¶¦B(#½;\10eêø\9b\84Äí\13\9fÃÁ\r+~\9c'Z¡Ý\14rèæ\10¤n\94\88X¦<"b÷/ \86Ï+Â\81ÃÀ*Â
+\1d6Ó·Ý!\1e²×\84-ô<\97\9f\90¥\9c©Ô°\97µSÐç\1a\ 2OÍ­\81\17_IÀ¤\13USÐ\8e\1d¦\86Av\Hµ
+\17·é®¦\16\92rC­V\15
+òãéØb6WýÂ{~¹yó\1cKdIæ´{¢Ô\93
+ Ò\8e>o|î\ e\9fX`zw\94S¸;"VU\0+\ 3>\9d¾Û*\96îB.\9dÖ'\r   zyS\13ê£\17\ f\ 2\92\1aÉ^7\95îtfÀ{ÝÎ\0\1døßÌ\14\80\ e)\13 á¾   ÐVw\vÐö\88\ 5he^\ahU\9b$\92DÉØO<\18\e+\84iªÍ\13^\90>\96bÿ¸Ë©ì\95gkë,E·ß[\94ütü4áIi\80­öÑ\v­\9cýïõ\ 6\11\13V15\ 5½!\ 6\86R\1c\8c¦`ñ\8a\83é\15f\ 1¦aR,¹L,Ó\ 2Àt"\8c%\9c\ 2Ì@α\f1\80\99Y\v`\16ß\ 6\98x?\0L\ 6\ 2Àh¶\13Ëx\95È÷êY¾í\8f\19û.\8eô\8a\98j*\1d\e)þ"óAAå*ÈU`ä\87LQ\96\88ÉÑ\81±5s\ 4(w®¿\11\89v^°ZÕßÐ\80"S)x~\8d?Äz\1cË%®\13Oñ\,\ 55!·©©\ 3p\b\12t¾^ù\ 5Àéâ\ràé\ f\ 1px\16¿\8a4z\0{Y\17\80½=\ 5`çÞ0^\10\7f\r\vå½\85bèH«\87צ\1c\8d\9fÅ\1f\8by`\174V\14\97ß\87\97ÀÒdº3'p⪠(oî D\1aN¡ô£[\0Ð` ~À\1c\0ÞH!±\90q\95}\83\ 6ø¢!\ 2üu1\ 1þær±Tª±\9c#\80\7fìu,û' @\91\ 1D\8añ\12@\f\81!ÀoÛ'Àw[\ 3à\a>þ4óÅ3\11»\8f\b;#¸î\86ª2\8dg\82 û\f\84\ 5L»   2§»ê@$]\87bq²Ð!QþÀaðõüBÓ½û\ 2\81 A!\rðçý\93¬F\97¾0ºD\ 2¢2â\0Ñ9J\80\98¦5@Ü\1d\a\90éa\11\90\f\12ÆR\1c\ 3\12Þì\0\89Ø \96\87\0H´_\0ÄÛ\9f\0âã¤\0\1d@l\16{@LrH"Ötxûr\ 1\9dGFC¥\9b[\86\92\8b<K?.sµ \19äXhËxÑ@xTÈÖi¸#êTÚRQ2\85\16»X¼\8c\ 2
+H¨O\0R^S\80\f\0\aÈP\94\ 1¹ª\98\80<O\@áO\1fP\96YKÈ­?è\ 1ª\90\9aÇRº\0ª\98Bcéj\80r\94
+ \|\ 5\83\ 1\8a}ÇoÂ\82{â9\8e\17Äñ&Y\1dn4)\9a\8eå7¿o\vKâPf¥ÛÅ£ì,cá+¥­¡"\95D¶Â\9dçJ\84F%\9f\aIV\129Dã²>º\b(³¢\0ª\16i¿.äÇÍ\ 24+ç\0­\15\ 3@\97gu@OR\1dÀ@¥)`¨ã\1e0´õ\ 1LzÍ\0\ 6ö\1c@?¡V,ûC\ 2\88\8f\e\ eÐËE5¾ú\89©øíT&1 \e,6Ù©×ùe&!иÃÕfÃ
+m¾.>AX¼\8b\8a§\9a    \e\15Ù\80àõAû­é/\87þ\ 2_úÚô\13ãñw5?à·ñþuü2ïL\bXc:\0l-=\aìÞß\ 3\8e9?\ 1ÇZx,ñ"94\e\0ö\9d\1a\ 1ö´x\0v5Õ\0;\9at\ 1Û~¦\ 1\9b\93Êñ\ 2
+¡~àÏÇ$|ûûÕ¹í׺\8c>\9c4\88ÅøRJ"D`³xÊ¥æ\8dâ\1f\ eM\8e\8b¿\95$\b:×hÿx\8e\7fÂ&þ\eõMXk\ 19\ 1~QK\ eh\ 1½a@È\15¥X\1e\1e\10Ìj\e\b\ 5\ 2qA\81@\9es\80¿íã\81ÚîA\ 2>òz\80¯ß¶jg;9\89þ§±`[ãÞ\90\9cUW\1dLX\10ÍÄ\14\9dZL¥ê¯\1f:®)ÁÝIE\7f\89¿÷\1ffãÿ\80ß/fýw[¹s\8f\ 4\92H*@\8aº.\90\16t=\96ù\fH\83ì\13H!%\ 2Éy'\a´¤¡\17 é´\ 2Äwm\1e¿3\9b\96ÝÅüÆ\9dvÝ-\rEË9v´\9f#8ÞgÃ\9f\90è\9f­´\ eæ?5ýÄ^|éó?"&¾&ã\1fàln¨d5ÿ\8dùþõ÷&ѹï[\ 3¨ùÚ\18¨>v\ 6ª5#\80*U³@\85¬!Pî^\1a(½x\1f*óÆ
+(\8b\9d lÛÛ7c\9dv\17¢t%¿\a4\12Ås\15h\ 1á\9bßÚ\92­\94àÞ/\aÿÁ½ÿ²öþ\r\96H\8aø\9b\97õ&ÖÞo~¯\ e®ýÄÚ[àÇ@\7fÝÏÀÀâ¯:ý\83ª±Äå\eàôí\1e\81A§C`0Ð\ 5\18,«ýÿ1²:ö'\f!   oøX\7f²o\93\96lØèÇÚ\9b[Ç2:Çòzÿ\848\98Sé·ß\99½4\84û\84ʨw¤\921\7fú\9d\15¯¹âe«Uëç\83Õê\9dÎît~¼ùéÛáY:ªû¡èÕ\93´\86Ä%û'çvÄî$ê'­õËPÿ\ fÒ\9bø\91ÿdß>3\94\9b`éÇ\10É7ïٵݻá5axÙ*Èô|Ð\9f\8bS\98\9a¯\8e\1d\1e\9e~ôµ\8cì?¥Êy\ fÕüû\ e \9d÷feHк\ 21øª\8eJü2$]s¡\1dªÅ¹y\ 5£\99ý|¡ÓIÆS\13Â\9bT×û\f÷ï¤\vW\924ðÏ\9efÃí; CøâîïSòWª¾¸\9f\ fj÷}j~ÊÐI\1eΨc'}\92öö¶¨lVêYY³ÃH_\9e\r
+endstream\rendobj\r30 0 obj\r<</Length 65536>>stream\r
+s¾¹¸\15-{¡m-on\1e¹ül(Å\93\97\89\86V¦HD4'>àzã\0æÆ£mÞÛ\ e\ fAýë¹\1d\9c«\v´\7f\v   µ¯=\84a\14\99\8fWR`Âw[ìEÙüM\1aø!¼ß\9e\15Û?$\f5Ik]³}£º¸åOõù3Ø´f\9fê¦?³O×Y\92\88\10¯f\82÷\97\87Ñ6Û»\f\ f~í>8\97ò¯þ­f\81¾vÖÓQ¤èXïÓUÈ\9eýÖ¹®\a)rgî9V\a_Ôýv@®\9a­
\19\87\87\14
+7\8am\9e»\99öOúÁ×*[\eúËï£\8b?ݸ\92\90\81o`Cb\94\9aýÄÉ~\19êð\90ÃÈ\81¼¹rѳ>\16"ó2S{\9fÖÃé\r5²ÐE\86§R\a\9fîëmj9\v[\15\r\ f\95Ùàoªì×5$_\97ëFGÛ\1cêÏh\7f­[àñ©\r³8V\83æ¶Xõ\88\81[\99\97áF\ 5?tWI\9cìßðØàÐç\82 \9eA\8bÅóèè\9fÎÆx¾Å\9bëú\fj\ 4Úà\XbI\8c\9av\80D\87°Îpûf(Ð\97\97î\ríÎ\83ú³ëbõÈh°µ¡]\12kФªU=´jýXeñMÁ+\al¡PÚÖ\våREl4\82C«Õ \84G\7fX\fÍõ²p\e\81s¡ã\16àÄ¥:ÛI¾EX\85üg#/óÃJY\88ecþ\btlë¹I£¬í\90\1a\11N³WEék\a\19J\boS>µfµO´ïWæy<,¯\ 2<*m+\9fa©Âã³\12{\927Á¡\99ÿ\9a,\ 2áV|\14å\97ý.t2\ eTÐS\ 1æGY\9fô-¤Îå\87~EÌ;DGËMJQ&ç1ñQ:¯=«\1e~a{ÙU«¹ÊR\8fÇÓ­XyÆåR\8cï\1c&\95\8bË¥-ú¯|\1f\8cùæ\f\17ý\ e\93¬\86\ 4òVðå9Þ\ e\r:(Ê\8f\8f\1c5\97ÿL\8d ï`j%7)ª\8dXª½\9cGõÇÞ¼2Zxø±¿Î®\1a\8bC\96º..{¸\15í\ 1\92ÕD\ fØ©g0Ò>\8f\19Þ\ e³®\9e¹Í[¹LÇ\7f5­çÆ\9aZQù|·,.äÌÏiÙ1?çõ#\96ûDzD\18$2ª¤\rº\83\8f\ f§¤ÄxË\ 5\95BÇÌeó\ e:ø>·æÍË\94\9c\ e¢»\r·\9aËÞW¦sè\1e\1c§n<ó\8eðÁËöy(4l%-´3·©ÙÏè\98\9eËìÜ\8a\8aå\8deQí£9¬ôn¦Ãm\81       \9d ÜðdA0\90[ÛÑ}ýñ½zÆSÈÒT[\r\89§\16¸i]\v²ö4\96åñGVãÓ)\81ÑÍp\96Þ\94×\82Ö-èûc\90\eÛÝ   7Ù\11s
+c+©>\9aéd»\84õ\9c÷Y+òG\82ùY÷esXZ|?\8dé0\17×\84\ eÀ7&u´d \17´¦Ï[t¨ûªÒÓñ\877ÖV½úR£>\9d½º\1dnïjÅ%`å0s8¥\9eß:òy­5å°´_Êay\89Ê
+÷ªÈ
+?\99Ëau»H$^MÇ?ÕÞ5\97Ë-\8a\97W¼K¦;×wyK02\ f,\10­\8c¶¦L\97È Æ\94¾¦\f\81\rä4Cu_\1e\13:~[2Úªs\95´@\7fkê¶ÿ¶Ô\8a\8deU\ eb|å0QË\8a\88\1aßèIù¼(tå°Ð\1dK·Íb-u*à"é\\ e\16£ÆB\14-YÏ\v\9fÛ¡'\f»Í³à\98KSp¬F\18Ë"\8a¿i\8fýðx\84\1e\15R=Mü\ 1"Ö³åÔÕ³ÕÝA3Çì\9d5°Vîë¼×6Ø>\9dܦUw\93ÌGÝyÙ´Ê\15pH9\!X\115\84\90ÏO\96\95ù)IwÂԤΥlKz«\9d\13_ê¬$öáGS´æL_\18\11êLpÖ\8dÿÇÚ\9bn©ª¬ÛÚWp."¨ë\1a\14¬ë\1aëº\16ÅZ\14õϹú/\88\1csæÜk­Ö¾}ÚÞãG\1fi¦Âë+\ 2ñÐéqVW±\aPéqLV¶É}t\ f»RÆ2=\85ë\87¾¼w(MÞ\17>\r¹¦9Cyß*\8cÚÃWã^Sg\95Ya]Ý72\9dR=\93L\9b%ÓaÁ\\8aK\9f\ fm]\auÌ|\94±ÐìÝw\81ÙÛ?>f¯\16`Æsíá\86ÃzÑ\80]\7fßBQOY¡ª\83\17eióµ\99Ô²Å\^#ÙzE-T;-\95±N#¥<ü¬\14>\11;ɵYû#\9d\88\87(5×µ\8cxe\9f\1d±½\1f\1c\84\87<P\84\87ݪ\89Æà3\10ÛOf\88⢣ë7q\ 6\1fç\ 5µVKÇkñt\82ÊÛf¼¾Î
+VÇ_Sf<%}\8dDl÷Ò§Åâ]O}ã7=åå^:\96É}´\ 5QÅ5²P¥Õ53\10U¦2P\95\9déÇ\95r\10¤\14~%\97ä:cF^uYÚUúRKèÏÅkãp\10\8d\12úf\9d\17bO2Å\8f\9cv\9bûÌ8\ f\1e\10,\85\9bÖ\85*÷YT:|\ 2~\93\9aÌeè\97¾¼?Ê\9eÍX5ùmQ)d2\8ei\9eÄ\9b\ 3eDéß:\16\9dªëxqôÒ(K¾©ëepV\8b\8a\7fQ\99KøTv\1dü£ð\ 1ÀäºMвLë¢tÚft©UnØâõà¦ÅNß+\8bfüë
\89<æC,·å\13õõ\83û*&Ë¥Û\v\87]\ 4jtm\8d¥ìí\86Y\7fî"³þú\15\96ÒY\97͹Z»~x\14\ eÅ¥<\18"ÿvbÙ9'ãþü®[\96HòFÒ(\92Ú²uø¨\9bjñ©x\ 5ü¦\b\93ÍYö±ÒA\96ëÝ\9b\ 6OIsÇ\11R\15\96\10»àÍ\vAö-\v\ 3¸\ 1\vñ\8d\95àC×-ò\89û¸ÁÍbþ\80K\87Â\9a]\96ê7\96Úß(¦$§c´ç\9ejt\95¯­(¿QfháØ(ÒU1pi/\13º5mÌx\85\92\9e\8fî^M\ fƯ\8a³   6ÉØ\85Üë¦Ýxñz¦n\12êæ¶ø(Þ1ñ\94\eeÿ*\9d\17îIÒBë v\93úI\bæÖ]\18Ôò!\1f\9e2_~ÜjR|21\17¸ï÷¨q³9°9B\12³ìò\94\8fâÛYZs»L©ë-\18.&\9féêzLPG\80\eTc>­RJ.µ$Ým\8c"/L¾H)\8eçR\8d!<\10\99ß\8f\97\17\97\1aßwe{¯t\13Ö=1Ô\8cävÇiù³@¨\uô\91\8fª\16\9d§Iîay\15»çüI\18ìÁ\9e\7f\ 3\9f\1c\81+7g\89\80ËxÜ\9b\ 6ή¬2ÇÒòÄl\9d¡É\94\14½¯\82\12]\13í6ul6¦TS\r\8e\94r+adÛºé¤þª\97\89û\98\8fnÇ&z)ð%z&\9d\9de\9bÔw\9bv9|.¶9¥\ 5zɹÔ/Ùâ¶\91@È\\9f§\16\9cº-Q\84"®*oéRÁ\ 3ñ^_Þ\84¡n\9føäó²ç²ÌpÇ®:«\13Ëàû;Sί¢Kß\fO\1f?ôþJRt­£
+´d¦4ê\18´\1dª¹¼\14)µ ºd{\97\99\90Fes\80ß|íCÄ\9a3\ 5\7f\ 2îTw#lrj\ 6ØGÞ&p'_jáÃe·\8drd2÷ʪ\93XµêÑ¥ï¸Êç\13¦c\955mÕo±Ê~vÃåf¡ò\91\f,\f\84çƽòï½~â²\85ã\81eÌÚ\8eá\eå\ 3]{·¯Ô©Ü\v¨\16?\f)õ°Ã)ÕÇ8²£\902Ù±Ë6i¼'9¢\9f:FW<\888.\ eñQ¾´Å>[/ÀÒ\82Å\83EÃK\ 3r\17ï\ 2Ò3n\80Ü\97m\90Ãè:X¤l·H/åUúé\ f;N¹ª\15bFNw\8cT3¦jL¼Å)\92åãÒå\93û\88½þ-\10\9c\8a8´Ä\9dØ5sô\99
+ÞÞÓÒ;µ§4#{&;\8bÂ\9d4sµ\17\11Pí/Ñß,("^º\8aøè\81\19x¢o$±iX(axrØ\ 6¹ù}\ e¨\æ\ 2¨<Á@ñÓ\80r:\ 3@%\9aÑg\ 3(}\9e\ 4\94\91\94ºh¾ÊTªí¸víÈ\16ÌW        Ø?È\9cwÓ¬Ü|ú\84dt\12\1fá\15¿=ùÔ¾tãÈ\11}f*æܧe¥\0K,;\a²\8b\15.\84Me\1fx\92SQ\8cÁ¬Æ¿0ü$\ 3°l%h@Ýr" ¾»\18 \81\94\87Òs\ 1\8dÑ\v\e ñ\f\ f¨'\95\85r\1d\ 3ê´\ f\ 1uáòP¼! ¶Þ({\8d\ræIr!¹qõ\1d\16\8c\8fw\8f<P?È<2\98K×æ\86\10ûfâË\7fÆÞ\93ËÅòwfw\ 3\17ºî¯N\94¶-ûd7U8\12v®pÃ\81®ÞÁ\8a\ 1Ý|=\ 1\0\94
+\ 3\0zLÚPÊE(\17\94>JO2+(Á\ 3ÐÓ\81\0èY\ 5þ­gÌ\ 1Ý70@7\1a\15¸ \r>,h\8bL\9cÍÌ\9cÝúÕ²\ 2l\937pqo#^.\9föqN2\99\19!\8c\ 6Ú\97\97/\96m%\1ftCx^\11\87VV\17Ò*·Ï\84½È\9e°yɸ\ 2úùº\ 1\86ä\9f\80\91\9c\ f`b-\ 2\ 3\ f\98ºd@©¥ \1c+\80iX}(\9b-`\9a\89\17\80\83\15\ 50Å]\190¥ù\ 60©!\ 5\183D0\85±Ö?P:\95\1e\82\89-w\17M3Ì\8dózî¸wT¡þÑ~\90y|º¤øôE\ 4l)¶|Ó\8d®\1e\10<Hë}\7fàïÇð\86eÇÎ\ 50=þ
+\98y
+\96x\1f\ 1À\82\ 3\8984÷a\ 1\9b\8aÉ\80-÷bPîYÀV¬:\94å\18°Uí\0\ 5l6§\ 16gÀ?ØÜ\1e°*Á\ 1\96­\ fà\ 2\9c+\Zì\9aØ´\8f\93ØmÕi\1aßó  m\9aû\84â7\98\bB"dÎÏ\ 6.Ån1\ e§\8fÅÙ\17Ñrâ¥\8a!\9ez\1c\9f\96ï\80ÕË\ føNzOÀ\8e¯°Ê-       K|§xÀÑÍÈ\8f¼5\0×ä\92\80\eVKð§\8d\v¸\16üH¹Ö\ 2AHÎ\8d\13\80+]-À\95WðoéÁ  pV\17¾R&g\80£îo(ï¯#æzckp-6\8d\8c;(j\9cºOÊzéa\b\13V\938úÒeécH\90\94áí       bÔ¬aØ" >°¦U\88\9a\16>¿°\18      \a\Ã!\7fÀ/\17LxÀã\17\ 5ð\96\12\ 3\94\ 4ül\99\a\ 2\10\1aPêCÀßO\eÀ?R\ f(/\ eð~\e\98é\ 3~\1d\87¿\eÇ-À\97ávÀ§WhN/ÞÜòñv²06ßÓº«¯ôAIi
+äèÄv&·&\ 4\85\919e\96t\8eH</\fF\v\ 5XΠKÁrzì\1f\ eÝ\ 52à=QýC}µ\92 \84â ò\vß\90}T8k% Ê\9d&\10ë\8f>\10\97Ù\15\10\aó\13\10\87ð{#6·\1a\10\8b\99"\10KBt\9b\ 3ù\ 5¢I¦\80H(k ¼\ 6p\91\89õöÙ\899ÙÁQ:\9fíV¤>ÝNó¹Ä.\8eRN¢ï\8d\15÷4\ 2Ô\922(W\8e\7fÊ\12Ø\8cñoÞã\1fÛq±ð\aü"Ìúc÷\95Ú@ú´Ç@v\9e\8f2' ¯½7\90\0ä±\9fD\9eÛvÑ\ 5r\9añ\80l~\18 K \f¤\90ò\81t\19¥á2°F¬\9f\-õõ Õ\93olµ&d°^\9e9\12»$\15\13Ò\ e\81µqûO\97PMÈ
+}¨\17ÿd_ìxôõüq\1c\8bÂ&~\9d¾(e\18Yk\11kMQ7 n»\0h*\eÍ#W\8f\ 3\8d%«@½õ¦\0nwÁ\9fLá¼Ð\ 5jÁx\ 2\95]Á¿\ 2\1cfúT[ª
+\96è\8bÉU¾ÉîÏ\93
+Õ/2E\ 2oLó?µý4\bá^d\80F\95 "\10Wýu\1aOðÓ¿\ 1_ÿ\80\7fp+ò÷ÞÖ\120\921\e\18ã}    \18m{\0\8còÍ\aFzL\ 3êg\81A\96\97@?×h OÆu w\1e\81¶Ï¤ÖÒ\8b*N¸ÝÔíÑ\16\89ybÒþñhÿÍ¡Q\83\10
+ÿ\8d\98@u æ\8câ\1c\91ûG°D\94\9bä\8bX/²öNÝÊ\1fWo\ 2î-cp\14\81¬½<c\ 1ëqq\81µô¯Àjú\ 6°\8a×>°x\95RLµ°\17òÜhÍèÁm\8e\92¢AC|Nþ|hÈs\8c"&PM¿1\ e¿ÖÞz\ f]Âû\aóý\97L\a\14â\8b\92\1cÐtmÈÕ\8b\ 2{·Ã\ 3p\18ý\rìÏ^\ 6öwP\ 6ö½²\ 6ö"G\ 1»Q\80\av'ï\ 1\95ÿc¾\0rõþK~\ 3ʾí4¡<F\7feõ¶OPö\ 1Jpx}ó/â\95Þ¾\98ç\92\7fðOªþR\82âùe<<\ 3sî~\1c\8bÆ\9ewy,UoÚÜè\\82¢3;\87Õáù4ÓTá\98{¾ë\a/½j!\86:Ó.\ fög\16®È\82\8anäÿ\97©¸Ð\ròP\8e \1c\83dd÷\1dk(S8z7\89\ 5[xá%¼\16\14\8fg÷!t\96½ÛÙî\8e®·Tuz      r\99ÅyÌ\89«ÓL\ 2\9bãR½{~1\98\1f\ e¤yòιÂ}w+\95?Û Öa6ak¡­gÖ)½Z&R½å&\9bù"Â\e\bò"¾ûcA\8d"[;·áqû\ev\e\14\ f\97+ºA\1e\81Ô\9b6üøWsú¹\9dÇôâqNl\ 3p\86»/Þ/Âórï\9c¡ù\9d¹Ý\8bÛøa¥n\12ça´O[§ïÍØ*÷ÊÚËM"\9bZ²³lnQ%
+åy\83É6fçJ­7½5zóIÐ^\1dÆaÿù\1a}')q\94Áóía\9e\91¯(â\16\15\86&àB\f\159Q\11áE9\bÿ'\9aomZ_ýä!¸àUÞÂ\1dif\8d·ýü*÷8G¡\b^cÉ\8e¿ýE\15cg³sñ¼\9cÞªþn\124\97\9dÁiô\1d4®£ô»ú\18æ±äs°É%?\ 3v\93%úU®ÀöüZ3ºÓ«'\9fævW»]\8a\9dnLé¶\83Ñ`Û¶A\92pǹNÃMR\9f)âº\88¡Öä·]C \15e´¢9ÍöòDª":ù\9b%;J?=lHMÇÔ`\93Þð\b\rá\816`W¬ÝóËaª{®ßr\9d\9bë\97:æݯµ\a1¯é\86#¯ã\8e\13çAë;;OZ\19â¼h.\vÁ®Ií¾§FI\94_u¯\99§êÂucÔ\1a\96\9e\87ëIUû>\18\84t#ü\10ÙcKã*\9fþI\1a\88@ê        ¯\95\ 6?.Ù\88ú!\e/"¼\9d®:߸c\9b\81\1fA\8aÙ¶ð\ 5sh.sÒ\19®$õ\84\e%®C×½Z\87¯ù­\8a\84¬²\11Ru­¢Y¹\rsñJש§ÊÁ´\9e+\ fÒ£J)\.Z¥$}\1d\15g\15fSÄý½°l<\98\ 2u-8ùM73Î\97b\e>ϾB=WMlT\94/\80\92\ 6¶A±\98C\94\1c6\8dº#Ü\1dA^|Þ\1aÖ½\8açV]\83¨Tº±{­\1c\8c\9e.Êh\85\83\eqR
+çöª4Îæ½âw]:\153léVXVóA\81:fÂü\ 6\9eÊäKj/J\1aèñ¹ª¹Rÿ$\r\83\90êT¯et¼1LßV¸\9f\98\ 6\96
+¼x\1420ߣT\81\1fù;i`Qù\ e\15\94ÖÐ\8e\a±\ 5\95[ïX*%ñOª\88o;v~S\97­\9cç
+\89\U×¢Õä\84\90õ{¹*\94Q;+¿FýÌy´\9ed´ïb\9eîf\16ë´Eì¼T°º\9eR6s½%C\ f\83û\91ªF$¾Ç\ 4\9f\985GV\ 2¿^sβ\9bí:yë½w¨×\84°7ã[ÍÞLÉè2\11ü_}ü
\1eÑ'\8dz\88 o!ϧc9á6P2ç¡"¤o\93\v\9b
+\16+>eS[%\19nözr\ºÄ\92ã2\9dJ&y%\9f\98Õ\95r"#[õ\ 4~NºÈ\f«'{\ eu/\8díMÏ]Ø¥Øl\17÷F\9b\9a\b\9fq\11Xd¬\91m(1\85üf­ó¦Ó³Ü²ê[ºÀ\8b\96.ºCK\97pÏrkÂ\1e     ¢úè³®t{ÏJ\816Z\11¹Í*\99®\9azb[6\99Ô\19,\91\11çogÙl¿\1dêÚÇíMgDÙ%sÊþ\85OOZ¼j¿bqá\83%bþ\94ÏÆ\14\9c)Xç¥ZµÜ¼Ó²tºÜ7oÛáÌ´øÕÖ\b|pEfØF\16ÓÃËJÑÇð³Ó\93f0Ò¾ÏÅCû\86R\1eÊ{ª'mz\86¤s;\81}]ìÂs\92y¦PÌ6\93l<å\98\9c\9c î\ em\97\99á7^\r¤gÌ\ f××X#9º[çy?\82)\96\9b\1d½-\1d\9e\95\9b·õ\86\84\12ò¦Å\ 6\92\11ìqÝ\18ÔØ\98\1e\9eØ\84>niY=©¥ËÚ÷Öji³îz¨ebØZ]\8eb\175\9fX\13*\rb¦²\99ßkJ)7X+\1c}\96\15\8e9D\@áX¬£\94\8a\ 5\83Ú¶Òkw;ùrû\95\8e\e+\91\1dÏ\ 5\9b/¼È\98\9a7Þæ\ 3¬\1ffLÊ]\8cçH;\e\83\e~1lóvÕCß¿éãÆí©'\95ð£}¯4¡eL\82Öð@\8c®I«Ë\81®¨y;c©Ô»\91T6\93YAá0¿!{Kj WóÅ\8däow\ f©QIp\92"<RâùØë\89\rD×]&D·-W\914\19\8c\\95&gº\99=ÅG\99äÔLêö.\9b\8d8tLõ[\98Ùç\1e/ÃY\17ozj\86\9f´y°9hÙüØײôø¬\11m÷¢®øÆM¥sù\87²\95Ý·R:Op\85\8c¼O>%¹\86\11ºtÌÁ\ 1L\93²³\92r\1eÔŶîõEýÁF7b
+½xå&Xá\97á\9f\93~\82·\ 3²ÅÛOpâÞ-BçÞ£e\89{¯ýJ]JtfE²»­g\8c»\99D!\12\88C\9b\8f­ñÕ?§~ -ªìE]ç\97¾ÊLJ\9eR\86\15\85¾G¸»n\1d\15\9e².r­¤ÜdIO¾¤f/ù\95ÔX\99\14¯ä\90\17Ûë­*\1aÅg\èí\89\8c\10«ÙU~ør{¼3º­¸)Üx8,»dØìFsX²tr\995Ö>0\85åPa
+G;2'1k¢Tªv\bs\92ß5kÕÔë\85'\1cV?*1-}¥\8dÑ\ 1ûè8[|¨ÅÆí¬TÊ\8d\83\Ïq[é4:®¤\16;_IÍï~'©ÝýA¼ZÇ\93h\f÷WáQ\ 4¡ÐgyL\88yFDÕù\91\95\95xçÙ6¹©3Ir©Ï½Ä.2\\9b%Wù9Sd6gzWÕIº"\9emêÐÊ5©ºnøTÝȪԡCä¡Ð\85\1d\8e\8aZN~Õ³c\vµ\89l\99Ë\1d­Ï¤GDnÕ\8d¨Ý\95Êvy\92庽\97´â}#vfÃ¥hZµ\85ðX¥\16B\9cÉnù×®°çG\95Ú\89O\b½;7\1dLB.m\1fp\ e{¿X6\97Æd\96\12ྵبå\18VÙ7éJ\87\9eP\87 \14\9drPp¸\8aS²3\8e\91­\99\'µÌkGj9^"[ýc\ eÊ%_ú<f\83¬Vÿ\94\12KslÇåS[6ãï>¥-\8bë7\1cÅ\bw¹Á\ fN\92¶á<Ñ\9c­ÖÂ\80h.ùÐ1f|¢ý\89Ü\ fÜ4À\96p\94ÎlÙ%Í\1fØÜV=³TÙy0\e£ùeØ~\87¤½øN¤+áǤü²\91¡\1a|»NÉ\87ç\98t\15û@j\97# n\9d\92A\98AXÁ\83æt\85\a­\13\87\an3E\98\9bU´     \14\17\9f17\87¢³iTã1\9dÍJ?È\9cúNß\8aÈàwÉÍ\95\8e¢ù}î\ 4\9b\18®ù±\93Zp³46åðÅaÌæá¹\11³q¯\e\86\ 3W\8föæ¯#]Í\917Z¤T8¸<\17#¯:Õpû<¥è'\83t{\9f$©ç²UâN­\ 6\84U&¶ø\93\1f¼q»Á)Øx;(`@0§pxÝb°dVu°ñ¼\9d/\14ïJ7ms\8b¢ímí\98eeTQ\9f\1dÒ¤ÊYõPnLÂ;\82÷aæ(\ffO\8f\1f\ fÛkn65\16\1c\81c3¸\89MÇô\1eÔÇ´Xë/©cl½£\94Ñt\ fåz!Ýï# Û\9c\89\91ú¾È\12÷ÚH%¬ÓÎÆ\9f.SÄí{ª\8dMb\93\ 5\ 6Æ\1c\9a\ 2)\v&< \16\99\1c \ 6Â\ 4\10Ã
+\ 3\88\16é@qr(J&\ 5Èb>~ä\95\989xò¢¶\92MR©\1e\8b¡ä>¼\9bh¹ö\91\7f[\17\8f\ajmÍ\11¦´`éÜcÆpîtB\1dk\95h\13 \94W}A¶[ý-q¿µ<¢×í\1f\89\98µ¾ãÏç)Ä\87#\9cÀ>¬&`©jÚÀ0q\9a\ 1Ùæ£\ eH-;\ 5¤NÜ \1cE@òÝ\ 2 \85Ê\ 2\90Ä\82\a$YÎ\ 2âÕ+eÏ\9fmt¥0I\14\13ùØ%\a,câ`"Bæò±\90\ eÿÐrN?ò\13ñ¾çæLsÃæ\ 3\94©Ç\9c\16ï\9d   ¥J\95)Ù^wVDïÛÚâ#1·Ã>Íô\ 1K]\13'°0Ów\90ÃûhìI.}\ 6\90+Y\83\12õgM6 \fç\80ÜØ\ f@ni\19\90\93s\19\90ÓÝ\ 6\90=R\81r\84\ fkÏz¦\87·]g[esÖ}}·ôyû$¨Ü÷KH\97\9d\19\8a1j|\13àÀ7ºÙ\8f\a«ã\9e]U
+\e¦l\93Kºæ^\17Ts¿\98\93\1d²¿ ú\89Î\1aOX\95\1d\96.$<@ñß\1d Lí\b\ 5\ el)sñ\ 5T\86å T\f(×, ²©\16\94û\12P¹î\13PvRE\1cÚÑê\80ÒH¸\f½fÁ\ 5éM(\99Nê}qZ("Ü\1czsS[=Ö\82"en\84d¤åPx\86³;?é)'\8edV{f\ed·tí¬©\16÷X\91\9dìzIôGý%\9eèV¢¹ð0¼\99Ø\ 2x\ e   «Ü¥}@][\17@}\ e/@}Y\ 2JN\80²¶\0Í©y(ó\ e yk\ 3\1c\ 2\1a\9fÁ÷ðlÁò_µ\13 Î÷$ ¶³>"ÒÉlïÓø+"Ü\98\8a=SÝÅG\ 2BæâÃÔÞÂð¼|p\vR<³Lg~ ë\8a³£Ze~K\9aÙÓ\9a\88¯×°\91ßÎ
+,\87\895 Õô\ eÐNË\atsw\ 5ôð\15\0úd|¡Ôi(\a\ 5qè³ä@i\97\0}!úPºðEW\13>ëFÅ\0í½º\80\9e_n\80\1edà»iÊ3ä\91vv­C\ 3ùÌõ\9c\9a5T>\1c\89²z<\93b_0?|\1at\1fl1A_èC0?"çý¥p Í\87ºÇÃÓc\87Ín\8b-\Pb\ 5èc\a®ð¹ö\ 1#~®\80ÉÆ^\80©\95¿\80\99/HÀ<0\ 1\8ac@\99¤\ 1\13ÐuÀø\8d1`\8e8|ÅqI\0f]q\0³)£|\ 1f\92\ f\ 1Ó¹U\ 1S=x\80É\9c\ eñ3Q©\99     ×NkÅiÊTênG\94:Í3%$òò\97£²Ý'#Ìà»uóÛ\1fT\8eOdã\88\11·Ç\ 1Ö´ÞÃE½\8e°\1cæ\f\98»qýáÐÍ\17`\93;\0ØÒ\87\ 2ìÄà\ 1ûîi\80£ï\ eà\18=r!Ã\938öK- ô¯\80½k\f\94O\1a°\87û\14°Ë;|í(^\ 3¬[»Á¥´\83\98yÕª\7f"§Èv­ÈîT\16ã;\8f\96©¶Ü\90r\9f\@<·\97\a\9eª·o¿eý\81Ñî\ 4\16v¾|`%\18øC}óNd\19\9e\88\80\vÞ\ 6àEÝ\ 6|u\90\83r«!r[K\f¡ìv\80Ï9!àãW        ðö¤\bxµ»\ 6Ü·\ 1_~_×á2D¸ÜA\8a\82\97ûdNõ¦m[êö:
+?\v6,³¯Ó\ 4Õîº_âU°?8öx\86\b\90£¦¡²\14\ 6ûáý&\ 3xaÅ\ 3tAà\9fà7i\0!1K\0aL\15\80\10\16ë@\8c_\a@TÔ\15\94É\15\88\8c\14\85M¬, ÜJ\r ì\13\a ,Ò\12\ 2Ä\8d\82\v\ 4çM\ 3\e?ùÛù}© _ò)[\98´ê\1a[Þ.\ 5ê:\16\19"´.4\96\ 4@\1eþ\1f\ e\8dÊ\89\að\8d<Ç"ùMÁJ\ 44IÝ\ føE¤\15
+\16E\ 2×Æ@V\9f\e \173\17 Ãý\ 4\90uK\ 12çç\80ô¨\8f\80ä;\ f \r\9d\18\90Z\19ø0\19*(bÂL¥ëmµ6²\8bâ«\9cJrÅL%²(ÒÚÁW\897W\921úzÿ/\1cz´´ÿTô\9b3Q\86\87\9a?NãÈä\8b\bk\94 ð\ fà\8b&\93»w#Ö+<\80zÙ \v\95\95\81º\83Ç\0u&µ\81ZÝ{@\8dõ( Rn\ 1(\97ú\ 6\93\ e\94\1a\99\8b    O\9e2J9J\88ÎÐ\17µå \1ck\8cy\r¬?­B¬\17Õ\84\90*\93ú\99r\ f9\8eÿQÇßé\12\7f\9b|\7f\µ¿I¾ÈÚ\eå÷\1a:\19%8ô2Àh\83&0R\8d\ 50\ 4á       ô Ð\81¾:µ\81^<>\10 N>m \v¹½r^h=a®Z\ræ\ 4
+%r4}\14°Í¤õ\97M\e\88\88+1nþ\ fk￲^\14,\81\80/ªä¯Ùã~s|\11i\8d\92\1c~\fµ\11\\8dÁ3Y\10k\8d\96dî ¦\1fàØúQ+\0k`/\81UHÒÀbã%`Þ'\ fÉqãcN\10ò]jPÛ»x!SvÿnÚ\8f\1f\1aµ
+5(êÍOE¨\98ßÔ^ä/þ\17\7f/b½\91µ7¦.+?©½?®Þ_ÌûnG\1e\14¬\17p\9c9\v\1c-\93\ 2\ e\10\86ÀÞ\7f\ 2`\ f0\eØù7|¾úý×\90\81×7³ù¼¾ð\98\1c\8eAéo\97,ʾES²­»ÈÕ\v%ëýX{\87\97p\8co\9f¯\19=y¿ðò\14{Rõ\ e\19\14Ï\1döáé}é!ôFú]\1e\8dì\9b6\9bf¯æjW»Äw¯ÁéÛ\94vÇ\ÐÇ\ fUÜ)l\83V%\87bd\7fü§\11\9dD\ 1­ÿ'\9aiéùÜýæ\v ;øÑ\ròHàÃ\ 2x¥á¾-LÌ\aækFnRÏ\9c7+<<µZ¹Ë\ 3½~½¥h÷\12dßÝó\98ÝöOéc{xÌ]Ë\93\83g3\93}\ 3<"£ò_\19¸\87ýv \9e®\9b±úú¬ÓO\9c]å>qkÉ.§p\94³Û>~ª\8crnQ\81h\ 2.\84(\7f2ZÑtf\11ܽiÃÃ\16\ 1T$\97øR[ \aqY\80oüä{GÊůÇܹòÝËÓåg\e\94­ïf,3ø:}{P«ÜóÀ.\8b\9f\85°ðÒSy!,§ú¼AOc3\97ï'¦·ú47    Üie\12¿_»ãDH.F\19à\9c\87yrA"ÖÉ\rK}¯>ö\11äE|÷'_\01Ô(£\15A^\142\80Ì\9d¿y\b\b¤.*ߣ5÷3÷äì\Øgfç"W\9d¹¬Ý\9e\ 4M¢7\ eÛïè =\9aÅ÷Óá29_\f6ÙöjÀ®Û»~\95m\1ez~µyîÉÇö£ëª½hþ°\ 5Ù1\83«ô×Ôa\85Jë»<\8e[ø®\1a4\97Õ[\11U\87¸n9X·ó¥Ð32\88¢¢¦\95\9fHÞ¨@ÄPÇ\89Ûã\8b(e¿JÍ.=yß\rºçÚì\ 3åNv]\99\16:]\9d\ 3ëmºá\b8­ïô\9ejeðK¶¹Ì_\8aÍ<ý¬66åg³Á\1e\9eÑ׳^UÀ¨.\\94e­adüê¹ß}Vnã#S±0Û.\ frçV)Ü1\9f\1f¸\9bQ\16ÎO¾Àß \15¥5¬¨¾h\8eCWÀ~\b/\ 2¨\190\1a!\97\1a¯\12öëÂ\11\9fÖü&µ\80\92ðàÃE\94\ fªZÐzWÌw   \94\a©<ñ3)×8W\15\8aßM5²ÊvÍ"¾\1f8\85eÍË\15¨SPË\97tyðg>®8\16æ\84p\1a\9dCg\e©f+«\10\80@¶Ø\9f|\ 1\8b\9fÓ©àУÐÌk¨\87(
+\ 1Q?\94 \8bB\ 6JáLÍ\14gùC²\88o¯ù²ü*\17ò\ 2V\87bt
+\94\9f\1dåKJ6r\rå¼vv\95«\1a5/ë÷Ë~¶\11o^2çqó\91q\93Ãwú6\9fâénöÄ¥\82õGK\rJN*\19î{µä¸.Î\93IyóHÌÚ%%\911_K\94*à,\87Í\97\93w
+O$ÈÈ\eí\ 5Î5n\8f²\1aP\81È#\9bgOAä\8d\7f\18ê\94\90ÒÝ´¨§-\\8fAÉ'¡\fò©`¹¬¤lzVO\8eË37ñ=\8c»\89Y\1d\9eYgd\7f\96ÀÏÁÚÉëa\84\86\1cê!\íM?÷±Ù°ËĽqhÆ«©J).âä$æ/÷A¬Q¤³±F)½\8f)\Úÿ\15äåý\83Oa\89°i\95x¶aå\7f¼±Éq\89Ç\12³ê>\82)  ü8ù8yu\8aC91\ eu½ò\ eu#\15\95L»d\19\eªÉxÕqrqá\93-Åüi­\1e\9ak\9d\97Ã\81åæ÷sKg\80gv+ÊÍ´\84\1ea\ 4GB7\ 6ÍqÙ°µt´³ÑÃ{\82ÐÃÇ¥£\87\81½@bØf~\896Jôq£Ffå§-¦l*EÀÂz¡]2É{¼\1a__bþ¸u\8a) ~EøÔr³ý\10Ê\ 6@  (K§ðèÂ\8aÙ-~%Óâ(Í\bö\82e\fà9º\1e\9eÌ\8c>nåJzRë4µïm7Ðf=r¥á/ç¬.G;\Í'³\96JcDCÙ,Î{e³Ê9ÊfmôT\9aLõÕ|¶<@Ý,\a¯Uta%·§äXjÈ?\ 5ge}pÄw-÷^9\9bÝÕwo\ 4×ñÆ°\85êF\ f}w¯\8f\e\83\13\94åUO*\9b\a\94à­ÍÚw e\8c7©á\ 1ÁªË\81(©yÛÒUê\9d·\95\9a\16\9bUdo\11våj>±\94Ez}\95ü]\9a\95\1a\95OJRÄíPRào%E1ËPru©Ñ¨7êÕNØ-f\9eF>ÓÎxfb>îqèÈl\19úîa\f[òIO  3OËÒv4öÔ\88Ò{®.÷\97¥\9a\8fmW*õÚo\95ÍhïAy\1e\95R\12\\15\ eÐ\81ìÍÅ·,\92\12&ùë\18-5\8a\ 5QRØ\9e!\9e½cJtk\EÔ¥ROè¶6kÁÒ\13/>¸\87
+?è£dX~0XíùÁ\88³ ¸y>x\8d\vÕ¶2ëäËåk\16\99¢\1d8PcbjÃù\18ÃWå¦cæÙW\v\93äV)÷\9eKy\7f\9aÌäZ¢9\93«ßÚB\16«Ù¥ä?\8d¥ÔhJ+IQ\8d]\84\86ÎWÇ\17Ý\8as\16u¡ð\10n~ó-t\eSB°ì\97È\a\1fÉä\aÓr\86\93\1a7^Ñc\ e\89\9dÍ8\8aÍd¼\ 4\9bÉ®Gl&ÏÐ,AÏ\1døÓ>Q\1eö­VNÊõÓÉÔ\92V\90\1fÚùP\88Cë©\9b|Q\vow¯ð}b-K­É\R»©\89Ø>2#±½\92¦b»©.DýC.\84{û³\14zükÍ?ë\8f\1d?T°#o¿¥\e÷\9e8!7IUp.\85\8d8\ e\1c^ÑåU6«ð)\96¸ÔjLÁØ\8f\18:H\1eémãBÐeÕµiÎÓÚÔ>\9b
+©}\8eס8ñRªõnd:@K$Èñ^\8aµÌ\ 5a\8c²ë§\96\13¾g¥bd<éÔÚ.Åk·<\13\1eM2:z
+±ËiÀ¿Rë!?|LGüð°\9eòNn:ã>ÔbÉ¥JÓ\r\87é\87\ 3;¿?.l¶O>Y2nbÌ*,²\fS\1a\8e{¥h¾®V©\83<\1cQR\9b>\92'cN\92Í i\93j#\8c.\13\91jKzBy(¤êÆ\9c"Y\9d×Ò}1´\1dæ>\14­N£\85ëÓQ'PYzy\94ëue'^½ÞBx\1ccSþµ½\ eù\ 4ÖïqÓ\½Ïaãx\8fÃÜ\ 4Ü×éé1\9bÝ'¦,ÙC³+0\85WqË0£Î\91Þ\15w\ fºÂ¾¾Ô¡FÑT]J«\94t\9a\96ö¨\90êÝ\19\10×Þ~Otâ\ 5\f\7f\8c\9f&ÞO\8d\ex\1cßÝñ8Ñ\12ñØó\14Ëï\9cT9\95P7q[\90Ê\82Ùߦ£Ä1mqË=\94Êd|\94Z\e°\15ÍLsÁ\87\f3á¾ØbÀ¥ãÅ.\9b\1d\96¼S\1d¦h\ 5\1d\86y\86}z7ü\8eèJ\ 2\9fR\87\19¾¤êUÍ\83R¹P²8\rÉVÓ#H-A\89Äõ\9b\8e\ 6ìDg¶(à\ 1\89uðx±°ÆB\8exc\89ÚP\ 3_Ê®\82é6w\ 6é4Î\82é´eæê&YL¦án?.\17c<rl ^.×\1fU_¼%\9e[!>LÍùÄ\14\9bpéþhÀæ\³\83®\11ÜÙ\ eÃZa\87®\f½6å3\9b.UßùCJîÜ&d+8ÏÉÖ\93Ú\92ÚP;\127'}'ºÌ\18àAÅcñ¸\1fjØXÕRXâ:j\80\99EÎAú¹z\ 2¼\95\92\ 1î*\15\80·+\88\15S\84Ò\8feµø©\90È-ó\16²\9a£û\e\112\97Îõ¼/\ 4Ýí\86\1f«±97ã¯cv)w\ 6Ì\86\93a\895\1c\96x<Ã\12\1d¯CÉ»e\97tÓÞ\90¸-\97\9bß \a±Eû+|Ð\ eö¸mR\17l<\90_XÒÎ\13`6\19H\80à\ 3\a\10\ 6\b\91\99\ 3\82Ø?\ 1ANt\80\87Õ\ 6Àß;Xùµ£A¹&P\8e\8cS|ë¦eá\1fNÇO\8f/âå\91©O§\92¾`\8bó\r÷Ý©ó\1fPN\8d\8b}\ 6\ eÁzt\95\b;\94ß<Ã*?\9b\ eév¼>qǽ\11þTÆcì\9djL°        Ö]` ×Ý\80Ìyæ\ 3Â=ß\ 1ÑÖ1(\ 3\11\10\1d\16Í\8eMtFu@tc\v@ôè7 j\17\13\10\r\88\ 2ù\ 1\84ó\88\ 3"!eRa¯\92³E\f\18¦m\1fX\r\ eô¿\b\99\8bݱåóás²A¨\9c]öO\13fãV\ 6´\a\94¿ºµ\11\87V}XåÎï\11wx\12\81?\eË\116IUG`\ eÏW\0\11ÚS(\8d5 )ÿ\bH\9a\r T (g\19\90L"  åÚ\ 4$Û\\ 1\92K~\ 1\89\89q@âl\1f\10Ï
+|\17'\a¹í\88\98Ì$\84\f²Ä\eÉÉ\82E.sébÜîÂSW|>Ùìm¸LE]°ùÜaÂpzeH\8b1¡G)Í\10\1f¿CÜ;~\ f\1f6Æ}l²\1d\8c\0\19×\a\0\9e8O\ 1Ù\1f/\11\87^Ü<@.\85\v\94b\beCý\85¥á\b\85\K.\94ã\16\90\9b       \ eÈI\ 3\96ßÉÁ\ 5U\ f\1c kû2 ³\97Z\82®|3Ö½8×ubQg\14ñØúüðr{Ïù\88C\17\86[\8eH\eK¦´YLh±\97\1eRÊI\1e\90í\ 4Þ'z\9d3¬Ò\9fu±ÔÖíÃ\9a2°ÊGw\ 2(Þ_\ 2Êøn\ 1U\89\1f¡ÔïPv_@UY\16\80òÉ\ 3ªÖD\13:Que\ f¨Ü\9d\0\ 6GÆÎa\ e(\1d\9e\11ý\10iÌnÛ5e\962\1d1«j\f\95c\90Å\ìå6wþ=\17\8fÜÜ\99ìà~\95_Ò5}:¥\9aµú\84\13c¢÷\15\13\9c£Û\150ì=îòÜ\ 1 Ê\eXåä\v«¼\9a;@3õ# Õé\15ÐÎã\ 5è\84F@i\89PàÖG'³%(Ï! S]ø<3É\0ZÔò\80&Õ5\1cÆO໹l\ 6\88HGWq¯X)i`\8e¡ª|)ÎHW¦òýEæìj7ôèý\9b\QÍû\ e\ eפþ\9c\88\19ö\15Ù     È]¼\11\\90?\ 6Ô;\9cÂr´(b£\ 2K\-\8e\7f\92\81\ªL¶\8eAY³\80É\91\1a\94r\14\8e\ 1ÆÎL\0ãàWÀ¨\e\1e0ì´\f\18\0ýx\e\80>&æpiŵ\15;+ \9dÜ©\9a"íe¸Ôiî+\fC/à²kâ\84\fð\88C§È\r¢åxX\1c­°\8c\98XÀV±\91ÏÚ\84µ­*\eXV\7f\a\18ëpø\vüª°Ê{-\ 4,·Ã\ 1\9bÂ\18À¶á¾\92mOâ\80í\10\ 5ÀVJm(á
+°Õþ\ fëÌÆá\13âj\1d°\8arü+\12ãå¡|fãËqI\8d\15\18M>Í5\16¥²ðin\1c°¬Æ]©³Ò\8c\8cåY\1f\7f\1e¬DxÈ¢\8f­í\9f\9azØ  D)\1e?\1c:{ÿË\80¼
+ÿ\ 2¿$\ 6¸|\99\ 3Ü`«\ 2îIÇ\0\ f\0OxuÀ\93Ú\bp¯Å\ 1pç8\0Üæe\ 2nrl\ 3®âÝþLÈ'÷ÎÈx¬/-\14\13\11Þ\9a'xa\14\94p\14ÈB+"\ 1GÌïý\r\9fÔË\17Àd®>*ëOM¿\1cú\17øþ\18\8fÿvúV\9eÒ_\98ÕEé£B1Ì\ 3á\l@Yô\81°eÖ@\98ÀÓoaªr@¨ìS@È\8cG@\90úoÀ\87Ó4àwÉ\0ð\9d7ܹ?ß)UðUS\fNq\11E\9d ß6Ù[Ùo<\8dÝ_\b\90£¦möï?eEÞã\9f\f\8c\7f\14ó7ó\8d\bëOÎD\Èü3Ý!õ\89Xos\ 2à\1e*\9aG.s\aÒmK\ 2in\99@ªýPu©¾Ø\0IéÓ@b&e zß\0.\ 3\8eoè¬\95\93õ    i       ÀÓd¦vȳäûSxúZ#þ {ÄÆQM(\88ù×süëïå\17(êø\87ùþf\v#æû\eì\10e:¨`y\0j;÷\ 6êÖ£\81Ú\11t V\16\8a±1P\8eÏ;PÖw\ 3(¥s\ f(&ö\85¯m6\95ã\rä\84O\1d\8b>\e¶ÒÔtÊ\84Ã\e|.éÒ\ f#ÿiÕ߸÷§7QÄÄ\8fÝ\18E÷þ]Ä?LÆÈßûËzÿ¬\88Ü"Èú]\bÀp\v      (Û\120Rðpa`Þ\11è~\83\ 1zÁÌ\ 1]\8bm\80Î¥8 -¼±Ô?\12%nãòiê^IÛDjüý\13Î\81\1f@\8f¢\8eaM¿ÖÞÿ\84{Qt/\82«ÿbíE1\ eÈÕ[ïÅþÀU\84y\9d  bëÎ\fÄZpo\11Óë\ 4°\1e\12\9aCÒêß{ÀR¼\0\98»e\1c\98³ÓT :D\8dQk±"ñ5O\ 5P]$r?\86qdÏFVè\1f"~\91/?5ý p4{]ñ*þ3Kâ/k/J\ fþÛÕû\13ØûKzï§ñÏll\ e\ 18\f~\0g8!\81SÔcÀÑ\82\16pÀî\bìÅT\ 2v~Ø\ 4ñOõô/ì\14®æ\a\9f\16}â   \7fÓ$^é5'þ\95}\8bfeë·þrõª+(5ÿõÍ\17.¯ô¶ðxæ\ eÎ+ØÈÎ7`Ý\ 4ñ¨Ü\13̽þ\8a\8b·s"­_o\99bâ2`\8aQjï9á·Ü\13Þ^/üâ[}ï\eÔ'\8b"yQF\ 3\9a\85\vÁÝßy®~ð)²ÅF·ï£\eä\91À\87êéá)ô÷¹d\9eÂ3ç\89\11íh\9fö\10:töÖ
+/ÅK\90í\95Ïc¶P;áM¦î\17\1fëúÞO\16\eÞ9\9bpw·¢ÖÝ\ 6Uy´\8d\1fÍÅ&q\8d{ët\90»­¨I\15,¼ÜL\9eûe¹0;7\9có$è×É~U\9e\9dQuÿçO¾@\83½\ 6mÄP\1f\82[>^\ 6x|\81B\ 6\10CEy\bÇ¥\94ìûÅ\9b8ÚË\93I$÷å¾þI\1ewææ~Þ$Níëji9\8fåÆQ_\v\7fç~î\8bÍåÍ\97\82«\99\e;íJ7q\12´nê$~\vcãÄó\9b\1eÍ\12Zu¸Ìäú\83Maºí{U2ìùÍOª'ßÅ\1dj\1f
+\8f\ 2\88¡\96m6\95=\8f©p\8aà.2w¢)ÃàjP\1e\ 2\ 2©Ó.¿`¦æá\ 5×u>\19\93\81¢&¡Ô\8a£oߨ\f\97I²>(\11×V¿Êì:=¿²\eôd\7f=îºÊzÞ¹µ×ë\8eùX{\7f%"<\9e­ïü\8b·2T\FM+MÓMêÀGy\bÛ#,ÐΠÈ\8bøîO¾\0õ\88[ùR\9c2\90É\18E! s'B\7fhÂ0\ 4ÿ\90\81²=0{^;\1e¬ÎPî\ f7\1c\12(}tì\18Tk\96\96¸æ2ÏHMjËh\8d\12O\9au¯NÚuá\8c%k\r\1dËVÏ=²TÕ^L½ÒM¨Ýr0KMË6ÑÛ\97Æ\85gXJ²m¥8«\89¥"~®<Pð\ 1âº\b F.U\9d\ 1\1c\ 2©\bò¢À\ 6T`;èÔVÿpÉFI\ 3Uíþ®Tºp<\8bæã\82?\95&ð'wY¶Au[\1a\87âw]=\173lõþ3)W^t#/Çϼ\%uÂæ¼Î\Ê      ÁÞÌúC"\9d\95?V5㦻Ã\8cNȧômufÒÝâ©\9c¶øü'\19\9ec8
+\19\15\ 5µ¢Ôà\7f\r\19\88\12d#sR\84þ
+ÔÁ´r^Ë×rUí\fWÓ½9Y¿Ge \98E(\95zV~UÜ\8c\9b¨ôÒ·Yq\98îfZ³T°ª/S\83B\7f\97\fw}?9®ìîɤðú$fM\8aJdÔ\9cê,;\8b4r©ZFÛ¡\9e÷½½\19mY»\94J\8cm\ eûÜP¾ÀoF+òò¢*QûPu°¦¥\9aÑÞo.5È\95Éd¸1ðd\92#±Äw/Ñ\89Y-&@)Dh\bþfn%2ÒÄNà§mÚÉk«\9cCÝö%»dík6û¼»qx\ 6Û\8fW\13â4æÏôu¬\91©\9e¬ójü²Ü"ÍY:ÛuÌÛÞl\9bÝÚÇ7-Å\89£|\ 1\ eÖÆ Ó\88,\8aè\ 1Ú\14Q/\8b³ü.\81\104*ð\a\9fn:Ò#îõO׸\10\8eÎ1\7f<½A¹\86±Fòñ\8d5R8\1eó'      6¦`     Ñ:/rª¥Siüm\8aq³[j¥Ðjö­\9c1¨M+\86-]Ûú¸õ\19éI=¶Ñ¾÷É]\9bõ%FËÄ÷I\r\7f»}\rÿ\8cBu9W\ePÚC$p\9c0\195\97Ùâ\0}ܨ\91\88ð:y5ûD\85ý\98aÙ½i1³\8d1¨TW\86-\94ÖP\ 6{=ôg'(^dA½=ôq#\fõ¤J\0\ 1\91\ 5\95f4<PDu9°55o\97âÊfÒH+¥Ô¦¢p8Þ\95½en)Wó§(þC\16\99:/\8blª ù{e)ù\87sLòý~\13\89,
+\8b\16ê&BæéÛöÉ%\b\89\8bñÓ\rÁ]ý\8dçWÚÌ=NÔe¯9Tó±Â@¥^µ      \94á\ 2
+
+ÏRàöµ\83r9(¥Äó¬p\0Üåjæý\94E\92þJþZ%¥F1ÅK
+ÛÔij·rD·\ 6\8a¢.e:Âíä¯\85®[\f\ 5Ë\10tÁ2É\16\1f<k\18\82\15Û\14\85\8c\fþQ\84H®:ú\9aÉ ÕflnZ~[ú½sÕ'饧\11\13\94^ͱ\½ñ}YL_;\92¿\9c¶¥F~Ñ\93\14z=\84r\9a@yÍÅóö³\12Ý
\15u\819\b7_½\bÝ\86\13Ý$+XJùË\a\97\11Í\ fÚW\85·MÉá VâÆ\83{\9fK:Õ\ 3ûý*\14;\9b\85iv¶à×ìlÙÓ¡Ü\93\1c @ª\ 4,#\97i\8bc\1d\99¢cÍ\86\1a\1aÃ\91yÖH:¿UʵKtX\93\8e^l$^\96×\9ep\9fÔ]¡gä\ÁêkPrr\9b\ fB¶Ã\ag¡Ç\ f\aÀÛº<æ»9çƽÄ\9a\8a{öûê_ÙÙh\17²\99Ä\97d       \10\97\99å|\94`ò9²ÆÐT/BCôfk?éÍ\8eÓèR\15wéR­CÐ¥ºdÒ\9bCÌ*äß\8fL:¦\964{{ÂHË(=\9e\13\1e\95\1dÆ­e©Ø\9b\89í#9\14båN\87\1f\1eÒ.÷¡Ø&7\19S.\97b\ 3\97\10Lá@Õks ãwÙ9q\1e°DÁ\eAù.\98\15Km\98¼g\1e\19ºZ|Ð[q\fèÒ1ài®¨YÔ\9e\1d\15©ê^\1aRbvu¢Äx\93\8b\95'ýëâJú·¾L\89ÚZÍó\18Ú§%?\82¨Äk»5n¼²£\87F6f\aù\10{®ÄkÆ\99\b½÷¡Ï;\8b\\9bKm¨&;ÿúu\96Ì,\eÌê9n2«ã¸Å\14\9cF$Ý6C\7f\ 6=z;\1d\ férz9¥yÜ_Qû%º\1aEíWæ\8dª\15ê_Jb<\8e<z\82E6«\9d"©JÌ\90¸¬''¢]ʲ\84\81\11\19B\ fÌ\1d¡\1f\ 5\9aÐW99{\f\8bÉÄ<Ü\8b±\16ÞÁôϨrW\99mc\8f84BÐüÈ\18\85p©PsÙìͯ3kk\c\98fµFïÔj\83.ï2\r\9a¯$\9b4\9fN¶¨\ 3\9elSµe¦GIùÒ\bÊxA\9ehß#\9bWêJª\9dÄ\87¸\9ac\8eh\a¡\89?\9cx\1eï}v=ì\95\1c(lDb\14æ\8c&  ðI\ e&`\8a\r\0\98\ 4¸\94iï)ÛYëCÁê(ÎWÇ<\r\ fk'^g͹\10§?#n\9aËuØE\89j1ëê¦Nï
+¥*]aJuêP±ëT\1d\94´ä"ç=%\r¸\ 6Ù\fß\r²E+\1dRÝZ\ 3âÚ.̶͠\84ñØ\1cñGÿûÄû¶Mb¯\89«`£T\98\ 6\9f\ 5iú±\ 5Øn\8a\ 3lVv\0ÖkL\ 1Ö\1fÀ\87\ 3\N÷\89[ÜÞÕÊè¢W¿Ì\7f´\F¸þ sÓ*ÏùQû4ä°0ÑaÉ[Ðd\98ç FWÔR\8d:t\92°JÓnP\92¯ÀÂ\14P'Õð]'®ãg\83è\94\896aòt\ f\7f\1cÄ\11Þ¯Û\vì\15\96<Ô´ñì\ 6¾àü\ 5Ó\85.\0\9crm\80Ór\ 3Ê\v\96úÙ\11\0ûNR\0»ûk\80=n\fÀ\ 2SK9\9f\81\15¯\17\18Í_oµ8\b\99âvB\7få̸/¿\e²¹\92Üf\8aÕs\14ÿAW
+\8d\1aÍ\7f`Cëéd\83\92q»I¶òt\9dÔ¨w\8dè¸\97\1a\1e\80c\ 3\8f׶M,\8c]:Xbtì\83o\ 2\ e
+g@Ü\0¼\96<AY¾\ 1^Wx(\9b\ 4À\e¹\16À\vÌ\ eÊ\87B\1c:qÉ\ 2<%\1f\0nÊ"À\85\9c\81¢db­é\87ѧ¯]¨T.Þ\19!sdØþ¡åTR\8b(¹ß¤\ 5ÕmP\87]µIÉ\82Ý O¾\ 2K´     Xâæ     KÔ\8fÑ\80\1d\v\ 6ø®'M\90aÛ°\ 4\ 5øí>\ 1ø]\81¥Þ\eg(·\ fÀ\1fy\11\10Ø7\ 5ð ã\ 2ü\99Ú\ 3ü\15c\ 1~V\8a\0߶®\0\9f¶t\80w¦ñ\ 4¥\88ºÕ    \ e´¶ÔúQL\9bì\97\97gѼ]¶|â*Í~i9í\11~\8b\16\9c\99KÕ§¥\ 6yÆõ\1a©5è*Ñ    ßU<páq%\9cok`6j×àá´×\ 4DñØ\85ò\1c\0¢$Π\94v\80\e"·?dz&\ 3¢cf\0Q9Àcpµç\ 3"[ã\ 1\91«V\0a_\9f\80P\1f6 X,e{úSC\96xuÓ­¿PÊ\890¨î·Ü¬ÂÌØ<Õ\1f2Å»\10\ 1}ߥ|u\10m\ 2\94<-Á^úJ\95èÚt\15\1f¸Ï*6\9e¯*`ö\1aV\ 1\ 1Ïm\ 1±¾´\ 1\11r\ 3@Rö\ 4Ju      es\0¤"\ 4P\\12ÊW\ 3$SÉ\ 2\92ezPîg@\82½\ 4\88Ǧ\8eÞÍQýÀ\ 5\8d\8c²ù¸BÎU#\99ªS\8a÷̽\90Å\9c\7f\13«-\97\19K\9d;C\86ÝË]ÊonZ\94ü\194I]ÈÔ\89î@¯á\83\v\92ûm\19dÉ    lÂk[\a¤ôv\11\87Îé\11øu§\80|x+(Á\ e\90\81\f\8b     ê!\14øE!\9fi\13ʵ\bÈSy\bȳ~\ 5äVT\ 19\15\@vkß_"mÝÙ\9a¢\13¹8\89RYDk\9cA~èäp²å\b\81\993\9bM\7fDWkr\8fR\1c¿Mº»\99KôðF\v·ßz\ 3\ 3÷g\rÖ¶­Â¥Ýa\95\v\11®á\91é\ 1\8a\1f\8c\ 1U\ eW\80\9aj\1e vÅ\13\94Ñ\ 3J\0\0åÅyÄ¡½u\1cPûX\ 5Póã\ 4P\8b\ 1|ÂÀ5\0U¨w\ 1\958`\80\1f\8f´i?\r\19ùÌ¥K\87\ 4²D¼\9c]áp¨Ç\95úcªñ\12úd[\r{DL\98\8fR\8d\8e\9e`Á+-@\1e\14\17PX²\ 3¨\94Û\aT{6\ 4Ôå6\ 14#,\ 1íäv\80\1e®Ï\80>a\ 1 _Æ\aJ+r!\9fT@\9fc)(û& ·\19øä)þ\ 2t'°\0\f\ 1\1d\97pdTVü> éïT\9fo?\92\ 6\84d\98ìKp¸ä\99\aí\a\ f\92:Î[\7fhyl\86\ f±i~       Ëáóð\r\97\a\83ÿ\ 2£å\ 5¬)·þ\ 3W\89©\878tæu\ 2LÏx\0æÞû\ 2V\7fÑ\805T       °|-\ 6å^\0,\9eé\ 2&\80Û\ 6s\84G#f]O\0\9c\ 2¦<¡\0c¥'(
+C+<NÒ\8fy»çã/\94Ê®®óè \8d\fæd'6]\10ñDe\8e¥WøäO¿\10\8cþqFGeýW\ 32\v\9cÛ\7fqúÞ¿\80S\1cæOÄð
+Ä $³\80\e΢¸)Àµ\84\8a\8b\và\92iø,\9e\87\7fÃÅ\15`\8f:\vØÑk\81¦áS+¹\83,«Ï\80Bþmn\91ÍÜ\18\ 1\9fø\94V6<"þºn1B,®~\0yÔª?5ý;\87Fp\15y\8f\91¡ö?¥;|\e6\10\8aß\ 2\10Üx\1d\b¥Ñ\10\b\ 3\82Ñ\v\81\80«
\83w\ 5ð«`\ føb \ 1Þh¢ËD<>d\15\9f:(²\16\13Xþ«\b_\96\1då\ 3Êm\1c¯(à\ 4¬f×?\8cü\1f\1c\1a\ 5` rPè1ò\1cÿ'à»ö\10¶ûqÕ"\7f/B\9a\r¤ëd\ eå½\aÒ,ù\ 4RuÏ\ 1)\96I\ 2I\16ú@<\7f\1e@\9c|b@Ì\88\80\99¡øyL\17mæËq´!âÔ¥[z\13Ã+ñ\ 2ëqó\87CGÈþ\87C£²P\83PE(Î\ 1\7f\8f\15þ\ 3|\11ÍT\vÝ\7f\9f!-¼\0\ 2 ¶o(\80V5ã\ ePñk\v(ÃÚ\ e\14\ 5\14Î*\ 2ùaî\80<8¥¤{òeòYá+Ò§¸Å\90ñÌ\91\ 2\9b\81ôWaÿÂz\11\fGå J>1´\17ø \96xÂÃå\8f\97ö×ßû\8b{Q\92Ão`.\82«®jþÉêM¾[ÀÀª+ /Ù7Ð\95\8d        ´Ï¢\a4oþ\ 4\12á\a!u:Ä\98Ã\87ÒÈA©$ý\99R1
+\89þñCG\1fÚO\97\10\fG½Aå JPZ¯¿ø_X/"¬\7f¥öþfå"¸\1aÍ\86\86rqã±Ý\1cÄN\ f\ fÄJN\b¿nW\15Xýv\15XtÒ\ 3æÎ\16\809K78öûIQ=3aã9pû\93Y\8dbB~\09l\16âÐ\b÷¢ e\84 Qo~\ 3{Q\92\ 4½¿®Þß\19ÚPxC3¨ÿ\13óNR+àØÛ=p\9eÊ\ 5$\88-\81¬½'E\ 3N˯\0Gï¬\81}HàÀÎ\e9\10¿\12Ëÿ\vÿ\81ä¸*aÏ]+O´ï½\11<\9dÛ\\19¶æóìrpÍðÉõ³/<¯øIê\0\96VdA\8a.u«^ÖîèùFzo\82Q\11·^t/\1eïhã\96\16Û\84WÝ~Sùþ\ 5\9e\82Zvxþ,ó&Ë\85\85³¡¨¥jÆ,Uò\87¬\ 6\9eÕ >¢\©iªý|ë\9c\9c\8fÛÕÊæÚ¥{~d³îÍýWf\0\1f\ 6\fu\1c\9f]\93\9eV§NrNï3\9dÅ<(îW       ²E¬\ 3¥\17ߺ\89\13Û»í~;;~ýìán\9c\121ªv\ eòüêê¶\94ð.N,õ±õÒågöQ\98½¾D5ú:¾ãc\11ü?Éÿ\7fãбþß{÷¿Ý¸\b\99þ\87Þýo7\ e®æ?õî\7fÚ¸È\ 2òßÜèþ'\8d\83«ùïntÿ\93ÆÁÕüw7ºÿ÷ÆÁ\83ªHcöá\e]öÁ{ÍS\85¸êó1%\ 5î\91®\8cò\18³I\99\1aG\10L>j_O\18\96½\9dø\10G¡¬\9eë¢Rï¤Rª\17SZ:õÆ\97Ffz½\9b\93ì\9aùi¤á\95ªv«\1e\9f8¾Ê\9f\92ìí\13\9d\86\1eõôÜ\99\152\1fÐêçbˬ\97ï\14õwáÌÓRIð\83t¹ÔÚ¹\95\951\E}}Ô\9dq\92môӲݼ\91\957\97)lîòÜÙJ]¢G\\8aF?Õ\8d\15\a£87\18\88Z\8cµÙá3iä¦òtÏ43Q§Û\8blC[/§\1a\19¬^÷\a·1\a[\a¶{Pß\1d±ÊlÏ­\9cË¡P\92H\7f\ 1wºÇÏñ\:ÇÝÅðÒ5Û\87ëù\95ÿF]W\1eå\f\9b\rÖä+²N½°í~\13&ªãgQ\9aßJÿ\17¼ó»\1a\88NX¢mò\9fÿÿöú?5:raý/÷ú?5:âúÿ˽þO\8d\86«ùßîõo£a#9\12\8cC7
+[\8e\1ajáÖ§\95ÁïÇW\95hïË]R\1dßg\94ä\97<8F\ fîQ\7f\ 1\a<Kmÿ?ÚÎt]M¦iÛ[ðm\84ó\ 4\82ó<\80\80 (È \bN(\ 2Úºÿ_cr\8fo\92g­;É\9fË\80æ賫º\9b®¢`QålÌ\7fö²\8a;es2\96\15\91UG1ÐZ³xÉ\97\ 5'\82Í°e>´u»@\9f\0[4¹cøWÅÊñÊÆ©´ï|24w\ 3®\11
\1cïîÇöpØÌuÕÁ\91%jÇ©Caò°A§\96ìn¼ÆôêÌán[!¥úùå&³âÖ\95\85¦Ò
+Ê0\0¬\96À3[h¢ôݨwráªk
+1ÐÝ9Æ\91³Ñ\ e¯\86Vr\ e©×=rLÔ\17è)Ê\97êÐTÇÁù\11!8gùðdh¯©}-¥\81ëâµiÄ=\95#ÙÛ\9e\14ÊÞ¨òêøéâx\14\9ao\1eheV¾wS·ðÑ\1c¸Z\90\97ÇÚ=>þ²å¯6d\98\99ø\86-\7fµ!Ã{\95ß°å¯6dx»ú\e¶üË\90 \7f\8fÒ \7fîl\0\96\0/\a\rPhú
+(Üõôãê$i?\86d7\97\19m\1c\8f\1d:8[ûL÷b¸,pôG<íjÑe%Ü6(éêä.ç£^l]Ú\8fñ_-oÎpwò³¨\1fà\84Íü4ê\a8a3?\8dú\ 1ùQo~\8d÷ß\9c°\99ßìý7g8\ 4~¯÷\7fr\b|ʤá&é÷zÿG½ù\85Þ\7fsþä¼ù¨IÃ!ð{½ÿß\87ÀçM
+\9bùÍÞÿNo~µ÷\7frÞ|ʤá\10ø½ÞÿO½ù\8f&\85ÍüfïÿßÞü\16ïÿ\86!ð]Î÷\10ø­Þÿlo~ƤaMÙïõþ?zóû¼ÿk\87À\8f9a3¿Ùû\9fè\r\ 4L3_Qó·\0àÝ\bD\1d¼TPÌ\1f3\8f
+\17£=½RÕ.Eþ|>Fí\92g±ÔÒ7\84CÉ×Ûh3Ü@©É1\ 5äü\13÷WµEÚ[ô\eXð«åË\ 6*D½\ f\14\80Õ\0D¥SMPX#\1a\1f¹{Ýui/\85ô¶\97R±ì\1dô\fóØ\9dg\87§\ e\fpSSeí"cÛáaUo׬\ 5\11+îæ¬Qý·Àf¾uúSòwÎqö\ 1ðM©\r
+çúö!$ü\Ðî\1dÃ\88à6ô{\86#¼Êþ~Øk?\8cå yU·«Ú^\9eØ\8e±\12        Y]èé\99Ä#Ya=+\1f\17âç\ 56óã\1f@\9fçÙ¯¨K\1c\0Üj@Ô{׸\8b\94\9dñ{'sä²GÁ>¯\94Z`MæÛ«Þ­÷¬\r»\këêµ!-{l"|f\86·'1næ\16\82ñd-\17&¿ZÞ\9c_\86\0«\ 2ìÐ~\ 2üIv\1e×;e\ 4\92­d¼Á@\1f]g¢r8&æ\9b\8bY\1dF-5SÝn¤²ðZ\88\11g5\15\86W\9eá\9c\9b0\9aÖý\ 59\8eõ\ fÄ·\ 46óÝï> pl\96Ç\90\ 1Ìë=A¡Àuï~±¢ûjOɸ\a^¢/\15 \8693{\9cq­md@©\e\8c/\b«æ\93\9b,Òµ<5\9f62ýiÐJµÇÊ®ÖdÌõ¦õ\1f\ 56óÝï j\81\rQU\80ç&/P\98\9aý@ªÆ4/ÝdR×¢È\fO¯;ÐMÏB7ê\8e°\17k_\82¾'È\14ɳÏsg¶Ø\9bõ\89L\aá\1f\0fI/]¢\19{üË\ 5\1a䬭´÷\1e\8d>®S\87ð{¤«¸y\1f\8d9¢Ü \ eÙf~µÝ\98sa3í£Ì*\92(\12\ 2}Û¶8~2®L\9bw±8N\90[\8c\19\8dsùÑ´7F¿+°\99\1fÿà»\ 2\ 3½ß\975\80ïn±{½+to£¨°vü¶ù:©D\9c´J&1Õ2\83÷_\82\97jôª¿LñNcî\18lyú\18µ°I¬È!\8c\19:ïäÒC>¾ü)  3çß8\r°Å\0N¬Å~\vÇ(\9eô» Ñºð\11|qÔ\95\88oOe¯fD¬!±)^b-Q\9b\17jüé2)Ì\ 2¦\89N\14\8fʲÃ\9e\90¢\8f£[|T\94:a\18E-O\87د\16\80íç38@ÑÝÝãñð='.s>UNÝÍbf]Æù\8bñÜ#\98ʪÓòº=\e\16\84cq\99ã\96D55\8d\ ej\89q\1a\9bÅ\19¶êFG\17º\1d\19
+\8fKd\0j½×\8f\ 5\81_ýK\0\1e\91!ênb{zI\ 4çæ3\8fØxß\1a\e\9dÓì \1e\ehLº\8bëÔ2\vöñyuP\ fÓvÓØ>ó\1cgè6`°¶|\1f]ÏåÇÐÛ\\ 1µÆ©Ç`\13Í\80\9f\96°7ÿ<\ 3ðÒ~~_æ\ 4ûR\8em\ fö¤VL\e\9di\86V1IפÖqµ\173\94q\9b{\É\9döÇOw\9c=c.\83\8b\13wtËÅÝ¡hÈ.%        Mw L£·Alw\rCÜ÷ç/\14\80ËqÁµWìb\8f\bã\8d!\8bJø×*T\8c#\89µ\82çè%¢\14ç|å\0g=q\95\röp;ìh¾\97Ü\8dj\17Ŧ\9eDÉ¢:Rê0è\vû\ 3¹=­Nd:=:\7f@Âäý\a\7fú\96 \95ßM\ fÔÀé\182qTÔ±\94J¯_ã{~1\89)EN*ʵir\93'Xl¿\1e\8f|¡È\ f\r/ÒTL\93¤\ 1ñ\98(¤Yj«d\86E5\82\r\ 2¡"Ö¯\91ÿ\17¾\bû\8f\83\ 3©±     ³qÀ;êxÖP¥ÖaçAʮǵ\<\183Éò\8bv§zj(5È\ 2¤+5Is\18é\126s!     ä´£úÇé\9eéO
+ûIÏáÕi\8f«¨ó·\84\ fLüyðÓ\ 2òÍq\aäÓÆ\fä\8b\ 5\v`õr\ 6à\15ô\9dRÅ-ç\ 4ðW¯p¿M³Ìm\8bzkÇa\eÊq=¼níA£­í\98Ys\vÿ/±ÝVò¦¡Ý{èN\ 5`wT#\87\95·I1çË\8f\ 5\81_½å»¨\1fà\84Íü4ê'zó3¨\1fàü\84Ñ~Ƥï!ð[½ÿ\89Þü´IÃdÊïõþ\1f½ùÍÞÿeCà\ 3\9cá½µßëý\8fõæ×\98\14\9b½ÿæ|\ f\81ßêý_1\ 4>jÒ0\92þ½Þÿ\9f½ù\85\13\91ÿ{½ÿæ|\ f\81ßêý\9f\1c\ 2\9f2)læ7{ÿG½ù;j«f\ 3lÜÉ\ 2\9cn° \90\899 ÐâJ÷Ū:¹\rjQÙá\16¤~ØÜ,Ó²RmÓ\9c¼òæV\18UvÚ£5±ÔÍ$\bï­)ý\ 3\f¤þs}²\88ó¯\91¯\9c\85\ 3\aòTÓz'S\96\83\1cÀùÞ\18RbWP\98I\95û2>áné~^uJ{Ñ:ÄögÛÊ\81\9e\85´­¯¢ØA}ÙäQ!dÕÙ¤\1fÍ`=}Ò\9eèÕ_§o  læ»ß}W@~Àw¿¢ÎúФ\1a\v9-f\ 2\11ë.(\9c\8fµû²§\b·ômd\9c\17\8bw2e¯ßî§Ýx×;n=&wÔäeæ¬Æ\19òº1\9fèSF\93VR\êE\7f±Q¥Ó\7f\94°\9añ\9f\8eº\1eí\ 1v\98#\0¿r\10Õ <PL<\1a÷zÏ\¸vda\9d\97Y÷¼\1färWÓÙM®Û:Ssµn\8e¿«       ©\1a\93\19[-\12ù0ö\(2r\17\92Æäükä+gó
+·ÔÆô\00o\85¾7POq
+
\99ÿp\93±f ¡æÒµ¹Ëñ\ïd\èù\9aoÎSf \83Ìþ©ê£Wt\83ô#ÑuÙÙ\83e\876îBÊÃ\9es\94i\9c¿+aJõ\87\97\80ütÝû\8az^\1caä¿EA¡`r \98ß\ 4w\9fr\eþë¤/]t\bΧ\87Ü\rlz¾\b\1f\b7j#%P·é´+Oª¶³òëûÓ²Û¼\9e\13;qÓ\97äÍæÛöõg$L©þyð\15upç\ 1\96P!jy\9f\a\85æ\91{¸yã\1e<l³îÇ\aºx\9d\97S[\1e\83ÝÌ\89zz´\15\9cäS;c®Äñ6Lóò\12\8f\94\94õ\8cï^¤ÉºÌ\86\11ÁdMGN¿FþÎ\99ßÁõs\14à 0õÃhíQ1ÖA\10AÅêm·\11Å\v\1fM]\ f)ÿ\19õmë X\85²¾^4\99/\99^\9eÁüÙ\974o«\93\1e³DqÃ1\86r]ÿXÂ$äÿþÕ[@~µù\ 3µv\82¨|\ 4¢\1aIþÞÈÌ|?¾\15\18\11WN\9d\88»ÖiU:轨½\95gØ2|3\88(/o3!Ë\8f\19\8e[0Ôä!²\ 4«ç-\82¶ãujtxbìOK\98\1d\f?¿¢N\9fs\0\ f\1c¸Be\v\ f\9eJ
+A$^qoVZ¨]\8b¢¸:êñ¦m.\96\v]ÍFÐÕº^\8bM\17\ 3µ\13¦y\91\9bý\9aæ\1d¶øæhR\88µ\86\r\8b\8fß\9f?- ¿5úpyJ@\93j)xIJ·K÷:íÌ=òò\boá¹X\85©8>àD{\92ìn¶ÑêU\94\9dç|*v7\ 2Å\8f\vÏw¦·6éTn\156¥%\8a4*Ð¥!·{\95)A³k\1f\900Ëñ¿\7f\ 5ò§\ 3\ 1\9c\0ðh\ 3^\92\ 6\ÙW\1aÂÄeµãÙñwÙâ9¢U\ 5ÓßJ\82\9aÓ3ãuù\93\8bÌ%Ûâø£\16¾r}ò<K\ 5ÖÀ·(}H&\90Q¡:C¨\ 5\1dC\a\88ÿ\1ayo \82+D=\17\16p: ÞÝÛ0åÛP«ÒÎrÑ°\8eú«\83اgn¤ë¦JÉ\95\1aÙ[n\r¢>¿ÔN¥©4\1f£cÂ\15²\f-ïS£\19\97O\ e+q-9XW\8a)r\83=Òo    3P\7f\1eüG\ 1XüN¹4\12\ 1\ eÜÀïî"ùËܾ\91Çäq®[óñûM»fóVl)øƪ¯b\93UQÈ\a±üle¯²\93¸6K2{T\89Óx7\e\e
+Ü4B5\12é\bùâ7Q26¡b\1f\95°7?ü\ 1¤L\f\0v;I\8f²\15»»(Ŧ\8e\84\98hY%Ã\92·Ú`v×\10<\85®eõ\91[ D!ÍÕ\ fblB\fØ\b\9b\17=½'Â\vÁ¨L/\9fT\0\100\0{ûIªÔðEl{è/\12\vÔûê)7T\8f¸µÏ§nnîY\9cAµ¶ýkFT¸\88x\94$ät_æNÅ\a\17\ 4«`\1açø\80exÑ£¹và\8d*gÖ£\1e\e¼\1a\96?\88\95Ç\ 1I\8c»\800Läo\12¦íþyæS\ 2°}\7f\1dJò9x<\ 5\8b\9bjî¶/ëõ\8dÛGÇëØ<!,é\17\1d^oæushO\93±Î\81eïÔ\91.Oôã0ðª'J\9eÝÎTÄÞ^\ 6ýøüJ\92×Â\95ØUr\1e\91\1dßýOIØ\9bï}\apó6¹\1e/\aÒrD\7f²íÏ\93®RT#¥\95^ÚT\ 5.5irRñ4\98\98Ýæ\8cqXc5\12QlC½:\8aBÅê\8c>HfÑ-Iõ@\18F\91\99DÄ&èæiß?ðò¡?®Èç_#~\97Êwmö!\87Ïhn\13¥êT)*\82\a)û@(î\92¯Y7HÄÇL\92ÊÑîôU\19J\r©KÅ´Þ\804\87(Mfö©      Áä#\ÿ8\r\84þ¤\10\88\1aH=®rQ \ 4Ú¿äKJõÿ\9cþ\80XÇmó¶í!çÌF\88ɳu\8cËm\85¢©ëS½ÁnYÌ^Z£º÷8S1U\fï°\93Ã\f\9b \90S'\a±:\85\9eÃ×ʽ¢_¨u]±Ðì
+\8dB§[\ 1\85\97Ë\83\8eØ)P\9f\97ð\91\84o\9c\ 6¨ü(\ 3´\8b\r\0Z\19\8b0F\99û0ì\eÕ\0æ\97V\0\8fIw\80\1d/ÕÀÇ
\e\11õç\17ô9_\9c\ 4¶.\1eZ\93\86dkµéÆ\1aÐWe\97ݵÂ\97û\9bÌ!i\18\93\99nm\1dE<ëî çjKowü\19ù\17çûBð\93¨\1fà\fó\ 2?\8bú\ 1ΰ´÷gQ? ÿ·7¿ÚûoÎ0"ø½Þ\7fs¾#éßêýÿ4\ 4þ£Ia3¿Ùûÿ·7¿ÅûoÎp\85þ½Þ\7f\87Àoõþg\87ÀÏ\98\14\9b½ÿ\8fÞü>ï¿9Ã\12Å_é}º\ 2¯Uô\1a\ 6ª³U\0°ñ¼\ 6p¤½~o\a\ 3àh¼\1e\88X\99¾%\91äÒ\99nXñ\18ÔêÒ¾{IÉ\16Õ*(»\1c9SÍ|4¹5ðµdnK½ö^\17¦Õ«Úrú\aEi×ìïJ\98\1düá\ fÞò\aj\91\ 4(¿\81¨Æ\16ÚPS\e\0§'2\8c©ý\17À\85F;h\10£©;D\8aÒùÊÏå\83<CT;\159\85\1dÒ=«Æ,\97Ô·óµ`èÕ ei"¸\9dÕ61wes\v·äÙÂÚü\19       \8d\86Z1\88Êס÷-K\ 2ùûå\ 10ïÔ\ 2øFÜ\0ÜÍF¡\f»>\18Ï97Û%Ôs\85\87h+³µ²¬¬\99\98¾þg\9aw\7fR#ÚÂ\93³\83ña\8d\8bï?2»º4\92úÏÈß9¯g     `\89\0À\18õ\ 29¯¦
+
+ÅFü]ÚÛR\b_^ªÂ\95E\býäóª±O¸1sÇÖVæÖ\ 5ôN¯¯E[}\ 6èY\8dZ\11_!\90BruY¾l±\96Õõe°\97Ô\1f\vlæÇ?\80\80\99
+@7]8P\9f\9e\f°<\80¨\95H\e\8e\ 6
+Ô0ù¸¶LÒßDoâ\95å\97æ©Aï,Ûx!{sz^ØÛê\8e
+Sª\9at~]Õ^Uºo(/¸KÇÈôµ¼·Íý¢³nk\8b(ÕV\7f\9cï!\10¢æÓÏ\rÀ\88ì\13àÝT\a\14\9a/\1d\14\f1ýà[GÊï"qé\9a·,û\b6àdgÜâÉ,æOζv*\ 4ª*!Þ&K§\        Ïö¯«Êõì-º5Îæ\r!«ñT5\1e\96]¿?ÿ£üͤùb\14r\8eq8\83\v­\19ÓêÞÌÝ{ÙáæÖïò\rår¾zÇ£ì¢\17k\9f!\ÃÕÚ\81\91¯îÆ\8a\8bg        \7f¬\8ebÐ<\84/D©;¼IM\8es\84<©PnÊ\a$\8cÖ¾÷ÝWT\8b\1a\82|+\rQ\97µ\b\9cKU\88ºÆ\8cÇõlfîuŤ<½ÛV/\ e\1c£nóòŵ¿mP\81«\98\18}\96Î<\1e\ e\81U\8d-XË\88O[áÓ\80\87\90§\197Új3®³U\7fFàØĪoÎ/{è¼\ 2\ e\9cìV»\a\1d_1\1e\95\99\9e      Úq\89òRH[»pëþí\90ìá7s\1eÔ]M­®Î\e4\82ì×\95q°[n\ 6wSHÏ3Æ<ßâv³k\9c»L«\9a¬O«Ë\95ú\96°ÔêÏ\83\1f¨\ 4ôþº©\ 1ìÐ\87\92}èxbw¯»BÚï\r\18ò\96Õ\ea´æT\95ôÅfR§Ëö.»'5\9dî\1c%îäXb;»2\ 4\13Ùèó1ëh3¾G\9a\93»Õ8\8fege\8ceiª}TÂ*Õo\9c\86¨\bôþ\95\86Þ7ú:\¡¦18í9âÁÏêFЮ\ e\93\1eùdÈë¹A\1a'Y<\9fw\8e7=ê1\8c±ä3¦mW\r¿¤,R\85ûj>édÂ\94ê¬b÷V\93\96|\91Yí!oYb¸³ØÄmaü\8cÀé^¬~å¼³úûêY\96ã 00\a÷¥\8b\19~ï4Lº\87Êpp©\94\90Ö\88½!¾î\86\82\f¦Òê>PøEê\9c\18s\97\92CO\e\95\e5îå\9aC\86z\1d\18\1aYm8\1a1j\1aÍÔTë/\81ÍüëÌ\aä+ês6\82+éÊ\0øh\9f\ 4\85\953ð_º¯ÝvV)~-\92=òô\9a©\925cÌ°7z|S\I\ 2v\9e-\13æ~0\9f\8a­î´ñJÁ°;\9a®Ò\8cЭ\f\9d\9d_§ªI©MUS\19\86\12&cîSòN©þã\fÈ\17ê5È»\84¨ý\9d     ð\1d\97´Hxä\Ú\gõ âø GîíÝun´Æ{AÉg\87\13hV\8cä\8f\89AkV»ù\95q_Ü\17\98\9e\1fM«Tø\9c4µÈ9Ø !qE²­
+M2Ò\17;?# ßìÖ!ì\86\86s)b\81\1a\16õùJªÑ¹\9eÌÆêü`\99û\91´ûõÝ\8dk±Zfå\r¥Úf×_ì*v\83\13\98tqÒ5l\94±v»ÌèÌ%ÒÃòv\9c\1aÜ+\99\f);G\84è³R\81H$¸â¿$Ì@}ãôw\ 5ä\aT\ 3ä§g\ 6\ eЪ}÷øRú\96­\ 5õó=\bøC\16\9f_­2ÖŶ}\9aìÊî.Ù\10\93ÑDø÷\84øB\87ħ2îeXÓ=&éã&\95\18ºÜ F\89ñ{\8c|Uè\18\19Kaɾ¡ú\99>Õws\9f\17ØÌ_\a ¿\9a5àÆ$?\ 1øE:ú±á6â,N£ÂÞ\9eG'»ZÆ:n\894\97R¦÷&¶êÙUDÀìYz¶\96ÐäØ(?c\f»ÈDFs\9a~\r«\8f×k\0XîE*¯lxC\92 ÅC´?\9c/\13ýlnüS\ 2ò§°ö|¿\9aß½\8e´¿â|p9d\86ãðe1»ªK±:UI\1a\e·6ô×\e\99\88,òeñÅ5¬<\98\90ýä\839\92Ù`äæGÁp¹y\ 6T\vçï\83\ 5H"\19\ 3ÄÀ5_ýÑi\1eëç\ 6\83è·$4Ú÷¾û\97\0\f=w\0\167³·\97\ f\86qÐvÕ\8d\9fÓÓ\a\85\92ýA°Xéå\84º8öè\13·^DN\13\ 3n
+Ù|1\13ÞX¡K\80¹\fWùàBµ\95éu \ 4}\8fÔ­è\8dLEÏ>\91y,\83>S\1a?ûÈ\8dú¯\12ö&ü\ 4Ø"Ý\vÖµýì\14U\8bý]\95G4=­52²\98^ÔE³6î
\1dGqR)ÎO\86±¾Ì85C\1f-õ×\96zz\13\83\8a\9a¥Ý ¡\0\9b\1c\ 4§\ 3a\15ä\13\91£§N\9fÕûá}ÏÞ    \94oPjþÏ\bÀ\9d-u\8cw¶é]uÔîjV\9fÛBÄfD̬^á\1e\9a¯ì\83ôToFÑ1\93\ViwV$\86\ fÑe¨\98ÆL\ 6I³'\90\99}I$\98<*\13È\19\ f_}\91Úö1;bö8$°{E=8u]òò}\81Íüø\ao9Æò'ß¼YÍ@£ãjO®ïV\eH¹ÞÍÅ|Ï\9a\98\9dÎ\81áPþ\ 2ébw*¦\9e\92¤Ií0\82A\17\95þ¤0ª\87FsøA§ÇUFD¯è\8f¨®+²tWh°ãn\ 5°³\8eØ\19ñPØÅÏH\98ë¬\98\19CK\eÈI\92²F[¤\ 2b\ 6)#ÓÉ0r\9eÒ\ 2îp\94Ò.\89dÆR7ý       >Ýõ\8aÞÈé
+õé½ãKãHGlÏ\12í\87J§ ð¹¶ÔçÑv;Áã­\97Á\97Z
\f\9fñ\80\9fëÚÏ\b@<2\v\10Mi\0\84pY\18P]wpóg¥\0\96\9c\ f\0\86G¶ïí ¨EA~Þ©\ 5\8b\1e\ 57µN\8f½R×\ 1ç\8c³Ôüt¹*\8bã\ 2Ç×\87\ 6+Ëûv±¦ØJ/½µc\13ϲ4à\9d­dî\1a\18\aæxø®\84ÙÁ\1fþà\ 3¨\1fà\84Íü4ê\a8C£ý,ê\a8ÿ§Ñ~\8dIßCà·zÿ\7f\ e\81_ãý7g\98Oû½Þ\7f\87ÀoõþÇæͯ1)læ7{ÿG½ù\85Þ\7fs\86õi¿Åûh\94É}å\¾Æïd\8a\1dµa\98ê¥\ 1Fl\87\0\9bà&À\1a\83\18È_Ø\86\7fG)ê\16\97\vS)óç\19[\81\94>)îÁ~+í#TmcÇcgÍ"ñ\8d¹3Ëô~\97\17\ 3C\95³Îó%ë-a|óçÁG\ 5 9\ e\ 1ÈA\87¨ÇÌ\ 4 ¯\1cät¢\19\18öß`\1cpl[PÔÔÃIÉ\1d\7fÍlÂ:\ew M\ 4grÌ-\8fþà±Ú?wqÙîÏj\e+¥oÔ]¶SÙ\9ah·\8cIF?naÜ}S\1fØj§(\91¾þQy§Tÿqæ+ªg7\ 1\1a+N@¾X;\0\f+#\0ó#0\ e¨\b\a\80#\97ì\83k\9cúÞ«gL¯ti(\9eçõçê ñºl\13\vy³³*\87w\9aW3ð\99\10Þ\8dÚ\96ª\8d½.\fJWåÕÎY\9bäöªË\99«¡üG\ 1hYø\83³Ò\9dÁ\ 1:x?\15\81\11\1d\ 4\ 2fY\80óæ    àB\16}p'tè)\82Ç_\91¡(\9f\16Î}³W\11Qµ¨ûH3ó\97\96º½Ü\15C_ YK\v\ 6èE\ 5Ýx \ f\vcc}<Ö\955Nv7\7f   læ_g~,_PѨÓ\ 2h\97\80¨³Ñ\11\ 1
+ðnuüµª×m`÷Û45ôzû´x\99\94\840Ñu¼\9bOÍÞ\8a\8c¾C3yÝ(v0C÷\fç¨×Ü£¯ÊÏö}³\95\1a'\1e\9axk»\e±ºwÖ\9f\92°pìÏ\83¿£Ò4\8c©\8dÅ\19\8eÑ9\ 6­INA!\93¼\80B\91)\ 4Á32òâ·Âú\82\ fÍíq\rò;;M2;s\9aéØ[A^\9fµ\96­\9f\14ÍÊ\9e7iG\ e÷ÐÒ¡ß÷ÄZDÒ\16à̬\17\9d\16#þG\ 1hGB¿ròchÒ³ìÀpz\91\7f'S6Ã黪÷1w\87\85 )\83ÑÍÈ\ e\14çÂ9æA\99çl\8b\86³Þ\98+\9d½&'3\96B6«\96L;¬µ>\aO{ÅÓÆyÑ\99U\15¡¯\94$!Ñ+-ÿ%°\99o\9dþ\96|E͹\10uÃC\93Þ·\10Õ\93¡I¯Âì]Õû(ÛÃ\82¿¡#ô-}\e¨Î|\97<ìõ\9b\17.6;lÔ³ôuêl¨q×6dFÛêk®\9fØ\8a"B\eË\96\v ·ªÍ­I°\9eÓ8X~^Â\94jøù'*\9cSÖz\ eÃé\9d\ 3ðÜ\1e\aøSâÞU½÷%C\16üX\ e0.Òï¨çÚÞ´ìì\9a7\f!\ f¶ZÔ\e«\9b\³ºYÏK5I\14¯ËÍB\91^\8a@~)ð\9fÓ§\94Îa\1dY\84²_þG\ 1èHÏáú\80&½ja]çé\ 2ðò¥\0
+\ 5;|S"(&\96~ð¨\ e\8b\1eá\ 1æ\8a\19yå¸\99õ\8cÝI©kúã%+
+%eÖÒ,\17¬Ä{ü..T\12[ñ»\9a\19\9bÔfÎ\ 5l§B\9d]M\ 5l¾ü\96\84)Õï}÷\97@T\ 5ù\82\9aO\1f j\1f\\ 1>\ 2EP\18¸ü£BÑ^Ð
+Èâm8\ 6¬ãZWioø7Å,O\1e²ÖÛÖÂé)\1f\99£¸Z\9a\8bÅ2ºY
\159
+ÜÉm,góA\\9eÖ\90\889\ 6¥æj\f²\9dÅ\7f\94÷Õó/ÔÂU\80+TÜ\85s)[\ 2\85uL¸×í\96ë÷\ 6í\82Ëâ\11ö,ú\9b\95\8dÈÓÕv]\16EeÔñ\16ë[\9aá\97/µ3\172d\8bãÎ\ 6ÇM½U\84\9f4\ f«å¸ó8\85C\80í÷k\12ÛÏ\97\97ÿQ\0:7á(íÆÚpÑ\8f.áò\84BÎkµüà[1!h£Åp±ñRV\15¿\16¸\80=ªóîbWÂr\82¦9U^>×5^\ 4G|¶HQéé\1cÏÅÆS_hOǯÑ\9ec    sºd¨ýJ§éVA¦­Vyý]        ³\1c?üÁWT:        Q×y\11\86\a
+é^ù^ïÚ\9c§_\9c\93;\8eU\vN½¦\8eö¹µ33\1a¶5SìE\84[/ÕÖd\99\90@¸³\99\9f|\8b\99\ 6\86M\8fÕB\9cfvÉ)K£5x%Áa3CÇe·C\87inþ£\0T>¾\97N\94G:p1­\89p:1þ\ 3Ú¯ê+87q÷Képq\e8v\8a1ùþî\1a\f\19\1c³2÷\1K½+\92ó³õlO\9b\86Xc·;¹J³Åkex\19PUªªg\9a\83\86\9c$H0\9a\85\99ÛA°\9dêÿQ\0ºs1¸\92\16»pÚ\8fV\0\97Íû½\1ek\94n¦×`.|i¸;·ó\8b0(´\8f\aª±}-÷\842\9e ÔJ\96£=\ 1-Çk³ú\8e.\8c\93q\14¡ÇÉ|fX\9e\12éÁJs3d§-"Dü>,ô\a-±E$°.ýcy§T¿ó\1d@/\ f\1c®P-\88ºØÊ \90z=üØ0À.\17ûD\9eºÖN³O¹ÎÓ\f\18³¨eûå\86T7Úõ\85Õ¢ÊÜÍØc\13Å£³\8c½ê¥ÂºÎð=\ 3ï\97\ 2\90¯X+NhÜ#Ù7Øc®gÍ\8eÅ\1e\9dqkÿQ\0
+^8È\ fÖÄûê\99\8b«÷\9aw\f\\94\9a¦OÝn¹eO\16ÞÚlV\97\9e>\18_RòíÈcb*µBøâ4\99\9dnzj\8aÝ9t\8c\9e6¥èp\91\fÂ\97\f\f"¤b=#\ 4Inbýa\99\18¬\9eë\1e¹÷\9fÉ{\7f~^àÊ\84\14A>¸S\0¿0ºGÜzÎé9W\ 3\9f5\fy\85-4º~<nøÂ-,NZõÏfTÀ\9d\d&iÖkL=¹\a\83µÕû¨\92\89>¨ucü\18lr\18 ûk\13\10\ 3a\1eé\8f¦\9dx\8fí¦SÝ\93\9eÈ}@ÂÞ|ã4ÈO[%\80íGLp\1f£²sÓkk{\82\9eo\86<qëêÁ\9cÌäúf·Y\11û§%\9cÁë2{Nåë$\9d]^\99)¢\G\82\17w)\90\99º\83WP\ e{Cê#Ë#\93Ú: 2\12ñè#\vìÕ\e\9fS±®\93\ e\12ÿQ@~KW\0n\ 6\13\17\87ïySMN e×WÇC´,IH¿·´[õ¡PÜ)óÙk\11\91'\99ImËÌf\949Z6ì\1dõ\1c·í\81ú
+\ eä6POdº0w\88\11=pû{½æõQ\90\vzøÍ\ 3Ý\vëFÞ\12\1aíÏ\83\8f
\94{Ãï¶rÝýÈ\83{ÓN\92\99©XQºI­Ã3¹D6ÇÜ\Ì_ð©ÞÌ×Æ\88©\85\ 3\9avgÝñPj¸s*¦  ËAÒd6dF­j\ 4}ÏnûÇ\ 20ûc+°{Nl\7fèÍô\93Ó½\82­ÛåçªÿQ {óÏ3÷\ 5\9bnØh|àm_v\1aQf\9b\13·~\8dçûűK\9c8©Xr&\19­yc8Ôx\8eê~/Eõ¢Ù\ 2¤\8b4\b\9bÙwúÇ©Lô±ëj\18¾d`Ü+ú«Ù;s+®ø®Ð\90Ån\ 5¨rGìÈZ§\11U\8dÿ(v\ e,wÛö\1en\82\vÚ\ 6[wÏÚ\b\98D]\9ek]·ü\98Ih\vºrñ%ª\17ihdÆ:íúÇÉÉíqå-èºK#Þ­<´tÇ\97,´#¶\ f\85N#r(·\1fpoØ\96úçf»\9d¸v[/ãN¶\14ê>üK¾¤Tÿ~æÇ¢¿\9a¨¸9§â\9b\95^pQ\88È´f/¾Üd\8fT¦9ª{¥ö ¹\1dõ ]tØ\15j<Û©¿èp;Ø\96z3¹¥\fh½ÕKóv+f-OM\9d^_\9b$²¾A1îÍäÑ\0\rsbG\e\98\80â§?%°\99¿\ e\0\92¿DAÎIa 7,u\0"\16aÈÂ$\\18N_áúUjÂÀ:»²\ 1ª\1aQ\80&´ràânÛ»\9b\16-\8c\98ë¶~\98\\86\8b:ç0\ 5\87?\1f+¢xÆH&\8c=O³yC?\15smûÈ\13½ëaYª>,Õ{\1e>/ßå|'!\7f\12õ\ 3\9c°\99\9f\0'læ§Q? \7fôæ÷yÿÍ\19\ e\81ßëý7ç{\büVï\7fb\bü´Ia3¿Ùû\7fôæ+ê\ 3ÅA\8e«BT½\ 2Q\85Üí+j»\ 3QK2DÝ\1fâ\0­\1dª\81\90r;Þ\9aÃ\87®úì³×AÒ\98^²5\84s\90«)\9c1\9dY\9d\92|*vªÆ\91\1f£aqÒÁ3Qwß\fv\9e\95 \ eûÏ\v@jAÈ\99\85&u\86=\80Æ(\18¯¸M\1fä¥\\ 5ä\9d\15÷\1e\ 2Òå\bò\9dDê1Í\9fë¾\ f|âÖÝGØ+\85ä¦Î~ß\9a\9fñ\8dÈ\9fJ\8dÒêà«{ùP7\16ú~í\8e\15ï\9cìÍjú0G·\8c½=O\1dã[\12f\a¿÷Ý[\0BDb\0Iâ8\14\ e¢v\97\12´&\e\80ü£Y\ 3\18\87\815\8e\7fé \8fÂ8Ýõ\80ü\18¹$\eá.Hý<?\17V\8f/w£È\92¸\aý\95l¿Ü¼jÇija\11òÚÞ\19\aþb\8cQå ótÛP\1f©\94úy\ 1H\1f¼ïß Xµ\0\90ºÔ\87\ 1\95±\81aêê\ 1)\a\10U\8cÃ\80U$o\0#Wø\9d\84×\99¿Øë0¸ðgg¸\14\8e\9e¥¯öò^]Û=7±±R©±¶Ë\1c\8a;\93vb'\ 3«*\17m9Þ\86FS67VÙèù\91ôy\ 1È8\ eM\8a\95 IÇ6     Pë\f9×[ÈIÌ\e\8f1_øRà¯ï\8a÷ʲCyÑke~Ù\9fnâé\16\99­\ e-±'Ùýs\7f³ÛMxÕDû®nL(û``0ÐÑêÚ~¯ÄúiM¦\9eWIb*gñ»\12f\a¿÷ÝWÔz\ 3\9aTsÃ\12TO\811êå   °¥Ü\ 4x\85\94 èÁ£\84«Å \91,\ fo\84ÕZ\ò«Ëú\18°\94¼ï¥Jª\95v\13ï\a\1dm\1aÓqå´-¹îU¯nõ@\89Ý\9a\96Ä p$LHB\q2±ø¼\0d\99\8d\87\9cï'$\91\83O\82|&¡\ 1,\ 1^\0;ì[\7f\14 »\8f»\0Ô\92ßærÃ[ò9\86aÿ4P\ eÏDWµS% \99ÇÊSßòDR×îUÆP;Ý\88¥ô±ÓIÎN\9fÖ\8a\93\1ekQ¸½\96ïbX"&|^¾¢\12½\ 2\9cöÉ°®3­\ 2\18\9dE\0\1e½µ\ 1n)\9bÇ\85\7f\80\99\87\17\ 2¯\1f\89\ e¯{¤"\9eùç^Ù'ºúz\87®Gë­Ð鮵\960\91\15\93e«ÔT%ÖH\98ë\ 2²Ù-\e\ 6¹\È-NXD\\91û±\84»Îo\9c\86>Gÿ@E2\10\95*ëp\8c\16¢Ðçñ\ eÀ\9f¶ò(w_Oÿ\99[\94n\83EttÁM[8¼¤ûÂÊ]\1a\v£\8c<\ 5­=³\ 5\vÂU@FÚ\85åz60Ö«²O+bíBí\84~/µä·'tÎ\ fV\rîóò\95s<,\ 2´\82}©ë\9c5·p\8c6!*\8d÷@¡àk÷eìñô;Þ¢äÒqot¾í\19n\9fJÐ3s¶¸Íô¦ÌÏ\94A¼7\95Ñ:;[\17OÖ\¬\8b\18¿xeÝÕ"\96p´ùè¢
\9c|áæ9+\e\1aíýù)ù\ 3\95\84\16úÎ>äÔú1\80o\1a½°ªW\vîº\ f<\82\98\96®ãé!ìÍ©9K\8d­}¦8ÙúÔb¬j\ 4ÆÊûk\84Y\97ö       v       ÇýxÑË\9aSÞlõø¹]m¬ggo.ÌfK\99\83r\9a}@Â\82Ë\7f\9e\81Ó¨\ 4çÒ\92\81Vå»#8íY\ 3`Þ4\ 1ðë\90x\97Ê\ 6­Éãy3ë«Ê¥ÈÏÈ\ 3\11\1dî»´ÞF\v#%St\86ë+± Äfs9XÄ%'\8coøáyÈrG\1fLg\9c|[N+\8fÑb"\96úÜÄ\1f\9f\97¿sn(\1aÎù\95ù%\99²J|)A-¿b\9a¯4^O×v\16å³/Öû¶µk\92ÆB\9e\90ª\ e®¤\8c\9d&äªÞî\10\8b¾_éó¹>Gr\ 5\ 4\f§\8bÎ\82\99¬ês~ܾ\rVãH>Ï\8dÛýþô-a1ì\9f\a\1f\10\80x\8d$\1c\ 2\  ®¤<\ 3°¼º\ 3xg\97\ 4\85¦BÞëôKóôËëy\9dfÙÒ©=\8fu,l\19\r\9fÈ×\9fãRo³_κë*\r¯ÁÝàÙáiéÑá\8a\99joZ»ÈÄx\93l\ eÙþ¾0e\fx\95aR¯è\9c\19dòÓ\8f
+læ¯\ 3\88ZM|Aͧ7,ÀØ\8b\ 5p\19¤\1feK"}\ 5\97¤Û(ç>.evP<¤\f®n
+\94ÖÒ\92\99KKº\96\8a\83]\9aB\96Þ49\8e5\9b\93\87\18´Æ1¢\13¾\a\8a¡ÔÄ\80¦\8dÄx4¶\vâ(ï?\85\11\eDg\9f\17\80FÛФ\a\ 1r6\ fc8\97"6\\99а®3¸ûLÏKå\98ÕuúÐ\83\98Çì<S­lÛÛzms\9c²ÕÕ#þª/\ 6·Eu^hÐÕi33©\8dãó}\83É\ ek­Ñdû$\86%Úc(á\94_RÕtZ¤øg\82ÿKÂ*Õ\7f\9eù®\04G¦ ]¥2ȯ\9e\138@«\87Ç5ÝÈø±Qªy=qYÞYî\19÷@]Æ\19ÓÛ\9dp-\9ds\8bÒ"V(\85×\e\9dWJs§Õ,N×\1aV\1c'Ní\12} ¶µáµVhP5þÚ\194'\a\8aì\8c\ e\13²C÷7¤\©\89\9f\92\15~\ 2´<LA9ÂÍè\1d\ e\ 6|>9Âu)\92tíû©êÔã·éÁ$G¶ÅQfd\eãjÙÍ\8c\93ò«Î.\81\v,)â³U<\9f\1f']=3rêó$µÜZ   òy¬§\bm\14CÞå£\89#Þ³¨G½g\rÇ£¾¡ËÊç\ 5 \9dI\1aNûX\15\ ePv\ e
+©ãÙ#nÂËY\9c\ 6a®ó@9Ï¡U\9ai[£½{xÊñʾÖ\12\85§\16\8e\81ÉNÔk:Å°è1:*\89ñØ\0$jQ²\87hQ"¹£\12\9eIw\8fíd¾\8b-°j\17S7\83\7fI\98\1aúÆé\7f    @çb\1aä\vÝ\ 6À#;!¸/'a        êÍ9\18\8fufwË´\ 6[u÷Ú¨,\e±¥Õðê.w¤ýäK\82\16\9f*íj\98¶c-?\vè½\0\865}\ 6\ 6òþñ$ã/æI¤\82Z¬·\1fyñî\89°2\9dËÐÂ;ó\88Wÿ¼¼oEìÌ,È\a\16¼Æ_Jâm\18W¥câ~VwîÓMmûs\93\8b¬ 5AT\12\a¯ºÅ_    ò:ëеÛx\94(zô%Õ¸\rýóêFµ\82\847\88\8d6\ 1a&»\8f¾\ 57]½Ãé\12nÕ{Xz\9fì\16c*Òá\e2þy\ 1(pr\0Û\97\89 \95ØÍN\9bl\8bعWLÝ&Êí\942Û£áb³VRijIÛÈ\84ç½Éj¦ÄoÆØÚEm¦`#ö¨6\87sF6ã§A¿*;ä Ý¿\12£XÞë3\ fÏï\9dJ\aÐÃY=Ò-QB²#(\93ì·\ 46óÝïÞ\ 2g|\ 5\vKP\aG\ 5\ 4\94\1avõíMP\95"³K¬c\9c\86,&1½8¯\9f/õ©Þì\10cļNhw6^\ e¥ÆK¢bc.,K\18\r\9dÌÔR&\81¤÷V\7fÜU\ f½³¸pz³\86ìu¯óù½[>°¯Î2IÄ>/\0³Ïa\11ù1\96Øy»y\93\ 3åÔÛ\bñ\94¾ÒK5GpÈâmö\12ÐûØ&º\11\86CÝô¨î\vEJé\90­AÒÌ\12df\1f\19\11Èé6éO
+7¾çð'±Wô÷r×\15/z·\ 2öfÇ\97/aÀÞiD/\97öC\vüÏËñ\99è\1cL!Y45#_9Éb*Ý[\11®!\bESZͺþBb\8fÔ&4ÚÈ\9f¿\fª\17\19îÉa\ 6u![.ÒÇ®ét\8f«¤ó\10+Q\82XÑZGl?[\90\83\am\89ÈÑív²0m½Ìæ¢ÕËÖVß\950¥ú½ïÌ+%®µT%µ\96üùp/R¾]áÝ!Ú\9bêõg\8fqèG\7f(ÕñÁ ¹]1ýã$?í
+5Cè\88-Ci?\94³ÕnÇÏçÖkëÝÞ\99ÛÁóÑêe¢¯VÌNÆ\9b:\93I7I\14É5\93'\fk\98Óz¹1,´ê\9f\17-YïO¤Åô\19î\ 5\96t\9bóy!³ÈN\93\12\91a\8aÇv\9aRZ£,a\8f,´W¼\15ñNýéV[/Ýl·b;\85l&\ f\18bâ´\91q\14¡nsºXgJ¦\Gn¶Z;.\8eFmR;î <\8e\11\vßmWu¤¤÷y\ 1¹VÃ\ 3Ù\17\9b\0Yf^\ 49i2\ 2Ȥ»\ 5h<ú\ 2huÙ\80ÿºÎ\ 1b¤÷ï °\98{\82\9c\1fùÆ£\15̱^ß\17\94\89Í9{\93\99ûJ>y·[:\88nTµ6×þy³½&(ãpIWùË9\8fdÜ}°ºYß\95°Úî\e§?\85ú\ 1ΰ>ígQ?À\19\1aígQ?Àù\1d£}
\ 3\9cïÞüVï\7fg\büjï¿9Ã!ð\e½¯È\90Ó\11ßo»Ft\1a¢V±(@\19­        Ð~\14nd\13å\ 3@f­\18ȹõâ}z9¶ý\9bY"<1PG7\89ïL\\ 5ófn¬¤-®D\8d^]\fªµ¹\f^ÄαªÄÙÉ\rZ·ÃíÖpl\99\9f\87\7füäýùQ\ 1\r\17\80Ì<     yOe\80`6\vÐØÚ\ 4¨BÄ\ 1úzv\0º\ f«U\16Ó\v\84åS\8fc\91~\97öò\1d¥ç­ì\euk?û¬\eÇγ\8bɶæ\97\f\15[:\b¢KçqCÔÏù\8b~8Íræí°¸¡7«?\89îL+²Q? a¢ëÏ\ 3\90\9b\91\15\17I(A\ 5\8f1\8cü\ f\16¤ä\13 ?,ô@¾=\95@>¢º\90÷\80Ü\1d\9bjúKO$o\9bÞ\89¹nµûä2Üwç\ eò´ß\19éõ©8ÂÃf\8eü2k\1f\96\14¸ì×ÕS°Û>\96¶ÁÞ\11m[¸¾6\9f\12\90[3\ 1\1c\ 2r
+ä¸l\15z=9\81Ö\8c¾\97Î|Ë\82;W³O@Ù)\10úæ\83|.]¸s/¾ëIcnè\12ÓÕä22׳óiê\v§\12Ù\b3Ò§ÍþÑb·ûV¯s°7ÓÎm\97\1e\16÷ÛóÀÜê\95\18·Qï ·z\vlæ¯\83\1fËßQÍR\r:¾Î\ 1ÔÍ\1d@~vM\ 3\f[\f\0\96¼© \7fÉ>\1e\85Å\1d\ f\16\fÕó"õÉûV\ 4õd9'\7f\83\11]¹2Y\1eV\91SXÎÝÔì\18i\19\16\9c\auÕ¯4¾ÕêxDQ6ûýj£'v\8b\8f
+læý    rÆ\ 4¢R*D}´ë\0­\10\1cÈgjG\90w\12Y\80\8dwa¡4º}\9c\19x\86\81ùÍm½\7fë×%îÂÐ\1dáä&0ñ°\ 2Ùµ­¶Ê\e\8b\9c\18ú.ã\11;\13qºá\93^ÛYà8j«4R6Ú½¹\96)·°\90\184?ÿ\94ü\8d\13Á\86\90\93\9eñÐëý\134d!÷ÎCk\17\88ê÷Ì»;B\9fþ£¥\15n\9aüê]G{t\ 2·¬wþ !\8c`'Öe~\97ÃgKc\9apWú\re6\9aÿ\f³ú~ã(\9b\850\19\1dÓ\96k<µ\99¯¸¹6ûKÂ\92\91\7f\9eù\96\80ÜY¸ÃYµK\ 3¤Î@T\9e\9fCÇOÏ\0#ú(Àc©°P\9a³\82 \9a}z\8aÀã.å9}gVXÐ\a¹é\84CÀ2\17\vÆ\1c\8bëɶlè\13mµJÍÔ\88&\v\9bm©¿\96wùþ6LF¯V¥2&\88Õqq¶\%ë\93OÉûzó\17êX\80«¼¥        o¬\1c\80-Y\88\99Ç<&ØAã\80¾nÛ8\8d_\8eÒ°}Z\8e\9f¤=\984Èð\968¹­\1cbTøÞ\86\91\92\8c<\12îc)\9fÖøu!¶\91Þ\15Ä\87Øj\ 1(\89[´_öd\11±ýñ§\ 4äîÒ\ 3Ϊ\13äÔô\16@\9f\aÈyß]\0vX½«\8fÃÞÜo:gù\9dzüé\8e\9a-ÜáT´y\88õ[­\1d{Ûµ·\8b\ 6ßQ_/¦»1só\9et°=r]°\88¡¸x¼Øåêöà\17\1dJ\17ùí
+\9dò\83)9æÓ\ 5\86þ\97\84ÙÁo\9cþK ª\bMºÞÃ\81z0\9b \9f¾.\0\96¿\\ 1\1eÝá\0·&\93à\8e\ fw^ß\0Ï+kUðS0Ý×ìaúQ7®Æ¨®Ép\8f\eÞ¿IM#\réh\16Ú+þÙm/\1fI·¿èæ\87\ 3\81È\90\13\9eB\99%wÈíÆÜ¡\9be¹q\f§?%oÎ÷\100.i\80FÝ6\9cNQ\11\8eÑ\88\eVËâ \90ÖgA\130»0D\ 6\97\19\92D\8fÑØ ´;úRy[\17r\15513+r>º¨¬nU£¶\94\96\8fº ÷É\16\9f¡Ao\8e\90\ 1Íat$Ü\vL¯æ\88\9d^\9d-\rå6ú\94\0$¡<¾ræ\1e\1d8\97r\90s\89Þ ãS¥G¹;\19û\ey\18¦T]»\14\7f9\95º\8bì\a»\ 4f\96ä*®)\r\ 3ßÐ=\12\9dZa    ®Ý¢°-\89\95¹ý\8a×9\1c\97ÛSW\e\91\13ß\9c\ f¶ÀB\19Ñ\93ú~;ú\96Àf¾ûÝWÔs\90\81\97Ð$D5jk8F«\1et<^º/c\93±§çH\18\vÄé1T2Ö\81Ýä¶+6@ÔTy\96\97fÏ8"®\99k\98\81Z$Æ/l¾?\97ðÙ\9c\94+\93`\¨\8fål¢Çªù\1cÍè×+Ãö¨2ÍöZ\1dêS\ 2\90¼   à\8a\1fÉ~©ë,Âkü½¿\ 6x\ er\15Òd9¸\1f¹ñÍ\¶·\17.¸Ü\ fú\1a\8fï\8a-"­G[rf\83\9a\99ÌJ\ªé\85^Xgy¤¤çf|å\84LÖ¹N\81U_×
+3Xi-zw=\fFûã!¬R¥GÕ4Cïzåá§\ 4 5\e\0$\19ÏÂå©Õ\83s îEð\91\14<Ê|»äwåêÐe\9c\92
+]»\roHÚ{Ä|\1aõ \16SÓA3.\95\99cr©¶GI~\1f£Ò3× Ó\93Ön\9af\89õ\13¡­Óº0\1aÓãúp6á ê
+îÜ°p¹³Ãs!=ú®Àf¾uú+j\1dÍÁi?#\ 1ƪ2ÀwÇ{°&ãØmHÄÉË|\9f\95OQ}àî.»a ÷æ\9bç\ 6Û$"«V\81\8b
+V¾\1cåæódt"WSákAYò0JÑhï\90\19r<\9d§ª\r¢:htÆ}\12D¯ÓAÝ{N\aK?Ê|J\0Òw ç²\ 19\aÚà}õ¼\ 5Êc.ûwOÏîs\97\8b°j\9d[\83Ój\8fô­\83±®g]5ûhùë\0Û>\16æ\ 4\8bôå1yÞ\ fO\96J=^t\9e«Å\86åé9=X\1dy\94ì\8c¨2¡zZ\9f\9fS¢ß¨\85\7f\v\8fPSùé§\ 4 ¬\vàòÄ¡ \7fº\ f¡ã«Z°&$÷z|5ã§çµYÝ#û\ 3·«\ 4±­f\ 4l\98³\91ùêã"öÙ¾Ëãû£\vÇ\8b챦­\ 54\1e}\0Ê_ô£\83\96\9bH\13\9cï\9bås­gׯ½\1e"çÆ=ú²\95zÖ|¾ø±\84ÙÁ\7f\9e\81\97¦\18\8c\96æG\1c`ý2\r
+)A¿\99µìáÜÜ©·=¢\8eKfPEX]\7fàë\8d£]·+¥Âí\85c¦épõ:v\9b$®xÀ\8c³£çÐCø×@^\1cßï\17Øö
+\91~vnÅ»'\8cÏtñá\12ïp{«Ñ)\8d\vtçRÉÊ\9f\12\80xh\ 4\ e\ 4ðÈ\9c        \9aw\10nn\9d\9b\98\17÷\88puÌUÌ)èéd\83Ú\6åéº}GÄž\8cjóêª`Oã¥ú\99exÉ\e¹\8b­G=zé`\10ËÑw\82j½@?wR#½¼5Ov\vb?×\99\83Q±í\95\17­vmy
+çÍûó£\ 2×ûj\14:~V\ 5¸\ 3&.\ 2Î\83=­dX\88Ø:ëéq\eß\94¯ýÖJËW\88Å\ 1\1f²ó\85+¿\1f¾èk\9eÂ\1e\12­\1d=×Íãp5F\1d*"¬.$iå]"[?ø}´´\ 6=<AFºÅW)Þ\11zÕ\Û_µKm8\16\1a\1f\90°7\7f\1e@Ç3anò\19\96 ¦;{+\1a fCãÆÚè.\9de¿0ʬ\b\95Æ\ 5'EV¸GQíL\93Ýô\88\1dï\97s\9aw[\9baknj\ 3Íl\18¤±Hí :½=öY\9f\r÷н3>ðz\85QçÑ-\13¹gg!e\12í{\ 4CÚÍ\1a\94\80ü\16Ézª\98ÌÛ\fÚ¿\99õæ=©\1e\ 6\97p\85\96Åtü$\9aµ´Ï»£\18\98)ÕB|l\13ã,Ãå3¥QÝ×Û\94Òá\86\83¤Y\1d\93\99=.\10È9µîcW ö¸
+0»®\b\ eÝÊåvéø£\9bשk\17Ð^?αvKºgÞ\12\1aíÏ\83\1f\8b×+e\9e6Üâ\98[\90E,\15=PYIÊåX\91
+Ö2_Ù3ÊToÌ·ì$cX#\9fÇ\1cJiëþ i,·%\1063E÷µ\16{\ eß©C¶Z·[\ 1µAÇ\97;L§\11íÌÚ\ fm°hKÄTn½Ì©ÞR\862\8c\ 4³»ËGåKJuw±wrFÞ¶\ 6Ù¥Â\92©ÍZI Ø\92\ 6Çî\Do\83\89Ù>SLñø \87­Gc:Hn÷Bÿ8é¬zE/¯w+\8fü±#¶Ë·öC-\83v;Q\89µ^F+ÝR(*ß\8aÙD\98èjê\f]k\92è¬ÕL\9eÖDÃ\9cZLcX¸Î>%Û\15\90'\9b£\9a\18¯6ô\9d_L"·Ä¼~\1aà\93\8cZ    \9fñ +\97R\9eê¾æEÂ\1e=«=®4kvÄ\16Òm·ã±a«\97zM\9bdÎå\9bÉcLj\f±\97ÚÈ\\92\9e#\87:S.:uÄ«{µã²u¯Mêd¤\86=&ɪ#\89È_ò%¥ú÷3ß\12\ 5AgÄJ&\11\973\81k]æÞ\98\89\91X\12n\83¤.ßúØù\19tüÕìÙzéx¬Ifo©Æ0\7fAëLq\1fÞ\90¬\1d\85\86\ 5»VÕYí{Õâs7¨¸\9bý¨"tOãJ5v\99\95}ýÆ\97E\12¬Ê\8dtJ\81R5?%áÕ3ÛU\8f ãï\ 3\90\99x)\90\15v\r\90\e\8a0j½\14÷\0Á\8f0º~"m\90Û\10<ÈUf;\90=j\ f\90\rW´lʯ\82ÌîÕ\7f c\85º\8f9\86  Î\8bê4\98%J\82\7f\92_fRá[­nÁe¥¹@ëo¯½[ÂrvéÍá\8c6bÆGå\ 3\9cï\88à'Q?À      \9bùiÔ\ fpÂf~\1aõ\ 3\9c¡Ñ~¯÷ß\9ca|ós¨ò\ 1dc'ȹ\8d¦AÖ\rZ ')s\88H\1c\ 12yÀèºYï|\19\ 2³\ 5Èñ\9b=È!\87'Èê\ f\fd\e¯æ\ 3ñ\94þ\1d\93zT0Sñ±\7fÝ\ 2Î/_OKÏë\9e6^m²3Üg´o^Uê¹»¤V\9bÃiâ8ÖA¸7Ô\7fIxëû\e§ß\ 2²ôöø\ 55\eϧA®\94\10À\87{,qí\0$À²\0\ 4@¦Ö
+ iï\frJ\12\99Ò\ 3Ý9\9dÀyôHß]DÂd\8aç7Õ©Wï²ümMÖD÷9/¨nGËÛ×þì~rv«ñùx\19
+{\eð[ÕRIVþ¨\80,¿?ÁkÓåýG¸³½NökU/\99Y\ 2Ä·\1c\80ö(\14 Uk\0¡ï\12@fé+@2\95ÌãPÅj÷BNêû\8bH|è5
+SæÖ:æ¦n\97;/®Úb½¾&Öcí2°Ç\ag´ê^\8f\17S¸¼óÐôÔØ\rÚOÉÌå\rñ£\ 2²\9b\13\ 4w8@G¹/U½\88^_\ 1´r¿\ 2Ô^c\0U\9epËÕÏ+ï¬ú½æA^
+y`q¤é{u\92ð\9añíè\16©\14&W}¸\99_ÌD}éX\9b\87ìä\8e®qf\81ï\9c
+cónw*\85Ý.]2\14#O\11+ýZÍðß\92°jè\e§¿¢ö"p\8e¸\v\ 4 \98Ø\ahl,}-\94Î\1cp\90Ï\16\18\80ÞF[\80²óÇÝQ\90\À_Ì\86w7«aM7Ë^IG\9b^2÷w3çcEZ\9dÎ\97¶r¼j%ûXvÚ¾¥\1e¼½9R»úöÜÊÈ\9a71\17êº3á>* kÝΠˤ`$\9dQ\91·Ñ\b\93\84\ 6\0u;>ÈSÏ"Ès\831È·åÝýbô\1fAUtr\9e4î5n±ênp\1dø\89\89³_Ôçg¼+\8aG!{[ï×JacoVù\9d¥ñ\85\8bq¨Å\f\9dG&²zß5ÂÍ­Ò%RÜ\86 n\93\8f
+D½@\93\aȵö(\8cý\9cð\ 5¸Ö\ 6ä\8bÓ;È\9bù2À\92êì1+m­`ñ*?Ây#ÏÅ\9c»Í\80úÅîÂ=è¬\16£\ e«¡JÙÊõ:´\92\97.»Ë,\91¹q̸¢\81õc\86æ\1d\eª²YÈË\r1\9bÏå\f3\9aHt0b¿+aiï?Ï\80ì5\80V\15²Ðªk\90\87Ó(F\ 1ôúÔ@~¦¾\v¥«\0\e\aó{\85]ìüV5q¿%\96dî²\9föK'WMÖ÷\eiÛ´\ 6\e£e²åXw{É\fÃ'½ta\9a\1ajb'\98ªR=\10\95î~»\81\80Q^B¶ÑÙÊ\91=fUÊy£\8f
+Ⱦ"ÎWÎðÉ\ 3\14ùZ×\99Ika\ 12\80\94\8bÚ\83«\aó ~gM/6ñîWz\18O\9fç\9a\85í\15\1fÅ­Ì,Z4Î2RѽL»¦\82\9dÚTÔd­»!\17QJ\1eN\9f\13ÉvËÒ\8aët§¢°$ÆË\0\9b\85kÚ²ÁQÔGå+ª\82?¿\94É£Ýú\bä[\ 5\rZ3õ®>nÜoI0÷Û³\91é\9a\97óÝqªj2\¡\9f\v$kí\86jÎp\8e3T_\9e9Lí¦¶\85Í`ý,Iûí¬¶\9e"Åöj\9eÂ(ñÖiÁËFQg\17mÛ¡\17\91El(¨}\84ú±Àfþ:\803)u\ 1Y»ô|×JÃ1JÑ ¿\1e\18aUï»\0¹\19\ 4ÃÓÌëgFæ\95\8d®ýs5Ý\8fí\13O)n\9eîµÿOÚyv«\8a\ 5ëú·\98Èæ\f\88\88\8a(A0\80\ 1\14s@A\98úÿÏÄîÛ=ºGï}Ö¸çËCÃX»çk1S\15E\81\16\82­ÛÙ4±Ä\e9ÊʽF¹ùØ\8fâ=ô¬ÎZõ \ben\92xh\ 3}Ó-\ fô.-\89:\86YÝñÎs\85\9f\ 2êLßþÔùÍ>Þ«\12¼ëÊö\8fG\11|2º'\ 1ý¢\89£ú쮺î]é\8c\9egvú\ 2ûÁ\99MlüÁ5i'®VzÙ_LÒVþ±ÇæÕA
+\9f2e)kØLº¨o©g}¼/&:Úðt\17µá\19ík¹YM\80\10â\9dÍ÷ø\ 3\0²D@\93>\9a\9f?SPßq²dfáÆ©²©¨l\ 3:hM6òcPã··\8aÖð\8eÝÄ0poÖ'\9e\ 5\1c¦©\80UwÕx[J>û\99׺Lròq\8d\8cѹ\12Äx\1f,²ÚH\14+ª:RZ\8a®Áå©J,º\8aÞ\a\1dE\17        þ\a\88\1döøø§Ô\ f\v­z\9a\95A®¸\1f\81|=®×YY§ÃIçÕðùp>òF\eÚ¹\84küv 3Eo[ãgϵC\16\83Ũp\væ>þ\8c¦­¤\ f\f\94/$ÆYj\9eQµJ1ö=\95ê-S\94\eÇLsdÕ»â\88Ù¶\84\91\95\10ÇöO\ 1\82\aÅö? \9bt* ×õãïÅ¿ö 0~Æãæ5¿ÝëÏíu3ºkź}²=ã°S<ÿê,Jì}\85\87\9eg>ÈÙsúÞ(¾Ñµô`\9cÃ\1e@-ß[I¹iî3£Dͤ\86é¢Y\91\ 4ÝïH\82D
+\92³âùaê1æ¾\88£\83\7f\9dü\12Pjö\ 6ÈÞ8\ 1²\95[\r\8e¥¤\ 2G<º\8fîc\90        \96ì±ú\90ðùàVã2\8b#>+o·¾3=Ú\99tâ¼(\18ê÷;\85\91[»N\10®x\1f\8føÆC­\9c\8d`ô®?£!/é©ÁnYÅÄ£Ã\14Å\1cª·Ä,ð\ 4ñØÍñ\ 3bÞjÿ\14ß]g¯|\aäv\93\ 2Y1\82Râ
+o<{\fýä3åÛÏcÙ\93\ fkñ²h\9cæ{¹ÿ\9\9fJi»"w\9b\83\e§iZ\ 2'=\9b\7f_Õª\17]G\9f\93\87\89? ß\95w_mDéo2lù\ 3o\98ÍнjÒë÷¼j²Ó/\ e\8aí\9f\ 2\90j\13îâ2w¨sOÕa\aå5PXhÇ\17\1dYïÇÁ\1cÇ\9eômr\99\v'\8cgÆî$3±läz[-J\9dîvÆ%?®~|¯wêsmîeö|>In\94¸\88ç\8bòè=\9c\9d±AJ°ø\ fÕù¸ÕFçsó%Á\8cBA\88ÐdûoÄÉ°ÿ¼ò/À%\94õâ\17¤Òp,uh\90_OÆÑxl\1d}dÈú÷Jº\8e\9dm'ÃîÕÁm´iIEcyi\eÖ<zb«     n¹\8e¦ÏÄø\9dByÙ\e¹Ò¾¢íDåð<ö&Ë.ÜA\02謧©\14¿ÑR$\8f%¸z{w\f%^ð3"ïø\19á§\80w]xüñbL\19.¡s\93\ 5\ 5öe\ 4o\vµ½Â`w<ÛÓÉg\7fSKõmÔªõÖû\9d§Y\937;\9dv\8bÛÙX\v\ 5KaÅÖj\88¿\1akQËk\9bÞ,\93Ø\v«ÔüÖAZ­ ½\8fªIî\9c`¾oä\8f\8eÛ&\97\9f¶Fܨ#ÊÜ©Á\ f~
+@\86ò\13d[\1a\ 6òµ\90\8bî\vÂxâ\eѸ$\8f¡µ¿)ûpkÝå8EÑ&Ò4»0ÊyqfGwE¿\9eMCy¯ÚÓá\1e©\9bâýÝYöæ\9aë\b|©¼çwòóÒ\1eV./®\10\9dÒ­1ûαO»Î°\93éKe\9fBvÊ>nwõ_\88ãiÿqù\v@åf>È¡\11\ 5
+       \9a\ f\96=^¼Ò\1aÃA\95ùÙ\96\ 5Õp}4ÆÙEíÖ«ÌÓ\ 3\811äm·§\82dg$£iË\90òÑqÞ\ f¶­Ø÷ì~\1c\7f/\bÉé\95?ô;A[ÎÕ\12\9cú!Ð\96þJçØ©\97¨2QµÆ3fp\9b2\fê\9a?\ 5 &ç\17È]\988\1f:º[\13þ\9cN*ÐÇ\15Úô6áÎfëáC\ e¬°¡§fÝ¥F\1aE~RÔhÁ£e\8c@:\12\u\86â\ 4ÎV½\85¹³º\99´âtv{þÄ\ få\8a×VD2âÆ\9dTª5)\9d\91¸WÅÃ\93m^>5fQbz\f{0õ\9f\ 2\1cÜ1=®åS§$z»{±îoøÒ\8e^]\97`n\99öâ6Ã\8böK××»8\1f\84kf´¿1y©D\9f\eý\b\15Ú=nT\18\bÛÇSí\fæ»\19?ZnÖí\eu?q\ ftw窭ͫÕhÌ?¬©M\11æý´sÌr\186\98ä-Ãÿ\17â ä\7f\\ 69'Ê\9c\13\9e¿s\1f\b¾qø:uZ>REÆ\å1c:x\ f\9cñ,'¸J\aLNC\19÷<1Ð\99°÷Y¤\91.²Ýå:\aiQãÏʤվéÊ7\89ü1\13\87\\15(qeÖÉ\82\8dìÅ\96µ:Ç3óq/\ f¦M<\ 1\93:å0Ú\19µ
+?Å¥YÔ\17®W\92f¶3HÄ þ\voL8s§DU'çÖc EÊE\92û     _\91J\17Jï3Q\7fÖE6`Õ¡Î\8b]û6\9eܹÇt\12qÕÈL·f¬I°ÑzY`Ù\8c\1d\97Vݶ\986î÷iG
+eZÈa\ 6\8d\+qÝÁf¿Ôr\9bøC<ÿ\14;\ 5G\15»Ó G\8bò&\94gÂá¸3´Ì\9dR?:Y\1aQ[¼$\ 6c¶ÖK­\16tç0ÈÅ\8bt[+ÛÝÖ\8cá$Öjs:³ê2\16\93Ús\ e-P\9d\ 3\8d\9cG·¦+O\83&~\9f¾\e\87±\8b4¤Ê\8djPþ§T\97\9b©F=\ fª\9dÚmÁô\7f\89oHõ\1fWl^Ýv¬\87\9eoO·åOW¯î_\ f\95ó\87`(c\83¨\1fM´Hp\85Ý\9bÏßJ)®úºa,\9b\92³´#\96\8bMwT¨7\ e\1aÊ4¨'Ú©Ëu´_Ï\87\858É¢¦1Ùq­ô©Íª\8fU{U5Ú\92[­¥\8dS%ج¼Ê¬{\ e+Mì\99ø)\16%òÐ\9cnêmz\\9d£-¥\13\14EI#\9dMoE¯í\8eDx6÷0\18ØÓZ·\ 3íôåKã \12÷úÙH\a5­y\ 1ÕÇâ\9a¬Ö\92'¤2ëì\89J\13¹æÊV\7f_,³ÄµZú\1c}º´\1a¾¹R;\9f\11\e9(:Z=\9e:\8bB¹eü\14\0o&\1d\80ÝÉ\vÀÆõ\10àJ&\v\88Ú\91\aÄZ\98\ 12\11A\8fàÄb\80\98®Z\80hDc\80\83Ò7@\8c/:O\80·´4ÀI'\ f°\93[\ 3ØôÖ\ 2\98\9cê\ 3¬\99W\ 1
+p=<\ e\1dã%\7f\84iP\9e×\96~m\90X?,wn{ízݹ;&iÿ\12°\99¿Oþ?¥þ@gükþ¯R\7f ó\eOû?Jý\81Î\7f\18ígR±3Àv-(õRÉ\ 3BºC\93>å9 [\14ô\bH\99\84b]\ e\10£\8f\ e\88Bc\ fðûè\9bg\83\8fgPOëP\ 2xòFC½A\a`³Ô\10`BÞ\88Èr0{]Li\1aÜ¥\9aå×\16¯õ\ 3äç\8e·:Ò\9b\9b»?97\822W¿G¼ë\8c\8f\0\172P*\Q\ 1\9c¯\0 ²<\94ú$º\80d\1d\v\90;î È\85\9b\83¢?\1d@\ 4ù) f½\13 \9aæ\a\1a÷\9c\83bÏ5\80W\1eího?\ 6\11é:Jx*;\930Ç[ñÔ\19\8c%bá×ÀqýXä\95\9d\97æ±ý\8d¨\ e¶ç;\11-OÏÜÊü\ 1\0.\93\e(±r\85\8a\17ohM¥\0%¶û\80t£åw;\88\8e|\88\b^Þç¡|\8e3¡ÞÑ\ 5êuÓPo\0­y\8fZÑÀ?tÃ\91Ö\1f¼®kV{\15·\85Y0~d×~½¹Û<\16\9dúö¾©ùÇ«ääw°éþò°È&f\87\84|\89\1fä\7f\8f¿\aÀg9(µP\87R\9dË\azþë8QZ\e\0ªP²\ 1%oC@)T\11\8e\bŪK(véA±g$:6\1fñ×|¢lÅm\87ù[_|\95\86è(¨\16\8fc\7fZ]\98ÏP\98C\95'zï¥\1fÞé:LåÏÇ\17\93°\ f\89ÙÜÜ¡§âØÝ\8d\ fðíiNe\v{kë\ 6ðàù\ 1$~\81R#G\8a\1d@\ 5!\0Ùt¯
\8d9\ 4\14½w ÞÓ3¼¢\1aòºÛlùUÖP6¨e\8f}¿±\1fÊOF õÇRL.<;wÝz\19Æ\8b\9fI_\8f˪wlzëí>½ËY®X?\19\eÅ\18)\9bb­7ú\ 1þ\9f
+G<\96\ 4¤\86BM\9dH\86\12§[\90m\17?ßä$ɬ\83lÍW£³âoCÕQ\9f\81?M§ý\10ß\14\9e\v\9a¦\1fíζíu\9e\9cxï©)å6 \9cÉux×V\97\7f\95Íq×eO«íPíL\9dñ%¥®Ã\96+­ÍäJü"Níýëä¿\0ðs\1dJ\15ø8àW\89K\8dÔâ\ 4dJ\ 1Yîº\ 3ÙÃ\0º\82\1f¿        ²ÇÜ8,ëö&\98\89yïù)ÍS\ fþ\1e\9dV\8a#P·,­5.\1aro\9dà~\8e\1d»{H\8e§£=ï\9fæ»îÍw7Ê>\98ÛSt¦¯ÞÓæpi÷\89þ2óLw\7f\0xÃ[\7f¬7²\b¥>ºi@!í8\ 1\99Qã\é\ 3È\95lè_iE6ôrØ8x\9dUÇO\f#Ïs»\89÷ídáÈ¥R\ 1Äq\91~S\87TÐ)ìÜrTq\a¦EoG\92ÌoÔ®<t¼ýÙü\1a­E\18«døT\16=i1°(z(\98§·Èÿ\0_©pT\r\83*qä<Î?åFã8û8N\94¾f¢«E³q0eÚ\r5¿uç\9c\aú\91¯7yÊ\aç©\97ÿ\1cìz2±Û9ÕÌöR×°\8df\10Y;X,\8aë¨#ÖW\1fVl¯Rüd´è\19\15Å\1a\êC3¿Äz³Ç(ägFÞçþF\1cåøç\95¿\ 1\88Tw\a{ëø\ eHf\1e¿rìÆÕZ\97:ÈõÄ3ÈE\18\1a>\88
+\130˽òD*Uû\9e\9b\13§Kíá=\ e\8e&ù;ªÚ\r·Åµ\19wh§^}&×ì©\98^¥KW|áÎÕ\9cuÐG5ó,ëüü6^\ eg\ f\9f\ 67]\98\80\84ÊM¬õ\88ý\ 1\0A\89Pgð-§\v=ÿ\1d\ 2(?®\81ëíõ8«÷\ 2ò\8d
+&9ÚoW·²'e\82åU\17wû#? \8e;ió¼n\1eýÓÝ6\97\1f\7fe\93åp±;\8c\815Ĩ¤Y\98>ðÙ\93X姯\8cÓ\98ÎnÕ8\ e=a\8dO×XgRm#ÝCX}\83§è\1fà\ f©\ 4µ{\0òú\8có:?-\90+\86\ 6Èg.·èÖàñ 
+\93\8d':[Æ\99)÷BÉ1ÏfÄoöûÆy·\1dsÊÁ\ 6\99Áyå\14´ÛbÐÛ<L\15Ëø3\1fQ£é|XNMØ7À\f>\8d\96ôM·ßÑѽÄ\8fwºÅ\8d\89À¢!Ü\7f\ 36ó_\97\ 1QUö\80àîO8\96\12P*\87C©=l
+òõ×-|¸4\16$ºaýA¢Séúlk³#ô4\96»<!;NX(ºë´þÙ-\ e6z4ÕWý\eO\9bN§·É\92O=\r\1eξ:Ö\1c¦ÇdEÉjCûɨW4ÝV¯\ 5\96S\95]»©\16Åvã\a\88uB\93\ e\9e\ f@åQüϼN.NA\8d³e\89{Xë×\11?íyU/7V\a\97¹Â\1a\a¢85·zXXÚ\³\97¢°rÌ;³\81>÷ØÛOVåêYß¾W÷1\85\96}õ:M|\14OKâ²?©Te\7f½\89Ç\r<¾XÙ·\v´<m õ\1f\0Zs\f¥®\12Ф\9d\ 2\ 1;h\8f\8fóO¿%Pï¯æ³\98ybÜ©|/%Gý\93\9d|Å»Î\9d\92jL\9chy\99¯¶W}a]+í\15Ü2Ñöd\9dW·º{¹íµó¬yVKë»'O\1fãpd¾Ld¸|\9f\8aÃå\87f\87\1f\f?¥]}øÁ\8fµÿB\1cRýç\95?¥>P(Õ\16¨8¯\93\877~<\8fîɾ\17´x2õ \83\1aä\eÂ\11\92[AS\9aÝ\96\15cI­ª³¹\7fK\98ÓÖ>¹ÐwGj¥]ôoÁse\92xîá\12\fÛ4ù\90\84\19¸³^vÐW2-        Mó\8c\84\\86u Ù\f«?\0¼ñó=\9cI\vp»äËÙ8¯Sø>\8a\98lÌðÙi^}þ\9aþxù\99W¸0\9f µ\1fMêý\r½^\8dV;±®Yåf`Ì\98ÇejôFÛ\99vUn\962\81KÆh±\9dl¤Í\9c<\fDÒ¿\8b\14õ\15\12Áû\ 5\7fI÷/\83L<nĬ^©\89Ò\9eÿ      \0¡/ Ô^;\0ÙÊ*\ar\e¯\v
+       °xÍ­ìé\89\17At{¢^ö\84ÒrÃ}tß\82m«B\9cy¿¸fÂÑ|^Y©\13a>ÖÇry4Q\ 2Î\9a\8d\96Ç\97%õjõ\95x\12}·_´ôS×çõ [ß\9e\11!Ô:µ®/$Ù^¥\99©÷*\85\97\88\ 3Ä\7f\9d\0b¹9üñêIv|+ÀÉ)  ¥\8aY+à\12èÁ\93¹ËóJ\8f÷Ø!{FK\e\902[«C\8dè\9aþa)Ny·=ÔsTEVk×\92:ZÝÙ±Ôï­§¢\$ã·"zFÞ¶\85\88ï\1d:\9fÞèÙIIV\8awê¥rgE\84\93\b\e\ 2C&\7f\ 2@ìw\a\9c\10dßH\11Þuº\1f>Oé8¯óÙ»ììëë.\1eNx\ 2O¸~y\9dµ7­|m¡-6­Ù\8aæ:\ 6UO÷Tß}\ fää \92$q\9a\95ÅbV\19÷ê©äLX°Ûu'mÂ=
+j¨^[LßRܱW-µE$Ói»Û\90\81ÍðÈ5lü\0\80ð.G@­?o\90S¸2(\94'b°d&ê½l¿Õ\13\8eÛöîQíD\e®×ÂWÃ0(\99t¾Û\98ô\ 3<ÎLÑ\1eï;/¯\86×®th>D±¤e\87Ý\bST\81\13\8aS~»\ e×í\ 1sÚsùôéÑR{HªU*\99å\96ª\r\a­+Qç[\97g®õ{Àf¾G@b¯\13ì£Í\ 4ÈgÍj4f\17½\a\ 5\96­\13\8e\ 5\9d\9d1ÀW\9bvN~®Î¢\9a²\1as\81\9aöx¬4öú\8f\86Ò\92×Ì\90ÄmN\1c·¢n\17LÊ¢\90Ö\8f
+ß¿+Sî\92¯ÄþMë^¦\8fì³ÞõÙ\9ai#Ì«_¯3/1«1Áz×g«ëu÷\a\80\1d´v\ 1Yà  ÿ\bk\17¦R\0G­§wµJ;ö¤\9dM®`®äûüj5\8dm4uoó\94^¦¦¤òÙ:åᡵ«\ fJk\92ëE\9cÞ\15\9cdjØÁ\19\1emd\8b+\r\84m«*÷¯lc¬\ 1ÆJÞIú#\94\9bôª\88Oé%i©ôâ$Ç¡¡ïñ÷\0ÔdåA¿\94Â/ó¡r=PÂûêNt:t°ô\9a\ 1?5\17«í~J"ÎuüÜ\1f}e=ô?Ãã\9c%\ 6ãÆ%ÞC÷é\fßìò©°ÝÙ\89¶È\ fóºÚ.<\a\1c\ e\9cV\1d×/ì\²Cf¡\9c\11¦ÅT+ôúp\92h>\93\99Óéîiú\ 3|WÏEõu­¥={\7f"©õ¶ñ        6v/ÃÝ\17¾åµÌäaªOF\8dÃrÜÀ^[%ã\93§a>ÝóDß\8eÞ½åp\8cv3\8fV¾3èæêüh@¶Û¥ü»ÏUË¡Ú\9aN3&\e!\95x!`>DýÊp\93aĤê'\9cîXd\9dFú@oº$:ÿ\ 1î'3´\ eý§3Ý\98Í\97¾&:÷¹õ¢ñ×Ì­á¬që8ñ\ 6Jc¼£&ãë÷tðPòV\9f\89fNWÈÔ\8e\9d\83\84>y¹ðN´Kþ\15åªÑ>×\9a±×\1a\e­ý\16óÙz=¦\8d¿\15&u,Îi!Gohä:¾4û¥MØÄ\9fõ\ã0\994¿\80Íü}ò_8
+eIÙÌ\17¢´\1a\1cü\81ùz\87Útà\82¤þè½Ê*\17`õá¹\97o\8aÁXæz©ÕEè\1c\ 6­Aû¦½\15®\1aÆg\1f\aºX6½=0«îþΤö§\17í\f¢$\8d\Rx³_Ä\8bMÜk4\eRµÃ7 '9¬\9fg§I=ÿN:\10\95Ã\ f°­-È8ed5HwÚf³\13µ'\ 3>\12Ç3êõR:\11\97\90n\ 3)Õ·ê\8b´à
+o\8c\97ój\16
+D\8a¬Å\1djL\eµXZ gB³\9fפÆA3´\ 6õ4¦õóÄYÕó¡ëÖnæãR+}"\1f6S}¬©OÕàY¬\12lûùʬg5 \ eì\ f°ÚmRM³áÊ\rãø@\9b\1c\14ÙeìÓÀÈ\e»\1e÷>î;\12I\9e¾Á{C¿B\81\88ǤÜó«ÙÏiï\86T\1afêr­KÔ4\9aÎU\1fËz©ZKÕk\95\99Pg*M\94ï\94-\91ï\97YRQJ«ÑdRjç7ËRêöt\8bB%q\85È>þÆ7¤ú\8f+\7fÃ\9cö\veãHMJ*Ó©TF\94ãNÅYé9é"¶¯¶o*®´\1a@\eCuè¤\89_Öóº\\15\12¨8\95ÀNBGtë\1fË,îÅ{èÒJºz¥Ôå\14\14\85â>*"Þ-YèWÏ\99\ 2\1e\ 4dþ0O\15ò\12MUsç%Eçd\8eé@ôz?\0ÀÊ\9d9@×\1dû\eë\ÛW\80\8d;      \80£ï"À»
+ô²Í´\ 5!{\0g.\18À\892\v°£$\ 3lrX\ 1¬\93º\0¬Ñ\88\0\86ôáÿ \9ae\ 1ê\1ej\0µ\ 2\16 ý\88\ah\ 5\19\0\94ä\8cð`~â\bÔK®9Ó@+Ês¿zÎÎ\1eQÿò\13ü-õ\a:¿q\81ÿ£Ô\1fè\8c³T\7f-õ8p\0úÜC©»Q\12à4V\ 2ø|Þ\ 3ø\95\80RÃÕ\13àV\82\ 48Ûl\ 1<¡)PìÍ\ 6Ø\14¿\ 1lÄA\97®!cP¬õ­¢\88F·&Ô\eµ\ 1ª}z\0má£\88\930\8bßfÁmc\98¾ÁÕ¬g#zYÞg½þ     \0Æö Î§º\ 1\18ñ\rtA\83\9a)\80
+ Ò\17\11\10õö
+\10ü-\0\ 4\92¥\0îöÛ\0ï;:4n°\ 5\98\9f\7f\0Ì\16RP¯FA\vCkbù\80\ 3(Hõ\ 1ºÃå¨ÿüèa¶w6\ 3m.X~­JÄ{\81\87Õ_,½v®»¼#\9fÊâ\a\0X\7fdB©#\a`bò\ 6\94\86\12E¸m\1d¢C@¬\r\e\10'$\ 4Ĩ]\80bµo\ 5\7fÜ=L ÞÏ\ eà\95j\0õ
+\19¨×(@½N\13ê\8dº\0+PJ´\e§ Êíl\12Üký8n\9e^?XVY{©°âÜÜCru9\83éü¿\0\9bù×\15\80iª       °\84\ e­º+Âþè\84\895t\ 5\9f¬\ 2Hâ°\ 1
+\0ák%¨×é\ 2"\1fÌ\0\9f\0\ e\8aWd\ 2\8a5ÊP¬Ó\8aÄÛ*~è\15\91¬«\86á3\ fîFÙôk\8b'T©\89\9b»sÅÜ«$÷\96gmý\99\1f\9b+mü\ 3ü©\93\98ÆaéÖ\ 3\10ÙÜ7%\9ex¼h@²\9a
+Híã\ 2r§%\0)\1eª\80L\ 6°GÌð\ 5 
+Õkt\10«\9fð\9cOãa¾ô*¾®Æ\93~\15ç;>\18ï7RP©^&~\1dÝA\897~wG»×ÃE¶¢õñUjϾqh%¡ïºÉµü\ 3\0Ì\9aÂÞZ^Æ\81Éá\13Z\93F¡Ä\ 2\vH÷ \ 3
+e GÐ<¤\0ùNÕ\ 1©çGÑPÆãg\ 4¡\928\9f_\9a9\8b\ 2#K#þt÷Î>ÃÓµú¤o6ûX<§=omöd/}\18\99wt³¿\9c\9e¹¦}`Ï»ùnÓ\12u\97¸a£\8d"]Å_\ 26ó÷        À\3\1eX6\94êÌ¡ÔÇ\18\87*\ 5\ e
+Dâ\9cîé\19P\17\ 4\ 1Ô\9cc¢|5/¿¼þa\11Ô\99æñ     ägðøø£¤çà\1fì¾\9dÏò71(T®Cí\1eû\9e\17\85ßuÏcæ¢\9eê\19ÔÞ·AÅr\89p?\86M\ fFN\85®\8aëù)à\7f\0\80Ýl8ª,\ fzü©c\\14cC\ 2
+1¾ÉI\94ÃÌ@6u\82;í6\87Eò|À¾\8cF0ô£\ßz&g»\9d×mdn·Ã\8b{]n\1dãsò_^êhr*\ 67Ø¥ì\9e·©Ên\13\1dV\1eÉÛ\\89\99Ø>z\1e}#Ì«ÖM\8a\1döefÝlý\0\0\8b¶Pê-\84\17\94ª>)@\8dÎ\1d\90¥Ôy\9c(}\apÉ%_Ïe\95ö\ 1ëH\ fÇHÌïp/\e?ôº*\eêp\9a\97ÑËaµ¤ï{ÄÚûî>ä¢íéPHoÔ& \1cOO\97m_Îrëp,k«¤\95\10\17[éÒ±\ 6Ý\rg\8eàvÜ\1cé\vú\97\80Í|\8f\7fHÅÑL\1còA_q¶l\ eP§Ï7\ 1Ù\ 2ÙOË\v½ô\0\ fÌT¾ùäyY¼\1fQE¿\96V=ëøv\v«ýÆkmÝ#«\1f\ 5&uq\8c¦ìÙ\r;ûZ3Z2ùÍ\87\96ÞIJÓËT\16Û\83ص¨b½kæ¹b{^\921zV]dê?\0À\91Ó\12\8e¥Ê\ 1vÐB\18\97iþfõÆ5\85ÃÅ7µ·7y¾üy\ fõ9\ 1©{{¦Ö»ÞmR=±âÁØ÷6\93\99\9b»ÙËM\85\ el»   \9aîj\15î\8eK¡Ý½-ð}Æ·('\95\v\84\98kÉ^sfä\97ütVÖÙI´\9e6'lά~Cªðø{\0<\7f\85Rgô\ 1öÑv\14\17\96-\82ì\80ëÅY½«H-Í\1f\81¹¯f\9e\88\15TïùZ¢s\ e\99ýð\80Z5Ù\95¹â7ó>È\95¦ëe\935\97\9bëd¹ ^äƼTìý\s\a·Y­^
+¦ÍR-5±\f£8I¤?¬ÑVqZw\1eHM\17\fª¤£5ä\7fÁw½É_áÝ?w\8f\80ìI ®×ùÍ\96\15㲫P_\8d=\7fUͧ¼ÃÑ-]\1fÂ¥}´\95jw7\94^ÒƸmGëÏÒÕ\96Ûçkb\9d¤â|î\91úbV/ãÎ\ 4Ìݽ±¦´x\91Ö7¨\16ê¨x'Æ;Î`Æ\84cÔµ£°ªjCÔ-þ\0\0oøФ\81\bMj\1ao\90\15\90Ãì\ 1È\85ãõk\96î^ã`\8a\12÷K}U¸4+
+sÀ[\11¿\1d¿\95®½\18v\ 6+´À\8e¬so¨Îõ\9d­OC7?\9b´6ÖBß\ 45g,\8aéø\13R駪ô+iUY\10MµX)Ô\94»_+)ãi;ÿE\1c\1düëä¿ð\87T\82\1aC\93^\9dO\9c×\19§ z\12È××ëÀRèóc×̼oã\9e\9c=µ]¬¶\93\11\83Ù4(\9a_g\18¤»\18\92éx\86\9e\984\8d¦\1de\92j\1ft\1dOe§Ú¨|\ªÅíx«TV\93»\ßì>£PåKrýz¯\8eÂÞ³4
+ûh>Fî÷\0x'ü>Åý¾xDe.\898¯³
+róp\10\95¶ó\95¿zW\8eÞñ\9e\f¯u£\89\1fvÒ¶´}<\9b\r{\19½Ùå\80:ðæ=Ü\b³æ}ß\9f¤K\1fIÇß}UË»w\ 3N\10¢)7ÚE{ø~c§o2lªþ\92lçD\rSY±<äÚëÒ\90«]ò1r¿ÇW* ôÍé\8fjòÙ=\15ç\9f\92RXÃEó¹Ñ\8b»»Jø±·v^
+ ³ÏѽÜf\9eA«käh7­+\90ØYhðÜ\84\1fõ::q±zZa\96\96\94\1a?TF\96AN\87©Ýi9p;ön\80[ÞC\94È\ e6À½JeÐ{ó\85Ao/R\7f\ 36ó¯+\7f\ 3àr\12î?½ç9®Ó\9d\82}´Q\ay¾5|5\8dÖô!\9e3έ:ñîÇ­\ f·*z
\9d\84w,-¥í fVýrsÊ)9VßkÕxYÓ\8az»£ÔÙ]\7fÔÂ\8bCI\0[M<æ;³þ\85è8½{N¿õÊV*Ý/8Xµ_\102\85¾,W²?\0\9c\9e2+8=¥¿\1fÞ¤ü&\9c\83\ 6È\1fÇ£ qÉé^>ï/.\96©\1eöç>\11lÂè\8c¬1YÌZã6U\9a±æ«jô+^C»ñ)Vi\bYn\94¼\8a\1d sBQ\1c\9eFrÏ#ª\93îdK­\84ù\81\89ßÂ\13hiÿ\11BÖ¯uëe¿Ð\9dT\92Ù\1f\0îJȸ\ e\1aWkE@îb6Âg¦%>» \94o\86\9f\9c\84WÊÞ\95k\97øÙ\9a\93\9aÈ\89e\9eÄ°¹\89Þr\93n{Q\1c+ȲªÌ<§>j·\12\8c\84\1fhNÌ/öB¯ª1\92`^\91qgyÀ\97¼}©\1ey¤h\ 2ÞÉ\ë\1dØ÷K\9de.Ìý\v°\99ÿº\f\8a\rÈP¸\81ìÎÁ@¾}m¾h<#x#\7fÔ¹,\13úð\90«\18æ\ 6,Åó\9a`J\91U\85«ëÔö-BϽŬZ_÷
+#^\96Ê\12\99¹Ä\15Çúw\85¤»¯\8eÙ\16Ø5'òÎ\aWÛýÙÇä\ eïÆ\81Ë\ eì\88\93\1e×z\9bÀßµvïá\17~\08æ»\ e \86Î\13ä\9aÑ÷iT\81ÈÑ~Æ\19Õ/\89K¿x\18É3Ám\10¨ao\vänqwÎ\8fyB\1a\ 3#[n¦Õ`VÄäT¯JITK(ô½Ç¦Ü5\adCHº'\8eï\86\83\1ewj7\94Ö\95fÌVq9=°z6\19¿®Àêõd\9dõrÅfKÉ\91\95\18åß\ 3\10ïÍ\16dIä\ 5òi\86º\17S\128ºø<Ø_\13\15d\eõ\8e\9cíR-m©nu{þö帧MÄw+Ð&ó\ f\90\9d\92\86i
+ë?\em²k]v\85\8es¦«<A&[\9c¬\9ez­rÖVÙZñ´`fFæÈ4Ûó\ f\rrc\9aif.<3ÝÎifjNþ\8d8:øÏ+\80Ü¢{\90½\ fÞ×Ǻ¸;b\82¹Û\95üéiK\a­·M\90!½x\{£ùç~^L¤ìn«\ 5ýíEvRg_:E\89·X¥¹Lwi­\88ÎV-\14x2xÅ]\80S+\v®U\89Æ"\13®\15\9d~oçk\9aÃ\9fW:ù\1c¦\9b¶ÝnÑIû<¤[H_ø\ 1\05ÑÎ\ fì$n\8eÂ\1d_¸zi\16?ñpV\17g³Î6\90´õ2\91ú\9cGÏCã"Ýum\9e\7f[²ðÀ\1déRÑÎbÍxù½\ 4\b®\8añÇL\90\87C\8d+++\8e\8dç\ 5\ 6\b+\9daw·\15Ý>}Îtz6x77]*N»n
+ïý°\89\ 4êè\a\bË[v\7fâ"gì\8e9 Úöi¢-/ÚÑ2ß\8a\83ΰq»j\14WOA]\16\92ÒhÏ0ã\81'Îfß8ô3½îòÞúØÙ7\87\ f>gW@»xc°\96?Éç[õ°ZgéOµÍpYnHÛÊhJg¼¥Óìqï{\13O÷Ò\8dýµÂ6\ 6½\8d
+±Óþ\vqHõ¯\93KÝ·F»\ 2·\1eؼyí.ns{0_R\9e>9\13¯\8c^5vUÅÉ\87Íáè\93çÄYÅè÷RëÄHÀ÷s\9dÏßi\8b{L\8bn+°\8a76Zç^Ìg\8b'\986\9e\8f\87'íH\8d"\8d\:t³_T»\8d\83¾T\1aR5´êçyn_\97éÉ«\9eÿt«\10bí÷ØKغg¯{jk¡\8e?ìl]vÛF>ªÆ¿F\8bä×GvY&#i\94\86õ\99pG
+n·Xàåü¶Ê\19u\8e\15Î3\9f\r2`Rû\94F#§Ï¼Ù/ vã0Æ\ f\r©Òðêç)\17ýQZ@c­|­\9c¸5ª\ f\eïT\8dN'®\f[­!\9eó\ 38¬Ê5\17\8a¯Ugí\1cZÕÕÔ«©r\93íf$¥{§Aõ¶ºôRËç­#\91­g»ôðÂVã­A£¡ÙLl4ä\b\88&~}\15\1aÔãR\89+\rÐ5\8dÞµã"\ 3ýªÁ\ 1¥\12lÒÓJ\13#VåhÏ\1eÊ,%=J\9fóê]ZÉO¬Ô.\16J\10åò/\11Ç:ããâ2-\17fÜ|SÐ\v U\94\1dÜ/\reÔµú\91q\9c
\90\9c¶o*7kÍ\9a\8f\ 5ÓFúë¦;Ìn\e\94w?Ôn³õµúXL\1e\95À\1e¾*Mdø)[ýAªô9\ e \88Ü \eGn\1duT*"\ f½Yè×Ìv\ 1\7f]¥¼DûZ\9eú\90Vî¼êî~\80Ù{3Éê\ 5Ö'eÛг\ 3Ï,²½\15\9déw¨#\1eG ¸jÀrÌ\8aßµ\9býl½S?ëI±V\8a¶ÃÊ\8c\1f(e«Çé¥v\16\9f\14\85B4/¸ãhYÀý\87\9d\97\1a·mîl\9d\ f¹Bâ|ÉjüÙË\963QD\19ýD\92ª\11\ 5\82\9c\rk\ 5²\99\93âúißãï\ 1Ь«\ 2d~\98\ 3d\8bl\0:\Þ\ 1ê\97Ò\0#\97\15\80\1eÀ(Å\ 4X:á\ 1tC#\0U\165\80ö\12=\80\96\8f   £¸¼\ 2ÈÇ9\0ä\11x\09æß\10\1a       \90õ­
+\90\ 2ȨÔ\ 5H\87\e\ 2¤1P#¼\Ò^§W \ 5Wo¥\ 5¥ªö¿àÛÌ\1f\19@Âü\16 ë½\aU2\19\80µöU\80\r\8a}\88Å\ 2`5â\ 1ÐW\17\83z7u\80ª±Ô\1ek\0\94\999P¬{\82b£'@\13µ$@\9e\1a\ 5Å\9ek\0±ñoÎ-2m\f Þ\8e\1cõÜ\86\16RíH{åig\1c\948M÷«BSý=\0Z;@\9d\9bó\1c ¹ê\16`    ÿ\ 10q\80\0l÷®\ 3Ìû~l\v\1eï+\80­\9a\ 1ÀÚ\13\ 2Ú÷Ò\ 4è\95\18\0\87ÿRµà/ìÝ®\0e\91\10 e¸wD  #\ fEßh\80øù>ÔË(Q/*\8d\bôàV\9c\19¾\1e´'Ï)(L\1eQ+1þÆ¡áñ\97\0hû¦\ 1äò0á\8dï@©\95ä\13`÷%
+ðb±\ 11\19\ 2¼G8\0Ç¥\10`\87]\16\ 4\v°\y\ 4°\8c\80\8aÝÃ÷Þ\98\ fØ=4ü\ 3Ð>\v\rÏ\1a%(úÖ\ 2h²4\8aÜ)c\84\12\1eM\82\98úU§0}6v\89\99÷\99\1c'\1e\17ÎÇ¿ÇWç÷Þ\nq\ 4\ 1lQñ\ 1^8a\0Wx\1aà\9b»
+ð+»\ 5¸j\ 1\80\97^\ 5\80=\v<À&\82\ 6°º\ 1m\9d»]\0\1a~^\0u³i\80Zí,\14«Á¾Ì\9eã \7fC\ f¥^\10\8cãæs¿\1a\87\98^;3\9eß\85\928»õÛEý÷\0¨ô\80&}\ 5q\fÕÞ\ 3\fð\ 1Àç\19\12\10éE\v\109T\ 3D]Þ}\9dÂÌí\ 3p7[\ 2
+q°ß\0ØÚ\81÷\81?ß ÞÏ;ÚYi4\12   4\17\1e\16J×B;Ìöd5¸½$ë\19\ 4\89¥÷9*«»c¶\967"\9b4/òÂ\9e\9cË\9d\86òEì­ýuò/\0Ô\88 ië\88\ 5°þõ\0pa\1c\0"ÛÊ\ 2Âxµ\ 1±n\e\808\1eàün\17Ò\80h´«\0¿É}\80÷­YDeú\9bp\84·o¯k¶\1c×~x\15é\*\18sI<(\9f±\92?AIƯ\8diñÙ\1cM,oµn9·þà´¾\14Z\8dÙñUrµÃ"-\8föë"+ý\1e\0]} ÎIÉú\8e\e\ 3ü¼\8b\8b8\8cs\80$ÊB\9cÓ=\a¤\88_\0Ù\92\10@øV3Êö\ 5ñu3ÓFð¨\1emß¿\8fOÏpTñ\9e´\86\81G«vK{kÚ!½ôÀ©Ü\85Ù¡}ëë©ñ5[ø\ 6\88¡@azH(èx×MîF.qSÄm.Ñêþ\1e°o"°\v\ 5ì\9b9h¹Z"®\8cp/\ 1R\93z\80¼},@\82Î\râ\80\7fãÐ\91P\ f\9e\97W×oÎxõñ9\86Ö#ÅLÝûV¡Î7Ѷ¼ë°ß\ e/J.\97:\97\ fIâTÛdÊÇæ¾Î\1f\12\82¢ïP»®n\87lr¸)fO}ûùÖùu\98âØ¿\11g©þóÊ\17P%\ 5»[y´\84î4\r¥®ê\898\ 1¹\f\15\ 1%4\96\80\9am\9f¡\964Ð`zÌÖ\9eËê\90\7f¤\9f§Ñ\9d¨¥\8c«\9cl[gÝXÛÇpY\8fßX9,\11ÿ¼_?·\8fÝf;\ 5în5C\âu(n³\9f\86è\8cçUi\1d\92\91°z7ní¥MÌèefb4~\ f¨\13×a\aաγøý\80 \89\ fã\ fó±U(05\0T ¯£BÁ~\ 4¯¼\90y®º\9b¢×ÓBö\963R½ós\9a\1d\1dÙnQÝ;\9dåt\87óù\85KaÁfs\95\8d½ãµú7Ûo\b¡]×ÆÈzî'ê«\96[û3\ e]h[{\ 5Ð\16é=kæ\88»W~\ f8Õç¡IÝí
+\10Ôä\fÈÞ"þ2\97ñ-\7f<\ 4ÙÁÕ~=Eýæ·àHõv\94\18\aºnrNm\9c\e\15¶uà7õÎNÌ«\83í%\1d(\9brJÐíYâ>[\9b×õjŵEwÙ)¶®\8bí`\18Y{yKZä\9bo\99ùj\97\9e\97\9a\95êLßÕËÓ R)þ\v°\99\7f]\81\93S       Z5:A©\83\1d\1c7ÛK\9cÕë@©\83Ñ(R¸Ð\ eæ§Ñå\99\19"\9f{\ eÍ\91\97\9aAU\ eNiSßQÉ=»ñ²\ fÞ~9\85Þ\9a]/\86«Ô§\12ÏÐ\8b\9fX\ 3ß\\9a#wäÎÕµz\9b=2·ä¬ªM\9bÓÆqY\9bX¹iiÂ\84Û\82±bÌìïñ\87N<ï¯\ 1±\7fÝâüÓïÓ¨lòÑ\0Yo«\84\15y»ô[Qãè\rºçðª'|ô¸\16åìNRê¥Í£\ªÙæ@`VvbÝ^¢\ f¬kI`:\98ß\11J\99\19ÒÙ\98κîrbU\9d½ñ\99}\ 2£\8dYy#õùºQºÐÆ\v:\9a­æÇî¥Jý\1ep,5\f\80wÞPê'}\a\14ôìã\12¨ÐÍ-zÊ«\ e\89\94\9e_:þÙ4õÔ~\17}³T·÷V\98w\9aÙ¨¼²£Wm±W+´y-è­y%\9f\12¦ó\9a!NØ=«\1aé&:ÕÑ
+j\8fû£æU;D\97\8cv,Ì\8a\9at_å´ìØ%ÕKå@ü\17`3\7f\9f\0\8ce Ô\19\ 6d){\8fë`âñ'ãéèÊ$\95\80\11Õé\ 3\9bëã,ß\8fN\1a\ 3»Üa\97ÙÔó&        ­(ç\96øq^2oÔµ6óO%zJ\1f,ÎX{\85xÜèh´\ehÇÉd¬^z\8a¥Ü¥õA\19çÊoeÜ!ò\10ͬRAÚ\ 4\84\8cÿ\1e\7fê<\17m@ªì\ 3P¾D\80ì»\13\85Þò:ô9\7f`xY\1eY_f y9à÷}°õ^\93\94½L0èr'\17\b«Ð«çfÁ¢W\9c|\18\17zGÝ&=\1eä7\9c\96\9bð]ÅÃs²<Ùd¦£ù¾¸\19¾©y0\9a\7f\8e9\b\10\a!Gó'\8a\8fè        \81þ\1ep\86êLà°o9p,õ\9f Kj\ 4ÈÑ*û
+¨íà\89æ\eêí>\ f¬ÓzxßïξúØ4öµ÷:sùÄEN\179¸y\9dOª!9e§ù\9c!ÔäÒXJ>kê\8d\10\19¥Ê`\9d\91)ï¥!\97Ô5Éî\9cÖRfWñ¤\ eÍg%[\99\93\10G\²»\17ä\97\80Í|\8f\0ÓzP*'n\0\95\99\ 5 +:\14Èm¶Ð-n\8eºÞ\91MI×Éû09b¥¡ã\96ÝÒÕþ\ 4\1cì\ f S¯/ÒÓwÁF\8d\8d\1aPcÉ#²ªf\8dKrpÍ5\86\9f\99ùýt\98Cvº\ 3¸}VÄÁ\9a3ûçÜé,J©\V\1c\ 4uB<¤ºè\0¯\8e3¿\a\9cIÕ) \96\93- øÃ\vdw7
+äÓWÖo\8b¥8íú®¬nÝó;è+ûá\8b\l^pý\\vîîiÝf\83p\16\95\84ϤSQ3ãSÍÂÔñôBÈs¾\9e\1f®«Û²\84\98¦(Y\bß/d\1fR¯\JM»\86ÑÙõÊý-ÞÓ\16\19¢wÛ\15ãɦ\9f\a­ÿ\ 5\0G\96³?¢hÔ:\8aà\88OeÃ\am6\9fè)Eߪ5§ut\89{ßõv§\99\93ìζË!ß½\9aµEÃ\9f¶ke\10\8f\9bATM¨Þ»\9d\96Íþ\1c\1dÚ¥$9Ø£jAÌ5òõÞX:³Ý:æ\8a\ 2\9d:\8c;\v¥êv\16f)%Ì\87>)¼¦\19¬[³ÉÌïñ}\1aÕ9ÁÍ\12ýÜÁ>
+\1dµÜ¼\94\r¢\80*z9S+\9c?ïBi\7f6E~\13u\ 6ãu\8fk¯-\8f)\9ef-þs7ú\0\ 4\9avL\ 29:g\13C\87\1ff\ 6\83ó\1eíß\92\9d\7f\ 4eÁT¾ï\11t8jÕã3;Kmoõü¦ÝãÂ7ß)])ÞƯX'Yò\91ß\ 3à¶?\83c){\8c_8\7f\v\93õ\86Ågê\9cj$À\91Ðøxêt\8d lÚÎê3\æ]0\9f\9b\9dôJç˸8Ýx
+ÝÝûÃ\8d\16E\ 3éSþôµ»\9déÎÜ\12.$ÒA\91\17ª³z\e\aF\87\93*\aµuvJvK\96Ã\88˦½\1c\85d\e¯\85qÖÐ÷øK\0¢Z´\0\9fA®°J^\82\8d¿=n\82Óa\7fîb÷]\85Þ¦6Éd¯¼\1a\16­®ùªÏÇS¡¥.õüEÛ)Qyx\1e!Ô4.l6\18Õ\ fÏ~å\92\8dºôÉNvì\ 4\83ñ\18\93ÊsÇàQo)ã3Ï\8e§\91ÂøhgÍLöXÈVzÅ2{W\8bùVAÍQ¿\a <å[Ø,\9b8ßojÛ^\1c7h~¹»ò\9fõv¦\95ö\8e=μ×ä'Ê[¾\cg¼Q\1fê\17·:UçÕÚz$lëîà\fÔs¿V:Ü»l\91}u\ 4äøn\1fx\15áò\a&Ç>ºù\1a\13\f\1aq\94\83\8eä\81J[\ 5ß¡\19¸(Ò\16³©Ó\11¾®2\r|Qú=\09¿Û>\v\86ë\13çZã\9dRj\1a\e¦\0\f\e\1d´íå­Í\84Vã\\88gèYçºa\8c¼xí©Qú£\8d\vt>¸\1au»_?©p÷Þ\ e.\1d\8c\93\9eíá"\vZ÷ÐË°\93Õ)ÇÌ7×\ 6½Ø¿{t2[Ñ\9bü|í63½I¦É[íFsm͸æ\9a`\9b_Ä!Õ¿Nþ\ 5@Mj\9bKýd\f÷Yì9tÞÉú`\8dkueQÉ\89s3Ñ°^Ó¾)\92º¶ók*;Ĺ\11Q(÷\ 6\9aºP{Ñ\9b4»©Èv:D\86\8b¿ãÑ>¯¨\aWF\1f\11\e\9c\8e\b\13Ý.yúó¼7éTøê6\85~Mo¸GcÓèO«Q£?£j\8d¾ w\e}t$ü\1e7\ 5]\r\ exw\1d\971Ø4×\1e¿Ú·Õ\8eU«rý\19\ f¦ãI\8eAÃñdç\91
+?¡\8aÃ\³Y\13'ÛM«\97,æº\ 2Ö¸*üpmÎÚÅ\9eê´ülçÄ\86EîÁ¼«Ü\87I
+}\9cÎ\88R©Ù=Y­Æ¾\11Ä\85Í\1aä"?¯\9fÄí¥>¢Fx=w~7ë¹y\91ÿ=\8eükÎo\82ã\92Y\89BÐ0\83¼EO»9­­\97\85Æ\88\13 ãµ(-\95\ 46\9e\ 5ú\8c¹Éw\91n½Ê\9fó'\86{Ô{|«±*\rXæÒ0\18Ϋ.h§Êí\9a®Ð¹5ñÝ lHä,S?OoÅz>úÐq½\0±VNê\93êÃIîª\86°OU\8dn±ð7â\90ê?¯|á\96¬\13³Ú\15¬²é[åòÄݯKãÊ}ÑP:á~?<w;71ÐÜG/µB\83\8eD\8eßíÒ\13O·fô\19gV\82\94£\1d±_mº£6Ó8hl¼\81jP϶TÏ\87¬VÓ\98¾U+},¸oi\1fn\95`\13\81J\13'Ðrt\10\8aeKZ±e6GÉ\10ûÍï±\16\ 4£húø=7q«­8Ö©M&anä®ÞUI#5«Ï¼v¦ÐGÉeû¦êk(\10ß2«\8e\91£|k\1cT֯˵,¨it&Y},1¬\12ØoªÒD\93¥²%f\1a¥Ï)Ç\97Úùz\Z «\17\85ò:®pYp'\97C¡ßH? Äd\ 1\8fÖäï\ 1w\13\er²=gp­¶\1da#¼\98'\ 6ÕëfÐK-Þ\ 3þ<¤z\5ÐzÌÇ&$\1a9lä¯Ñ<~\»Í\8aÓªÑJZ\95fæ´*³¸½)µ³Ó}ÑQôs\11ñô{¡_Õ\83üa6ýä)°Brrë\90ËÞì \96-£H\9b\1a\ 3Ê\10U\83ª\91öâ_\80ÍüëÊ´\93\9aa2\99á^<dúÍz6%ô3Q¹]òj\15\96M(E\1aÙ\87\85\ 6u\9f\96k¥¨T­ÌÚ\ 14ÕÞbJ©³Ö.¸ãf'\7f\98\16z¹³\95\1eä
+\89D\9c«\9eÕÚ@£\1e\9b\17Ô\81½Lr6x­\88è\92p       ¶\88\95^ðñTP{cÎLÁ1\ 4\8cs¿\a@°¬\b2zV\ 1\99·6\a\88\89|Ë´!¡ú\0h&\80ÿ\15\95Ê\0¹\99=\80ìH\v ãá\ 5 ¢\9f\ 4\98\aÐYb\0\92Úô@&\0*ȼÊs\90¹H\e\88Ã\15d¶Ô\eÂÊBDu\90qó-\90±\1a\ 2D/N²\0\19m EØ\84ê\87äüÜy\9dh\87ÿ%\0R,ü)\15¡WPê\15.ìh}ù\ 4è\88B\ 1Ú\19Ô\0Ú8\89\0E+\v\80\80µ\a\90}2ýý5:]\ 4È`Þ\ 2\bw\1f\0¤\86ê\0É6á_e\8d\1d@Òç;@2å\ 4È\84«\ 2ÈD)\1adn¥\ eD\a\8eäp?Ì\8f^§îA\f®º&\ 4jµßù\17âèà_'\7fJ]\16 Tå`\ 24Çì\0:9ù\0=50\88e\ 3 Óp\0PY\\ 3´y\84¶ÆH\ 4 ^\17Úz¿\81¿U\7f\ e\ 1"e§\10Â\1a íÙ\11ʾ=¿¿¦^N\ 1$çÀ?Íãm\80 \8c\b1RÂý:¯¼FôY\ eTN\1eøº\ëúÕB¶óK@C\96¡N¯©\ 2ä\12X\0\1d\ eö\0}\86ß\8f×c\15\95\84ðh\80\11@\83¹\ 3P\aÀßЭÀßPT ¹±K\17 \8f4üç\87\1aì\e«þ\ 6 \86\ 5;\88ôx\ 1dX\83?\89\0éäáß5zPâ\93Ò^ù¢£ú^Ð\8f_]|\ 6haø\88\88{÷a\1ewÂ/\ 1\90n\13Þ9¬­Bk"\v¨ry\ 4X+\17\ 2l±Í\ 2l\9fk\ 1l9T\ 16¸l\ 1V+G\0}\r)\80Î\17Ío\1cºû\84=£D\18\0ÅÙø¡\84v\80¢W°\8f¬\1eo\80¬k\ 4@&³z\84ÃMLH\1975¸\15-ïÊ5#\8e\88kÞg¸\ey)UìÝ\9dRKø/Ä\8eG|\84÷\9c\85R»²\ 6\r\9a_@_õ
+¥ÞE\0ðb2\ fp:~Ã\9b\0Ç\89\ eÂ\e`Òº\0°ì½\ 5Ðk\1aÚÚ¬\99Ñ\ eon¢¾Á\9eÃÃ\85}\86\12Ý~\87\94§`ß\94xjQ
+nÝD×7¨\84ò\9c!`ê}&\9béÝé\rÇ7ר\8c®\92àõ®Yt/ü\12\0\99\v\12¼ñN\1c\98ì,\ 1¶K\9e\0.l>\0ßÔ\8b_\8fà²\16\0~MO ¤3À{ë\14À>÷r4Hßùp¸\9c\ f_\17g<y\15îÃU ù­\9dÿDêWß°ø×38r©g33Ê=,æÔò¸×ux\17ðääÖo\93³\8b<6Õ\93á"q¢ò\ 1Ôf­\83õ\92Ù_\ 2 \ei\bÐìyüg`²P\81r^É\14 Úó
\86é>\84`B¸×è°½gÂüfXxÁi\95õ}Í\8b\9by\86Ð\8fy\80Ggþ`_UÛ[½ñÃÝ9\ 5·;\12=Â[\9fx!×èV¹ä\8fmáô¸ÎFÇÙÃQ\ f      ¥/í6Õ\ 4ï\8aÈ\82v     wÜø%þx\14!K\0\95"\1d`\96½\ 6¸£Üâ\ 4ä8QúY\ 3\1e\0²|XEÃIp\7f\8dkäÿ¢\92¹'óìÕ\1e)<Åß·Mcp\13§Yí:,]f\97Â\ 6îJ\9fUz{|Á_}\0d%Nµ:°#\15Ù·û~c'Øõ®»ëL\ 6Ûì³.8÷MÈÚOÏ®Ù\13}Zþ%þÔyÄ\rè£úvü¹\17g\1f£\80ì\17\1a\80t¿ïFE'í³zé\8cqöée"zð\ 4\87ÞûºU¸\9e[éæÙ{ðÜ1\1cï»\87E4\18î×ÇÆx·1ñ¹»\eDëíQ\b\ eÛì\12yn\94\94A:ãÂ\87\9fïQg=?7ØÕ\ 2PÍ¥\9d¸Å\99\90K~í\16~   \80¼4     `D\15öC!  ¥\1a\89' {\17\1c\90\91D\ 3ªñ\91ÃÒä¼ð­tóðètÖÁ\9dT\1e©Ë\98\ 5$t\123\85CÊîÄ飻ÞêF»ä[â7W¹ :^ù%Û~î2Y¿>\9bå\9a®Ý\ f«\85Y\8e\96ëÕ\ 66}ì3\8bnÈÖ¬\ 1^.\9b'£P0G54÷K\04=\e~§ÎotÊÉA©\8f¬\ fÈ[\9a\0ÔÈe"¹\89\8f\82\999\9b=ÓŬ{\97\bÞ»è3\ e\1c[\87Jz\8f\9e\18ÌͶ­ÜFã\88²\1dô\17\8dµy¥¹ÕÒÈt\97\1dô4\l+{ÝÚç÷qî E\8e±\8b\99\9b\9a¨\99O\8dkóRaX\9aé\v17\r\92<        Ñý5àX²\86°\83\ e&\80Hµ6\80d\84\10\1a²F\ 1Ê\8fØ°¬E\92\9f0ÚñS\O¬¼ì«vÍ\\8e+Þyîqt\ 3¶×Ò#íL\ 6\ 6ì0»jÓaq\898Óºu¨0¬92£Î\5\82áLW\82ÉÔ?P\9bi#»\f§\8dɾ8±2§Ü\84Ùz\94±*y8\84\1foÕ¿Çÿ\ 2@Ûî\b`7}
+\bNq\ 1ijPêT @\96Ë·\82×ÚíÁýPM½]ó\9bÅ\99¦¦û½ûh^Ýü´î;S¥ó^·,%¹ÜÌßñÔ¹ f\ 3Ê\94×Qa^ÆgÕi0o³\93hPî\1a\1f¡¬\18©VÓÔ;§óUw$<«\v5\86Ò\91\17\87\8fût#\ 3Áü\1a\1fFp,\99ß7$\89åz\ fÈÐ\ 1РF6R¨<ë/B\83÷\ 6EbxÕû\93ù\91\9d\ 1ÇM­äß׫dà/{u\ 2Ä\1f>NÎïÏ\0\99Õ>\129\ 1]¢h¬NÇ\9a.ôçܸ_Wú\9aĬã\8f\ 6©ç5ºÓ²-\ 1Õ²â\ 1W/ä\r\13\\91åS\90ú%\0ºº\8dþ\88÷\10Þq\ f¨Ü!\ 2Ù\8a\93\v+\8d ñìàmö\9e\17_½³\19\92ñÃbè¯Ü\96ÛñxáÚ\8bôô¼Bn³»uÆ\8eÁÜÛ\91`\1aöä䤥$\10}3\1d\93c\91 KZÖÌ4Ô\82\91\11\94²\82ɲá\r×òS½¤\94r$`òÓ\92\10\88Y
+Âú\ 3°\99¿Oþ\ 6\80\ e¯\fð©7\ 3$ö<\0j\18½Av\11ä_uË©<z«ZóV&\9füÑáÌá._\92gNØá\9duÚc\ e\véؾ\9aåÔø1\8dø}0I¥ño<­G.RÚ©\ÄTeãç\94JÕ®\8e^w½5\ 4'S\1a
+IkØê\12áð\9d}f\86ï\1c\9a\1e¾3Ô\a"ÿkÀé)\ 5u\9eÞs83¡ß§QÔ  ÿ\80ÿáëÝÛ\ edÚþï×B\v\945YdQ¢\ 5\15R¡R\16\89"¢áýÿê8¯í:\9fûÚ\8eãùç\93h3ßf=ûì3Sú@\95çç,TïÅ\17ܼêèªç²Ì\88Û\87TWÙ\19ó²ap»ï~}[ç<M»5ý\15UçÃå\ 4\ 4¯ù\ 5¥>r½ô\84Eu¸Ägä­W\9bfguR@Ø\ eË\8fÏ?9\8dÏ«\8bP@N+X@\f++Ð÷ð\9b ú\eIõT\94\92b\8fèÿY\1d\8d\13ßøú\81J\ f\ei\95\82[õ\ñ¬i¶q¼6QÆéÖ2éü\8d\85R÷õ¶\1c\a¶Þ^^\8fjæüñ\96ÇR=\98_\9eÚC
+­Ì[ìÜ×Ù©\99ëä\ 5´\1d\95ùB!h±\9eãRl¥P\9cOüðíqE\86\84¹bw\9cáxQù$Ðþ?H\82ù\9fo@~^\17\93bßÜ\80"Â$R¹á÷Ýô6ù\90­Ý\10¿Ý\1c îñ.\97\ eMä0ØYYkj\bµåj½<Ï·ª!®\1c%/ïNóë-ò¤Ç¦\7f\9b\81±\93\9eSJ\e|øÃ9NÄ|7ø$ÐÅú8\*\831\11E\12\13éËÃ8|"ð¤\91-g&s¼\v\12ôÿFR=\r\93(5Æ\ 6(ÒJ\0J7%]|\11­\ f]èv\1dÎ?Þ®·}\9fÊv½àè!Ûµr\ 1=ÙÜ\8a½¹\16ûÌz\85.ÆÖb¦È{\99È^γÏ\14»N\11Bºó\1c\97\7f±×õ!3i\Ù<óâ»Õ\11`¨Þ(Ã)<m\11\9dt!æ\bìï\10Ó\r²\19F\8bK\1fF\v0ð'@¡2\93\93²´µ@ñìÞ\9f\9f\16s¿v>\86íÁÑþäò\12\1e\1e\88Æ\ 1ÞíÆ\99\861=ã´þºAi³¦Â
+¶Z\96:øZVÆ=Kì\ 5Úa\8a\92\8f3_¬Ò>[Güp¬¶f1C\9eZð(ËTËÔ\1e¯v¨ülÎ\rOÕ¢Aí)#KÓî\a¢­sæK[&\0ÿ\83$\98\7fo\92b¿_\ 2\ºÙïù^¸^U¾ \9e\99y¼9Mw\90u\bG¼g\7fe\ 2\98¼·*n\88Ú\9eÔ²Ö\85]z¹³,?\O\11\a\10º\99æ¦Ô\8e»BNÒN<kçq·pJWE\8cLr\12Ñ£¨\vQ\85Eµ8¸t\1a­Ae£°ý`PÙ\ eÄüô3,®³è\90\97>ÙáÉÇ¡?\ 10ü£$\95hõàß\8e®x¶3ìüxíuÓ\1a\96\1aªm:\eÛb53Ü6\1aeTûÚ£¦âÖEj¾Ü-xÑ\90Öò4¿¹¬8¿^ÝL\9e¹í\8eù µã\88nyWê¸\94\9fÃi\95É\fªO
+ï7\ 2\96è­\1aî¤×ÎÎ\8cÞj¨§å¦ß\bÛX\7fîÖÐ~ðmÿ\r\80\9dÚê3Þ|VÞ\87-q§âý:u^Çét7\1a\8d%S\b®\9bm³ürõ­ä|V\æ[Z4ôjWÊ`ÍÔ\a\ ee\81\vVî|¢\95ª\1a\8e1Bû¤CñúÇ\e\ 4Ð)ì/·Æ·§ª6N®7A«ûÍÖÙ®á=Í®qy}É\1e¥\97È5e\15É·°Å\7fCj N¯IÂKªßØU\19·\90_0û\16\97gvHÝ\18\19\15ÝàׯÓGÑvú`¿â\99v´Xöì¼4x>êSn\8f\90Ü\r\8c\98        Y7\ 5\86®5\164W9ëÃë\94³\ 6\8búÀí·®åÔW\9d\ 4KüKf4\ 2ïR@ît\9cÁ\9dï\8c\8bºÝ\19Ã\8blÇ¡±R\17¦[Õ.Ü®\96ÿÄ}\12iã3­\8f\aû\90õú;X©\93[\7f\11÷õÍ&Hí\ 2j^-\8aË`ã\1dçÚÄx\896\9fÉ
+\97é\0ç\88˾1þÎ:\ 3\ 6U"\96..Ei(\83\96: v\98Õ\8b\13ù¥@HB\93\8b*µRgòâºm\97<\vm¡ ìÚB\86ɶùÇ%u\89\1eÚüÿÇåÕ³\ 6ÇJÅ'w\14\1f\13[I¥\1azϪ¶V\98\8bõ\17-\8bÐäA\81÷f\3
+ùÛª\1f³$ä!\8c\14é³\12¥\ e\97Tõc÷\a\ f[cû:'H½íLÐIkÎîºÎJ¸tó\88ùîà\85\9eN3õÖõMÑ-i\1f\1a{
+[µA\a!n\9e\%n;¹ö'Ò.\açù\9dÝwy©o¯£\Yû\·eEÐèªü\9eµ[â^)ZÓJÖ=qê´ëO²Ññ1âGM@ÉJ\8c\fTCÃ{ß\1cUëAx¿K¢\1d\86é\16úÔ´Ã[¬Ò¾ \8aÕ®ÈnÚH·êJ\10\11\84\10Ä^¨7£I@7;\8f¡Òì<Ë~#\9e­¡\ 4{ôOØq-ª\e¥ö\ 3×>c\1aS\8aÁ\e\93É\9e\8cMÝ×»Ã+\95\eÜä«\9f\r\86Í\91\ e]ñïî Ò'×~\1fª<H\9b\8d@\97-\1f¡N1Ô\víÊkQnÍÉ\15A\84ƶß\8cìí¸ÙÍ\1dÅÆ\86{éõï\ 5Û×M\91½×©ê1[³\97\99R\82y¿Æ´\86i0ÉU¶þ\84á®\1e\98NÖpT)²\ 6*m[\10,x\9e\89°1E²c&{\17h±\\17\86\8aý~\96]\90\f\96S;®tݶEbk·ê`züñ ÎÒ\97f\17\8d>\96¼¾9m~ë\90ßI¯\8fJU¶5jV\}9¬\14?§iùbæµ²HÑûr\15ÖýR°G2       \9aè\9fÐ_ÒÏ\84¤Â÷g\90´¹ì¿Â¬Be&}¿\8a\8c\84Â\85\18\86Ën»ßÏl   \12ukí\8ePM\ 6\8eJ\11­ÌdÜ\88÷u.)ùЬf\8b¡T=,ÜeµðtõJ16·e±oÚ¥À²OÅpoú?\96ÛÂå\8dk\ 2\80±Ø¯V°\8d,t±~Ýf
+ßð+\17¾\ ftñ'\94S\83üJñe\r\84ò$~\8fÍ!ó¢üÅ4Û\8f7å,Éä\r¸S¼\15á\9f\9cö¶\91¦F±¹ú÷TÂjLå\8a\86\14ßR½\14\98íF©\ 17[ÅV>ßÅ5\1eécñ\ 5¡\vßà=)P\8d·\90·Õì"\8fÆø:ÇöÛ\ eêZéü=½}¡Â(\8b %4\9bÎIÿ\\7f\ 3@ðÕ\10Àê\8a\ 5È0'\ 1ä>_\ 34\1f\1e\0\87\0ùÎ\11\80¸!\ 1\90U'ydºÓ\ 12J\86ÏHeü\ 2\bºC\ 1\92ËV\ 1\f\9a?V\ e\18Li\0߬$Úî\19%\ 1µK\10\85\0\ e»Ù\ 4\1a\9e ¨\ 3ø\ 1µÿ/Zñ¸uiü\89ÿèô¶\93\1f\ 3ñ\8f¹7¯%R'è)Áè        Ð\9e\9dKD\7f\13©\8fÔ@{ö7\0Ù5/\0\99-@"Ú/\0¤\9b¯' {\0©.\98\ 4W\11 ù\9c\96\80±\13ÄO\80\14(8\81Yþ ¦\10·\0\82Uú?\88\9d3Ú{\1f¯\87ö\e¯Í\9b\7f\ 2 Í-\ 5\90ljýþ±¡\8e\ f\e\80î+\89N_}%\9f¢\ 2\ 2\ 1оúc\17@±÷\16 ÙÁ\15 Þö\9b\88\0ÑjÉ\8bhÓ!@D+y\eæ&\ 3d\M^i,\1e\ 1\11@zl>\81\9b¼R\1fM^©ßcâ±U ß\9cãö_Ó\93Ð\8eüb«ù\83´×ùß\9b\7f\ 1\90\81\95H\1dÜØ\7fl¨¨\13n@.ùO\90k{1ÈuêE\80Æ£.@\ 3o\ 6Ðmm\aPNº\ 1´ée\ 1ZÄ+\0\85è.@¢U\12\9bI\ fõ'Òl \0Äi\99\0ÑçIFÑã7@d¡\98àÒ\8aóÊeðæ^áø5ýh£Èç\85áó.\96ºÏfð"þÄ\7ft\1a\19\ e \92²ø±Üþ\98{WË3ÈyÈ'\ 1_\ 69u×\a9\ 6\91A®:v\0
+\9cgjìG\ 1ºl×\ 1ÊK\ 3\80\12Ûä]\8b·9@aXOÐß\ 3ä¥\ 5ñ^º\80÷IÁJ/O*µ"\7fYM]F\9ew­4~\12¹Üè¡Î_ÃpmYäý\8bL[\7f\ 2 \9c\93\94x\80¾\ e©\1f*a$£@ÿ
+òÜ$\9bàT\ 3ùa~\ 4òEz r\97í\8fkoN|½A\8e¬a\0ýЭøÀOé¸`O\85·[\95\16ï"7Õ_\97ìÊ~ÍTÇ\8büà\1aEõf\13{\12\95\ 1\11¾\1fä       z<¾\eoi|\87&4uC\15\9c\f&ѳõ/RßÁÿû\r@\16G
+ d\8b\a¹V°HTÎL\90ßâ\ 1È\ 3\ 3\ 6\85\ 1ò\9fñ\18äO[\15äù×9>^s\9f÷yñÁ^×\8e×xUûû~Ô(/ÇÏp­\8aO"TÓ±çC\83e#\8c\10®ïûûý[\8c¡ÛîT¬\aûhØ÷ݪ<ò\8bÇ%}\15\a³\81\17\ 6Pë¬)ZõO\0d{¥\93¼É
+ gA©\ 1õdÿØ¡»Ó\10\14ô¤\12+8\;Á\99\a\ 59³~{Ñõüª=§ÑóÙ¨À\8f×5.\87`yh\87\99î|x\87³ÝÉ\8d©4¤àÐ/©Aa\9a3ü¢\r¯³\90\8d.uÉÂÏ\1aäÔÝØÁÈ\1f\93ê¸Eº\19²Û9:Ù[õÀ\1e8ìO\0äx£A\ eV\84ÿx"¢\1f'õ>\8e\0Ö\1a\14\0F\1d;\0£sÂ[4®Z¤pÜá±þÞS_\8e0{\1f}nû*\9c\ f8zUñKn»u¹%M\98§x{æ¬m\96¼»YÍ槯¿\\9f¨úéx´§5p`ë\13|ï&Ãßý4Ón;×)^·oú½¸{\18ËÜÿ        æß\9b¤ÄgF GÙÓd8=JÝûÚÇô\b¹\17À\\1d\ 38V꽯>ÌGíêtùÈÈwó\9eË÷¼ 8×\9e×z\1dÉ\9cß\8b!âný\18\94Y;\8eólëÀAýÔ£k/Ü\92\12\e¢S\9d±k{~0Ý]k\96ËX¯Ù¡d½¢\11a\91\fQ1\aóoÁ°\1e.ü'\92ú³Ä\80\9cyItƪ
+0hzJ\8f\91úÙ"\1c\9f¼\8a±ÇR½èi\9cÇ\8fa¶)ÝN°¼ö¥ÎåèuyËs©,\12\1e÷á,>à\1f8ëø#+oß1®´{¼Û\rë\15Öz&p\92qß ß\94\fkÈm¶\ e\ 3\1eÛñØA·ã=\93NäoN=ª¸ÁÍ\12º\9eAÑ÷O\0To$R¿ñ\f\14\ 1\82¼ã\ 1¼'¦çÆ7Êï:\9dk=¾Ìtp\9føoÞ\97\97\95\95GîsÆÉY\94Ó=\88\ f\82Ùó\9c`ëÞmbÓ}Y1üÎ\98\ 6¯¢Æ®;)nÇ^±¶9¡\15ríe*̺Ü\1eÍuií\1fôÚÜùè5 áÚý¨\174¢9\85Ôç\93úü\86\91^\ 1zí'\ 5»_H¤ªO==í.\91º·¿ 8bÊÉÐåÖ\b\19®Ý\rDÅ`¼x®\88§½=U\ fSß0\9d\ 6p\9d]wSõLSßÞ\fÔ®E\e\17ó?kïm¢º,0éhM[\92­\9aú\RýÕ[d¹\15y»èÊçtz¬Öþ=¿êm\90¼b|ý\8c24\9d÷\9f\12\93è\9cW\12\9dQ~\ 3ðBæ\ 2\8aÈå\13W\82V\1a̳oX\95Ûy\96m\\1f:?tm\1fã\ e\97\ 1¾p\88RE·>\9d¾iÂ/ë°e£²·¾f\8c@\9fOz\91F\âÏ*\1eX°ò­,p\ 5Â\16Íåhz\1e\87Ü|1Ù¢þâ0.d\17\a\89O{\9d\v¶F\7fS¼ÿDR\89
+\fÈ\1f:"À\88\91äÍÒ\15\14gpæõÈdr¡#\92\85@òï\15oëE\9d\13f\9c\99}£|\9aíÖ PL$|¥\9b\0mq¾i®%vwÐ\1erý¬vµC°ÊàB´´7ÕÏâ0Ersw\82\v\95\8a\93\fµ\82I÷(\8b³\19\90¯\10\ 4É¢\9dýÈÕÑ3ú\13\8d \8c\93Êi"%y\946\93\84ï&R½R&ÒK\ e\8e\bì\13\85uÁÝ7ØúA\12§C[ûÎx\vòæò\96wôÕZ\1e\9a\8aô¬Õ§x9(t\93:/s\9bÌm~.9/Y4äÔÐ%͵\19.*\v\99\98EÏûxÖí.L±eÆ/qÕ\90¿â
+SA\8aç\9fH\8aý&ÑÙ\91å$\83.¬$áYÿÇ0ù\1c\90,¸U2ç4C_zR!{âéFeß\Ôº»Ìµ26ØCw¶\ e\fz¡E\rC[}îß\8d\82l\19kÁí\1fûy¹¥_\92\9a\82~\88«.\ efÝÇ\17\9dö\ 3´&X\8d\11%Pϼ>ÍÜÙpºÝ\17Át»®§\95Mr%\9e\7f\ 2äÂÃ\ 4\14fë9Àó\8e\r\8a´v\8b«j\ 1<\10>÷ðÃ6\17\9e\99¬\ 1\8e\19·×ô\9d0\1d\10S\9b«\ 28]¹\94%µ_\9e¤¦!et9è\v^-\19²onm©yo\9ffo&\e\8fÓK å\rÄ\8f\ 5³Ä\1d}¨Ïáõå\82Ï\8b¹\e¿'Ü8Aô\16\10þûø\13 _\b~N],xÞ\ 2àä9\91jÙ·èe²÷ûiw\r.ñýy>¹\87Î3\19M/ÐÝPÞ5\fÜ3ûë\85sdTpx
+\8aS¨Ì\17\ 2Ç(r ?Ö\12áL­Ùú\92=L¡ÌÚã÷ëÙ\83ãK\9d4mØY¾\8fMäâ¼=©]\8b³\89\7f^]Xï&¼¹bn\13q8Ø\84\7f\ 2ä'_î\1f+\1a®\83ý«U|\9cüŽ¢yßÎw\9d\bï9Ǫ\10¦­§\1d\83fÆ<P£ò&@ç]ím,è\15mí¸%\ eE3ù6kÌÅWKWg}¾¶\15ìùÞæ\vûá\89½P\95ÛD¾}ãñò\ 2ç\18õÖj2\9dÅ\85c¢IÓ\1d\87jë=©{ìkRW©Ô4ôsý\rI±¯\bIYÂWI\1e-\1d\82k7\92½ÏF\9c\9fQk¾:M\11{»o}Øó\8ez\0`\94È"®GVµ©\ emz°<íåñ¼vÜpR{\83¥Þ\ f³ÁXR\84qç£sgzf°U¥¸\1f?ªñ\95Ѽà5ê³g\986wp\8d\86\986£ça´-\80\17Ó\9d7\12°IÍý\17\922ßKtÞ\aérìç&sR.¯C\89s÷Îkz¼\9c^Ò¡Ù*­ìÁ\fìMn²xl\1aO\17Ñúú«ª°\¾3\ f\ 4b(uTv<\e
+\8f©0!H\99\9ba§ÕäÞ\e®Çmñ»\e}ðË\99\ eö\83\1aÓVZ\v\f\8f{P\19â\18K\ f¹\85aSÎë\1cÑH9÷¦évîñ'\92²4\9b&\19tªù\81\97£Ï´¾\18\1d/DR~[\8b&k\ f¼ÁÔÊ\9f¹í¶vÅÓ\r3trÃ\7fWcÞÂ\17RûÞ\94ôÜ\97\9cQó.%`ù-ËU\0>\9b(åÝ\82\89©\8e:\1an¿\16µ\ fÌãðt6ï\83\99l~ûþ#SîË+\85îË»]\12\aÆö1,Ö10ä{¹ç\ fÒ·ùïÍ¿\0Xv7{öÊEÎ\ 3\ 2×;ñD\93Ú·2>µ³&*eò-u¼­/O\8a¾É®\8f*Z.D\vÿ8@äv¨\96gôî@\bx\eë±·Ë\94\9e´³Hê\ 3Åô¿ªH;µú\92b½ïfXb\93Þê­\1cÜz\8fBø!_e¬Hj¾M\91ZpÚõZ¢\1eö\1e¥\12è7ZXô'\0¶½Oý\80>öÜ1÷N\aìû\10[\93;Ó-v\8c3\b»\eb\16\fõ\f\ eMÕ\£`,«Eå"w\91G<³ÉNNHº~\156,dZãõ\91ë3Ù8;¢'­\9d\96£ù@®Ö×ý泸ïµ\83b@\92\8fηk´7颥nvS »ÙmÙî\1adæÙýHÔ\87$\1d\13\8fÏø0òúR¶u,\aëöîkDMã<`jëç¦ßÒ ¿J*åRu´X\18ÔR&\a%'-7ãÖâÎ_gÏ\ f»*³ùqÿòª\8d\18oÚ¦ÎXy8¬\8e½Iÿ\ 1­¥\9ev\945r³\93\9d®yX\a\1dû|úvr\95B¹}\88½qû\0n\87N®&F\9d\Þþt\18ò\0þEê;ø\7f¿ñ夷yâF˦\1dç\83\9a\895\eåõÊ=\96Ô\91!U\97"\98¶äµjÑ\12Ôx,¦§¯eñõaÙ\9dÄ\98ÿbv.\ 3Ó§#À©
+ºm\f\96Ó1Ùï\14j?þÐ\9fk~Ffï¸ÖE¢\9aÓÉ\ 32hó\83e¦åy\9fZk¦mÙÖLÒ\ e­Ù\ 4}´f=*ùAfÿÆ\19\1e\18\8d}óõ­\99,\ eãë\87"¥3ìê\88À\v\8bà|Â¥m¸«ÍXkË\vU\81\17\81\ec+³?\8eX·çSâíû\1a<:g¸¯=t¼×ß/\9a$å.\ 6]æº`;ì}!·Ï\84c´®Ýó©U=a/âÆ/0¢ñʤèæÃ\89ôæC\9e]\9b\8f\9e\177\1fu\1fü\89\83t.֬ѱ\84o\1aÂ\0UiÏG\16óò\10\16-1\84\85Ù.*r*Ü\14&\ 3ï½dò«¥NùT%\9dô\1a6ïйOÆæ\8dÜÑLÔÝOÆÙÎIáð¶§\8fkíòG"[uHb\88¥èHÍçíµmv\88\92ÛXÛ«Ñc\1eXý[\9b\ fêF8ÚÔ\r÷~©\e\16þü\1f$Áü{³\83r%l3\17\9a°JÏÖÙ\85ì\173"u\93?¼Ü/|&\9f­ÜgXtÍÓ\15\9f\10\87D\14/ûýìF'm\96±º\ 5¿th_\94Ì¥\15\90\b··w3ÚùÙf\17½§iÓèc÷jz\10\ e\ 5e¦Æ4Æóêa¥\e\93¹T\v1ó©¸\9bG¥"\fL¾"\f\9fØVÜ&¤ev\8bïB\96\9e@\84\9bõ\17w\17\ eéZÜ1tiE´XÚ´\86
+Ñíôû\99+I2\ 5iØq%rÒ®DY\9e\b7w©©Ñ»ec3Qµº)ÈFÍ\96&v\r½ónµ\10\8dü\8aÐ\9dEeq0Ï\96\82\9d],5и]\f\8f½IQáÖË\7f\9ca?;<ºÐA\82'ô'´þ\8e\ 3\v_òÞ"5¨Dܽ4\7f0£øq\1f.öÖ3QWFI&ïå;BuThÍ;P±\19\99n¥±\19kÿìýPdÛ5ôÖèV\vOlP)¾\ 1U®|oãR\ 3>rEe|\96ðètU°ørÞ`ýêk_ \88\8c\9f·µ\16È3]\1dË£àAä\ eF\95
+¿!     æçº\9c\97h\ eÐ\aw»öoÌ(¸Þ\ 6Êe\7f"GFöÞ\11*FЪ¿;a³\v\ 5\8fºÉ\89\8f\1a\1a\8a»ÊÄe\91<\7fJ\rhñ-¶r\13\bïâ=\14ëW*ù\829/ây{\ 5¥Ug\1e}C\8d\1cÛC;¨k\16\ 4wxD\1cóK¤\9aß\9bð\9c\7f{ð\ #¸Q\92³\7f\ 2Àȧ\r\96Úz\17c\80d_"@\8a\r\r \90àüXn/ö\rÀN)ù$\89M\0\93\ 1\ 3àzG\ 1pam\ 3èûô\ 1\9c\ 1ô\98@     vÅ\ 4ï\ 6\80\9eí>\80<\89\ 5Ð\ 5Ö\12\b\87\ 4n\0 +\9a<übà\7f\91\ 6\93\14Ù¿\ 1W\90\ e\80;íDêÓ\9a\0\84È$RyJ\aÈPÛ'·Q\b\10¸\9b\ 3ðuC\0XÿN\0,\8fV\0\9e\9c\ e\0î#·\9f·éÓ\1f\07\96h\ 2¿\f`<\9b<\8a\93\83\ 4:\ fàbNK ¹     â\a\80K­L\ 21ùËÒ<ÿ\1f´´|l¿DôOü\ 4ó#u6\18\ 2\ 4?Nþã0}\12×\0¹\87'\80\98Å\b \82\90\aHëÒ\ 6\b\0ü^ê\0ö\9fG\0\1f\9a\9bY\12ôæ\84\ 1xþ®\ 18\19¾\0\98\eÓ       \9c\19\80yLÿ  \86·¯\0\16
+q\ 2&¹Mzÿ1s\9d\97ÞG\92Áßì§[xcF5÷'\92ØÌ':½)\ 5\10î\96èüôe\80ÖÌ\r@{\85s\82\19ø±Ü~Í\ 2@ÎP\17 «É\f So\v\90\ 3H\85N\8dýk\18À±_\ 20À[\0¾¥±y[±  \1e\v\0\9fªF\ 27ÉCn#\eç®­DÓ½Q~\95¢L9ºî@1\92F·tYiT«\ó\7f\ 2À#¼ó\8f±\1f¹Ã,@ÇBj\96\8e\0}O®  .\19\80®¿%\80²½>@\e\86\ 4ÐÌÇ\ 4\88×ö\ 1²[}\0¢ú?\9bg!"R\a\bÓ&\ 1ÒåF      \1c1vn×UÒÕÇvoNì\ 6¯éBøF\92ºÈ?\17\9bEùñÄ\16\95G{5.\86ï6\89\85\9d\ f×åAá7$©^ûñ þ\8f\rµÁ\ 1ôeÏA\8e&,\90\ 3\90S\8b\10È\8dF5\90C\97C\80\ 6ï\ 5@·M'µ \87ñþidã\ 2jào¾oÔßøãD¾få=ý*ï}>\92¾¾\1cÕ¬üöyoÓé2\9fÇê«\7fBR_¢÷ÁÉ(ÝvÃSå6*î\8bÁ^S\vÁ\84YæþD\92ðd\92¤·[¢Óa¸dì\1f-@>£: ßD\92AVs\82\80<¾oþØ\ 5¼ç\bä´¶\1ac\83²óºìß~\14(÷8ª;\ 1ú$\96vé¡Ú\9bæ£Óµ{áza3÷Ïn#Ü\87¨»ºg·¨sKº\13\91\7fbçðÕ³\ eøÅ\7f»E/,Ìs\1e¡0ð9¢¨ô\88×s$°Ùß\0\90fºp\80\84i\90+͹De]\ 1ù¹\7f\0ù\eý\ 4yàåAþ\9eoÅ<\84\8f_>æ/¢f\81ß>^\12á\86\9bg\1cÞÍ\8dû½Ùô*µuÞPY*\a\ 5\8alú¼Nö®Þ}À\ü\v9õî7N;?\9f×\8b»Þ\80÷Éx6¡Óð¹Ê\1fí\99\ 4\1f\99Î4sÌ¡ìçp8ôãß\90¤º\9eèÔK?;Àä\14\9bOTÎ4P¨Ö\P\10­\17(85,æ?íö«>ß\ f\9f\9dÞp\16\ e@ Ý\9c o\ 5Øõá]¯Ä*¼Ì\8f\ 3p\8eÞ_È\8dÝKÁíÃnå4¼o\88£M\1c\ 6GT\føÃä^Ok\81=\7fQ¯ÎEÂ\81S­Í`û\96\973öü>\ 5vÃà¢Ýc8xþ\86\8f}\90\83©$]¿a¢3Þ­AÁæÎ\0+eb\80QSüÕ\98Ýk\8f¤zM3ô\9d©\1eÆI¨%ùZû$±ôî\9fLw0\19\1e\15ò\8f¹mð<`3ó³/õ%Ä\11WRÑ\9eË\c\17º\8bþ®UºN-Mf\1d3þ&i±Íð\1fs\90Y\ 3s\80í^\86µZ\86\91ôÏõ\7f\0ÐÜ\99\ 49J\18\81<[\98&\ 3ÀÏ\16`\84u\ 1\98Ûÿ¼kù2ú$ûjñ>\1eF\8d ´£\86\19L\³±\96\8fûS¼:à·¹áø\9dÆÁ^\98·t"\7f·\92¬ÐÒ\87ÒÛÜv'\90\99áF\98\ 1\8f\86õ-sP\87\9b#\8e,6\98ê¸\e,\12\9e\e\9c\bÞ\e|\18=×Ó¤    Káÿ\ 6\80\1eÈ\99\1a\ 3òAOü1¦D5\13`Æí\ 2ðÞü\13©ø3\e\8eÊ=4\98UͲ÷.­\b\17\86\a÷\1eN\9c\15mB>¯¬÷\8bÛ\9aÆ0ï\18tà¹Û±µ\ e6\9cÌGë©Àdô«#`zõ³ii\v
+Jm6êÃÙYê³¼
+´¦W\8d4"Û\7f¨Ï]ÃWÕ\11æý\86$\8ff\12©¡Éüãà\85\11¤        ð\ 2|}ûB÷õøVô÷\8d¿??WBmåÝ\1d\8f§æî#N÷ºÎ¢+Ð;Í?s¦)\95EcôôVÛB\9f߬=¿bëþ2rµeÕ\ eT5«D«wg\v)\9f\86SV\ 6jn°´â\83¦dmï¬\f)é¡\18®uS\86Êö\92ÂûAjèúïÍ\ f\0zÍõ@¾~\19'   oÌ\93Ø\94Ò\1d&\e×\17Á¼î!\83µï~\10­\9fç¯ke\8e.ºÇ\9d»\114wú3×3é\12\1eñ\13¿)a\84¤ÏÉ`¥)\90\92î\0£v\16Ýݪ7*\9d\95ì\17Ü\96Èõ\16/&õ|a~\12\ 6Ä\1c÷3ò\9cW+ÇE\81ûÜ\17\93O3X\14N5/\85û\e\92²Tí\83ü$Jtzþ\12`\1fëg6
+\7f3þ3^l/·3|?_^\8bÊÕÍ\91­÷¡ò\98äì\8e\9a»É¶½=å\91áúz\98\8cµÇøÀ©Ú\85\91VýAn¥@þy»DMÝ\99»µ±'_\8aôS
+r£¬T\1f¬+âòÒN§¾¥º9ßIÁ\86÷åjåô\ 3W
+\ 2ãø\e@®ÕJ¤\1e
+,À\8aÙ\15ÀÉ«\13ÏÖÝË\83\1a5\ fAõ>Úy\99·y:&uÀÃQö\ 5È2\a\8dt\91¬Qh\r\1ak_]wµg+\1eªäP\9c(\16\97\11\96\8c¯Ë\v\8c\1a¨òå\9e7¤`÷>\8aJßógZÛ\8f§ñ¦\88\99õ`\1aßÀf¦]£³Ø²&×\14§Ù\8bî\1dþE:`ÿïMÒ*Qé\16Ý\95\10W\ 1.=\9cgÌ5­;\eî\8cëÊ\8buwlvíC­ãÜv`é}Mf\96)l.R­¦/\ f\93\96ÚËoHeW-QË|Û\9a̧B{*WÁgñãA<Ûé³W\7fiO7oþ"\98!\1f       pÉÎñÌ\9aèò\ eÊi\825\9c»ÓA\1d½¤8¦8ü\86¤Ø\vä,u¸$\83¶µè¹y§ö©~zØÖEg\e3/»jÍ\8f\9eø2\1c53ð,ËVãí¹g!ëÆà^Tc«ÒXAC±³,`\8fþ|V\1f\8f¤û8Ë\8b+o-ÎH\96\99wÝà\1d\ 5=rG©\10²g¾\ 5±Ó¢ÛdÏV>5\10sÇ[éÀ\8fmÛKñóiÿ\e\92ú~C%eiÂ\ 3ìNª·\13 Æ\17-<2gZÚ²î\84¼Í\ eõæBß}®\9f\83\99_t\1e\9bZ\8bËjzÇHûi+J\8fªK¶Û"æ"²íJa©\9cÈ\1e\9c&Sc>\14\84\11RXðùe°f½ªíL|üà\8fïhð\19/nb}¼ø¨òD.[6;kRgÖ[\b\87\14ûÿAj N¯I±·\13©ÞRx5YY¼\86\93EïlÕ\9a\83Ó\89h\8f\8e3\9bf\1d\17ÖÈ0vÛ\19\1d\aúsÜ\0ê`.ç\96Ç¥Y\9a_\a¹ºô(LÛ³øvïM)t6\12ÐU\85ãø\93\9bÖÐl¥«¨ãû\93µ\98g x£÷c\13\8fÖjµ<ZkÄ\8cQ]Ú\1a/ãÒy\1cvZ\87qX©:¿\ 1äå\80\ 6\18n\b·\13{ízñ\15ï¸ùì»wð7Þϼ'q>Q;S0f\86+\ e·ë°g{Z\8f\87_ʤ\É.Ê\9a\88IOäZ\9d\81k³9¥³§.\7fl\f\87\i\1cO&sM\99\8e[8µ\1cÅ\87Æ\96þZ-\97\86ölDÙ\13\18,ähS¯¥\8bdG}êê\8e@\ 6>\8câ\108¿\ 1äý\98\8eÏÍ]RSÈ$q\86\a{â8=¨\1d'Bz\9d\9d©@m\93=UØÍ\r\8bÕd4Ä\1cVLå\18..µÏG&\ 6\8dtÒkö        Wø\14Ù~ª<\17,       ÖG\8a½I\93\8c¾`¹Ñ\0mÌiØÊ­©Ü¾q\1abfÿ98S×Â`\8a\1c&C\ e¿o¨Ü}u¢\1c鼧açêü\86\9fÖ³\83R¡eÃI\84\8a\84\ 5Ãú¾ù.4wfÑ®\9b\18ÇÔ6·\83Béº,Ê*|ÊYKáÁ]dÅ^?Å~'\97\9d¢W.Ç\17U¿ÈÖW£úX=Åm¦×5\aôN¥ÆÔ¤ÑH76\eâ>¦\ fÊni߯]ûaï.Ýò½eÝ\1d÷åÊ};(G+wà-ÏÇ\81Ç;ûß\90dÐÞ((ï\9b\r×Þ\r+\87Ú\14­í¾E¥bbÙ\q\93\9fý\ 5>Ò££"Ú\8b[z\1dG\97\9fud/\ e\ 6£`\9a\vÝ\17wåkÙÉ\83ÝçÇÝu¯<2£¸Içp¥;t\ fÌh Ò\8di\7fÞki½\16ÜrHm¬\84ÝØÍä\12|Çd\17»¯Éè(¥.#=¥k\1d\7fÃó5f{\97\8e¸«\1e§\18T¶ß\86R2Ù\fÀ6óPÊkÛO\eSÜ\­¶¬¨4%Gí²$\ eEc+\9c\82Â\89\93ÇÊ}¢vséæÀ\8cÑ^C#Dé`Ô©\86Ö\86åÙ¡Ó¿cóaï\89Ì\ 5RwÅUwë(v7\9b\ fî\1dZèç:ôj2éX^mÓÍf­Sw08\1fº\83¦ãü\86ÀC\9aéJ/\17\8dÑâ¾)Ù%\vm<ò\9b \1c£ÚvûI½ýTtÞª\8f0©¯O\9a3\a\92Ç\82°#\96\\83
+¬1\80¨3\ 3g@H³½ígxÑ{È`N\14\8a}"\8e\9bd¼ºô»ßuÀu!%L«Î\ eº\86ìöä;¼·\vî·Ðr§o®]ØYF» Á§öä\92;´'vfÿ\e¼õqR:H-·¸ËÞ2ùm%$amÛÜe\14\1e\efäh\19C3g`¦v\ 1Þg\95"w\9f\86ýÉ[°ùqv9WGy\ eÛQSÿu\19ÜKú£¿:\8d¿=RìäÈÁ¢SëÒ3\82ì\8cç\9dq\9b[M\96­é~½k\95Ù|HH\8fuÒ£y:\ 2!ÙÕ\r!iâ\81\90D1m=      \89a÷¿á\84ÕCÜ&/\8dÂöR'!½»°¾
+wÆ\81\1c\11ê{Æì*1w§@v\12ïÅÚ\98*\89ý\11KôYJ\1cäæ\83p\7f[÷5á|èõkVê   IBIÿ®\8b\82%ÔÁ²Ëb[\18\19DKd÷\14\11\9cß"Ñè´\8d¦²Y]\9b\ 67^ø\83lh¶©641Þ5´1zü\13ÎêÄb\ 6/\93é4\91®-V@9\9e³oYµ\87Ïéáí\86\Sb\1ec(ÚÂ#nÜhRר:\18<3¯I\9f\9c\1cEÒº.\94îØ\98\1a\1d\9c\19ìÛenpmIÞ8"\161\9fm>ûK¼ñ¦×Í\ 6é?éºÑ(§skõaFßÕvô+¨\8d*z¡\86Üæl\r9~W5\84'v  :öo0'í)´&n«x\95\v?/ùyé=¦\87ýæÆ®N°?Ú?Æ\1e%ã[l\10u^é\9aÂÞ\97¶zäÈ\9dÒÝ\82Îñm\11jÊ­ú\11Q\bâ\99ß6;qÖiô1Ä«\9bÓü½fËù¸\86\86u¤Zxõ*\15\81\ö*ÅÏS(\8bTM+Wáí9u\81Í\94\82C©W\9a³\e1\81\9böl~®ÿ\83uØÝÆ+&¼?å§V¹O\ fk%`Ûͳ7\9a¬Èó@±\8dcÒaFr$zò°NñÆ\97Z\81\13­L¡Õ\88\9d¸Wÿ\9eBªf\8bf2\14\hiϦâªs±R\8c\15¥\Í\88ëÒ\9cVvEe¢\9dñȽDx·\8c¡Xì\8bMl#\87#¬ßèÌ\vßÇÎ.\98*\1d'Ø¡¿A\85{ïç| \11\89Ä     \9bNá±mÜ9\8f
\9aÛ׸¢Õ\9d \9dSû2_\87D¸îEÍ.ô}Õ¿Ç˧fÏ,¨Ê6¦h¥ø&\våÊ·\8c\97\1a0R)¶rï:ÞÅ}\ 2ÛÌîdÁ\9c{T\ 1z<¹<ú~Ïsl¿\9c\80º\16wF\ 5ú\1a£Â\88ÄÐ\12ª\13Èåð¢\91Ë\11c\7fÃü^¬ßf¨Ì\ØvvëÒ§wþÔï6\vVû<\86UB©mö\8d\r\933ëÐùæTÙº\946k\95â\8b<\94\ 2\16\95Ñó\82w±õ\ 5ë\97g~\81ª\ foy¦U\7fä\ e\8dºFá\83
+Ãä\ 5.v\17Cª9ª
+7p¦\ 3)3\8dÉjs[Ì&am3ñstÊlÔÝ#\81ÿþA\12Ì¿7?\0P\81¯\ 1h²#\0\14#=\0W\ 6£\ 4\v!¹u\14\0\1dÀ\ e@\8bþ\r@\ 3\v\ 2P\11N\1e\86Ø!ÈFî\fd¯¨\96`¸K°ö@Öñî »GÒ\86 ¹\ eS\18\15\90= d\ 2=yþ\0\92ç\8fÝäùÛ&yþf^þ\vï¿8ÿ\8a\7ft®OD¢\ eOtθ\9föàÙV\0ðè±\ 2p5épA@\f\ 1t¼!\0Z6\1a\0\1aÎ)\0\11¡\b \16±\ 6Pi¶Opº\ 2¨\9c\8d\12t2       ä<\80\90Sòçh¹\9fÀ\91\0T­n\13\88Ç\ 4\97\9f\13Ê jxÿA¼\ 3Á-ÞÝÜ \1e-Ìëo\0P}\96üÛûÙJÔµ\13©Þ\8a\ 1ðó:\ 5ð\ 5KºN¶p\ 4°èF\0\1c\80óB\v@w÷ç0aÈ-.\0dN\8c\ 4{\17@Ê;    uU\8b\13ðɯ«Ô\8c>}7\ 14#\87       \1eK\0\89ý$\81Ä$\ e!\1d\8abt\eDo6»y¼\v»ùýå\8eØ[\8aà_$Áü{\93$¼Z\ap'\9bHõR?ç¦Ã\0d\98\99\ 1\84g7É'÷\f\90¤\18\ 1øÚ/\0X7;\0\1e\7fY\0÷\86I\84××v\82÷\15ÀXù\99`\92\ 1pFÍ'¸ÿ\9c\1e\agËÝ\ 4RÒì>_JlkÌá}8Î\93 ½y\14]\ 2æ\1dU\eÕÇó\96)\85Ϲ\ 5ßSÜ~\ 3\80üS\ 3À»Zû\1f\93\1f²½1?fé\1f\7fèüÁ\ 4È\17½\0Ä\1d~\0"hE\80´"\12 \b\91ä\8d·ú_\v\ eà\r\r\0<WÑØiìK1sö\1aqnúé½Ù\0\1f¿±9·x\95¦\96ý¼õ\8e×Ç#iA\1e\9a\96\9b0éJGa÷¾J2\82±¸ß·C.ø\r\0\e\0É\92\89Ôãq\0ÐZ.Ý#a³\0¨_´\ 1ºço\0\95í,@\vA\19 \99\ e\ 5\90óR\8a÷í}ZÙ¼O\ 5ãøÆ©]ð\9aêû÷«\»d#\89wóQ­\18W\9f\v&n=\9bù
+õx\18\93Yø²OÖ}ËùÞÍÒ²ÏÀ9fßÁxþ\89üSÆ\ f}ÎÚ\a>N¯¯ÿ\83$\98\9f+\80§\9fD*7m\ 3´úH¤^\19\16äZñ*ÝÂ#\19\ f\10ä:(\fÐ\98¨Å,6¢_\97:*D\ 1\f©Ïû-Ú=\9e»ËùÑ\ eÜ{¸Æ\ eñýC\1fáû`í\14nVè¤YàF\v\8fnàø\18\eäësýzN\ 4\93ë{Mû\12\9eÕª\19¸ïíÜs×\9cxv{8sü\rIá)':oz¢S\87û G\99<È=:é\91\87^º3,È7\93\f\98ÏNÐ÷´Q¬DóÏ¡ûxåØq¸\99U¥û0|é·\91\83   ¿:û<3½_½í4¾øê(ëÝç\9düù¹êUÏm\7fÒu×õ=\7f2Úeã¸\9b\8cOGäë\ 4\87\89²M\8f¤8\14(ÝÝ»¥ÕqÏ_§ÎoH²g»\ 1Ðî9Ýú¼;\ 4¹0JýeÓsänø\19ä\81ôz\97ã:ô|\8eµ|¸½aõ\9b³¶ú\ 1¦·'WqwO\a\1e^x\9e©g­G\18î¦\84îOf.¾\9c Aü8¢\9dK|\98Ìoðþt\ 6¥}±Ò"\9dÙü2·å]ÅÚ\85\1dÙÝ)\15ÃݵÐÝÁ\8a\ 2ÃI±û\rÿLE\8c\9b\0Õ\1e\89TE @>i\87@\ 1\92\12ÇÞû2 Ãg$\9cÞ!Ää²ÁÉ_\15¯rîÙ<¿±"é\ ej\aæèt©éá\98Å\16{7ά\9d\8b{ÝÙ\81ã\9cìú}\eì\88Ë*õ\1d´´ê\1e6cîY1{\97\ 1e\98\1aÐ\9dµ\r\1e¶öçbo\9d|hm\9dZlþ\86$á¥Dç\vî\82ÜפA>æåtsQ\13`\90îEÊþ\9eZ\aCÊ \82À}\98¯K¨=a×ø~ñã~IÕ\ fø\ 6ô\1ci¿\18ÙÍR\8dßµ>YÙêz¾fö7\86aP«e"ÂWým®°\8e\10¢kw_iê\17w?Ó¯Øb«K\18pt©      §#i]\1a`É7\uó\e\92b´%\92\12TíþÇà×Qç\89ʦñ¾véãc+Ìö7nt9^\9b\85jàZhù},|(h_Ù\K6Ñk6¬5sJ­êf2\80¤\rzCpÛ|)\167ØÇUÖSÂ5t)·Ùk\vÜôÕÇè\12«­c        _éÙÃh¥\ f׫\95n\92»\95îÒÛÕ»§ÿ@ÿ\r\0e\1câ\9f©\88\8fÁ¯°ó\96©s§\11=\1eOó¾Ï}7¾Ü\10ÌóàÈ\1d\8e\1c\9dÛ(úì´u\r1¿Ú¾l\8cv\9dææä^ºkO×(].öYm\ 1J¢º:\ 3e¥ï\1f\86²5oéØSɼÀ}I÷Hxá\98\8fîÂy\ 4ò\12áÔí\12Ùz\9bå¨\86¬\97#\12×~C\92AÏI\94\86b?É\9b\ 4\a°ì[\ 1Ø}a>É=¯Þ\8aÙùÂ\8bóÇô\88×Ó¤\93µöÒ§sÙ½3ÊË´\b?»=<\89ü¦øu+ú<ßmhÄìÕU;ý#­||n¢d]ZZ"zS]ä\97esÎ]HO\9eÞ¦o¹¼ÌWå²[\9dʳ^¬É^0\Ï\8b£\9f\837çÅ\99¡þ\ 6\80^\1e\ 4È\17\94Dêh"\0l\88(O}_\91î{í úõ5à\»[\93\ e\97ú~k?#ȵ\ 6~+4òÕ\ 5X_å\0Ö\eR¿ jê-\9dÈ_õ±ES\81ÖMr\89
+\b=?\ 1\8f\97½çn.ù\aU\17ïçÝA$\90çc¦²ÃüL]\8c\19\91\90XETàP\13Ã)º\92ê\ f\r \agZ ßÓz?Æ\14\95ç£Ö5d}¹Ðî\¢R³çmÆÍá  Ëxü¾þ\1aª»ÞÁÞ\e{ãqÝ̲ÍHoRòWÕù\n\95\99¯ð%³ÎW\16XÑ#æE ö¤@\9d\8cÅ\90íÌf\11M¨Ó¸G¤\95\8dðm\r¯\82ñ
+aa¸¿\ f\85ïî5\9fn\96sm\1a\7fìÕ¬;\ e\95ß\90\94\ròëC\12¥OU¸qô yy^\9eÄÙl\1a-×öNd\12³üØÖNP:¾1í\15cm\8bÚö¬ßýç]}ë#°Êv\8eÐrL·óóóÒ/ÊRN®I\r\95è\88-\16\1d&\9d²\90\13¾ww.@\97Ë\96Go_\8fc\89Ñ\87c[\93\1e\9fkH"ï䪪@]\84\95`\11\9bÔ3åçú?\0\9aHõ/ýè\ 1k\ 3_:Ý«ç/>ªºhÜk\1cÏ\8d\ eá<\14\94ÚeT[4Ø}u»\ e\8eÓ\93Öq\r\7f5äÑh9i\88ß¹×Ë"rMTS\93ªøÌv*3]þ\12Ó\ 1\ 4Ø\98\8fù\9cÈ\8a\1cÆ  :[\9a\89x\83Þ\93ê"j±¥=>eÏ«ë\8aã\ 6Ø\92;\1e»\8bß\0rf«\r
+åxpw\1atºHöò\14å\92kW\8aå£`ÆÕýMw«6ÙÝ\90¦s\10§\9bëò¦é-µl¯¾/þ¼<\8c.áüRnÅr\9d8eE\95\eæfd\f\95\84]I«ñc\83êp\9cÖ¥Ù2\9eã'5\14[\8d\9bX+\9dñ`VÓÍ\83iWæ\8d4w%¿ÉÛÕDz_\97\13¿ý\9aÿ\86¤¾g: 0+\f\83\97Î\9fg\ 1;\15¾Aq\7f\e+Eû]¤\8aÖ\ eï¶\f|U\9a¬\9b\8c\94n1¡n姩0\9f^2¼í+I\1dVÏE¢Ö]}¦ßY\ 5\11Fæ¡À\17jl\85õìjk"\ f2\83qÓ?O\98¶{]\8cÈ+°h£NÝèÁ£Q\19õr27z_ÛKFU\16\8b1Q?Î\7f\90ú@ý÷æ\aIq\12Ú¯\ 6Ìv¯wHÆÝÑþ\92?\88\8eXpÚD\17Ûeç·\9cÁ÷\8eµM=oQÚzÐ\16W\88°Ö\17ç\b\ 5Íx¢N<©\85Ó±\90«\87\19Îu\94\9fÍ\81«P£8\ eç¯:£\95ϽÑúk\8dé¡®KÔÈ8n)\94j\ 5Ã\ 3\ 2ãÔÈ#Æ4´Ì.h³Ö\9eÓ_\9d\93\7fCR\96æ­{\8eÎ\96¼u\13Í\1f]å'\18ç±läv\83Í\191NûAvS×ÛE½c\93äÊFÞÜ\92\97ø\95|?\,q]¯\9e¦»\9c\15ðǸüäÊ¥=\98Ü\f\16\1e·n\99Â\b\15Ú*l;\94ýZÐCÖX\88\ 37:n\ 6%\12K;PýËç\96\1f\94X\88\19b#\7f><\16k\v\93òo\0\ 5äB\ 6¥»\91Ħl¢\87ê¸\8fî>è\156ó>\99ÙÈÑí£ÅÏSN\851\9fXºîz4o@\85´\ 3%Æ+m3µK\19\9bw³Ò\99õÃÏmBä\97\11ó¶û\99ÑàñBiDvJÃSiE\f¼übØ\97liÚ»çÎ\9b^\93/yä³xC{Má;êݱ\9dÜ\97\8eÙyßÏáò¿Hßæ¿7O­y¬_\9eÕNá(\94\18ÄiC0bîÛtf\13@W\90¨¤ßÊq\9aý,KßziÞø\14{"ظÜÔ©w\97¼p<nÙù¦½\1fG¯ç\85é\17gwÚæ\8ao\8aE^é~6âyÄû\ 1¹ª÷BbÕ'£®3íÆÍ«Öíi\8ds·ç`¹no\rQݸ}\92ÉÎô)\93ª\97\95\8du<ÜÝ­7È~~Â`k\97Yd·3þ\91ºóèÝìàµÊ)§ÇüN\f\1fÒ{ÁÂâ V\1aÓüº5äË\1a\98M\9e\1dI\1d\93\1cY'ïHçsüuxÞÕ\9f\ 3©÷ýô\e¯k®×úÜj] \1dÉnfûà:T\84©m\87QÜö8ßOç\bÚNoHw`ù)uàyVîP\a\r×\85\8eÅk\17¶ÉÎ\r6ð;\0\8d_+ÆÜ\87\8bÚ\90¸\89ÆÊ\f\ 4\97\12_üe|.põ˵=éx\8bÔ.À\fÏM\91>äß*U\14wÖ Àgn\7fyèÜz\9diñMö&9¤;\14°Jg4Æ:í   ße[§\8b¢¶\8aÕ¯Û*\92Q®U,\9cèV1Ó\94[øã\1fHÿ\83$\98\9f«;\9ah\88³*f\92\9c)çÀzy\9b¾T¸~\7f,¤eç&~ÎÚE\10J¥ëä5s\82ñ\96½\ 1\86® ÅQî\81'\1dèÚ{<¸i'©¿jªZ¯\eó;r\90\99x]êÝ\v;Ì÷Ç\ 1¦ÍÁ\fÖ\9aæç-âÊ»c¢z-¬\9a\8b\9a|j.zr¾¹À\ 6tÒw\Í\9a\8dÕVn6¦+é7ì\83{\ e²è\15õÝÔ»\8b\97j®ß\8fÅ5é6ÿHL\9bµâåq\9a¼FSw4Þ#\1e53ÛÑPvfè\80àåZ/î®\aäw`p]\eUÓ­êÔmÛ-/\ f­K}é·*\8añ&êú\ 1m.?ßF#\12z£Fçº^Ôc¹|¨ozÏL}\83ÝÒE²õÞ®4­};Õyí[Áäß°Ûn¶Ù\8doë/õ»öïËÒ½\93¨´æÞ?\12»AÍ¡Oùµ=Pr²Û×óÍO¯\1f\r\v$¼íÕ:Ç\11\91úª·§\8d\92Úu\9eXô*óæÃ\1dn\93,Ús\1ad\8d÷ë[Ã\88k\96íæjô¸BT\9dûrRÍ\13Oµr\82\17\97Ê       Ñ+\15n\ eS\15®OÍ*\£?ý\rI0[\8f?¿µ\rò¼/\85\ fáKäCITÚ×ã\18Ìó6\8d\e¼ÙW϶NÒ\9e÷èæão¦í\9d¿ù\96\1f@Ub©D­fg\1cô\1a=þ2ª\ fµ\v\81p^=à\91V-̾V¥¸-¤\1e]e1Ûy\96\82\91\82\96êAÔ(\86\8bѸ¨\f\9e\ 5IW<ºNËx¤\83\ 1®ÕKìoÐ;ÓÏ]ÁÆ=_Zgæç\7f%R\1e?1{ë·\90®Åí°\ e¼j\ 5«IH(½Î«Ù\85+ßú÷\ 4Ãuè\92Áª\87ùµTqWÇzù²¶Z¥À\uK\r\8a­üj\82k¼%b\eÑQ\vßÛË.PDã\96·µE6Ï\90\99z\1eý\b£ÜÁ\88\95\1fgXs\7fͱt\ fþ\rÊá:ò¥wC9\v|tû\8fÊ\1912É錄j\97\9aS©©v,µþ=fv5{ú8VÙºåV\8a/éR®|¸[©\ 1\rR·k<:â/,>\7fâÂ׿\7f\vT=BòL+Àr\a=¬ ®\11\12¨@\15\87ÈÅ\19
+H5o¬áÀÅS\aÙ\ 5\80çS¤\b7Êã\ e\14úÇÉo\90W\9bM\9a6\82\v]\ fcÀfwÔlÈ[¤Ù£Ô\96¸\e\88õíx\92ô\81üæª"\10\14l'\8b¢2"V¸Æ¢*Ö/\ 5z\ 1ºkë<\1a±\9b\\ 1t\rT\18t\1dä²k\1d\11qD]à9Û½Aá\99JÝ®³\91Og2\e\85Ìeú­m#Óo\97F    6ËL¿St\12,o       \9e\9fß\0²D\8c\83¬[/\ 1¨.×\ 1ÔÛµ\92O~\1fdÃ÷\18dWå9ÈÒÓ\9fíÛ³Èñ\ 22é&O\99\83\84\83ÌæÖ\ 6\99mc\94@\9c&8( ³\886 ³¬8  &^\82ý\13d\94\ 2\ 42æ¾\ 12\16>L0\15\12\1c\97  \1e\9c\81ö/Ò`þùú\17d\ 5\b\aPaX\ 6Ðd\99Ú|ý6\80äÏ\0@}|\ 2 \8cS@ölí@VÍ\ 4 ;¢3 [±J [ÅH\90Í1ÉÛäL)Aü\13L6_·\12L\8e   v\ 1È|\9e/\90-\fÑ\ 4w\ 2\ 1\93ÀJ\9eÇ3z\82ª\11\92\11Ó*¼ý\ f¦`ý\e@Ö,`\89ÄYåÇrûc L½¦¡\18\ 6c\1e@\87£\ 6 .s\0\1f\ 2\85\ 3U\90µûIÄk\1a\97 Z\80¬^ß&à÷ +©ç\ 4þ\1dde<I4yVHðn\81ì\úÙê8»\ 1«x7h\98ïý\b³ßùýÃz\9d&gãÅ\17¬í?ÀÝÕæ\7f\0²ßz"u¯\96\ 1\öë\0\9e\95ÿã\87\f«g\11ÀLn\ 3à*å\ 2è¦ý¬÷\84¶¯\1c\80øVjA×èÔ\82>\ 3\9e¼Mib%0\92GKÏ\e\80Êå\18\bN°K²\16\8awc4\19\9c¼\vm}õ*ö¶FT¡tç);cëY\1f\93æ³.Ñæ#¬µÓ­'Óëö\7f\90\bOTî\13©;$\91úl·\ 1\82oi\80\10Ø\1c EÖ\0ðeã\ 1X\8bc\0\8f»ÉÃ5%\89õO0\ 6PX\94\13Ì\8cØ\16ÔCÌ\94öi³\16£\8e\17¾Ù¼\1f¿\v.\ 4¿\\81\8a×I+\12k>÷¬GÏå\83ød\8d°\ve\9dûfv·ïýÊɺ}ã½y37ëíoH\12|Y\ 4ðêYIÔÕêÿØÓ\16\9dÔ\v9u\98\16\96É'w\a\10\13ò\ 1Bu¾\0\81ç%\0_/äûÈ\1fƯ3c\8b¯ÒÖÕ"ñé\9aQu\16\1e\9fó ò\1f\ f,\f\93&\ 4ý<Z£F.Ô\ e\ e0{x3ý8\1dx\ 4N¦¸ñ\8fHÅö1\19µ®Â'2.ס­_$HS\7fC\12\9bF\11 Y$\91ºM·\86NÝ&Q\89âÓS\ 4U\80®\8bNº%Ê\r \ 5%óÆ?­Ô\1f\99\ã¹Ì\80Ácå?ØP7\8fÒ\1d¼ÎÚ}P;[7\8b?\1en°}¼\ 6ãÜõ\19ä¶\9f\8cÏAeüzf¸Î¥êm\85ócsVÜ×ùµ=\81·£\9f¶{K=e\vÓÅÑ
+¹ù\ fRßÁÿÞü \89P/\91Ê¥{\82ç\16ÿ\8f±{oW\rj\e\ 5þY\90è £J\89r*")"ÒAG:\8a|ÿÍ\Ïû®gÏkíëÚÿüÌæ\9a-wNc\8cÛm\94\86º-R1ÒÞHÙ\1cÈË\18\19\8ew\91\90v°Â\1a
+\85¯V°\84\1eä®W¾C\18Ü
+v+\9fò\ f\93\9dp=÷uåâw&\8bóìAdE}§\17ÖÚ\9c:
+y:.\ fôýð-O¾\a\97¼¡Ö ÷\9c1\9eìF·\9d¾=Sîb;)Ù³måeN7¾>\953&¿\88sÏW\1a§×Kã\94·Í\18\19\b\83\9f|Ú1\92c´86#ïdïÞ3ù}xv£Áõ\9eSâOPìjðµ\1aAåsëj4\8e\11\1eì[qx\80ÀÜÈ\83?¡²ç\eÏÅî0\8f\9d\a¼í¤\80\ 4\e_ì~7õëºêâ\ f,ëÜ®uÑP\9c(wÔ\1cóº\9f:fx\91\1d\11ÿE\fã`9Î×\94Ú\9f¼\ frLOhTh¤qZ¦\19Ö\1fyëñu\aö-=&wW\1fI\aÃá\91ÿ\99\1c\18H/M\1ek-
+ûb\85ªíÊI¥³­^¾Ô¦áÝyW{\9d'k=p5'j\1e,\87\94ü½m\aðÝ\86\8a$´b¤O×Úç¥\91ÅGÏ©U\bBÙ*Ä\80\941úKº\9a¿/Ò3¨\92\86*/ÓPÅ&\91\8e©\1f\6'¢ü¹\0üü\19uUíÆ\1f·Úuz©['²Ao½\1dn]vg öÞÖÑ\ 3à>å1º^\82Õ\8acù    n;Ç\aiCá%»·¶Êß7¢%\9473ó(\a+³ìE\87¥\&B#\90ßu£ñ\1d\ f\8cf\ 3\9d\18M¾#éÏ\ 6\9fd\8fÿ\171|ëaqþâÕcä!\921ºÏóÙSçÙ\88àýP\ 2é¾YÜ\ 4¿V¯\8c\ e¯z|ìX»j\1fÙoZè2X\9bHéí\80\9d#¸Ú:\ 2byJ\133Oã"¾¼\12awYSCÆhJ7Q\9fï\9eÚÂp\9eö<\86k\97¹µ;åæ@Síþ¤Tg\840ïÇúxN!6?Ow\ fû/ÒÓh\88ÅHùÙ\88ÑÆ\9c\8c\vù*\1f\eî\99¶¦l >êä¹\e\ 1ÑÞÒ®FÔæî{»Z;       [Êz6v\1e\9e\ 6Ö¸]\ eM)~\ 2Ëúd\917pAªè\9dN\ f\1aõÞ\9cÊÁ\8c¶î¡ÒlKWô\19b\f\10\9fBµxØâê\88·Xu4}óê!]uÆP=T[Ì_²\94\8cóì¬\1a#ã¸\1e£S\87|k_¬\e\1cï6v\9d!$vyz|ý\bc\ fb_ADnÓ~\§k \85\9b«ýÚÜZe§|^N=çf´\bö³ø\9cP`þ]¾Ð9¨\1d*\1aÌêÙã
+3\94\9aöÕ\121á§\95ædª(\92mË·\0\räÙ
+¬È÷ZH+õ­È)SÌb\94i{3P¦\83ãoâ¼±Lãtrõè0uz7¡>A®j\@Oñg\93M\ e|\ 2I§è\95l¡¹Å]d°^]g\92ÍU?º\85M        {Ùìî÷ºÁt/\vò\18>æPoù\99íÞ\f¨\1e¼\ 6:=ëPUñ§Q[¾\8bïÁäŽÅIçX]J&¦\9dÅï\94.H&ÃeOHJ\9f7ÀN\bº6\9cè\87\ 1ý/Òct\9b\9eK\ f¤öÖVÛ\9a\7fy\97sç^ÅÈ\1d\87N?w@¯íünÊ檮ɧ½VØÆ\ 5ë\f\98³åL\84L}Y\12²Ìí\ 2\a\8dåf×Yá\8d\89íc%èì!ùÑ°J\93wNnH\9f¯H¦í\90,\88`lhc\86Jvã<\14äÆîãK\88\90°bD:¸\ e\vPbb\14é_ü\:!¯\9a\1e£íÆ\9d¹jùkÓº\80Çõ£\rx\a%\a\alô碸\86ÚT{5\9e¼\18³î\93²þénô\ 5\98¯Ù\1a\87mwê©\85\9f¦òþ\15\8eþ\9a¼\1fL"EÛf^Ll,ë§\89\90Q$ÆùY\91\19\15&5E\18\asW(Ïè¯pä´Ö¨ðé\rGûõb0F\8a\1eõ/b¤uMã\9c\8a­à8®Bçî\87\8c\ fÜ;ù¦!:ß­\16±Y2e\9d\98õ¼½çJM«jÙ´¡\1fóã\85=\92g\1a÷¸-Õ3*m¦õê×\93\9fkû2Y6è\87ÔßB¡8XŹ1B\9cJ£bÓk      XÅ£ùZá*qªTK\9bîÊûÍ\ 5ïr\83\97\8f`ÖÞð×\ 6N\vâG¡2ú¿HÏ¥+\16N»×\9a/O"ð\ 4\16ª±W\8a÷ÑöA\b\91k\89ñÛaÇwh\85á\87êr.Ñ=\9d|\aü<Ï´\95Y\19ÛêÓ\ 6\84gý4Y/î¶\93\9eÉ\9f$\10+\ 4ã­\17¼G#ÂH\ 4©9+ðJEip³\82Òg\17¹Å\98    ¹ÐdºGùÆ\84ê¥Æ.X\97âpèKq3±Bþ\8b\18±\9fÙ7Æ<hÑÎ_\9eM39ìÊQ´\v@9Üt\8bÅ÷:×[=VbÌÅfs\9fU{ó\85Î|s3\98\99Ø\a¤©Z\9fÍe=ú\9aRRÑ\ÑuZÞ\98¯½¯£ÒÙyò~\9f\8d¸Ù§\93g\17\ f<;\ 4\98å\15ï\ eW\87\1e?\ 4Ë+}°¾öý!ØQ+C\edH¦·rû\8c\89ÜIæÃ~\7f\13#I±vÛ×éÜ)Þ\11éÖ¼Yá¶\15´ßk'¼>íâ¥\13\98\9bõ¡\8då:\8f,\86ô¥©\15_,5½\r®#9l\rÕ  \0\9cu\91m0öè¨@;A\ 67'¾¡²\ 1û®ÔB&*\94 ¡m|Ê\ 3wöiÑ;£ÄÒh<Ò¨\83\8d\9ch4i\97èݾÜ\e0Ì$ûîÕ\81{¶{ÿ"\1a\1dk\8d\0\83
\11n½?»éY\f]k\r¼lo,Ý­zÿu5zÇÉm1üª\806\8a\85\8a\10BþÔ\17ì\ 4\88aID|m6\92°\96ù\93\87^½]n\1eÈ\1eÛ\95ÚW¦Ïc¯!ô~&ô~v.PÇ\89\8f\eÊô«/jF\ 6z|ìWC¬Ø¿Ì£.U~¶HêhM\7fèýâI6|äòìo²D\977®í?\9b·ÕL÷ùòú²®q)0>Óñi¾»=\8e³KþýV\e\93\A\8e°ms\ 2A\14%¢Ï×hT9ò
+¯¡ù\ 5û!,\8bY=ÙÍp8­\9d\ 6\9c\88<èb|\8dúW}\97'o\96\9fuÕÉæ\v\1eô\16ÄpÚkÇ\80×k\7f\8b\85Þ¢wé\90ÍO«OÎ:tï_ÜóÊ\18>\ 1I!ú³5ûëb¸:]\86÷¥^±/\vF\8e<5Øw7ÊûÓÏêläþ\80\ 3$\96ÆËc±ÿé\bÁÔ\1cro¥1fÉóCe Á2\ 6{\98]ÓãyqOM\96HÐoàá\87lU_p\8f(~ë]²Z¡        [U\14\82Æ\8b{\82.c\ba\8f\1f\1dâë\94Én/ie\rA¶ìþ¯1 ä\1dØãgc¨íÐA©\ 1/_§Eâ4»èêNénO\8eÄu\17\a±\ 4n_£ëÞÏóÏ\9d^ãz9ºË¬é<;D¬½D\9f:rvo\8d\92\1f]³¯^k\e²­eÏ\bÊÀ«Û\1f\81 1\98\1dV¥È\ eÒ<ÉíýKص\ 5y\80´÷[¨ÓArt¿\93\ f\89î¿8Qd#Þ5t!\\ fÂ0;o,åV¹éß\84?k"¾÷\94p\b¸\12'w,A#M\8b×Å×\89#\e\82a\19\1dòxÔ\18\94¢\80¤ü\85Ãõ5R\95ÉNØ\9d÷z߶ݥÞ5\8f\18ÆÍ[\87\93ö(âÊ­s\7f\9dm´VÅE$Üg6\eÜg\ 3\14÷ëd\e÷Ñq\ f¿~\19â_¤\97ÎÍǵ\9e\92\fên||û:\17\90ä8]\0Íí\ 4\9cQ\ 3Þ-Y§×X\ e\8bÕ(K¦\fÄ\19q¥e}ò¥\9a}¹Ðo\ fçÍ^\\10É\1e\90c¹n\ e\1dÈ\ 4R\1e\18\9dbm°ic8{iÉ\13õ\83«ê¶Ð|¼r\9dæÜ5¤f\9b%¶Ív\8fD\1aïû®ÝxÛç^Ãh\99Ä\ fYJõ\7f_ü°mçÙ\8fíÙËçòµ~\ 5\8bü²|R\9b\96°\9f\fµÕz4\95î&ëp\85ù\0SÕ9\19&È¢gcM§\a.­ ;ü¾\13b7ÀÊ\9d\ 3WÃ;¥û\80jWÞ\83ì\81²Ö´+ª¸FÉVóå:\87Æg\7f|6H\1cË׿/£]§\89dT\87\90\9d[\a¿ç|Í\15ÑfÍmwÈÚp\v\12ÿÂÙ*··©\15¿Áb\83\11gU\rÄ\9fÇ|\86öÖ\1dM\17\1f\8bu\96-\9d¾
\94\Þo
\8f$µ#\8e±mûr\19øíZ×\8a[Mj\8bàíÉ©Ò4\82\11ã\0Ý\0\18dT\1fìkjm[\1c¬jÈÂ:U\85ÏûS-î\85rE*^²Kg\ 5;3*v5¨\evåJ\18\8f:\98\88\7faÕW¥\9bNÏéó¬Æ\18\9e\fÖo\9bÑÔ\ 5W¬³%\r:mrÕ\9e]^\88\9dñâ÷ðêÖÂ\171\92U?4ÍR-hØÕfØ\0-\ eªÃk®XCýQ­:n(íÊd0£0\7f»ä°Fý:-ksÀ,½s\83S\89à\9cO1j´+ErnQ\85dH/
+N¾÷.ØÑ\a+Ø^½] )ô\ féjþ¾Ð\93Âä2»¼ö\a\99Râí(\0K6;P\b\83®7ÅY\ f¼,¤öÄ?pÍn¯<hÐë¥]Ïû\9eW+<Öçj9\ß+ro\ef3\rÄå9«C%c4E\8bÑYÏ&9-$\81Ö,\f\9af\17e;6\83ìÍ\97\82\14\81ú*\7fL;ºy\91©C)§\16|ñÚ#ørÈoR^     |9BÐ/4qô8Ê«\1d°\1dW)Üa\aKzI×\ 5#K\10wÝÍrÒR\v:Ûè\8f\1eTõÀB\åbhSL¥Æ\8bò\9c¡\97%Ch­\8a\96T^\17\ 6õ÷\ 6e[\97=²7.'¤\10_ü¼H=^ðÅ\8d\12¸\86 HN\1d5«Ð|2è\82ïÀ\19\81]<\9fÕr\0ÑK;\ 3\96\ 1~\81~w\8c\ 1ý\1eL§ÔÙ_(½\ e\eOf\1d\87u±I×­½Þe\8c\95Üj\16\¾>8\1f)ìº}¶Ëóá\9e/u\výa!¹"\fº\99\9ft·¾\15òGk6Êc\80$Âòp$ç\82\1d§B\8fco\ e¾¯u\ 3\88î¥\15ÐoÕ·)3?%\8c\81ôrQLyv\81~G\96\81>\91_§LÓ\7fíB@J\ 1úKöi²e\f\\8c\\f¶.ù\18\1cGh\f\8aùr\f¶«õ\18Ø\16Z1ÐkÑ1\80ê\93(¹¿Ì(q:Ç(\11\17¯\94o.J$ª\92²ìDÉðDE        \93ãSºr\8a:O9f%\8a\96\ f)ú;J\94F1EÃS^éßOKÜÿ/1\b9i\9cã\0\8eÁc>\8dóXMã\9c·j1\88\11í\9f\ 4q¨³1°ô§1ÀWV1ÐPÎQ\92\?1\0àHÊ¢\1e\13\11%/\84\8eST5å¸\8c\927\94îú7\93¾ã}\b£$dÊ1\90ó\89\18\80ëé\7f
+KR4à;Y­z\94+TF\7fùl\8e°ð\8btkn \18<Dp\f\15ªh\f5ÈR\f&L\1aêÃ%cÐù\8ebp\88Ïc\10\96Ü\18ðO~\fì±8\ 6\18\ 3ê©ùóifE*eÀ§\18rJ°\88\ 1­`§Ðû\14;\88\819üM±k1°(QQάó\1fä\88\11\ 6Kañò\11ß'Ù\1fÿ?ùI\10Û\8f\\1a`9\1fCS2\rÕ\1c\97RìF\fY0\15C\ 2%ÅPqaÄàó¹\8fA½x\8bÁ\89\ 2Æ qÂb°\8b\11)"\13\83µtt\0¦£Æ\18¬\97Í\14f\93\92\95x×?Yj(Z?ZÐg\eNj¡÷uÉ·t9ð/åv\96\9f\9c<g¯©ôÄu^|¼\brô/bð\9b¤q\9aD>ÎÁÓÂ\9f\14e\8e\81[)£¬\0}ýó\9c4\14ÅV\f­\9a\87\18\1a©ï\18¯éç*cY\rºØ\8fÒ\ 3\93\893ùðÔFû é\8e\ fÇÄe\1d\96¢äð>¯ªÁ»
+ÒÑËw7\85§&DÄ\83 òì\9dì\97'7ÛI&7zðȦf   Üë~\9c1
+\18Å\12~\11C|9\97Fɧ¡J&\1açN/,\86K£nÊ\89\8fa¨8\8bs\9b¾\13çdã\12çjAôÙ»[8<ZÛÊû²Ø¶ßUßË\1eö{©\8d+ÿ|\88×ɳu½i\8fw:Pz\10GÀ½Gbít'¯\83ç-Q¶p°içÚ>ÿ-\ e¯b¹-^äZn|Vû'þôX/ØÓ|(\r3\ 6¿\88!\9füù\ 6æ\9c¤Á1\føh\f\8fðZ\f{[2\86ïE!\86\ f\82\16ÃÚÆýx±xx_÷Hð\9a\rsßgû~ÏßcyW¹÷½sç6pÝ~°\89\.@\9a®äï\9f¾æ\17+¾y\15§\9fíE\9e\7f³\82ËsðÁ?§¹£aÇ.çv\ f}íÎzkèÎy9Ö\1eî·5\93Þ³·i\7f\8fÌxò\17q®3N7éÓMã\14¾h\96ëmÄy\ 5¡âüR\14Ó\9fö\8bð\82´³+ôK\9bn\9d\87Éq\87;hTn\ 1wºG~\89L[\95\96ϳq·~Z°µÎ1ôÚ\83c\ f\87Uz\\1c\0«;÷\86\0kï·Cë¼çò\85ï®x\12ë[ì³!7
+\1f\fÝÛcC¹3ÇÉÊà\|0ïf\10¿\88s\v-\17Ãý\17\12Ãq§\94\95#â1\92kgiigüÁhVy¾?\vå>¨\83ZPØ\9böµ:mx§7²ñ\8f$Á¾\ fà      K<Øü\99W}Ï=ÀÊntyáÛsíÓÛ¦×\ef£¸\9f±{Gà\99\8b\8f:ÎúUZ\aÎ\a© NoµjÛv)¤mP?õlнuW.ãµWîäú\9btkÚi\9c\1e\8aþ\94Ä˳J\8c`¹vVÚKG#Ìà_\9dâ\92¹ç.wÖ\97ò\8cxnÛ\8ez\ 4J\98éå\1fëíîÈI\97íä\8d?7S\ f\8e]m\1dÁkÝ\fJÎçq©;$v!l\9b\v\ 6vz\15\14WL.\9f5ÒÖ\8e£·\16zøÄæ¸=­.Ï×Owyþ Ýåd\a·\97\13¿ÔZV§`ó\171Ü<§!"õtÇ¿·Õ4Äf'F\vÎà}/Ýzw\17=·ü\8a\94´NËû ë§\1dàâs´K\8fqus£^¦;Ï
+\9b»Cþl'\8fòÝ\86®P´bâ\10´\r
+endstream\rendobj\r6 0 obj\r[5 0 R]\rendobj\r31 0 obj\r<</CreationDate(D:20110801203457+02'00')/Creator(Adobe Illustrator CS5.1)/ModDate(D:20110801203457+02'00')/Producer(Adobe PDF library 9.90)/Title(FreeRDP_Logo_Icon)>>\rendobj\rxref\r
+0 32\r
+0000000000 65535 f\r
+0000000016 00000 n\r
+0000000144 00000 n\r
+0000051617 00000 n\r
+0000000000 00000 f\r
+0000056418 00000 n\r
+0001085563 00000 n\r
+0000051668 00000 n\r
+0000052034 00000 n\r
+0000446586 00000 n\r
+0000056717 00000 n\r
+0000056604 00000 n\r
+0000055034 00000 n\r
+0000055856 00000 n\r
+0000055904 00000 n\r
+0000056488 00000 n\r
+0000056519 00000 n\r
+0000056752 00000 n\r
+0000446659 00000 n\r
+0000447034 00000 n\r
+0000448097 00000 n\r
+0000463363 00000 n\r
+0000528952 00000 n\r
+0000560851 00000 n\r
+0000626440 00000 n\r
+0000692029 00000 n\r
+0000757618 00000 n\r
+0000823207 00000 n\r
+0000888796 00000 n\r
+0000954385 00000 n\r
+0001019974 00000 n\r
+0001085586 00000 n\r
+trailer\r
+<</Size 32/Root 1 0 R/Info 31 0 R/ID[<1C99B6A7589AA44786BEAA9557FF05C6><B8299FCBBADAB7409747FA1F2B3D40B0>]>>\r
+startxref\r
+1085769\r
+%%EOF\r
diff --git a/resources/FreeRDP_Logo_Icon.svg b/resources/FreeRDP_Logo_Icon.svg
new file mode 100644 (file)
index 0000000..eac8885
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="595.28px" height="841.89px" viewBox="0 0 595.28 841.89" enable-background="new 0 0 595.28 841.89" xml:space="preserve">\r
+<g>\r
+       <path fill="#073653" d="M105.786,546.861c0,0,1.827-5.113,14.604-4.562c8.618,0.371,28.295-13.676,31.201-13.348\r
+               c2.907,0.329,43.772,6.145,46.706,9.557c2.932,3.411,2.338,7.989-52.119,13.721c-4.834,0.508-11.943-2.013-11.943-2.013\r
+               s-1.745,0.939-7.113,1.207C74.139,554.073,105.885,548.295,105.786,546.861z"/>\r
+       <path fill="#6EB7C8" d="M131.679,264.512c0,0,4.999-3.887,7.219,0.555s9.994,16.656,12.214,20.542\r
+               c2.222,3.886,4.133,10.363,2.222,17.211c-2.222,7.958-12.215,13.881-18.322,8.884S131.679,264.512,131.679,264.512z"/>\r
+       <path fill="#073653" d="M132.271,266.181c0,0,9.259,14.083,11.424,18.692c5.28,11.246,3.085,17.478,3.085,17.478l-7.328,4.213\r
+               h-11.391L132.271,266.181z"/>\r
+       <path fill="#285D77" d="M134.342,522.686c0,0,4.208,7.815,17.767,12.77c22.035,8.05,21.536,0.396,28.316-4.44\r
+               c16.667-11.893-7.761-41.455-17.754-41.455S134.342,522.686,134.342,522.686z"/>\r
+       <path fill="#6EB7C8" d="M196.919,482.777c0,0-7.052-12.532,3.692-22.829c9.35-8.962,22.908-7.978,28.134-5.807\r
+               c6.39,2.657-11.644-2.791-4.631,10.987c2.955,5.807,6.27,12.232,6.293,17.396c0.029,5.924-5.368,13.694-14.569,15.172\r
+               C197.273,500.676,196.919,482.777,196.919,482.777z"/>\r
+       <path fill="#4B8CA1" d="M148.975,406.278c28.991,52.56,32.934,52.786,48.212,69.068c18.391,19.604,22.216,31.234,17.199,48.039\r
+               c-2.504,8.393-13.371,19.722-22.056,21.23c-3.638,0.632-8.318,1.739-13.16,1.729c-3.735-0.006-7.771-1.894-10.846-4.232\r
+               c-13.879-10.548-0.704-20.399-0.704-20.399c3.883-1.98,6.795-3.271,14.585-1.809c7.278,1.371-11.391-1.107-17.215-13.879\r
+               C159.148,493.205,144.311,397.822,148.975,406.278z"/>\r
+       <path fill="#4B8CA1" d="M92.815,326.14c0,0-2.032-27.629,2.774-42.801c5.553-17.531,28.518-52.341,41.088-53.805\r
+               c9.115-1.062,6.79,8.181,2.562,17.416c-4.228,9.234-7.179,29.775-4.026,51.798C138.897,324.474,92.815,326.14,92.815,326.14z"/>\r
+       <path fill="#6EB7C8" d="M93.163,382.517c9.9,16.638,21.397,25.797,16.211,45.291c-7.791,29.277-12.932,39.544-11.874,55.064\r
+               c0.756,11.085,3.861,29.47,13.082,46.104c3.605,6.503,6.292,11.589,9.814,14.446c2.67,2.166,14.007,2.285,17.808,0.987\r
+               c15.952-5.441,36.358-58.249,28.475-85.761c-8.789-30.665-16.681-37.124-8.19-51.713c14.275-24.534,23.86-32.658,17.444-69.781\r
+               c-11.496-66.536-107.091-36.166-91.445,24.704C85.137,364.384,88.557,374.773,93.163,382.517z"/>\r
+       <g>\r
+               <circle fill="#073653" cx="120.076" cy="346.688" r="17.013"/>\r
+               <circle fill="#FFFFFF" cx="119.767" cy="347.828" r="13.408"/>\r
+               <circle fill="#073653" cx="124.496" cy="343.702" r="6.325"/>\r
+       </g>\r
+       <path fill="#073653" d="M154.07,356.167c0,0,4.619-6.97,17.013-4.983c3.049,0.488,0.928,4.058,0.928,4.058l-6.606,7.113\r
+               c0,0-0.638,1.645-2.238,0.213c-1.11-0.993-7.495-2.358-8.759-3.453C153.146,358.021,154.07,356.167,154.07,356.167z"/>\r
+       <path fill="#073653" d="M163.698,363.061v5.182l-0.464,3.515l-4.442,7.218l-1.943,2.591c0,0-1.296,2.592,1.109,1.019\r
+               c2.407-1.573,3.517-4.534,3.517-4.534l2.499-3.609c0,0,1.666-1.666,1.758-3.608c0.093-1.943-0.092-2.684-0.369-4.811\r
+               c-0.279-2.129-0.187-3.518-0.649-3.703C164.252,362.136,163.698,363.061,163.698,363.061z"/>\r
+       <path fill="#073653" d="M166.077,326.123c0,0-0.223,2.203,1.22,3.51c1.441,1.306,6.88,1.194,7.061,0.293\r
+               c0.181-0.901-0.496-4.686-2.298-4.867c-1.802-0.18-4.77-0.08-5.271,0C166.447,325.114,166.064,325.272,166.077,326.123z"/>\r
+       <path fill="#FFFAEA" d="M127.308,336.987c0.864,1.3,0.555,3.025-0.691,3.855c-1.243,0.828-2.955,0.447-3.82-0.854\r
+               c-0.866-1.3-0.558-3.026,0.689-3.855C124.729,335.305,126.441,335.687,127.308,336.987z"/>\r
+       <path fill="#FFFAEA" d="M170.385,352.685c0.055,0.84-1.571,1.633-3.635,1.772c-2.06,0.139-3.781-0.429-3.836-1.269\r
+               c-0.057-0.84,1.569-1.635,3.633-1.773C168.607,351.276,170.328,351.845,170.385,352.685z"/>\r
+       <path fill="#FFFFFF" d="M131.585,545.604c-13.488,7.125-13.458-47.938-10.577-53.402\r
+               C119.202,499.496,128.778,546.311,131.585,545.604C131.141,545.839,134.152,544.956,131.585,545.604z"/>\r
+</g>\r
+<g>\r
+       <path fill="#6EB7C8" d="M399.81,352.566c0,0,9.985-7.765,14.421,1.109c4.436,8.874,19.966,33.275,24.4,41.039\r
+               c4.44,7.764,8.257,20.702,4.44,34.384c-4.44,15.9-24.405,27.731-36.603,17.748C394.265,436.863,399.81,352.566,399.81,352.566z"/>\r
+       <path fill="#073653" d="M400.991,355.899c0,0,18.497,28.135,22.824,37.343c10.547,22.466,6.163,34.917,6.163,34.917l-14.64,8.417\r
+               h-22.755L400.991,355.899z"/>\r
+       <path fill="#4B8CA1" d="M322.172,475.686c0,0-4.061-55.198,5.539-85.509c11.095-35.023,56.975-104.564,82.084-107.489\r
+               c18.211-2.121,13.566,16.343,5.117,34.792c-8.443,18.447-14.342,59.483-8.043,103.481\r
+               C414.23,472.354,322.172,475.686,322.172,475.686z"/>\r
+       <path fill="#6EB7C8" d="M307.117,552.297h184.511c1.446-14.486,0.53-31.805-3.409-54.607\r
+               c-22.964-132.923-213.941-72.252-182.685,49.352C305.814,548.13,306.353,549.954,307.117,552.297z"/>\r
+       <g>\r
+               <path fill="#073653" d="M410.617,516.731c0,18.771-15.217,33.986-33.985,33.986c-18.773,0-33.989-15.216-33.989-33.986\r
+                       s15.216-33.986,33.989-33.986C395.4,482.745,410.617,497.961,410.617,516.731z"/>\r
+               <path fill="#FFFFFF" d="M402.798,519.012c0,14.797-11.995,26.786-26.785,26.786c-14.795,0-26.785-11.989-26.785-26.786\r
+                       c0-14.794,11.99-26.787,26.785-26.787C390.803,492.225,402.798,504.218,402.798,519.012z"/>\r
+               <circle fill="#073653" cx="385.462" cy="510.769" r="12.635"/>\r
+       </g>\r
+       <path fill="#073653" d="M444.545,535.671c0,0,9.226-13.926,33.985-9.954c6.091,0.975,1.854,8.107,1.854,8.107l-13.198,14.207\r
+               c0,0-1.274,3.289-4.472,0.428c-2.218-1.983-14.973-4.712-17.497-6.898C442.697,539.374,444.545,535.671,444.545,535.671z"/>\r
+       <path fill="#073653" d="M468.529,475.648c0,0-0.441,4.401,2.437,7.013c2.88,2.608,13.743,2.385,14.108,0.584\r
+               c0.359-1.798-0.994-9.36-4.592-9.723c-3.603-0.359-9.532-0.159-10.532,0C469.27,473.635,468.503,473.949,468.529,475.648z"/>\r
+       <path fill="#FFFAEA" d="M391.079,497.354c1.723,2.599,1.109,6.043-1.38,7.7c-2.483,1.655-5.903,0.895-7.631-1.704\r
+               c-1.734-2.598-1.114-6.046,1.373-7.7C385.925,493.994,389.345,494.756,391.079,497.354z"/>\r
+       <path fill="#FFFAEA" d="M477.135,528.714c0.11,1.681-3.139,3.263-7.263,3.541c-4.111,0.279-7.553-0.857-7.662-2.535\r
+               c-0.115-1.679,3.134-3.266,7.256-3.542C473.585,525.899,477.021,527.035,477.135,528.714z"/>\r
+       <path fill="#073653" d="M466.782,552.297c-0.214-2.491-0.296-4.063-0.975-4.333c-0.923-0.368-2.032,1.479-2.032,1.479v2.854\r
+               H466.782z"/>\r
+</g>\r
+</svg>\r
diff --git a/resources/FreeRDP_OSX.icns b/resources/FreeRDP_OSX.icns
new file mode 100644 (file)
index 0000000..88bd44c
Binary files /dev/null and b/resources/FreeRDP_OSX.icns differ
diff --git a/resources/conv_to_ewm_prop.py b/resources/conv_to_ewm_prop.py
new file mode 100755 (executable)
index 0000000..292c0e3
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+
+# Copyright 2011 Anthony Tong <atong@trustedcs.com>
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+tool to preconvert an icon file to a x11 property as expected
+by ewm hints spec:
+width, length, [argb pixels]
+"""
+
+import PIL
+import PIL.Image
+
+import os
+import sys
+
+def usage():
+       print "convert_to_ewm_prop <infile> <outfile>"
+       return 1
+
+def main(argv):
+       if len(argv) != 3:
+               return usage()
+
+       im = PIL.Image.open(argv[1])
+       fp = open(argv[2], 'w')
+
+       var_name = os.path.basename(argv[2])
+       if var_name.endswith('.h'):
+               var_name = var_name[:-2]
+
+       fp.write("static unsigned long %s_prop [] = {\n" % var_name)
+       fp.write(" %d, %d\n" % im.size)
+
+       i = 0
+       for pixel in im.getdata():
+               r,g,b,a = pixel
+               pixel = b 
+               pixel |= g << 8
+               pixel |= r << 16
+               pixel |= a << 24
+               fp.write(" , %du" % pixel)
+
+               i += 1
+               if i % 8 == 0:
+                       fp.write("\n")
+
+       fp.write("};\n")
+
+if __name__ == '__main__':
+       sys.exit(main(sys.argv))
+
diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b6d6596
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP Servers
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Servers
+
+if(NOT WIN32)
+
+       # Build Test Server
+       add_subdirectory(test)
+
+       # Build X11 Server
+       find_suggested_package(X11)
+       if(WITH_X11)
+               add_subdirectory(X11)
+       endif()
+       
+endif()
diff --git a/server/X11/CMakeLists.txt b/server/X11/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7b33d86
--- /dev/null
@@ -0,0 +1,69 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP X11 Server cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include_directories(${X11_INCLUDE_DIRS})
+
+add_executable(xfreerdp-server
+       xf_peer.c
+       xf_event.c
+       xf_input.c
+       xf_encode.c
+       xfreerdp.c)
+
+find_suggested_package(XShm)
+if(WITH_XSHM)
+       add_definitions(-DWITH_XSHM)
+       include_directories(${XSHM_INCLUDE_DIRS})
+endif()
+
+find_suggested_package(Xext)
+if(WITH_XEXT)
+       add_definitions(-DWITH_XEXT)
+       include_directories(${XEXT_INCLUDE_DIRS})
+       target_link_libraries(xfreerdp-server ${XEXT_LIBRARIES})
+endif()
+
+find_suggested_package(Xdamage)
+if(WITH_XDAMAGE)
+        add_definitions(-DWITH_XDAMAGE)
+        include_directories(${XDAMAGE_INCLUDE_DIRS})
+        target_link_libraries(xfreerdp-server ${XDAMAGE_LIBRARIES})
+endif()
+
+find_suggested_package(Xfixes)
+if(WITH_XFIXES)
+        add_definitions(-DWITH_XFIXES)
+        include_directories(${XFIXES_INCLUDE_DIRS})
+        target_link_libraries(xfreerdp-server ${XFIXES_LIBRARIES})
+endif()
+
+find_suggested_package(XTest)
+if(WITH_XTEST)
+        add_definitions(-DWITH_XTEST)
+        include_directories(${XTEST_INCLUDE_DIRS})
+        target_link_libraries(xfreerdp-server ${XTEST_LIBRARIES})
+endif()
+
+target_link_libraries(xfreerdp-server freerdp-core)
+target_link_libraries(xfreerdp-server freerdp-codec)
+target_link_libraries(xfreerdp-server freerdp-utils)
+target_link_libraries(xfreerdp-server freerdp-gdi)
+target_link_libraries(xfreerdp-server freerdp-kbd)
+target_link_libraries(xfreerdp-server ${X11_LIBRARIES})
+
diff --git a/server/X11/rfx_test.pcap b/server/X11/rfx_test.pcap
new file mode 100644 (file)
index 0000000..768c396
Binary files /dev/null and b/server/X11/rfx_test.pcap differ
diff --git a/server/X11/server.crt b/server/X11/server.crt
new file mode 100644 (file)
index 0000000..7ce931c
--- /dev/null
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICyzCCAbOgAwIBAgIJANbqtAWwlQZuMA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV
+BAMTB0ZyZWVSRFAwHhcNMDkxMDI5MDA0MTQ5WhcNMDkxMTI4MDA0MTQ5WjASMRAw
+DgYDVQQDEwdGcmVlUkRQMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+q7mxFgRbS2FYJZX7BzpNd4T/n4nEVDBY6YaObLjGpaB1TptzXTcmfDrDslTGwcEY
+hTFAC4ZvY6yOURExqbph4LSgvkoa6J722RjVPfshGa4mlh2SXvTiaV26VPPxddGb
+o6fbs2u029lbtBlpIVbhx5RN9vstNkll26oSZ6wfEdBNHQJLd2SU4ItWHj8zjz1f
+eGxjgChHihUlwcBYKDJsKFkzHZmLrMgB37KsGlXi/WV+eEsjgvz4yP7I3TL8+GsN
+MjV8fRGVEKTbKSmgunO67d5u+IaqUQb0Ad1ha1jzDQ+a6hdymrulJSIhoOVfKkwi
+ptTe43FgwxVRIygJP9HjHQIDAQABoyQwIjATBgNVHSUEDDAKBggrBgEFBQcDATAL
+BgNVHQ8EBAMCBDAwDQYJKoZIhvcNAQEFBQADggEBAIOdEDhOX2kbl02znltd9hCr
+nV4kRPKm979RKwBNkrEuwYSlcsjAHg5MZ5itH3wFOUo2s5pjt7/vMOAg+6rOBbIa
+nqr22/gKBtOmuaJLG1yjxDC2vfez7f3B26pKgxa/krM8oxiFdT9n8QbdxdkN7/D9
+3RLU/aCfgrMzXxRus7eq3kR00jnSs6ggnAfE1E9gric3vFgr1wCzdcriRXmXDfUb
+hRq+4VG+ZWk16TwCofV5GVU39XWCv5HNO2swAdjkNXgI5e3tQbV3wWLZLqqYzBco
+iWulAXtoCGmE81+u1Ms7hLLzpXitLZSGPu1r+sDdkKPLCmOvkAaljDQ4nBz7fIA=
+-----END CERTIFICATE-----
diff --git a/server/X11/server.key b/server/X11/server.key
new file mode 100644 (file)
index 0000000..5c2f2c8
--- /dev/null
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAq7mxFgRbS2FYJZX7BzpNd4T/n4nEVDBY6YaObLjGpaB1Tptz
+XTcmfDrDslTGwcEYhTFAC4ZvY6yOURExqbph4LSgvkoa6J722RjVPfshGa4mlh2S
+XvTiaV26VPPxddGbo6fbs2u029lbtBlpIVbhx5RN9vstNkll26oSZ6wfEdBNHQJL
+d2SU4ItWHj8zjz1feGxjgChHihUlwcBYKDJsKFkzHZmLrMgB37KsGlXi/WV+eEsj
+gvz4yP7I3TL8+GsNMjV8fRGVEKTbKSmgunO67d5u+IaqUQb0Ad1ha1jzDQ+a6hdy
+mrulJSIhoOVfKkwiptTe43FgwxVRIygJP9HjHQIDAQABAoIBAAVv5K54xtc1JtBR
+1lfdPbSqDlnjx8aOnVIPg5TnqMp3sR8jBt0NsPc/+RA9ZOmfjoIxFAEJaZ9zSDJC
+5BqmnxC5R1mfCQkSd2haQ+4pdFvWyrv4Bblh8YU6hXrJGn0LfO0KlIcywtAvKpsi
+LtTyZkWmaW2HeF/+pO32jYygw38R1wd8Tl6GwjOXwTF6lFACJXOT4YAzcfp3FKSB
+AiKBIGuMzozoSND7KPFNRrhGhNumJpdS5A8Fb8D2c/ZMv6Cq5IbwOgTfKun+Bz+s
+mFbnzeb1uWRqQbsVXOBBW/zHfuG3SU5qeZsaAyuu4DTy+LE1oAHF9uhBSHuT5C6i
+vCJ8A8ECgYEA1iaOmiEJYBrs25iAc4SjCKqhY0mwR3wtu3I06vmgUoML5fhPMv36
+SvYQIqDyNw3p7TE6mZtw9+G+kK3PqhuJhogwSwg0a6o51RdKnhXH3/68oNWtKCLC
+1AmR8q/Gd3FwAR3b49CuOIZ9uOiJrc/ejzKdFEJTDR1/TX1frWfZznECgYEAzUiz
+XxFf7YrGel7JgmfRD2eZRYngOoteFlg5Tee42UjeAY2Pt2aiDLk+2TqQEdI9+Xg7
+LcFdBqcSNd8bh33xSzgNthIkX+lTDzx0SmKGfyxfFBJcY8nzsLvvnNt3YeuMeaJQ
+CPszwoZ0jcD46jTCjbrKhaLyEWmUkDp1O71NTW0CgYAXKF49Xpsz8FVyvcAOPeaf
+dkwzf3F3mX8ciRId4taqdY9g1AREgGCDoK5IAF2RBIkqZCtxFvUVaS0BWjpdq9Ko
+YKvQQVfh2KueVoF0LOjLWTGutsydzXyCD3Lf6pAstHCnPkJcFWHxrOGFkGfrCtKH
+a7K+0RlIDsuIZqllCBjukQKBgA31+MTpYJW+D1t5IMkumEgs6n6RLt+sZLyuSU9k
+B+03CGogn3qAj1rAKmcJlYywuKhDpfqpoNL3/8QMJUokpYlRCZWtTC39pzltCheY
+9b6mXNz3lrLupBUL4vLO9iKBq28GO90wgEelbz3ItuTuq6CJ6IYIG+BVRtY8M4bZ
+i+1NAoGANXZjYnJYDnh8Je9SDxDSc5byzK7ddkQoId64RCIfNHqNKH63P81vjgnH
+YBIPtagY75ZVVNxujCF7m8Rety+d8tEFwfQKDin2EVI7PD2rOJra385/izp7HuBR
+vqxvLzG9Xv3cNOU2l7PttVw4Pa2i5E37atKi3V3Zp2kMW+KaKPQ=
+-----END RSA PRIVATE KEY-----
diff --git a/server/X11/xf_encode.c b/server/X11/xf_encode.c
new file mode 100644 (file)
index 0000000..bfbdffa
--- /dev/null
@@ -0,0 +1,171 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 RemoteFX Encoder
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <freerdp/utils/sleep.h>
+
+#include "xf_encode.h"
+
+XImage* xf_snapshot(xfPeerContext* xfp, int x, int y, int width, int height)
+{
+       XImage* image;
+       xfInfo* xfi = xfp->info;
+
+       if (xfi->use_xshm)
+       {
+               pthread_mutex_lock(&(xfp->mutex));
+
+               XCopyArea(xfi->display, xfi->root_window, xfi->fb_pixmap,
+                               xfi->xdamage_gc, x, y, width, height, x, y);
+
+               XSync(xfi->display, False);
+
+               image = xfi->fb_image;
+
+               pthread_mutex_unlock(&(xfp->mutex));
+       }
+       else
+       {
+               pthread_mutex_lock(&(xfp->mutex));
+
+               image = XGetImage(xfi->display, xfi->root_window,
+                               x, y, width, height, AllPlanes, ZPixmap);
+
+               pthread_mutex_unlock(&(xfp->mutex));
+       }
+
+       return image;
+}
+
+void xf_xdamage_subtract_region(xfPeerContext* xfp, int x, int y, int width, int height)
+{
+       XRectangle region;
+       xfInfo* xfi = xfp->info;
+
+       region.x = x;
+       region.y = y;
+       region.width = width;
+       region.height = height;
+
+#ifdef WITH_XFIXES
+       pthread_mutex_lock(&(xfp->mutex));
+       XFixesSetRegion(xfi->display, xfi->xdamage_region, &region, 1);
+       XDamageSubtract(xfi->display, xfi->xdamage, xfi->xdamage_region, None);
+       pthread_mutex_unlock(&(xfp->mutex));
+#endif
+}
+
+void* xf_frame_rate_thread(void* param)
+{
+       xfInfo* xfi;
+       xfEvent* event;
+       xfPeerContext* xfp;
+       freerdp_peer* client;
+       uint32 wait_interval;
+
+       client = (freerdp_peer*) param;
+       xfp = (xfPeerContext*) client->context;
+       xfi = xfp->info;
+
+       wait_interval = 1000000 / xfp->fps;
+
+       while (1)
+       {
+               event = xf_event_new(XF_EVENT_TYPE_FRAME_TICK);
+               xf_event_push(xfp->event_queue, (xfEvent*) event);
+               freerdp_usleep(wait_interval);
+       }
+}
+
+void* xf_monitor_updates(void* param)
+{
+       int fds;
+       xfInfo* xfi;
+       XEvent xevent;
+       fd_set rfds_set;
+       int select_status;
+       int pending_events;
+       xfPeerContext* xfp;
+       freerdp_peer* client;
+       uint32 wait_interval;
+       struct timeval timeout;
+       int x, y, width, height;
+       XDamageNotifyEvent* notify;
+       xfEventRegion* event_region;
+
+       client = (freerdp_peer*) param;
+       xfp = (xfPeerContext*) client->context;
+       xfi = xfp->info;
+
+       fds = xfi->xfds;
+       wait_interval = (1000000 / 2500);
+       memset(&timeout, 0, sizeof(struct timeval));
+
+       pthread_create(&(xfp->frame_rate_thread), 0, xf_frame_rate_thread, (void*) client);
+
+       pthread_detach(pthread_self());
+
+       while (1)
+       {
+               FD_ZERO(&rfds_set);
+               FD_SET(fds, &rfds_set);
+
+               timeout.tv_sec = 0;
+               timeout.tv_usec = wait_interval;
+               select_status = select(fds + 1, &rfds_set, NULL, NULL, &timeout);
+
+               if (select_status == -1)
+               {
+                       printf("select failed\n");
+               }
+               else if (select_status == 0)
+               {
+                       //printf("select timeout\n");
+               }
+
+               pthread_mutex_lock(&(xfp->mutex));
+               pending_events = XPending(xfi->display);
+               pthread_mutex_unlock(&(xfp->mutex));
+
+               if (pending_events > 0)
+               {
+                       pthread_mutex_lock(&(xfp->mutex));
+                       memset(&xevent, 0, sizeof(xevent));
+                       XNextEvent(xfi->display, &xevent);
+                       pthread_mutex_unlock(&(xfp->mutex));
+
+                       if (xevent.type == xfi->xdamage_notify_event)
+                       {
+                               notify = (XDamageNotifyEvent*) &xevent;
+
+                               x = notify->area.x;
+                               y = notify->area.y;
+                               width = notify->area.width;
+                               height = notify->area.height;
+
+                               xf_xdamage_subtract_region(xfp, x, y, width, height);
+
+                               event_region = xf_event_region_new(x, y, width, height);
+                               xf_event_push(xfp->event_queue, (xfEvent*) event_region);
+                       }
+               }
+       }
+
+       return NULL;
+}
diff --git a/server/X11/xf_encode.h b/server/X11/xf_encode.h
new file mode 100644 (file)
index 0000000..82b68cf
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 RemoteFX Encoder
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_ENCODE_H
+#define __XF_ENCODE_H
+
+#include <pthread.h>
+#include "xfreerdp.h"
+
+#include "xf_peer.h"
+
+XImage* xf_snapshot(xfPeerContext* xfp, int x, int y, int width, int height);
+void xf_xdamage_subtract_region(xfPeerContext* xfp, int x, int y, int width, int height);
+void* xf_monitor_updates(void* param);
+
+#endif /* __XF_ENCODE_H */
diff --git a/server/X11/xf_event.c b/server/X11/xf_event.c
new file mode 100644 (file)
index 0000000..5dd84b1
--- /dev/null
@@ -0,0 +1,198 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Server Event Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <X11/Xlib.h>
+#include <freerdp/utils/memory.h>
+
+#include "xf_event.h"
+
+int xf_is_event_set(xfEventQueue* event_queue)
+{
+       fd_set rfds;
+       int num_set;
+       struct timeval time;
+
+       FD_ZERO(&rfds);
+       FD_SET(event_queue->pipe_fd[0], &rfds);
+       memset(&time, 0, sizeof(time));
+       num_set = select(event_queue->pipe_fd[0] + 1, &rfds, 0, 0, &time);
+
+       return (num_set == 1);
+}
+
+void xf_signal_event(xfEventQueue* event_queue)
+{
+       int length;
+
+       length = write(event_queue->pipe_fd[1], "sig", 4);
+
+       if (length != 4)
+               printf("xf_signal_event: error\n");
+}
+
+void xf_set_event(xfEventQueue* event_queue)
+{
+       int length;
+
+       length = write(event_queue->pipe_fd[1], "sig", 4);
+
+       if (length != 4)
+               printf("xf_set_event: error\n");
+}
+
+void xf_clear_event(xfEventQueue* event_queue)
+{
+       int length;
+
+       while (xf_is_event_set(event_queue))
+       {
+               length = read(event_queue->pipe_fd[0], &length, 4);
+
+               if (length != 4)
+                       printf("xf_clear_event: error\n");
+       }
+}
+
+void xf_event_push(xfEventQueue* event_queue, xfEvent* event)
+{
+       pthread_mutex_lock(&(event_queue->mutex));
+
+       if (event_queue->count >= event_queue->size)
+       {
+               event_queue->size *= 2;
+               event_queue->events = (xfEvent**) xrealloc((void*) event_queue->events, sizeof(xfEvent*) * event_queue->size);
+       }
+
+       event_queue->events[(event_queue->count)++] = event;
+
+       xf_set_event(event_queue);
+
+       pthread_mutex_unlock(&(event_queue->mutex));
+}
+
+xfEvent* xf_event_peek(xfEventQueue* event_queue)
+{
+       xfEvent* event;
+
+       pthread_mutex_lock(&(event_queue->mutex));
+
+       if (event_queue->count < 1)
+               event = NULL;
+       else
+               event = event_queue->events[0];
+
+       pthread_mutex_unlock(&(event_queue->mutex));
+
+       return event;
+}
+
+xfEvent* xf_event_pop(xfEventQueue* event_queue)
+{
+       xfEvent* event;
+
+       pthread_mutex_lock(&(event_queue->mutex));
+
+       if (event_queue->count < 1)
+               return NULL;
+
+       event = event_queue->events[0];
+       (event_queue->count)--;
+
+       memmove(&event_queue->events[0], &event_queue->events[1], event_queue->count * sizeof(void*));
+
+       pthread_mutex_unlock(&(event_queue->mutex));
+
+       return event;
+}
+
+xfEventRegion* xf_event_region_new(int x, int y, int width, int height)
+{
+       xfEventRegion* event_region = xnew(xfEventRegion);
+
+       if (event_region != NULL)
+       {
+               event_region->x = x;
+               event_region->y = y;
+               event_region->width = width;
+               event_region->height = height;
+       }
+
+       return event_region;
+}
+
+void xf_event_region_free(xfEventRegion* event_region)
+{
+       xfree(event_region);
+}
+
+xfEvent* xf_event_new(int type)
+{
+       xfEvent* event = xnew(xfEvent);
+       event->type = type;
+       return event;
+}
+
+void xf_event_free(xfEvent* event)
+{
+       xfree(event);
+}
+
+xfEventQueue* xf_event_queue_new()
+{
+       xfEventQueue* event_queue = xnew(xfEventQueue);
+
+       if (event_queue != NULL)
+       {
+               event_queue->pipe_fd[0] = -1;
+               event_queue->pipe_fd[1] = -1;
+
+               event_queue->size = 16;
+               event_queue->count = 0;
+               event_queue->events = (xfEvent**) xzalloc(sizeof(xfEvent*) * event_queue->size);
+
+               if (pipe(event_queue->pipe_fd) < 0)
+                       printf("xf_event_queue_new: pipe failed\n");
+
+               pthread_mutex_init(&(event_queue->mutex), NULL);
+       }
+
+       return event_queue;
+}
+
+void xf_event_queue_free(xfEventQueue* event_queue)
+{
+       if (event_queue->pipe_fd[0] != -1)
+       {
+               close(event_queue->pipe_fd[0]);
+               event_queue->pipe_fd[0] = -1;
+       }
+
+       if (event_queue->pipe_fd[1] != -1)
+       {
+               close(event_queue->pipe_fd[1]);
+               event_queue->pipe_fd[1] = -1;
+       }
+
+       pthread_mutex_destroy(&(event_queue->mutex));
+}
diff --git a/server/X11/xf_event.h b/server/X11/xf_event.h
new file mode 100644 (file)
index 0000000..aca8017
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Server Event Handling
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_EVENT_H
+#define __XF_EVENT_H
+
+typedef struct xf_event xfEvent;
+typedef struct xf_event_queue xfEventQueue;
+typedef struct xf_event_region xfEventRegion;
+
+#include <pthread.h>
+#include "xfreerdp.h"
+
+#include "xf_peer.h"
+
+enum xf_event_type
+{
+       XF_EVENT_TYPE_REGION,
+       XF_EVENT_TYPE_FRAME_TICK
+};
+
+struct xf_event
+{
+       int type;
+};
+
+struct xf_event_queue
+{
+       int size;
+       int count;
+       int pipe_fd[2];
+       xfEvent** events;
+       pthread_mutex_t mutex;
+};
+
+struct xf_event_region
+{
+       int type;
+
+       int x;
+       int y;
+       int width;
+       int height;
+};
+
+void xf_event_push(xfEventQueue* event_queue, xfEvent* event);
+xfEvent* xf_event_peek(xfEventQueue* event_queue);
+xfEvent* xf_event_pop(xfEventQueue* event_queue);
+
+xfEventRegion* xf_event_region_new(int x, int y, int width, int height);
+void xf_event_region_free(xfEventRegion* event_region);
+
+xfEvent* xf_event_new(int type);
+void xf_event_free(xfEvent* event);
+
+xfEventQueue* xf_event_queue_new();
+void xf_event_queue_free(xfEventQueue* event_queue);
+
+#endif /* __XF_EVENT_H */
diff --git a/server/X11/xf_input.c b/server/X11/xf_input.c
new file mode 100644 (file)
index 0000000..ad3938f
--- /dev/null
@@ -0,0 +1,125 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Server Input
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <X11/Xlib.h>
+#include <freerdp/kbd/kbd.h>
+
+#include "xf_input.h"
+
+void xf_input_synchronize_event(rdpInput* input, uint32 flags)
+{
+       printf("Client sent a synchronize event (flags:0x%X)\n", flags);
+}
+
+void xf_input_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       unsigned int keycode;
+       boolean extended = false;
+       xfPeerContext* xfp = (xfPeerContext*) input->context;
+       xfInfo* xfi = xfp->info;
+
+       if (flags & KBD_FLAGS_EXTENDED)
+               extended = true;
+
+       keycode = freerdp_kbd_get_keycode_by_scancode(code, extended);
+
+       if (keycode != 0)
+       {
+#ifdef WITH_XTEST
+               pthread_mutex_lock(&(xfp->mutex));
+
+               if (flags & KBD_FLAGS_DOWN)
+                       XTestFakeKeyEvent(xfi->display, keycode, True, 0);
+               else if (flags & KBD_FLAGS_RELEASE)
+                       XTestFakeKeyEvent(xfi->display, keycode, False, 0);
+
+               pthread_mutex_unlock(&(xfp->mutex));
+#endif
+       }
+}
+
+void xf_input_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       printf("Client sent a unicode keyboard event (flags:0x%X code:0x%X)\n", flags, code);
+}
+
+void xf_input_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       int button = 0;
+       boolean down = false;
+       xfPeerContext* xfp = (xfPeerContext*) input->context;
+       xfInfo* xfi = xfp->info;
+
+       pthread_mutex_lock(&(xfp->mutex));
+#ifdef WITH_XTEST
+
+       if (flags & PTR_FLAGS_WHEEL)
+       {
+               boolean negative = false;
+
+               if (flags & PTR_FLAGS_WHEEL_NEGATIVE)
+                       negative = true;
+
+               button = (negative) ? 5 : 4;
+
+               XTestFakeButtonEvent(xfi->display, button, True, 0);
+               XTestFakeButtonEvent(xfi->display, button, False, 0);
+       }
+       else
+       {
+               if (flags & PTR_FLAGS_MOVE)
+                       XTestFakeMotionEvent(xfi->display, 0, x, y, 0);
+
+               if (flags & PTR_FLAGS_BUTTON1)
+                       button = 1;
+               else if (flags & PTR_FLAGS_BUTTON2)
+                       button = 3;
+               else if (flags & PTR_FLAGS_BUTTON3)
+                       button = 2;
+
+               if (flags & PTR_FLAGS_DOWN)
+                       down = true;
+
+               if (button != 0)
+                       XTestFakeButtonEvent(xfi->display, button, down, 0);
+       }
+#endif
+       pthread_mutex_unlock(&(xfp->mutex));
+}
+
+void xf_input_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       xfPeerContext* xfp = (xfPeerContext*) input->context;
+       xfInfo* xfi = xfp->info;
+
+       pthread_mutex_lock(&(xfp->mutex));
+#ifdef WITH_XTEST
+       XTestFakeMotionEvent(xfi->display, 0, x, y, CurrentTime);
+#endif
+       pthread_mutex_unlock(&(xfp->mutex));
+}
+
+void xf_input_register_callbacks(rdpInput* input)
+{
+       input->SynchronizeEvent = xf_input_synchronize_event;
+       input->KeyboardEvent = xf_input_keyboard_event;
+       input->UnicodeKeyboardEvent = xf_input_unicode_keyboard_event;
+       input->MouseEvent = xf_input_mouse_event;
+       input->ExtendedMouseEvent = xf_input_extended_mouse_event;
+}
diff --git a/server/X11/xf_input.h b/server/X11/xf_input.h
new file mode 100644 (file)
index 0000000..34cda06
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Server Input
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_INPUT_H
+#define __XF_INPUT_H
+
+#include <pthread.h>
+
+#include "xfreerdp.h"
+
+void xf_input_synchronize_event(rdpInput* input, uint32 flags);
+void xf_input_keyboard_event(rdpInput* input, uint16 flags, uint16 code);
+void xf_input_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code);
+void xf_input_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+void xf_input_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y);
+void xf_input_register_callbacks(rdpInput* input);
+
+#endif /* __XF_INPUT_H */
diff --git a/server/X11/xf_peer.c b/server/X11/xf_peer.c
new file mode 100644 (file)
index 0000000..d80f0ca
--- /dev/null
@@ -0,0 +1,710 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Peer
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <sys/select.h>
+#include <freerdp/kbd/kbd.h>
+#include <freerdp/codec/color.h>
+#include <freerdp/utils/file.h>
+#include <freerdp/utils/sleep.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/thread.h>
+
+extern char* xf_pcap_file;
+extern boolean xf_pcap_dump_realtime;
+
+#include "xf_event.h"
+#include "xf_input.h"
+#include "xf_encode.h"
+
+#include "xf_peer.h"
+
+#ifdef WITH_XDAMAGE
+
+void xf_xdamage_init(xfInfo* xfi)
+{
+       Bool pixmaps;
+       int damage_event;
+       int damage_error;
+       int major, minor;
+       XGCValues values;
+
+       if (XShmQueryExtension(xfi->display) != False)
+       {
+               XShmQueryVersion(xfi->display, &major, &minor, &pixmaps);
+
+               if (pixmaps != True)
+               {
+                       printf("XShmQueryVersion failed\n");
+                       return;
+               }
+       }
+       else
+       {
+               printf("XShmQueryExtension failed\n");
+               return;
+       }
+
+       if (XDamageQueryExtension(xfi->display, &damage_event, &damage_error) == 0)
+       {
+               printf("XDamageQueryExtension failed\n");
+               return;
+       }
+
+       XDamageQueryVersion(xfi->display, &major, &minor);
+
+       if (XDamageQueryVersion(xfi->display, &major, &minor) == 0)
+       {
+               printf("XDamageQueryVersion failed\n");
+               return;
+       }
+       else if (major < 1)
+       {
+               printf("XDamageQueryVersion failed: major:%d minor:%d\n", major, minor);
+               return;
+       }
+
+       xfi->xdamage_notify_event = damage_event + XDamageNotify;
+       xfi->xdamage = XDamageCreate(xfi->display, xfi->root_window, XDamageReportDeltaRectangles);
+
+       if (xfi->xdamage == None)
+       {
+               printf("XDamageCreate failed\n");
+               return;
+       }
+
+#ifdef WITH_XFIXES
+       xfi->xdamage_region = XFixesCreateRegion(xfi->display, NULL, 0);
+
+       if (xfi->xdamage_region == None)
+       {
+               printf("XFixesCreateRegion failed\n");
+               XDamageDestroy(xfi->display, xfi->xdamage);
+               xfi->xdamage = None;
+               return;
+       }
+#endif
+
+       values.subwindow_mode = IncludeInferiors;
+       xfi->xdamage_gc = XCreateGC(xfi->display, xfi->root_window, GCSubwindowMode, &values);
+       XSetFunction(xfi->display, xfi->xdamage_gc, GXcopy);
+}
+
+#endif
+
+void xf_xshm_init(xfInfo* xfi)
+{
+       xfi->fb_shm_info.shmid = -1;
+       xfi->fb_shm_info.shmaddr = (char*) -1;
+
+       xfi->fb_image = XShmCreateImage(xfi->display, xfi->visual, xfi->depth,
+                       ZPixmap, NULL, &(xfi->fb_shm_info), xfi->width, xfi->height);
+
+       if (xfi->fb_image == NULL)
+       {
+               printf("XShmCreateImage failed\n");
+               return;
+       }
+
+       xfi->fb_shm_info.shmid = shmget(IPC_PRIVATE,
+                       xfi->fb_image->bytes_per_line * xfi->fb_image->height, IPC_CREAT | 0600);
+
+       if (xfi->fb_shm_info.shmid == -1)
+       {
+               printf("shmget failed\n");
+               return;
+       }
+
+       xfi->fb_shm_info.readOnly = False;
+       xfi->fb_shm_info.shmaddr = shmat(xfi->fb_shm_info.shmid, 0, 0);
+       xfi->fb_image->data = xfi->fb_shm_info.shmaddr;
+
+       if (xfi->fb_shm_info.shmaddr == ((char*) -1))
+       {
+               printf("shmat failed\n");
+               return;
+       }
+
+       XShmAttach(xfi->display, &(xfi->fb_shm_info));
+       XSync(xfi->display, False);
+
+       shmctl(xfi->fb_shm_info.shmid, IPC_RMID, 0);
+
+       xfi->fb_pixmap = XShmCreatePixmap(xfi->display,
+                       xfi->root_window, xfi->fb_image->data, &(xfi->fb_shm_info),
+                       xfi->fb_image->width, xfi->fb_image->height, xfi->fb_image->depth);
+}
+
+xfInfo* xf_info_init()
+{
+       int i;
+       xfInfo* xfi;
+       int pf_count;
+       int vi_count;
+       XVisualInfo* vi;
+       XVisualInfo* vis;
+       XVisualInfo template;
+       XPixmapFormatValues* pf;
+       XPixmapFormatValues* pfs;
+
+       xfi = xnew(xfInfo);
+
+       //xfi->use_xshm = true;
+       xfi->display = XOpenDisplay(NULL);
+
+       XInitThreads();
+
+       if (xfi->display == NULL)
+       {
+               printf("failed to open display: %s\n", XDisplayName(NULL));
+               exit(1);
+       }
+
+       xfi->xfds = ConnectionNumber(xfi->display);
+       xfi->number = DefaultScreen(xfi->display);
+       xfi->screen = ScreenOfDisplay(xfi->display, xfi->number);
+       xfi->depth = DefaultDepthOfScreen(xfi->screen);
+       xfi->width = WidthOfScreen(xfi->screen);
+       xfi->height = HeightOfScreen(xfi->screen);
+       xfi->root_window = DefaultRootWindow(xfi->display);
+
+       pfs = XListPixmapFormats(xfi->display, &pf_count);
+
+       if (pfs == NULL)
+       {
+               printf("XListPixmapFormats failed\n");
+               exit(1);
+       }
+
+       for (i = 0; i < pf_count; i++)
+       {
+               pf = pfs + i;
+
+               if (pf->depth == xfi->depth)
+               {
+                       xfi->bpp = pf->bits_per_pixel;
+                       xfi->scanline_pad = pf->scanline_pad;
+                       break;
+               }
+       }
+       XFree(pfs);
+
+       memset(&template, 0, sizeof(template));
+       template.class = TrueColor;
+       template.screen = xfi->number;
+
+       vis = XGetVisualInfo(xfi->display, VisualClassMask | VisualScreenMask, &template, &vi_count);
+
+       if (vis == NULL)
+       {
+               printf("XGetVisualInfo failed\n");
+               exit(1);
+       }
+
+       for (i = 0; i < vi_count; i++)
+       {
+               vi = vis + i;
+
+               if (vi->depth == xfi->depth)
+               {
+                       xfi->visual = vi->visual;
+                       break;
+               }
+       }
+       XFree(vis);
+
+       xfi->clrconv = freerdp_clrconv_new(CLRCONV_ALPHA | CLRCONV_INVERT);
+
+       XSelectInput(xfi->display, xfi->root_window, SubstructureNotifyMask);
+
+#ifdef WITH_XDAMAGE
+       xf_xdamage_init(xfi);
+#endif
+
+       xf_xshm_init(xfi);
+
+       xfi->bytesPerPixel = 4;
+
+       freerdp_kbd_init(xfi->display, 0);
+
+       return xfi;
+}
+
+void xf_peer_context_new(freerdp_peer* client, xfPeerContext* context)
+{
+       context->info = xf_info_init();
+       context->rfx_context = rfx_context_new();
+       context->rfx_context->mode = RLGR3;
+       context->rfx_context->width = context->info->width;
+       context->rfx_context->height = context->info->height;
+
+       rfx_context_set_pixel_format(context->rfx_context, RFX_PIXEL_FORMAT_BGRA);
+
+       context->s = stream_new(65536);
+}
+
+void xf_peer_context_free(freerdp_peer* client, xfPeerContext* context)
+{
+       if (context)
+       {
+               stream_free(context->s);
+               rfx_context_free(context->rfx_context);
+               xfree(context);
+       }
+}
+
+void xf_peer_init(freerdp_peer* client)
+{
+       xfInfo* xfi;
+       xfPeerContext* xfp;
+
+       client->context_size = sizeof(xfPeerContext);
+       client->ContextNew = (psPeerContextNew) xf_peer_context_new;
+       client->ContextFree = (psPeerContextFree) xf_peer_context_free;
+       freerdp_peer_context_new(client);
+
+       xfp = (xfPeerContext*) client->context;
+
+       xfp->fps = 24;
+       xfp->thread = 0;
+       xfp->activations = 0;
+       xfp->event_queue = xf_event_queue_new();
+
+       xfi = xfp->info;
+       xfp->hdc = gdi_CreateDC(xfi->clrconv, xfi->bpp);
+
+       pthread_mutex_init(&(xfp->mutex), NULL);
+}
+
+STREAM* xf_peer_stream_init(xfPeerContext* context)
+{
+       stream_clear(context->s);
+       stream_set_pos(context->s, 0);
+       return context->s;
+}
+
+void xf_peer_live_rfx(freerdp_peer* client)
+{
+       xfPeerContext* xfp = (xfPeerContext*) client->context;
+
+       if (xfp->activations == 1)
+               pthread_create(&(xfp->thread), 0, xf_monitor_updates, (void*) client);
+}
+
+static boolean xf_peer_sleep_tsdiff(uint32 *old_sec, uint32 *old_usec, uint32 new_sec, uint32 new_usec)
+{
+       sint32 sec, usec;
+
+       if (*old_sec == 0 && *old_usec == 0)
+       {
+               *old_sec = new_sec;
+               *old_usec = new_usec;
+               return true;
+       }
+
+       sec = new_sec - *old_sec;
+       usec = new_usec - *old_usec;
+
+       if (sec < 0 || (sec == 0 && usec < 0))
+       {
+               printf("Invalid time stamp detected.\n");
+               return false;
+       }
+
+       *old_sec = new_sec;
+       *old_usec = new_usec;
+
+       while (usec < 0)
+       {
+               usec += 1000000;
+               sec--;
+       }
+
+       if (sec > 0)
+               freerdp_sleep(sec);
+
+       if (usec > 0)
+               freerdp_usleep(usec);
+
+       return true;
+}
+
+void xf_peer_dump_rfx(freerdp_peer* client)
+{
+       STREAM* s;
+       uint32 prev_seconds;
+       uint32 prev_useconds;
+       rdpUpdate* update;
+       rdpPcap* pcap_rfx;
+       pcap_record record;
+
+       s = stream_new(512);
+       update = client->update;
+       client->update->pcap_rfx = pcap_open(xf_pcap_file, false);
+       pcap_rfx = client->update->pcap_rfx;
+
+       if (pcap_rfx == NULL)
+               return;
+
+       prev_seconds = prev_useconds = 0;
+
+       while (pcap_has_next_record(pcap_rfx))
+       {
+               pcap_get_next_record_header(pcap_rfx, &record);
+
+               s->data = xrealloc(s->data, record.length);
+               record.data = s->data;
+               s->size = record.length;
+
+               pcap_get_next_record_content(pcap_rfx, &record);
+               s->p = s->data + s->size;
+
+               if (xf_pcap_dump_realtime && xf_peer_sleep_tsdiff(&prev_seconds, &prev_useconds, record.header.ts_sec, record.header.ts_usec) == false)
+                        break;
+
+               update->SurfaceCommand(update->context, s);
+       }
+}
+
+void xf_peer_rfx_update(freerdp_peer* client, int x, int y, int width, int height)
+{
+       STREAM* s;
+       uint8* data;
+       xfInfo* xfi;
+       RFX_RECT rect;
+       XImage* image;
+       rdpUpdate* update;
+       xfPeerContext* xfp;
+       SURFACE_BITS_COMMAND* cmd;
+
+       update = client->update;
+       xfp = (xfPeerContext*) client->context;
+       cmd = &update->surface_bits_command;
+       xfi = xfp->info;
+
+       if (width * height <= 0)
+               return;
+
+       s = xf_peer_stream_init(xfp);
+
+       if (xfi->use_xshm)
+       {
+               width = x + width;
+               height = y + height;
+               x = 0;
+               y = 0;
+
+               rect.x = x;
+               rect.y = y;
+               rect.width = width;
+               rect.height = height;
+
+               image = xf_snapshot(xfp, x, y, width, height);
+
+               data = (uint8*) image->data;
+               data = &data[(y * image->bytes_per_line) + (x * image->bits_per_pixel)];
+
+               rfx_compose_message(xfp->rfx_context, s, &rect, 1, data,
+                               width, height, image->bytes_per_line);
+
+               cmd->destLeft = x;
+               cmd->destTop = y;
+               cmd->destRight = x + width;
+               cmd->destBottom = y + height;
+       }
+       else
+       {
+               rect.x = 0;
+               rect.y = 0;
+               rect.width = width;
+               rect.height = height;
+
+               image = xf_snapshot(xfp, x, y, width, height);
+
+               rfx_compose_message(xfp->rfx_context, s, &rect, 1,
+                               (uint8*) image->data, width, height, width * xfi->bytesPerPixel);
+
+               cmd->destLeft = x;
+               cmd->destTop = y;
+               cmd->destRight = x + width;
+               cmd->destBottom = y + height;
+
+               XDestroyImage(image);
+       }
+
+       cmd->bpp = 32;
+       cmd->codecID = client->settings->rfx_codec_id;
+       cmd->width = width;
+       cmd->height = height;
+       cmd->bitmapDataLength = stream_get_length(s);
+       cmd->bitmapData = stream_get_head(s);
+
+       update->SurfaceBits(update->context, cmd);
+}
+
+boolean xf_peer_get_fds(freerdp_peer* client, void** rfds, int* rcount)
+{
+       xfPeerContext* xfp = (xfPeerContext*) client->context;
+
+       if (xfp->event_queue->pipe_fd[0] == -1)
+               return true;
+
+       rfds[*rcount] = (void *)(long) xfp->event_queue->pipe_fd[0];
+       (*rcount)++;
+
+       return true;
+}
+
+boolean xf_peer_check_fds(freerdp_peer* client)
+{
+       xfInfo* xfi;
+       xfEvent* event;
+       xfPeerContext* xfp;
+       HGDI_RGN invalid_region;
+
+       xfp = (xfPeerContext*) client->context;
+       xfi = xfp->info;
+
+       if (xfp->activated == false)
+               return true;
+
+       event = xf_event_peek(xfp->event_queue);
+
+       if (event != NULL)
+       {
+               if (event->type == XF_EVENT_TYPE_REGION)
+               {
+                       xfEventRegion* region = (xfEventRegion*) xf_event_pop(xfp->event_queue);
+                       gdi_InvalidateRegion(xfp->hdc, region->x, region->y, region->width, region->height);
+                       xf_event_region_free(region);
+               }
+               else if (event->type == XF_EVENT_TYPE_FRAME_TICK)
+               {
+                       event = xf_event_pop(xfp->event_queue);
+                       invalid_region = xfp->hdc->hwnd->invalid;
+
+                       if (invalid_region->null == false)
+                       {
+                               xf_peer_rfx_update(client, invalid_region->x, invalid_region->y,
+                                       invalid_region->w, invalid_region->h);
+                       }
+
+                       invalid_region->null = 1;
+                       xfp->hdc->hwnd->ninvalid = 0;
+
+                       xf_event_free(event);
+               }
+       }
+
+       return true;
+}
+
+boolean xf_peer_capabilities(freerdp_peer* client)
+{
+       return true;
+}
+
+boolean xf_peer_post_connect(freerdp_peer* client)
+{
+       xfInfo* xfi;
+       xfPeerContext* xfp;
+
+       xfp = (xfPeerContext*) client->context;
+       xfi = (xfInfo*) xfp->info;
+
+       /**
+        * This callback is called when the entire connection sequence is done, i.e. we've received the
+        * Font List PDU from the client and sent out the Font Map PDU.
+        * The server may start sending graphics output and receiving keyboard/mouse input after this
+        * callback returns.
+        */
+       printf("Client %s is activated", client->hostname);
+       if (client->settings->autologon)
+       {
+               printf(" and wants to login automatically as %s\\%s",
+                       client->settings->domain ? client->settings->domain : "",
+                       client->settings->username);
+
+               /* A real server may perform OS login here if NLA is not executed previously. */
+       }
+       printf("\n");
+
+       printf("Client requested desktop: %dx%dx%d\n",
+               client->settings->width, client->settings->height, client->settings->color_depth);
+
+       /* A real server should tag the peer as activated here and start sending updates in mainloop. */
+
+       client->settings->width = xfi->width;
+       client->settings->height = xfi->height;
+
+       client->update->DesktopResize(client->update->context);
+       xfp->activated = false;
+
+       /* Return false here would stop the execution of the peer mainloop. */
+       return true;
+}
+
+boolean xf_peer_activate(freerdp_peer* client)
+{
+       xfPeerContext* xfp = (xfPeerContext*) client->context;
+
+       rfx_context_reset(xfp->rfx_context);
+       xfp->activated = true;
+
+       if (xf_pcap_file != NULL)
+       {
+               client->update->dump_rfx = true;
+               xf_peer_dump_rfx(client);
+       }
+       else
+       {
+               xf_peer_live_rfx(client);
+               xfp->activations++;
+       }
+
+       return true;
+}
+
+void* xf_peer_main_loop(void* arg)
+{
+       int i;
+       int fds;
+       int max_fds;
+       int rcount;
+       void* rfds[32];
+       fd_set rfds_set;
+       rdpSettings* settings;
+       char* server_file_path;
+       freerdp_peer* client = (freerdp_peer*) arg;
+
+       memset(rfds, 0, sizeof(rfds));
+
+       printf("We've got a client %s\n", client->hostname);
+
+       xf_peer_init(client);
+       settings = client->settings;
+
+       /* Initialize the real server settings here */
+
+       if (settings->development_mode)
+       {
+               server_file_path = freerdp_construct_path(settings->development_path, "server/X11");
+       }
+       else
+       {
+               server_file_path = freerdp_construct_path(settings->config_path, "server");
+
+               if (!freerdp_check_file_exists(server_file_path))
+                       freerdp_mkdir(server_file_path);
+       }
+
+       settings->cert_file = freerdp_construct_path(server_file_path, "server.crt");
+       settings->privatekey_file = freerdp_construct_path(server_file_path, "server.key");
+
+       settings->nla_security = false;
+       settings->rfx_codec = true;
+
+       client->Capabilities = xf_peer_capabilities;
+       client->PostConnect = xf_peer_post_connect;
+       client->Activate = xf_peer_activate;
+
+       xf_input_register_callbacks(client->input);
+
+       client->Initialize(client);
+
+       while (1)
+       {
+               rcount = 0;
+
+               if (client->GetFileDescriptor(client, rfds, &rcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+               if (xf_peer_get_fds(client, rfds, &rcount) != true)
+               {
+                       printf("Failed to get xfreerdp file descriptor\n");
+                       break;
+               }
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               if (select(max_fds + 1, &rfds_set, NULL, NULL, NULL) == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("select failed\n");
+                               break;
+                       }
+               }
+
+               if (client->CheckFileDescriptor(client) != true)
+               {
+                       printf("Failed to check freerdp file descriptor\n");
+                       break;
+               }
+               if ((xf_peer_check_fds(client)) != true)
+               {
+                       printf("Failed to check xfreerdp file descriptor\n");
+                       break;
+               }
+       }
+
+       printf("Client %s disconnected.\n", client->hostname);
+
+       client->Disconnect(client);
+       freerdp_peer_context_free(client);
+       freerdp_peer_free(client);
+
+       return NULL;
+}
+
+void xf_peer_accepted(freerdp_listener* instance, freerdp_peer* client)
+{
+       pthread_t th;
+
+       pthread_create(&th, 0, xf_peer_main_loop, client);
+       pthread_detach(th);
+}
diff --git a/server/X11/xf_peer.h b/server/X11/xf_peer.h
new file mode 100644 (file)
index 0000000..6e15cdb
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * X11 Peer
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XF_PEER_H
+#define __XF_PEER_H
+
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/gdi/dc.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/listener.h>
+#include <freerdp/utils/stream.h>
+#include <freerdp/utils/stopwatch.h>
+
+typedef struct xf_peer_context xfPeerContext;
+
+#include "xfreerdp.h"
+
+struct xf_peer_context
+{
+       rdpContext _p;
+
+       int fps;
+       STREAM* s;
+       HGDI_DC hdc;
+       xfInfo* info;
+       int activations;
+       pthread_t thread;
+       boolean activated;
+       pthread_mutex_t mutex;
+       RFX_CONTEXT* rfx_context;
+       xfEventQueue* event_queue;
+       pthread_t frame_rate_thread;
+};
+
+void xf_peer_accepted(freerdp_listener* instance, freerdp_peer* client);
+
+#endif /* __XF_PEER_H */
diff --git a/server/X11/xfreerdp.c b/server/X11/xfreerdp.c
new file mode 100644 (file)
index 0000000..b8dd6a0
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP X11 Server
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <sys/select.h>
+#include <sys/signal.h>
+
+#include <freerdp/utils/memory.h>
+
+#include "xf_peer.h"
+#include "xfreerdp.h"
+
+char* xf_pcap_file = NULL;
+boolean xf_pcap_dump_realtime = true;
+
+void xf_server_main_loop(freerdp_listener* instance)
+{
+       int i;
+       int fds;
+       int max_fds;
+       int rcount;
+       void* rfds[32];
+       fd_set rfds_set;
+
+       memset(rfds, 0, sizeof(rfds));
+
+       while (1)
+       {
+               rcount = 0;
+
+               if (instance->GetFileDescriptor(instance, rfds, &rcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               if (select(max_fds + 1, &rfds_set, NULL, NULL, NULL) == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("select failed\n");
+                               break;
+                       }
+               }
+
+               if (instance->CheckFileDescriptor(instance) != true)
+               {
+                       printf("Failed to check FreeRDP file descriptor\n");
+                       break;
+               }
+       }
+
+       instance->Close(instance);
+}
+
+int main(int argc, char* argv[])
+{
+       freerdp_listener* instance;
+
+       /* ignore SIGPIPE, otherwise an SSL_write failure could crash the server */
+       signal(SIGPIPE, SIG_IGN);
+
+       instance = freerdp_listener_new();
+       instance->PeerAccepted = xf_peer_accepted;
+
+       if (argc > 1)
+               xf_pcap_file = argv[1];
+
+       if (argc > 2 && !strcmp(argv[2], "--fast"))
+               xf_pcap_dump_realtime = false;
+
+       /* Open the server socket and start listening. */
+       if (instance->Open(instance, NULL, 3389))
+       {
+               /* Entering the server main loop. In a real server the listener can be run in its own thread. */
+               xf_server_main_loop(instance);
+       }
+
+       freerdp_listener_free(instance);
+
+       return 0;
+}
+
diff --git a/server/X11/xfreerdp.h b/server/X11/xfreerdp.h
new file mode 100644 (file)
index 0000000..3609923
--- /dev/null
@@ -0,0 +1,75 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP X11 Server
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __XFREERDP_H
+#define __XFREERDP_H
+
+#include <freerdp/codec/color.h>
+
+#ifdef WITH_XSHM
+#include <X11/extensions/XShm.h>
+#endif
+
+#ifdef WITH_XFIXES
+#include <X11/extensions/Xfixes.h>
+#endif
+
+#ifdef WITH_XTEST
+#include <X11/extensions/XTest.h>
+#endif
+
+#ifdef WITH_XDAMAGE
+#include <X11/extensions/Xdamage.h>
+#endif
+
+typedef struct xf_info xfInfo;
+
+#include "xf_event.h"
+
+struct xf_info
+{
+       int bpp;
+       int xfds;
+       int depth;
+       int width;
+       int height;
+       int number;
+       XImage* image;
+       Screen* screen;
+       Visual* visual;
+       Display* display;
+       int scanline_pad;
+       int bytesPerPixel;
+       HCLRCONV clrconv;
+       boolean use_xshm;
+
+       XImage* fb_image;
+       Pixmap fb_pixmap;
+       Window root_window;
+       XShmSegmentInfo fb_shm_info;
+
+#ifdef WITH_XDAMAGE
+       GC xdamage_gc;
+       Damage xdamage;
+       int xdamage_notify_event;
+       XserverRegion xdamage_region;
+#endif
+};
+
+#endif /* __XFREERDP_H */
diff --git a/server/test/CMakeLists.txt b/server/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..eb93023
--- /dev/null
@@ -0,0 +1,26 @@
+# FreeRDP: A Remote Desktop Protocol Client
+# FreeRDP Test Server cmake build script
+#
+# Copyright 2011 O.S. Systems Software Ltda.
+# Copyright 2011 Otavio Salvador <otavio@ossystems.com.br>
+# Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+add_executable(tfreerdp-server
+       tfreerdp.c)
+
+target_link_libraries(tfreerdp-server freerdp-core)
+target_link_libraries(tfreerdp-server freerdp-utils)
+target_link_libraries(tfreerdp-server freerdp-codec)
+target_link_libraries(tfreerdp-server freerdp-channels)
diff --git a/server/test/rfx_test.pcap b/server/test/rfx_test.pcap
new file mode 100644 (file)
index 0000000..768c396
Binary files /dev/null and b/server/test/rfx_test.pcap differ
diff --git a/server/test/server.crt b/server/test/server.crt
new file mode 100644 (file)
index 0000000..7ce931c
--- /dev/null
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICyzCCAbOgAwIBAgIJANbqtAWwlQZuMA0GCSqGSIb3DQEBBQUAMBIxEDAOBgNV
+BAMTB0ZyZWVSRFAwHhcNMDkxMDI5MDA0MTQ5WhcNMDkxMTI4MDA0MTQ5WjASMRAw
+DgYDVQQDEwdGcmVlUkRQMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+q7mxFgRbS2FYJZX7BzpNd4T/n4nEVDBY6YaObLjGpaB1TptzXTcmfDrDslTGwcEY
+hTFAC4ZvY6yOURExqbph4LSgvkoa6J722RjVPfshGa4mlh2SXvTiaV26VPPxddGb
+o6fbs2u029lbtBlpIVbhx5RN9vstNkll26oSZ6wfEdBNHQJLd2SU4ItWHj8zjz1f
+eGxjgChHihUlwcBYKDJsKFkzHZmLrMgB37KsGlXi/WV+eEsjgvz4yP7I3TL8+GsN
+MjV8fRGVEKTbKSmgunO67d5u+IaqUQb0Ad1ha1jzDQ+a6hdymrulJSIhoOVfKkwi
+ptTe43FgwxVRIygJP9HjHQIDAQABoyQwIjATBgNVHSUEDDAKBggrBgEFBQcDATAL
+BgNVHQ8EBAMCBDAwDQYJKoZIhvcNAQEFBQADggEBAIOdEDhOX2kbl02znltd9hCr
+nV4kRPKm979RKwBNkrEuwYSlcsjAHg5MZ5itH3wFOUo2s5pjt7/vMOAg+6rOBbIa
+nqr22/gKBtOmuaJLG1yjxDC2vfez7f3B26pKgxa/krM8oxiFdT9n8QbdxdkN7/D9
+3RLU/aCfgrMzXxRus7eq3kR00jnSs6ggnAfE1E9gric3vFgr1wCzdcriRXmXDfUb
+hRq+4VG+ZWk16TwCofV5GVU39XWCv5HNO2swAdjkNXgI5e3tQbV3wWLZLqqYzBco
+iWulAXtoCGmE81+u1Ms7hLLzpXitLZSGPu1r+sDdkKPLCmOvkAaljDQ4nBz7fIA=
+-----END CERTIFICATE-----
diff --git a/server/test/server.key b/server/test/server.key
new file mode 100644 (file)
index 0000000..5c2f2c8
--- /dev/null
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAq7mxFgRbS2FYJZX7BzpNd4T/n4nEVDBY6YaObLjGpaB1Tptz
+XTcmfDrDslTGwcEYhTFAC4ZvY6yOURExqbph4LSgvkoa6J722RjVPfshGa4mlh2S
+XvTiaV26VPPxddGbo6fbs2u029lbtBlpIVbhx5RN9vstNkll26oSZ6wfEdBNHQJL
+d2SU4ItWHj8zjz1feGxjgChHihUlwcBYKDJsKFkzHZmLrMgB37KsGlXi/WV+eEsj
+gvz4yP7I3TL8+GsNMjV8fRGVEKTbKSmgunO67d5u+IaqUQb0Ad1ha1jzDQ+a6hdy
+mrulJSIhoOVfKkwiptTe43FgwxVRIygJP9HjHQIDAQABAoIBAAVv5K54xtc1JtBR
+1lfdPbSqDlnjx8aOnVIPg5TnqMp3sR8jBt0NsPc/+RA9ZOmfjoIxFAEJaZ9zSDJC
+5BqmnxC5R1mfCQkSd2haQ+4pdFvWyrv4Bblh8YU6hXrJGn0LfO0KlIcywtAvKpsi
+LtTyZkWmaW2HeF/+pO32jYygw38R1wd8Tl6GwjOXwTF6lFACJXOT4YAzcfp3FKSB
+AiKBIGuMzozoSND7KPFNRrhGhNumJpdS5A8Fb8D2c/ZMv6Cq5IbwOgTfKun+Bz+s
+mFbnzeb1uWRqQbsVXOBBW/zHfuG3SU5qeZsaAyuu4DTy+LE1oAHF9uhBSHuT5C6i
+vCJ8A8ECgYEA1iaOmiEJYBrs25iAc4SjCKqhY0mwR3wtu3I06vmgUoML5fhPMv36
+SvYQIqDyNw3p7TE6mZtw9+G+kK3PqhuJhogwSwg0a6o51RdKnhXH3/68oNWtKCLC
+1AmR8q/Gd3FwAR3b49CuOIZ9uOiJrc/ejzKdFEJTDR1/TX1frWfZznECgYEAzUiz
+XxFf7YrGel7JgmfRD2eZRYngOoteFlg5Tee42UjeAY2Pt2aiDLk+2TqQEdI9+Xg7
+LcFdBqcSNd8bh33xSzgNthIkX+lTDzx0SmKGfyxfFBJcY8nzsLvvnNt3YeuMeaJQ
+CPszwoZ0jcD46jTCjbrKhaLyEWmUkDp1O71NTW0CgYAXKF49Xpsz8FVyvcAOPeaf
+dkwzf3F3mX8ciRId4taqdY9g1AREgGCDoK5IAF2RBIkqZCtxFvUVaS0BWjpdq9Ko
+YKvQQVfh2KueVoF0LOjLWTGutsydzXyCD3Lf6pAstHCnPkJcFWHxrOGFkGfrCtKH
+a7K+0RlIDsuIZqllCBjukQKBgA31+MTpYJW+D1t5IMkumEgs6n6RLt+sZLyuSU9k
+B+03CGogn3qAj1rAKmcJlYywuKhDpfqpoNL3/8QMJUokpYlRCZWtTC39pzltCheY
+9b6mXNz3lrLupBUL4vLO9iKBq28GO90wgEelbz3ItuTuq6CJ6IYIG+BVRtY8M4bZ
+i+1NAoGANXZjYnJYDnh8Je9SDxDSc5byzK7ddkQoId64RCIfNHqNKH63P81vjgnH
+YBIPtagY75ZVVNxujCF7m8Rety+d8tEFwfQKDin2EVI7PD2rOJra385/izp7HuBR
+vqxvLzG9Xv3cNOU2l7PttVw4Pa2i5E37atKi3V3Zp2kMW+KaKPQ=
+-----END RSA PRIVATE KEY-----
diff --git a/server/test/test_icon.ppm b/server/test/test_icon.ppm
new file mode 100644 (file)
index 0000000..bcc4a0e
--- /dev/null
@@ -0,0 +1,5572 @@
+P3
+# CREATOR: GIMP PNM Filter Version 1.1
+29 64
+255
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+159
+159
+160
+135
+154
+160
+85
+141
+160
+82
+141
+160
+159
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+112
+148
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+155
+158
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+114
+148
+160
+74
+139
+160
+74
+139
+160
+75
+140
+161
+91
+143
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+136
+154
+160
+76
+140
+160
+74
+139
+160
+74
+139
+160
+75
+140
+161
+137
+154
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+152
+158
+160
+79
+141
+160
+75
+140
+161
+74
+139
+160
+74
+139
+160
+83
+141
+160
+159
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+90
+143
+160
+75
+140
+161
+74
+139
+160
+75
+140
+161
+75
+140
+161
+105
+147
+160
+159
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+125
+151
+160
+74
+139
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+74
+139
+160
+111
+154
+167
+158
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+154
+158
+160
+88
+143
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+138
+160
+99
+170
+189
+134
+171
+180
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+126
+151
+160
+74
+139
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+73
+137
+158
+63
+124
+147
+108
+181
+198
+152
+163
+165
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+80
+141
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+73
+138
+159
+21
+72
+99
+78
+143
+164
+126
+180
+192
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+129
+152
+160
+74
+139
+160
+75
+140
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+73
+138
+159
+25
+77
+104
+12
+60
+88
+105
+176
+194
+145
+167
+172
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+98
+145
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+27
+80
+106
+6
+53
+82
+57
+117
+140
+121
+182
+195
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+83
+141
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+76
+141
+162
+30
+83
+109
+6
+53
+82
+28
+81
+107
+108
+180
+197
+154
+162
+164
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+155
+158
+160
+80
+140
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+74
+139
+160
+74
+138
+159
+73
+138
+159
+75
+140
+161
+37
+92
+118
+2
+48
+78
+19
+69
+96
+100
+171
+189
+147
+165
+170
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+149
+157
+160
+79
+140
+160
+74
+139
+160
+74
+139
+160
+76
+142
+163
+82
+149
+169
+96
+165
+184
+106
+178
+196
+111
+185
+202
+114
+188
+205
+114
+188
+205
+97
+168
+186
+107
+179
+196
+150
+164
+168
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+146
+156
+160
+80
+141
+160
+74
+139
+160
+86
+154
+173
+102
+173
+191
+111
+184
+200
+111
+184
+201
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+111
+184
+201
+110
+183
+200
+113
+179
+195
+138
+170
+177
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+146
+156
+160
+77
+139
+159
+93
+162
+182
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+182
+199
+109
+182
+199
+110
+183
+200
+138
+169
+177
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+146
+156
+159
+99
+165
+182
+112
+185
+202
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+150
+165
+168
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+138
+168
+175
+110
+182
+199
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+182
+199
+107
+180
+197
+107
+168
+183
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+156
+161
+162
+117
+179
+194
+109
+182
+199
+109
+182
+199
+110
+183
+200
+109
+182
+199
+109
+182
+199
+109
+182
+199
+109
+182
+199
+109
+182
+199
+110
+183
+200
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+111
+185
+201
+83
+149
+168
+7
+52
+81
+101
+119
+130
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+144
+167
+172
+110
+183
+200
+110
+182
+199
+110
+183
+200
+109
+182
+199
+61
+125
+148
+47
+91
+116
+58
+95
+118
+43
+88
+112
+64
+128
+151
+108
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+112
+185
+202
+98
+168
+186
+125
+165
+175
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+126
+175
+187
+109
+182
+199
+110
+182
+199
+111
+184
+201
+55
+119
+143
+108
+136
+153
+230
+234
+237
+186
+198
+205
+234
+233
+221
+51
+89
+113
+68
+133
+155
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+109
+182
+199
+110
+183
+200
+123
+176
+188
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+114
+179
+195
+110
+183
+200
+110
+183
+200
+103
+175
+193
+66
+114
+136
+247
+248
+249
+240
+243
+244
+57
+95
+118
+22
+66
+93
+40
+80
+106
+64
+113
+135
+108
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+119
+177
+191
+156
+161
+162
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+110
+182
+199
+110
+183
+200
+110
+183
+200
+100
+172
+190
+106
+143
+161
+249
+250
+250
+251
+252
+252
+132
+155
+170
+51
+89
+113
+145
+165
+178
+79
+121
+142
+108
+181
+198
+110
+183
+200
+109
+182
+199
+110
+184
+200
+113
+187
+203
+103
+175
+193
+104
+177
+194
+117
+180
+195
+154
+162
+164
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+112
+180
+196
+110
+183
+200
+110
+183
+200
+107
+180
+197
+74
+124
+145
+250
+251
+251
+254
+254
+254
+250
+251
+251
+238
+241
+243
+220
+226
+230
+67
+122
+144
+109
+182
+199
+110
+183
+200
+110
+183
+200
+101
+171
+189
+38
+91
+116
+154
+176
+179
+94
+128
+141
+99
+165
+182
+153
+164
+166
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+120
+177
+190
+109
+182
+199
+110
+183
+200
+110
+184
+200
+81
+152
+172
+113
+144
+161
+242
+244
+245
+242
+244
+245
+235
+239
+241
+92
+129
+148
+87
+157
+177
+110
+183
+200
+110
+183
+200
+115
+189
+206
+37
+91
+116
+8
+55
+84
+0
+46
+77
+55
+117
+140
+118
+186
+201
+152
+163
+165
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+134
+171
+180
+109
+182
+199
+109
+181
+198
+109
+182
+199
+113
+187
+203
+88
+159
+179
+83
+140
+160
+105
+152
+169
+76
+134
+155
+88
+159
+179
+112
+185
+202
+109
+182
+199
+110
+183
+200
+110
+183
+200
+109
+182
+199
+81
+147
+167
+61
+122
+144
+113
+187
+204
+113
+179
+195
+153
+163
+165
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+152
+163
+166
+110
+183
+200
+109
+182
+199
+110
+183
+200
+109
+182
+199
+110
+183
+200
+109
+182
+199
+108
+180
+198
+109
+183
+200
+110
+183
+200
+109
+182
+199
+109
+182
+199
+110
+183
+200
+109
+182
+199
+110
+183
+200
+106
+178
+195
+74
+138
+159
+110
+183
+200
+117
+178
+192
+155
+162
+163
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+157
+161
+161
+121
+177
+190
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+95
+164
+183
+77
+142
+163
+110
+183
+200
+123
+175
+188
+158
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+139
+169
+176
+110
+182
+199
+110
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+70
+133
+154
+103
+173
+191
+109
+181
+198
+136
+171
+179
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+159
+160
+160
+115
+179
+194
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+108
+181
+198
+95
+164
+183
+110
+183
+200
+110
+182
+199
+156
+161
+162
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+149
+164
+168
+109
+182
+199
+109
+182
+199
+110
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+111
+183
+200
+109
+182
+199
+136
+170
+177
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+137
+169
+177
+110
+183
+200
+109
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+119
+178
+192
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+157
+161
+162
+120
+176
+189
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+181
+198
+148
+165
+169
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+143
+167
+172
+110
+181
+198
+109
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+181
+198
+109
+182
+199
+126
+175
+186
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+116
+180
+194
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+182
+199
+109
+182
+199
+153
+162
+164
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+132
+172
+181
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+124
+175
+187
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+138
+169
+176
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+115
+165
+178
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+134
+171
+180
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+184
+201
+96
+165
+184
+133
+152
+158
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+119
+177
+190
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+107
+179
+197
+90
+141
+158
+156
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+156
+161
+163
+111
+181
+197
+109
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+82
+149
+169
+127
+151
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+143
+167
+172
+111
+182
+199
+109
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+96
+166
+184
+77
+138
+160
+158
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+131
+172
+182
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+103
+174
+191
+77
+142
+163
+99
+145
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+157
+161
+162
+121
+176
+189
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+82
+149
+168
+74
+140
+160
+126
+152
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+154
+162
+164
+111
+180
+196
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+111
+184
+201
+91
+160
+178
+74
+139
+160
+82
+141
+160
+148
+157
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+145
+166
+171
+128
+173
+184
+122
+176
+189
+129
+174
+184
+160
+160
+160
+160
+160
+160
+160
+160
+160
+144
+166
+171
+109
+182
+199
+110
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+103
+174
+192
+74
+139
+160
+74
+140
+160
+94
+144
+160
+156
+159
+160
+160
+160
+160
+160
+160
+160
+152
+163
+165
+120
+177
+190
+109
+182
+199
+109
+182
+199
+109
+181
+198
+153
+163
+165
+160
+160
+160
+160
+160
+160
+160
+160
+160
+128
+173
+184
+110
+183
+200
+110
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+184
+201
+74
+139
+160
+75
+139
+160
+75
+140
+161
+95
+144
+160
+160
+160
+160
+158
+160
+161
+114
+180
+196
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+151
+164
+167
+160
+160
+160
+160
+160
+160
+160
+160
+160
+115
+179
+194
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+112
+185
+202
+77
+143
+163
+74
+139
+160
+75
+140
+160
+74
+139
+160
+104
+145
+159
+134
+169
+177
+110
+183
+200
+109
+181
+198
+110
+183
+200
+110
+182
+199
+109
+182
+199
+122
+176
+188
+160
+160
+160
+160
+160
+160
+160
+160
+160
+110
+183
+200
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+112
+185
+202
+79
+144
+165
+74
+139
+160
+75
+140
+161
+74
+139
+160
+74
+138
+160
+92
+155
+174
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+109
+181
+198
+110
+183
+200
+160
+160
+160
+160
+160
+160
+160
+160
+160
+110
+183
+200
+109
+181
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+112
+186
+202
+75
+141
+162
+74
+139
+160
+75
+140
+161
+75
+140
+160
+74
+139
+160
+74
+139
+160
+87
+154
+173
+111
+184
+201
+110
+183
+200
+110
+183
+200
+109
+181
+198
+110
+183
+200
+160
+160
+160
+160
+160
+160
+160
+160
+160
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+93
+162
+181
+110
+183
+200
+109
+182
+199
+109
+181
+198
+109
+182
+199
+160
+160
+160
+160
+160
+160
+160
+160
+160
+113
+181
+196
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+104
+176
+194
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+76
+141
+162
+103
+174
+192
+110
+182
+199
+110
+183
+200
+109
+182
+199
+160
+160
+160
+160
+160
+160
+160
+160
+160
+121
+176
+189
+109
+182
+199
+110
+183
+200
+109
+182
+199
+119
+187
+203
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+97
+167
+186
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+80
+145
+165
+111
+185
+202
+109
+182
+199
+143
+167
+173
+160
+160
+160
+160
+160
+160
+160
+160
+160
+133
+172
+181
+109
+182
+199
+110
+182
+199
+109
+182
+199
+140
+198
+211
+111
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+111
+184
+201
+87
+156
+175
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+138
+160
+117
+157
+169
+159
+161
+161
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+147
+165
+169
+110
+183
+200
+109
+182
+199
+110
+183
+200
+161
+208
+219
+113
+184
+201
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+105
+177
+194
+77
+142
+163
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+94
+144
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+154
+162
+164
+114
+181
+196
+109
+182
+199
+109
+182
+200
+181
+218
+227
+114
+185
+201
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+110
+183
+200
+95
+163
+183
+50
+106
+130
+75
+141
+162
+74
+139
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+81
+140
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+158
+160
+161
+125
+175
+187
+109
+182
+199
+108
+182
+199
+201
+228
+235
+116
+186
+202
+109
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+183
+200
+77
+141
+162
+36
+88
+115
+48
+104
+128
+69
+133
+154
+74
+139
+160
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+83
+141
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+139
+169
+176
+110
+182
+199
+107
+180
+197
+204
+230
+236
+137
+196
+210
+108
+182
+199
+110
+183
+200
+110
+183
+200
+110
+183
+200
+109
+182
+199
+110
+184
+200
+46
+101
+126
+38
+90
+116
+48
+103
+128
+61
+120
+143
+69
+133
+154
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+97
+145
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+158
+160
+161
+113
+181
+197
+107
+181
+198
+191
+223
+230
+176
+215
+225
+105
+180
+198
+110
+183
+200
+110
+183
+200
+110
+183
+200
+112
+185
+202
+81
+146
+166
+35
+87
+114
+57
+116
+139
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+127
+152
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+140
+169
+175
+107
+181
+199
+171
+212
+222
+218
+237
+241
+101
+178
+196
+110
+183
+200
+110
+183
+200
+110
+183
+200
+105
+177
+195
+42
+96
+122
+44
+98
+124
+71
+134
+156
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+75
+140
+161
+88
+143
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+120
+176
+189
+144
+200
+213
+251
+252
+252
+108
+182
+199
+109
+182
+199
+109
+182
+199
+109
+182
+199
+53
+110
+135
+37
+90
+116
+46
+101
+127
+72
+135
+157
+74
+139
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+161
+75
+140
+160
+74
+139
+160
+82
+141
+160
+146
+156
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+158
+159
+159
+146
+160
+164
+108
+179
+196
+248
+252
+253
+151
+203
+215
+107
+182
+199
+108
+181
+198
+69
+132
+153
+5
+52
+81
+5
+52
+81
+11
+59
+87
+45
+102
+126
+73
+138
+159
+75
+140
+160
+75
+140
+161
+75
+140
+161
+75
+140
+161
+74
+139
+160
+81
+140
+160
+142
+155
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+141
+147
+150
+70
+98
+115
+41
+77
+99
+41
+95
+119
+120
+157
+173
+157
+187
+198
+67
+131
+154
+46
+103
+127
+4
+50
+79
+6
+53
+82
+6
+54
+83
+6
+53
+82
+3
+50
+79
+28
+81
+108
+52
+111
+135
+61
+123
+145
+77
+132
+151
+94
+139
+154
+116
+146
+157
+154
+158
+159
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+155
+156
+157
+61
+91
+110
+19
+62
+89
+6
+53
+82
+6
+53
+82
+10
+55
+83
+19
+62
+89
+44
+81
+104
+47
+82
+103
+11
+56
+84
+6
+53
+82
+10
+56
+84
+28
+68
+93
+50
+83
+104
+71
+98
+115
+97
+116
+128
+126
+137
+144
+145
+152
+155
+150
+155
+157
+155
+157
+158
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
+160
diff --git a/server/test/tfreerdp.c b/server/test/tfreerdp.c
new file mode 100644 (file)
index 0000000..3548360
--- /dev/null
@@ -0,0 +1,699 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Client
+ * FreeRDP Test Server
+ *
+ * Copyright 2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2011 Vic Lee
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <freerdp/constants.h>
+#include <freerdp/utils/sleep.h>
+#include <freerdp/utils/memory.h>
+#include <freerdp/utils/thread.h>
+#include <freerdp/codec/rfx.h>
+#include <freerdp/listener.h>
+#include <freerdp/channels/wtsvc.h>
+
+static char* test_pcap_file = NULL;
+static boolean test_dump_rfx_realtime = true;
+
+/* HL1, LH1, HH1, HL2, LH2, HH2, HL3, LH3, HH3, LL3 */
+static const unsigned int test_quantization_values[] =
+{
+       6, 6, 6, 6, 7, 7, 8, 8, 8, 9
+};
+
+struct test_peer_context
+{
+       rdpContext _p;
+
+       RFX_CONTEXT* rfx_context;
+       STREAM* s;
+       uint8* icon_data;
+       uint8* bg_data;
+       int icon_width;
+       int icon_height;
+       int icon_x;
+       int icon_y;
+       boolean activated;
+       WTSVirtualChannelManager* vcm;
+       void* debug_channel;
+       freerdp_thread* debug_channel_thread;
+};
+typedef struct test_peer_context testPeerContext;
+
+void test_peer_context_new(freerdp_peer* client, testPeerContext* context)
+{
+       context->rfx_context = rfx_context_new();
+       context->rfx_context->mode = RLGR3;
+       context->rfx_context->width = client->settings->width;
+       context->rfx_context->height = client->settings->height;
+       rfx_context_set_pixel_format(context->rfx_context, RFX_PIXEL_FORMAT_RGB);
+
+       context->s = stream_new(65536);
+
+       context->icon_x = -1;
+       context->icon_y = -1;
+
+       context->vcm = WTSCreateVirtualChannelManager(client);
+}
+
+void test_peer_context_free(freerdp_peer* client, testPeerContext* context)
+{
+       if (context)
+       {
+               if (context->debug_channel_thread)
+               {
+                       freerdp_thread_stop(context->debug_channel_thread);
+                       freerdp_thread_free(context->debug_channel_thread);
+               }
+               stream_free(context->s);
+               xfree(context->icon_data);
+               xfree(context->bg_data);
+               rfx_context_free(context->rfx_context);
+               if (context->debug_channel)
+               {
+                       WTSVirtualChannelClose(context->debug_channel);
+               }
+               WTSDestroyVirtualChannelManager(context->vcm);
+               xfree(context);
+       }
+}
+
+static void test_peer_init(freerdp_peer* client)
+{
+       client->context_size = sizeof(testPeerContext);
+       client->ContextNew = (psPeerContextNew) test_peer_context_new;
+       client->ContextFree = (psPeerContextFree) test_peer_context_free;
+       freerdp_peer_context_new(client);
+}
+
+static STREAM* test_peer_stream_init(testPeerContext* context)
+{
+       stream_clear(context->s);
+       stream_set_pos(context->s, 0);
+       return context->s;
+}
+
+static void test_peer_draw_background(freerdp_peer* client)
+{
+       testPeerContext* context = (testPeerContext*) client->context;
+       rdpUpdate* update = client->update;
+       SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
+       STREAM* s;
+       RFX_RECT rect;
+       uint8* rgb_data;
+       int size;
+
+       if (!client->settings->rfx_codec)
+               return;
+
+       s = test_peer_stream_init(context);
+
+       rect.x = 0;
+       rect.y = 0;
+       rect.width = client->settings->width;
+       rect.height = client->settings->height;
+
+       size = rect.width * rect.height * 3;
+       rgb_data = xmalloc(size);
+       memset(rgb_data, 0xA0, size);
+
+       rfx_compose_message(context->rfx_context, s,
+               &rect, 1, rgb_data, rect.width, rect.height, rect.width * 3);
+
+       cmd->destLeft = 0;
+       cmd->destTop = 0;
+       cmd->destRight = rect.width;
+       cmd->destBottom = rect.height;
+       cmd->bpp = 32;
+       cmd->codecID = client->settings->rfx_codec_id;
+       cmd->width = rect.width;
+       cmd->height = rect.height;
+       cmd->bitmapDataLength = stream_get_length(s);
+       cmd->bitmapData = stream_get_head(s);
+       update->SurfaceBits(update->context, cmd);
+
+       xfree(rgb_data);
+}
+
+static void test_peer_load_icon(freerdp_peer* client)
+{
+       testPeerContext* context = (testPeerContext*) client->context;
+       FILE* fp;
+       int i;
+       char line[50];
+       uint8* rgb_data;
+       int c;
+
+       if (!client->settings->rfx_codec)
+               return;
+
+       if ((fp = fopen("test_icon.ppm", "r")) == NULL)
+               return;
+
+       /* P3 */
+       fgets(line, sizeof(line), fp);
+       /* Creater comment */
+       fgets(line, sizeof(line), fp);
+       /* width height */
+       fgets(line, sizeof(line), fp);
+       sscanf(line, "%d %d", &context->icon_width, &context->icon_height);
+       /* Max */
+       fgets(line, sizeof(line), fp);
+
+       rgb_data = xmalloc(context->icon_width * context->icon_height * 3);
+
+       for (i = 0; i < context->icon_width * context->icon_height * 3; i++)
+       {
+               if (fgets(line, sizeof(line), fp))
+               {
+                       sscanf(line, "%d", &c);
+                       rgb_data[i] = (uint8)c;
+               }
+       }
+
+       context->icon_data = rgb_data;
+
+       /* background with same size, which will be used to erase the icon from old position */
+       context->bg_data = xmalloc(context->icon_width * context->icon_height * 3);
+       memset(context->bg_data, 0xA0, context->icon_width * context->icon_height * 3);
+}
+
+static void test_peer_draw_icon(freerdp_peer* client, int x, int y)
+{
+       testPeerContext* context = (testPeerContext*) client->context;
+       rdpUpdate* update = client->update;
+       SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
+       RFX_RECT rect;
+       STREAM* s;
+
+       if (client->update->dump_rfx)
+               return;
+       if (!client->settings->rfx_codec || !context)
+               return;
+       if (context->icon_width < 1 || !context->activated)
+               return;
+
+       rect.x = 0;
+       rect.y = 0;
+       rect.width = context->icon_width;
+       rect.height = context->icon_height;
+
+       if (context->icon_x >= 0)
+       {
+               s = test_peer_stream_init(context);
+               rfx_compose_message(context->rfx_context, s,
+                       &rect, 1, context->bg_data, rect.width, rect.height, rect.width * 3);
+
+               cmd->destLeft = context->icon_x;
+               cmd->destTop = context->icon_y;
+               cmd->destRight = context->icon_x + context->icon_width;
+               cmd->destBottom = context->icon_y + context->icon_height;
+               cmd->bpp = 32;
+               cmd->codecID = client->settings->rfx_codec_id;
+               cmd->width = context->icon_width;
+               cmd->height = context->icon_height;
+               cmd->bitmapDataLength = stream_get_length(s);
+               cmd->bitmapData = stream_get_head(s);
+               update->SurfaceBits(update->context, cmd);
+       }
+
+       s = test_peer_stream_init(context);
+       rfx_compose_message(context->rfx_context, s,
+               &rect, 1, context->icon_data, rect.width, rect.height, rect.width * 3);
+
+       cmd->destLeft = x;
+       cmd->destTop = y;
+       cmd->destRight = x + context->icon_width;
+       cmd->destBottom = y + context->icon_height;
+       cmd->bpp = 32;
+       cmd->codecID = client->settings->rfx_codec_id;
+       cmd->width = context->icon_width;
+       cmd->height = context->icon_height;
+       cmd->bitmapDataLength = stream_get_length(s);
+       cmd->bitmapData = stream_get_head(s);
+       update->SurfaceBits(update->context, cmd);
+
+       context->icon_x = x;
+       context->icon_y = y;
+}
+
+static boolean test_sleep_tsdiff(uint32 *old_sec, uint32 *old_usec, uint32 new_sec, uint32 new_usec)
+{
+       sint32 sec, usec;
+
+       if (*old_sec==0 && *old_usec==0)
+       {
+               *old_sec = new_sec;
+               *old_usec = new_usec;
+               return true;
+       }
+
+       sec = new_sec - *old_sec;
+       usec = new_usec - *old_usec;
+
+       if (sec<0 || (sec==0 && usec<0))
+       {
+               printf("Invalid time stamp detected.\n");
+               return false;
+       }
+
+       *old_sec = new_sec;
+       *old_usec = new_usec;
+       
+       while (usec < 0) 
+       {
+               usec += 1000000;
+               sec--;
+       }
+       
+       if (sec > 0)
+               freerdp_sleep(sec);
+       
+       if (usec > 0)
+               freerdp_usleep(usec);
+       
+       return true;
+}
+
+void tf_peer_dump_rfx(freerdp_peer* client)
+{
+       STREAM* s;
+       uint32 prev_seconds;
+       uint32 prev_useconds;
+       rdpUpdate* update;
+       rdpPcap* pcap_rfx;
+       pcap_record record;
+
+       s = stream_new(512);
+       update = client->update;
+       client->update->pcap_rfx = pcap_open(test_pcap_file, false);
+       pcap_rfx = client->update->pcap_rfx;
+
+       if (pcap_rfx == NULL)
+               return;
+
+       prev_seconds = prev_useconds = 0;
+
+       while (pcap_has_next_record(pcap_rfx))
+       {
+               pcap_get_next_record_header(pcap_rfx, &record);
+
+               s->data = xrealloc(s->data, record.length);
+               record.data = s->data;
+               s->size = record.length;
+
+               pcap_get_next_record_content(pcap_rfx, &record);
+               s->p = s->data + s->size;
+
+               if (test_dump_rfx_realtime && test_sleep_tsdiff(&prev_seconds, &prev_useconds, record.header.ts_sec, record.header.ts_usec) == false)
+                       break;
+
+               update->SurfaceCommand(update->context, s);
+       }
+}
+
+static void* tf_debug_channel_thread_func(void* arg)
+{
+       void* fd;
+       STREAM* s;
+       void* buffer;
+       uint32 bytes_returned = 0;
+       testPeerContext* context = (testPeerContext*) arg;
+       freerdp_thread* thread = context->debug_channel_thread;
+
+       if (WTSVirtualChannelQuery(context->debug_channel, WTSVirtualFileHandle, &buffer, &bytes_returned) == true)
+       {
+               fd = *((void**)buffer);
+               WTSFreeMemory(buffer);
+               thread->signals[thread->num_signals++] = wait_obj_new_with_fd(fd);
+       }
+
+       s = stream_new(4096);
+
+       WTSVirtualChannelWrite(context->debug_channel, (uint8*) "test1", 5, NULL);
+
+       while (1)
+       {
+               freerdp_thread_wait(thread);
+               if (freerdp_thread_is_stopped(thread))
+                       break;
+
+               stream_set_pos(s, 0);
+               if (WTSVirtualChannelRead(context->debug_channel, 0, stream_get_head(s),
+                       stream_get_size(s), &bytes_returned) == false)
+               {
+                       if (bytes_returned == 0)
+                               break;
+                       stream_check_size(s, bytes_returned);
+                       if (WTSVirtualChannelRead(context->debug_channel, 0, stream_get_head(s),
+                               stream_get_size(s), &bytes_returned) == false)
+                       {
+                               /* should not happen */
+                               break;
+                       }
+               }
+               stream_set_pos(s, bytes_returned);
+
+               printf("got %d bytes\n", bytes_returned);
+       }
+
+       stream_free(s);
+       freerdp_thread_quit(thread);
+
+       return 0;
+}
+
+boolean tf_peer_post_connect(freerdp_peer* client)
+{
+       int i;
+       testPeerContext* context = (testPeerContext*) client->context;
+
+       /**
+        * This callback is called when the entire connection sequence is done, i.e. we've received the
+        * Font List PDU from the client and sent out the Font Map PDU.
+        * The server may start sending graphics output and receiving keyboard/mouse input after this
+        * callback returns.
+        */
+       printf("Client %s is activated (osMajorType %d osMinorType %d)", client->hostname,
+               client->settings->os_major_type, client->settings->os_minor_type);
+       if (client->settings->autologon)
+       {
+               printf(" and wants to login automatically as %s\\%s",
+                       client->settings->domain ? client->settings->domain : "",
+                       client->settings->username);
+
+               /* A real server may perform OS login here if NLA is not executed previously. */
+       }
+       printf("\n");
+
+       printf("Client requested desktop: %dx%dx%d\n",
+               client->settings->width, client->settings->height, client->settings->color_depth);
+
+       /* A real server should tag the peer as activated here and start sending updates in mainloop. */
+       test_peer_load_icon(client);
+
+       /* Iterate all channel names requested by the client and activate those supported by the server */
+       for (i = 0; i < client->settings->num_channels; i++)
+       {
+               if (client->settings->channels[i].joined)
+               {
+                       if (strncmp(client->settings->channels[i].name, "rdpdbg", 6) == 0)
+                       {
+                               context->debug_channel = WTSVirtualChannelOpenEx(context->vcm, "rdpdbg", 0);
+                               if (context->debug_channel != NULL)
+                               {
+                                       printf("Open channel rdpdbg.\n");
+                                       context->debug_channel_thread = freerdp_thread_new();
+                                       freerdp_thread_start(context->debug_channel_thread,
+                                               tf_debug_channel_thread_func, context);
+                               }
+                       }
+               }
+       }
+
+       /* Return false here would stop the execution of the peer mainloop. */
+       return true;
+}
+
+boolean tf_peer_activate(freerdp_peer* client)
+{
+       testPeerContext* context = (testPeerContext*) client->context;
+
+       rfx_context_reset(context->rfx_context);
+       context->activated = true;
+
+       if (test_pcap_file != NULL)
+       {
+               client->update->dump_rfx = true;
+               tf_peer_dump_rfx(client);
+       }
+       else
+       {
+               test_peer_draw_background(client);
+       }
+
+       return true;
+}
+
+void tf_peer_synchronize_event(rdpInput* input, uint32 flags)
+{
+       printf("Client sent a synchronize event (flags:0x%X)\n", flags);
+}
+
+void tf_peer_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       freerdp_peer* client = input->context->peer;
+       rdpUpdate* update = client->update;
+       testPeerContext* context = (testPeerContext*) input->context;
+
+       printf("Client sent a keyboard event (flags:0x%X code:0x%X)\n", flags, code);
+
+       if ((flags & 0x4000) && code == 0x1F) /* 's' key */
+       {
+               if (client->settings->width != 800)
+               {
+                       client->settings->width = 800;
+                       client->settings->height = 600;
+               }
+               else
+               {
+                       client->settings->width = 640;
+                       client->settings->height = 480;
+               }
+               update->DesktopResize(update->context);
+               context->activated = false;
+       }
+       else if ((flags & 0x4000) && code == 0x2E) /* 'c' key */
+       {
+               if (context->debug_channel)
+               {
+                       WTSVirtualChannelWrite(context->debug_channel, (uint8*) "test2", 5, NULL);
+               }
+       }
+}
+
+void tf_peer_unicode_keyboard_event(rdpInput* input, uint16 flags, uint16 code)
+{
+       printf("Client sent a unicode keyboard event (flags:0x%X code:0x%X)\n", flags, code);
+}
+
+void tf_peer_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       printf("Client sent a mouse event (flags:0x%X pos:%d,%d)\n", flags, x, y);
+
+       test_peer_draw_icon(input->context->peer, x + 10, y);
+}
+
+void tf_peer_extended_mouse_event(rdpInput* input, uint16 flags, uint16 x, uint16 y)
+{
+       printf("Client sent an extended mouse event (flags:0x%X pos:%d,%d)\n", flags, x, y);
+}
+
+static void* test_peer_mainloop(void* arg)
+{
+       int i;
+       int fds;
+       int max_fds;
+       int rcount;
+       void* rfds[32];
+       fd_set rfds_set;
+       testPeerContext* context;
+       freerdp_peer* client = (freerdp_peer*) arg;
+
+       memset(rfds, 0, sizeof(rfds));
+
+       test_peer_init(client);
+
+       /* Initialize the real server settings here */
+       client->settings->cert_file = xstrdup("server.crt");
+       client->settings->privatekey_file = xstrdup("server.key");
+       client->settings->nla_security = false;
+       client->settings->rfx_codec = true;
+
+       client->PostConnect = tf_peer_post_connect;
+       client->Activate = tf_peer_activate;
+
+       client->input->SynchronizeEvent = tf_peer_synchronize_event;
+       client->input->KeyboardEvent = tf_peer_keyboard_event;
+       client->input->UnicodeKeyboardEvent = tf_peer_unicode_keyboard_event;
+       client->input->MouseEvent = tf_peer_mouse_event;
+       client->input->ExtendedMouseEvent = tf_peer_extended_mouse_event;
+
+       client->Initialize(client);
+       context = (testPeerContext*) client->context;
+
+       printf("We've got a client %s\n", client->hostname);
+
+       while (1)
+       {
+               rcount = 0;
+
+               if (client->GetFileDescriptor(client, rfds, &rcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+               WTSVirtualChannelManagerGetFileDescriptor(context->vcm, rfds, &rcount);
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               if (select(max_fds + 1, &rfds_set, NULL, NULL, NULL) == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("select failed\n");
+                               break;
+                       }
+               }
+
+               if (client->CheckFileDescriptor(client) != true)
+                       break;
+               if (WTSVirtualChannelManagerCheckFileDescriptor(context->vcm) != true)
+                       break;
+       }
+
+       printf("Client %s disconnected.\n", client->hostname);
+
+       client->Disconnect(client);
+       freerdp_peer_context_free(client);
+       freerdp_peer_free(client);
+
+       return NULL;
+}
+
+static void test_peer_accepted(freerdp_listener* instance, freerdp_peer* client)
+{
+       pthread_t th;
+
+       pthread_create(&th, 0, test_peer_mainloop, client);
+       pthread_detach(th);
+}
+
+static void test_server_mainloop(freerdp_listener* instance)
+{
+       int i;
+       int fds;
+       int max_fds;
+       int rcount;
+       void* rfds[32];
+       fd_set rfds_set;
+
+       memset(rfds, 0, sizeof(rfds));
+
+       while (1)
+       {
+               rcount = 0;
+
+               if (instance->GetFileDescriptor(instance, rfds, &rcount) != true)
+               {
+                       printf("Failed to get FreeRDP file descriptor\n");
+                       break;
+               }
+
+               max_fds = 0;
+               FD_ZERO(&rfds_set);
+
+               for (i = 0; i < rcount; i++)
+               {
+                       fds = (int)(long)(rfds[i]);
+
+                       if (fds > max_fds)
+                               max_fds = fds;
+
+                       FD_SET(fds, &rfds_set);
+               }
+
+               if (max_fds == 0)
+                       break;
+
+               if (select(max_fds + 1, &rfds_set, NULL, NULL, NULL) == -1)
+               {
+                       /* these are not really errors */
+                       if (!((errno == EAGAIN) ||
+                               (errno == EWOULDBLOCK) ||
+                               (errno == EINPROGRESS) ||
+                               (errno == EINTR))) /* signal occurred */
+                       {
+                               printf("select failed\n");
+                               break;
+                       }
+               }
+
+               if (instance->CheckFileDescriptor(instance) != true)
+               {
+                       printf("Failed to check FreeRDP file descriptor\n");
+                       break;
+               }
+       }
+
+       instance->Close(instance);
+}
+
+int main(int argc, char* argv[])
+{
+       freerdp_listener* instance;
+
+       /* Ignore SIGPIPE, otherwise an SSL_write failure could crash your server */
+       signal(SIGPIPE, SIG_IGN);
+
+       instance = freerdp_listener_new();
+
+       instance->PeerAccepted = test_peer_accepted;
+
+       if (argc > 1)
+               test_pcap_file = argv[1];
+       
+       if (argc > 2 && !strcmp(argv[2], "--fast"))
+               test_dump_rfx_realtime = false;
+
+       /* Open the server socket and start listening. */
+       if (instance->Open(instance, NULL, 3389))
+       {
+               /* Entering the server main loop. In a real server the listener can be run in its own thread. */
+               test_server_mainloop(instance);
+       }
+
+       freerdp_listener_free(instance);
+
+       return 0;
+}
+